Base URL
/v1.
Authentication
Every request must include anAuthorization header with a Bearer token:
| Type | Format | Use case |
|---|---|---|
| API key | rm_xxxxx | Programmatic access |
| JWT | Supabase session token | Browser/frontend |
POST /v1/api-keys. JWT users automatically have all scopes.
Scopes
API keys can be restricted to specific scopes:| Scope | Description |
|---|---|
personas:read | Read personas |
personas:write | Create, update, delete personas |
sources:read | List sources |
sources:write | Add, remove sources |
content:read | Read content, poll status |
content:write | Generate, clone, toggle public |
sync:write | Trigger sync |
billing:read | View balance and transactions |
uploads:write | Upload files |
Rate Limiting
| Auth type | Limit |
|---|---|
| API key | 60 requests/minute |
| JWT | 120 requests/minute |
X-RateLimit-Limit- Maximum requests per windowX-RateLimit-Remaining- Requests remainingX-RateLimit-Reset- Unix timestamp when window resets
Error Format
All errors follow a consistent format:| Code | Status | Description |
|---|---|---|
VALIDATION_ERROR | 400 | Invalid request body |
UNAUTHORIZED | 401 | Missing or invalid auth |
INSUFFICIENT_BALANCE | 402 | Not enough credits |
FORBIDDEN | 403 | Missing scope or permission |
NOT_FOUND | 404 | Resource not found |
CONFLICT | 409 | Duplicate resource |
RATE_LIMITED | 429 | Too many requests |
INTERNAL_ERROR | 500 | Server error |
UPSTREAM_ERROR | 502 | External service error |
SERVICE_UNAVAILABLE | 503 | Service temporarily down |
Pagination
List endpoints support pagination via query parameters:| Parameter | Default | Max | Description |
|---|---|---|---|
limit | 20 | 100 | Results per page |
offset | 0 | - | Results to skip |