visitors
Follow one visitor
The full journey of a single visitor: every page, every event with its properties, scroll depth, payments and exact durations. Pseudonymous throughout, and the same key you already have in your CSV exports.
/api/v1/sites/{id}/visitors| Param | Type | Description |
|---|---|---|
| goal | string | Event that qualifies a journey. Default: purchase. |
| range | string | 7d, 30d, 90d… Default follows your dashboard. |
| limit | number | 1 to 200. Default 50. |
/api/v1/sites/{id}/visitors/{uid}| Param | Type | Description |
|---|---|---|
| uidreq | string | Either the visitorId from a CSV export (12 hex characters), or a raw reference captured with window.datalenk.ref. |
Coming from a CSV export
Every row of an export carries a visitorId. Paste it into this endpoint as-is, with no transformation: the short hash and the raw reference both resolve to the same journey. That is the bridge between an aggregate export and one person's path through your site.
# a row from events.csv ends with: …,49,USD,,a3f9c1d20e7b curl "https://datalenk.com/api/v1/sites/3/visitors/a3f9c1d20e7b" \ -H "Authorization: Bearer dlk_live_…"
Event properties
Each custom event in the timeline carries the properties you sent with it. If your affiliate clicks ship a merchant, a placement or a product id, you get them here, in the order the visitor produced them.
{
"data": {
"name": "Quiet Otter",
"channel": "Organic Search",
"pageviews": 4,
"events": 2,
"revenue": 0,
"timeline": [
{ "type": "pageview", "pathname": "/best-road-bikes", "at": "2026-08-15T09:12:04Z" },
{ "type": "event", "event_name": "affiliate_click", "at": "2026-08-15T09:14:41Z",
"props": { "merchant": "decathlon", "placement": "featured_card", "product_id": "bike-123" } }
]
}
}What is never returned
No IP address, no raw session or user id, no email. The display name ("Quiet Otter") is generated from the pseudonymous key and identifies nobody. A journey is a path through your site, not a person.