Developers · API & MCP · Enterprise

The Audience Intel engine, inside your own tooling.

Everything the console can do — market scans, the truth-gate fact layer, review intelligence, validation studies, PECR-safe outreach — as a versioned REST API and a remote MCP server your AI tools connect to directly. Scoped keys, per-key daily spend caps, and every figure carrying its provenance label.

Quickstart

1 · Get a key. There is no self-serve signup: API and MCP access is the Enterprise tier (price on application), and keys are minted by the operator after a conversation about scopes and spend caps. Email us to start. Keys look like aik_live_… and are shown exactly once at mint — only a SHA-256 hash is stored, so a lost key is a re-mint, not a recovery.

2 · Authenticate. Every request sends the key as a Bearer token. Prove yours works:

curl https://audienceintel.app/api/v1/health \
  -H "Authorization: Bearer aik_live_..."

# → { "ok": true, "client": "Your Firm", "scopes": ["read:reports", ...] }

3 · First calls. List reports, then pull the fact layer with a provenance filter — note every fact carries provenance, confidence and truth-gate status:

curl "https://audienceintel.app/api/v1/reports?limit=5" \
  -H "Authorization: Bearer $KEY"

curl "https://audienceintel.app/api/v1/reports/$REPORT_ID/facts?provenance=measured" \
  -H "Authorization: Bearer $KEY"

4 · Connect an AI client over MCP. The remote MCP server lives at https://audienceintel.app/api/mcp (Streamable HTTP, stateless) and shares the same key auth — the key needs the mcp:connect scope, and each tool additionally enforces its own scope from the table below. For Claude Code:

claude mcp add --transport http audience-intel \
  https://audienceintel.app/api/mcp \
  --header "Authorization: Bearer aik_live_..."

For Claude.ai (Team/Enterprise custom connectors) or any other MCP client: remote server URL https://audienceintel.app/api/mcp with an Authorization: Bearer aik_live_… header. Tools exposed: run_market_scan, list_reports, get_report, query_report_facts, correct_fact, run_review_mirror, check_ai_visibility, mint_teaser_links, check_outreach_eligibility, get_funnel_stats. Tools that spend money say so in their descriptions, so your model will warn you before it runs one.

Scopes

Every key carries an explicit scope list; every endpoint declares what it needs (also machine-readable in the spec as x-required-scopes). Spend-triggering scopes are never granted by default and are inert until the key also has a daily spend cap above zero.

