API Reference

Sprouts Data & Enrichment
API Documentation

Search Sprouts' company & people database and reveal verified contact information. Two REST endpoints, one consistent authentication model, and copy-ready cURL + JSON examples throughout.

API 01
Sprouts Data API
Search accounts (companies) and contacts (people) with a flexible, filter-based query.
API 02
Contact Enrichment API
Reveal a contact's work email and/or phone number from a LinkedIn profile URL.
Base URL   https://ml.sprouts.ai/utility/
Protocol   HTTPS · JSON over POST
Rate limit   60 requests per 60 seconds
sprouts.ai
Version 1.0

Conventions

Both APIs are JSON-over-HTTPS and use POST, authenticating with request headers. Throughout, replace the placeholders <YOUR_API_SECRET>, <YOUR_LOGIN_EMAIL>, and <YOUR_CUSTOMER_ID> with your own credentials.

In this document
  1. Sprouts Data API — Accounts & Contacts Search the database
  2. Account filters Firmographics, tech, funding & more
  3. Contact filters Role, seniority, activity & history
  4. Response & pagination Result shape and paging
  5. Contact Enrichment API Reveal email & phone
Authentication placeholders. No real credentials appear here. Substitute the values issued to your organization wherever you see a <YOUR_…> placeholder, and keep your API secret private.

Sprouts Data API

Search Sprouts' company and people database for accounts (companies) and contacts (people). A single endpoint serves both — switch with the request_type field.

POST
https://ml.sprouts.ai/utility/sproutsdata
Content-Type   application/jsonMethod   POSTAuth   Header credentials

1.1Authentication

Every request must include these headers:

Header Description
X-API-SECRET Your API secret.
X-Login-Email The login email of the account making the request.
X-Customer-ID Your customer ID.

1.2Request body

JSON
{
  "request_type": "Account",        // "Account" or "Contact" — required
  "filters": { /* flat filter object, see below */ },
  "page": 1,                        // 1-indexed page number (default 1)
  "page_size": 10,                  // results per page (default 10, max 100)
  "contacts_per_account": 5,        // Contact search only — max contacts per account
  "account_type": "net_new"         // Account search only — "net_new", "saved", or omit for both
}
Field Type Required Default Description
request_type string yes "Account" or "Contact".
filters object no {} Filters to apply (logical AND).
page integer no 1 1-indexed page number.
page_size integer no 10 Results per page (1–100).
contacts_per_account integer no Contact only — caps contacts per account. Max 20.
account_type string no Account only — "net_new" or "saved". Values are case-insensitive. Omit it (or send null / "") to search both.
contact_type string no Contact only — "net_new" or "saved". Values are case-insensitive. Omit it (or send null / "") to search both.
Search type. account_type belongs to an Account search and contact_type to a Contact search; each accepts "NET_NEW" or "SAVED". Sending the field that doesn't match request_type, or a value outside that pair, returns 422 with detail in the array form.

1.3The filters object

A flat object: each key is a field name, each value the constraint. All filters must match (logical AND); within a list-valued filter, any value may match (logical OR).

JSON
{
  "request_type": "Account",
  "filters": {
    "industry": ["Financial Software"],
    "employee_count": { "min": 50, "max": 500 }
  }
}
Value shapes. A bare list [ ... ] matches any value; {"includes": [...], "excludes": [...]} sets explicit include/exclude; {"min": N, "max": N} is a numeric range. Numbers are passed as numbers, dates as YYYY-MM-DD strings.

1.4Account filters

