Receiving payments on your website using bunq.me
Imagine you're running a charity and want to collect donations directly through your website. After someone donates, you'd like to redirect them to a custom "Thank You" page— to show appreciation, share what their donation supports, or even offer a downloadable gift or receipt.
In this tutorial, you’ll learn how to use the bunq API to:
Create a payment link you can share or embed on your site
Add a redirect URL that sends users to a confirmation or thank-you page after payment
Make the experience smooth, branded, and personal
This works great for charities, event registrations, fundraising campaigns, or any situation where you want to acknowledge someone after they’ve completed a payment.
Let’s dive in and build a seamless donation flow with a touch of gratitude 💚
Let's create a link that we can embed in our own website
In order to create a custom link we'll need the bunq.me-tab endpoints. This allows you to create a payment request and embed the link on your site.
We start by creating a bunq.me tab
We post the following body. Note that you can set a redirect URL to your own thank you page. You can use this can also be used to add url parameters, for example a user id so you can retrieve the user in your own database. For this example we'll just redirect to the bunq homepage
{
"bunqme_tab_entry": {
"amount_inquired": {
"value": "10.00",
"currency": "EUR"
},
"description": "Donation",
"redirect_url": "https://bunq.com"
},
"status": "string",
"event_id": 0
}
This returns us a simple response with the ID of our new bunq.me tab
{
"Response": [
{
"Id": {
"id": 7567
}
}
]
}
API call
bunq.me tabs allows you to create a payment request and share the link through e-mail, chat, etc. Multiple persons are able to respond to the payment request and pay through bunq, iDeal or SOFORT.
The standard HTTP Cache-Control header is required for all signed requests.
The User-Agent header field should contain information about the user agent originating the request. There are no restrictions on the value of this header.
The X-Bunq-Language header must contain a preferred language indication. The value of this header is formatted as a ISO 639-1 language code plus a ISO 3166-1 alpha-2 country code, separated by an underscore. Currently only the languages en_US and nl_NL are supported. Anything else will default to en_US.
The X-Bunq-Region header must contain the region (country) of the client device. The value of this header is formatted as a ISO 639-1 language code plus a ISO 3166-1 alpha-2 country code, separated by an underscore.
This header must specify an ID with each request that is unique for the logged in user. There are no restrictions for the format of this ID. However, the server will respond with an error when the same ID is used again on the same DeviceServer.
This header must specify the geolocation of the device. The format of this value is longitude latitude altitude radius country. The country is expected to be formatted of an ISO 3166-1 alpha-2 country code. When no geolocation is available or known the header must still be included but can be zero valued.
The authentication token is used to authenticate the source of the API call. It is required by all API calls except for POST /v1/installation. It is important to note that the device and session calls are using the token from the response of the installation call, while all the other calls use the token from the response of the session-server call
The status of the bunq.me. Ignored in POST requests but can be used for cancelling the bunq.me by setting status as CANCELLED with a PUT request.
The ID of the related event if the bunqMeTab made by 'split' functionality.
POST /v1/user/{userID}/monetary-account/{monetary-accountID}/bunqme-tab HTTP/1.1
Host: public-api.sandbox.bunq.com
User-Agent: text
X-Bunq-Client-Authentication: text
Content-Type: application/json
Accept: */*
Content-Length: 147
{
"bunqme_tab_entry": {
"amount_inquired": {
"value": "text",
"currency": "text"
},
"description": "text",
"redirect_url": "text"
},
"status": "text",
"event_id": 1
}
{
"id": 1
}
So we created the tab, but what is the URL we can send our user to?
We'll need to make a second API call in order to retrieve all data. This one is simply a get request using the ID that we got from our POST message (see below. It returns us a object with one key called bunq-me-tab-share-url
This url is what you can add to your website. For instance on a button that says 'donate now' or 'go to checkout'.
When the user clicks on that link they will be send to a payment portal. That looks like this. The URL expires in 20 minutes and once the user pays they will be redirected to the redirect URL that we provided.

bunq.me tabs allows you to create a payment request and share the link through e-mail, chat, etc. Multiple persons are able to respond to the payment request and pay through bunq, iDeal or SOFORT.
The standard HTTP Cache-Control header is required for all signed requests.
The User-Agent header field should contain information about the user agent originating the request. There are no restrictions on the value of this header.
The X-Bunq-Language header must contain a preferred language indication. The value of this header is formatted as a ISO 639-1 language code plus a ISO 3166-1 alpha-2 country code, separated by an underscore. Currently only the languages en_US and nl_NL are supported. Anything else will default to en_US.
The X-Bunq-Region header must contain the region (country) of the client device. The value of this header is formatted as a ISO 639-1 language code plus a ISO 3166-1 alpha-2 country code, separated by an underscore.
This header must specify an ID with each request that is unique for the logged in user. There are no restrictions for the format of this ID. However, the server will respond with an error when the same ID is used again on the same DeviceServer.
This header must specify the geolocation of the device. The format of this value is longitude latitude altitude radius country. The country is expected to be formatted of an ISO 3166-1 alpha-2 country code. When no geolocation is available or known the header must still be included but can be zero valued.
The authentication token is used to authenticate the source of the API call. It is required by all API calls except for POST /v1/installation. It is important to note that the device and session calls are using the token from the response of the installation call, while all the other calls use the token from the response of the session-server call
GET /v1/user/{userID}/monetary-account/{monetary-accountID}/bunqme-tab/{itemId} HTTP/1.1
Host: public-api.sandbox.bunq.com
User-Agent: text
X-Bunq-Client-Authentication: text
Accept: */*
{
"id": 1,
"created": "text",
"updated": "text",
"time_expiry": "text",
"monetary_account_id": 1,
"status": "text",
"type": "text",
"alias_monetary_account": {
"iban": "text",
"display_name": "text",
"avatar": {
"uuid": "text",
"anchor_uuid": "text",
"image": [
{
"attachment_public_uuid": "text",
"content_type": "text",
"height": 1,
"width": 1
}
],
"style": "text"
},
"label_user": {
"uuid": "text",
"display_name": "text",
"country": "text",
"avatar": {
"uuid": "text",
"anchor_uuid": "text",
"image": [
{
"attachment_public_uuid": "text",
"content_type": "text",
"height": 1,
"width": 1
}
],
"style": "text"
},
"public_nick_name": "text"
},
"country": "text",
"bunq_me": {
"type": "text",
"value": "text",
"name": "text"
},
"is_light": true,
"swift_bic": "text",
"swift_account_number": "text",
"transferwise_account_number": "text",
"transferwise_bank_code": "text",
"merchant_category_code": "text"
},
"bunqme_tab_share_url": "text",
"bunqme_tab_entry": {
"amount_inquired": {
"value": "text",
"currency": "text"
},
"description": "text",
"redirect_url": "text",
"uuid": "text",
"alias": {
"iban": "text",
"display_name": "text",
"avatar": {
"uuid": "text",
"anchor_uuid": "text",
"image": [
{
"attachment_public_uuid": "text",
"content_type": "text",
"height": 1,
"width": 1
}
],
"style": "text"
},
"label_user": {
"uuid": "text",
"display_name": "text",
"country": "text",
"avatar": {
"uuid": "text",
"anchor_uuid": "text",
"image": [
{
"attachment_public_uuid": "text",
"content_type": "text",
"height": 1,
"width": 1
}
],
"style": "text"
},
"public_nick_name": "text"
},
"country": "text",
"bunq_me": {
"type": "text",
"value": "text",
"name": "text"
},
"is_light": true,
"swift_bic": "text",
"swift_account_number": "text",
"transferwise_account_number": "text",
"transferwise_bank_code": "text",
"merchant_category_code": "text"
},
"status": "text",
"merchant_available": [
{
"merchant_type": "text",
"available": true
}
],
"invite_profile_name": "text"
},
"bunqme_tab_entries": [
{
"amount_inquired": {
"value": "text",
"currency": "text"
},
"description": "text",
"redirect_url": "text",
"uuid": "text",
"alias": {
"iban": "text",
"display_name": "text",
"avatar": {
"uuid": "text",
"anchor_uuid": "text",
"image": [
{
"attachment_public_uuid": "text",
"content_type": "text",
"height": 1,
"width": 1
}
],
"style": "text"
},
"label_user": {
"uuid": "text",
"display_name": "text",
"country": "text",
"avatar": {
"uuid": "text",
"anchor_uuid": "text",
"image": [
{
"attachment_public_uuid": "text",
"content_type": "text",
"height": 1,
"width": 1
}
],
"style": "text"
},
"public_nick_name": "text"
},
"country": "text",
"bunq_me": {
"type": "text",
"value": "text",
"name": "text"
},
"is_light": true,
"swift_bic": "text",
"swift_account_number": "text",
"transferwise_account_number": "text",
"transferwise_bank_code": "text",
"merchant_category_code": "text"
},
"status": "text",
"merchant_available": [
{
"merchant_type": "text",
"available": true
}
],
"invite_profile_name": "text"
}
],
"result_inquiries": [
{
"payment": {
"amount": {
"value": "text",
"currency": "text"
},
"counterparty_alias": {
"iban": "text",
"display_name": "text",
"avatar": {
"uuid": "text",
"anchor_uuid": "text",
"image": [
{
"attachment_public_uuid": "text",
"content_type": "text",
"height": 1,
"width": 1
}
],
"style": "text"
},
"label_user": {
"uuid": "text",
"display_name": "text",
"country": "text",
"avatar": {
"uuid": "text",
"anchor_uuid": "text",
"image": [
{
"attachment_public_uuid": "text",
"content_type": "text",
"height": 1,
"width": 1
}
],
"style": "text"
},
"public_nick_name": "text"
},
"country": "text",
"bunq_me": {
"type": "text",
"value": "text",
"name": "text"
},
"is_light": true,
"swift_bic": "text",
"swift_account_number": "text",
"transferwise_account_number": "text",
"transferwise_bank_code": "text",
"merchant_category_code": "text"
},
"description": "text",
"attachment": [
{
"id": 1,
"monetary_account_id": 1
}
],
"merchant_reference": "text",
"id": 1,
"created": "text",
"updated": "text",
"monetary_account_id": 1,
"alias": {
"iban": "text",
"display_name": "text",
"avatar": {
"uuid": "text",
"anchor_uuid": "text",
"image": [
{
"attachment_public_uuid": "text",
"content_type": "text",
"height": 1,
"width": 1
}
],
"style": "text"
},
"label_user": {
"uuid": "text",
"display_name": "text",
"country": "text",
"avatar": {
"uuid": "text",
"anchor_uuid": "text",
"image": [
{
"attachment_public_uuid": "text",
"content_type": "text",
"height": 1,
"width": 1
}
],
"style": "text"
},
"public_nick_name": "text"
},
"country": "text",
"bunq_me": {
"type": "text",
"value": "text",
"name": "text"
},
"is_light": true,
"swift_bic": "text",
"swift_account_number": "text",
"transferwise_account_number": "text",
"transferwise_bank_code": "text",
"merchant_category_code": "text"
},
"type": "text",
"sub_type": "text",
"payment_arrival_expected": {
"status": "text",
"time": "text"
},
"bunqto_status": "text",
"bunqto_sub_status": "text",
"bunqto_share_url": "text",
"bunqto_expiry": "text",
"bunqto_time_responded": "text",
"batch_id": 1,
"scheduled_id": 1,
"address_shipping": {
"street": "text",
"house_number": "text",
"po_box": "text",
"postal_code": "text",
"city": "text",
"country": "text",
"extra": "text",
"mailbox_name": "text",
"province": "text",
"is_user_address_updated": true
},
"address_billing": {
"street": "text",
"house_number": "text",
"po_box": "text",
"postal_code": "text",
"city": "text",
"country": "text",
"extra": "text",
"mailbox_name": "text",
"province": "text",
"is_user_address_updated": true
},
"geolocation": {
"latitude": 1,
"longitude": 1,
"altitude": 1,
"radius": 1
},
"request_reference_split_the_bill": [
{
"type": "text",
"id": 1
}
],
"balance_after_mutation": {
"value": "text",
"currency": "text"
},
"payment_auto_allocate_instance": {
"id": 1,
"created": "text",
"updated": "text",
"payment_auto_allocate_id": 1,
"status": "text",
"error_message": [
[
{
"error_description": "text",
"error_description_translated": "text"
}
]
],
"payment_batch": {
"payments": "[Circular Reference]"
},
"payment_id": 1
},
"payment_suspended_outgoing": {
"status": "text",
"monetary_account_id": "text",
"time_execution": "text"
}
},
"bunq_me_tab_id": 1
}
]
}
Example response that shows the bunqme_tab_share_url
{
"Response": [
{
"BunqMeTab": {
"id": 7602,
"created": "2025-04-16 11:34:47.843460",
"updated": "2025-04-16 11:34:47.843460",
"time_expiry": "2025-05-16 11:34:47.843107",
"monetary_account_id": 2079522,
"status": "WAITING_FOR_PAYMENT",
"type": "BUNQ_ME",
"alias_monetary_account": {
"iban": "NL53BUNQ2090359587",
"is_light": false,
"display_name": "N. Carter",
"avatar": {...},
"label_user": {... },
"bunqme_tab_share_url": "https://bunqme.triage.bunq.net/o/6kwsisQcpUD4hWaBZUnuW4",
"bunqme_tab_entry": {
"uuid": "de05a8a3-3257-4e73-a004-af3638251e5c",
"created": "2025-04-16 11:34:47.887847",
"updated": "2025-04-16 11:34:47.887847",
"amount_inquired": {
"currency": "EUR",
"value": "1.00"
},
"status": "WAITING_FOR_PAYMENT",
"description": "Donation",
"alias": {
"iban": "NL53BUNQ2090359587",
"is_light": false,
"display_name": "N. Carter",
"avatar": {
"uuid": "419bbe21-52d7-4037-8787-a57e4c649049",
"image": [
{
"attachment_public_uuid": "ef1a52ce-6b3a-4357-b716-de91948b831d",
"height": 1023,
"width": 1024,
"content_type": "image/png",
"urls": [
{
"type": "ORIGINAL",
"url": "https://bunq-triage-model-storage-public.s3.eu-central-1.amazonaws.com/bunq_file/File/content/921ece497cd00f4e0cef3f0f63a962c31cf3f8e35311d127d5a7b23be3d074d5.png"
}
]
}
],
"anchor_uuid": null,
"style": "NONE"
},
"label_user": {
"uuid": "5f33833d-f416-428b-a654-d3b25bb3bc9d",
"display_name": "N. Carter",
"country": "NL",
"avatar": {
"uuid": "9debf55b-70b1-4d43-8d51-d6e7bd42fb5b",
"image": [
{
"attachment_public_uuid": "4b7e0d1d-9167-48ac-990a-70e342c87812",
"height": 126,
"width": 200,
"content_type": "image/jpeg",
"urls": [
{
"type": "ORIGINAL",
"url": "https://bunq-triage-model-storage-public.s3.eu-central-1.amazonaws.com/bunq_file/File/content/6979a145b7ea9ecc3459358122cb560608f02d36d4b8cd6b770f50e36aa35512.jpg"
}
]
}
],
"anchor_uuid": "5f33833d-f416-428b-a654-d3b25bb3bc9d",
"style": "NONE"
},
"public_nick_name": "Nicola",
"type": "PERSON"
},
"country": "NL"
},
"redirect_url": "https://bunq.com",
"merchant_available": [
{
"merchant_type": "IDEAL",
"available": true
},
{
"merchant_type": "SOFORT",
"available": true
},
{
"merchant_type": "CHECKOUT",
"available": true
},
{
"merchant_type": "BANCONTACT",
"available": true
},
{
"merchant_type": "BUNQ",
"available": true
}
],
"invite_profile_name": "NicolaLilacGorilla"
},
"bunqme_tab_entries": [
{
"id": 7479,
"created": "2025-04-16 11:34:47.887847",
"updated": "2025-04-16 11:34:47.887847",
"amount_inquired": {
"currency": "EUR",
"value": "1.00"
},
"status": "WAITING_FOR_PAYMENT",
"description": "Donation",
"alias": {
"iban": "NL53BUNQ2090359587",
"is_light": false,
"display_name": "N. Carter",
"avatar": {
"uuid": "419bbe21-52d7-4037-8787-a57e4c649049",
"image": [
{
"attachment_public_uuid": "ef1a52ce-6b3a-4357-b716-de91948b831d",
"height": 1023,
"width": 1024,
"content_type": "image/png",
"urls": [
{
"type": "ORIGINAL",
"url": "https://bunq-triage-model-storage-public.s3.eu-central-1.amazonaws.com/bunq_file/File/content/921ece497cd00f4e0cef3f0f63a962c31cf3f8e35311d127d5a7b23be3d074d5.png"
}
]
}
],
"anchor_uuid": null,
"style": "NONE"
},
"label_user": {
"uuid": "5f33833d-f416-428b-a654-d3b25bb3bc9d",
"display_name": "N. Carter",
"country": "NL",
"avatar": {
"uuid": "9debf55b-70b1-4d43-8d51-d6e7bd42fb5b",
"image": [
{
"attachment_public_uuid": "4b7e0d1d-9167-48ac-990a-70e342c87812",
"height": 126,
"width": 200,
"content_type": "image/jpeg",
"urls": [
{
"type": "ORIGINAL",
"url": "https://bunq-triage-model-storage-public.s3.eu-central-1.amazonaws.com/bunq_file/File/content/6979a145b7ea9ecc3459358122cb560608f02d36d4b8cd6b770f50e36aa35512.jpg"
}
]
}
],
"anchor_uuid": "5f33833d-f416-428b-a654-d3b25bb3bc9d",
"style": "NONE"
},
"public_nick_name": "Nicola",
"type": "PERSON"
},
"country": "NL"
},
"redirect_url": "https://bunq.com"
}
],
"result_inquiries": []
}
}
]
}
As we can see our URL Will be: "https://bunqme.triage.bunq.net/o/6kwsisQcpUD4hWaBZUnuW4", So we can add that to our own webpage. Sending the user to that page brings them to this page where they can make their payment.
Be aware the URL to your tab eventually expires
It's good to know that bunq.me-tab links eventually expire. The bunqmetab object has a property time_expiry that tells you when.
{
"Response": [
{
"BunqMeTab": {
"id": 7602,
"created": "2025-04-16 11:34:47.843460",
"updated": "2025-04-16 11:40:34.412358",
"time_expiry": "2025-05-16 11:34:47.843107",
other properties...
},
}]
}
The Redirect to your thank you page
This is already set up. When you made the initial POST request to set up your bunq.me tab you added a redirect_url and you can see it in the response. So when the user pays, they will be automatically forwarded to bunq.com which I specified in the initial POST request.
If you want to retrieve the user of your system to the thank you page (or any redirect page for that matter) then you may want to construct a bunqme-tab for each individual user. Let's assume your system keeps track of a userid then you could construct a redirect URL like so:
https://redirecturl.com/checkout_completed/{userid_of_your_user}
This allows you to retrieve the userdetails from your database and enable a subscription, or send them an email as a result.
How do I get a list of payments?
If you wonder how you got paid they you can always check the payments in your monetary account. But there is a much easier way. Simply by doing another GET request on the /bunqme-tab endpoint gets you the object that we already showed above.
Last updated
Was this helpful?