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
- Sign up at sandbox.bankconnector.com/signup and confirm your email. You are the company's Admin.
- Under Banks, open the bank you want to test with. On the sandbox it connects at once, over a simulated channel.
- 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
- The shape of the
paymentobject: Core concepts - Get idempotency right before any retry logic: Idempotency
- React to results: Receiving results