Create Plaid link token
curl --request POST \
--url https://api.brale.xyz/accounts/{account_id}/plaid/link_token \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"legal_name": "John Doe",
"email_address": "user@example.com",
"phone_number": "+1234567890",
"date_of_birth": "1990-01-01",
"client_name": "Rhythmic"
}
'import requests
url = "https://api.brale.xyz/accounts/{account_id}/plaid/link_token"
payload = {
"legal_name": "John Doe",
"email_address": "user@example.com",
"phone_number": "+1234567890",
"date_of_birth": "1990-01-01",
"client_name": "Rhythmic"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
legal_name: 'John Doe',
email_address: 'user@example.com',
phone_number: '+1234567890',
date_of_birth: '1990-01-01',
client_name: 'Rhythmic'
})
};
fetch('https://api.brale.xyz/accounts/{account_id}/plaid/link_token', 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.brale.xyz/accounts/{account_id}/plaid/link_token",
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([
'legal_name' => 'John Doe',
'email_address' => 'user@example.com',
'phone_number' => '+1234567890',
'date_of_birth' => '1990-01-01',
'client_name' => 'Rhythmic'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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.brale.xyz/accounts/{account_id}/plaid/link_token"
payload := strings.NewReader("{\n \"legal_name\": \"John Doe\",\n \"email_address\": \"user@example.com\",\n \"phone_number\": \"+1234567890\",\n \"date_of_birth\": \"1990-01-01\",\n \"client_name\": \"Rhythmic\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.brale.xyz/accounts/{account_id}/plaid/link_token")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"legal_name\": \"John Doe\",\n \"email_address\": \"user@example.com\",\n \"phone_number\": \"+1234567890\",\n \"date_of_birth\": \"1990-01-01\",\n \"client_name\": \"Rhythmic\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.brale.xyz/accounts/{account_id}/plaid/link_token")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"legal_name\": \"John Doe\",\n \"email_address\": \"user@example.com\",\n \"phone_number\": \"+1234567890\",\n \"date_of_birth\": \"1990-01-01\",\n \"client_name\": \"Rhythmic\"\n}"
response = http.request(request)
puts response.read_body{
"link_token": "link-sandbox-123456789",
"expiration": "2024-01-01T12:00:00Z",
"callback_url": "https://customer.com/webhooks/plaid-updates"
}Financial institutions
Create Plaid link token
Step 1 of the Plaid-linked bank account flow. Generates a Plaid Link token to launch the Plaid UI for connecting a bank account.
POST
/
accounts
/
{account_id}
/
plaid
/
link_token
Create Plaid link token
curl --request POST \
--url https://api.brale.xyz/accounts/{account_id}/plaid/link_token \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"legal_name": "John Doe",
"email_address": "user@example.com",
"phone_number": "+1234567890",
"date_of_birth": "1990-01-01",
"client_name": "Rhythmic"
}
'import requests
url = "https://api.brale.xyz/accounts/{account_id}/plaid/link_token"
payload = {
"legal_name": "John Doe",
"email_address": "user@example.com",
"phone_number": "+1234567890",
"date_of_birth": "1990-01-01",
"client_name": "Rhythmic"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
legal_name: 'John Doe',
email_address: 'user@example.com',
phone_number: '+1234567890',
date_of_birth: '1990-01-01',
client_name: 'Rhythmic'
})
};
fetch('https://api.brale.xyz/accounts/{account_id}/plaid/link_token', 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.brale.xyz/accounts/{account_id}/plaid/link_token",
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([
'legal_name' => 'John Doe',
'email_address' => 'user@example.com',
'phone_number' => '+1234567890',
'date_of_birth' => '1990-01-01',
'client_name' => 'Rhythmic'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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.brale.xyz/accounts/{account_id}/plaid/link_token"
payload := strings.NewReader("{\n \"legal_name\": \"John Doe\",\n \"email_address\": \"user@example.com\",\n \"phone_number\": \"+1234567890\",\n \"date_of_birth\": \"1990-01-01\",\n \"client_name\": \"Rhythmic\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.brale.xyz/accounts/{account_id}/plaid/link_token")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"legal_name\": \"John Doe\",\n \"email_address\": \"user@example.com\",\n \"phone_number\": \"+1234567890\",\n \"date_of_birth\": \"1990-01-01\",\n \"client_name\": \"Rhythmic\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.brale.xyz/accounts/{account_id}/plaid/link_token")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"legal_name\": \"John Doe\",\n \"email_address\": \"user@example.com\",\n \"phone_number\": \"+1234567890\",\n \"date_of_birth\": \"1990-01-01\",\n \"client_name\": \"Rhythmic\"\n}"
response = http.request(request)
puts response.read_body{
"link_token": "link-sandbox-123456789",
"expiration": "2024-01-01T12:00:00Z",
"callback_url": "https://customer.com/webhooks/plaid-updates"
}This endpoint is step 1 of the Plaid-linked bank account flow for creating external off-chain bank addresses.
The Plaid-linked path supports
ach_debit, ach_credit, and rtp. This is the only path that enables ach_debit.
Native mobile apps: If you are integrating Plaid Link in a native iOS or Android app, you must submit your iOS redirect URI or Android package name to Brale for whitelisting before mobile Plaid OAuth will work. See the ACH on-ramp guide for platform-specific setup details.
Application name: Use the optional client_name field (maximum 30 characters) to set the application name displayed in Plaid Link. It defaults to Brale and does not change logos, colors, or ACH bank statement descriptors. See Customize the application name.
Next step: After the user completes the Plaid Link flow, exchange the public_token using Register financial institution account via Plaid to create the address_id.
For a full comparison of both external bank address creation paths, see External bank addresses.
Use the playground below to try this endpoint directly, or review the OpenAPI details in the right panel.Authorizations
Use the Bearer token returned from the Auth endpoint via OAuth2 client_credentials flow. Include the token in the "Authorization: Bearer " header.
Path Parameters
Body
application/json
User's legal name
Example:
"John Doe"
User's email address
Example:
"user@example.com"
User's phone number
Example:
"+1234567890"
User's date of birth
Example:
"1990-01-01"
Application name displayed to users in Plaid Link. Defaults to Brale when omitted. Values longer than 30 characters return a validation error. This value changes the displayed application name only. It does not change logos, colors, or ACH bank statement descriptors.
Maximum string length:
30Example:
"Rhythmic"
Response
200 - application/json
OK
Was this page helpful?