REST, phase 1

Social listening API

The discatch API is the whole product. Every page on this site shows the exact call beside what it describes, because the first reader is expected to be a program. This is a social listening API and a brand monitoring API; the same endpoints serve both. Today the API serves the doctor manifest. Search, quotes, and trial keys are roadmap phase 1b. Catches are phase 2.

The surface

MethodPathWhat it doesUnitsPhase
GET/v1/doctorThe manifest: where to start, how to get a key, prices today, sources nownonelive
POST/v1/quoteA ceiling for a search or a catch, valid for a short windownone1b
POST/v1/searchOne query across the sources you name, deduplicated and rankedsearch, result1b
POST/v1/captureOne post or page fetched with thread contextcapture1b
POST/v1/classifyClassify results against caller-defined criteriaclassify1b
GET/v1/sourcesWhat is live right now and whether deep coverage is possiblenone1b
POST/v1/keys/trialA key with no identity and a small allowancenone1b
POST/v1/keys/claimClaim a trial key with an email to keep it and raise allowancenone1b
POST/v1/catchesA standing query with a destinationalert, result per firing2
GET/PATCH/DELETE/v1/catches/{id}Read, update, or remove a catchnone2
GET/v1/eventsThe account event log from a cursor, with long-poll and SSEnone2
POST/v1/subscriptionsRoute events to a webhook, Doozy, GitHub dispatch, or emailnone2
GET/v1/usageUnits consumed this period, by kind, with spendnone1b
From docs/api.md. Phases from docs/roadmap.md.

The result shape

Every result from search, capture, and catch deliveries uses the same shape. The classification field is present only when classify: true was requested.

Result

{
  "id": "res_01J...",
  "source": "hackernews",
  "url": "https://news.ycombinator.com/item?id=42345678",
  "title": "Show HN: a tool that catches discourse online",
  "excerpt": "We built this because none of the monitoring tools ...",
  "body": null,
  "author": { "handle": "user", "url": null },
  "posted_at": "2026-09-09T14:17:00Z",
  "found_at": "2026-09-09T15:30:00Z",
  "language": "en",
  "prescore": 0.82,
  "thread": { "replies": 47, "score": 312, "parent_url": null },
  "classification": null,
  "matched": { "query": "\"your product\"", "terms": ["your product"] }
}

The error envelope

Error

{
  "error": {
    "code": "budget_exceeded",
    "message": "This search would cost $0.09 and your budget_usd is $0.05.",
    "next_action": "Raise budget_usd, narrow sources, or set coverage to fast."
  }
}

Codes: unauthorized, scope_missing, budget_exceeded, quote_expired, source_unavailable, invalid_query, rate_limited, destination_failed. Every error carries a next_action so the caller knows what to do without reading docs.

The quote flow

Every call that consumes units can be quoted first. The quote is a ceiling with locked unit prices. The charge is actual units at those prices and never exceeds the ceiling.

  1. POST /v1/quote with the same body you would send to /v1/search. The response carries a quote_id, the ceiling in USD, and unit prices locked for a short window.
  2. POST /v1/search with the quote_id to lock those prices. Or call without it and the quote is computed inline.
  3. Read the quote on the response to see what was charged.

Scoped keys

Keys are scoped: read, search, catches:write, billing:read. A trial key starts with read and search. Claiming it with an email adds catches:write. The quote endpoint needs no scope because it charges nothing.

What works today

GET /v1/doctor is live. It returns the manifest with prices today, sources now, and how to get a key. Every other endpoint on this page is the proposed interface from docs/api.md. The manifest reports what is live and what is planned. Unknown routes return the manifest with a next_action so a wrong URL still lands the caller in the right place.

Questions

Is this a social listening API or a data firehose?

A mentions and alerts API. You send a query and get matched results with a prescore, or you register a catch and get pushed what is new. Raw-firehose APIs sell every post; discatch sells the ones that match.

How is it priced?

By unit: search, capture, result, alert, classify. Every call can be quoted first, and the quote is a ceiling. There is no seat and no per-keyword fee. The numbers are placeholders until provider terms settle.

Is there an OpenAPI spec?

Yes, at api.discatch.com/.well-known/openapi.json, generated from the same code that serves the API. The doctor manifest links it.

What works today?

GET /v1/doctor. Everything else on this page is the proposed interface, landing in phases 1b and 2. The manifest lists what is live.

Can an agent sign up without a human?

POST /v1/keys/trial returns a key with no email and no card. Claim it later with an email to keep the key and raise the allowance.

Is this also a brand monitoring API?

Yes. Social listening and brand monitoring are the same thing at the API level: a query, sources, and results. Both queries lead here.

What happens if my budget is exceeded?

The call returns a 402 with budget_exceeded, the amount it would have cost, and a next_action. Nothing runs and nothing is charged.

Can I query Reddit and X through this API?

Not as named sources yet. Reddit and X posts arrive as web results with a domain field when you search across the web source. Direct access is planned once a cleared data path exists. The sources page lists every platform and its status.

Does discatch ever post on my behalf?

No. discatch catches and delivers. Reply drafting is the job of the caller or a playbook the caller runs. discatch never publishes anything on any platform.

Last reviewed by , founder, dcouple. Copy from docs/api.md, docs/roadmap.md, docs/pricing.md.