Skip to content

API Reference

This reference covers all available endpoints for the GraphADV enrichment API v2.

Terminal window
export BASE_URL="https://api.graphadv.com"
export GRAPHADV_API_KEY="YOUR_API_KEY"

All requests require the X-Api-Key header:

X-Api-Key: YOUR_API_KEY

These recipes show how to chain API calls for common GTM use cases.

Research a target company with leadership and buying signals in a single request.

Terminal window
# Full research: company + leadership + signals (9 units)
curl -X POST "$BASE_URL/v2/enrich/company" \
-H "X-Api-Key: $GRAPHADV_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domain": "anthropic.com",
"include_leadership": true,
"include_signals": true
}'

Then poll for results:

Terminal window
# Check task status
curl "$BASE_URL/v2/tasks/$TASK_ID" -H "X-Api-Key: $GRAPHADV_API_KEY"
# Get full results when complete
curl "$BASE_URL/v2/tasks/$TASK_ID/result" -H "X-Api-Key: $GRAPHADV_API_KEY"

Find companies matching your ICP, then enrich with leadership contacts.

import requests
API_KEY = "your_api_key"
BASE_URL = "https://api.graphadv.com"
# Step 1: Search for target companies
companies = requests.get(
f"{BASE_URL}/v2/companies",
headers={"X-Api-Key": API_KEY},
params={
"industry": "Financial Services",
"state": "CA",
"in_formadv": True,
"limit": 50
}
).json()["companies"]
# Step 2: Enrich with leadership (5 units per company)
domains = [c["domain"] for c in companies if c.get("domain")]
task = requests.post(
f"{BASE_URL}/v2/search/leadership",
headers={"X-Api-Key": API_KEY, "Content-Type": "application/json"},
json={"domains": domains[:10], "max_per_company": 5}
).json()
print(f"Task ID: {task['task_id']}")
print(f"Units charged: {task['units_charged']}")

Scan your target accounts for recent news signals (funding, hiring, product launches).

# Get your TAL companies
tal = requests.get(
f"{BASE_URL}/v2/clients/me/tal/companies",
headers={"X-Api-Key": API_KEY},
params={"limit": 50}
).json()
domains = [c["domain"] for c in tal["companies"]]
# Run signal discovery (3 units per company)
task = requests.post(
f"{BASE_URL}/v2/discover/signals",
headers={"X-Api-Key": API_KEY, "Content-Type": "application/json"},
json={
"domains": domains,
"max_articles_per_company": 10
}
).json()
# Poll for results, then retrieve signals
# GET /v2/companies/{domain}?include=signals

Validate and enrich a list of contacts before adding to your sequences.

# Enrich contacts by email
emails = ["ceo@acme.com", "cfo@acme.com", "cto@acme.com"]
for email in emails:
task = requests.post(
f"{BASE_URL}/v2/enrich/person",
headers={"X-Api-Key": API_KEY, "Content-Type": "application/json"},
json={"email": email}
).json()
print(f"Enriching {email}: {task['task_id']}")
# After tasks complete, fetch enriched data
for email in emails:
# Hash the email to get the person
person = requests.get(
f"{BASE_URL}/v2/persons",
headers={"X-Api-Key": API_KEY},
params={"query": email, "include": "contact,profile"}
).json()

Add companies to your TAL and enrich them all at once.

# Step 1: Add companies to TAL
domains = ["stripe.com", "notion.so", "figma.com", "linear.app"]
requests.post(
f"{BASE_URL}/v2/clients/me/tal/companies",
headers={"X-Api-Key": API_KEY, "Content-Type": "application/json"},
json={"domains": domains, "source": "api_import"}
)
# Step 2: Enrich all TAL companies that need it
task = requests.post(
f"{BASE_URL}/v2/clients/me/tal/enrich",
headers={"X-Api-Key": API_KEY, "Content-Type": "application/json"},
json={
"max_age_days": 30, # Re-enrich if data older than 30 days
"force": False
}
).json()
print(f"Enriching {task['companies_to_enrich']} companies")
print(f"Skipping {task['companies_skipped']} (already fresh)")

Companies are the primary entity in GraphADV. Each company has firmographic data, LinkedIn information, and enrichment metadata.

Retrieve a single company by domain.

GET /v2/companies/{domain}

Cost: Free (rate-limited)

Query Parameters:

ParameterTypeDescription
includestringComma-separated field groups: formadv, leadership, signals, all
include_provenancebooleanInclude data source attribution
Terminal window
curl "$BASE_URL/v2/companies/stripe.com" \
-H "X-Api-Key: $GRAPHADV_API_KEY"
# With optional fields
curl "$BASE_URL/v2/companies/stripe.com?include=leadership,signals" \
-H "X-Api-Key: $GRAPHADV_API_KEY"

