Developers Guides Multi-Merchant Terminals

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.

In-Store API Multi-Merchant Terminal Partners

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

ScenarioDescription
Food courtsMultiple food vendors in a shopping centre share terminals at a central checkout or at individual stalls.
Music festivals and eventsPop-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 spacesSmall businesses sharing a physical storefront use the same terminal while keeping financials separate.
Seasonal marketsTemporary 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:

  1. Create a multi-merchant group — Establishes the shared group and generates a group-level merchant and store.
  2. Add merchants to the group — Onboard individual businesses and link them to the group.
  3. 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"
}
ParameterTypeRequiredDescription
countrystringYesTwo-letter ISO country code in uppercase (e.g., SE, DK, NO).
zipCodestringYesZIP/postal code of the shared location.
namestringNoHuman-readable name for the group (e.g., “Stockholm Food Hall”).
emailstringNoContact 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"
}
ParameterTypeDescription
statusstringSUCCESS or ERROR.
data.applicationIdstringUse this ID to track the status of the group creation request.
data.merchantIdstringGroup-level merchant ID. Use this when registering shared terminals (Step 3).
data.storeIdstringGroup-level store ID. Use this when registering shared terminals (Step 3).
messagestringHuman-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"
  }
}
ParameterTypeRequiredDescription
countrystringYesTwo-letter ISO country code in uppercase.
organisation.corporateIdstringYesCorporate/organisation ID of the merchant being added.
organisation.legalNamestringConditionalLegal name of the organisation. Required for Payment Facilitator (PF) partners.
organisation.mccCodestringConditionalMerchant Category Code. Required for PF partners.
multiMerchantIdstringYesThe merchantId returned from Step 1. Links this merchant to the shared group.
controlFields.transactionPricingPlanstringConditionalBilling 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"
}
ParameterTypeDescription
data.applicationIdstringTrack the merchant onboarding status with this ID.
data.webKybUrlstringKYB (Know Your Business) link. Share this with the merchant to complete their verification.
data.merchantIdstringThe merchant’s individual ID (PF partners only — returned when the merchant is created immediately).
data.storeIdstringThe merchant’s store ID (PF partners only).
data.shortLinkUrlstringShortened 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:

  1. Log in to your Partner Portal and go to the Applications section.
  2. Click Create Application.
  3. Enable the MultiMerchant toggle.
  4. Select the group from the MultiMerchantId or name dropdown.
  5. Fill in the required merchant details and click Create Application.
  6. 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"
}
ParameterTypeRequiredDescription
registrationIdentifierstringYes6-digit code shown on the terminal at startup. For SurfPad and Printer devices, use the serial number from the back of the device.
terminalNamestringYesA 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"
}
ParameterTypeDescription
data.terminalIdstringTerminal ID of the registered device.
data.registrationStatusstringREGISTERED 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 multiMerchantId link 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

OperationMethodEndpoint
Create multi-merchant groupPOST/partners/{partnerId}/multi-merchant
Add merchant to groupPOST/partners/{partnerId}/merchants
Register shared terminalPOST/merchants/{merchantId}/stores/{storeId}/devices

Other Guides

in-store

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.

in-store

Android SoftPOS SDK

Turn Android devices into payment terminals with the Surfboard Android SoftPOS SDK. Complete integration guide from setup to production.

in-store

EMV Terminal Integration

Integrate traditional card-present terminals through Surfboard's unified API. From account setup to live payments in one guide.

online

Payment Page

Redirect customers to a Surfboard-hosted checkout page. The fastest way to accept online payments with minimal integration effort.

in-store

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.

online

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.

online

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.

online

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.

online

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.

online

Payment Lifecycle

Manage the full payment lifecycle from order creation through capture, void, cancel, and refund operations using the Surfboard Payments API.

online

Capture a Payment

Finalize a previously authorized payment by capturing funds. Covers delay capture and pre-authorization flows with step-by-step API examples.

in-store

Terminal & Device Management

Manage payment terminals and devices via the Surfboard API. Register in-store and online terminals, configure settings, and handle device operations.

online

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.

online

Webhooks & Notifications

Receive real-time event notifications via webhooks, email, Slack, and SFTP. Subscribe to payment events and settlement reports for merchants and partners.

online

Recurring Payments

Implement subscription billing and recurring charges using tokenization, recurring payment configuration, and Merchant Initiated Transactions.

online

Void a Payment

Reverse a completed payment before settlement. Voiding stops funds from transferring to the merchant's account, avoiding incorrect transactions.

in-store

Receipts

Generate, email, print, and customise receipts for in-store transactions using the Surfboard Receipts API.

online

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.

online

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.

in-store

Tips Configuration

Configure tipping on Surfboard payment terminals at the merchant, store, or terminal level using a hierarchical override model.

in-store

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.

online

Partial Payments

Split an order across multiple payment methods or transactions. Accept card, cash, and Swish in any combination to settle a single order.

online

Store Management

Create, update, verify, and manage in-store and online stores using the Surfboard Payments Store APIs.

online

Gift Cards & Promotions

Issue and manage gift cards, track transactions, and create marketing promotions using the Surfboard Payments APIs.

online

Product Catalog

Create and manage product catalogs, products, variants, inventory levels, and analytics through the Catalog API.

online

Settlements & Reporting

Retrieve settlement reports, view adjustments, manage merchant charges, and register customer profiles for reconciliation and billing.

online

Account & Service Provider Management

Create merchant and partner accounts, manage user roles, register service providers, and configure external notifications via the Surfboard API.

online

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.

online

Client Auth Tokens

Generate client-side authentication tokens for secure API access from browsers and mobile apps without exposing your API key or secret.

online

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.