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_fieldvalues are valid: passing a sort field 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 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. |
| tracked_brand_ids | Array of Integer | No | N/A | Filter by tracked brand 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. |
| source_sort_field | String | No | N/A | Field to sort by. The valid set depends on source_type. For domain: ai_answers_count, pages, coverage, prompts_count, mention_rate, my_brand_mentions_count, competitors_count, first_seen, last_seen. For url: ai_answers_count, coverage, prompts_count, competitors_count, my_brand_mentions, gap_score, first_seen, last_seen, last_check_date. Passing a value outside the set for the current source_type returns 422. |
| sort_order | String | No | N/A | Sort direction: asc or desc. |
| limit | Integer | No | 1000 | Maximum number of sources to return (min 1, max 10000). |
| offset | Integer | No | 0 | Number of sources to skip from the start of the list. |
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'
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. |
| 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 (plain scalar). |
| 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
}
