Every ceiba speaks the same minimal HTTP dialect: a self-descriptor at /.well-known/ceiba.json, a CRUD over /v1/<type>s, and a small index of canonical endpoints. This page is the catalog.
| Endpoint | Status | Purpose |
|---|---|---|
| GET/.well-known/ceiba.json | required | Self-descriptor manifest. Validates against ceiba.schema.json. |
| GET/health | required | Returns {"ok": true, "ceiba": "name", "ts": "..."}. |
| GET/v1/<type>s | required | List entities of the given type. Pagination via ?limit + ?offset. |
| GET/v1/<type>s/<id> | required | Fetch one entity by id. |
| GET/v1/stats | required | Aggregate counters: {"entities": N, "members": N, "events": N}. |
| GET/llms.txt | L1 | Plain-text site index for LLM consumers. Short. |
| POST/v1/<type>s/<id>/claim | L2 | Claim a profile. Trigger the configured verification method. |
| POST/v1/<type>s/<id>/edit | L2 | Propose an edit. Logged in edit_history with source attribution. |
| GET/mcp | L3 | Model Context Protocol server. Discoverable via Accept: application/json. |
| GET/v1/events/sync | federation (opt-in) | Push endpoint for receiving events from federated peers. Scope-gated. |
Authoritative source: /ceiba.schema.json (Draft 2020-12). Below is the human-friendly summary.
url in practice."0.5". Additive over "0.4" — both validate.["operator", "contributor", "entity-owner"]. v0.5 addition.community, infrastructure, data-project.entity_types[], claim_enabled, verification_method, auth_methods[], profile_statuses[].source_attribution, edit_history, open_editing, license (default CC BY 4.0).base_url, health, llms_txt, mcp_server, schema_org.sync_pull, sync_push, discovery (static-registry | peer-discovery).scopes and api_key_required (v0.5).enabled, transferable (default false), split (default {contributors: 0.80, commons_fund: 0.20}).L0 (Seed) is informal — just a concept + scattered data. The numbered ladder starts at L1, which is what koa-gen-ceiba init ships out of the box.
curl -s https://lacartelera.app/.well-known/ceiba.json | jq '.protocol_version, .compliance_level' # → "0.4" # → 3
curl -s "https://lacartelera.app/v1/comedians?limit=3" # → array of comedian objects
curl -s https://lacartelera.app/v1/comedians/<comedian-id>
curl -s https://lacartelera.app/v1/stats # → {"entities": 427, "members": 227, "events": 66}
curl -s https://lacartelera.app/mcp -H "Accept: application/json"
curl -sf https://ceiba.to/ceiba.schema.json -o /tmp/schema.json curl -sf https://<any-ceiba>/.well-known/ceiba.json -o /tmp/manifest.json python -c "import json, jsonschema; jsonschema.validate(json.load(open('/tmp/manifest.json')), json.load(open('/tmp/schema.json'))); print('VALID')"
identity.entity_types is ["comedian"], the CRUD lives at /v1/comedians.name field follows this.?limit + ?offset, or cursor-based via ?after=<id>.CC BY 4.0 for the public graph. Each ceiba can override.