Account
What this key is and what it reaches.
Part of the API reference, version 2026-10. Every address below starts with the base address:
https://app.matrixrewards.co.uk/api/2026-10
The account this key belongs to, its stores, and the key's own scopes
GET /me — the full address is https://app.matrixrewards.co.uk/api/2026-10/me.
Needs: any valid key; no permission needed.
Needs no scope beyond a valid key: a client's first call should not have to guess what it may do.
The answer
The account, its stores and this key.
| Field | Type | Always there | What it is |
|---|---|---|---|
api_version | string | yes | — |
account | object, or null | yes | — |
account.id | string | yes | — |
account.name | string | yes | — |
account.wallet_scope | one of site, account | yes | 'account' means one balance shared across the account's stores. |
account.created_at | string | yes | — |
stores | list of object (Store) | yes | — |
stores[].key | string | yes | — |
stores[].name | string | yes | — |
stores[].platform | string | yes | 'shopify' today; the engine ingests events, so another platform is another producer. |
stores[].external_ref | string, or null | yes | That platform's own identifier — a myshopify domain, for instance. |
stores[].created_at | string | yes | — |
stores[].display_name | string | yes | The store's name as every page shows it: the design's storeName, else the name Shopify has for the shop now, else the name it was installed with. name stays the name it was installed with. |
key | object | yes | — |
key.id | string | yes | — |
key.name | string | yes | — |
key.mode | one of live, test | yes | — |
key.scopes | list of Scope values | yes | — |
key.agent | boolean | yes | Tagged by the merchant as being for an AI assistant. |
key.limits_lifted | boolean | yes | True when the merchant has lifted this assistant key's fixed limits on the API keys screen of the Matrix Rewards app: its programme changes are then not held to the assistant limits (what a point is worth, expiry, one step a day). It still needs a preview's confirmation for every change, and still cannot manage webhooks. Only a person can lift or restore the limits, in the app; no API call can. Always false for a key that is not for an assistant. |
key.used_previous_secret | boolean | yes | True when this call used the previous secret during a rotation grace window. |
rate_limit | object | yes | — |
rate_limit.limit | integer | yes | — |
rate_limit.remaining | integer | yes | — |
rate_limit.reset | integer | yes | Unix seconds at which the bucket is full again. |
Headers on the answer: Request-Id, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset. What each header means.
Example
curl "https://app.matrixrewards.co.uk/api/2026-10/me" \
-H "Authorization: Bearer $MATRIX_API_KEY"
The answer:
{
"api_version": "2026-10",
"account": {
"id": "acc_example",
"name": "Example Retail Ltd",
"wallet_scope": "site",
"created_at": "2026-08-03T09:12:00Z"
},
"stores": [
{
"key": "example-outlet",
"name": "Example Outlet",
"platform": "shopify",
"external_ref": "example-outlet.myshopify.com",
"created_at": "2026-08-20T14:30:00Z",
"display_name": "Example Outlet"
},
{
"key": "example-store",
"name": "Example Store",
"platform": "shopify",
"external_ref": "example-store.myshopify.com",
"created_at": "2026-08-03T09:12:00Z",
"display_name": "Example Store"
}
],
"key": {
"id": "Kx7Qp2Lm9Vt4Rz8N",
"name": "Nightly export",
"mode": "live",
"scopes": [
"manage_keys",
"read_audit",
"read_members",
"read_programme",
"read_reports",
"read_usage",
"write_members",
"write_webhooks"
],
"agent": false,
"limits_lifted": false,
"used_previous_secret": false
},
"rate_limit": {
"limit": 120,
"remaining": 119,
"reset": 1789552801
}
}
Other answers
| Status | What it means | Error pages |
|---|---|---|
| 401 | unauthenticated: no usable API key was presented. Malformed, unknown, revoked and wrong-secret are one answer. | unauthenticated |
| 429 | rate_limited: too many requests for this key; bucket says which allowance. Retry-After says how long to wait. | rate_limited |
The API keys on this account
GET /keys — the full address is https://app.matrixrewards.co.uk/api/2026-10/keys.
Needs: the manage_keys permission (in the app: “The list of your keys (not their secrets)”).
Never the secret half: the row keeps a keyed hash of it. A key whose plaintext was lost is rotated, not recovered. Keys are created, rotated and revoked in the app's API keys screen, behind a Shopify staff session — no scope mints a key, because a key that could mint keys could widen its own reach.
The answer
The keys.
| Field | Type | Always there | What it is |
|---|---|---|---|
data | list of object | yes | — |
data[].id | string | yes | — |
data[].name | string | yes | — |
data[].mode | one of live, test | yes | — |
data[].scopes | list of Scope values | yes | — |
data[].agent | boolean | yes | — |
data[].limits_lifted | boolean | yes | True when the merchant has lifted this assistant key's fixed limits in the app (see Me.key.limits_lifted). |
data[].created_at | string | yes | — |
data[].last_used_at | string, or null | yes | — |
data[].revoked_at | string, or null | yes | — |
data[].rotation_grace_until | string, or null | yes | — |
has_more | boolean | yes | — |
next_cursor | string, or null | yes | — |
Headers on the answer: Request-Id, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset. What each header means.
Example
curl "https://app.matrixrewards.co.uk/api/2026-10/keys" \
-H "Authorization: Bearer $MATRIX_API_KEY"
The answer:
{
"data": [
{
"id": "Kx7Qp2Lm9Vt4Rz8N",
"name": "Nightly export",
"mode": "live",
"scopes": [
"manage_keys",
"read_audit",
"read_members",
"read_programme",
"read_reports",
"read_usage",
"write_members",
"write_webhooks"
],
"agent": false,
"limits_lifted": false,
"created_at": "2026-09-01T08:00:00Z",
"last_used_at": "2026-09-16T10:00:00Z",
"revoked_at": null,
"rotation_grace_until": null
}
],
"has_more": false,
"next_cursor": null
}
Other answers
| Status | What it means | Error pages |
|---|---|---|
| 401 | unauthenticated: no usable API key was presented. Malformed, unknown, revoked and wrong-secret are one answer. | unauthenticated |
| 403 | forbidden_scope: the key does not carry the scope this call needs; required_scope says which. | forbidden_scope |
| 429 | rate_limited: too many requests for this key; bucket says which allowance. Retry-After says how long to wait. | rate_limited |
Stop the key making this request, immediately
POST /keys/self/revoke — the full address is https://app.matrixrewards.co.uk/api/2026-10/keys/self/revoke.
Needs: any valid key; no permission needed.
Needs no scope: presenting the key is the authorisation. It takes no identifier, so it cannot revoke any key but the one signing the request — which is what makes it safe to leave unscoped. Use it the moment a key is believed to have leaked; a merchant can also revoke any key from the app's API keys screen. The revoke and its audit entry are one transaction, and so is deleting every webhook endpoint the key created (webhook.delete for each, with the reason and the key's id).
The answer
The key is revoked. It will not authenticate again.
| Field | Type | Always there | What it is |
|---|---|---|---|
ok | boolean | yes | — |
key_id | string | yes | — |
revoked_at | string | yes | — |
Headers on the answer: Request-Id. What each header means.
Example
curl -X POST "https://app.matrixrewards.co.uk/api/2026-10/keys/self/revoke" \
-H "Authorization: Bearer $MATRIX_API_KEY"
The answer:
{
"ok": true,
"key_id": "3D1wN9KfD8595Al5",
"revoked_at": "2026-09-16T10:00:00Z"
}
Other answers
| Status | What it means | Error pages |
|---|---|---|
| 401 | unauthenticated: no usable API key was presented. Malformed, unknown, revoked and wrong-secret are one answer. | unauthenticated |
| 404 | not_found: this key was revoked a moment ago, by another request. | not_found |
| 429 | rate_limited: too many requests for this key; bucket says which allowance. Retry-After says how long to wait. | rate_limited |