Use these when request_type is "Account". Filters marked both also work in a contact search (filtering by the contact's company).

1.4.1location — Headquarters location

Filter by the company's HQ location. Each value is "<Name>::<type>" where type is country, state, city, or region.

JSON
{ "location": ["Canada::country", "San Francisco::city"] }

1.4.2company — Company name or website

Match specific companies by name or website.

JSON
{ "company": ["salesforce.com", "Acme Corp"] }

1.4.3industry — Industry both

Filter by industry. Use recognized industry names (e.g. "Financial Software", "Healthcare", "Retail").

JSON
{ "industry": ["Financial Software", "Financial Services"] }

1.4.4company_keyword — Company keyword both

Free-form descriptors that aren't formal industries (e.g. startup, unicorn, enterprise, women-led).

JSON
{ "company_keyword": ["startup", "unicorn"] }

1.4.5keywords — Words in the company name or description

Match literal words in a company's name and/or description. Pick exactly one scope key — includes (any word), includeAll (all words), or excludes. Optional fields targets ["companyName"] or ["companyDescription"]; omit to search all fields.

JSON
// Match words in the company name
{ "keywords": { "includes": ["Hospice", "Palliative Care"], "fields": ["companyName"] } }

// Match words in the company description
{ "keywords": { "includes": ["logistics", "supply chain"], "fields": ["companyDescription"] } }

// Exclude companies whose name contains certain words
{ "keywords": { "excludes": ["Holdings", "Group"], "fields": ["companyName"] } }

1.4.6technology — Technology used both

Filter by commercially-named products the company uses. Include name variations in the same array.

JSON
{ "technology": ["Salesforce", "Shopify"] }

1.4.7employee_count — Employee count both

JSON
{ "employee_count": { "min": 50, "max": 1000 } }

1.4.8employee_by_department — Employees by department both

Headcount for a specific department. Department names are keys; each maps to a min/max range.

JSON
{ "employee_by_department": { "Accounting": { "min": 10, "max": 50 }, "Sales": { "min": 20 } } }

1.4.9revenue — Annual revenue (USD) both

JSON
{ "revenue": { "min": 1000000, "max": 10000000 } }

1.4.10funding — Funding both

Filter by funding stage, total funding, and/or last funding date. All sub-fields optional. Valid stages: Pre-Seed, Seed, Angel, Series ASeries J, Venture, Growth Equity, Post-Ipo Debt, Post-Ipo Equity, Secondary Market, IPO.

JSON
{ "funding": {
    "stages": ["Series A", "Series B"],
    "total_funding": { "min": 1000000, "max": 50000000 },
    "last_funding_date": { "between": ["2020-01-01", "2020-12-31"] }
} }

1.4.11founded_year — Founded year both

JSON
{ "founded_year": { "min": 2016, "max": 2020 } }

1.4.12business_type — B2B / B2C both

Values: B2B, B2C (uppercase).

JSON
{ "business_type": ["B2B"] }

1.4.13product_service — Product / Service both

Values: Product, Service.

JSON
{ "product_service": ["Service"] }

1.4.14profit_type — Profit / Non-Profit both

Values: Profit, Non-Profit, Both.

JSON
{ "profit_type": ["Non-Profit"] }

1.4.15govt_type — Government / Non-Government both

Values: Government, Non-Government, Both.

JSON
{ "govt_type": ["Government"] }

1.4.16postal_code — Postal code both

Postal / ZIP codes as strings (preserves leading zeros).

JSON
{ "postal_code": ["94105", "10001"] }

1.4.17sic — SIC code both

JSON
{ "sic": ["7372"] }

1.4.18naics — NAICS code both

JSON
{ "naics": ["541511"] }

1.4.19job_openings — Active job openings both

Filter companies by their open roles. All sub-fields optional; posted_within_days is a number of days.

JSON
{ "job_openings": {
    "title": ["Project Manager"],
    "seniority": ["Director"],
    "location": ["India::country"],
    "posted_within_days": 60
} }

1.4.20employee_distribution — Global presence both

Two modes: COUNTRY_COUNT (at least N employees in at least K countries) or SPECIFIC_COUNTRIES (at least N in each listed country).

JSON
{ "employee_distribution": [
    { "mode": "SPECIFIC_COUNTRIES", "employee_per_country": 10, "countries": ["united states", "united kingdom"] }
] }

1.5Contact filters

Use these when request_type is "Contact".

1.5.1company — Current company

Return contacts who work at these companies. Values are company names, websites or company linkedin url, the same form the account-side company filter accepts.

JSON
{ "company": ["Sprouts.ai", "google.com"] }

1.5.2location — Contact location both

Same "<Name>::<type>" convention; targets the person's location.

JSON
{ "location": ["New York::city", "California::state"] }

1.5.3contact_name — Contact name or LinkedIn URL

Look up specific people by name or LinkedIn profile URL.

JSON
{ "contact_name": ["John Smith", "https://www.linkedin.com/in/janedoe/"] }

1.5.4job_title — Job title

The person's job title. Keep the department out (use department).

JSON
{ "job_title": ["Software Engineer", "Data Analyst"] }

1.5.5department — Department

Accepts a top-level department or a sub-department — 22 top-level departments and 225 sub-departments in all. A top-level value matches everyone in its sub-departments, so Engineering / Software alone covers Backend Development, QA / Test / Quality Engineering and the rest. Examples: Finance, Marketing, Sales, Human Resources / People, IT & Infrastructure, Operations, Legal, Risk & Compliance. See the filter taxonomy for every accepted value; anything else returns a 422 naming the valid values.

JSON
{ "department": ["Finance", "Engineering / Software", "Demand Generation / Growth"] }

1.5.6seniority — Seniority

Seven values, ranked (high → low): C-Suite, VP, Director / Head, Manager, IC, Entry, In Training. Note the hyphen in C-Suite. Founder, Owner and Partner are no longer seniority values — use governance_level instead. Any other value returns a 422.

JSON
{ "seniority": ["C-Suite", "VP"] }

1.5.7governance_level — Governance level

The person's ownership or governance role: Founder, Co Founder, Owner, Board Member, Advisor, Investor, Partner, None. This is separate from seniority, not an extra seniority value. Filters are ANDed, so pairing it with seniority narrows to people who are both — send it on its own to match every founder regardless of title.

JSON
{ "governance_level": ["Founder", "Co Founder"] }

1.5.8employment_type — Employment type

How the person is engaged by the company: Consultant (External), Contractor, Freelancer, Part Time, Full Time.

JSON
{ "employment_type": ["Contractor"] }

1.5.9has_csuite_access — C-suite access

Whether the person has direct access to the C-suite. Takes a boolean (true / false), not a list.

JSON
{ "has_csuite_access": true }

1.5.10designation — Designation

A more specific designation than seniority.

JSON
{ "designation": ["Chief Executive Officer", "Vice President"] }

1.5.11position_start_date — Position start date

When the person started their current role. Dates are YYYY-MM-DD.

JSON
{ "position_start_date": { "min": "2023-01-01", "max": "2023-12-31" } }

1.5.12recent_job_change_days — Recently changed jobs

People who changed jobs within the last N days.

JSON
{ "recent_job_change_days": 60 }

1.5.13past_company — Past company / role

Filter by a person's previous company, title, and/or how recently they left (left_within_days, in days). All sub-fields optional.

JSON
{ "past_company": {
    "domain": ["Google"],
    "title": ["Software Engineer"],
    "left_within_days": 90
} }
Heads up. Using an account-only filter in a contact search (or vice versa) returns 422 with a message naming the offending field.

1.6Examples

Fintech companies in the US with 50–500 employees that raised a Series A:

cURL
curl -X POST https://ml.sprouts.ai/utility/sproutsdata \
  -H "Content-Type: application/json" \
  -H "X-API-SECRET: <YOUR_API_SECRET>" \
  -H "X-Login-Email: <YOUR_LOGIN_EMAIL>" \
  -H "X-Customer-ID: <YOUR_CUSTOMER_ID>" \
  -d '{
    "request_type": "Account",
    "page": 1,
    "page_size": 25,
    "filters": {
      "industry": ["Financial Software", "Financial Services"],
      "location": ["United States::country"],
      "employee_count": { "min": 50, "max": 500 },
      "funding": { "stages": ["Series A"] }
    }
  }'

