SparkToro API

SparkToro Public API

Programmatic access to SparkToro audience research. Build an audience from a natural-language prompt, then pull demographics, channels, podcasts, social accounts, keywords, and more.
VERSION 1.0.0 BASE URL https://api.sparktoro.com AUTH Bearer token FORMAT JSON

01Getting started

The SparkToro API exposes the same audience-research engine that powers the SparkToro app. You build an audience report from a natural-language prompt — "B2B SaaS founders in the US who write on LinkedIn" — and then pull section data (demographics, websites, podcasts, etc.) using the report_id it returns.

Every request needs an API key sent as a Bearer token. Get one from your API dashboard.

Your first call

Confirm your key works by hitting the credits endpoint — it's free and returns your current balance.

curl
curl "https://api.sparktoro.com/v3/account/credits" \
  -H "Authorization: Bearer YOUR_API_KEY"
200 OK
{
  "plan_id": 9,
  "plan_name": "api_starter",
  "period_start": "2026-05-01 00:00:00",
  "period_end": "2026-05-31 23:59:59",
  "credits_total": 4000,
  "credits_used": 0,
  "credits_remaining": 4000
}

02Authentication

Every API request must include your API key as a Bearer token in the Authorization header. Keys are scoped to your account; treat them like a password.

header
Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxx

Where to get a key

Your API dashboard shows your active keys, lets you create new ones, and lets you revoke compromised keys. Keys never expire on their own — you control their lifecycle.

Keep keys server-side

Never embed an API key in client-side JavaScript or mobile apps. Anyone who can read the binary can steal the key. Call the SparkToro API from your backend.

03Credits & metering

Every billable endpoint costs a fixed number of credits. Your plan includes a monthly allowance that resets at the start of each billing period; unused credits do not roll over.

How credits are debited

  • Credits are charged at request dispatch, before the work runs. If the request returns a 5xx error the charge is automatically refunded.
  • You're charged once per (endpoint, report_id) per billing period — re-pulling the same section for the same report is free for the rest of the period.
  • Creating an audience report (POST /v3/describe/create) charges 10 credits regardless of how many sections you later request.

Checking your balance

Hit GET /v3/account/credits at any time — it's free and returns your plan allowance, credits used this period, and credits remaining.

Hitting the wall

When you run out of credits, the next billable request returns a 402 Insufficient credits response with the cost and your remaining balance. No partial charges, no debit row written.

04Rate limits

To keep the service responsive for everyone, requests are capped per minute per account. Limits scale with your plan:

PlanLimit
Free10 requests / minute
Starter30 requests / minute
Growth60 requests / minute
Agency120 requests / minute

Hitting the limit returns 429 Too Many Requests with a Retry-After header (seconds until the next minute bucket).

05Endpoints

All endpoints share the base URL https://api.sparktoro.com and respond with JSON. Required parameters are marked.

Account
GET /v3/account/credits Free
Get current credit balance

Free (0 credits). Returns the caller's remaining credits, expiration date, trial status, low-balance flag, and per-minute rate limit.

Example request

curl
curl -X GET "https://api.sparktoro.com/v3/account/credits" \
  -H "Authorization: Bearer YOUR_API_KEY"

Response fields

FieldTypeDescription
credits_remaining integer Credits available to spend right now.
credits_expires_at string (date-time) nullable When the entire balance expires. Resets to 12 months from purchase on every new pack. Null only on accounts that have never been topped up.
is_trial boolean True until the account makes its first paid pack purchase. Trial accounts start with 200 credits and a lower default rate limit.
low_balance boolean True when credits_remaining is below the account's low-balance threshold (default 500, overridable per-account).
rate_limit_per_min integer Max requests per minute for this account. Defaults: 10 trial, 60 paid. May be raised on request.

Responses

