API reference
Open console

Getting started

DeepSearch's public API is a JSON interface to the same public-footprint engine used across the product. Start with the example below, use a server-side key for live requests, and choose JSON or streaming where supported. Try the sandbox first without an account.

Your first request

#

DeepSearch's API base URL is:

https://deepsearch.app/api/v1

Send requests to individual endpoints such as /api/v1/search. The base URL is a discovery index, not a POST endpoint.

Run a free sandbox search
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"
      }'
Open playground

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.

Authorization header
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.

searchSearch
dossierDossier
chatChat
searchReverse image
searchEntity search
dossierEntity profile
dossierVIN lookup

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.

TypeScript SDK
import { 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.

Node example
examples/node-cli
Next.js starter
examples/nextjs-starter
MCP agent
examples/mcp-agent

DeepSearch developer resources

#

Machine-readable contracts, discovery files, and installable packages all live at stable URLs under https://deepsearch.app.

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.

Install
# Run without installing anything
npx @reloadapp/deepsearch search "Ada Lovelace" --sandbox

# Or install globally, then call `deepsearch`
npm install -g @reloadapp/deepsearch
deepsearch --help

Authentication

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.

Common commands
# 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-1

Commands

Command
Use
search <query>
Find people by name, phone, email, or username.
dossier <name>
Build or replay a public-footprint dossier.
chat <name> <message…>
Ask a follow-up question about a person.
jobs <create|list|get|events>
Queue and inspect async background jobs.
status
Show developer API availability (no key required).
login
Save an API key and base URL to the CLI config.
config <get|set|path>
Inspect or edit stored CLI config.

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.

streamable-httphttps://deepsearch.app/api/mcp
oauthhttps://deepsearch.app/.well-known/oauth-protected-resource
Open setup panel
{
  "mcpServers": {
    "deepsearch": {
      "type": "streamable-http",
      "url": "https://deepsearch.app/api/mcp",
      "headers": {
        "Authorization": "Bearer ${DEEPSEARCH_API_KEY}"
      }
    }
  }
}
Tool
Use
search_people
Search people
build_dossier
Build dossier
ask_about_person
Ask about a person

Put 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?

search_people

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.

build_dossier

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?

ask_about_person

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.

search_peoplebuild_dossier

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?

build_dossierask_about_person

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.

Sandbox request
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.
  • /dossier results 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/min for search, 30/min for dossier, and 60/min for chat, plus an IP abuse ceiling.
  • Production keys can also carry an optional monthly compatibility budget. Budgeted keys return 402 api_key_budget_exceeded before 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.

Event
Meaning
status
A human-readable progress label.
hit
A candidate person match (search).
section
A filled dossier section (dossier).
summary
A streamed chunk of the written summary (dossier).
sources
The cited sources backing the result (dossier).
text
A streamed chunk of the chat answer (chat).
related
Suggested follow-up questions (chat).
social_account_found
Additive social-discovery evidence (search).
account_updated
Updated social-account evidence (search).
cluster_updated
Updated candidate-cluster evidence (search).
evidence
A provenance claim backing an account or cluster (search).
avatar_updated
A profile-photo candidate was verified or updated (search).
usage
The authoritative actual-cost settlement and remaining-usage snapshot.
done
The stream completed; partial: true if cut short.
error
A fatal error occurred mid-stream.

Clients 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 standard RateLimit-* 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.

Create job
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/jobs

Create a queued background job.

GET /api/v1/jobs

List the caller's recent jobs.

GET /api/v1/jobs/{id}

Fetch status, errors, and final result.

GET /api/v1/jobs/{id}/events

Replay 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.

job.succeededjob.failed
Webhook headers
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.

Usage

Requests, percentage charged, usage sources, operations, and cache hit rate.

Reliability

Recorded admission outcomes, blocked calls, errors, latency, and slowest requests.

Audit

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.

Dossier

#
POST/api/v1/dossierdossier scope

Pass 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.

JSON / SSE · Sandbox availableTry in playground

Body parameters

person
object· required

The subject to profile. Only person.name is required; pass the full PersonHit from /search to focus on the exact candidate.

person.name
string· required

The person's full name.

refresh
boolean· optional

Bypass the shared cache and rebuild from scratch (this always meters).

default: false
format
enum· optional

sse to stream sections as they fill, or json for a single collected response.

ssejsondefault: sse
sandbox
boolean· optional

Return deterministic, unmetered fixtures for CI, demos, and parser development.

default: false

Request

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

200 · application/json
{
  "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

#
POST/api/v1/chatchat scope

Continue 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.

JSON / SSE · Sandbox availableTry in playground

Body parameters

person
object· required

The subject of the conversation. person.name is required.

messages
Message[]· required

The conversation so far. Each message has a role (user or assistant) and content string. At least one message is required.

context
string· optional

Optional extra grounding context (e.g. a prior dossier summary) to steer the answer.

format
enum· optional

sse to stream the answer token-by-token, or json for the collected response.

ssejsondefault: sse
sandbox
boolean· optional

Return deterministic, unmetered fixtures for CI, demos, and parser development.

default: false

Request

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

200 · application/json
{
  "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

#
POST/api/v1/reverse-imagesearch scope

Submit 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.

JSON · Live requests onlyTry in playground

Body parameters

imageUrl
string· required

An 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

200 · application/json
{
  "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 profile

#
POST/api/v1/entity/dossierdossier scope

Pass 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.

JSON · Live requests onlyTry in playground

Body parameters

company
object· required

The company to profile. Only company.name is required; pass the full hit from /entity/search to pin the exact entity.

company.name
string· required

The company name.

refresh
boolean· optional

Bypass the shared cache and rebuild (always meters).

default: false

Request

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

200 · application/json
{
  "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

#
POST/api/v1/vindossier scope

Submit 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.

JSON · Live requests onlyTry in playground

Body parameters

vin
string· required

The 17-character Vehicle Identification Number (no I, O, or Q).

refresh
boolean· optional

Bypass the shared cache and rebuild.

default: false

Request

curl https://deepsearch.app/api/v1/vin \
  -H "Authorization: Bearer $DEEPSEARCH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
        "vin": "1HGCM82633A004352"
      }'

Response

200 · application/json
{
  "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.

Status
Code
Meaning
400
invalid_json
The request body was not valid JSON.
400
invalid_request
The body failed validation (a field is missing or malformed).
401
missing_api_key
No Authorization: Bearer <key> header was sent. Body carries an onboarding url.
401
invalid_api_key
The API key is unknown, malformed, or revoked.
401
expired_api_key
The key is valid but past its configured expiry date.
402
not_subscribed
The account has no active subscription. Body carries a url to subscribe.
402
usage_exhausted
Included usage and extra credits are exhausted. Body carries a url to add credits.
402
no_coins
Deprecated v1 alias for an exhausted extra-credit balance.
403
missing_scope
The key is valid but lacks the scope this endpoint needs.
409
idempotency_conflict
The Idempotency-Key was reused with a different request body.
413
request_too_large
The JSON body is larger than the API accepts.
404
developer_api_disabled
The Developer API is not enabled for this deployment.
429
rate_limited
Too many requests from this API key or IP. Retry after the reset time.
503
spend_cap_reached
A temporary service-wide spend cap was hit. Retry later.

Ready to build?

Create a key and try every endpoint live in the playground.

Create an API key