Create a non-persistent access request
const url = 'https://api.banklink.co.za/v1/access-requests';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"reference":"affordability-check-774","bank_id":"absa","return_options":{"dateFrom":"2026-06-01","dateTo":"2026-08-31"},"destinations":[{"type":"webhook","url":"https://example.co.za/banklink/callback"}],"expires_at":"2026-09-18T12:00:00.000Z","redirect_url":"https://example.co.za/apply/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/access-requests \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "reference": "affordability-check-774", "bank_id": "absa", "return_options": { "dateFrom": "2026-06-01", "dateTo": "2026-08-31" }, "destinations": [ { "type": "webhook", "url": "https://example.co.za/banklink/callback" } ], "expires_at": "2026-09-18T12:00:00.000Z", "redirect_url": "https://example.co.za/apply/bank-done" }'Creates a single-use hosted URL to send to your customer. Banklink logs
in, fetches the configured date range, and sends it to the configured
webhook or email. It does not create a bank profile and never stores the
customer’s credentials or fetched transactions. Dashboard destinations
and save_data are therefore not supported.
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": "affordability-check-774", "bank_id": "absa", "return_options": { "dateFrom": "2026-06-01", "dateTo": "2026-08-31" }, "destinations": [ { "type": "webhook", "url": "https://example.co.za/banklink/callback" } ], "expires_at": "2026-09-18T12:00:00.000Z", "redirect_url": "https://example.co.za/apply/bank-done"}Responses
Section titled “Responses”Access 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" }}