# Content Rabbit — Agent Support & Self-Service

Machine-readable support for agents driving Content Rabbit headlessly. The
human help center is at https://contentrabbitai.com/support; this doc is the version an agent
reads to unblock itself. Exact request/response schemas are in the OpenAPI spec.

## Reference index

- REST API base: https://contentrabbitai.com/api/public/v1  (auth: `Authorization: Bearer <key>`)
- OpenAPI spec: https://contentrabbitai.com/openapi.yaml  (JSON: https://contentrabbitai.com/openapi.json)
- MCP server (Streamable HTTP): https://contentrabbitai.com/api/v1/mcp  (discovery: https://contentrabbitai.com/mcp)
- Agent discovery manifest (all tools): https://contentrabbitai.com/.well-known/agent.json
- A2A card + payment terms: https://contentrabbitai.com/.well-known/agent-card.json
- Agent operating guide: https://contentrabbitai.com/agents  and  https://contentrabbitai.com/agents.md
- Full docs corpus: https://contentrabbitai.com/llms-full.txt
- SDK (npm): `@contentrabbit/sdk`
- CLI (npm): `@contentrabbit/cli`  —  `npx @contentrabbit/cli`

## Get started headlessly

1. Mint a key with no human step: `POST https://contentrabbitai.com/api/v1/agent/signup`
   with `{ "email": "you@example.com" }`. Add `"sandbox": true` to get a
   sandbox key — every mutating call returns a simulated success with no real
   side effect (nothing created, published, or billed); reads work normally.
2. Call any REST route with `Authorization: Bearer <key>`, or connect the MCP
   server, or run the CLI/SDK.

## Self-unblock — symptom to fix

### 401 Unauthorized / invalid or expired key
The key is wrong, revoked, or rotated. Mint a fresh one at
`POST https://contentrabbitai.com/api/v1/agent/signup`, or rotate an existing key at
`POST https://contentrabbitai.com/api/public/v1/api-keys/{keyId}/rotate` (rotation revokes the old value).
List keys: `GET https://contentrabbitai.com/api/public/v1/api-keys`.

### 402 Payment Required / out of credits
Check balance: `GET https://contentrabbitai.com/api/public/v1/billing/balance`. Top up with no card and no
human over x402 (USDC on Base): `POST https://contentrabbitai.com/api/v1/agent/topup` returns
a 402 with payment terms; pay to credit the team. Card checkout (needs a human)
is `POST https://contentrabbitai.com/api/public/v1/billing/checkout`. Optional guardrails:
`PATCH https://contentrabbitai.com/api/public/v1/billing/auto-topup` and `PATCH https://contentrabbitai.com/api/public/v1/billing/spend-limit`.

### 429 Too Many Requests / rate limited
Back off and retry. Honor `Retry-After` and the `RateLimit-*` response
headers. Batch endpoints (`https://contentrabbitai.com/api/public/v1/posts/batch`) cut request count for bulk work.

### A social account is not connected
List what you can connect: `GET https://contentrabbitai.com/api/public/v1/integrations/connectable`. Start a
connect: `POST https://contentrabbitai.com/api/public/v1/integrations/connect` returns a provider consent URL —
hand that URL to a human to click (the provider owns the OAuth screen; no agent
can bypass it), and the callback finishes the link. Check connected accounts
and their health: `GET https://contentrabbitai.com/api/public/v1/accounts`,
`GET https://contentrabbitai.com/api/public/v1/accounts/{accountId}/health`. Disconnect:
`DELETE https://contentrabbitai.com/api/public/v1/accounts/{accountId}`.

### A post failed to publish
Inspect it: `GET https://contentrabbitai.com/api/public/v1/posts/{postId}/status`. Retry: `POST https://contentrabbitai.com/api/public/v1/posts/{postId}/retry`.
Validate before publishing to avoid failures:
`POST https://contentrabbitai.com/api/public/v1/tools/validate/post` and `POST https://contentrabbitai.com/api/public/v1/tools/validate/media`.

### Generated content is off-voice
Attach an AI character (brand persona) and knowledge base so generation stays
on-voice: `GET https://contentrabbitai.com/api/public/v1/characters`, `GET https://contentrabbitai.com/api/public/v1/knowledge`, and link them
with `POST https://contentrabbitai.com/api/public/v1/knowledge/{knowledgeId}/link` (body:
`{ "characterId": "..." }`).

## Account lifecycle

- Change email: `PATCH https://contentrabbitai.com/api/public/v1/account` with `{ "email": "new@example.com" }`
  (stores the new address unverified and revokes existing sessions).
- Export your data: `POST https://contentrabbitai.com/api/public/v1/account/export`.
- Delete the account: `DELETE https://contentrabbitai.com/api/public/v1/account`.
- Invite teammates: `POST https://contentrabbitai.com/api/public/v1/teams/{teamId}/invites`.
- Notifications: `GET https://contentrabbitai.com/api/public/v1/notifications`, mark all read
  `POST https://contentrabbitai.com/api/public/v1/notifications/read-all`.

## Still stuck

Human support: support@contentrabbitai.com  •  https://contentrabbitai.com/support