200 Current balance.
Show example response
json
{
    "credits_remaining": 0,
    "credits_expires_at": "2026-01-01T00:00:00Z",
    "is_trial": true,
    "low_balance": true,
    "rate_limit_per_min": 0
}
Audience reports
POST /v3/describe/create 10 credits
Create an audience report

Costs 10 credits. Kicks off asynchronous report generation. Returns a `report_id` you pass to the section endpoints.

Request body

FieldTypeRequiredDescription
prompt string required Natural-language audience description (people, not topics). e.g. B2B SaaS founders in the US who write on LinkedIn.
location string optional Options: us, ca, ukDefault: us

Example request

curl
curl -X POST "https://api.sparktoro.com/v3/describe/create" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt":"B2B SaaS founders in the US","location":"us"}'

Response fields

FieldTypeDescription
report_id string Stable handle for the report. Pass it as ?report_id= to every section endpoint.
status string Report state. Sections can be queried once status is 'ready'.Options: processing, ready, error
message string Human-readable confirmation or error detail.

Responses

202 Report queued. Poll the section endpoints (or report status) until data is available.
Show example response
json
{
    "report_id": "string",
    "status": "processing",
    "message": "string"
}
People
GET /v3/demographics 1 credit
Demographics

Returns audience demographics as an object of named sub-arrays (age, gender, industry, title_role, education_majors, city, state, ...). Long-tail fields (industry, title_role, school_name, skills, education_majors, department, city, state, country) respect `?limit=N`; categorical fields (age, gender, years_experience, married, children, homeowner, education_degree, etc.) are always returned in full because capping them would drop legitimate categories. Use `?fields=key1,key2` to narrow the response to specific keys.

Parameters

NameInTypeRequiredDescription
report_id query string required Report identifier returned by POST /v3/describe/create.
limit query integer optional Cap on the number of items returned. Narrows the response but never exceeds the endpoint's default cap.Default: 300Range: min 1, max 300
fields query string optional Comma-separated list of top-level demographic keys to return (e.g. `age,gender,industry`). Unknown keys are silently dropped. Omit to return all fields.

Example request

curl
curl -X GET "https://api.sparktoro.com/v3/demographics" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -G --data-urlencode "report_id=YOUR_REPORT_ID"

Response fields

FieldTypeDescription
data object Object-of-arrays keyed by demographic field name. Each value is an array of {name, value} buckets sorted by value descending. Categorical fields (age, gender, salary, net_worth, married, children, homeowner, years_experience, education_degree, education_degree_type, company_revenue, company_employee_count, country) return their full bucket set; long-tail fields (title_role, department, industry, school_name, skills, education_majors, city, state) respect ?limit=N (default 50). Use ?fields=age,gender to return only specific fields. The state field's buckets additionally include population_baseline.

Plus a standard meta object with credits_charged and credits_remaining.

Responses

200 OK
Show example response
json
{
    "data": [],
    "meta": {
        "credits_charged": 0,
        "credits_remaining": 0,
        "credits_expires_at": "2026-01-01T00:00:00Z",
        "low_balance": true
    }
}
GET /v3/bios 5 credits
Keywords from audience bios

Parameters

NameInTypeRequiredDescription
report_id query string required Report identifier returned by POST /v3/describe/create.
limit query integer optional Cap on the number of items returned. Narrows the response but never exceeds the endpoint's default cap.Default: 300Range: min 1, max 300
history query string optional When `false`, the per-item `history` map is omitted from the response. Default `true`. When included, history is always trimmed to the most recent 12 months.Options: true, falseDefault: true

Example request

curl
curl -X GET "https://api.sparktoro.com/v3/bios" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -G --data-urlencode "report_id=YOUR_REPORT_ID"

Response item fields

FieldTypeDescription
keyword string Keyword extracted from audience bios/profiles.
affinity number This audience's affinity for the keyword (0-100).
history object Monthly trend object keyed by YYYY-MM.

Plus a standard meta object with credits_charged and credits_remaining.

Responses