Response:

{
"domain": "stripe.com",
"name": "Stripe",
"linkedin_url": "https://linkedin.com/company/stripe",
"industry": "Financial Services",
"employee_count": 8000,
"employee_range": "5001-10000",
"headquarters_city": "San Francisco",
"headquarters_state": "CA",
"headquarters_country": "USA",
"enrichment_status": "complete",
"enriched_at": "2026-01-15T10:30:00Z"
}

Search and filter companies.

GET /v2/companies

Cost: Free (rate-limited)

Query Parameters:

ParameterTypeDescription
querystringSearch by name or domain
statestringFilter by headquarters state
industrystringFilter by industry
in_formadvbooleanFilter by FormADV presence
enrichment_statusstringFilter by enrichment status
includestringField groups: formadv, leadership, signals, all
limitnumberMax results (default: 50, max: 200)
offsetnumberPagination offset
Terminal window
curl "$BASE_URL/v2/companies?query=fintech&state=CA&limit=10" \
-H "X-Api-Key: $GRAPHADV_API_KEY"

Retrieve persons associated with a company.

GET /v2/companies/{domain}/persons

Cost: Free (rate-limited)

Query Parameters:

ParameterTypeDescription
includestringField groups: contact, profile, formadv, history, all
limitnumberMax results (default: 50, max: 200)
Terminal window
curl "$BASE_URL/v2/companies/stripe.com/persons?include=contact" \
-H "X-Api-Key: $GRAPHADV_API_KEY"

Get change history for a company (audit trail).

GET /v2/companies/{domain}/history

Cost: Free (rate-limited)

Query Parameters:

ParameterTypeDescription
limitnumberMax events (default: 50, max: 200)
offsetnumberPagination offset
fieldstringFilter to specific field (e.g., “employee_count”)
sincestringISO timestamp - only changes after this time
Terminal window
curl "$BASE_URL/v2/companies/stripe.com/history?field=employee_count" \
-H "X-Api-Key: $GRAPHADV_API_KEY"

Persons are individuals with contact information, employment history, and enrichment data.

Search and filter persons in the database.

GET /v2/persons

Cost: Free (rate-limited)

Query Parameters:

ParameterTypeDescription
querystringSearch by name
company_domainstringFilter by company domain
titlestringFilter by title (contains)
senioritystringFilter by seniority level (executive, director, manager, etc.)
includestringField groups: contact, profile, formadv, history, all
limitnumberMax results (default: 50, max: 200)
offsetnumberPagination offset
Terminal window
# Search by name
curl "$BASE_URL/v2/persons?query=john&limit=10" \
-H "X-Api-Key: $GRAPHADV_API_KEY"
# Filter by company
curl "$BASE_URL/v2/persons?company_domain=stripe.com" \
-H "X-Api-Key: $GRAPHADV_API_KEY"
# Filter by title and seniority
curl "$BASE_URL/v2/persons?title=ceo&seniority=executive" \
-H "X-Api-Key: $GRAPHADV_API_KEY"

Response:

{
"persons": [
{
"email_hash": "a1b2c3d4e5f6g7h8",
"email": "john@acme.com",
"full_name": "John Smith",
"title": "CEO",
"seniority": "executive",
"company_domain": "acme.com",
"company_name": "Acme Corp"
}
],
"total": 1,
"limit": 50,
"offset": 0
}

Retrieve a person by email hash.

GET /v2/persons/{email_hash}

Cost: Free (rate-limited)

Email Hash Format: The API uses email hashes (first 16 characters of SHA256 of the lowercased email) as identifiers for privacy.

Query Parameters:

ParameterTypeDescription
includestringField groups: contact, profile, formadv, history, all
include_provenancebooleanInclude data source attribution
Terminal window
# Calculate email hash
EMAIL="patrick@stripe.com"
EMAIL_HASH=$(echo -n "$EMAIL" | tr '[:upper:]' '[:lower:]' | shasum -a 256 | cut -c1-16)
curl "$BASE_URL/v2/persons/$EMAIL_HASH" \
-H "X-Api-Key: $GRAPHADV_API_KEY"

Response:

{
"email_hash": "a1b2c3d4e5f6g7h8",
"email": "patrick@stripe.com",
"first_name": "Patrick",
"last_name": "Collison",
"full_name": "Patrick Collison",
"title": "CEO",
"seniority": "executive",
"department": "executive",
"company_domain": "stripe.com",
"company_name": "Stripe",
"linkedin_url": "https://linkedin.com/in/patrickcollison",
"enrichment_status": "complete",
"enriched_at": "2026-01-15T10:35:00Z"
}

Get change history for a person (audit trail).

GET /v2/persons/{email_hash}/history

