Skip to content

Links

All endpoints require links:read or links:write as noted.

GET /v1/links — scope links:read

Terminal window
curl https://api.neon.xengo.io/v1/links \
-H "Authorization: Bearer $XENGO_API_KEY"
{
"links": [
{
"code": "spring24",
"shortUrl": "https://go.acme.com/spring24",
"destination": "https://acme.com/spring-offer",
"status": "active",
"tags": { "campaign": "spring" },
"lastClickAt": "2026-07-12T11:20:00+00:00"
}
]
}

POST /v1/links — scope links:write

Field Type Notes
destination string, required Screened before the link goes live
code string Custom stub (≤64 chars); omit for auto
domain string One of your verified domains; omit for default
tags object Up to 25 key/value pairs
expiresAt ISO 8601 Visitors see a branded expiry page after this
notifyChannels string[] Channel ids to alert for this link
Terminal window
curl -X POST https://api.neon.xengo.io/v1/links \
-H "Authorization: Bearer $XENGO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"destination": "https://acme.com/spring-offer",
"code": "spring24",
"tags": { "campaign": "spring", "site": "leeds" },
"notifyChannels": ["4a0da012e0f56677"]
}'

GET /v1/links/{code} — scope links:read

PATCH /v1/links/{code} — scope links:write

The headline move: change destination and the live link — and any printed QR encoding it — re-points instantly. Also accepts status (active/disabled), tags, expiresAt, notifyChannels.

Terminal window
curl -X PATCH https://api.neon.xengo.io/v1/links/spring24 \
-H "Authorization: Bearer $XENGO_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "destination": "https://acme.com/summer-offer" }'

Destination updates are never metered, on any plan.

DELETE /v1/links/{code} — scope links:write

Terminal window
curl -X DELETE https://api.neon.xengo.io/v1/links/spring24 \
-H "Authorization: Bearer $XENGO_API_KEY"

Deletion is permanent (the code becomes available again). If you just want to stop traffic, PATCH the status to disabled instead — that’s reversible.