Everything the dashboard does runs through the same pipeline the public API exposes — personas, voice memory, quality pass, safety screening, and caps all apply.
Keys
Create keys in Settings → API keys. They look like krv_...; send as Authorization: Bearer krv_... (or X-API-Key). Scopes: read, publish, generate. Up to 10 active keys; the secret is shown once, at creation. Key management stays in the dashboard — a key can never mint keys.
Core endpoints
GET /v1/me # key check: account + scopes
GET /v1/posts?status_filter=draft # your queue
POST /v1/posts # {"platform","body","hashtags"?,"schedule_at"?}
POST /v1/generate # {"url"? | "text"?, "instruction"?}
POST /v1/postswithoutschedule_atcreates a draft for review; a future ISO-8601 time schedules it directly (needspublishscope).POST /v1/generateturns a YouTube/article URL or pasted text into drafts via the repurpose pipeline (needsgeneratescope).
Platforms: facebook | instagram | threads | linkedin | bluesky.
Media (media scope)
GET /v1/assets # library + storage usage
POST /v1/assets # {"url"} -> fetch into the library
POST /v1/assets/upload # raw image bytes (Content-Type: image/*)
POST /v1/assets/upload/init # chunked video: {"filename","size_bytes"}
PUT /v1/assets/upload/part # ?upload_id&index — raw 8 MiB parts
POST /v1/assets/upload/finish # {"upload_id","parts"}
DELETE /v1/assets/{id}
Attach media via asset_ids on POST /v1/posts with a kind (text | image | carousel | reel); each platform's rules are validated with corrective errors. brand_id targets a specific brand — its voice, design, and routing apply.
API-submitted copy passes the same safety screening as LLM output, and generation respects your daily caps and plan limits.