Skip to main content
PATCH

Authorizations

Authorization
string
header
required

Your secret API key as a Bearer token: Authorization: Bearer vxn_sk_.... Keys are created and scoped in the dashboard - see Authentication.

Headers

Idempotency-Key
string

Recommended on PATCH and DELETE for safe retries.

Path Parameters

id
string
required

Location identifier (loc_ prefix).

Pattern: ^loc_[A-Za-z0-9]+$

Body

application/json

Partial update - only supplied fields change.

Address ↔ coordinates interplay (mirrors the dashboard: type an address → it geocodes → drag the pin to fine-tune):

  • address alone → the server geocodes it and updates coordinates + country. Ungeocodable → 422 address_not_geocodable.
  • coordinates alone → moves the pin only; address stays 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.

name
string

New display name.

Required string length: 1 - 60
address
string

New street address. Sent without coordinates, the server geocodes it.

Minimum string length: 1
coordinates
object

New pin position (both values required together). Sent without address, only the pin moves.

geo_message
string | null

New geo push text (max 500 chars), or null to clear.

Maximum string length: 500
geo_message_enabled
boolean

Toggle the geo notification. Text is preserved when toggling off.

enabled_card_ids
string[]

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.

Maximum array length: 100
Pattern: ^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.

id
string
required

Location identifier, loc_ prefix.

Pattern: ^loc_[A-Za-z0-9]+$
Example:

"loc_01HW9R4P2ZK7N8MTX1RVLOCS01"

object
string
required

Always "location".

Allowed value: "location"
name
string
required

Display name shown in the dashboard, scanner, and transaction attribution.

Required string length: 1 - 60
Example:

"Demo Coffee - City Center"

address
string | null
required

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).

Example:

"Hlavná 12, 811 01 Bratislava, Slovakia"

coordinates
object | null
required

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).

Example:
geo_message_enabled
boolean
required

Master switch for the geo notification at this location. The message text is kept when you toggle off.

Example:

true

enabled_card_ids
string[]
required

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).

Pattern: ^crd_[A-Za-z0-9]+$
Example:
cards
object[]
required

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.

team_members
object[]
required

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.

pos_connected
boolean
required

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.

Example:

true

is_default
boolean
required

The organization's default location (used when a write carries no explicit location_id and the org has exactly one candidate).

Example:

true

is_active
boolean
required

Read-only lifecycle flag. Deactivating a location is a billing action - dashboard only.

Example:

true

created_at
integer
required

Unix seconds.

Example:

1735689600

country
string | null

ISO 3166-1 alpha-2, derived from the geocoded address. Null while no address is set.

Example:

"SK"

geo_message
string | null

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.

Maximum string length: 500
Example:

"You're near Demo Coffee - your 10th coffee is on us today! ☕"

updated_at
integer

Unix seconds of last change.

Example:

1751500000