sandbox.bankconnector.com API Reference

Getting started

This page takes you from nothing to an executed payment in the sandbox: sign up, send, read. You need an email address and curl. Everything runs against https://sandbox.bankconnector.com, where every bank is a simulated Demo Bank and no real payment can move.

Production is the other side of the same API: real banks and real payments. See Going live.

Step 1: Sign up and create a key

  1. Sign up at sandbox.bankconnector.com/signup and confirm your email. You are the company's Admin.
  2. Under Banks, open the bank you want to test with. On the sandbox it connects at once, over a simulated channel.
  3. Under Company settings › API keys, create a key. It is shown once, and only a digest of it is kept. The section also shows your company's id, which every call on your data names as companyId.

Export both:

export BC_KEY="key_…"
export BC_COMPANY="comp_…"

Sandbox companies are deleted after 30 days of inactivity.

Step 2: Send the first payment

Save a payment as first-payment.json. It names your bank, your companyId and an execution date of today or later, and sets "environment": "test" because a sandbox connection is a test connection; leave that out and the call defaults to production, which answers 422 "No active integration".

{
  "companyId": "comp_…", "bankKey": "danske-dk", "environment": "test",
  "payment": {
    "messageId": "MSG-0001",
    "initiatingParty": { "name": "Acme Corp" },
    "payments": [{
      "paymentId": "PMT-1", "paymentType": "sepa", "executionDate": "2026-11-02",
      "debtor": { "name": "Acme Corp", "country": "DK", "account": { "iban": "DK5000400440116243", "currency": "EUR" }, "agent": { "bic": "DABADKKK" } },
      "transactions": [{ "endToEndId": "E2E-1", "amount": "100.00", "currency": "EUR",
        "creditor": { "name": "Supplier GmbH", "account": { "iban": "DE89370400440532013000" }, "agent": { "bic": "DEUTDEFF" } } }]
    }]
  }
}

The fields are in Core concepts and the Payment field reference. In the dashboard, the bank's page can also send a ready-made test payment.

curl -X POST https://sandbox.bankconnector.com/api/journal/payments \
  -H "X-API-Key: $BC_KEY" \
  -H "BankConnector-Version: 2026-10-21" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: first-payment-1" \
  -d @first-payment.json
# 201 { "id": "...", "journalNo": "...", "status": "queued-for-delivery", "xml": "<Document>...", "deliveryMode": "host-to-host" }

A 201 means the payment was accepted and converted to the bank's format, not yet delivered. A new sandbox company has no active approval policy, so the sandbox does not hold the payment for approval and status is queued-for-delivery; activate a policy and it waits for approval as in production. Outside the sandbox the default policy holds every payment as pending-approval until two approvers have signed (see Submitting payments). Without the BankConnector-Version header the call runs on the baseline version, where a malformed payment is 400 instead of 422; see API versioning & compatibility.

To check a payload without creating anything, send it to POST /api/journal/payments/preview: it validates and converts, with no state change and no delivery.

Step 3: Read the result

The Demo Bank replies within a few seconds with a real-format pain.002 and camt.053. Read the reconciled state:

curl -H "X-API-Key: $BC_KEY" -H "BankConnector-Version: 2026-10-21" \
  "https://sandbox.bankconnector.com/api/journal/reconciliation?companyId=$BC_COMPANY"
# status "executed", state "cleared"

GET /api/journal/list is a different view: a paged list of journal documents, inbound ones included, without the reconciliation state or evidence. See Receiving results for webhooks and polling.

Where to go next