API reference
API inventory — every CitationBench endpoint, grouped by pillar
Master catalog of every CitationBench REST and MCP endpoint, grouped by pillar (agent, research, production, indexing, link building) with links to full request and response samples.
- Base URL:
https://api.citationbench.com/v1
- Auth:
Authorization: Bearer sk_live_***
- Workspace scoping:
X-Workspace-Id: ws_*** header (agency master keys), or workspace-scoped keys
- Idempotency:
Idempotency-Key: <uuid> on every write
- Agentic endpoints return
{ invocationId, agentId, skill, skillsUsed, status, result, raw, files } once complete. invocationId and agentId are CUIDs; files is an array of file paths. See Agent · invoke for the universal response shape.
- Long-running results stream via SSE at
/v1/agent/invocations/{id}/events
- MCP tools are namespaced by pillar (
agent.*, research.*, produce.*, indexing.*, link_building.*)
One generic agent, many skills. Use agent.invoke to run a skill. bootstrap_brand, link_hunter, rank_monitor — these are skill slugs, not separate agents.
| Endpoint | Method | REST | MCP tool |
|---|
| Invoke a skill | POST | /v1/agent/invoke | agent.invoke |
| Get invocation status | GET | /v1/agent/invocations/{id} | agent.invocations.get |
| Stream invocation events | GET (SSE) | /v1/agent/invocations/{id}/events | — (MCP notifications) |
| Cancel an invocation | POST | /v1/agent/invocations/{id}/cancel | agent.invocations.cancel |
| List recent invocations | GET | /v1/agent/invocations | agent.invocations.list |
| Continue (multi-turn) | POST | /v1/agent/invocations/{id}/continue | agent.invocations.continue |
| Approve a pause | POST | /v1/agent/invocations/{id}/approve | agent.approval.approve |
| Reject a pause | POST | /v1/agent/invocations/{id}/reject | agent.approval.reject |
| List pending approvals | GET | /v1/agent/approvals | agent.approval.list |
| Upload a file | POST | /v1/agent/files | agent.files.upload |
| List files | GET | /v1/agent/files | agent.files.list |
| Get a file by path | GET | /v1/agent/files/{path} | agent.files.get |
| Delete a file | DELETE | /v1/agent/files/{path} | agent.files.delete |
| List available skills | GET | /v1/agent/skills | agent.skills.list |
| Get a skill's schema | GET | /v1/agent/skills/{slug} | agent.skills.get |
| Fork a skill | POST | /v1/agent/skills/{slug}/fork | agent.skills.fork |
→ Full sample requests/responses: agent-invoke.md, agent-files.md, agent-approval.md
Discover and analyze. Every research endpoint returns persistent objects that downstream Production and Distribution pillars can reference by ID.
| Endpoint | Method | REST | MCP tool |
|---|
| Run keyword research | POST | /v1/research/keyword | research.keyword.research |
| List keywords | GET | /v1/keywords | research.keyword.list |
| Get a keyword | GET | /v1/keywords/{id} | research.keyword.get |
| Create keyword(s) | POST | /v1/keywords | research.keyword.create |
| Update a keyword | PATCH | /v1/keywords/{id} | research.keyword.update |
| Delete (archive) | DELETE | /v1/keywords/{id} | research.keyword.delete |
| Bulk relabel | POST | /v1/keywords/relabel | research.keyword.relabel |
| Bulk import | POST | /v1/keywords/bulk | research.keyword.bulk_create |
| Search by labels | POST | /v1/keywords/search | research.keyword.search |
| Endpoint | Method | REST | MCP tool |
|---|
| Fetch a SERP | POST | /v1/research/serp | research.serp.fetch |
| Get a SERP | GET | /v1/research/serp/{id} | research.serp.get |
| List SERPs | GET | /v1/research/serp | research.serp.list |
Detects whether there's a "serp cliff" — a winnable gap between the top results and the rest. Useful for prioritizing keywords where ranking is realistic.
| Endpoint | Method | REST | MCP tool |
|---|
| Run a SERP gap analysis | POST | /v1/research/serp-gap | research.serp_gap.analyze |
| List analyses | GET | /v1/research/serp-gap | research.serp_gap.list |
| Get one analysis | GET | /v1/research/serp-gap/{id} | research.serp_gap.get |
| Endpoint | Method | REST | MCP tool |
|---|
| Add a competitor | POST | /v1/research/competitor | research.competitor.add |
| List competitors | GET | /v1/research/competitor | research.competitor.list |
| Pull backlinks | POST | /v1/research/competitor/{id}/backlinks | research.competitor.backlinks |
| Pull competitor keywords | POST | /v1/research/competitor/{id}/keywords | research.competitor.keywords |
| Get keyword overlap matrix | GET | /v1/research/competitor/{id}/overlap | research.competitor.overlap |
| Endpoint | Method | REST | MCP tool |
|---|
| Generate ICP from URL | POST | /v1/research/icp | research.icp.generate |
| Get current ICPs | GET | /v1/research/icp | research.icp.get |
| Update ICP segment | PATCH | /v1/research/icp/{segmentId} | research.icp.update |
| Endpoint | Method | REST | MCP tool |
|---|
| Run discussion research | POST | /v1/research/discuss | research.discuss.research |
| List discussions | GET | /v1/research/discuss | research.discuss.list |
| Get a discussion thread | GET | /v1/research/discuss/{id} | research.discuss.get |
| Endpoint | Method | REST | MCP tool |
|---|
| Run a citation check | POST | /v1/research/ai-citation | research.ai_citation.check |
| List citation queries | GET | /v1/research/ai-citation/queries | research.ai_citation.queries.list |
| Add a citation query | POST | /v1/research/ai-citation/queries | research.ai_citation.queries.create |
| Get historical results | GET | /v1/research/ai-citation/queries/{id}/history | research.ai_citation.history |
| Get share-of-voice | GET | /v1/research/ai-citation/share-of-voice | research.ai_citation.share_of_voice |
| Endpoint | Method | REST | MCP tool |
|---|
| Find content gaps | POST | /v1/research/content-gap | research.content_gap.find |
| List gap reports | GET | /v1/research/content-gap | research.content_gap.list |
| Get a gap report | GET | /v1/research/content-gap/{id} | research.content_gap.get |
→ Full sample requests/responses: research-keyword.md (others stubbed)
Brief, draft, refine, evaluate, image, publish. Everything that makes a piece of content shippable.
| Endpoint | Method | REST | MCP tool |
|---|
| Create a blog post | POST | /v1/produce/blog-post | produce.blog_post.create |
| List blog posts | GET | /v1/produce/blog-post | produce.blog_post.list |
| Get a blog post | GET | /v1/produce/blog-post/{id} | produce.blog_post.get |
| Update a blog post | PATCH | /v1/produce/blog-post/{id} | produce.blog_post.update |
| Delete (archive) | DELETE | /v1/produce/blog-post/{id} | produce.blog_post.delete |
| Regenerate sections | POST | /v1/produce/blog-post/{id}/regenerate | produce.blog_post.regenerate |
| Bulk create from keywords | POST | /v1/produce/blog-post/bulk | produce.blog_post.bulk_create |
| Endpoint | Method | REST | MCP tool |
|---|
| Generate landing page | POST | /v1/produce/landing-page | produce.landing_page.create |
| List landing pages | GET | /v1/produce/landing-page | produce.landing_page.list |
| Get a landing page | GET | /v1/produce/landing-page/{id} | produce.landing_page.get |
| Update (manual edits) | PATCH | /v1/produce/landing-page/{id} | produce.landing_page.update |
| Delete | DELETE | /v1/produce/landing-page/{id} | produce.landing_page.delete |
| Regenerate from step | POST | /v1/produce/landing-page/{id}/regenerate | produce.landing_page.regenerate |
| Manage pillars | CRUD | /v1/produce/landing-page/pillar/{...} | produce.landing_page.pillar.* |
| Endpoint | Method | REST | MCP tool |
|---|
| Apply a refiner | POST | /v1/produce/refine | produce.refine.apply |
| List refiners | GET | /v1/produce/refine/refiners | produce.refine.list_refiners |
| Create a refiner | POST | /v1/produce/refine/refiners | produce.refine.create_refiner |
| Update a refiner | PATCH | /v1/produce/refine/refiners/{id} | produce.refine.update_refiner |
| Delete a refiner | DELETE | /v1/produce/refine/refiners/{id} | produce.refine.delete_refiner |
| Bulk apply | POST | /v1/produce/refine/bulk | produce.refine.bulk |
| Endpoint | Method | REST | MCP tool |
|---|
| Evaluate a piece of content | POST | /v1/produce/evaluate | produce.evaluate.score |
| List evaluations | GET | /v1/produce/evaluate | produce.evaluate.list |
| Get an evaluation | GET | /v1/produce/evaluate/{id} | produce.evaluate.get |
| Compare two evaluations | POST | /v1/produce/evaluate/compare | produce.evaluate.compare |
| Manage rubrics | CRUD | /v1/produce/evaluate/rubric/{...} | produce.evaluate.rubric.* |
| Endpoint | Method | REST | MCP tool |
|---|
| Generate an image | POST | /v1/produce/image | produce.image.create |
| List images | GET | /v1/produce/image | produce.image.list |
| Get an image | GET | /v1/produce/image/{id} | produce.image.get |
| Delete an image | DELETE | /v1/produce/image/{id} | produce.image.delete |
| List templates | GET | /v1/produce/image/templates | produce.image.templates.list |
| Bulk regenerate | POST | /v1/produce/image/bulk | produce.image.bulk |
| Endpoint | Method | REST | MCP tool |
|---|
| Publish content | POST | /v1/produce/publish | produce.publish.send |
| List publishing history | GET | /v1/produce/publish/history | produce.publish.history |
| Unpublish (depublish) | POST | /v1/produce/publish/{id}/unpublish | produce.publish.unpublish |
| Manage platform configs | CRUD | /v1/produce/publish/platforms/{...} | produce.publish.platforms.* |
| Test a connection | POST | /v1/produce/publish/platforms/{id}/test | produce.publish.platforms.test |
→ Full sample requests/responses: production-blog-post.md (others stubbed)
Get URLs visible. Auto-fires on publish or callable standalone.
| Endpoint | Method | REST | MCP tool |
|---|
| Submit URL(s) for indexing | POST | /v1/indexing/gsc-index | indexing.gsc.submit |
| Get URL status | GET | /v1/indexing/gsc-index?url=... | indexing.gsc.status |
| List recent submissions | GET | /v1/indexing/gsc-index | indexing.gsc.list |
| Connect GSC | CRUD | /v1/indexing/gsc-index/config | indexing.gsc.config.* |
| Endpoint | Method | REST | MCP tool |
|---|
| Submit URL(s) | POST | /v1/indexing/indexnow | indexing.indexnow.submit |
| List submissions | GET | /v1/indexing/indexnow | indexing.indexnow.list |
| IndexNow config | CRUD | /v1/indexing/indexnow/config | indexing.indexnow.config.* |
→ Full sample requests/responses: indexing-gsc-index.md
The CRM + outreach engine, plus an autonomous inbound responder.
| Endpoint | Method | REST | MCP tool |
|---|
| Start a SERP campaign | POST | /v1/link-building/serp-outreach | link_building.serp_outreach.create |
| List SERP campaigns | GET | /v1/link-building/serp-outreach | link_building.serp_outreach.list |
| Get a campaign | GET | /v1/link-building/serp-outreach/{id} | link_building.serp_outreach.get |
| Get campaign drafts | GET | /v1/link-building/serp-outreach/{id}/drafts | link_building.serp_outreach.drafts |
| Bulk approve drafts | POST | /v1/link-building/serp-outreach/{id}/approve | link_building.serp_outreach.bulk_approve |
| Update filters | PATCH | /v1/link-building/serp-outreach/{id} | link_building.serp_outreach.update |
| Cancel a campaign | DELETE | /v1/link-building/serp-outreach/{id} | link_building.serp_outreach.cancel |
| Endpoint | Method | REST | MCP tool |
|---|
| Start competitor outreach | POST | /v1/link-building/competitor-outreach | link_building.competitor_outreach.create |
| List competitor campaigns | GET | /v1/link-building/competitor-outreach | link_building.competitor_outreach.list |
| Get a campaign | GET | /v1/link-building/competitor-outreach/{id} | link_building.competitor_outreach.get |
| Bulk approve drafts | POST | /v1/link-building/competitor-outreach/{id}/approve | link_building.competitor_outreach.bulk_approve |
Autonomous negotiation for inbound link-building requests. CitationBench watches your inbox, drafts (and optionally sends) responses to negotiate link swaps, paid placements, guest posts, and link insertions. You set eval gates — conditions that escalate to a human (e.g. partner requests payment, DR below threshold, suspicious sender).
| Endpoint | Method | REST | MCP tool |
|---|
| List inbound messages | GET | /v1/link-building/inbound | link_building.inbound.list |
| Get an inbound message | GET | /v1/link-building/inbound/{id} | link_building.inbound.get |
| Ingest a message (webhook) | POST | /v1/link-building/inbound/ingest | link_building.inbound.ingest |
| Draft a response | POST | /v1/link-building/inbound/{id}/draft | link_building.inbound.draft |
| Approve and send response | POST | /v1/link-building/inbound/{id}/approve | link_building.inbound.approve |
| Reject (mark spam / decline) | POST | /v1/link-building/inbound/{id}/reject | link_building.inbound.reject |
| List pending manual actions | GET | /v1/link-building/inbound/pending | link_building.inbound.pending |
| Get/update inbound settings | CRUD | /v1/link-building/inbound/settings | link_building.inbound.settings.* |
| Manage eval gates | CRUD | /v1/link-building/inbound/eval-gate/{...} | link_building.inbound.eval_gate.* |
| Get/update per-account behavior | CRUD | /v1/link-building/inbound/account-settings/{accountId} | link_building.inbound.account_settings.* |
| Get message history with a partner | GET | /v1/link-building/inbound/history?accountId=... | link_building.inbound.history |
| Endpoint | Method | REST | MCP tool |
|---|
| List all campaigns | GET | /v1/link-building/campaign | link_building.campaign.list |
| Get a campaign | GET | /v1/link-building/campaign/{id} | link_building.campaign.get |
| Get campaign metrics | GET | /v1/link-building/campaign/{id}/metrics | link_building.campaign.metrics |
| Pause / resume campaign | POST | /v1/link-building/campaign/{id}/{pause|resume} | link_building.campaign.toggle |
| Send an outreach email | POST | /v1/link-building/campaign/{id}/send-email | link_building.campaign.send_email |
| Endpoint | Method | REST | MCP tool |
|---|
| List accounts | GET | /v1/link-building/crm/account | link_building.crm.account.list |
| Get an account | GET | /v1/link-building/crm/account/{id} | link_building.crm.account.get |
| Update an account | PATCH | /v1/link-building/crm/account/{id} | link_building.crm.account.update |
| List relationships | GET | /v1/link-building/crm/relationship | link_building.crm.relationship.list |
| Get a relationship | GET | /v1/link-building/crm/relationship/{id} | link_building.crm.relationship.get |
| Update relationship status | PATCH | /v1/link-building/crm/relationship/{id} | link_building.crm.relationship.update |
| List contacts | GET | /v1/link-building/crm/contact | link_building.crm.contact.list |
| Get a contact | GET | /v1/link-building/crm/contact/{id} | link_building.crm.contact.get |
| Discover contacts (Apollo) | POST | /v1/link-building/crm/contact/discover | link_building.crm.contact.discover |
| List events | GET | /v1/link-building/crm/event | link_building.crm.event.list |
| Add a note (event) | POST | /v1/link-building/crm/event | link_building.crm.event.create |
→ Full sample requests/responses: link-building-serp-outreach.md (others stubbed)
| Endpoint | Method | REST | MCP tool |
|---|
| List workspaces | GET | /v1/workspaces | workspaces.list |
| Get a workspace | GET | /v1/workspaces/{id} | workspaces.get |
| Create a workspace | POST | /v1/workspaces | workspaces.create |
| Archive a workspace | DELETE | /v1/workspaces/{id} | workspaces.delete |
| Bulk-action across many | POST | /v1/workspaces/bulk-action | workspaces.bulk_action |
| Endpoint | Method | REST |
|---|
| Register a webhook | POST | /v1/webhooks |
| List webhooks | GET | /v1/webhooks |
| Delete a webhook | DELETE | /v1/webhooks/{id} |
| Test a webhook | POST | /v1/webhooks/{id}/test |
Outbound event types (selected): agent.invocation.completed, agent.invocation.failed, agent.invocation.awaiting_approval, link_building.inbound.received, link_building.inbound.requires_review, link_building.email.opened, link_building.email.replied, indexing.url.indexed, produce.publish.completed.