Last Updated: September 22nd, 2025
API Basics
Endpoints
Scrunch APIs are hosted under the api.scrunchai.com domain.
Authentication
API access is authenticated via a shared secret bearer token, which you can pass us in the standard Authentication header.
For example, via curl:
curl -H "Authorization: Bearer ${SCRUNCH_API_TOKEN}" "https://api.scrunchai.com/v1/${SCRUNCH_BRAND_ID}/prompts"
Authorization & Scope
Workspace Scope
Scrunch API tokens can be scoped for:
One or more Brands
An entire Organization (Scrunch subscription)
A Brand is Scrunch's unit of organization for data & reporting, including clients / customers of partners. All Scrunch query APIs and most data APIs operate for a specific brand's context. We currently do not expose cross-brand reporting capabilities (e.g. each brand must be queried individually) but we may support this in the future. You may safely share read-only brand-scoped API tokens (or data access methods that use an API token under the hood, such as a BI connector) with clients if needed.
An Organization represents a Scrunch AI customer, regardless of the number of brands they have. Organization-scoped API keys can be used for internal reporting or for programmatically configuring many Scrunch brands (e.g. automated client onboarding.) In agency or MSP scenarios, organization-scoped keys should not be exposed to individual clients, as this would enable them to access other client data.
Operation Scope
The operational scopes Scrunch supports are:
Query – Query data for authorized brands
Configure – Write configuration data for an authorized brand, such as updating prompts or brand descriptions.
Create Brand – Create a new brand.
Responses – Access raw AI response data.
By default, API credentials are scoped for all brands attached to your organization, including future brands created via the web application or via API. However, with the exception of the List Brands and Create Brand APIs, all API calls must include a specific brand ID to function. The API does not yet support e.g. running reporting queries across multiple brands at the same time.
If desired, API credentials can be restricted to specific brand(s) for reporting purposes – for example, if you are an agency and are required to integrate into client reporting tools, Scrunch can provide an API credential that is limited to only their specific brand(s) data. Reach out to support@scrunchai.com if this is needed.
Obtaining an API token
Organization administrators (typically the person who signed up for Scrunch AI) can create API keys by accessing the Organization > Settings menu item in the left sidebar. If you can't locate your organization administrator, or they don't see this option, contact us at support@scrunchai.com.
Navigate to "API Keys" and click "Add API Key".
Configure the scopes appropriately (see above section for scope definitions.)
API Format
The API always returns responses in JSON format.
Query APIs accept parameters via query parameters:
curl -H "Authorization: Bearer ${SCRUNCH_API_TOKEN}" https://api.scrunchai.com/v1/${SCRUNCH_BRAND_ID}/prompts?stage=awareness
Mutation APIs generally accept JSON request bodies.
curl -H "Content-Type: application/json" -H "Authorization: Bearer ${SCRUNCH_API_TOKEN}" -d '{"prompt": "Sample prompt", "tags": ["tag_a", "tag_b"]}' https://api.scrunchai.com/v1/${SCRUNCH_BRAND_ID}/prompts
API Catalog
Summary of available APIs
API | Description | Use Cases | Availability | Scope(s) |
Query API | Flexible reporting API for querying both aggregate and granular metrics about brand presence, position, sentiment, source citation frequency, etc. | Automated reporting Integration with third-party BI or data analytics tools Data source for ETL (e.g. via Airbyte) | Generally available | Query |
Configuration API | Manage configuration details for one or more brand(s) in Scrunch | Scaled, programmatic client management | Available to agency & enterprise partners | Query Configure Brand Creation |
Responses API | Access a feed of responses for specific prompt(s), including response text, citations, and individual presence, position, sentiment, and citation scores. | UI support, advanced data analysis | On request | -
(Contact Scrunch Support or your CSM for access)
|
Query API
The Query API allows retrieval of analytics data across various dimensions and metrics in a flexible way. Generally, the metrics and dimensions operate identically to the filters & metrics in the Scrunch web application. The API is designed to support integration with common reporting tools.
curl -H "Authorization: Bearer ${SCRUNCH_API_TOKEN}" https://api.scrunchai.com/v1/${SCRUNCH_BRAND_ID}/query?fields=tag,brand_presence_percentage
Operations
Endpoint | HTTP Method | Name | Notes | Status | Scope |
/v1/{brand_id}/query | GET | Query performance data | Pass fields to customize data retrieved and aggregations | Live | Query |
Aggregation
The Query API auto-aggregate metrics for any specified dimensions. For example, if you specify ?fields=tag,brand_presence_percentage you will receive the average brand presence for each tag.
Pagination
By default the Query API is configured to return a very large number of results (up to 50,000) for ease of integration into BI tools that may not support paginating results sets. Pagination is supported via limit and offset parameters. However, if you find yourself needing to paginate the Query API, it's highly likely that you are specifying too granular a combination of fields.
Caution!
The Query API allows specifying many dimensions for reporting at once. Specifying granular combinations of dimensions (e.g. date,prompt_id,source_url,competitor_id) may cause very large result sets – upwards of 1 million rows for customers with many prompts configured.
In our experience, specifying all dimensional fields together does not produce usable data sets – it's often better to query separately for, for example, date,prompt_id,prompt,persona_id,ai_platform,branded,responses,brand_presence_percentage,brand_sentiment_score,brand_position_score and then date,prompt_id,source_url,source_type and then date,prompt_id,competitor_name,competitor_presence_percentage and stitch them together.
Combining all these dimensions into one query will, for instance, give you a brand_presence_percentage metric that is specific to just responses for a particular prompt where a particular competitor shows up and a particular source URL is also cited. We find metrics at this level are usually not useful for straightforward aggregation and reporting. If you're looking for raw data for more sophisticated analysis, please contact your CSM for access to the Responses API.
The following dimensional fields are many-to-many with prompts and therefore can produce large result sets when combined:
ai_platform
tag
prompt_topic
competitor_id
competitor_name
source_url
source_type
Recommended Use
Use date_week or date_month to aggregate data over time for historical reporting. Scrunch does not collect data for every configured prompt every day, so day-level data will show variation.
Avoid using granular combinations like source_url,competitor_name. Because competitors are based on mentions in the response (including citations), this will result in retrieving a row for every URL present in every response a competitor is mentioned in, which is usually not what you want.
The various text dimension fields (persona name, prompt, competitor name) are generally unique. It's not necessary to include the ID dimensions for disambiguation; we include them here in case you need to align API data with other reporting.
Filtering Parameters
Currently the Query API only supports filtering on date range. Pagination parameters can also be set (see above.)
Name | Format | Constraints |
start_date | YYYY-MM-DD | Must be within the last 90 days. |
end_date | YYYY-MM-DD | Must be after the start date. |
offset | Number | Defaults to 0 |
limit | Number | Defaults to 50,000 |
Fields
Specify these in the fields= array to retrieve them. Dimensions determine how metrics are grouped. Querying a dimension by itself will simply give you the unique values for that dimension. Querying a metric by itself will give you the overall aggregate of that metric, which may or may not be useful.
Dimensions
Name | JSON Type | Semantic Type | Constraints | Relationship with Prompt |
prompt_id | Number | Integer |
| - |
prompt | String | Text |
| - |
date_month | String | Date (truncated to start of month) | Only last 90 days of data | Many to many |
date_week | String | Date (truncated to start of calendar week) | Only last 90 days of data
Recommend keeping filters week-aligned
| Many to many |
date | String | Date | Only last 90 days of data | Many to many |
source_url | String | URL |
| Many to many |
source_type | String | Enum | Brand, Competitor, Other | Many to many |
persona_id | Number | Integer |
| One to many (persona has multiple prompts, prompt has a single persona) |
persona_name | String | Text |
| One to many (persona has multiple prompts, prompt has a single persona) |
competitor_id | Number | Integer |
| Many to many |
competitor_name | String | Text |
| Many to many |
ai_platform | String | Enum | ChatGPT, Perplexity, Google AI Overviews, Meta, Claude | Many to many |
tag | String | String |
| Many to many |
branded | Boolean | Boolean | Whether the prompt includes the brand name (or an alternate name) or not. | One to many (prompt is branded or unbranded) |
stage | String | Enum | Advice, Awareness, Evaluation, Comparison, Other | One to many (prompt has a single stage) |
prompt_topic | String | String | Key Topic | Many to many |
country | String | String | 2-letter ISO country code | One to many (prompt has a single country, either persona or brand default) |
Metrics
Name | Data Type | Semantic Type | Aggregation Type | Constraints | Notes |
responses | Number | Integer | Count |
|
|
brand_presence_percentage | Number | Percentage | Average |
|
|
brand_position_score | Number | Float | Average | (0, 100) |
|
brand_sentiment_score | Number | Float | Average | (0, 100) |
|
competitor_presence_percentage | Number | Percentage | Average |
| Must be used with either or both the competitor_id or competitor_name dimensions. |
competitor_position_score | Number | Float | Average | (0, 100) | Must be used with either or both the competitor_id or competitor_name dimensions. |
competitor_sentiment_score | Number | Float | Average | (0, 100) | Must be used with either or both the competitor_id or competitor_name dimensions. |
Configuration API
Operations
Endpoint | HTTP Method | Name | Notes | Status | Scope |
/v1/brands | GET | List accessible brands | Only returns brands the API key has at least Query scope for | Live | Query |
/v1/brands | POST | Create a brand | Accepts Brand Context object, returns brand ID. | Live | Brand Creation |
/v1/brands/{brand_id} | GET | Get brand context | Name, alternative names, website, alternative websites, competitors, personas | Live | Query |
/v1/brands/{brand_id} | PUT | Update brand context |
|
| Configure |
/v1/brands/{brand_id} | DELETE | Deactivates a brand |
| Live | Brand Creation |
/v1/{brand_id}/prompts | GET | List configured prompts |
| Live | Query |
/v1/{brand_id}/prompts | POST | Add prompt(s) |
| Live | Configure |
/v1/{brand_id}/prompts/{prompt_id} | GET | Get a specific prompt configuration |
| Live | Query |
/v1/{brand_id}/prompts/{prompt_id} | DELETE | Deactivate a prompt. |
| Live | Configure |
/v1/{brand_id}/prompts/{prompt_id} | PUT | Update a prompt | Note: only supports updating tags and platforms. To revise text, DELETE existing prompt and add a new one. |
| Configure |
Input Formats
Prompt
Key | Data Type | Required | Example |
text | String | Y | What are the best running shoes |
tags | String[] | N | ["cohort-a", "api"] |
platforms | Enum[] | Y | ["chatgpt", "perplexity"] |
persona_id | Number | N | 245 |
Brand Context
Key | Data Type | Required | Example |
name | String | Y | Spirit Airlines |
alternative_names | String[] | N | ["Spirit"] |
website | String | Y | |
alternative_websites | String[] | N | |
competitors | Competitor[] | N | See below |
personas | Persona[] | N | See below |
key_topics | String[] | N | ["Air Travel", "Loyalty Programs", "Discount Fares"] |
Persona
Key | Data Type | Required | Example |
name | String | Y | Budget Traveler |
description | String | Y | Enjoys travel but has limited financial means. They care most about being able to visit new places and enjoy new experiences and are willing to make trade-offs to travel more often. |
Competitor
Key | Data Type | Required | Example |
name | String | Y | Southwest Airlines |
alternative_names | String[] | N | ["Southwest"] |
websites | String[] | N |