Your first request
#DeepSearch's API base URL is:
https://deepsearch.app/api/v1Send requests to individual endpoints such as /api/v1/search. The base URL is a discovery index, not a POST endpoint.
curl https://deepsearch.app/api/v1/search \
-H "Authorization: Bearer dsk_test_deepsearch" \
-H "Content-Type: application/json" \
-d '{
"query": "Ada Lovelace",
"type": "name",
"format": "json"
}'Authentication
#The DeepSearch API uses scoped bearer keys for server-to-server authentication.
Bearer API keys
Create a key in the developer portal. Pass it in the Authorization header, store it in server secrets, and never expose it in a browser bundle. A key is shown in full only once.
curl https://deepsearch.app/api/v1/search \
-H "Authorization: Bearer $DEEPSEARCH_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "query": "Ada Lovelace" }'Scopes
Each key carries scopes that gate which endpoints it can call. New keys are granted all three by default, but production keys can be narrowed to only the endpoints they need and can be given an expiry date or per-key minute limit.
A request with a missing or revoked key returns 401; a valid key without the required scope returns 403.
DeepSearch SDKs
#Official, dependency-free clients published under the @reloadapp npm scope by the publisher of this site. Keep API keys server-side and start with sandbox: true while wiring parsers and UI states. Prefer a terminal? See the command-line interface.
Command-line interface - search, dossier, chat, and async jobs from a terminal.
npm install -g @reloadapp/deepsearchDependency-free TypeScript SDK for Node and edge runtimes.
npm install @reloadapp/deepsearch-clientimport { DeepSearchClient } from "@reloadapp/deepsearch-client";
const deepsearch = new DeepSearchClient({
apiKey: process.env.DEEPSEARCH_API_KEY!,
});
const result = await deepsearch.search({
query: "Ada Lovelace",
type: "name",
sandbox: true,
});
console.log(result.hits);Reference apps
Worked examples live in the DeepSearch repository rather than on a registry, so these are paths to read rather than packages to install.
examples/node-cliexamples/nextjs-starterexamples/mcp-agentDeepSearch developer resources
#Machine-readable contracts, discovery files, and installable packages all live at stable URLs under https://deepsearch.app.
/apiWhat the API does, authentication, pricing, and a quickstart.
/api/docsEvery endpoint with parameters, examples, MCP setup, and error codes.
/openapi.jsonThe machine-readable contract. Load it to call every endpoint.
/api/mcpStreamable-HTTP MCP endpoint: search_people, build_dossier, ask_about_person.
/.well-known/mcp.jsonRegistry-shaped server.json describing the hosted MCP remote.
/.well-known/oauth-protected-resourcePoints MCP clients at the authorization server for sign-in.
/.well-known/oauth-authorization-serverOAuth 2.1 with PKCE and dynamic client registration - no pasted keys.
/.well-known/ai-plugin.jsonai-plugin.json pointing agents at the OpenAPI document.
/.well-known/ai-catalog.jsonOne index of every agent-callable resource on the domain.
/.well-known/agent-skills/index.jsonPublished skills a coding agent can install to use the API step by step.
/llms.txtPlain-language brief for LLMs: what the product is and when to use it.
/llms-full.txtThe long form, including endpoints, limits, and an FAQ.
/changelogWhat shipped, when - including API and MCP changes.
/developersCreate and revoke API keys, test live, inspect usage, manage webhooks. Requires sign-in.
Published packages
The hosted server is listed in the official MCP Registry as app.deepsearch/deepsearch.
Command-line interface
#@reloadapp/deepsearch is a single self-contained CLI - no runtime dependencies - that shares the same scopes, wallet metering, and sandbox behavior as the REST API. Run it with npx or install it globally as deepsearch. Requires Node.js ≥ 20.9.
# Run without installing anything
npx @reloadapp/deepsearch search "Ada Lovelace" --sandbox
# Or install globally, then call `deepsearch`
npm install -g @reloadapp/deepsearch
deepsearch --helpAuthentication
The CLI resolves your key in order: --api-key › DEEPSEARCH_API_KEY › ~/.deepsearch/config.json (written by deepsearch login, stored with 0600 permissions). Every command takes --json, --sandbox, and --stream.
# Save a key once (written to ~/.deepsearch/config.json, 0600)
deepsearch login
# Name search, then a streaming dossier
deepsearch search "Ada Lovelace" --type name --sandbox
deepsearch dossier "Ada Lovelace" --stream
# Ask a follow-up, or queue an async job from a payload file
deepsearch chat "Ada Lovelace" "Summarize the public sources" --sandbox
deepsearch jobs create dossier --input @job.json --idempotency-key demo-1Commands
search <query>dossier <name>chat <name> <message…>jobs <create|list|get|events>statusloginconfig <get|set|path>Add --sandbox while integrating: it uses the published sandbox credential and returns deterministic Ada Lovelace fixtures and never consumes usage.
MCP integration
#DeepSearch also exposes a hosted MCP server for agents and IDEs that support Streamable HTTP. Use the same API key as a bearer token; scopes, expiry, rate limits, wallet metering, and onboarding errors behave the same as REST.
This server is published in the official MCP Registry as app.deepsearch/deepsearch. That entry names https://deepsearch.app/api/mcpas its remote, so a client can confirm from the registry's side that this is the endpoint we publish.
https://deepsearch.app/api/mcphttps://deepsearch.app/.well-known/oauth-protected-resource{
"mcpServers": {
"deepsearch": {
"type": "streamable-http",
"url": "https://deepsearch.app/api/mcp",
"headers": {
"Authorization": "Bearer ${DEEPSEARCH_API_KEY}"
}
}
}
}search_peoplebuild_dossierask_about_personPut DEEPSEARCH_API_KEYin your MCP client's local secret store or environment. Do not commit a plaintext key inside mcp.json.
Example prompts
What each tool is for, in the words a user would actually type. Names and addresses below are invented.
“A candidate applied with the address jordan.avery@example.com. Which public profiles match it?”
Resolves one identifier to ranked candidates with confidence scores, instead of pages to reconcile by hand.
“I meet Dana Whitfield of Northwind Robotics tomorrow. Build me a sourced profile of her public background.”
Correlates accounts across platforms into one profile, with every claim linked to the page it came from.
“Where does Dana Whitfield work now, and which public source says so?”
One grounded fact and its citation - cheaper and more direct than building the whole profile.
“Find whoever is behind the handle @dwhitfield, then give me their full public footprint.”
The usual chain: disambiguate first, then profile the candidate the user picked.
“A source tells me they were head of engineering at Northwind Robotics. Is that supported by public records?”
Verification against cited public sources, rather than taking a stated role at face value.
Sandbox mode
#Sandbox mode returns deterministic Ada Lovelace fixtures for search, dossier, and chat. Use the published key dsk_test_deepsearch without signing up. Sandbox requests do not consume usage and include usage.sandbox, metadata.sandbox, and X-DeepSearch-Sandbox.
The published key always returns fixtures. With your own scoped key, opt in using sandbox: true or the X-DeepSearch-Sandbox header. Other endpoints do not have sandbox fixtures.
curl https://deepsearch.app/api/v1/search \
-H "Authorization: Bearer dsk_test_deepsearch" \
-H "Content-Type: application/json" \
-d '{
"query": "Ada Lovelace",
"type": "name",
"format": "json"
}'Rate limits & billing
#API usage draws on the same weekly general-usage allowance as the app. Each request settles from the model tokens and paid tools it actually uses. Lighter models and cached results stretch the allowance further.
- Included usage is spent first, then non-expiring extra credits automatically. Extra credits do not unlock capabilities that are unavailable on the account's plan.
/dossierresults are cached and shared. A cache hit returns instantly and does not consume usage; only a fresh build is charged.- When included usage and extra credits are both exhausted, metered requests return
402 usage_exhausted. - Default per-key limits are
60/minfor search,30/minfor dossier, and60/minfor chat, plus an IP abuse ceiling. - Production keys can also carry an optional monthly compatibility budget. Budgeted keys return
402 api_key_budget_exceededbefore spending more usage.
Responses include percentageCharged, remainingPercent, resetAt, and source. Deprecated credit fields and headers remain for the v1 compatibility release.
Streaming & formats
#Endpoints stream text/event-stream by default - each chunk is a data: line carrying one JSON event. Pass "format": "json" in the body to receive a typed response once the run completes: search_result includes hits, dossier_result includes dossier, and chat_result includes answer.
statushitsectionsummarysourcestextrelatedsocial_account_foundaccount_updatedcluster_updatedevidenceavatar_updatedusagedoneerrorClients should ignore unknown event types - new ones may be added over time without a version bump.
Idempotency
#Send Idempotency-Key on retries. For format=json, DeepSearch stores and replays the completed JSON response when the same key and body are used again. If the same key is reused with a different body, the API returns 409 idempotency_conflict.
- For SSE requests, idempotency protects wallet spend but does not replay a prior event stream.
- Responses include
X-Request-Id,X-DeepSearch-Metered,X-DeepSearch-Credits-Charged, and standardRateLimit-*headers. - Request bodies are capped at 64KB; chat requests accept up to 20 messages.
Async jobs
#Queue long-running API work through POST /api/v1/jobs. Jobs support idempotent creation, background execution, polling, stored SSE replay, sandbox mode, and signed webhook delivery.
curl https://deepsearch.app/api/v1/jobs \
-H "Authorization: Bearer $DEEPSEARCH_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: demo-job-1" \
-d '{
"operation": "dossier",
"input": {
"person": { "name": "Ada Lovelace" },
"format": "json"
},
"sandbox": true
}'POST /api/v1/jobsCreate a queued background job.
GET /api/v1/jobsList the caller's recent jobs.
GET /api/v1/jobs/{id}Fetch status, errors, and final result.
GET /api/v1/jobs/{id}/eventsReplay stored Server-Sent Events.
Webhooks
#Webhooks notify your backend when background work finishes. Endpoints receive signed JSON with a stable event id, type, v1 API version, timestamp, and event data.
X-DeepSearch-Event: job.succeeded
X-DeepSearch-Delivery: evt_...
X-DeepSearch-Signature: t=1760000000,v1=<hmac_sha256>Verify X-DeepSearch-Signature by computing HMAC SHA-256 over {timestamp}.{raw_body} with the webhook secret shown once at creation time.
Analytics
#The developer console includes request charts, recorded outcomes, key breakdowns, cache hit rate, latency, MCP vs REST transport, errors, and request IDs. Charts cover up to 5,000 events; exports include up to 20,000. The selected window can be exported as CSV from the portal or from /api/developer/usage/export?windowDays=30.
Requests, percentage charged, usage sources, operations, and cache hit rate.
Recorded admission outcomes, blocked calls, errors, latency, and slowest requests.
API key breakdowns, request IDs, idempotency keys, and CSV export.
Safety
#DeepSearch is for public-footprint research only. Keep API keys server-side, use the narrowest key scopes that work for your integration, and preserve X-Request-Id in your logs for auditability.
- Do not scrape login-gated, private, or paywalled profiles.
- Do not collect breached contents, passwords, secrets, or credentials.
- Do not make credit, housing, employment, insurance, education, or similar eligibility decisions from API output.
- Surface sources and confidence so a human can verify important claims.
See terms and the checked-in acceptable-use guide for the complete policy.
Search
#/api/v1/searchsearch scopeSubmit an identifier and stream back ranked candidate matches (PersonHit objects) drawn from public sources. Each candidate carries a confidence score and descriptive tags so you can disambiguate before requesting a full dossier.
Body parameters
queryThe name, phone number, email address, or username to look up.
typeHow to interpret the query.
nameplatformsFor a username search, narrow discovery to supported focus platforms (e.g. instagram, x, linkedin). Ignored for other types.
formatsse streams Server-Sent Events as results arrive; json collects every event and returns one object.
ssesandboxReturn deterministic, unmetered fixtures for CI, demos, and parser development.
falseRequest
curl https://deepsearch.app/api/v1/search \
-H "Authorization: Bearer $DEEPSEARCH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "Ada Lovelace",
"type": "name",
"format": "json"
}'Response
{
"object": "search_result",
"request_id": "req_01HZY8M7YQ2C7W9F4X9J7Z1H3A",
"metadata": {
"api_version": "v1",
"operation": "search",
"request_id": "req_01HZY8M7YQ2C7W9F4X9J7Z1H3A",
"generated_at": "2026-06-19T12:00:00.000Z"
},
"usage": {
"metered": true,
"percentageCharged": 2,
"remainingPercent": 98,
"resetAt": "2026-07-01T00:00:00.000Z",
"source": "included",
"credits": 1,
"allowanceSource": "weekly"
},
"hits": [
{
"id": "ada-lovelace",
"name": "Ada Lovelace",
"headline": "Mathematician · London",
"initials": "AL",
"confidence": 82,
"location": "London, United Kingdom",
"tags": [
"3 social profiles",
"London"
]
}
],
"events": [
{
"type": "status",
"label": "Scanning public sources"
},
{
"type": "hit",
"hit": {
"id": "ada-lovelace",
"name": "Ada Lovelace",
"headline": "Mathematician · London",
"initials": "AL",
"confidence": 82,
"location": "London, United Kingdom",
"tags": [
"3 social profiles",
"London"
]
}
},
{
"type": "done"
}
]
}Standard search is Medium usage. Cached results and idempotent replays use no usage.
Dossier
#/api/v1/dossierdossier scopePass a candidate from /search (or a minimal person object) and stream a structured dossier - identity, contact, social accounts, locations, work, mentions and a written summary with cited sources. Results are cached: a shared cache hit returns instantly and consumes no usage.
Body parameters
personThe subject to profile. Only person.name is required; pass the full PersonHit from /search to focus on the exact candidate.
person.nameThe person's full name.
refreshBypass the shared cache and rebuild from scratch (this always meters).
falseformatsse to stream sections as they fill, or json for a single collected response.
ssesandboxReturn deterministic, unmetered fixtures for CI, demos, and parser development.
falseRequest
curl https://deepsearch.app/api/v1/dossier \
-H "Authorization: Bearer $DEEPSEARCH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"person": {
"name": "Ada Lovelace",
"headline": "Mathematician · London",
"confidence": 82,
"tags": [
"Computing pioneer"
]
},
"format": "json"
}'Response
{
"object": "dossier_result",
"request_id": "req_01HZY8N9M52JGQ7PC1X3TPEF5R",
"metadata": {
"api_version": "v1",
"operation": "dossier",
"request_id": "req_01HZY8N9M52JGQ7PC1X3TPEF5R",
"generated_at": "2026-06-19T12:00:00.000Z"
},
"usage": {
"metered": true,
"percentageCharged": 9,
"remainingPercent": 73,
"resetAt": "2026-07-01T00:00:00.000Z",
"source": "included",
"credits": 1,
"allowanceSource": "weekly",
"cached": false
},
"cached": false,
"dossier": {
"summary": "Ada Lovelace was a 19th-century mathematician widely regarded as the first computer programmer.",
"sections": {
"identity": {
"name": "Ada Lovelace",
"age": null
}
},
"sources": [
{
"id": "src-1",
"position": 1,
"url": "https://en.wikipedia.org/wiki/Ada_Lovelace",
"title": "Ada Lovelace",
"domain": "en.wikipedia.org"
}
]
},
"events": [
{
"type": "section",
"key": "identity",
"data": {
"name": "Ada Lovelace",
"age": null
}
},
{
"type": "summary",
"delta": "Ada Lovelace was a 19th-century mathematician "
},
{
"type": "summary",
"delta": "widely regarded as the first computer programmer."
},
{
"type": "sources",
"sources": [
{
"id": "src-1",
"position": 1,
"url": "https://en.wikipedia.org/wiki/Ada_Lovelace",
"title": "Ada Lovelace",
"domain": "en.wikipedia.org"
}
]
},
{
"type": "done"
}
]
}A fresh dossier is High usage and covers all nested work. Cached dossiers use no usage.
Chat
#/api/v1/chatchat scopeContinue a conversation about a subject. Send the running message history and DeepSearch streams a grounded answer plus suggested follow-up questions, drawing on the person's public footprint.
Body parameters
personThe subject of the conversation. person.name is required.
messagesThe conversation so far. Each message has a role (user or assistant) and content string. At least one message is required.
contextOptional extra grounding context (e.g. a prior dossier summary) to steer the answer.
formatsse to stream the answer token-by-token, or json for the collected response.
ssesandboxReturn deterministic, unmetered fixtures for CI, demos, and parser development.
falseRequest
curl https://deepsearch.app/api/v1/chat \
-H "Authorization: Bearer $DEEPSEARCH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"person": {
"name": "Ada Lovelace"
},
"messages": [
{
"role": "user",
"content": "Summarize her public footprint."
}
],
"format": "json"
}'Response
{
"object": "chat_result",
"request_id": "req_01HZY8P8V1TXZ6YXMJ56ATJZ1J",
"metadata": {
"api_version": "v1",
"operation": "chat",
"request_id": "req_01HZY8P8V1TXZ6YXMJ56ATJZ1J",
"generated_at": "2026-06-19T12:00:00.000Z"
},
"usage": {
"metered": true,
"percentageCharged": 1,
"remainingPercent": 72,
"resetAt": "2026-07-01T00:00:00.000Z",
"source": "included",
"credits": 1,
"allowanceSource": "weekly"
},
"answer": "Ada Lovelace is best known for her notes on Babbage's Analytical Engine.",
"related_questions": [
"What did she publish?",
"Who did she collaborate with?"
],
"events": [
{
"type": "text",
"delta": "Ada Lovelace is best known for "
},
{
"type": "text",
"delta": "her notes on Babbage's Analytical Engine."
},
{
"type": "related",
"questions": [
"What did she publish?",
"Who did she collaborate with?"
]
},
{
"type": "done"
}
]
}Chat settles from the model tokens and paid tools the request actually uses.
Reverse image
#/api/v1/reverse-imagesearch scopeSubmit an image URL and get candidate public pages, match provenance, and visually similar images. Provider candidates require verification; visual resemblance alone does not establish image reuse. Honest image-appearance matching - DeepSearch does NOT perform facial recognition and never identifies a person from their face. The image is re-hosted privately before it reaches the provider. Reverse-image lookup is Medium usage.
Body parameters
imageUrlAn https URL to the image to search. DeepSearch fetches and re-hosts it privately, then queries the reverse-image provider with a short-lived signed URL.
Request
curl https://deepsearch.app/api/v1/reverse-image \
-H "Authorization: Bearer $DEEPSEARCH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"imageUrl": "https://upload.wikimedia.org/wikipedia/commons/a/a4/Ada_Lovelace_portrait.jpg"
}'Response
{
"object": "reverse_image_result",
"request_id": "req_01HZY8Q2RVIMG9F4X9J7Z1H3AB",
"result": {
"provider": "serpapi-lens",
"matches": [
{
"url": "https://en.wikipedia.org/wiki/Ada_Lovelace",
"title": "Ada Lovelace - Wikipedia",
"sourceDomain": "en.wikipedia.org"
}
],
"similar": [
{
"imageUrl": "https://example.com/portrait-variant.jpg",
"sourceUrl": "https://example.com/article",
"sourceDomain": "example.com"
}
]
}
}Reverse-image lookup is Medium usage; idempotent replays use no usage.
Entity search
#/api/v1/entity/searchsearch scopeSubmit a company name and get ranked candidate companies (legal name, jurisdiction, status). Grounded in official registries and the public web. Pass a candidate to /entity/dossier for a full profile. Company lookup is Medium usage.
Body parameters
queryThe company name to look up.
Request
curl https://deepsearch.app/api/v1/entity/search \
-H "Authorization: Bearer $DEEPSEARCH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "Stripe"
}'Response
{
"object": "entity_search_result",
"request_id": "req_01HZY8R3ENTITYSRCH9F4X9J7Z1",
"companies": [
{
"kind": "company",
"id": "stripe-us-de",
"name": "Stripe",
"legalName": "Stripe, Inc.",
"headline": "Payments · San Francisco · ~8000 employees",
"initials": "ST",
"confidence": 92,
"jurisdiction": "us_de",
"status": "active",
"tags": [
"Payments",
"Private"
]
}
]
}Company lookup is Medium usage; idempotent replays use no usage.
Entity profile
#/api/v1/entity/dossierdossier scopePass a company from /entity/search (or a minimal {name}) and get a structured business profile - registration, status, executives, estimated financials, funding, locations, corporate structure, and a written summary with cited sources. Public business records only; financial figures are estimates; not an FCRA report. Cached profiles are free.
Body parameters
companyThe company to profile. Only company.name is required; pass the full hit from /entity/search to pin the exact entity.
company.nameThe company name.
refreshBypass the shared cache and rebuild (always meters).
falseRequest
curl https://deepsearch.app/api/v1/entity/dossier \
-H "Authorization: Bearer $DEEPSEARCH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"company": {
"name": "Stripe",
"jurisdiction": "us_de"
}
}'Response
{
"object": "entity_dossier_result",
"request_id": "req_01HZY8S4ENTITYDOSSIER9F4X9",
"cached": false,
"company": {
"entityId": "stripe-us-de",
"name": "Stripe",
"legalName": "Stripe, Inc.",
"status": "active",
"registration": {
"jurisdiction": "Delaware, US",
"entityType": "C Corporation",
"legalStatus": "Active"
},
"executives": [
{
"name": "Patrick Collison",
"title": "CEO"
}
],
"summary": "Stripe is a payments company headquartered in San Francisco… [1]"
}
}A fresh company profile is High usage and covers all nested work. Cached profiles use no usage.
VIN lookup
#/api/v1/vindossier scopeSubmit a 17-character VIN and get the decoded vehicle profile - year/make/model/trim, engine & drivetrain, body, assembly plant - plus open NHTSA recalls and crash-test safety ratings. Specs/recalls/safety are official NHTSA public data; title/accident history is included only where a history provider is configured. Public vehicle information only; not an FCRA report. Cached VINs are free.
Body parameters
vinThe 17-character Vehicle Identification Number (no I, O, or Q).
refreshBypass the shared cache and rebuild.
falseRequest
curl https://deepsearch.app/api/v1/vin \
-H "Authorization: Bearer $DEEPSEARCH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"vin": "1HGCM82633A004352"
}'Response
{
"object": "vin_result",
"request_id": "req_01HZY8T5VINLOOKUP9F4X9J7Z1",
"cached": false,
"vehicle": {
"vin": "1HGCM82633A004352",
"year": 2003,
"make": "HONDA",
"model": "Accord",
"headline": "2003 HONDA Accord EX · Sedan/Saloon",
"engine": {
"cylinders": "6",
"displacementL": "3",
"fuelType": "Gasoline"
},
"recalls": [],
"safety": {
"airbags": [
"Front (1st Row (Driver & Passenger))"
],
"features": [],
"ratings": []
},
"summary": "The 2003 Honda Accord is a midsize sedan… [1]"
}
}A paid fresh vehicle-history report is High usage and covers all nested work. Cached reports use no usage.
Errors
#Errors return the matching HTTP status and a JSON body of the shape { "error": { "code", "message" } }. The code is stable and safe to branch on.
400invalid_json400invalid_request401missing_api_key401invalid_api_key401expired_api_key402not_subscribed402usage_exhausted402no_coins403missing_scope409idempotency_conflict413request_too_large404developer_api_disabled429rate_limited503spend_cap_reached