Links · links.history
GET/links/{id}/historylinks.history
Get a link’s change history
The changes made to a link after it was created, newest first.
- Base URL
- https://api.redirhub.com/v1
- Auth
- Bearer token
- Idempotent
- Yes
- Returns
- application/json
The request
Call GET /links/{id}/history with your bearer token. The id path segment identifies the record.
# Get a link’s change history
curl "https://api.redirhub.com/v1/links/9f2a7c31-4b8e-4a02-9d1f-0c6b7e5a1d44/history" \
-H "Authorization: Bearer $REDIRHUB_TOKEN"Path parameters
| Parameter | Description |
|---|---|
| idRequiredstring |
The response
A 200 carries the payload inside a data array — the same shape the list endpoints return, so one parser handles both.
{
"data": [
{
"id": "9f2a7c31-4b8e-4a02-9d1f-0c6b7e5a1d44",
"old": {
"destination": [
"https://acme.com/campaigns/spring"
],
"utm": {
"field": "string"
},
"type": "link",
"status": "301",
"password": true
},
"new": {
"destination": [
"https://acme.com/campaigns/spring"
],
"utm": {
"field": "string"
},
"type": "link",
"status": "301",
"password": true
},
"actor": {
"id": "9f2a7c31-4b8e-4a02-9d1f-0c6b7e5a1d44",
"name": "Acme"
},
"source": "string",
"created_at": "2026-08-01T09:14:22Z"
}
],
"meta": {
"cursor": {
"current": null,
"prev": "string",
"next": "string",
"count": 1,
"total": 1
}
}
}Status codes
200
SuccessThe changes made to the record after it was created, newest first, one entry per change.
old and new hold only the fields that changed, keyed by field: destination (every destination, the primary one first; null while the record serves HTML), utm, type and status (active / paused). actor.name is who made the change as it read then: the user's name, or the API token's name when source is api. meta.cursor.total counts every change of the record. Reading the changes is the plan's audit log, from Pro up (feature security.audit); without it data is empty while meta.cursor.total still counts the changes, so the dashboard can show how many there are next to an upgrade prompt. Follow meta.cursor.next for the next page.401
UnauthenticatedUnauthenticated
429
Too many requestsToo many requests
What usually comes next
One call is rarely the whole job. These are the endpoints most integrations reach for around this one.
