curl -X POST "https://api.services.payward.com/v1/accounts/AA23N84GGQN4WE6I/funds/bank-links" \
-H "API-Key: $PWS_API_KEY" \
-H "API-Nonce: $PWS_API_NONCE" \
-H "API-Sign: $PWS_API_SIGN" \
-H "Content-Type: application/json" \
-d '{
"method_id": "91908d86-9f12-48bd-a4de-f46d03b1c54b",
"return_url": "https://partner.example.com/return",
"external_reference": "user-4711-primary"
}'import requests
url = "https://api.services.payward.com/v1/accounts/{account_id}/funds/bank-links"
payload = {
"method_id": "3f9a1c2e-8b7d-4e6f-9a1b-2c3d4e5f6a7b",
"return_url": "https://partner.example.com/bank-link/return",
"external_reference": "order-abc-123"
}
headers = {
"API-Key": "<api-key>",
"API-Sign": "<api-key>",
"API-Nonce": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'API-Key': '<api-key>',
'API-Sign': '<api-key>',
'API-Nonce': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
method_id: '3f9a1c2e-8b7d-4e6f-9a1b-2c3d4e5f6a7b',
return_url: 'https://partner.example.com/bank-link/return',
external_reference: 'order-abc-123'
})
};
fetch('https://api.services.payward.com/v1/accounts/{account_id}/funds/bank-links', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.services.payward.com/v1/accounts/{account_id}/funds/bank-links",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'method_id' => '3f9a1c2e-8b7d-4e6f-9a1b-2c3d4e5f6a7b',
'return_url' => 'https://partner.example.com/bank-link/return',
'external_reference' => 'order-abc-123'
]),
CURLOPT_HTTPHEADER => [
"API-Key: <api-key>",
"API-Nonce: <api-key>",
"API-Sign: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.services.payward.com/v1/accounts/{account_id}/funds/bank-links"
payload := strings.NewReader("{\n \"method_id\": \"3f9a1c2e-8b7d-4e6f-9a1b-2c3d4e5f6a7b\",\n \"return_url\": \"https://partner.example.com/bank-link/return\",\n \"external_reference\": \"order-abc-123\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("API-Key", "<api-key>")
req.Header.Add("API-Sign", "<api-key>")
req.Header.Add("API-Nonce", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.services.payward.com/v1/accounts/{account_id}/funds/bank-links")
.header("API-Key", "<api-key>")
.header("API-Sign", "<api-key>")
.header("API-Nonce", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"method_id\": \"3f9a1c2e-8b7d-4e6f-9a1b-2c3d4e5f6a7b\",\n \"return_url\": \"https://partner.example.com/bank-link/return\",\n \"external_reference\": \"order-abc-123\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.services.payward.com/v1/accounts/{account_id}/funds/bank-links")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["API-Key"] = '<api-key>'
request["API-Sign"] = '<api-key>'
request["API-Nonce"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"method_id\": \"3f9a1c2e-8b7d-4e6f-9a1b-2c3d4e5f6a7b\",\n \"return_url\": \"https://partner.example.com/bank-link/return\",\n \"external_reference\": \"order-abc-123\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"bank_link_id": "bal_5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b",
"method_id": "3f9a1c2e-8b7d-4e6f-9a1b-2c3d4e5f6a7b",
"status": "pending",
"accounts_eligibility_status": "unknown",
"next_action": {
"type": "hosted_link",
"widget_url": "https://bank-link.services.payward.com/link/bal_5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b",
"expires_at": "2026-07-02T16:00:00Z"
}
}
}{
"error": {
"type": "<string>",
"status": 400,
"instance": "<string>",
"code": "bad_request",
"doc_url": "<string>",
"causes": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"type": "<string>",
"status": 401,
"instance": "<string>",
"code": "unauthenticated",
"doc_url": "<string>",
"causes": [
{}
]
}
}{
"error": {
"type": "<string>",
"status": 403,
"instance": "<string>",
"code": "forbidden",
"doc_url": "<string>",
"causes": [
{}
]
}
}{
"error": {
"type": "request_error",
"status": 404,
"instance": "<string>",
"code": "not_found",
"doc_url": "<string>"
}
}{
"error": {
"type": "<string>",
"status": 429,
"instance": "<string>",
"code": "resource_exhausted",
"doc_url": "<string>",
"causes": [
{}
]
}
}{
"error": {
"type": "<string>",
"status": 500,
"instance": "<string>",
"code": "internal",
"doc_url": "<string>",
"causes": [
{}
]
}
}{
"error": {
"type": "<string>",
"status": 501,
"instance": "<string>",
"code": "unimplemented",
"doc_url": "<string>",
"causes": [
{}
]
}
}{
"error": {
"type": "<string>",
"status": 503,
"instance": "<string>",
"code": "unavailable",
"doc_url": "<string>",
"causes": [
{}
]
}
}{
"error": {
"type": "<string>",
"status": 504,
"instance": "<string>",
"code": "deadline_exceeded",
"doc_url": "<string>",
"causes": [
{}
]
}
}Create bank link
Creates a Bank Link — a connection between this account and one banking institution — for a funding method that requires linking. Returns it in pending with a hosted-widget URL; send the user there to choose their institution and approve access. Every bank account the user shares becomes an Account Link under this Bank Link once it activates.
method_id must be a method this account can currently use. Discover methods with GET /v1/accounts/{account_id}/funds/deposits/methods/{asset_symbol}. Any other value is rejected with bank_link_method_not_linkable rather than creating a link that cannot complete.
Provider identifiers, access tokens, owner names, and raw bank numbers are never returned. Reference the link and its accounts only by bank_link_id and account_link_id.
curl -X POST "https://api.services.payward.com/v1/accounts/AA23N84GGQN4WE6I/funds/bank-links" \
-H "API-Key: $PWS_API_KEY" \
-H "API-Nonce: $PWS_API_NONCE" \
-H "API-Sign: $PWS_API_SIGN" \
-H "Content-Type: application/json" \
-d '{
"method_id": "91908d86-9f12-48bd-a4de-f46d03b1c54b",
"return_url": "https://partner.example.com/return",
"external_reference": "user-4711-primary"
}'import requests
url = "https://api.services.payward.com/v1/accounts/{account_id}/funds/bank-links"
payload = {
"method_id": "3f9a1c2e-8b7d-4e6f-9a1b-2c3d4e5f6a7b",
"return_url": "https://partner.example.com/bank-link/return",
"external_reference": "order-abc-123"
}
headers = {
"API-Key": "<api-key>",
"API-Sign": "<api-key>",
"API-Nonce": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'API-Key': '<api-key>',
'API-Sign': '<api-key>',
'API-Nonce': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
method_id: '3f9a1c2e-8b7d-4e6f-9a1b-2c3d4e5f6a7b',
return_url: 'https://partner.example.com/bank-link/return',
external_reference: 'order-abc-123'
})
};
fetch('https://api.services.payward.com/v1/accounts/{account_id}/funds/bank-links', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.services.payward.com/v1/accounts/{account_id}/funds/bank-links",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'method_id' => '3f9a1c2e-8b7d-4e6f-9a1b-2c3d4e5f6a7b',
'return_url' => 'https://partner.example.com/bank-link/return',
'external_reference' => 'order-abc-123'
]),
CURLOPT_HTTPHEADER => [
"API-Key: <api-key>",
"API-Nonce: <api-key>",
"API-Sign: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.services.payward.com/v1/accounts/{account_id}/funds/bank-links"
payload := strings.NewReader("{\n \"method_id\": \"3f9a1c2e-8b7d-4e6f-9a1b-2c3d4e5f6a7b\",\n \"return_url\": \"https://partner.example.com/bank-link/return\",\n \"external_reference\": \"order-abc-123\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("API-Key", "<api-key>")
req.Header.Add("API-Sign", "<api-key>")
req.Header.Add("API-Nonce", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.services.payward.com/v1/accounts/{account_id}/funds/bank-links")
.header("API-Key", "<api-key>")
.header("API-Sign", "<api-key>")
.header("API-Nonce", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"method_id\": \"3f9a1c2e-8b7d-4e6f-9a1b-2c3d4e5f6a7b\",\n \"return_url\": \"https://partner.example.com/bank-link/return\",\n \"external_reference\": \"order-abc-123\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.services.payward.com/v1/accounts/{account_id}/funds/bank-links")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["API-Key"] = '<api-key>'
request["API-Sign"] = '<api-key>'
request["API-Nonce"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"method_id\": \"3f9a1c2e-8b7d-4e6f-9a1b-2c3d4e5f6a7b\",\n \"return_url\": \"https://partner.example.com/bank-link/return\",\n \"external_reference\": \"order-abc-123\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"bank_link_id": "bal_5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b",
"method_id": "3f9a1c2e-8b7d-4e6f-9a1b-2c3d4e5f6a7b",
"status": "pending",
"accounts_eligibility_status": "unknown",
"next_action": {
"type": "hosted_link",
"widget_url": "https://bank-link.services.payward.com/link/bal_5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b",
"expires_at": "2026-07-02T16:00:00Z"
}
}
}{
"error": {
"type": "<string>",
"status": 400,
"instance": "<string>",
"code": "bad_request",
"doc_url": "<string>",
"causes": [
{
"field": "<string>",
"message": "<string>"
}
]
}
}{
"error": {
"type": "<string>",
"status": 401,
"instance": "<string>",
"code": "unauthenticated",
"doc_url": "<string>",
"causes": [
{}
]
}
}{
"error": {
"type": "<string>",
"status": 403,
"instance": "<string>",
"code": "forbidden",
"doc_url": "<string>",
"causes": [
{}
]
}
}{
"error": {
"type": "request_error",
"status": 404,
"instance": "<string>",
"code": "not_found",
"doc_url": "<string>"
}
}{
"error": {
"type": "<string>",
"status": 429,
"instance": "<string>",
"code": "resource_exhausted",
"doc_url": "<string>",
"causes": [
{}
]
}
}{
"error": {
"type": "<string>",
"status": 500,
"instance": "<string>",
"code": "internal",
"doc_url": "<string>",
"causes": [
{}
]
}
}{
"error": {
"type": "<string>",
"status": 501,
"instance": "<string>",
"code": "unimplemented",
"doc_url": "<string>",
"causes": [
{}
]
}
}{
"error": {
"type": "<string>",
"status": 503,
"instance": "<string>",
"code": "unavailable",
"doc_url": "<string>",
"causes": [
{}
]
}
}{
"error": {
"type": "<string>",
"status": 504,
"instance": "<string>",
"code": "deadline_exceeded",
"doc_url": "<string>",
"causes": [
{}
]
}
}Authorizations
Your public API key. Identifies the partner making the request.
HMAC signature over the request, computed with your private key.
Monotonically increasing nonce included in the request signature.
Path Parameters
Public identifier of the account the link belongs to.
14 - 42Body
Funding method to link — a method ID, never a name. Use GET /v1/accounts/{account_id}/funds/deposits/methods/{asset_symbol} to discover the methods available to this account.
1 - 64Optional partner URL to return the user to after the hosted widget completes. When supplied it must be an absolute https URL without userinfo; other values are rejected.
1 - 2048Optional partner correlation value.
1 - 64Response
Successful response
The Bank Link, in pending with a next_action.
Show child attributes
Show child attributes