Sources
The Sources API returns the AI-cited domains and URLs analyzed throughout a project. It is part of citation analysis of SE Visible where prompts and AI results tell you what AI engines said, and sources tell you which web pages they pulled the information from. Use it to identify the domains and pages that drive your AI visibility, see how often they appear in AI answers, and track whether they mention your brand or your competitors’ brands.
Using the SE Visible API, you can:
- list the domains AI models cite for a project, with appearance counts, coverage, and prompt reach
- drill into the individual URLs behind those domains, with page title, category, and HTTP status
- filter sources by model, country, topic, prompt, sentiment, brand mentions, and competitor presence
- compare a selected metric across two different date ranges to analyze performance changes
All endpoints are relative to the base URL https://api.seranking.com/v1/se-visible.
Get project sources
GET https://api.seranking.com/v1/se-visible/projects/{project_id}/sources
Retrieves the sources (domains or URLs) that AI models cited across a project, with extensive filtering. The shape of each row in the response depends on source_type: domain returns one row per cited domain, url returns one row per cited page.
Note:
source_typeswitches the response between domain rows and URL rows. It also changes whichsource_sort_fieldandcolumnsvalues are valid: passing a value that belongs to the other type returns422.- Most numeric fields are wrapped in a metric object with a
valuesarray. A single period returns one entry invalues. When you supplydate_range[1](compare mode), the field returns two entries plus adeltawithabsoluteandpercentage.
Request parameters
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| project_id | String (UUID) | Yes | UUID of the project. |
Query parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| date_range | Object | Yes | N/A | Base period at index 0, optional compare period at index 1. Each has from and to in YYYY-MM-DD. See Date ranges and compare mode. |
| source_type | String | No | domain | Row shape of the response: domain or url. Also determines the valid set of source_sort_field and columns values. |
| model_types | Array of String | No | N/A | Filter by AI model types (e.g. chatgpt, perplexity). |
| country_codes | Array of String | No | N/A | Filter by ISO 3166-1 alpha-2 country codes. |
| topic_ids | Array of Integer | No | N/A | Filter by topic IDs. |
| prompt_ids | Array of Integer | No | N/A | Filter by prompt IDs. |
| sentiments | Array of String | No | N/A | Filter by sentiment: positive, neutral, negative. |
| search_query | String | No | N/A | Filter sources by a substring of the domain or URL. |
| domain_id | Integer | No | N/A | Restrict results to a single domain. |
| types | Array of String | No | N/A | Filter by URL category type (e.g. blog, news, social). See the Reference for the full list. |
| is_my_brand_mentions | Integer | No | N/A | Filter sources by whether the project’s primary brand is mentioned: 1 mentioned, 0 not mentioned, -1 mention status not available. |
| competitors_count_from | Integer | No | N/A | Minimum number of competitor brands on the source (inclusive, min 0). |
| competitors_count_to | Integer | No | N/A | Maximum number of competitor brands on the source (inclusive, min 0). |
| brand_ids | Array of Integer | No | N/A | Keep sources that mention these brand IDs (see brand_match_mode). |
| brand_match_mode | String | No | any | When filtering by brand_ids, match any of the brands or all of them. |
| columns | Array of String | No | All columns | Column ids to return. When omitted, every column is returned. When provided, each row contains only these columns plus the always-present locked first column (domain or url) and domain_id, which is used to drill down from a domain row to its URLs. Key order in the response is not guaranteed. The valid set depends on source_type; see the note below. |
| source_sort_field | String | No | N/A | Field to sort by. The valid set depends on source_type; see the note below. |
| sort_order | String | No | N/A | Sort direction: asc or desc. |
| limit | Integer | No | 1000 | Maximum number of sources to return. |
| offset | Integer | No | 0 | Number of sources to skip from the start of the list. |
Valid source_sort_field values
source_type=domain—ai_answers_count,pages,coverage,prompts_count,mention_rate,my_brand_mentions_count,competitors_count,first_seen,last_seen, and the delta variantsai_answers_count_delta,pages_delta,coverage_delta,prompts_count_delta,mention_rate_delta,my_brand_mentions_count_delta,competitors_count_delta,responses_count_delta.source_type=url—ai_answers_count,coverage,prompts_count,competitors_count,my_brand_mentions,gap_score,first_seen,last_seen,last_check_date, and the delta variantsai_answers_count_delta,prompts_count_delta,coverage_delta,responses_count_delta.- The delta variants sort by the absolute change between periods (period 0 minus period 1) and require
date_range[1], otherwise the request is rejected with422. Rows with anulldelta — for example when a strict-null metric such ascoverageis missing in one period — are pushed to the end of the result in both ascending and descending order.
Valid columns ids
source_type=domain—domain,pages,coverage,ai_answers_count,prompts_count,my_brand_mentions_count,mention_rate,brand_ids,first_seen,last_seen,competitors_count,responses_count.source_type=url—url,title,type,coverage,ai_answers_count,prompts_count,my_brand_mentions,gap_score,brand_ids,last_check_date,first_seen,last_seen,status,competitors_count,responses_count.- The locked column (
domainorurl) is accepted but redundant — it is always returned regardless of the requested ids. An id outside the set allowed for the currentsource_typereturns422.
Note: tracked_brand_ids is no longer part of this endpoint’s contract. It was previously accepted but never applied, so removing it changes no response. If your integration passed it here, the data you received was unfiltered — please re-check it. To filter sources by brand, use brand_ids together with brand_match_mode.
Request example
curl -X GET --globoff 'https://api.seranking.com/v1/se-visible/projects/550e8400-e29b-41d4-a716-446655440000/sources?source_type=domain&date_range[0][from]=2026-05-01&date_range[0][to]=2026-05-31&source_sort_field=ai_answers_count&sort_order=desc' \
-H 'Authorization: Token YOUR_API_KEY'To return only selected columns, pass columns[]:
curl -X GET --globoff 'https://api.seranking.com/v1/se-visible/projects/550e8400-e29b-41d4-a716-446655440000/sources?source_type=url&date_range[0][from]=2026-05-01&date_range[0][to]=2026-05-31&columns[]=title&columns[]=coverage&columns[]=ai_answers_count' \
-H 'Authorization: Token YOUR_API_KEY'Response parameters
If successful, the server returns a sources object with the row list and a total count.
| Parameter | Type | Description |
|---|---|---|
| items | Array | Source rows. Each row is a domain object (when source_type=domain) or a URL object (when source_type=url). |
| total | Integer | Total number of sources available for the filters. |
Most numeric fields are returned as a metric object rather than a plain number:
| Field | Type | Description |
|---|---|---|
| values | Array of Number | Metric value per period. One entry for a single period; two entries in compare mode (base, then compare). An entry can be null when a period has no data. |
| delta | Object | Present only in compare mode. Difference between the two periods. |
| delta.absolute | Number | Absolute change (base minus compare). |
| delta.percentage | Number | Percentage change. |
Domain rows (source_type=domain)
| Parameter | Type | Description |
|---|---|---|
| domain | String | Domain name. |
| domain_id | Integer | Unique domain identifier. |
| brand_ids | Array of Integer | Brand IDs mentioned on this domain. |
| first_seen | Datetime | First time this domain appeared in results. |
| last_seen | Datetime | Last time this domain appeared in results. |
| ai_answers_count | Metric object | Number of AI answers that cited this domain. |
| pages | Metric object | Distinct URLs of this domain seen as a source. |
| coverage | Metric object | Percentage of prompts whose answers cited this domain. |
| competitors_count | Metric object | Distinct competitor brands attached to this domain’s source URLs in the period. |
| prompts_count | Metric object | Distinct prompts whose answers cited this domain. |
| my_brand_mentions_count | Metric object | URLs on this domain that mention the primary brand. |
| mention_rate | Metric object | Percentage of this domain’s pages whose URL mentions the primary brand (my_brand_mentions_count / pages * 100). A domain only appears when it has at least one page in at least one period, so the metric is always present. |
| responses_count | Metric object | Total AI responses observed in the period. |
URL rows (source_type=url)
| Parameter | Type | Description |
|---|---|---|
| url | String | Full URL. |
| domain_id | Integer | Identifier of the domain this URL belongs to. |
| brand_ids | Array of Integer | Brand IDs mentioned on this URL. |
| title | String | Page title extracted from the HTML. |
| type | String | URL category type (e.g. blog, news, social). See the Reference for the full list. |
| status | Integer or null | HTTP status code of the URL. null if not yet checked. |
| first_seen | Datetime | First time this URL appeared in results. |
| last_seen | Datetime | Last time this URL appeared in results. |
| last_check_date | Datetime or null | When this URL was last parsed for brand mentions. null if not yet parsed. |
| competitors_count | Integer | Competitor brand count for this URL. Project-scoped rather than period-scoped, so it is a plain number rather than a metric object. my_brand_mentions and gap_score behave the same way. |
| my_brand_mentions | Integer | 1 if the URL currently mentions the primary brand, 0 otherwise. |
| gap_score | Integer or null | Gap score for ranking. null when not computable. |
| ai_answers_count | Metric object | Number of AI answers that cited this URL. |
| coverage | Metric object | Percentage of prompts whose answers cited this URL. |
| prompts_count | Metric object | Distinct prompts whose answers cited this URL. |
| responses_count | Metric object | Total AI responses observed in the period. |
Response example
Domain sources, single period
{
"items": [
{
"domain": "example.com",
"domain_id": 123,
"ai_answers_count": {
"values": [45]
},
"pages": {
"values": [12]
},
"coverage": {
"values": [75.5]
},
"brand_ids": [1, 2],
"competitors_count": {
"values": [2]
},
"prompts_count": {
"values": [10]
},
"my_brand_mentions_count": {
"values": [3]
},
"mention_rate": {
"values": [25]
},
"responses_count": {
"values": [60]
},
"first_seen": "2024-01-01 00:00:00",
"last_seen": "2024-01-15 00:00:00"
}
],
"total": 1
}URL sources, compare mode
{
"items": [
{
"url": "https://example.com/article1",
"domain_id": 123,
"ai_answers_count": {
"values": [15, 8],
"delta": {
"absolute": 7,
"percentage": 87.5
}
},
"coverage": {
"values": [25.5, 16],
"delta": {
"absolute": 9.5,
"percentage": 59.38
}
},
"type": "blog",
"title": "Article 1",
"brand_ids": [1, 2],
"competitors_count": 2,
"my_brand_mentions": 1,
"gap_score": null,
"prompts_count": {
"values": [5, 3],
"delta": {
"absolute": 2,
"percentage": 66.67
}
},
"responses_count": {
"values": [60, 50],
"delta": {
"absolute": 10,
"percentage": 20
}
},
"first_seen": "2024-01-01 00:00:00",
"last_seen": "2024-02-15 00:00:00",
"last_check_date": "2024-02-15 00:00:00",
"status": 200
}
],
"total": 1
}