200 OK
Show example response
json
{
    "data": [
        {
            "keyword": "string",
            "affinity": 0,
            "history": []
        }
    ],
    "meta": {
        "credits_charged": 0,
        "credits_remaining": 0,
        "credits_expires_at": "2026-01-01T00:00:00Z",
        "low_balance": true
    }
}
Channels they use
GET /v3/websites 2 credits
Top websites visited

Parameters

NameInTypeRequiredDescription
report_id query string required Report identifier returned by POST /v3/describe/create.
limit query integer optional Cap on the number of items returned. Narrows the response but never exceeds the endpoint's default cap.Default: 300Range: min 1, max 300
history query string optional When `false`, the per-item `history` map is omitted from the response. Default `true`. When included, history is always trimmed to the most recent 12 months.Options: true, falseDefault: true

Example request

curl
curl -X GET "https://api.sparktoro.com/v3/websites" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -G --data-urlencode "report_id=YOUR_REPORT_ID"

Response item fields

FieldTypeDescription
id integer SparkToro's internal numeric domain id; a stable join key across endpoints.
domain string The website's domain (e.g. gartner.com).
category string IAB-style content category for the domain.
visits integer Estimated total monthly panel visits to this domain.
moz_da integer Moz Domain Authority (0-100).
moz_links integer Backlink count from Moz.
hidden_gem boolean High-affinity, low-popularity flag.
history object Monthly trend object keyed by YYYY-MM.
meta_description string nullable Short site description from the domain's meta tags.

Plus a standard meta object with credits_charged and credits_remaining.

Responses

200 OK
Show example response
json
{
    "data": [
        {
            "id": 0,
            "domain": "string",
            "category": "string",
            "visits": 0,
            "moz_da": 0,
            "moz_links": 0,
            "hidden_gem": true,
            "history": [],
            "meta_description": "string"
        }
    ],
    "meta": {
        "credits_charged": 0,
        "credits_remaining": 0,
        "credits_expires_at": "2026-01-01T00:00:00Z",
        "low_balance": true
    }
}
GET /v3/social 2 credits
Top social accounts followed

Parameters

NameInTypeRequiredDescription
report_id query string required Report identifier returned by POST /v3/describe/create.
limit query integer optional Cap on the number of items returned. Narrows the response but never exceeds the endpoint's default cap.Default: 300Range: min 1, max 300

Example request

curl
curl -X GET "https://api.sparktoro.com/v3/social" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -G --data-urlencode "report_id=YOUR_REPORT_ID"

Response item fields