Cost: Free (rate-limited)

Query Parameters:

ParameterTypeDescription
limitnumberMax events (default: 50, max: 200)
offsetnumberPagination offset
fieldstringFilter to specific field (e.g., “title”)
sincestringISO timestamp - only changes after this time

Enrichment endpoints consume units and run asynchronously. Submit a request, receive a task ID, then poll for results.

Enrich a company with firmographics, LinkedIn data, and optionally leadership/signals.

POST /v2/enrich/company

Cost:

  • Base enrichment: 1 unit
  • With include_leadership: +5 units (6 total)
  • With include_signals: +3 units (4 total)
  • With both: +8 units (9 total)

Request Body:

FieldTypeRequiredDescription
domainstringYesCompany domain (e.g., “stripe.com”)
include_leadershipbooleanNoAlso discover leadership team (adds 5 units)
include_signalsbooleanNoAlso discover buying signals from news (adds 3 units)
forcebooleanNoRe-enrich even if fresh data exists
callback_urlstringNoWebhook URL for completion notification
Terminal window
# Company only (1 unit)
curl -X POST "$BASE_URL/v2/enrich/company" \
-H "X-Api-Key: $GRAPHADV_API_KEY" \
-H "Content-Type: application/json" \
-d '{"domain": "stripe.com"}'
# Company + Signals (4 units)
curl -X POST "$BASE_URL/v2/enrich/company" \
-H "X-Api-Key: $GRAPHADV_API_KEY" \
-H "Content-Type: application/json" \
-d '{"domain": "stripe.com", "include_signals": true}'
# Company + Leadership (6 units)
curl -X POST "$BASE_URL/v2/enrich/company" \
-H "X-Api-Key: $GRAPHADV_API_KEY" \
-H "Content-Type: application/json" \
-d '{"domain": "stripe.com", "include_leadership": true}'

Response:

{
"task_id": "task_abc123",
"status": "queued",
"message": "Enrichment queued for stripe.com",
"units_charged": 6,
"units_remaining": 994
}

Enrich a person with verified email, LinkedIn profile, and employment history.

POST /v2/enrich/person

Cost: 1 unit

Request Body (at least one identifier required):

FieldTypeDescription
emailstringPerson’s email address
linkedin_urlstringPerson’s LinkedIn profile URL
full_namestringFull name (requires company_domain)
company_domainstringCompany domain (requires full_name)
forcebooleanRe-enrich even if fresh data exists
Terminal window
# By email
curl -X POST "$BASE_URL/v2/enrich/person" \
-H "X-Api-Key: $GRAPHADV_API_KEY" \
-H "Content-Type: application/json" \
-d '{"email": "patrick@stripe.com"}'
# By LinkedIn URL
curl -X POST "$BASE_URL/v2/enrich/person" \
-H "X-Api-Key: $GRAPHADV_API_KEY" \
-H "Content-Type: application/json" \
-d '{"linkedin_url": "https://linkedin.com/in/patrickcollison"}'
# By name and company
curl -X POST "$BASE_URL/v2/enrich/person" \
-H "X-Api-Key: $GRAPHADV_API_KEY" \
-H "Content-Type: application/json" \
-d '{"full_name": "Patrick Collison", "company_domain": "stripe.com"}'

Enrich multiple companies and/or persons in a single request.

POST /v2/enrich/batch

Cost: 1 unit per domain + 1 unit per email

Request Body:

FieldTypeDescription
domainsstring[]List of company domains
emailsstring[]List of person emails
Terminal window
curl -X POST "$BASE_URL/v2/enrich/batch" \
-H "X-Api-Key: $GRAPHADV_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domains": ["stripe.com", "notion.so"],
"emails": ["patrick@stripe.com"]
}'

Discover leadership teams at target companies (founders, C-suite, VPs).

POST /v2/search/leadership

Cost: 5 units per company

Request Body:

FieldTypeRequiredDescription
domainsstring[]YesCompany domains to research (max 10)
max_per_companynumberNoMax people per company (1-10, default: 5)
enrich_via_linkedinbooleanNoDeep LinkedIn enrichment (default: true)
callback_urlstringNoWebhook URL for completion notification
Terminal window
# Single company (5 units)
curl -X POST "$BASE_URL/v2/search/leadership" \
-H "X-Api-Key: $GRAPHADV_API_KEY" \
-H "Content-Type: application/json" \
-d '{"domains": ["stripe.com"]}'
# Multiple companies (10 units)
curl -X POST "$BASE_URL/v2/search/leadership" \
-H "X-Api-Key: $GRAPHADV_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domains": ["stripe.com", "notion.so"],
"max_per_company": 5
}'

Response:

