> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dintero.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Terminal onboarding

> Set up payout destinations, stores, and terminals so the Dintero Checkout API can route in-person payments to a specific physical card reader.

Before you can charge a customer on a terminal, the terminal has to be linked to a store, and the store has to be linked to a payout destination. You can complete the whole onboarding in Backoffice, or automate the store and terminal steps via the management API.

## Step 1: Onboard a payout destination

The payout destination is the seller of record - the entity that receives the funds. KYC is a one-time step per legal entity.

<Tabs>
  <Tab title="Backoffice">
    1. Go to **Payout destination** in the navigation menu and click **+ Payout destination** on the top right.
    2. Provide the company or individual details and click **Save**. A link is generated to complete the declaration form and sign the agreement.
    3. Open the link and complete the declaration form and sign the agreement. The seller is ready when `case_status` becomes `ACTIVE`.
    4. Note the `payout_destination_id`. You'll send this as `order.store.payout_destination_id` when creating sessions.
  </Tab>

  <Tab title="Management API">
    Create a payout destination with [`POST /accounts/{aid}/management/settings/approvals/payout-destinations`](/api-reference/approvals/aid_management_settings_approvals_payout_destinations_post).

    ```http theme={null}
    POST /accounts/{aid}/management/settings/approvals/payout-destinations
    Authorization: Bearer <token>
    Content-Type: application/json

    {
      "payout_destination_id": "my-seller",
      "payout_reference": "My Company AS",
      "organization_number": "923663487",
      "country_code": "NO",
      "bank_accounts": [
        {
          "bank_account_number": "12345678901",
          "bank_account_currency": "NOK"
        }
      ],
      "form_submitter": {
        "email": "contact@example.com"
      }
    }
    ```

    Open the URL in the response `links` array to complete the declaration form and sign the agreement.

    Track approval status by:

    * **Webhook:** subscribe to `approval_payout_destination_update`. The payout destination is ready when `case_status` is `ACTIVE`.
    * **Polling:** [`GET /accounts/{aid}/management/settings/approvals/payout-destinations`](/api-reference/approvals/aid_management_settings_approvals_payout_destinations_get)
  </Tab>
</Tabs>

For more detail on the KYC flow and reminder emails, see [Add sellers](/docs/checkout/split-payment/add-payout-destinations).

## Step 2: Create a store

A store represents a physical location. Stores are linked to one payout destination.

<Tabs>
  <Tab title="Backoffice">
    1. Go to **Settings** → **Stores** and add a new store.
    2. Link the store to the payout destination you onboarded in step 1.
    3. Note the `store_id`. You'll send this as `order.store.id`.
  </Tab>

  <Tab title="Management API">
    Create a store with [`POST /v1/accounts/{aid}/stores`](/api-reference/account-stores/aid_account_management_stores_post).

    ```http theme={null}
    POST /v1/accounts/{aid}/stores
    Authorization: Bearer <token>
    Content-Type: application/json

    {
      "store_id": "oslo-center",
      "store_name": "Oslo Center",
      "organization": {
        "organization_number": "923663487"
      },
      "payout_destination": {
        "payout_destination_id": "seller-1"
      }
    }
    ```

    The response returns two identifiers:

    * `store_id` - the merchant identifier you sent, used as `order.store.id` in checkout sessions.
    * `id` - a Dintero-generated identifier (for example `P11223351-0026`). You'll need this when registering a terminal.

    <Info>
      When a store is linked to an active payout destination, address, phone number, and other fields are set automatically from the validated organization data. The store's `organization.organization_number` must match the organization on the payout destination.
    </Info>
  </Tab>
</Tabs>

## Step 3: Register a terminal

A terminal is a physical card reader. Each terminal is linked to a single store.

<Tabs>
  <Tab title="Backoffice">
    1. Go to **Settings** → **Terminals** and add a new terminal.
    2. Provide the device serial number.
    3. Link the terminal to the store from step 2.
    4. Note the `terminal_id`. You'll send this as `order.store.terminal_id`.
  </Tab>

  <Tab title="Management API">
    Register a terminal with [`POST /v1/accounts/{aid}/terminals`](/api-reference/account-terminals/aid_account_management_terminals_post).

    ```http theme={null}
    POST /v1/accounts/{aid}/terminals
    Authorization: Bearer <token>
    Content-Type: application/json

    {
      "device_serial_number": "158222607285",
      "store_id": "P11223351-0026"
    }
    ```

    <Warning>
      The `store_id` field on this endpoint expects the **store's `id`** from the create-store response (for example `P11223351-0026`), not the merchant `store_id`. Subsequent reads of the terminal will return the merchant `store_id` (the backend translates it).
    </Warning>

    The response includes the `terminal_id` Dintero assigned (for example `P11223351-T0013`). Use that value as `order.store.terminal_id` when creating a session.

    Use [`GET /v1/accounts/{aid}/terminals/{terminal_id}`](/api-reference/account-terminals/aid_account_management_terminals_termid_get) to inspect a terminal, or [`GET /v1/accounts/{aid}/terminals`](/api-reference/account-terminals/aid_account_management_terminals_get) to list all terminals.
  </Tab>
</Tabs>

## Terminal statuses

Check the current status with [`GET /v1/accounts/{aid}/terminals/{terminal_id}`](/api-reference/account-terminals/aid_account_management_terminals_termid_get).

### `PENDING`

The terminal has been registered and is waiting to be provisioned. No action is required. The status will update automatically.

### `ACTION_REQUIRED`

The terminal needs to fetch its configuration before it can be activated. When `status_reason` is `CHECK_UPDATE`, perform these steps first:

1. Connect the terminal to a Wi-Fi network.
2. Fetch the settings from the terminal's service menu: **Service** → *enter service password* → **Get settings**. The service password is a rotating code you can find in Backoffice or request from Dintero support.

Then trigger the check update:

<Tabs>
  <Tab title="Backoffice">
    Open the terminal in **Settings** → **Terminals** and click **Check update**. The terminal contacts Seitatech to fetch its configuration.
  </Tab>

  <Tab title="API">
    Send a `check_update` operation with [`POST /v1/admin/terminals/operations`](/api-reference/terminals/admin_terminals_operations_post):

    ```http theme={null}
    POST /v1/admin/terminals/operations
    Authorization: Bearer <token>
    Content-Type: application/json

    {
      "terminal_id": "P11223351-T0013",
      "operation": "check_update"
    }
    ```

    The command is dispatched asynchronously.
  </Tab>
</Tabs>

### `ACTIVE`

The terminal is provisioned and ready to accept payments.

### `ERROR`

Provisioning failed. Retry the onboarding or contact Dintero support.

## Next step

With the payout destination, store, and terminal in place, you can now [create a session that drives the terminal](/docs/checkout/in-person/creating-terminal-session).
