Multi-Merchant Terminals
Set up shared payment terminals for multiple merchants using the Multi-Merchant Group API. Ideal for food courts, events, and co-located businesses.
Overview
A multi-merchant terminal allows several independent businesses to accept payments through a single physical device. Each merchant retains its own merchant account — orders, transactions, and payouts are routed individually — but they share the same hardware.
This setup is designed for scenarios where multiple vendors operate in close proximity and dedicated terminals per merchant would be impractical or cost-prohibitive. The Multi-Merchant Group API lets partners create a group, onboard merchants into it, and register shared devices.
Use Cases
| Scenario | Description |
|---|---|
| Food courts | Multiple food vendors in a shopping centre share terminals at a central checkout or at individual stalls. |
| Music festivals and events | Pop-up vendors at concerts, markets, or festivals share a limited pool of terminals. Each vendor’s sales are tracked and settled separately. |
| Co-working retail spaces | Small businesses sharing a physical storefront use the same terminal while keeping financials separate. |
| Seasonal markets | Temporary setups like Christmas markets or farmers’ markets where deploying one terminal per vendor is impractical. |
Setup Flow
Setting up multi-merchant terminals involves three steps:
- Create a multi-merchant group — Establishes the shared group and generates a group-level merchant and store.
- Add merchants to the group — Onboard individual businesses and link them to the group.
- Register a terminal — Assign a physical device to the group so all linked merchants can process payments.
After setup, each merchant creates orders using their own merchantId, but the payment is processed on the shared terminal.
Step 1: Create a Multi-Merchant Group
Create the group under your partner account. This generates a group-level merchantId and storeId that you will use when registering shared terminals.
POST /partners/{partnerId}/multi-merchant
Request:
{
"country": "SE",
"zipCode": "123456",
"name": "Central Food Court",
"email": "foodcourt@example.com"
}
| Parameter | Type | Required | Description |
|---|---|---|---|
country | string | Yes | Two-letter ISO country code in uppercase (e.g., SE, DK, NO). |
zipCode | string | Yes | ZIP/postal code of the shared location. |
name | string | No | Human-readable name for the group (e.g., “Stockholm Food Hall”). |
email | string | No | Contact email for the multi-merchant group. |
Response:
{
"status": "SUCCESS",
"data": {
"applicationId": "app_mm_a1b2c3",
"merchantId": "8353ffb4664d900d0e",
"storeId": "str_mm_d4e5f6"
},
"message": "Multi-merchant group created successfully"
}
| Parameter | Type | Description |
|---|---|---|
status | string | SUCCESS or ERROR. |
data.applicationId | string | Use this ID to track the status of the group creation request. |
data.merchantId | string | Group-level merchant ID. Use this when registering shared terminals (Step 3). |
data.storeId | string | Group-level store ID. Use this when registering shared terminals (Step 3). |
message | string | Human-readable description of the result. |
Save the merchantId and storeId from this response — you will need them when registering devices in Step 3.
Step 2: Add Merchants to the Group
Onboard individual merchants and link them to the multi-merchant group by passing the group’s multiMerchantId in the standard Create Merchant request.
POST /partners/{partnerId}/merchants
Request (minimal):
{
"country": "SE",
"organisation": {
"corporateId": "5566692092"
},
"multiMerchantId": "8353ffb4664d900d0e",
"controlFields": {
"transactionPricingPlan": "SP_SE_Fix129"
}
}
| Parameter | Type | Required | Description |
|---|---|---|---|
country | string | Yes | Two-letter ISO country code in uppercase. |
organisation.corporateId | string | Yes | Corporate/organisation ID of the merchant being added. |
organisation.legalName | string | Conditional | Legal name of the organisation. Required for Payment Facilitator (PF) partners. |
organisation.mccCode | string | Conditional | Merchant Category Code. Required for PF partners. |
multiMerchantId | string | Yes | The merchantId returned from Step 1. Links this merchant to the shared group. |
controlFields.transactionPricingPlan | string | Conditional | Billing plan for transaction costs. Required if more than one plan exists. |
Response:
{
"status": "SUCCESS",
"data": {
"applicationId": "app_merch_g7h8i9",
"webKybUrl": "https://kyb.surfboardpayments.com/app_merch_g7h8i9",
"merchantId": "mrc_vendor_001"
},
"message": "Merchant application created successfully"
}
| Parameter | Type | Description |
|---|---|---|
data.applicationId | string | Track the merchant onboarding status with this ID. |
data.webKybUrl | string | KYB (Know Your Business) link. Share this with the merchant to complete their verification. |
data.merchantId | string | The merchant’s individual ID (PF partners only — returned when the merchant is created immediately). |
data.storeId | string | The merchant’s store ID (PF partners only). |
data.shortLinkUrl | string | Shortened KYB URL, returned when generateShortLink is set to true. |
Repeat this step for every merchant that should be part of the group. Each merchant completes their own KYB verification independently.
Adding Merchants via the Partner Portal
You can also add merchants through the Partner Portal UI:
- Log in to your Partner Portal and go to the Applications section.
- Click Create Application.
- Enable the MultiMerchant toggle.
- Select the group from the MultiMerchantId or name dropdown.
- Fill in the required merchant details and click Create Application.
- Share the generated WebKYB link with the merchant.
Organisation and Address Details
For PF partners or when full merchant details are required, you can include comprehensive organisation information:
{
"country": "SE",
"organisation": {
"corporateId": "5566692092",
"legalName": "Vendor AB",
"mccCode": "5812",
"address": {
"addressLine1": "Storgatan 10",
"city": "Stockholm",
"countryCode": "SE",
"postalCode": "11123"
},
"phoneNumber": {
"code": 46,
"number": "701234567"
},
"email": "vendor@example.com"
},
"multiMerchantId": "8353ffb4664d900d0e",
"controlFields": {
"transactionPricingPlan": "SP_SE_Fix129"
}
}
Step 3: Register a Device to the Group
Once the group is created, register a physical terminal using the group-level merchantId and storeId from Step 1. This makes the terminal available to all merchants in the group.
POST /merchants/{merchantId}/stores/{storeId}/devices
Use the group-level merchantId and storeId returned in Step 1, not an individual merchant’s IDs.
Request:
{
"registrationIdentifier": "250901",
"terminalName": "Kiosk One"
}
| Parameter | Type | Required | Description |
|---|---|---|---|
registrationIdentifier | string | Yes | 6-digit code shown on the terminal at startup. For SurfPad and Printer devices, use the serial number from the back of the device. |
terminalName | string | Yes | A friendly name for the terminal (e.g., “Food Court Register 1”). |
Response:
{
"status": "SUCCESS",
"data": {
"terminalId": "trm_shared_001",
"registrationStatus": "REGISTERED"
},
"message": "Terminal registered successfully"
}
| Parameter | Type | Description |
|---|---|---|
data.terminalId | string | Terminal ID of the registered device. |
data.registrationStatus | string | REGISTERED for a new device, ALREADY_REGISTERED if the device was previously linked. |
Processing Payments
After setup, each merchant processes payments independently using their own merchantId — the shared terminal handles the routing automatically. When creating an order, the merchant specifies the terminal ID of the shared device:
{
"terminal$id": "trm_shared_001",
"orderLines": [...],
"totalOrderAmount": {...}
}
Key points for payment processing on shared terminals:
- Orders are tied to the individual merchant’s
merchantId, not the group. - Payouts are settled to each merchant’s own bank account.
- Transaction history is kept separate per merchant.
- The terminal displays the correct merchant name and receipt details for each transaction.
Important Considerations
- One location per group. A multi-merchant group represents a single physical location. If you have vendors across multiple sites, create a separate group for each location.
- Merchant independence. Adding a merchant to a group does not affect their ability to have their own dedicated terminals elsewhere. The
multiMerchantIdlink only applies to the shared setup. - KYB is still required. Each merchant must complete their own Know Your Business verification regardless of being part of a group. The group setup does not bypass compliance requirements.
- Terminal limits. You can register multiple terminals to the same group. There is no restriction on the number of devices per group.
API Quick Reference
| Operation | Method | Endpoint |
|---|---|---|
| Create multi-merchant group | POST | /partners/{partnerId}/multi-merchant |
| Add merchant to group | POST | /partners/{partnerId}/merchants |
| Register shared terminal | POST | /merchants/{merchantId}/stores/{storeId}/devices |
Other Guides
Tap to Pay on iPhone SDK
Accept contactless payments directly on iPhone. Complete integration guide for Surfboard's iOS SoftPOS SDK -- from setup to production.
Android SoftPOS SDK
Turn Android devices into payment terminals with the Surfboard Android SoftPOS SDK. Complete integration guide from setup to production.
EMV Terminal Integration
Integrate traditional card-present terminals through Surfboard's unified API. From account setup to live payments in one guide.
Payment Page
Redirect customers to a Surfboard-hosted checkout page. The fastest way to accept online payments with minimal integration effort.
Inter-App Integration
Integrate your POS app with CheckoutX using native app switch. Register terminals, process payments, and scan NFC tags through a bi-directional deep link flow.
Self-Hosted Checkout
Embed a payment form directly in your web app with the Surfboard Online SDK. Full UI control with Surfboard handling PCI compliance.
Server-to-Server API
Process online payments entirely from your backend with Merchant Initiated Transactions. Full control over recurring payments, subscriptions, and tokenized card flows.
Create an Order
Learn how to create orders with line items, tax, customer details, and control functions. The starting point for accepting payments with the Surfboard API.
Merchant Onboarding
Set up merchants and stores on the Surfboard platform. Walk through the full onboarding flow from merchant creation to KYB completion and store setup.
Payment Lifecycle
Manage the full payment lifecycle from order creation through capture, void, cancel, and refund operations using the Surfboard Payments API.
Capture a Payment
Finalize a previously authorized payment by capturing funds. Covers delay capture and pre-authorization flows with step-by-step API examples.
Terminal & Device Management
Manage payment terminals and devices via the Surfboard API. Register in-store and online terminals, configure settings, and handle device operations.
Cancel a Payment
Stop an in-progress payment before it completes. Use cancellation when a customer abandons checkout or a payment needs to be halted mid-process.
Webhooks & Notifications
Receive real-time event notifications via webhooks, email, Slack, and SFTP. Subscribe to payment events and settlement reports for merchants and partners.
Recurring Payments
Implement subscription billing and recurring charges using tokenization, recurring payment configuration, and Merchant Initiated Transactions.
Void a Payment
Reverse a completed payment before settlement. Voiding stops funds from transferring to the merchant's account, avoiding incorrect transactions.
Receipts
Generate, email, print, and customise receipts for in-store transactions using the Surfboard Receipts API.
Refund an Order
Process a full refund by creating a return order with negative quantities. Covers the complete refund flow with API examples and payment method requirements.
Partial Refund
Refund specific items or a reduced amount from a completed order. Process partial returns by creating a return order with only the items to be refunded.
Tips Configuration
Configure tipping on Surfboard payment terminals at the merchant, store, or terminal level using a hierarchical override model.
NFC Tag Reading
Use the NFC Reading API to create tag-reading sessions on payment terminals, scan NFC/RFID-tagged products, and retrieve scanned tag data.
Partial Payments
Split an order across multiple payment methods or transactions. Accept card, cash, and Swish in any combination to settle a single order.
Store Management
Create, update, verify, and manage in-store and online stores using the Surfboard Payments Store APIs.
Gift Cards & Promotions
Issue and manage gift cards, track transactions, and create marketing promotions using the Surfboard Payments APIs.
Product Catalog
Create and manage product catalogs, products, variants, inventory levels, and analytics through the Catalog API.
Settlements & Reporting
Retrieve settlement reports, view adjustments, manage merchant charges, and register customer profiles for reconciliation and billing.
Account & Service Provider Management
Create merchant and partner accounts, manage user roles, register service providers, and configure external notifications via the Surfboard API.
Payment Methods
Activate, deactivate, and list payment methods for a merchant. Manage card, Swish, Klarna, AMEX, Vipps, MobilePay, and more via the API or Partner Portal.
Client Auth Tokens
Generate client-side authentication tokens for secure API access from browsers and mobile apps without exposing your API key or secret.
Partner Branding
Configure white-label branding for terminals and payment pages. Set colors, fonts, logos, and cover images at the partner level via API or Partner Portal.
Ready to get started?
Create a sandbox account and start building your integration today.