REST API reference
Authenticated integrations use API tokens and the /api/v1 namespace. Every response is JSON with ok, data, and requestId fields.
Access policy
API tokens require an active subscription and your first Mission Brief. During the $1 trial you may create read-only tokens (mission_briefs:read, opportunities:read, growth_orders:read, etc.). Write scopes (Mission Brief generation, content drafts, analyst ask) unlock on a paid plan and still consume Mission Fuel credits.
Costly REST endpoints mirror in-app credit gates: POST mission-briefs/generate, POST analyst/ask, and POST content-drafts are blocked on trial and credit-gated on paid plans.
Authentication
Send Authorization: Bearer <token> on every request. Org tokens use the ldt_ prefix. Website-scoped tokens use ldw_ and are limited to one site.
Tokens expose the same operator workflows as the app: Mission Brief generation, Opportunity Engine reads, AI Analyst questions, Content Operations drafts, and Knowledge Base import, each credit-gated where the UI is.
Growth Orders, Asset Yield summaries, and publish connectors use the same bearer token scopes as the website command center UI.
Content Operations endpoints create drafts only. Approve and publish through your CMS or connector after human review.
AI Analyst endpoints mirror the in-app question flow and consume Mission Fuel credits the same way.
Endpoints
- GET /api/v1/me: account:read
- GET /api/v1/credits/balance: credits:read
- GET /api/v1/websites: websites:read
- GET /api/v1/websites/:websiteId: websites:read
- GET /api/v1/websites/:websiteId/readiness: websites:read (integrations + sync freshness + URL count)
- GET /api/v1/websites/:websiteId/mission-briefs/latest: mission_briefs:read
- POST /api/v1/websites/:websiteId/mission-briefs/generate: mission_briefs:write (credit-gated)
- GET /api/v1/websites/:websiteId/opportunities: opportunities:read (?type=decay filters declining_page + content_refresh)
- GET /api/v1/websites/:websiteId/growth-orders: growth_orders:read
- POST /api/v1/websites/:websiteId/growth-orders: growth_orders:write (track opportunity, 0 credits, Idempotency-Key supported)
- PATCH /api/v1/websites/:websiteId/growth-orders/:orderId/complete: growth_orders:complete
- POST /api/v1/websites/:websiteId/analyst/ask: analyst:ask (credit-gated)
- GET /api/v1/websites/:websiteId/content-drafts: content:read
- POST /api/v1/websites/:websiteId/content-drafts: content:write (brief, credit-gated)
- GET /api/v1/websites/:websiteId/content-drafts/:draftId: content:read (full export)
- POST /api/v1/websites/:websiteId/content-drafts/:draftId: content:write (generate article)
- POST /api/v1/websites/:websiteId/content-drafts/:draftId/approve: content:review (requires auto-approve setting)
- POST /api/v1/websites/:websiteId/content-drafts/:draftId/publish: content:publish (record URL, start yield)
- POST /api/v1/websites/:websiteId/content-drafts/:draftId/push: content:push (GitHub PR, CMS draft, etc.)
- GET /api/v1/websites/:websiteId/publish-integrations: publish_integrations:read
- POST /api/v1/websites/:websiteId/publish-integrations: publish_integrations:write
- GitHub KB import (POST, scope knowledge:write)
- POST /api/v1/websites/:websiteId/knowledge/bulk: knowledge:write (JSON items array, max 20)
- POST /api/v1/websites/:websiteId/knowledge/import-drive: knowledge:write (folderId)
- POST /api/v1/websites/:websiteId/knowledge/import-slack: knowledge:write (channelId)
- POST /api/v1/websites/:websiteId/discover: asset_discovery:write (sitemap + llms.txt)
- GET /api/v1/websites/:websiteId/discover: asset_discovery:read
- GET /api/v1/websites/:websiteId/signal/status: signal:read
- GET /api/v1/websites/:websiteId/signal/journeys/summary: signal:read
- GET /api/v1/websites/:websiteId/signal/journeys/paths: signal:read
- GET /api/v1/websites/:websiteId/signal/journeys/funnel: signal:read
- GET /api/v1/websites/:websiteId/signal/sessions: signal:read
- GET /api/v1/websites/:websiteId/signal/sessions/:sessionId: signal:read
- POST /api/v1/websites/:websiteId/signal/events: signal:write (goal, revenue, optional page_view; free)
- GET /api/v1/websites/:websiteId/asset-yield/summary: asset_yield:read
- GET /api/v1/websites/:websiteId/asset-yield/top-orders: asset_yield:read
- GET /api/v1/websites/:websiteId/asset-yield/revenue: asset_yield:read
- GET /api/v1/websites/:websiteId/asset-yield/content: asset_yield:read
- GET /api/v1/websites/:websiteId/yield-receipts: yield_receipts:read
- POST /api/v1/websites/:websiteId/yield-receipts: yield_receipts:write
Errors
Errors return ok: false with error.code and error.message. Common codes: missing_token, invalid_token, insufficient_scope, rate_limited, insufficient_credits, website_not_found.
Idempotency
POST /mission-briefs/generate accepts an Idempotency-Key header. Replays within one hour return the original result without charging credits again.