FieldTypeDescription
id string Twitter numeric id.
username string Account handle (without the @).
name string Display name.
description string Account bio.
profile_image string (uri) Avatar image URL.
relationships object Maps a network name (facebook, instagram, twitter, linkedin, domain, …) to the linked account(s) on that network. Item fields vary by network: `type` and `username` are always present; `user_id` appears for SparkToro-known accounts, `clean_domain` only on the `domain` entry (the account's own website).
followers integer Follower count on this network.
following integer Number of accounts this account follows.
global_followers integer Aggregate follower count across all of this account's known networks.
sparkscore number SparkToro engagement metric (0-100).
engagement_score number Per-account engagement signal.
affinity number This audience's affinity for the account (0-100).
location string nullable Free-text location from the account profile (often empty).
verified integer 1 if the account is verified on its network, else 0.
hidden_gem boolean High-affinity, low-following flag.
website string (uri) Account's own website URL.

Plus a standard meta object with credits_charged and credits_remaining.

Responses

200 OK
Show example response
json
{
    "data": [
        {
            "id": "string",
            "username": "string",
            "name": "string",
            "description": "string",
            "profile_image": "https://example.com",
            "relationships": [],
            "followers": 0,
            "following": 0,
            "global_followers": 0,
            "sparkscore": 0,
            "engagement_score": 0,
            "affinity": 0,
            "location": "string",
            "verified": 0,
            "hidden_gem": true,
            "website": "https://example.com"
        }
    ],
    "meta": {
        "credits_charged": 0,
        "credits_remaining": 0,
        "credits_expires_at": "2026-01-01T00:00:00Z",
        "low_balance": true
    }
}
GET /v3/networks 1 credit
Social networks usage

Social platforms / networks the audience uses (Facebook, YouTube, Twitter, TikTok, LinkedIn, Reddit, etc.).

Parameters

NameInTypeRequiredDescription
report_id query string required Report identifier returned by POST /v3/describe/create.
limit query integer optional Cap on the number of items returned. Narrows the response but never exceeds the endpoint's default cap.Default: 300Range: min 1, max 300
history query string optional When `false`, the per-item `history` map is omitted from the response. Default `true`. When included, history is always trimmed to the most recent 12 months.Options: true, falseDefault: true

Example request

curl
curl -X GET "https://api.sparktoro.com/v3/networks" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -G --data-urlencode "report_id=YOUR_REPORT_ID"

Response item fields

FieldTypeDescription
domain string The network/platform domain (e.g. youtube.com).
category string IAB-style content category for the domain.
visits integer Estimated total monthly panel visits to this domain.
current_rank integer Rank within this audience.
affinity number This audience's usage of the domain (0-100).
country_average number Country-baseline usage of the domain (0-100).
affinity_lift number How much the audience over/under-indexes the baseline (affinity − country_average), rounded to 2 decimals.
history object Monthly trend object keyed by YYYY-MM.
meta_description string nullable Short description from the domain's meta tags.

Plus a standard meta object with credits_charged and credits_remaining.

Responses

200 OK
Show example response
json
{
    "data": [
        {
            "domain": "string",
            "category": "string",
            "visits": 0,
            "current_rank": 0,
            "affinity": 0,
            "country_average": 0,
            "affinity_lift": 0,
            "history": [],
            "meta_description": "string"
        }
    ],
    "meta": {
        "credits_charged": 0,
        "credits_remaining": 0,
        "credits_expires_at": "2026-01-01T00:00:00Z",
        "low_balance": true
    }
}
GET /v3/youtube 1 credit
Top YouTube channels

Parameters

NameInTypeRequiredDescription
report_id query string required Report identifier returned by POST /v3/describe/create.
limit query integer optional Cap on the number of items returned. Narrows the response but never exceeds the endpoint's default cap.Default: 300Range: min 1, max 300
history query string optional When `false`, the per-item `history` map is omitted from the response. Default `true`. When included, history is always trimmed to the most recent 12 months.Options: true, falseDefault: true

Example request

curl
curl -X GET "https://api.sparktoro.com/v3/youtube" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -G --data-urlencode "report_id=YOUR_REPORT_ID"

Response item fields

FieldTypeDescription
id integer SparkToro's internal numeric channel id.
channel_id string YouTube's own channel id.
channel_url string (uri) Canonical YouTube channel URL.
title string Channel name.
image string (uri) Channel avatar/thumbnail URL.
subscribers integer Subscriber count.
views integer Total lifetime channel views.
average_views integer Average views per video.
join_date string (date) Channel creation date (YYYY-MM-DD).
latest_video string (date) Date of the most recent video (YYYY-MM-DD).
description string Channel description from YouTube.

Plus a standard meta object with credits_charged and credits_remaining.

Responses

200 OK
Show example response
json
{
    "data": [
        {
            "id": 0,
            "channel_id": "string",
            "channel_url": "https://example.com",
            "title": "string",
            "image": "https://example.com",
            "subscribers": 0,
            "views": 0,
            "average_views": 0,
            "join_date": "2026-01-01",
            "latest_video": "2026-01-01",
            "description": "string"
        }
    ],
    "meta": {
        "credits_charged": 0,
        "credits_remaining": 0,
        "credits_expires_at": "2026-01-01T00:00:00Z",
        "low_balance": true
    }
}
GET /v3/podcasts 1 credit
Top podcasts listened to

Returns the podcasts this audeince listens to.

Parameters

NameInTypeRequiredDescription
report_id query string required Report identifier returned by POST /v3/describe/create.
limit query integer optional Cap on the number of items returned. Narrows the response but never exceeds the endpoint's default cap.Default: 300Range: min 1, max 300

Example request

curl
curl -X GET "https://api.sparktoro.com/v3/podcasts" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -G --data-urlencode "report_id=YOUR_REPORT_ID"

Response item fields

FieldTypeDescription
title string Show title.
author string Show author / publisher.
category string Apple Podcasts category (e.g. Business, Technology).
episodes integer Total number of published episodes.
stars number Apple Podcasts rating (1-5), rounded to 2 decimals.
review_count integer Number of Apple Podcasts ratings.
link string (uri) Apple Podcasts URL.
website string (uri) The show's own website.
artwork string (uri) Cover artwork image URL.
recent_date string (date) Date of the most recent episode (YYYY-MM-DD).
description string Show description.

Plus a standard meta object with credits_charged and credits_remaining.

Responses

200 OK
Show example response
json
{
    "data": [
        {
            "title": "string",
            "author": "string",
            "category": "string",
            "episodes": 0,
            "stars": 0,
            "review_count": 0,
            "link": "https://example.com",
            "website": "https://example.com",
            "artwork": "https://example.com",
            "recent_date": "2026-01-01",
            "description": "string"
        }
    ],
    "meta": {
        "credits_charged": 0,
        "credits_remaining": 0,
        "credits_expires_at": "2026-01-01T00:00:00Z",
        "low_balance": true
    }
}
GET /v3/reddit 2 credits
Top subreddits visited

Parameters

NameInTypeRequiredDescription
report_id query string required Report identifier returned by POST /v3/describe/create.
limit query integer optional Cap on the number of items returned. Narrows the response but never exceeds the endpoint's default cap.Default: 300Range: min 1, max 300

Example request

curl
curl -X GET "https://api.sparktoro.com/v3/reddit" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -G --data-urlencode "report_id=YOUR_REPORT_ID"

Response item fields

FieldTypeDescription
display_name string Subreddit slug.
title string Subreddit display title.
description string Subreddit public description.
subscribers integer Subscriber count.
url string (uri) Absolute Reddit URL.
affinity number This audience's affinity for the subreddit (0-100).
lang string Primary language code (e.g. 'en').
over18 integer 0/1 NSFW flag.
private integer 0/1 flag for whether the subreddit is private.
created_at string (date-time) Subreddit creation timestamp (UTC).
reddit_id string Reddit's own id (e.g. '2qhcs').

Plus a standard meta object with credits_charged and credits_remaining.

Responses

200 OK
Show example response
json
{
    "data": [
        {
            "display_name": "string",
            "title": "string",
            "description": "string",
            "subscribers": 0,
            "url": "https://example.com",
            "affinity": 0,
            "lang": "string",
            "over18": 0,
            "private": 0,
            "created_at": "2026-01-01T00:00:00Z",
            "reddit_id": "string"
        }
    ],
    "meta": {
        "credits_charged": 0,
        "credits_remaining": 0,
        "credits_expires_at": "2026-01-01T00:00:00Z",
        "low_balance": true
    }
}
GET /v3/press 2 credits
Press / media outlets read

News + media outlets the audience reads (NBC, CBS, Wall Street Journal, NYT, etc.).

Parameters

NameInTypeRequiredDescription
report_id query string required Report identifier returned by POST /v3/describe/create.
limit query integer optional Cap on the number of items returned. Narrows the response but never exceeds the endpoint's default cap.Default: 300Range: min 1, max 300
history query string optional When `false`, the per-item `history` map is omitted from the response. Default `true`. When included, history is always trimmed to the most recent 12 months.Options: true, falseDefault: true

Example request

curl
curl -X GET "https://api.sparktoro.com/v3/press" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -G --data-urlencode "report_id=YOUR_REPORT_ID"

Response item fields

FieldTypeDescription
domain string The media outlet's domain (e.g. nytimes.com).
affinity number This audience's affinity for the outlet (0-100).
visits integer Estimated total monthly panel visits to this domain.
moz_da integer Moz Domain Authority (0-100).
moz_links integer Backlink count from Moz.
history object Monthly trend object keyed by YYYY-MM.
meta_description string nullable Short description from the outlet's meta tags.

Plus a standard meta object with credits_charged and credits_remaining.

Responses

200 OK
Show example response
json
{
    "data": [
        {
            "domain": "string",
            "affinity": 0,
            "visits": 0,
            "moz_da": 0,
            "moz_links": 0,
            "history": [],
            "meta_description": "string"
        }
    ],
    "meta": {
        "credits_charged": 0,
        "credits_remaining": 0,
        "credits_expires_at": "2026-01-01T00:00:00Z",
        "low_balance": true
    }
}
GET /v3/apps/{app_type} 2 credits
Apps the audience uses

Parameters

NameInTypeRequiredDescription
app_type path string required Options: ai, productivity, entertainment, lifestyle, finance, sports, ecommerce
report_id query string required Report identifier returned by POST /v3/describe/create.
limit query integer optional Cap on the number of items returned. Narrows the response but never exceeds the endpoint's default cap.Default: 300Range: min 1, max 300
history query string optional When `false`, the per-item `history` map is omitted from the response. Default `true`. When included, history is always trimmed to the most recent 12 months.Options: true, falseDefault: true

Example request

curl
curl -X GET "https://api.sparktoro.com/v3/apps/{app_type}" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -G --data-urlencode "report_id=YOUR_REPORT_ID"

Response item fields

FieldTypeDescription
domain string The app/service domain (e.g. gartner.com).
meta_description string nullable Short description from the domain's meta tags.
visits integer Estimated total monthly panel visits to this domain.
current_rank integer Rank within this audience for the requested category.
affinity number This audience's usage of the domain (0-100).
country_average number Country-baseline usage of the domain (0-100).
affinity_lift number How much the audience over/under-indexes the baseline (affinity − country_average), rounded to 2 decimals.
popular boolean True when this is a popular/mainstream pick within the category (not present on every item).
search_share number Present on /v3/apps/ai only. Google's search-engine market share fraction for this AI-category domain.

Plus a standard meta object with credits_charged and credits_remaining.

Responses

200 OK
Show example response
json
{
    "data": [
        {
            "domain": "string",
            "meta_description": "string",
            "visits": 0,
            "current_rank": 0,
            "affinity": 0,
            "country_average": 0,
            "affinity_lift": 0,
            "popular": true,
            "search_share": 0
        }
    ],
    "meta": {
        "credits_charged": 0,
        "credits_remaining": 0,
        "credits_expires_at": "2026-01-01T00:00:00Z",
        "low_balance": true
    }
}
Topics & intent
GET /v3/keywords 5 credits
Search keywords

Parameters

NameInTypeRequiredDescription
report_id query string required Report identifier returned by POST /v3/describe/create.
limit query integer optional Cap on the number of items returned. Narrows the response but never exceeds the endpoint's default cap.Default: 300Range: min 1, max 300
history query string optional When `false`, the per-item `history` map is omitted from the response. Default `true`. When included, history is always trimmed to the most recent 12 months.Options: true, falseDefault: true

Example request

curl
curl -X GET "https://api.sparktoro.com/v3/keywords" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -G --data-urlencode "report_id=YOUR_REPORT_ID"

Response item fields

FieldTypeDescription
keyword string The search term.
affinity number This audience's affinity for the term (0-100).
volume integer Monthly Google search volume.
cpc number Estimated cost-per-click in USD.
competition number 0-1 from Google Ads.
history object Monthly trend object keyed by YYYY-MM.

Plus a standard meta object with credits_charged and credits_remaining.

Responses

200 OK
Show example response
json
{
    "data": [
        {
            "keyword": "string",
            "affinity": 0,
            "volume": 0,
            "cpc": 0,
            "competition": 0,
            "history": []
        }
    ],
    "meta": {
        "credits_charged": 0,
        "credits_remaining": 0,
        "credits_expires_at": "2026-01-01T00:00:00Z",
        "low_balance": true
    }
}
GET /v3/prompts 2 credits
AI prompt ideas

Parameters

NameInTypeRequiredDescription
report_id query string required Report identifier returned by POST /v3/describe/create.
limit query integer optional Cap on the number of items returned. Narrows the response but never exceeds the endpoint's default cap.Default: 300Range: min 1, max 300

Example request

curl
curl -X GET "https://api.sparktoro.com/v3/prompts" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -G --data-urlencode "report_id=YOUR_REPORT_ID"

Response item fields

FieldTypeDescription
topic string AI prompt topic this audience is likely to ask about.
affinity number This audience's affinity for the prompt topic (0-100).

Plus a standard meta object with credits_charged and credits_remaining.

Responses

200 OK
Show example response
json
{
    "data": [
        {
            "topic": "string",
            "affinity": 0
        }
    ],
    "meta": {
        "credits_charged": 0,
        "credits_remaining": 0,
        "credits_expires_at": "2026-01-01T00:00:00Z",
        "low_balance": true
    }
}
Market size
GET /v3/tam 3 credits
Total addressable market

Estimated total addressable market for the audience: population, year-over-year growth, annual market value, and the rationale (sources + assumptions) behind the estimate. Figures are model estimates, not exact counts. Cached per report after the first call.

Parameters

NameInTypeRequiredDescription
report_id query string required Report identifier returned by POST /v3/describe/create.

Example request

curl
curl -X GET "https://api.sparktoro.com/v3/tam" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -G --data-urlencode "report_id=YOUR_REPORT_ID"

Response fields

FieldTypeDescription
data object Total addressable market estimate for the audience. All figures are model estimates, not exact counts — always surface the rationale to end users.

Plus a standard meta object with credits_charged and credits_remaining.

Responses

200 OK
Show example response
json
{
    "data": {
        "estimated_population": 0,
        "year_over_year_growth_pct": 0,
        "estimated_market_value": 0,
        "currency": "string",
        "rationale": "string"
    },
    "meta": {
        "credits_charged": 0,
        "credits_remaining": 0,
        "credits_expires_at": "2026-01-01T00:00:00Z",
        "low_balance": true
    }
}

06Errors

All errors return a JSON envelope with an error flag, HTTP status, and a human-readable message. Where useful, additional fields like credits_required, credits_remaining, limit_per_min, or retry_after are included.

Common statuses

StatusMeaning
401Missing or invalid API key.
402Insufficient credits for this request. No charge applied. Includes credits_required and credits_remaining.
404Endpoint or resource not found.
429Rate limit exceeded. Includes Retry-After header (seconds).
500Server error. The request is automatically refunded; safe to retry.

401 example

401 Unauthorized
{
  "error": true,
  "status": 401,
  "message": "Missing or invalid API key."
}

402 example

402 Insufficient Credits
{
  "error": true,
  "status": 402,
  "message": "Insufficient credits",
  "credits_required": 5,
  "credits_remaining": 2,
  "period_end": "2026-05-31 23:59:59"
}

429 example

429 Too Many Requests
{
  "error": true,
  "status": 429,
  "message": "Rate limit exceeded (30 req/min on your plan).",
  "limit_per_min": 30,
  "retry_after": 18
}

Ready to build?

Grab an API key from your dashboard and start with the credits endpoint.

Go to dashboard →