Authentication
Every request needs your API key in theX-API-Key header. The Python
SDK reads it from the PROFOUND_API_KEY env var.
Rate limit
600 requests per hour, per key. Anything above returns429 Too Many Requests. Cache responses where you can and batch period-over-period or
multi-asset queries instead of fanning out.
end_date is exclusive — add one day
end_date is parsed at the start of that day in Eastern Time,
so it’s excluded from the response. To include all of May 10, send
end_date="2026-05-11".
The
date_interval buckets ("hour" / "day" / "week" / "month" /
"quarter" / "year" / "relative_week") are also computed in ET. Weeks
start on Sunday.
Read column positions from info.query, not your request
Each row in the response packs its metrics and dimensions as arrays.
The order of values in those arrays is the order listed in
info.query.metrics and info.query.dimensions, which echo your request.
Look positions up there instead of hardcoding them:
Period-over-period deltas are client-side
The API doesn’t return change vs the previous period. Run the same call twice (current window and a prior window of equal length) and subtract.Don’t average daily rows to get a period score
A call withdimensions=["date"] returns one row per day. A call without
date returns one row for the whole window. These are different
numbers: the period score is traffic-weighted, an average of daily
rows is not. Use the no-date call for headlines; use the with-date
call for charts. Never derive one from the other.
Pagination
Defaultpagination.limit is 10,000. Max is 50,000. Use
info.total_rows (returned on every response) to decide whether to
paginate. Almost all queries fit in a single 50k page; only heavy
dimensions=["url", ...] citation queries usually need a second page.
offset by limit until you’ve covered
total_rows.
Filters
Every report endpoint accepts afilters array of {field, operator, value} objects:
UUID filters (
model_id, region_id, topic_id, tag_id, persona_id)
accept only is, not_is, in, and not_in. The substring and regex
operators apply to name-based fields such as asset_name, root_domain,
and url.
prompt_type (with values like "visibility") maps to the app’s
Prompt Type filter. Send prompt_type=visibility on Citations queries
to mirror the default UI scope. prompt_type is deprecated in favor of
analysis_type (values visibility, sentiment, sentiment_v2,
accuracy); both are accepted today.