Update a location
Edits a location. Scope: locations:write.
What’s writable - and what owns the rest
| You can change | Owner of the rest |
|---|---|
name | - |
address / coordinates (interplay below) | - |
geo_message, geo_message_enabled | - |
enabled_card_ids (SET - toggle cards on/off) | - |
| POS mapping | Dashboard Integrations flow - never via API |
| Team assignment | PATCH /v1/team_members/{id} (location_ids) |
Lifecycle (is_active) & billing | Dashboard - each location is a billing unit |
Address ↔ coordinates
Mirrors the dashboard (type address → geocode → drag pin to fine-tune):
addressalone → server geocodes →coordinates+countryupdate. Ungeocodable →422 address_not_geocodable.coordinatesalone → the pin moves, the displayed address stays - the “drag to fine-tune” gesture as an API call.- Both → stored exactly as sent, no geocode (you already resolved them - this is what the dashboard submits).
Card toggles
enabled_card_ids is SET semantics: send the complete list you want active. Enabling a card pushes this location’s geofence onto that card’s wallet passes; disabling removes it and the card stops appearing in cards[] (its signup URL for this location stops accepting signups). Unknown card → 422 card_not_found. A location must keep at least one card enabled (422 location_needs_card; delete the location instead). A card must stay enabled at at least one location: disabling it at its last one returns 422 card_needs_location (pause the card to stop offering it; a paused or archived card with members also keeps one location so they can still redeem).
Authorizations
Your secret API key as a Bearer token: Authorization: Bearer vxn_sk_.... Keys are created and scoped in the dashboard - see Authentication.
Headers
Recommended on PATCH and DELETE for safe retries.
Path Parameters
Location identifier (loc_ prefix).
^loc_[A-Za-z0-9]+$Body
Partial update - only supplied fields change.
Address ↔ coordinates interplay (mirrors the dashboard: type an address → it geocodes → drag the pin to fine-tune):
addressalone → the server geocodes it and updatescoordinates+country. Ungeocodable →422 address_not_geocodable.coordinatesalone → moves the pin only;addressstays as displayed (the "drag to fine-tune" gesture).- Both → stored exactly as sent, no geocoding (you already resolved them).
Everything else on the location (POS mapping, team assignment, lifecycle, billing) has its own owner and is not writable here.
New display name.
1 - 60New street address. Sent without coordinates, the server geocodes it.
1New pin position (both values required together). Sent without address, only the pin moves.
New geo push text (max 500 chars), or null to clear.
500Toggle the geo notification. Text is preserved when toggling off.
SET semantics - the full list of cards active at this location after the update. A card id not in your organization → 422 card_not_found. Enabling pushes this location's geofence onto the card's passes; disabling removes it.
100^crd_[A-Za-z0-9]+$Response
Updated location (full object echoed).
A physical store - the unit of POS bridging, team assignment, geo notifications, and per-location card availability. Locations are created and deleted in the dashboard only (each is a billing unit); the API reads and edits them.
Location identifier, loc_ prefix.
^loc_[A-Za-z0-9]+$"loc_01HW9R4P2ZK7N8MTX1RVLOCS01"
Always "location".
"location"Display name shown in the dashboard, scanner, and transaction attribution.
1 - 60"Demo Coffee - City Center"
Human-readable street address, one line. Writable - see PATCH for the address ↔ coordinates interplay (sending a new address alone re-geocodes the pin server-side).
"Hlavná 12, 811 01 Bratislava, Slovakia"
The pin - drives the wallet-pass geofence and map display. Kept in sync with address by geocoding, or set directly to fine-tune (the API equivalent of dragging the map pin).
Master switch for the geo notification at this location. The message text is kept when you toggle off.
true
Which card templates are active at this location - the writable source of truth behind cards[]. PATCH with SET semantics to toggle cards on/off. Enabling a card also pushes this location's geofence onto that card's wallet passes (Apple Wallet caps geofences at 10 locations per pass).
^crd_[A-Za-z0-9]+$Read-only expansion of enabled_card_ids - only the cards turned ON at this location, each with its per-(card, location) signup_url. The URL is long-lived and never rotates: render your own QR from it for counter cards and window decals. Customers who sign up through it get this location stamped as Customer.signup_location_id. Distinct from the per-customer claim_url (wallet handoff).
Deliberately NOT the full org catalog with on/off flags: embedding every card template in every location response would bloat list calls and go stale as templates are added. To build a toggle UI like the dashboard's, join two clean resources: GET /v1/cards (the full catalog) against this location's enabled_card_ids (the on/off state). To toggle, PATCH enabled_card_ids with the new SET.
Read-only summary of who is assigned here. The write path is PATCH /v1/team_members/{id} with location_ids - one relationship, one owner; this is the location-side read.
True when this location has a live POS bridge - sales at the till flow in automatically as source: "pos" transactions. Boolean by design: the one integration decision this flag serves is "do I need to push transactions via the API, or does the till already report them?". The POS vendor, connection ids, and mapping details are internal (vendor privacy) and dashboard-owned - they are never surfaced or editable via API.
true
The organization's default location (used when a write carries no explicit location_id and the org has exactly one candidate).
true
Read-only lifecycle flag. Deactivating a location is a billing action - dashboard only.
true
Unix seconds.
1735689600
ISO 3166-1 alpha-2, derived from the geocoded address. Null while no address is set.
"SK"
The push text shown on the customer's lock screen when they come near this location (wallet-pass geofencing; the trigger radius is fixed by Apple/Google at roughly 100 m - not configurable). Null = no message configured. Only fires while geo_message_enabled is true.
500"You're near Demo Coffee - your 10th coffee is on us today! ☕"
Unix seconds of last change.
1751500000