This document describes how to get started with the Aritma Open Banking V4 API in the development environment. It walks you through authentication, consent creation, account verification, and submitting your first payment.
This assumes you have already requested a demo and received a demo email containing your credentials, which are used throughout this guide. The environment variables from the accompanying email replace all placeholders ({...}) in this guide.
| Resource | URL |
|---|---|
| API reference | https://developer.aritma.io/apis/banking/v4 |
| OpenAPI specification | https://developer.aritma.io/apis/banking/v4/openapi/banking-openapi |
| Onboarding guide | https://developer.aritma.io/apis/banking/v4/guides/onboarding |
| Consent lifecycle | https://developer.aritma.io/apis/banking/v4/about/consent |
| Events API (webhooks) | https://developer.aritma.io/apis/platform/events |
The API is versioned via the api-version header. Use api-version: 1.0 on all requests. Supported versions are returned in the api-supported-versions response header.
The API supports idempotency for safely retrying POST requests. Include the header Idempotency-Key: {UUID} to avoid duplicate operations. If a replayed response is returned, the header Idempotent-Replayed: true will be present.
| Field | Value |
|---|---|
| TenantId | {TenantId} |
| Identity URL | https://id.dev.aritma.io/{TenantId} |
The Identity URL is used for token generation (OAuth 2.0).
Authentication uses the OAuth 2.0 Client Credentials flow.
| Field | Value |
|---|---|
| ClientName | {ClientName} |
| ClientId | {ClientId} |
| ClientSecret | {Secret} |
The ClientSecret must be treated as confidential. Do not store it in plain text or share it outside your development team.
| Field | Value |
|---|---|
| SubscriptionId | {SubscriptionId} |
| ResourceGroupName | {ResourceGroupName} |
These two values are used as headers (Subscription-Id and Resource-Group-Name) on all API calls after onboarding. Store them in your application configuration.
Your dev environment includes two accounts, see the demo email.
This account is configured with non pre-approved payments (RGB off), which means payments go directly to the mock bank without a signing step. This is the default configuration for dev and allows you to test the full payment flow end-to-end with minimal steps.
All API calls require a valid access token.
Endpoint:
POST https://id.dev.aritma.io/{TenantId}/connect/token
Content-Type: application/x-www-form-urlencodedParameters:
| Parameter | Value |
|---|---|
grant_type | client_credentials |
client_id | {ClientId} |
client_secret | {Secret} |
cURL example:
curl -X POST "https://id.dev.aritma.io/{TenantId}/connect/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials&client_id={ClientId}&client_secret={Secret}"Response:
{
"access_token": "eyJhbGciOi...",
"expires_in": 3600,
"token_type": "Bearer",
"scope": "api"
}Use the access_token in the Authorization header on all subsequent calls:
Authorization: Bearer {access_token}The token is valid for 1 hour. Generate a new one when it expires.
Before you can make payments or retrieve account data, you need to establish a consent. The consent links a company's bank accounts to your subscription.
In the dev environment, you use the MockBank, which bypasses the BankID redirect flow.
Endpoint:
POST https://banking.dev.aritma.io/api/consentsHeaders:
| Header | Value |
|---|---|
Authorization | Bearer {access_token} |
Content-Type | application/json |
api-version | 1.0 |
Request body:
{
"channelType": "openbanking",
"bankId": "3a85a03b-2f39-4c65-868b-6f8389e46a04",
"subscriptionId": "{SubscriptionId}",
"resourceGroupName": "{ResourceGroupName}",
"properties": {
"accountNumbers": "{BBAN}",
"isHeadless": "true",
"combinedServiceIndicator": "true",
"numberOfApprovers": "1"
}
}Important:
bankIdmust be lowercase. The value above is the MockBank ID. For real banks, always fetch IDs fromGET /banks— never hardcode.isHeadlessmust be"true"when using MockBank. This bypasses the BankID redirect.combinedServiceIndicator: "true"enables both account information (AIS) and payment initiation (PIS).
Response (key fields):
{
"consentId": "a1b2c3d4-e5f6-...",
"status": "Created"
}Store the consentId. Since MockBank with isHeadless: true is used, the consent completes automatically.
GET https://banking.dev.aritma.io/api/consents/{consentId}Status progression: Created → Started → Authorized
Once the status is Authorized, the consent is active and accounts are ready for use.
After the consent is authorised, verify that accounts are available.
Endpoint:
GET https://banking.dev.aritma.io/api/accountsHeaders:
| Header | Value |
|---|---|
Authorization | Bearer {access_token} |
Channel-Type | openBanking |
Subscription-Id | {SubscriptionId} |
Resource-Group-Name | {ResourceGroupName} |
api-version | 1.0 |
Accounts with status enabled are ready for payments and data retrieval.
The response includes accountId values — store these for transaction retrieval and balance checks.
Endpoint:
POST https://banking.dev.aritma.io/api/bulk-payments/credit-transferHeaders:
| Header | Value |
|---|---|
Authorization | Bearer {access_token} |
Channel-Type | openBanking |
Subscription-Id | {SubscriptionId} |
Resource-Group-Name | {ResourceGroupName} |
Consent-ID | {consentId} |
TPP-Redirect-URI | https://yourapp.com/redirect |
api-version | 1.0 |
Request body:
{
"debtorAccount": {
"iban": "{IBAN}"
},
"debtorName": "{CompanyName}",
"requestedExecutionDate": "2026-06-01",
"batchBookingPreferred": false,
"paymentLines": [
{
"endToEndIdentification": "TEST-PAYMENT-001",
"instructedAmount": {
"currency": "NOK",
"amount": "1500.00"
},
"creditorAccount": {
"iban": "NO6036407513651"
},
"creditorName": "Test Supplier AS",
"remittanceInformationUnstructured": "Invoice #1234",
"instructionPriority": "normal"
}
]
}Important:
debtorAccountmust match one of your onboarded test accounts.creditorAccountshould be the other account we provided — this will simulate incoming payments by generating transactions.
requestedExecutionDatemust be a future date.- One or more payment lines can be included in a single request.
- The Postman collection includes a pre-built body with randomly generated payment lines — you only need to update
debtorAccount,debtorName, andrequestedExecutionDate.
Response (key fields):
{
"paymentId": "9425e6f7-4300-...",
"transactionStatus": "RCVD"
}With your default dev account (non pre-approved), the payment progresses automatically:
RCVD → ACSP → ACSC
No further action is required. The mock bank accepts the payment and produces return files. You can verify the final status by polling:
GET https://banking.dev.aritma.io/api/bulk-payments/credit-transfer/{paymentId}After onboarding and payment creation, you can retrieve account data.
GET https://banking.dev.aritma.io/api/accounts/{accountId}/balancesGET https://banking.dev.aritma.io/api/accounts/{accountId}/transactions| Header | Value |
|---|---|
Authorization | Bearer {access_token} |
Channel-Type | openBanking |
Subscription-Id | {SubscriptionId} |
Resource-Group-Name | {ResourceGroupName} |
api-version | 1.0 |
Important: For all data retrieval after onboarding, use
Subscription-IdandResource-Group-Name— notConsent-ID. The consent ID is only used during the consent creation flow and for payment initiation.
| Step | Endpoint | Purpose |
|---|---|---|
| 1 | POST /connect/token | Get access token |
| 2 | POST /api/consents | Create consent (onboard company) |
| 3 | GET /api/consents/{id} | Verify consent status |
| 4 | GET /api/accounts | Verify onboarded accounts |
| 5 | POST /api/bulk-payments/credit-transfer | Create payment |
| 6 | GET /api/accounts/{id}/transactions | Retrieve transaction data |
| Symptom | Cause | Solution |
|---|---|---|
Payment stuck at RCVD | Account has pre-approved payments enabled | See Appendix A, or contact Aritma support |
400: Bank not found | bankId is uppercase or hardcoded | Use bankId from GET /banks — values are case-sensitive and must be lowercase |
401 Unauthorized | Token expired or missing | Generate a new token (step 2). Tokens are valid for 1 hour. |
Consent stuck at Created | MockBank requires headless mode | Set "isHeadless": "true" in consent properties |
404: Account not found on payment | Wrong debtorAccount or missing headers | Verify Subscription-Id and Resource-Group-Name headers match your environment |
Once you have completed your first payment in dev:
- Webhooks: Subscribe to real-time events (payment status, transactions, balance updates) via the Events API instead of polling.
- Real bank testing: Test with non-mock banks using
isHeadless: falseand BankID verification. - Pre-approved payments: If you need to test the signing basket flow, contact us and we will configure an additional account (see Appendix A).
- Production: Contact Aritma to set up production credentials when you are ready to go live.
Your default dev account is configured with non pre-approved payments, meaning payments are sent directly to the bank without a signing step. In production, many customers will use pre-approved payments instead, where an authorised user signs payments in your system before they are forwarded to the bank.
If you want to test this flow in dev, contact Aritma support and we will configure an additional account with pre-approved payments enabled.
When an account has pre-approved payments enabled (RGB on), the payment stays at status RCVD after creation. To move it forward, you need to complete the signing basket flow:
Step 1 — Create signing basket
POST https://banking.dev.aritma.io/api/signing-baskets{
"paymentIds": [
"{paymentId}"
]
}Multiple payment IDs can be included to approve several payments at once. The response returns a basketId.
Step 2 — Start authorisation
POST https://banking.dev.aritma.io/api/signing-baskets/{basketId}/authorizationsThe response includes scaRedirect.href — a URL where the user completes BankID verification.
Step 3 — Complete authorisation in browser
- Open
scaRedirect.hrefin a browser - Create a user account (if first time) or log in
- Complete BankID verification using the BankID demo (see below)
- Approve the signing basket
- You are redirected back to the configured
TPP-Redirect-URI
After successful authorisation, payments progress: RCVD → ACSP → ACSC.
The dev environment uses the Norwegian BankID demo. Generate a test user:
- Go to https://ra-preprod.bankidnorge.no/#!/generate
- Click Generate number
- Fill in the fields — you can use randomly generated values
- Click Order
- Copy the generated End User Identification number
Use this number in the BankID verification step.
| Field | Value |
|---|---|
| OTP | otp |
| Password | qwer1234 |
These are default values from BankID Norway's own documentation.
| Account type | Status flow | Signing required |
|---|---|---|
| Non pre-approved (default dev) | RCVD → ACSP → ACSC (automatic) | No |
| Pre-approved (on request) | RCVD → signing basket → BankID → ACSP → ACSC | Yes |
In the dev environment, the MockBank with isHeadless: true completes the consent automatically. In production, the consent flow is the process by which your end customers connect their bank accounts to your application through Aritma.
The real flow works as follows:
- Your application creates a consent via the API for a specific bank, company, and set of accounts.
- The API returns a
redirectUrlthat you send the end user to. - The user lands on the Aritma onboarding portal, where they verify their identity with BankID and confirm the connection.
- Aritma performs KYC validation (role verification and account ownership).
- The user is redirected back to your application.
- At the end of the consent flow, the customer receives instructions for contacting their bank to order bank integration (file exchange). This step is handled by the customer directly with their bank.
- When the bank has activated the integration and Aritma receives the first files, the setup is completed on our side and the account status becomes
enabled.
Each of your customers goes through this flow once per bank. After that, you use Subscription-Id and Resource-Group-Name for all data retrieval and payment operations — the consent ID is no longer needed.
For full details, see the Onboarding in the API documentation.
Aritma AS — support@aritma.io — +47 55 34 91 50