Create a persistent link request
const url = 'https://api.banklink.co.za/v1/link-requests';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"reference":"customer-4821","name":"Customer 4821 onboarding","bank_id":"fnb","return_options":{"dateFrom":"2026-08-01","dateTo":"2026-08-31"},"destinations":[{"type":"webhook","url":"https://example.co.za/banklink/callback"}],"save_data":true,"expires_at":"2026-09-18T12:00:00.000Z","redirect_url":"https://example.co.za/onboarding/bank-done"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.banklink.co.za/v1/link-requests \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "reference": "customer-4821", "name": "Customer 4821 onboarding", "bank_id": "fnb", "return_options": { "dateFrom": "2026-08-01", "dateTo": "2026-08-31" }, "destinations": [ { "type": "webhook", "url": "https://example.co.za/banklink/callback" } ], "save_data": true, "expires_at": "2026-09-18T12:00:00.000Z", "redirect_url": "https://example.co.za/onboarding/bank-done" }'Creates a single-use hosted URL to send to your customer. Completing the
link creates a reusable bank profile and stores encrypted credentials for
later syncs. Set save_data: true to retain the fetched transactions in
Banklink in addition to any webhook or email delivery.
Requires the link scope and a verified link profile. Test keys create
a synthetic hosted link and do not contact a bank or external destination.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
Your identifier, echoed in webhook payloads and request records
Optional internal label. Defaults to reference.
Restrict the link to one bank, or omit to let the customer choose
object
Webhook/email delivery targets. Link requests may use an empty array
when save_data is true. Live webhook URLs must be https on your
verified domain (or a subdomain); deliveries are signed.
object
object
Link requests only. Persist fetched transactions in Banklink.
Where to send the customer when they finish or cancel. https on your
verified domain (test keys may also use http://localhost). Defaults
to your link profile’s redirect URL. Banklink appends
banklink_status (success, cancelled, expired, revoked,
already_completed) and banklink_reference. Treat it as a UI hint;
the signed webhook is the source of truth.
Example
{ "reference": "customer-4821", "name": "Customer 4821 onboarding", "bank_id": "fnb", "return_options": { "dateFrom": "2026-08-01", "dateTo": "2026-08-31" }, "destinations": [ { "type": "webhook", "url": "https://example.co.za/banklink/callback" } ], "save_data": true, "expires_at": "2026-09-18T12:00:00.000Z", "redirect_url": "https://example.co.za/onboarding/bank-done"}Responses
Section titled “Responses”Link request created
object
object
Opaque single-use token embedded in the hosted URL
object
object
Present on link requests
Why the customer’s last attempt failed, while the request is pending
Set when the bank fetch succeeded but a webhook/email delivery failed
Example
{ "data": { "status": "pending", "kind": "link" }}Invalid request configuration
object
object
Machine-readable error code
Human-readable error description
Example
{ "error": { "code": "not_found", "message": "Account not found" }}Missing or invalid API key
object
object
Machine-readable error code
Human-readable error description
Example
{ "error": { "code": "unauthorized", "message": "Invalid or missing API key" }}The organisation’s link profile isn’t verified yet
object
object
Machine-readable error code
Human-readable error description
Example
{ "error": { "code": "org_not_verified", "message": "Verify your organisation's link profile before creating link or access requests: https://app.banklink.co.za/?page=link-requests" }}