BaaS API documentation

Download OpenAPI specification:Download

Authorization

We use cryptographic signature to authorize API requests.
To configure your API keys for selected entity please login to our banking app Developer Section.
You have to configure your whitelisted IPs and public key which will be used for request signature verification.
Do not share your private key with anybody. We will never asks you for private key.

API HOSTNAME

Please note that we use api.narvi.com fully qualified domain to interact with your integration. All your api requests should use this domain to communicate with our REST API.

Request Authorization

Each request needs to have the following headers:
- API-KEY-ID - api key id gathered from configured api key Developer Section
- API-REQUEST-ID - request ID, valid UUID, can't be duplicated across requests
- API-REQUEST-SIGNATURE - request signature

API-REQUEST-ID (Request ID)
- valid UUID,
- it can't be duplicated across requests

API-REQUEST-SIGNATURE (Request signature)
Request signature is the signature of sha256 of the concatenated following items (request descriptor)
- the absolute request url without query params (e.g. http://api.narvi.com/rest/v1.0/transactions/create)
- the uppercase request method (e.g. POST, GET, PUT, DELETE)
- request ID - valid UUID, can't be duplicated across requests
- query params encoded in JSON canonical form - RFC 7159 JSON (The order of JSON key-value pairs is very important. Please double-check that it is in the correct canonical form. All query parameters keys and values must have the string type. Use an empty string instead if there are no query parameters).
- payload encoded in JSON canonical form - RFC 7159 JSON (The order of JSON key-value pairs is very important. Please double-check that it is in the correct canonical form. Use an empty string instead if there is no payload)
- if payload contains file object use sha256 of the file content to create payload canonical form for request descriptor

Signature example
For GET request https://api.narvi.com/?account_pid=KFGKJ5L27ASGTZAO&kind=CREDIT the signature should be created as follow:
- generate request uuid: e.g. da43520e-800b-41c5-a4a9-7287a64c87fa
- generate request descriptor: https://api.narvi.com/rest/v1.0/transactions/listGETda43520e-800b-41c5-a4a9-7287a64c87fa{"\account_pid":"KFGKJ5L27ASGTZAO","kind":"CREDIT"}
- generate sha256 of the request descriptor
- generate signature with hashing algorithm sha256 of the generated sha256 above
- encode the signature with base64

For POST request https://api.narvi.com/rest/v1.0/transactions/create with the payload
{"account_pid": "KFGKJ5L27ASGTZAO" ,"recipient": {"name": "John Doe", "number": "FI8379600186405354" ,"bic": "NARIFXX", "country": "FI"}, "currency": "EUR","amount": 100, "remittance_information":{"ustrd": "test transfer"}}
the signature should be created as follow:
- generate request ID: e.g. da43520e-800b-41c5-a4a9-7287a64c87fa
- generate request descriptor: https://api.narvi.com/rest/v1.0/transactions/createPOSTda43520e-800b-41c5-a4a9-7287a64c87fa{"account_pid":"KFGKJ5L27ASGTZAO","amount":"100","currency":"EUR","recipient":{"bic":"NARIFXX","country":"FI","name":"John Doe","number":"FI8379600186405354"},"remittance_information":{"ustrd":"test transfer"}}
- generate sha256 of the request descriptor
- generate signature with hashing algorithm sha256 of the generated sha256 above
- encode the signature with base64

Webhooks

To enable webhooks, please login to Developer Section and configure webhook endpoints for selected entity. After you enable them, we will push real-time event data to your application's webhook endpoint when events happen in your banking account. We use HTTPS to send webhook events to your app as a JSON payload that includes an Event object.

Webhooks IPs

The full list of IP addresses that api.narvi.com may resolve to is:
3.76.153.24

Delivery behaviours

We attempt to deliver the event to your webhook endpoint for up to 3 days with an exponential back off. In the log section of the Dashboard, you can view when the next retry will occur. If your endpoint has been disabled or deleted when we attempt a retry, future retries are cancelled.
Your endpoint must quickly return a successful status code (2xx) prior to any complex logic that could cause a timeout. For example, you must return a 200 response before updating a customer’s balance.

Delivery headers

HTTP payloads that are delivered to your webhook's configured URL endpoint will contain several special headers:
- USER-AGENT - always equal 'webhook'
- WEBHOOK-REQUEST-TIMESTAMP - timestamp in millisecond when webhook action occured
- WEBHOOK-REQUEST-EVENT-TYPE - the event type
- WEBHOOK-REQUEST-EVENT-PID - event public id
- WEBHOOK-REQUEST-SIGNATURE - This is the sha256 hex digest of the request body and parameters

Webhook signature

Webhook signature must be checked by integrated application before processing the webhook data.
Webhook signature is the sha256 hex digest of the concatenated following items (request descriptor)
- the absolute webhook endpoint without query params (e.g. https://example.com/webhook/handler)
- the uppercase request method (e.g. POST, GET, PUT, DELETE)
- current timestamp in microseconds (taken from request header WEBHOOK-REQUEST-TIMESTAMP)
- event type (taken from request header WEBHOOK-REQUEST-EVENT-TYPE)
- event public id (taken from request header WEBHOOK-REQUEST-EVENT-PID)
- query params encoded in JSON canonical form - RFC 7159 JSON (The order of JSON key-value pairs is very important. Please double-check that it is in the correct canonical form. All query parameters keys and values must have the string type. Use an empty string instead if there are no query parameters)
- payload encoded in JSON canonical form - RFC 7159 JSON (The order of JSON key-value pairs is very important. Please double-check that it is in the correct canonical form. Use an empty string instead if there is no payload)
- webhook secret taken from developer panel

Privates

Create Person Resource

Request Body schema:
required
object (PrivateChangeRequestSchema)

Person change request data

Responses

Request samples

Content type
{
  • "change_request": {
    }
}

Response samples

Content type
application/json
{
  • "pid": "79003101",
  • "phone": "+3584573962XXX",
  • "email": "e***@example.com",
  • "first_name": "John",
  • "last_name": "Doe",
  • "birthdate": "1980-02-19",
  • "kind": "PRIVATE",
  • "added": "1698062541.845098",
  • "updated": "1698062541.845098",
  • "change_requests": [
    ]
}

Update Person Resource

Update a person resource (only when change request status is RETRY).

path Parameters
pid
required
string
Example: 50954001

Person public id

Request Body schema:
required
object (PrivateChangeRequestSchema)

Person change request data

Responses

Request samples

Content type
{
  • "change_request": {
    }
}

Response samples

Content type
application/json
{
  • "pid": "79003101",
  • "phone": "+3584573962XXX",
  • "email": "e***@example.com",
  • "first_name": "John",
  • "last_name": "Doe",
  • "birthdate": "1980-02-19",
  • "kind": "PRIVATE",
  • "added": "1698062541.845098",
  • "updated": "1698062541.845098",
  • "change_requests": [
    ]
}

Retrieve Person Resource

path Parameters
pid
required
string
Example: 50954001

Person public id

Responses

Response samples

Content type
application/json
{
  • "pid": "79003101",
  • "phone": "+3584573962XXX",
  • "email": "e***@example.com",
  • "first_name": "John",
  • "last_name": "Doe",
  • "birthdate": "1980-02-19",
  • "kind": "PRIVATE",
  • "added": "1698062541.845098",
  • "updated": "1698062541.845098",
  • "change_requests": [
    ]
}

List Person Resources

query Parameters
cursor
string

The pagination cursor value.

Responses

Response samples

Content type
application/json
{
  • "next": "string",
  • "previous": "string",
  • "results": [
    ]
}

OTP Settings Update Init

Initiate challenge session for changing 2fa factors (email, phone). Before user change 2fa factors he must confirm via two challenges (EMAIL, SMS).

Request Body schema:
pid
required
string

Person public id

required
object

Responses

Request samples

Content type
{
  • "pid": "68156984",
  • "challenge_session": {
    }
}

Response samples

Content type
application/json
{
  • "pid": "68156984",
  • "challenge_session": {
    }
}

OTP Settings Update Complete

Request another challenge for challenge session.

Request Body schema:
pid
required
string

Person public id

required
object

Responses

Request samples

Content type
{
  • "pid": "68156984",
  • "challenge_session": {
    }
}

Response samples

Content type
application/json
{
  • "pid": "68156984",
  • "challenge_session": {
    }
}

OTP Settings Update Finish

Request challenge for new email or phone.

Request Body schema:
One of
pid
required
string

Person public id

object

Challenge session. Not required when 2fa factors was never set before

email
required
string <email>

New email address

Responses

Request samples

Content type
Example
{
  • "pid": "68156984",
  • "challenge_session": {
    },
  • "email": "user@example.com"
}

Response samples

Content type
application/json
Example
{
  • "pid": "68156984",
  • "challenge": {
    }
}

Businesses

Create Business Resource

In order for the created business entity to be analyzed by the compliance team, it must have an administrator with a verified identity. See more about reusable KYC: https://api.narvi.com/docs/baas/reusable-kyc

Request Body schema:
Array of objects

List of business entity administrator PIDs

required
Business schema (object) or Self-Employed schema (object)

Business schema — for all entity_types except SELF_EMPLOYED
Self-Employed schema — only when entity_type is SELF_EMPLOYED

Responses

Request samples

Content type
{
  • "admins": [
    ],
  • "change_request": {
    }
}

Response samples

Content type
application/json
{
  • "pid": "7EXD75VWXD7I3BO3",
  • "name": "Acme Corp",
  • "kind": "PRIVATE",
  • "status": "INIT",
  • "added": "1698062541.845098",
  • "updated": "1698062541.845098",
  • "change_request": {
    }
}

Update Business Resource

Update business resource (only when change request status is RETRY).

path Parameters
pid
required
string
Request Body schema:
Array of objects

List of business entity administrator PIDs

required
Business schema (object) or Self-Employed schema (object)

Business schema — for all entity_types except SELF_EMPLOYED
Self-Employed schema — only when entity_type is SELF_EMPLOYED

Responses

Request samples

Content type
{
  • "admins": [
    ],
  • "change_request": {
    }
}

Response samples

Content type
application/json
{
  • "pid": "7EXD75VWXD7I3BO3",
  • "name": "Acme Corp",
  • "kind": "PRIVATE",
  • "status": "INIT",
  • "added": "1698062541.845098",
  • "updated": "1698062541.845098",
  • "change_request": {
    }
}

Retrieve Business Resource

path Parameters
pid
required
string

Responses

Response samples

Content type
application/json
{
  • "pid": "7EXD75VWXD7I3BO3",
  • "name": "Acme Corp",
  • "kind": "PRIVATE",
  • "status": "INIT",
  • "added": "1698062541.845098",
  • "updated": "1698062541.845098",
  • "change_request": {
    }
}

List Business Resources

query Parameters
cursor
string

The pagination cursor value.

Responses

Response samples

Content type
application/json
{
  • "next": "string",
  • "previous": "string",
  • "results": [
    ]
}

Add Business Admin

path Parameters
pid
required
string
Example: ZOSQ1ZE80VTBJ1TQ

Business public id

Request Body schema:
pid
required
string

Admin pid

Responses

Request samples

Content type
{
  • "pid": "54320209"
}

Response samples

Content type
application/json
{
  • "phone": "+481291288777",
  • "email": "t****@example.com",
  • "first_name": "John",
  • "last_name": "Doe",
  • "birthdate": "1923-02-19",
  • "kind": "PRIVATE",
  • "added": "1698062541.845098",
  • "updated": "1698062541.845098",
  • "pid": "54320209"
}

Remove Business Admin

path Parameters
pid
required
string
Example: ZOSQ1ZE80VTBJ1TQ

Business public id

admin_pid
required
string
Example: 54320209

Admin public id

Responses

List Business Admins

path Parameters
pid
required
string
Example: ZOSQ1ZE80VTBJ1TQ

Business public id

query Parameters
cursor
string

The pagination cursor value.

Responses

Response samples

Content type
application/json
{
  • "next": "string",
  • "previous": "string",
  • "results": [
    ]
}

Accounts

Issue Account

Request Body schema:
currency
required
string
Default: "EUR"
Value: "EUR"

Account currency

owner_kind
required
string
Enum: "PRIVATE" "BUSINESS"

Owner kind

owner_pid
required
string

Owner public id

Responses

Request samples

Content type
{
  • "currency": "EUR",
  • "owner_kind": "PRIVATE",
  • "owner_pid": "54320209"
}

Response samples

Content type
application/json
{
  • "pid": "0G1D7MQTAIXFHGU0",
  • "currency": "EUR",
  • "balance": 0,
  • "number": "FI1879600189480939",
  • "bic": "NARYFIH2",
  • "closed": "1698062541.845098",
  • "added": "1698062541.845098",
  • "updated": "1698062541.845098",
  • "owner_kind": "PRIVATE",
  • "owner_pid": "54320209",
  • "status": "ACTIVE"
}

Update Account

path Parameters
pid
required
string
Example: 0G1D7MQTAIXFHGU0

Account public id

Request Body schema:
currency
required
string
Default: "EUR"
Value: "EUR"

Account currency

status
required
string
Enum: "ACTIVE" "BLOCKED" "CLOSED"

Account status

Responses

Request samples

Content type
{
  • "currency": "EUR",
  • "status": "ACTIVE"
}

Response samples

Content type
application/json
{
  • "pid": "0G1D7MQTAIXFHGU0",
  • "currency": "EUR",
  • "balance": 0,
  • "number": "FI1879600189480939",
  • "bic": "NARYFIH2",
  • "closed": "1698062541.845098",
  • "added": "1698062541.845098",
  • "updated": "1698062541.845098",
  • "owner_kind": "PRIVATE",
  • "owner_pid": "54320209",
  • "status": "ACTIVE"
}

Retrieve Account

0G1D7MQTAIXFHGU0

path Parameters
pid
required
string

Account public id

Responses

Response samples

Content type
application/json
{
  • "pid": "0G1D7MQTAIXFHGU0",
  • "currency": "EUR",
  • "balance": 0,
  • "number": "FI1879600189480939",
  • "bic": "NARYFIH2",
  • "closed": "1698062541.845098",
  • "added": "1698062541.845098",
  • "updated": "1698062541.845098",
  • "owner_kind": "PRIVATE",
  • "owner_pid": "54320209",
  • "status": "ACTIVE"
}

List Accounts

query Parameters
cursor
string

The pagination cursor value.

Responses

Response samples

Content type
application/json
{
  • "next": "string",
  • "previous": "string",
  • "results": [
    ]
}

Account balance

Retrieve the account balance as of the end of [date]

path Parameters
pid
required
string

Account public id

date
required
string
Example: 2025-01-20

Responses

Response samples

Content type
application/json
{
  • "pid": "0G1D7MQTAIXFHGU0",
  • "balance": 0,
  • "currency": "EUR"
}

Transactions

Create Transaction

Request Body schema:
account_pid
required
string

Account public id.

currency
required
string
Value: "EUR"

Transaction currency

required
object

Remittance information object.

amount
required
integer >= 0

Transaction amount in cents.

kind
required
string
required
object
required
object

Responses

Request samples

Content type
Example
{
  • "account_pid": "3PZ1CL75SIYEGQ0W",
  • "currency": "EUR",
  • "remittance_information": {
    },
  • "amount": 99928,
  • "kind": "DEBIT",
  • "added_by": {
    },
  • "recipient": {
    }
}

Response samples

Content type
application/json
Example
{
  • "pid": "UXNZ6IWJ2JESLXP3",
  • "account_pid": "KFGKJ5L27ASGTZAO",
  • "amount": 1485,
  • "fee": 15,
  • "currency": "EUR",
  • "added": "1698062541.845098",
  • "sender": {
    },
  • "recipient": {
    },
  • "remittance_information": {
    },
  • "source": "WEB",
  • "kind": "DEBIT",
  • "status": "DONE",
  • "vop": {
    },
  • "orgnl_tx": {
    },
  • "challenge": {
    }
}

Retrieve Transaction

path Parameters
pid
required
string
Example: 71VA9S9RB6ACIWJY

Transaction public id

Responses

Response samples

Content type
application/json
{
  • "pid": "UXNZ6IWJ2JESLXP3",
  • "account_pid": "KFGKJ5L27ASGTZAO",
  • "amount": 1485,
  • "fee": 15,
  • "currency": "EUR",
  • "added": "1698062541.845098",
  • "sender": {
    },
  • "recipient": {
    },
  • "remittance_information": {
    },
  • "source": "WEB",
  • "kind": "CREDIT",
  • "status": "DONE",
  • "vop": {
    },
  • "orgnl_tx": {
    }
}

List Transactions

query Parameters
cursor
string

The pagination cursor value.

account_pid
required
string
Example: account_pid=3PZ1CL75SIYEGQ0W

Account public id.

kind
string
Enum: "CREDIT" "DEBIT" "FEE"
Example: kind=CREDIT

Transaction kind

added__lte
string

Transaction added timestamp filter (in milliseconds).

added__gte
string

Transaction added timestamp filter (in milliseconds).

Responses

Response samples

Content type
application/json
{
  • "next": "string",
  • "previous": "string",
  • "results": [
    ]
}

Files

Upload File

Request Body schema:
file
required
string <binary>

File object

Responses

Request samples

Content type
{
  • "file": "string"
}

Response samples

Content type
application/json
{
  • "pid": "4NRCPH7YMU0MJ5B6",
  • "name": "id-front.png",
  • "size": 3939421,
  • "mimetype": "image/png"
}

Retrieve File Details

path Parameters
pid
required
string

Responses

Response samples

Content type
application/json
{
  • "pid": "4NRCPH7YMU0MJ5B6",
  • "name": "id-front.png",
  • "size": 3939421,
  • "mimetype": "image/png"
}

Download File

path Parameters
pid
required
string

Responses

Challenges

We store customer authorization data such as email and phone number in order to authenticate requests submitted by the partner's BaaS. Wherever the REST API returns a 2fa challenge object, the final client must confirm the requested action by entering the correct OTP code in the interface. To enable this, the BaaS partner must display an iframe to the end user as described in the FORM ELEMENTS documentation. Challenge signature should be generated in the following way:
- concatenate challenge_pid, target (email or phone numer) and private public id
- signature is the encoded base64 signature of challenge descriptor
Example:
- BaaS partner received challenge object for the private with pid "68156984" and email address example@example.com
{"pid": "T83H6LH48MMYS497", "kind": "EMAIL", "number": 5, "added": "1720954148.018724", "target": "e******@example.com", "expired": "1720954448.018724", "resent": "1720954148.018748"}
- BaaS partner generates challenge descriptor as follow:
T83H6LH48MMYS497example@example.com68156984
- The secret is the base64 encoded signature of the following challenge descriptor.

Retrieve challenge details.

path Parameters
pid
required
string

Challenge public id

Responses

Response samples

Content type
application/json
{
  • "pid": "T83H6LH48MMYS497",
  • "kind": "EMAIL",
  • "target": "e***@example.com",
  • "number": 5,
  • "added": "1698062541.845098",
  • "expired": "1698062541.845098",
  • "resent": "1698062541.845098"
}

Webhooks

transaction.created Webhook

Request Body schema: application/json

Occurs when transaction is created in the system.

pid
required
string
account_pid
required
string

Account public id.

amount
required
integer >= 0

Transaction amount in cents.

fee
required
integer
currency
required
string
Value: "EUR"
added
required
string <date-time>
object or null

May be null for returned or fee transactions.

object or null

May be null for fee transactions.

required
object

Remittance information object.

source
required
string
Enum: "WEB" "APP" "ACCOUNT_API" "BAAS_API" "CARD"
kind
required
string
Enum: "CREDIT" "DEBIT" "FEE"
status
required
string
Enum: "PENDING" "DONE" "REJECTED" "CANCELLED"
object or null

Verification of Payee (VOP) check result. Null if VOP is not applicable.

object or null

Information about original transaction in case this is a returned/rejected transaction. Null if not applicable.

Responses

Request samples

Content type
application/json
{
  • "pid": "UXNZ6IWJ2JESLXP3",
  • "account_pid": "KFGKJ5L27ASGTZAO",
  • "amount": 1485,
  • "fee": 15,
  • "currency": "EUR",
  • "added": "1698062541.845098",
  • "sender": {
    },
  • "recipient": {
    },
  • "remittance_information": {
    },
  • "source": "WEB",
  • "kind": "CREDIT",
  • "status": "DONE",
  • "vop": {
    },
  • "orgnl_tx": {
    }
}

transaction.updated Webhook

Request Body schema: application/json

Occurs when a transaction status updated.

pid
required
string
account_pid
required
string

Account public id.

amount
required
integer >= 0

Transaction amount in cents.

fee
required
integer
currency
required
string
Value: "EUR"
added
required
string <date-time>
object or null

May be null for returned or fee transactions.

object or null

May be null for fee transactions.

required
object

Remittance information object.

source
required
string
Enum: "WEB" "APP" "ACCOUNT_API" "BAAS_API" "CARD"
kind
required
string
Enum: "CREDIT" "DEBIT" "FEE"
status
required
string
Enum: "PENDING" "DONE" "REJECTED" "CANCELLED"
object or null

Verification of Payee (VOP) check result. Null if VOP is not applicable.

object or null

Information about original transaction in case this is a returned/rejected transaction. Null if not applicable.

Responses

Request samples

Content type
application/json
{
  • "pid": "UXNZ6IWJ2JESLXP3",
  • "account_pid": "KFGKJ5L27ASGTZAO",
  • "amount": 1485,
  • "fee": 15,
  • "currency": "EUR",
  • "added": "1698062541.845098",
  • "sender": {
    },
  • "recipient": {
    },
  • "remittance_information": {
    },
  • "source": "WEB",
  • "kind": "CREDIT",
  • "status": "DONE",
  • "vop": {
    },
  • "orgnl_tx": {
    }
}

entity.updated Webhook

Request Body schema: application/json

Occurs when a private or business entity updated.

One of
pid
required
string

Person public id

phone
required
string or null

Person phone number

email
required
string or null <email>

Person email address

first_name
required
string

Person first name

last_name
required
string

Person last name

birthdate
required
string <date>

Person birthdate

kind
required
string
Value: "PRIVATE"
added
required
string <date-time>
updated
required
string <date-time>
required
Array of objects (PrivateChangeRequestSchema)

Responses

Request samples

Content type
application/json
Example
{
  • "pid": "79003101",
  • "phone": "+3584573962XXX",
  • "email": "e***@example.com",
  • "first_name": "John",
  • "last_name": "Doe",
  • "birthdate": "1980-02-19",
  • "kind": "PRIVATE",
  • "added": "1698062541.845098",
  • "updated": "1698062541.845098",
  • "change_requests": [
    ]
}

change_request.updated Webhook

Request Body schema: application/json

Occurs when a change request updated [e.g. status is changed to resubmission].

One of
pid
required
string

Person change request public id

status
required
string
Enum: "INIT" "RETRY" "SUBMITTED" "REJECTED" "ACCEPTED"

Person change request status

required
object

Person change request data

retry_reason
required
string or null

Change request retry reason.

Responses

Request samples

Content type
application/json
Example
{
  • "pid": "0D2ZOJDVYT07TQKS",
  • "status": "SUBMITTED",
  • "data": {
    },
  • "retry_reason": "Thank you for providing us with the requested documents. 1) Your AML policy mentions separate Customer On-boarding and Monitoring procedures. Could you kindly share these procedures with us as well? 2) Is there ETA at place regarding separation of MLRO?"
}

Narvi Payments Oy Ab is an Authorized Electronic Money Institution (EMI). Narvi’s EMI license is granted by the Finnish Financial Supervisory Authority (FIN FSA) with the registration number 3190214-6. Narvi’s license is Passportised to all European Union countries.
© 2026 Narvi. All Rights Reserved.v1.298.0