VPs and C-Suite in IT & Infrastructure at companies in California, capped at 5 contacts per account:

cURL
curl -X POST https://ml.sprouts.ai/utility/sproutsdata \
  -H "Content-Type: application/json" \
  -H "X-API-SECRET: <YOUR_API_SECRET>" \
  -H "X-Login-Email: <YOUR_LOGIN_EMAIL>" \
  -H "X-Customer-ID: <YOUR_CUSTOMER_ID>" \
  -d '{
    "request_type": "Contact",
    "page": 1,
    "page_size": 25,
    "contacts_per_account": 5,
    "filters": {
      "department": ["IT & Infrastructure"],
      "seniority": ["C-Suite", "VP"],
      "location": ["California::state"]
    }
  }'

1.7Response

Returns a page of matching records:

JSON
{
  "list": [ /* array of account or contact records */ ],
  "page": 1,
  "size": 25,
  "total_elements": 1432,
  "extra_params": { }
}
Field Description
list Records on this page (account or contact objects).
page The page number returned.
size The page size used.
total_elements Total records matching the filters.
Pagination. Increment page until you've retrieved total_elements records.

Enrich Contact Email & Phone API

Reveal a contact's work email and/or phone number from their LinkedIn profile URL.

POST
https://ml.sprouts.ai/utility/enrich-contact-email
Content-Type   application/jsonMethod   POSTAuth   Header credentials

