Endpoints and scopes
| Request | Scope |
|---|---|
POST /link-codes |
none |
GET /link-codes/{code} |
none |
GET /links |
none |
GET /links/{link_id} |
none |
DELETE /links/{link_id} |
none |
The idea
You reach no merchant’s data without their consent. Consent is given with a link code your system issues and the merchant enters in their AurMap account.
- Your system asks for a code for one of its branches.
- You show the code to the merchant as text or a QR in your back office.
- The merchant scans it from their AurMap account, picks the place, reviews the scopes and approves. Only someone holding the “AurMap and integrations” permission in the merchant’s account can approve.
On the approval screen the merchant sees your verified partner name and logo from the developer dashboard, not the external_location_name you send. That way nobody can pose as another partner.
4. You receive link.created.
A code is valid for 15 minutes and works once.
Scopes
| Scope | Allows |
|---|---|
catalog:write |
publishing the menu, and later products |
inventory:write |
sold out, pause, temporary prices, stock |
orders:read |
receiving and reading order events |
orders:write |
accepting, rejecting, moving and cancelling orders; pausing ordering at the place |
offers:write |
publishing offers Coming soon |
accounting:read |
daily accounting and payouts Coming soon |
customer:contact |
the customer’s full mobile number in orders and events; without it the number arrives masked, like +9665••••••01 |
There are seven scopes. The merchant grants customer:contact with a separate consent, to protect customers’ personal data under the Personal Data Protection Law. Ask for it only if your system needs it, such as a loyalty programme that matches customers by number. Before you can ask for it, our team approves your account for it, and the merchant sees the purpose you declared on the approval screen.
Ask only for what you need. The merchant sees the list before approving.
Link level
| Level | Covers | For |
|---|---|---|
place |
one place: the main place or one branch | POS, e-menus and shops |
merchant |
every place of the merchant, now and later | accounting systems; allows only accounting:read and orders:read |
A place has one menu source. If the merchant links a place that already has another source, we ask them which one stays. A place never has two sources at once.
Issue a link code
POST /link-codes
| Field | Type | Required | Description |
|---|---|---|---|
level |
place or merchant |
yes | link level |
external_location_id |
string | with place |
the branch id in your system, up to 64 chars of [A-Za-z0-9_.-], no colon : |
external_location_name |
string | no | a name the merchant sees when approving |
scopes |
list | yes | requested scopes |
aurmap POST /v1/link-codes '{"level":"place","external_location_id":"pos-branch-17","external_location_name":"Al Rayhan, Olaya","scopes":["catalog:write","inventory:write","orders:read","orders:write"]}'201
{
"code": "7KQ2M9XA",
"display_code": "7KQ2-M9XA",
"qr_url": "https://aurmap.com/link/7KQ2M9XA",
"qr_png_url": "https://partners.aurmap.com/v1/link-codes/7KQ2M9XA/qr.png",
"status": "pending",
"expires_at": "2026-10-14T12:15:00Z"
}Show display_code as it is, or a QR that opens qr_url. The code is 8 letters and digits with no I, L, O or U, so merchants do not mistype it.
const code = await aurmap('POST', '/v1/link-codes', {
level: 'place',
external_location_id: 'pos-branch-17',
external_location_name: 'Al Rayhan, Olaya',
scopes: ['catalog:write', 'inventory:write', 'orders:read', 'orders:write'],
});
showToMerchant(code.display_code, code.qr_url);$code = aurmap('POST', '/v1/link-codes', [
'level' => 'place',
'external_location_id' => 'pos-branch-17',
'external_location_name' => 'Al Rayhan, Olaya',
'scopes' => ['catalog:write', 'inventory:write', 'orders:read', 'orders:write'],
]);Follow a code
The link.created event is enough. To show the merchant the result right away, ask about the code:
aurmap GET /v1/link-codes/7KQ2M9XA{ "code": "7KQ2M9XA", "status": "redeemed", "link_id": "lnk_2h6j4n" }Statuses: pending, redeemed, expired, declined.
The link object
{
"link_id": "lnk_2h6j4n",
"mode": "live",
"level": "place",
"merchant": { "merchant_id": "mer_5r8k2d", "name": "مطعم الريحان" },
"place": { "place_id": "plc_9q3w7e", "name": "الريحان - العليا" },
"external_location_id": "pos-branch-17",
"scopes": ["catalog:write", "inventory:write", "orders:read", "orders:write"],
"created_at": "2026-10-14T12:03:11Z",
"removed_at": null
}| Request | Description |
|---|---|
GET /links |
all your links, paged |
GET /links/{link_id} |
one link |
DELETE /links/{link_id} |
unlink from your side |
Adding a scope
Issue a new code with every scope you want, old and new. When the merchant approves, the same link is updated and you receive link.updated. No scope is added without the merchant.
Unlinking
- The merchant can remove the link at any time from their account.
- You can remove it with
DELETE /links/{link_id}. - Either way you receive
link.removed, withremoved_by:merchant,partneroraurmap.
aurmap DELETE /v1/links/lnk_2h6j4n{ "link_id": "lnk_2h6j4n", "removed_at": "2026-10-20T08:00:00Z", "removed_by": "partner" }After unlinking:
- Any call on that place answers
410 LINK_REMOVED. - Your menu leaves the place page within a minute.
- Orders that arrived before the unlink can still be finished for 24 hours, so nothing is stranded in a kitchen.
Common errors
| Code | Meaning |
|---|---|
LINK_CODE_EXPIRED |
the code expired; issue a new one |
LINK_CODE_USED |
the code was already used |
LOCATION_ALREADY_LINKED |
this branch in your system is linked to another place |
LINK_REQUIRED |
you have no link to this place |
SCOPE_MISSING |
the link lacks the required scope |
LINK_REMOVED |
the link was removed |