ScopeGrantsSpend
read:reportsList and read scan reports, payload blocks, audit trails, exports, scan/prospect-run/mirror/validation status, Friday reports, growth funnel, connector health and stats.no
read:factsRead the truth-gate fact layer (operator-overlay merged) and the derivation graph.no
write:factsWrite truth-gate overlay entries (verify / correct / reject / add). Reserved for the workbench overlay surface; no /api/v1 REST route ships it yet — the MCP correct_fact tool uses it.no
write:scansEnqueue full market scans and run prospect console runs — paid connectors plus LLM legs.yes
write:mirrorRun Market Mirror review analyses (scraping + LLM).yes
write:outreachMint teaser links, build warm packs, PECR checks, growth audience and suppression writes. Sensitive rather than spend.no
write:validationCreate and calibrate validation studies free; PUBLISH is the spend step (real Prolific money).yes
admin:keysMint, list and revoke API keys — own client only, unless the key belongs to an operator-kind client.no
mcp:connectOpen the /api/mcp endpoint at all; each MCP tool still enforces its own scope from this table.no
read:dev-proxySecretless local dev only: forward a Firecrawl scrape or an LLM completion through the Fly provider proxy (/api/v1/dev/*) so a laptop needs no vendor key. Grants nothing else. Spend-gated against the key's daily cap.yes

Spend caps

Some operations spend real money — paid data connectors, LLM legs, Prolific panel budgets. Each key has a dailySpendCapPence (UTC day). Before a spend operation dispatches, its estimated cost is checked against the cap and written to an append-only ledger — admission-time accounting, so a crashed job still counted and a refusal happens before anything upstream is touched. Over the cap answers 403 spend_cap_exceeded with capPence, spentPence and estimatePence in the details, and every successful spend response echoes the same accounting. A cap of 0 makes spend scopes unusable even if granted.

The operations that spend:

POST /api/v1/scans/estimate is the free pre-flight: it prices a scan, a mirror run, or a prospect run (per-source) in pence so you can check against your cap before committing. Validation publishing is additionally protected by a global spend guard on our side — two independent gates, both required.

Honest data, by contract

The discipline behind the reports is part of the API surface, not marketing. Every fact and figure that leaves this API carries a provenance label: measured (observed directly — a real query against a live engine, a registry read, a crawled page), inferred (derived from measured inputs), modelled (estimated from priors, labelled as such), or supplied (stated by the client, never verified by us) — plus a confidence figure and a truth-gate status (unverified / verified / corrected / rejected) from operator QA. No endpoint strips these to make a response cleaner, and the derivation graph (GET /reports/{id}/graph) shows how every derived number traces back to its inputs.

The same honesty applies to failure. A missing upstream or a dead dependency answers { ok: false, reason: … } or a typed error envelope — never an invented number, never a padded count, never a stack trace. If GET /api/v1/statscan't reach the database, it says so; it does not guess.

One error envelope

Every error is { ok: false, error: { code, message, details? } } with a machine-stable code. Auth fails closed (a database error during key lookup is a 503, never an allow-through); rate limiting fails open (a broken counter must not take the API down).

CodeHTTPMeaning
unauthorized401Missing/malformed Bearer header, or unknown/revoked key. Auth fails closed.
forbidden_scope403The key is missing a required scope; details.missingScopes names it.
spend_cap_exceeded403 / 402Admitting this spend would exceed the key's daily cap (per-key), or the global spend guard refused (validation publish).
validation_failed400The request body or query failed validation; Zod issues in details.issues.
not_found404No such resource. Malformed ids answer this too — never a database error.
rate_limited429Over the key tier's request limit. Retry-After header set.
upstream_unavailable503A dependency is down. Never a stack trace, never an invented body.

Within v1, changes are additive only — new fields, new endpoints, new output enum values. Renames, removals or new required inputs would be a v2.

Endpoint reference

Generated from the same document served at /api/v1/openapi.json (OpenAPI 3.1, public, no key required) — point your client generator at that. Base URL: https://audienceintel.app/api/v1.

Meta

Spec, key smoke-test, counters and connector health.

  • GET/api/v1/openapi.jsonThis document. Public — no key required.public
  • GET/api/v1/healthKey smoke-test: echoes the client name and granted scopes.any key
  • GET/api/v1/statsLive counters: Friday reports built, scan reports, scan jobs by status.read:reports
  • GET/api/v1/connectors/healthEnv-presence health for the full connector roster. Booleans only.read:reports

Reports

Scan reports: summaries, payload blocks, audit trails and exports.

  • GET/api/v1/reportsList scan reports, newest first.read:reports
  • GET/api/v1/reports/{id}One scan report with its payload blocks.read:reports
  • GET/api/v1/reports/{id}/blocks/{block}One payload block, untouched — provenance labels travel with it.read:reports
  • GET/api/v1/reports/{id}/auditThe provenance audit trail as JSON.read:reports
  • GET/api/v1/reports/{id}/exports/audit.csvAudit trail as a CSV attachment (keyed alias of the public download).read:reports
  • GET/api/v1/reports/{id}/exports/audit.jsonAudit trail as a JSON attachment (keyed alias of the public download).read:reports
  • GET/api/v1/reports/{id}/exports/schema.jsonThe report's schema.org JSON-LD, ready for a site head.read:reports

Facts

The truth-gate fact layer and its derivation graph — provenance always attached.

  • GET/api/v1/reports/{id}/factsThe truth-gate fact layer — every fact carries provenance, confidence, status.read:facts
  • GET/api/v1/reports/{id}/graphThe derivation graph: fact nodes + derivation edges. Re-derived, never persisted.read:facts

Scans

Durable full market-scan jobs: enqueue (spend), status, SSE events, free estimates.

  • POST/api/v1/scansEnqueue a full market scan. SPEND — admitted against the key's daily cap.Spendwrite:scans
  • GET/api/v1/scans/{id}Scan job status: queued | running | done | failed, with reportId when done.read:reports
  • GET/api/v1/scans/{id}/eventsScan progress over SSE: replays the buffer, then tails live events.read:reports
  • POST/api/v1/scans/estimateFree pre-flight cost estimates — check an op against your cap before spending.read:reports

Prospect runs

Full-surface prospect console runs (spend): enqueue a durable job, poll to completion.

  • POST/api/v1/prospect-runsRun a prospect console run. SPEND — answers 202, then poll.Spendwrite:scans
  • GET/api/v1/prospect-runs/{id}Poll a prospect run: status while in flight, the stored report once done.read:reports

Buyer panel

Synthetic buyer-panel studies (credit-metered): enqueue a run, poll for the aggregated result.

  • GET/api/v1/panelList this org's buyer-panel runs, newest first.read:reports
  • POST/api/v1/panelRun a synthetic buyer-panel study. SPEND — answers 202, then poll.write:scans
  • GET/api/v1/panel/{id}Poll a buyer-panel run: status while in flight, the result once done.read:reports

Continuous assessment

"The Watch": place a firm under recurring re-scan on a cadence and read the deltas between runs.

  • GET/api/v1/assessmentList continuous-assessment watches, newest first.read:reports
  • POST/api/v1/assessmentRegister a firm under recurring re-scan ("The Watch").write:scans
  • GET/api/v1/assessment/{id}Get one watch and its latest deltas.read:reports

Market Mirror

Review-intelligence analyses (spend): gather sources, analyse, poll.

  • POST/api/v1/mirror/analysesRun a Market Mirror review analysis. SPEND — answers 202, then poll.Spendwrite:mirror
  • GET/api/v1/mirror/analyses/{id}Poll a Market Mirror analysis: queued | fetching | analyzing | done | failed.read:reports

Validation

Real-money Prolific validation studies: draft free, publish is the spend step, calibrate free.

  • POST/api/v1/validation/studiesCreate a validation study as an UNPUBLISHED panel draft. No money moves.write:validation
  • GET/api/v1/validation/studies/{id}Study status: DB status + panel state + submission tallies.read:reports
  • POST/api/v1/validation/studies/{id}/publishPublish the study to Prolific. THE money step — two independent gates.Spendwrite:validation
  • POST/api/v1/validation/studies/{id}/calibrateCollect quality-gated responses and compute the calibration block. Non-spend.write:validation

Outreach

PECR-gated teaser links, warm packs and eligibility checks. Fails closed.

  • POST/api/v1/reports/{id}/teaser-linksMint PECR-safe competitor teaser links + drafted outreach for a report.write:outreach
  • GET/api/v1/reports/{id}/warm-packThe full warm-outreach pack: teasers + PECR eligibility + drafted copy.write:outreach
  • POST/api/v1/outreach/pecr-checkIs this company PECR-safe to email? Pure check, no side effects.write:outreach

Friday

Friday website-first reports: tracked companies and saved reports.

  • GET/api/v1/friday/reportsCompanies that have generated a Friday report — one summary row each.read:reports
  • GET/api/v1/friday/reports/{id}One saved Friday report with its rendered sections untouched.read:reports

Growth

Growth-engine CRM: audience upserts, do-not-contact suppressions, funnel snapshot.

  • POST/api/v1/growth/audiencesInsert or update a company in the growth audience CRM. Idempotent on id.write:outreach
  • POST/api/v1/growth/suppressionsAdd a do-not-contact entry. A suppression always says why it exists.write:outreach
  • GET/api/v1/growth/suppressions/checkIs any of the given identifiers on the do-not-contact list?write:outreach
  • GET/api/v1/growth/funnelThe growth-engine funnel snapshot — every number a live count, nothing padded.read:reports

Keys

Key admin: mint, list, revoke. Operator keys act cross-client.

  • GET/api/v1/keysList keys: prefix + label + scopes — never hashes.admin:keys
  • POST/api/v1/keysMint a key. The plaintext is returned ONCE and never stored.admin:keys
  • DELETE/api/v1/keys/{id}Revoke a key (idempotent). The row is kept for audit + the spend ledger.admin:keys

Dev proxy

Secretless local dev: forward scrape/LLM calls through the Fly proxy so a laptop needs no vendor key. Non-prod only.

  • POST/api/v1/dev/scrapeForward a Firecrawl scrape through the Fly proxy. SPEND. Dev only.Spendread:dev-proxy
  • POST/api/v1/dev/llmForward a structured LLM completion through the Fly proxy. SPEND. Dev only.Spendread:dev-proxy

Enterprise — price on application

API and MCP access ships as the Audience Intel Enterprise tier, for firms and agencies running the engine across a portfolio: API access to the report engine, an MCP server so your own AI tools can query your market data directly, and a named client success manager. Scoped and priced to your estate — keys, scopes, rate tiers and spend caps are agreed in a conversation, not a checkout.

Talk to us

Audience Intel · part of Bridge Intelligence · by Cambray Design · audienceintel.app