Skip to main content
POST
/
api
/
analytics
/
visibility
/
position-timeseries
Per-entity position rank timeseries
curl --request POST \
  --url https://api.mentionlab.io/api/analytics/visibility/position-timeseries \
  --header 'Content-Type: application/json' \
  --header 'x-project-id: <x-project-id>' \
  --data '
{
  "bucketSize": "day",
  "startDate": "2025-01-01",
  "endDate": "2025-02-01",
  "country": "<string>",
  "language": "<string>",
  "models": [
    "<string>"
  ],
  "hasSources": true,
  "hasShopping": true,
  "queryTagIds": [
    "<string>"
  ],
  "execTagIds": [
    "<string>"
  ],
  "queryTagMode": "or",
  "execTagMode": "or",
  "groupByEntityGroup": false,
  "entityTypes": [
    "owned",
    "primary",
    "competitor"
  ],
  "entityIds": [
    "<string>"
  ]
}
'
[
  {
    "bucket": "2025-01-01T00:00:00.000Z",
    "displayKey": "550e8400-e29b-41d4-a716-446655440000",
    "displayName": "Acme Corp",
    "isOwned": true,
    "isPrimary": true,
    "isCompetitor": false,
    "avgPositionRank": 2.5,
    "presentIn": 18
  }
]

Headers

x-project-id
string
required

Project ID to specify the project context

Body

application/json
bucketSize
enum<string>
required

Time bucket granularity

Available options:
day,
week,
month
Example:

"day"

startDate
string

Start date (inclusive)

Example:

"2025-01-01"

endDate
string

End date (exclusive)

Example:

"2025-02-01"

country
string

Filter by country code

language
string

Filter by language code

models
string[]

Filter by AI models

hasSources
boolean

Filter by responses that have sources

hasShopping
boolean

Filter by responses that have shopping products

queryTagIds
string[]

Filter by query tag IDs

execTagIds
string[]

Filter by execution tag IDs

queryTagMode
enum<string>
default:or

Query tag matching mode: "or" matches ANY tag (default), "and" matches ALL tags.

Available options:
and,
or
execTagMode
enum<string>
default:or

Execution tag matching mode: "or" matches ANY tag (default), "and" matches ALL tags.

Available options:
and,
or
groupByEntityGroup
boolean
default:false

Collapse entities by entity_group (uses COUNT DISTINCT ai_response_id)

entityTypes
enum<string>[]

Filter which entity types to include in results. Accepted values: "owned", "primary", "competitor". Defaults to all types when omitted.

Available options:
owned,
primary,
competitor
Example:
["owned", "primary", "competitor"]
entityIds
string[]

Filter to specific entity IDs (result-only, does not affect denominator)

Response

200 - application/json
bucket
string
required

Start of the time bucket (ISO 8601).

Example:

"2025-01-01T00:00:00.000Z"

displayKey
string
required

Canonical entity ID (or entity group ID in grouped mode).

Example:

"550e8400-e29b-41d4-a716-446655440000"

displayName
string
required

Entity display name.

Example:

"Acme Corp"

isOwned
boolean
required

Whether the entity is project-owned.

Example:

true

isPrimary
boolean
required

Whether this is the primary project entity.

Example:

true

isCompetitor
boolean
required

Whether this is a competitor entity.

Example:

false

avgPositionRank
number
required

Weighted average position rank in this bucket. Lower = earlier in AI responses. 0 when no position data or entity not mentioned in this bucket.

Example:

2.5

presentIn
number
required

Number of AI responses mentioning this entity in this bucket.

Example:

18