Curated data sources
10 data sources, one REST base, one API key, one credit balance. You never open an account with an upstream provider, never hold a second key, and never reconcile a second invoice. Requests are validated before they leave the platform, and a failed call costs you nothing.
What a curated data source is
A curated source is one the platform holds the upstream relationship for. We contract with the upstream providers and pay them; you pay in platform credits, per call, on the same balance every other source draws from. That is the whole difference from a connection, where you bring your own vendor credential and the vendor bills you.
Sources are addressed by a public slug, and the slug is the only identifier that appears anywhere: in the URL, in the MCP tool name, in your usage rows, in the pricing catalog. Which upstream provider backs a slug is an implementation detail we reserve the right to change without touching your code.
| Slug | Source | Endpoints | Base path |
|---|---|---|---|
agnt | Lead APIs | 12 | /v1/data/agnt/* |
facebook | 35 | /v1/data/facebook/* | |
instagram | 22 | /v1/data/instagram/* | |
linkedin | 51 | /v1/data/linkedin/* | |
reddit | 29 | /v1/data/reddit/* | |
seo | SEO | 22 | /v1/data/seo/* |
tiktok | TikTok | 12 | /v1/data/tiktok/* |
web | Web | 3 | /v1/data/web/* |
x | X (Twitter) | 47 | /v1/data/x/* |
youtube | YouTube | 24 | /v1/data/youtube/* |
Making a call
Every method is forwarded. /v1/data/:source/* passes the HTTP verb, the query string (including repeated parameters, which arrive upstream as a repeated key) and the JSON body straight through to the operation the path resolves to.
Authenticate with Authorization: Bearer <key>. Mint a key in the dashboard at app.superagnt.com.
A request body is JSON: send it with Content-Type: application/json, because the content type you send is passed upstream with the body.
curl "https://api.superagnt.com/v1/data/<source>/<endpoint>?limit=25" \
-H "Authorization: Bearer $AGNTDATA_API_KEY"const res = await fetch(
"https://api.superagnt.com/v1/data/linkedin/get-company-details?username=microsoft",
{ headers: { Authorization: `Bearer ${process.env.AGNTDATA_API_KEY}` } },
);
const body = await res.json();
if (!body.success) {
throw new Error(`${body.error.code}: ${body.error.message}`);
}
console.log(body.data); // LinkedIn's payload, in LinkedIn's own shape
console.log(body.meta.costCents); // what this call was charged, in centsbad requests are free
VALIDATION_ERROR with HTTP 400 and a details array naming each offending field, and nothing is charged.What you pay
Every successful response carries its own price. meta.costCents is the amount actually charged for that call, after any discount on your account, and the two remaining balances sit beside it. You never need a second round trip to find out what a call cost or what is left.
{
"success": true,
"data": { "...": "the upstream payload" },
"meta": {
"costCents": 1,
"purchasedBalanceCents": 4820,
"subscriptionRemainingCents": 1500,
"cached": false,
"latencyMs": 412
}
}data is the source's own payload, in that source's field names: there is no common schema across sources. For a compact view of it instead, a markdown table or only the fields you name, see Response views and paging. purchasedBalanceCents and subscriptionRemainingCents are what your data wallet has left after the call: the purchased balance and the remaining subscription allowance, both explained in Credits and wallets. latencyMs is how long the upstream call took, retries included, and cached is always false.
Pricing is set per slug, with optional per-endpoint overrides where one operation is materially more expensive than the rest of its source. Some sources are variable-cost by nature: the web and seo sources price a call by what the request actually did, so the platform bills the real upstream-reported cost rather than the pre-call estimate. The estimate is only the balance gate.
Failed calls and empty results cost nothing. An upstream error, a timeout, and a failure reported inside an HTTP 200 are billed at zero and logged as errors. A query that matched nothing is a success at zero cost, with meta.empty set.
do not hardcode prices
GET /v1/platforms (unauthenticated) or GET /v1/platforms/:slug for per-endpoint figures, or browse them in the API reference. Copying a number into your own docs or UI is how a stale price ends up in front of a customer.Pagination
Curated sources keep each upstream's own pagination convention. Most commonly that is a dedicated continuation operation: you call the list endpoint, take the continuation token out of the response, and feed it to the matching …_continuation operation. Others page by cursor, by number or by offset.
There is no single platform-wide cursor on this surface, so check the endpoint you are calling in the reference rather than assuming. Elsewhere on the platform, the two webhook delivery lists page by cursor, and the workspace database and /v1/usage by limit and offset.
Response views and paging walks through each of these paging styles over MCP and over REST.
From an agent
Over MCP the same operations appear as tools named data_<slug>_<operationId>, for example data_reddit_search_posts. Same validation, same pricing, same credit balance as REST.
On Claude, add the server as a connector: open the prefilled dialog on claude.ai and click Add. Claude Code signed in with an API key, or another CLI, connects with:
claude mcp add --scope user --transport http superagnt https://mcp.superagnt.com/mcp
claude mcp login superagntCurated sources are on by default on a server that lists grouped tools, as every workspace MCP server does unless it was set up per operation on purpose: a few grouped tools per source keep the tool list short. A per-operation server keeps them opt-in: find a source with agnt_tools_search, then turn it on with agnt_tools_enable and the family id data:<slug>, for example { "families": ["data:x"] }. The first-party agnt source is on every server and never needs an enable.
after enabling
Errors specific to this surface
| Code | HTTP | What it means |
|---|---|---|
PROVIDER_NOT_FOUND | 404 | The slug in the path is not a data source. The response lists every valid slug, so you can correct it without leaving the error. |
ENDPOINT_NOT_FOUND | 404 | The slug is real but no operation on it matches that method and path. Check the source hub in the reference. |
PROVIDER_UNAVAILABLE | 503 | No upstream credential is configured for that source on our side. Nothing you can fix in your request; contact support if it persists. |
VALIDATION_ERROR | 400 | The request did not match the source's spec. The details array names each field. Not charged. |
Upstream calls time out at 30 seconds. Transient upstream failures are retried on your behalf before the error reaches you, and a retried call that succeeds is billed exactly once.
A failure comes back as success: false with an error object holding a stable code and a message, the same envelope as every other route. The full code table, rate limits and the Retry-After header are on Errors and rate limits, with a retry helper in TypeScript and Python.
Migrating off the pre-/v1/data path
removed 2026-10-01
/v1/<slug>/* paths no longer answer. Change the base path from /v1/ to /v1/data/; your key and parameters are unchanged.The full reference
Every source, every endpoint, parameter schemas, response shapes and per-call pricing live in the API reference, one page per endpoint.
API reference
All 10 sources with parameters, response schemas and live pricing.
People and company enrichment
The orchestrated agnt endpoints, their two pricing models, and how to cap what a call can cost.
OpenAPI spec
The merged OpenAPI document for every public source, for codegen and client generators.