Skip to content
RedirHub/API
Sign inGet API key
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

ParameterDescription
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.