Location management and creation
Create a new location
Create a new location for the merchant. The location will be linked to the same company as the user's current active location.
Hierarchy Options:
- Standalone (default): Independent location with no parent
- Parent: Set
isRootCompany: trueto mark as a parent/root location - Child: Provide
parentLocationIdto create as a child of another location
Payout Account:
A payout account will be created with the specified PSP (STRIPE or ADYEN). For Adyen, billingEmail is required.
Required Fields:
name: Location name (1-255 characters)address: Street addresscity: City namecountry: Country code (e.g., SE, NO)psp: Payment Service Provider (STRIPE or ADYEN)
Permissions: 🟢 locations.create
Create a new location › Request Body
nameLocation name (1-255 characters)
addressStreet address
cityCity name
countryCountry code (e.g., SE, NO, DK)
pspPayment Service Provider for payout account (STRIPE or ADYEN)
parentLocationIdParent location ID (required for child locations)
locationTypeType of location in the organization hierarchy
isRootCompanySet to true to mark this as a parent/root company location
timezoneTimezone name (e.g., Europe/Stockholm). Defaults to parent location or company default.
currencyCurrency code (e.g., SEK). Defaults to parent location or company default.
zipZIP/postal code
billingEmailBilling email address (required if psp is ADYEN)
Create a new location › Responses
Default Response
statusGet a location by ID
Get detailed information about a specific location, including its feature toggles.
Features:
By default, the response includes all available features and their status for this location.
Set includeFeatures=false to exclude features from the response.
Response includes:
- Location details (name, address, timezone, currency, etc.)
- Feature toggles with enabled status and optional metadata
- Hierarchy information if applicable
Permissions: 🔵 locations.read
path Parameters
locationIdLocation ID
query Parameters
includeFeaturesInclude feature toggles in response (default: true)
Get a location by ID › Responses
Default Response
statusCheck if a feature is enabled for a location
Quick check if a specific feature is enabled for a location.
Use cases:
- Feature gating in UI components
- Conditional logic based on feature availability
- Quick feature checks without fetching full location data
Permissions: 🔵 locations.read
path Parameters
locationIdLocation ID
featureKeyFeature key to check (e.g., loyalty, kds, pos)
Check if a feature is enabled for a location › Responses
Default Response
statusGet location hierarchy tree
Get the location hierarchy tree starting from a specific location. Returns the location and all its descendants in a tree structure.
Permissions: 🔵 locations.read
path Parameters
locationIdRoot location ID to get hierarchy for
Get location hierarchy tree › Responses
Location hierarchy retrieved
statusGet location opening hours
Get opening hours for a location including weekly schedule, exceptions, and current open/closed status
path Parameters
locationId^[0-9]+$ · requiredLocation ID
Get location opening hours › Responses
Default Response
statusUpdate location opening hours
Update or create opening hours for a location. This replaces the entire schedule.
Permissions: 🟠schedules.update
path Parameters
locationId^[0-9]+$ · requiredLocation ID
Update location opening hours › Request Body
Opening hours for each day of the week. Days not provided will be left unchanged.
List of exceptions to set (replaces all existing exceptions)
Update location opening hours › Responses
Default Response
statusDelete location opening hours
Remove opening hours for a location (makes it always open)
Permissions: 🔴 schedules.delete
path Parameters
locationId^[0-9]+$ · requiredLocation ID
Delete location opening hours › Responses
Default Response
statusGet pickup settings for a location
Get pickup settings and exceptional sale times for a location.
Response includes:
pickupSettings: Configuration for time slot selection (enabled, days in advance)exceptionalSaleTimes: Special dates with modified hours or closures (holidays, events, etc.)
Use cases:
- Displaying time slot picker in checkout flow
- Determining if pickup time selection is available
- Showing modified hours for upcoming dates
Permissions: 🔵 locations.read
path Parameters
locationIdLocation ID
Get pickup settings for a location › Responses
Default Response
statusGet QR codes for a location
Get all active QR codes (tables) for a location.
Response includes:
- Array of QR codes with uuid and name
- Only active QR codes are returned
- Sorted alphabetically by name
Use cases:
- Displaying table selection in storefront
- Managing table orders
- QR code scanning for dine-in orders
Permissions: 🔵 locations.read
path Parameters
locationIdLocation ID
Get QR codes for a location › Responses
Default Response
statusList of QR codes for the location
Set parent location
Set or change the parent location for a location. This updates the location hierarchy and refreshes the materialized access view.
Permissions: 🟠locations.update
path Parameters
locationIdLocation ID to update
Set parent location › Request Body
parentLocationIdParent location ID (null to make root location)
Set parent location › Responses
Location parent updated successfully
statusUpdate location settings
Update settings for a specific location. Supports partial updates - only provided fields will be updated.
Supported fields:
phone: Phone number (set to null to clear)website: Website URL (set to null to clear, max 248 chars)description: Location description (set to null to clear, max 1000 chars)pickupInformation: Pickup information textcontext: Location context JSON (features, configuration, etc.)isItemCommentAllowed: Whether item comments are allowedorderPlacements: Order placement configuration per channelpaymentFlow: Default payment flow (open_taborpay_upfront, set to null to clear)defaultPreparationTimeSeconds: Default preparation timetakeawayEnabled: Whether takeaway is enabledautoacceptMinutesBeforePickup: Minutes before pickup for auto-acceptpickupTimeEnabled: Whether time slot selection is enabledpickupDaysInAdvanceAllowed: Days in advance for pickup time selection
Permissions: 🟠locations.update
path Parameters
locationIdLocation ID
Update location settings › Request Body
phonePhone number
websiteWebsite URL
descriptionLocation description
pickupInformationPickup information text
Location context (JSON)
isItemCommentAllowedWhether item comments are allowed
orderPlacementsOrder placement configuration per channel
Default payment flow for this location
defaultPreparationTimeSecondsDefault preparation time in seconds
takeawayEnabledWhether takeaway is enabled
autoacceptMinutesBeforePickupMinutes before pickup when orders are automatically accepted
pickupTimeEnabledWhether time slot selection is enabled
pickupDaysInAdvanceAllowedNumber of days in advance customers can select pickup time
Default VAT rate ID for takeaway orders
logoImageUrlURL of the location logo image (empty string or null to clear)
featureImageUrlURL of the location feature/background image (empty string or null to clear)
Analytics business-day rollover, in minutes from local-time midnight (Europe/Stockholm), 0-1439. null = midnight rollover. Affects /analytics display only — SIE, payouts, receipts use the legal calendar day.
Update location settings › Responses
Default Response
statusGet location storefront data
Get comprehensive storefront data for a location by its ID.
Response includes:
- Location details (name, address, coordinates, contact info)
- Current sale status and times
- Opening hours (weekly hours, exceptions, schedule ID)
- Theme and branding configuration
- Feature flags and settings
- Loyalty program information
- Extended waiting time (if set)
This returns the same enriched data as the slug-based endpoint, but uses the numeric location ID.
Permissions: 🔵 locations.read
path Parameters
locationIdLocation ID
Get location storefront data › Responses
Default Response
statusGet a location's voucher provider and display name
Returns the location's voucher provider type and a ready-to-render display name.
Behavior:
voucher_provider='trivec'→providerDisplayName: 'Trivec'(hardcoded, never leaks voucherService)voucher_provider='custom'with valid displayName →providerDisplayName: <settings.displayName>voucher_provider='custom'with displayName containing the forbidden third-party vendor substring (case-insensitive) →providerDisplayName: null- No integration_configs row OR
voucher_provider IS NULL→{ voucherProvider: 'karma', providerDisplayName: null }
Permissions: 🔵 locations.read
path Parameters
locationId^[0-9]+$ · requiredLocation ID
Get a location's voucher provider and display name › Responses
Default Response
statusmetaUpdate voucher provider configuration for a location
Upserts integration_configs.voucher_provider and settings in a single transaction.
Body is a tagged union by provider:
{ provider: 'karma' }— switch back to native Karma vouchers (no settings){ provider: 'trivec' }— enable Trivec; credentials are provisioned out-of-band, never via merchant PUT (CRED-02){ provider: 'custom', settings: {...} }— configure a custom HTTP voucher provider
Server-side behaviour:
- Custom provider secrets are AES-256-CBC encrypted server-side; plaintext is expected in the request body over HTTPS.
- Requests containing the forbidden third-party vendor substring (case-insensitive) in any string value are rejected with 400 before reaching the DB.
- In-flight voucher reservations or a non-empty DLQ block provider switches with 409 to prevent double-spend.
Permissions: 🟠locations.update
path Parameters
locationId^[0-9]+$ · requiredLocation ID
Update voucher provider configuration for a location › Request Body
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = object · requires: provider | |
| type = object · requires: provider | |
| type = object · requires: provider, settings |
providerUpdate voucher provider configuration for a location › Responses
Default Response
statusTest connectivity to the configured Trivec voucher provider
Calls Trivec /voucher/services via integrations-service using the currently-saved config.
Behaviour:
- Persists
last_tested_atandlast_test_reachableon integration_configs. - Non-Trivec providers return 400 INVALID_PROVIDER_FOR_TEST.
- Does not emit platform_events (D-08).
Permissions: 🟠locations.update
path Parameters
locationId^[0-9]+$ · requiredLocation ID
Test connectivity to the configured Trivec voucher provider › Responses
Default Response
statusGet location by slug
Get comprehensive location information by its URL slug.
Response includes:
- Location details (name, address, coordinates, contact info)
- Current sale status and times
- Opening hours (weekly hours, exceptions, schedule ID)
- Theme and branding configuration
- Feature flags and settings (discounts, scan-to-tab, split items, etc.)
- Loyalty program information
- Extended waiting time (if set)
This is the primary endpoint for storefront applications to fetch location data. The slug is the URL-friendly identifier for the location (e.g., "joes-pizza").
Permissions: 🔵 locations.read
path Parameters
slugLocation URL slug (e.g., "joes-pizza")
Get location by slug › Responses
Default Response
statusWebhook: Location operating hours updated
Broadcast when a schedule rule for a location changes — lets storefronts and clients refresh open/closed status.
This is an outbound webhook event. Karma POSTs this payload to the URL you registered via POST /api/v1/webhooks/subscriptions. Your endpoint should respond 2xx within 30 seconds to acknowledge delivery.
Webhook: Location operating hours updated › Request Body
idUnique webhook delivery ID
eventresourceresourceIdString ID of the affected resource
timestampISO 8601 timestamp when the event was emitted
apiVersionWebhook: Location operating hours updated › Responses
Acknowledged. Karma considers any 2xx response a successful delivery; non-2xx triggers retry with exponential backoff.