2.1Authentication

Every request must include these headers:

Header Description
X-API-SECRET Your API secret.
X-Login-Email The login email of the account making the request.
X-Customer-ID Your customer ID.

2.2Request body

JSON
{
  "linkedin_url": "https://www.linkedin.com/in/janedoe/",  // required
  "enrich_email": true,    // reveal work email   (default true)
  "enrich_phone": false,   // reveal phone number (default false)
  "domain": "company.com"  // optional — improves match accuracy
}
Field Type Required Default Description
linkedin_url string yes LinkedIn profile URL. Must be non-empty.
enrich_email boolean no true Reveal the contact's work email.
enrich_phone boolean no false Reveal the contact's phone number.
domain string no null Company domain. Optional, improves match accuracy.
At least one of enrich_email or enrich_phone must be true — both false is rejected with 422.

Field name aliases

Field names accept both snake_case and camelCase:

Canonical Also accepted
linkedin_url linkedinUrl, LinkedinUrl, LinkedInUrl
enrich_email enrichEmail
enrich_phone enrichPhone
domain Domain

2.3Response

JSON
{
  "email": "jane.doe@company.com",  // null if not requested or not found
  "phone": "+1-415-555-0132"        // null if not requested or not found
}
A field you didn't request is always null. A requested field is null when no value was found — still a successful 200, not an error.

2.4Examples

2.4.1Reveal email only (default)

cURL
curl -X POST https://ml.sprouts.ai/utility/enrich-contact-email \
  -H "Content-Type: application/json" \
  -H "X-API-SECRET: <YOUR_API_SECRET>" \
  -H "X-Login-Email: <YOUR_LOGIN_EMAIL>" \
  -H "X-Customer-ID: <YOUR_CUSTOMER_ID>" \
  -d '{
    "linkedin_url": "https://www.linkedin.com/in/janedoe/"
  }'

2.4.2Reveal both email and phone, with a domain hint

cURL
curl -X POST https://ml.sprouts.ai/utility/enrich-contact-email \
  -H "Content-Type: application/json" \
  -H "X-API-SECRET: <YOUR_API_SECRET>" \
  -H "X-Login-Email: <YOUR_LOGIN_EMAIL>" \
  -H "X-Customer-ID: <YOUR_CUSTOMER_ID>" \
  -d '{
    "linkedin_url": "https://www.linkedin.com/in/janedoe/",
    "enrich_email": true,
    "enrich_phone": true,
    "domain": "company.com"
  }'

2.4.3Phone only

cURL
curl -X POST https://ml.sprouts.ai/utility/enrich-contact-email \
  -H "Content-Type: application/json" \
  -H "X-API-SECRET: <YOUR_API_SECRET>" \
  -H "X-Login-Email: <YOUR_LOGIN_EMAIL>" \
  -H "X-Customer-ID: <YOUR_CUSTOMER_ID>" \
  -d '{
    "linkedin_url": "https://www.linkedin.com/in/janedoe/",
    "enrich_email": false,
    "enrich_phone": true
  }'