SavvyIQ

Getting started

Quickstart

Every request needs an apikey header. The base URL is https://api.savvyiq.ai.

API key

  1. Sign up or log in
  2. Open API keys in the dashboard and copy your key
# API key format:
S6yS02QKbzUyR4Uyihut2f7qNf2bJBLZQ

1. Resolve a name

Resolution runs real research, so it is asynchronous: the kickoff returns a run_id immediately and the result arrives one to five minutes later. Add location to narrow an ambiguous name and context to say which company you mean. "include": "basis" asks for per-field citations.

curl -X POST 'https://api.savvyiq.ai/v3/entity-resolution/async' \
-H 'apikey: YOUR_API_KEY' \
-H 'content-type: application/json' \
-d '{"name": "Datadog", "location": "New York, NY", "include": "basis"}'
{
  "status": "pending",
  "run_id": "run_344tSxhAVACWbuENINJ9D"
}

2. Poll for the result

Poll with the run_id. 202 means still running, 200 means finished. Repeat include=basis here: the kickoff records the provenance, the poll asks for it in the body. Polls are free and limited to 100 per minute; every 10 seconds is plenty. To skip polling, pass webhook_url on the kickoff instead and the result is delivered to you. See Webhooks.

curl -G 'https://api.savvyiq.ai/v3/runs/run_344tSxhAVACWbuENINJ9D' \
--data-urlencode 'include=basis' \
-H 'apikey: YOUR_API_KEY'

A matched result, trimmed from the reference capture:

{
  "run_id": "run_344tSxhAVACWbuENINJ9D",
  "status": "matched",
  "match_confidence": 100,
  "type": "business",
  "subtype": "incorporated_entity",
  "entity": {
    "id": "siq_33d67jj0wJESjEdFHMhuQ",
    "display_name": "Datadog",
    "legal_name": "DATADOG, INC.",
    "status": "active",
    "website": "https://www.datadoghq.com/",
    "primary_legal_entity": {
      "id": "le_2Zp3Yy6S7O6Btccq56WOH",
      "jurisdiction": "US-DE",
      "registration_authority": { "name": "Division of Corporations, Department of State" }
    },
    "identifiers": [
      { "type": "registration_id", "value": "4832851", "jurisdiction": "US-DE" },
      { "type": "cik", "value": "0001561550" },
      { "type": "lei", "value": "549300F6JNO0KRPO1K63" }
    ]
  },
  "candidate": null,
  "factors": [
    { "type": "strength", "code": "registry_identifier_anchored", "impact": "Safe to use for deterministic record matching and deduplication." }
  ],
  "basis": [
    { "field": "legal_name", "citations": [ { "url": "https://datadoghq.com", "source_type": "public_profile", "authority_tier": 2 } ] }
  ]
}

What to read:

  • status: "matched" and a non-null entity: a verified record. candidate is populated instead when we could not commit to one. See Understanding API responses.
  • entity.id: the stable siq_ ID. Store it; it is the key to every other endpoint.
  • primary_legal_entity: the government registration the record is anchored to.
  • basis[]: per-field citations, present because you asked for them.

3. Read the record

Fetch the full record by siq_ ID: firmographics, industry codes, operational presence, social profiles. This endpoint never blocks. If the record has not been enriched yet, enrichment.status says building and the build starts in the background; poll until it is complete.

curl 'https://api.savvyiq.ai/v3/entities/siq_33d67jj0wJESjEdFHMhuQ' \
-H 'apikey: YOUR_API_KEY'
{
  "status": "matched",
  "merged_into": null,
  "entity": {
    "id": "siq_33d67jj0wJESjEdFHMhuQ",
    "display_name": "Datadog",
    "legal_name": "DATADOG, INC.",
    "attributes": { "employee_range": "1K-5K", "revenue_range": "$1B-$10B", "is_public": true, "stock_ticker": "DDOG" },
    "industry": {
      "schemes": {
        "naics_2022": [ { "code": "513210", "label": "Software Publishers", "is_primary": true, "confidence": 95 } ],
        "sic": [ { "code": "7372", "label": "Prepackaged Software", "is_primary": true, "confidence": 95 } ]
      }
    },
    "facets": { "sector": "public", "legal_form": "corporation" },
    "...": "..."
  },
  "enrichment": { "status": "complete", "updated_at": "2026-07-31T19:22:05.042Z" }
}

Starting from a domain

Domain lookups return the operating entity and what we know about the domain itself. A domain we already hold answers in seconds; a new one returns status: "building" and completes in a few minutes. domain accepts a bare domain, a full URL, or an email address.

curl 'https://api.savvyiq.ai/v3/domain-intelligence?domain=datadoghq.com' \
  -H 'apikey: YOUR_API_KEY'
{
  "domain": "datadoghq.com",
  "status": "complete",
  "data": {
    "status": "matched",
    "confidence": 98,
    "entity": { "id": "siq_33GtdRpeJrG8n7orm8iI2", "display_name": "Datadog", "legal_name": "DATADOG, INC." },
    "domain_intelligence": { "tranco_rank": 739, "domain_context": { "domain_type": "corporate_website", "domain_relationship": "direct_owner" } }
  }
}

Complete workflow

const API = 'https://api.savvyiq.ai';
const headers = { apikey: 'YOUR_API_KEY' };

async function resolve(name, location) {
const kick = await fetch(`${API}/v3/entity-resolution/async`, {
  method: 'POST',
  headers: { ...headers, 'content-type': 'application/json' },
  body: JSON.stringify({ name, location, include: 'basis' }),
});
const { run_id } = await kick.json();
while (true) {
  const res = await fetch(`${API}/v3/runs/${run_id}?include=basis`, { headers });
  if (res.status === 200) return res.json();
  await new Promise((r) => setTimeout(r, 10_000));
}
}

const result = await resolve('Datadog', 'New York, NY');
if (!result.entity) throw new Error(`No verified entity: ${result.status}`);
const record = await (await fetch(`${API}/v3/entities/${result.entity.id}`, { headers })).json();
console.log(record.entity.legal_name, record.entity.industry.schemes.naics_2022[0].code);

Errors

StatusMeaning
400A parameter is missing or malformed (for example name under 2 characters, or an le_ ID on /v3/entities/{id})
401Missing or invalid API key
402Insufficient credits
403 no_pricing_configuredThe account is not enabled for v3. Contact us and we will switch it on
404Unknown run_id or entity ID
429Rate limit. See Rate limits

Next steps