Status: Live as of v1.0.0 (2026-07-31)
Owner: api@seele.agency
Review cadence: Per release, with annual structural review
Last revised: 2026-07-31
The xkg-server API is the public face of TabMind. Anyone building a custom
client, a mobile app, or a partner integration depends on it. The single
worst thing we can do is break someone's integration without warning.
This document is the contract. It says:
If you build against the API, you should be able to read this document and
trust it for the next 12 months with no surprises.
The xkg-server API uses URL path versioning:
https://seele.agency/api/v1/...
https://seele.agency/api/v2/...
v1 is the current stable version.v2 (when it ships) will be a major version bump with breaking changes./api/... path is alias for v1 and will be removedin v2 lifetime.
We follow Semantic Versioning 2.0.0:
The API version is exposed in three places:
/api/v1/...X-API-Version: 1.0.0{"api_version": "1.0.0"} (on /api/health)If a client SDK is shipped (e.g., xkg-cli, xkg-mobile-flutter,
xkg-desktop), it follows the same SemVer. The SDK version is independent
of the API version — they advance on their own cadence.
Every endpoint is tagged with one of three stability tiers:
| Tier | Meaning | Deprecation notice | Removal |
|---|---|---|---|
| Stable | Production-ready, locked semantics | 6 months | After notice period |
| Beta | Production-ready, may change | 3 months | After notice period |
| Experimental | Active development, semantics may shift | 1 release | Anytime |
the same rules as Stable.
promotion.
deprecation notice.
Every API response includes a X-API-Stability header:
stable — locked, follows 6-month deprecationbeta — may change, 3-month noticeexperimental — may change, 1-release noticeEndpoints under /api/v1/ are Stable by default. Beta and Experimental
endpoints carry a suffix:
/api/v1/... → Stable
/api/v1-beta/... → Beta
/api/v1-experimental/... → Experimental
Deprecated endpoints gain a X-API-Deprecated header with a date and
successor URL.
| Endpoint | Method | Purpose |
|---|---|---|
/api/v1/health |
GET | Service health |
/api/v1/capture |
POST | Submit a captured conversation |
/api/v1/capture/ |
GET | Fetch a specific capture |
/api/v1/search |
GET | Full-text search |
/api/v1/conversations |
GET | List recent conversations |
/api/v1/conversations/ |
GET | Conversation detail |
/api/v1/releases/latest |
GET | Latest release info |
/api/v1/license/check |
POST | Validate Pro license |
| Endpoint | Method | Purpose |
|---|---|---|
/api/v1-beta/sync/devices |
POST | Register a device |
/api/v1-beta/sync/devices |
GET | List devices |
/api/v1-beta/sync/changes |
POST | Push delta |
/api/v1-beta/sync/changes |
GET | Pull delta |
/api/v1-beta/kg/links |
POST | Add a graph link |
/api/v1-beta/kg/links |
GET | Query graph |
| Endpoint | Method | Purpose |
|---|---|---|
/api/v1-experimental/providers |
GET | Active LLM providers |
/api/v1-experimental/embeddings |
POST | Generate embeddings |
| Tier | Window | Notice |
|---|---|---|
| Stable | 6 months | Emailed to api-announce@ + header + status page |
| Beta | 3 months | Header + status page, no email |
| Experimental | 1 release | Header only |
We mark an endpoint deprecated by:
X-API-Deprecated: true to every responseSunset header with the removal date (RFC 8594)Link: header pointing to thereplacement endpoint, when applicable
https://seele.agency/docs/api/*api-announce@ email (Stable only)https://seele.agency/releases.htmlWe will never:
notes
After the deprecation window:
successor.
the deprecation record.
so we can detect old clients.
If we discover a security issue that requires immediate removal:
removed endpoint (see SECURITY.md)
Stable responses may add fields without notice. They may not
remove, rename, or change the type of any field.
// Stable, can add "metadata" without breaking:
{
"id": "abc-123",
"title": "Knowledge graphs",
"metadata": {
"tokens": 4231,
"model": "gpt-4o"
}
}
A field may be deprecated independently from an endpoint. We mark it
with _deprecated suffix in the docs and a runtime warning header:
Warning: 299 - "tokens" field is deprecated; use "metadata.tokens" instead
After 6 months, the deprecated field is removed from the response. The
field will return null in the meantime (never raise an error).
Errors are stable:
{
"error": {
"code": "license_invalid",
"message": "License key revoked or expired",
"details": {
"reason": "expired",
"tier": "free"
}
}
}
Error codes are never renamed. New codes may be added. The error
envelope is Stable.
Stable-status codes are bound to the spec:
200 OK — success (with body)201 Created — resource created204 No Content — success (no body)400 Bad Request — client syntax error401 Unauthorized — auth missing403 Forbidden — auth present but insufficient404 Not Found — resource missing409 Conflict — conflict with current state410 Gone — deprecated endpoint429 Too Many Requests — rate limit500 Internal Server Error — server fault (counts against SLO)503 Service Unavailable — server offline (counts against SLO)We may add new 4xx codes. Existing 5xx codes are stable. We will not
add 5xx codes without an entry in the changelog.
requires the deprecation policy.
require a new version (v1 → v2).
flow, and license key checks are all Stable.
algorithms (e.g., zstd) but will not disable gzip.
industry consensus.
notify via RateLimit-Limit and RateLimit-Reset headers.
offset to cursor if performancedemands it. This is a breaking change requiring deprecation.
We don't promise element order. Don't rely on it.
Rate limits are defined per API key and per IP.
| Tier | Default RPS | Burst | Daily quota |
|---|---|---|---|
| Free (no auth) | 1 | 5 | 1000 |
| Pro license | 10 | 50 | 1,000,000 |
| Partner key | 100 | 500 | 100,000,000 |
We may tighten these at any time. We will not loosen without
notice. If you rely on higher rates, contact api@seele.agency.
Rate-limit responses include Retry-After header.
A breaking change is a change to any of:
If we want to make a breaking change:
/api/v2-beta/... flagged ExperimentalX-API-Deprecated: true/api/v2/ prefixThe full cycle takes at least 9 months from announcement to v1 removal.
api-announce@seele.agency — Stable deprecations + major releaseshttps://seele.agency/releases.html — public changeloghttps://status.seele.agency — incident status/api/v1/changelog.json — machine-readable changelogEach entry: version, date, type (added|changed|removed|fixed|security),
summary, affected_endpoints, deprecation_date (if applicable).
SDKs (Tauri, Flutter, mobile) follow their own SemVer but must match
the API SemVer for lock-step compatibility. If the API is on v1.4.0,
the SDK is on v1.4.x.
The SDK may have a minor version greater than the API (e.g., SDK v1.5.0
against API v1.4.0) for SDK-only features.
Security fixes follow the standard responsible disclosure policy at
https://seele.agency/security.html. Critical CVEs may bypass the
deprecation window per §5.4.
This document is the contract. By using the API, you accept:
X-API-Deprecated header on every response inclient code
api-announce@ for Stable deprecationsIf you need a different contract (e.g., higher rate limits, custom
endpoints), contact partner@seele.agency.
Published: 2026-07-31
This API stability contract is the result of v0.7 → v0.9 release work
plus 1 v1.0.0 sprint (TASK-HUB-20260731-188).
If you find a bug in this document, file at https://github.com/griptoad26/seele-agency-site/issues
with the api-stability label.
TL;DR for integrators:
/api/v1/...X-API-Deprecated header; follow its successorapi-announce@seele.agency for Stable changes