{
"task_id": "task_xyz789",
"status": "queued",
"message": "Leadership discovery queued for 2 companies",
"units_charged": 10,
"units_remaining": 990
}

Automatically discover buying signals from news and public sources for target companies.

POST /v2/discover/signals

Cost: 3 units per company

Signal Types Detected:

Signal TypeDescription
FundingInvestment rounds, fundraising announcements
ExpansionOffice openings, market entry, geographic growth
Leadership ChangeExecutive moves, promotions, departures
Product LaunchNew products, features, releases
PartnershipStrategic partnerships, integrations
AcquisitionM&A activity, company purchases
HiringKey hires, team expansion signals
AwardIndustry recognition, rankings
RegulatoryCompliance updates, certifications
TechnologyTech stack changes, platform migrations

Request Body:

FieldTypeRequiredDescription
domainsstring[]YesCompany domains to monitor (max 50)
max_articles_per_companynumberNoMax articles to analyze per company (1-25, default: 10)
callback_urlstringNoWebhook URL for completion notification
Terminal window
# Discover signals for multiple companies (6 units)
curl -X POST "$BASE_URL/v2/discover/signals" \
-H "X-Api-Key: $GRAPHADV_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domains": ["anthropic.com", "openai.com"],
"max_articles_per_company": 10
}'

Response:

{
"task_id": "task_sig123",
"status": "queued",
"message": "Signal discovery queued for 2 companies",
"units_charged": 6,
"units_remaining": 994
}

All enrichment operations are asynchronous. Poll task endpoints to check status and retrieve results.

GET /v2/tasks

Query Parameters:

ParameterTypeDescription
statusstringFilter by status (queued, running, completed, failed)
limitnumberMax results (1-100, default: 20)
Terminal window
curl "$BASE_URL/v2/tasks?status=completed&limit=10" \
-H "X-Api-Key: $GRAPHADV_API_KEY"
GET /v2/tasks/{task_id}

Response:

{
"id": "task_abc123",
"task_type": "enrich_company_with_leadership",
"status": "completed",
"progress": 1.0,
"created_at": "2026-01-15T10:30:00Z",
"completed_at": "2026-01-15T10:32:15Z"
}

Status values: queued, running, completed, failed

GET /v2/tasks/{task_id}/result

Returns the enriched data once the task is complete.

Response (Leadership Search):

{
"id": "task_abc123",
"task_type": "leadership_search",
"status": "completed",
"input_data": {
"domains": ["stripe.com"],
"max_per_company": 5
},
"output_data": {
"leadership": [
{
"domain": "stripe.com",
"contacts": [
{
"full_name": "Patrick Collison",
"email": "patrick@stripe.com",
"title": "CEO",
"linkedin_url": "https://linkedin.com/in/patrickcollison",
"seniority": "executive"
}
]
}
]
}
}

Manage lists of target companies for ABM campaigns and sales outreach.

GET /v2/clients/{client_id}/tal/companies

Cost: Free

POST /v2/clients/{client_id}/tal/companies

Cost: Free

Request Body:

FieldTypeDescription
domainsstring[]Company domains to add
sourcestringSource tag (e.g., “manual”, “import”)
Terminal window
curl -X POST "$BASE_URL/v2/clients/my-client-id/tal/companies" \
-H "X-Api-Key: $GRAPHADV_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"domains": ["stripe.com", "notion.so", "figma.com"],
"source": "manual"
}'
DELETE /v2/clients/{client_id}/tal/companies

Request Body:

{
"domains": ["acme.com"]
}
POST /v2/clients/{client_id}/tal/enrich

Cost: 1 unit per company enriched (skips fresh companies)

Request Body:

FieldTypeDescription
forcebooleanRe-enrich even if fresh data exists
max_age_daysnumberConsider data stale after N days
dry_runbooleanPreview what would be enriched without charging

Check your current plan and unit balance.

GET /v2/usage

Response:

{
"plan": "growth",
"units_remaining": 847,
"units_used_this_period": 153,
"period_started_at": "2026-01-01T00:00:00Z",
"period_ends_at": "2026-01-31T00:00:00Z",
"overage_allowed": false
}

Get platform statistics.

GET /v2/stats

Response:

{
"companies": {
"total": 25000,
"enriched": 20000,
"from_formadv": 24000
},
"persons": {
"total": 85000,
"enriched": 60000,
"from_formadv": 80000
}
}

GraphADV returns standard HTTP status codes:

CodeDescription
200Success
400Bad request (invalid parameters)
401Unauthorized (missing API key)
402Payment required (insufficient units)
403Forbidden (trial expired)
404Not found
422Unprocessable entity (validation failed)
429Rate limit exceeded
500Server error

Error Response:

{
"detail": "Insufficient credits. Required: 5, Available: 2"
}