API reference
Base URL https://a1lane.ai. Authenticate with Authorization: Bearer <token>: a session token (ses_…) or a workspace-scoped API token (plt_…) with scopes read ⊂ write ⊂ publish. Tenant routes live under /api/v1/workspaces/{ws}; a workspace you cannot see is a 404. Errors are JSON {error, detail}; plan limits answer 402 with detail.code = plan_limit and an upgrade URL. Rate limits: sign-up, login and reset throttles; per-token limits on the MCP surface; platform pacing per account with deferred states instead of failures.
194 routes, generated from the running application. Changes and the deprecation policy: API changelog.
| Method | Path | Summary |
|---|---|---|
GET | /.well-known/oauth-authorization-server | RFC 8414 discovery for the product's own OAuth 2.0 authorization server. |
GET | /.well-known/oauth-protected-resource | RFC 9728: tells MCP clients which authorization server protects /mcp/v1. |
GET | /.well-known/oauth-protected-resource/mcp/v1 | RFC 9728: tells MCP clients which authorization server protects /mcp/v1. |
GET | /.well-known/openai-apps-challenge | R-30: ChatGPT apps domain-verification challenge — the token comes from config only. |
GET | /api/v1/admin/analytics | admin analytics |
GET | /api/v1/admin/billing | admin billing |
GET | /api/v1/admin/engagement | Leg 7: engagement pipeline counts across workspaces (counts only, no tenant data). |
GET | /api/v1/admin/mcp | R-35: per-tool call volume, error rate and latency across the deployment (?token= for one token). |
GET | /api/v1/admin/mcp/funnel | DESIGN-V2 §8: the assistant journey funnel, attributed by OAuth client. |
GET | /api/v1/admin/quota | Leg 5b operator surface: every ledger bucket with its current-window usage. |
PUT | /api/v1/admin/quota/{key} | PUT {capacity, source?}: a verified number (e.g. the Cloud Console allocation) drops in |
GET | /api/v1/admin/scheduler | Leg 5d item 6: the tick gauge alone (fleet p95 + per-workspace, with its trip lines). |
GET | /api/v1/admin/stats | admin stats |
GET | /api/v1/admin/throttles | Leg 5b item 13 operator surface: durable throttle state (hits per kind / hashed key). |
POST | /api/v1/auth/login | auth login |
POST | /api/v1/auth/logout | auth logout |
POST | /api/v1/auth/reset/confirm | auth reset confirm |
POST | /api/v1/auth/reset/request | auth reset request |
POST | /api/v1/auth/signup | auth signup |
POST | /api/v1/auth/verify-email | auth verify email |
POST | /api/v1/billing/webhook | Stripe → us. Public route; the signature is the only credential. Raw body, no parsing |
POST | /api/v1/data-deletion/callback | Meta → us (Facebook Login / Instagram / Threads). Public; the signature is the only |
GET | /api/v1/engagement/coverage | Leg 7: the public per-platform × metric coverage/freshness matrix, generated from code. |
GET | /api/v1/health | health |
GET | /api/v1/invites/{token} | invite preview |
POST | /api/v1/invites/{token}/accept | invite accept |
DELETE | /api/v1/me | me delete |
GET | /api/v1/me | me |
GET | /api/v1/me/2fa | me 2fa |
POST | /api/v1/me/2fa/disable | me 2fa disable |
POST | /api/v1/me/2fa/enroll | me 2fa enroll |
POST | /api/v1/me/2fa/recovery-codes | me 2fa recovery |
POST | /api/v1/me/2fa/verify | me 2fa verify |
GET | /api/v1/me/export | me export |
PUT | /api/v1/me/password | me password |
GET | /api/v1/me/preferences | Amendment 8a: the user's own display defaults (timezone, locale). |
PUT | /api/v1/me/preferences | Amendment 8a: the user's own display defaults (timezone, locale). |
GET | /api/v1/me/sessions | me sessions |
POST | /api/v1/me/sessions/revoke-all | me sessions revoke all |
DELETE | /api/v1/me/sessions/{id} | me session revoke |
POST | /api/v1/me/verify-email/resend | me verify resend |
POST | /api/v1/meta/deauthorize | Meta → us when a person removes the app: Facebook Login / Instagram "Deauthorize Callback |
GET | /api/v1/plans | Public: the plan configuration the pricing page renders (one source of truth). |
GET | /api/v1/platforms | platforms |
GET | /api/v1/receipts/{token} | receipt link public |
GET | /api/v1/review/{token} | review view |
POST | /api/v1/review/{token}/decision | review decide |
GET | /api/v1/review/{token}/media | review media |
GET | /api/v1/status | Public status page data: service health + rolling delivery-verification rates, aggregated |
GET | /api/v1/upload-links/{token} | upload link public status |
PUT | /api/v1/upload-links/{token}/chunks/{n} | upload link chunk |
POST | /api/v1/upload-links/{token}/complete | upload link complete |
POST | /api/v1/upload-links/{token}/session | upload link session |
GET | /api/v1/workspaces | list workspaces |
POST | /api/v1/workspaces | create workspace |
DELETE | /api/v1/workspaces/{ws} | delete workspace |
GET | /api/v1/workspaces/{ws} | get workspace |
PUT | /api/v1/workspaces/{ws} | rename workspace |
GET | /api/v1/workspaces/{ws}/accounts | list accounts |
POST | /api/v1/workspaces/{ws}/accounts | connect account |
DELETE | /api/v1/workspaces/{ws}/accounts/{id} | disconnect account |
GET | /api/v1/workspaces/{ws}/accounts/{id} | get account |
GET | /api/v1/workspaces/{ws}/accounts/{id}/best-times | Leg 7: best-time-to-post suggestions from this channel's own history (or not enough data). |
GET | /api/v1/workspaces/{ws}/accounts/{id}/choices | Leg 4: option values the platform enumerates for this account (e.g. Pinterest boards). |
POST | /api/v1/workspaces/{ws}/accounts/{id}/pause | pause account |
POST | /api/v1/workspaces/{ws}/accounts/{id}/probe | probe account |
GET | /api/v1/workspaces/{ws}/accounts/{id}/queue | account queue |
POST | /api/v1/workspaces/{ws}/accounts/{id}/reconnect | reconnect account |
POST | /api/v1/workspaces/{ws}/accounts/{id}/resume | resume account |
PUT | /api/v1/workspaces/{ws}/accounts/{id}/settings | account settings |
GET | /api/v1/workspaces/{ws}/analytics | workspace analytics |
GET | /api/v1/workspaces/{ws}/attention | attention |
GET | /api/v1/workspaces/{ws}/batches | list batches |
GET | /api/v1/workspaces/{ws}/batches/{id} | get batch |
GET | /api/v1/workspaces/{ws}/batches/{id}/receipt-links | list receipt links |
POST | /api/v1/workspaces/{ws}/batches/{id}/receipt-links | create receipt link |
GET | /api/v1/workspaces/{ws}/benchmarks | Leg 7: tracked public profiles (official routes only) with their latest numbers. |
POST | /api/v1/workspaces/{ws}/benchmarks | Leg 7: track a public profile; refused with the reason where no official route exists. |
DELETE | /api/v1/workspaces/{ws}/benchmarks/{id} | Leg 7: stop tracking a profile (its stored numbers go with it). |
GET | /api/v1/workspaces/{ws}/billing | workspace billing |
POST | /api/v1/workspaces/{ws}/billing/checkout | billing checkout |
POST | /api/v1/workspaces/{ws}/billing/portal | billing portal |
POST | /api/v1/workspaces/{ws}/billing/reconcile | billing reconcile |
GET | /api/v1/workspaces/{ws}/calendar | calendar |
GET | /api/v1/workspaces/{ws}/connections | Item 8: connection health (``?account=`` narrows to one account). |
GET | /api/v1/workspaces/{ws}/connections/reconnect | connections batch |
GET | /api/v1/workspaces/{ws}/digest | Leg 6 item 3: the digest computed live for [since, until) (default: the last 24 hours) — |
GET | /api/v1/workspaces/{ws}/digests | digest runs |
POST | /api/v1/workspaces/{ws}/digests/run | Run the last complete period of a cadence now (owner/admin): idempotent per period. |
GET | /api/v1/workspaces/{ws}/duplicates | Leg 5b item 8: the Phase-gate duplicate count (open and resolved). |
GET | /api/v1/workspaces/{ws}/engagement | Leg 7: engagement rollups per channel / platform over the window (unavailable excluded, counted). |
GET | /api/v1/workspaces/{ws}/events | events |
GET | /api/v1/workspaces/{ws}/export | export |
GET | /api/v1/workspaces/{ws}/imports | import list |
POST | /api/v1/workspaces/{ws}/imports/preview | Leg 6 item 1: dry-run an export (hootsuite | generic | buffer_analytics); nothing is posted. |
GET | /api/v1/workspaces/{ws}/imports/{id} | import view |
POST | /api/v1/workspaces/{ws}/imports/{id}/commit | import commit |
GET | /api/v1/workspaces/{ws}/imports/{id}/rejected.csv | import rejected csv |
GET | /api/v1/workspaces/{ws}/inbox | The in-app notification feed (digests + R-41 alerts), minus the types the caller turned |
GET | /api/v1/workspaces/{ws}/ledger | Ledger-first home: the newest receipts with their post + destination context. |
GET | /api/v1/workspaces/{ws}/mcp/idempotency/{tool}/{key} | Leg 6 item 4(d): the durable idempotency record the stdio MCP server reads and writes |
PUT | /api/v1/workspaces/{ws}/mcp/idempotency/{tool}/{key} | Leg 6 item 4(d): the durable idempotency record the stdio MCP server reads and writes |
GET | /api/v1/workspaces/{ws}/media | Media library (leg 3, L2): filter by tag / kind / search; archived assets on request. |
POST | /api/v1/workspaces/{ws}/media | add media |
DELETE | /api/v1/workspaces/{ws}/media/{id} | delete media |
GET | /api/v1/workspaces/{ws}/media/{id} | get media |
PUT | /api/v1/workspaces/{ws}/media/{id} | update media |
GET | /api/v1/workspaces/{ws}/media/{id}/file | media file |
GET | /api/v1/workspaces/{ws}/members | list members |
POST | /api/v1/workspaces/{ws}/members | invite member |
DELETE | /api/v1/workspaces/{ws}/members/{id} | remove member |
PUT | /api/v1/workspaces/{ws}/members/{id} | change member |
POST | /api/v1/workspaces/{ws}/members/{id}/resend | resend invite |
POST | /api/v1/workspaces/{ws}/oauth/{platform}/choose | oauth choose |
GET | /api/v1/workspaces/{ws}/oauth/{platform}/start | oauth start |
GET | /api/v1/workspaces/{ws}/pause | Leg 5b item 15: the workspace's durable pause state (workspace-wide + per-account). |
POST | /api/v1/workspaces/{ws}/pause | pause workspace |
GET | /api/v1/workspaces/{ws}/posts | list posts |
POST | /api/v1/workspaces/{ws}/posts | create post |
POST | /api/v1/workspaces/{ws}/posts/batch | create batch |
POST | /api/v1/workspaces/{ws}/posts/import | Bulk CSV import (leg 3, L2): multipart 'file', text/csv body, or JSON {csv, mapping}. |
POST | /api/v1/workspaces/{ws}/posts/price-check | Item 9(a): the composer's live X pricing — the same pass create_post's warnings use. |
DELETE | /api/v1/workspaces/{ws}/posts/{id} | delete post |
GET | /api/v1/workspaces/{ws}/posts/{id} | get post |
PUT | /api/v1/workspaces/{ws}/posts/{id} | update post |
POST | /api/v1/workspaces/{ws}/posts/{id}/approval | post approval |
POST | /api/v1/workspaces/{ws}/posts/{id}/cancel | cancel post |
POST | /api/v1/workspaces/{ws}/posts/{id}/destinations/{dest}/acknowledge-divergence | acknowledge divergence |
POST | /api/v1/workspaces/{ws}/posts/{id}/destinations/{dest}/confirm-deleted | Q-DT-10 (G-30): confirm a manual delete no probe can settle (READBACK = False) — |
POST | /api/v1/workspaces/{ws}/posts/{id}/destinations/{dest}/continue-parts | continue parts |
POST | /api/v1/workspaces/{ws}/posts/{id}/destinations/{dest}/decline-finish | decline finish |
GET | /api/v1/workspaces/{ws}/posts/{id}/destinations/{dest}/finish | finish view |
POST | /api/v1/workspaces/{ws}/posts/{id}/destinations/{dest}/finish-check | Leg 6 item 2: run the destination's finish-check now and return the finish view. |
POST | /api/v1/workspaces/{ws}/posts/{id}/destinations/{dest}/mark-resolved | Discord + Telegram leg (item 7, Q-DT-2): accept an unverifiable send as delivered — |
POST | /api/v1/workspaces/{ws}/posts/{id}/destinations/{dest}/missed-window | Leg 5b item 6: decide a held missed window (publish_now | next_slot | reschedule | cancel). |
GET | /api/v1/workspaces/{ws}/posts/{id}/destinations/{dest}/observations | Leg 5b item 4: the append-only observation records of one destination. |
GET | /api/v1/workspaces/{ws}/posts/{id}/destinations/{dest}/parts | Leg 5b item 7: the destination's parts (thread parts, first comment, playlist add). |
POST | /api/v1/workspaces/{ws}/posts/{id}/destinations/{dest}/removal | Leg 5b item 10: the ingestion seam for a platform removal event (no webhook receiver |
POST | /api/v1/workspaces/{ws}/posts/{id}/destinations/{dest}/reoffer | reoffer finish |
POST | /api/v1/workspaces/{ws}/posts/{id}/destinations/{dest}/resolve | resolve destination |
POST | /api/v1/workspaces/{ws}/posts/{id}/destinations/{dest}/resolve-duplicate | Leg 5b item 8: keep one native copy (the others route through unpublish) or keep both. |
GET | /api/v1/workspaces/{ws}/posts/{id}/destinations/{dest}/support-bundles | Leg 5b item 17: a destination's redacted support bundles (newest last). |
POST | /api/v1/workspaces/{ws}/posts/{id}/destinations/{dest}/unpublish | Leg 5b item 9: start the unpublish chain for one live destination. |
POST | /api/v1/workspaces/{ws}/posts/{id}/duplicate | duplicate post |
GET | /api/v1/workspaces/{ws}/posts/{id}/engagement | Leg 7: one post's engagement per destination — latest values with asOf, reasons, series. |
GET | /api/v1/workspaces/{ws}/posts/{id}/handoff | handoff |
POST | /api/v1/workspaces/{ws}/posts/{id}/publish | publish post |
GET | /api/v1/workspaces/{ws}/posts/{id}/receipt-links | list receipt links |
POST | /api/v1/workspaces/{ws}/posts/{id}/receipt-links | create receipt link |
POST | /api/v1/workspaces/{ws}/posts/{id}/recycle | create recycle |
POST | /api/v1/workspaces/{ws}/posts/{id}/release | release post |
POST | /api/v1/workspaces/{ws}/posts/{id}/reschedule | reschedule post |
POST | /api/v1/workspaces/{ws}/posts/{id}/retry | retry post |
GET | /api/v1/workspaces/{ws}/posts/{id}/review-links | list review links |
POST | /api/v1/workspaces/{ws}/posts/{id}/review-links | create review link |
DELETE | /api/v1/workspaces/{ws}/posts/{id}/review-links/{nonce} | revoke review link |
GET | /api/v1/workspaces/{ws}/posts/{id}/revisions | Item 7a: the append-only revision history of a post. |
POST | /api/v1/workspaces/{ws}/posts/{id}/revisions/{n}/restore | Item 7a: restore revision N as a NEW revision (body may carry ``revision`` = the |
GET | /api/v1/workspaces/{ws}/quota/fit | Leg 5b (C10): does a publish to ``account_id`` fit at ``at`` (default now), and if not, |
POST | /api/v1/workspaces/{ws}/receipt-links/{lid}/revoke | revoke receipt link |
GET | /api/v1/workspaces/{ws}/recycles | list recycles |
DELETE | /api/v1/workspaces/{ws}/recycles/{id} | stop recycle |
GET | /api/v1/workspaces/{ws}/reports | Leg 7: a composed report (delivery + engagement per channel, chosen window) as JSON or CSV. |
GET | /api/v1/workspaces/{ws}/reports/exports/{id} | Leg 7: download one produced export (sign-in / token required; never mailed as an attachment). |
GET | /api/v1/workspaces/{ws}/reports/schedules | Leg 7: scheduled exports (weekly/monthly) and the exports they produced, with their state. |
POST | /api/v1/workspaces/{ws}/reports/schedules | Leg 7: schedule a weekly/monthly export mailed as a download link to workspace members. |
DELETE | /api/v1/workspaces/{ws}/reports/schedules/{id} | Leg 7: stop a scheduled export (exports already produced stay downloadable). |
POST | /api/v1/workspaces/{ws}/resume | resume workspace |
PUT | /api/v1/workspaces/{ws}/settings | workspace settings |
PUT | /api/v1/workspaces/{ws}/settings/digest | digest settings |
GET | /api/v1/workspaces/{ws}/settings/notification-preferences | Amendment 3a: the caller's own per-type channel preferences (email / in_app), plus the |
PUT | /api/v1/workspaces/{ws}/settings/notification-preferences | Amendment 3a: the caller's own per-type channel preferences (email / in_app), plus the |
PUT | /api/v1/workspaces/{ws}/settings/notifications | PUT {emails, webhook_url, webhook_secret?, events}: R-41 targets; the secret goes to the vault. |
PUT | /api/v1/workspaces/{ws}/settings/onboarding | PUT {step: done|skipped|pending}: resumable, skippable onboarding steps (L5). |
PUT | /api/v1/workspaces/{ws}/settings/shortener | PUT {provider, domain?, token?}: the token goes to the vault, never to settings/export. |
PUT | /api/v1/workspaces/{ws}/settings/x-caps | Item 9(c): owner/admin edit the workspace's soft/hard X caps (the 5b breaker enforces). |
GET | /api/v1/workspaces/{ws}/tokens | list tokens |
POST | /api/v1/workspaces/{ws}/tokens | create token |
DELETE | /api/v1/workspaces/{ws}/tokens/{id} | revoke token |
GET | /api/v1/workspaces/{ws}/tokens/{id}/usage | Leg 6 amendment 4a: one token's MCP usage — the operator endpoint's own numbers. |
POST | /api/v1/workspaces/{ws}/upload-links | create upload link |
GET | /api/v1/workspaces/{ws}/upload-links/{id} | upload link status |
POST | /api/v1/workspaces/{ws}/uploads | create upload |
GET | /api/v1/workspaces/{ws}/uploads/{id} | upload status |
PUT | /api/v1/workspaces/{ws}/uploads/{id}/chunks/{n} | upload chunk |
POST | /api/v1/workspaces/{ws}/uploads/{id}/complete | complete upload |
GET | /api/v1/workspaces/{ws}/usage/x | Item 9(b): the month's X spend — confirmed vs estimated, never blended — with pace and caps. |
GET | /mcp/listing.json | R-30: directory listing metadata (name, description, icon, categories) from one place. |
GET | /oauth/{platform}/callback | Platform redirect target (no login needed: the one-time state binds workspace + user). |
GET | /oauth2/authorize | Consent page: login (or sign-up) → choose workspace + scopes → Allow. |
POST | /oauth2/authorize | authorize submit |
POST | /oauth2/register | Register a public OAuth client (assistants register themselves on first connect). |
POST | /oauth2/revoke | RFC 7009: revoke an access or refresh token. Always 200 (no token enumeration). |
POST | /oauth2/token | Authorization-code (PKCE) and refresh-token grants; refresh rotates both tokens. |