Integrate in an afternoon
Tell Interlink Wallet when your data changes. It works out which passes are affected, what they should now say, and how to deliver the update to every device, safely and exactly once.
POST /v1/events
Send the current values for one holder. You do not need to know which passes exist or which platforms they are on; we handle that.
holder_ref: your own identifier for the person, up to 128 characters.template: the pass template to update, by its short name.type: a label for your own records, such ascommission.cleared.data: the values your field map reads, as a JSON object.
POST /v1/events HTTP/1.1 Host: wallet.interlink.digital Authorization: Bearer iw_live_... Idempotency-Key: booking-88213-v3 Content-Type: application/json { "holder_ref": "client-5521", "template": "appointment", "type": "booking.rescheduled", "data": { "pet": "Biscuit", "starts_at": "2026-10-02T09:30:00Z" } }
Predictable, retry-friendly results
Errors follow RFC 9457 problem details, and every response carries a request ID you can quote to us.
| Status | Meaning | What to do |
|---|---|---|
| 202 Accepted | Event stored and queued; passes update within seconds | Nothing |
| 200 OK | Same Idempotency-Key seen before; the original event is returned | Nothing, this is safe |
| 400 / 415 | Missing Idempotency-Key, invalid JSON or wrong content type | Fix the request |
| 401 | Missing, revoked or wrong-environment key, or missing scope | Check the key and its scopes |
| 413 | Event larger than 256 KB | Send only the fields your passes use |
| 422 | The event failed validation; the detail explains why | Fix the data |
| 429 | Rate limit reached; Retry-After says when to try again | Back off and retry |
Configuration, never code
A field map says where each value comes from and how to format it. It is plain JSON with a closed set of formats, so it can be validated, versioned and previewed, and it can never run arbitrary code.
| Format | Example output |
|---|---|
| currency | £1,234.50 · 1.234,50 € · $0.99 |
| integer / decimal | 12,480 · 4.50 |
| date / datetime | 1 Aug 2026 · 1 Aug 2026, 14:30 |
| relative_date | Today · Tomorrow, 10:30 |
| text / enum | M365-NC21 · Gold tier |
{
"header": {
"label": "Earned",
"path": "$.earned_pence",
"format": "currency", "currency": "GBP",
"notify": { "on": "increase",
"message": "Commission cleared: {delta}" }
},
"fields": [
{ "id": "pending", "label": "Pending",
"path": "$.pending_pence",
"format": "currency", "currency": "GBP" }
]
}
Secure defaults
Scoped API keys
Separate test and live keys, each limited to the scopes it needs. Keys are shown once, stored only as hashes and can be revoked instantly.
Idempotency
Every event needs an Idempotency-Key of 8 to 128 characters. Reusing a key returns the original result instead of creating a duplicate.
Rate limits
Generous per-organisation limits with standard Retry-After headers. Contact us before a large backfill and we will plan it with you.
On the developer roadmap
Full REST API
Passes, holders, templates and brands.
Signed webhooks
Installed, removed, scanned and redeemed.
SDKs
PHP and TypeScript first, Python next.
Developer portal
Interactive docs, quickstarts and sandbox keys.
Build with us
Request a sandbox tenant and a test key, and we will help you ship your first live pass.