Switch collections onto an authorized bank account or saved card
Move the authenticated company’s collections onto a saved bank account
or a saved card the merchant already authorized through instrument
setup. Send exactly one of bank_account_id or instrument_setup_id.
The authorization recorded then is reused, so no authorization text is
accepted here. Fails when the instrument was never authorized, a bank
account’s details changed since, Stripe can no longer collect from it,
or a setup is still pending.
curl --request PATCH \
--url https://api.fluid.app/api/settings/billing/instrument \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"instrument": {
"bank_account_id": 3187
}
}
'import requests
url = "https://api.fluid.app/api/settings/billing/instrument"
payload = { "instrument": { "bank_account_id": 3187 } }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({instrument: {bank_account_id: 3187}})
};
fetch('https://api.fluid.app/api/settings/billing/instrument', 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.fluid.app/api/settings/billing/instrument",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'instrument' => [
'bank_account_id' => 3187
]
]),
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.fluid.app/api/settings/billing/instrument"
payload := strings.NewReader("{\n \"instrument\": {\n \"bank_account_id\": 3187\n }\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.fluid.app/api/settings/billing/instrument")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"instrument\": {\n \"bank_account_id\": 3187\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/settings/billing/instrument")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"instrument\": {\n \"bank_account_id\": 3187\n }\n}"
response = http.request(request)
puts response.read_body{
"billing": {
"invoicing": true,
"upcoming": {
"total_cents": 18420,
"scheduled_at": "2026-10-01T06:00:00Z",
"groups": [
{
"label": "Payments",
"amount_cents": 12870,
"entries": [
{
"product_code": "txn_fee",
"description": "Transaction fee",
"quantity": "429.0",
"unit": "transaction",
"amount_cents": 12870
}
]
},
{
"label": "Mist",
"amount_cents": 5550,
"entries": [
{
"product_code": "mist_ai",
"description": "Mist AI usage",
"quantity": "5550.0",
"unit": "unit",
"amount_cents": 5550
}
]
}
]
},
"invoices": [
{
"number": "FLB-1405-2026-0008",
"period_start": "2026-08-01T00:00:00Z",
"period_end": "2026-09-01T00:00:00Z",
"total_cents": 21630,
"owed_cents": 21630,
"collected_at_source_cents": 0,
"paid_with_credits_cents": 0,
"status": "finalized",
"paid_cents": 21630,
"balance_cents": 0,
"processing_cents": 0,
"groups": [
{
"label": "Payments",
"amount_cents": 21630,
"entries": [
{
"product_code": "txn_fee",
"description": "Transaction fee",
"quantity": "721.0",
"unit": "transaction",
"amount_cents": 21630
}
]
}
]
}
],
"billing_email": "angela.martin@dundermifflin.com",
"payment_method": {
"status": "usable",
"method": "auto_debit",
"bank": "PNC Bank",
"mask": "••••6789",
"bank_account_id": 3187,
"instrument_type": "us_bank_account",
"display": {
"bank_name": "PNC Bank",
"last4": "6789"
}
},
"transaction_rates": {
"reset_period": "monthly_calendar",
"accumulated_cents": 4829150,
"minimum_volume_cents": null,
"tiers": [
{
"threshold_cents": 0,
"rate_percent": "2.9",
"fixed_cents": 30,
"current": true
},
{
"threshold_cents": 10000000,
"rate_percent": "2.5",
"fixed_cents": 30,
"current": false
}
]
},
"pull_schedule": {
"frequency": "weekly",
"next_pull_at": "2026-10-01T06:00:00Z"
}
},
"status": 200,
"meta": {
"request_uuid": "7c2e9a41-3b8d-4f62-a1c5-9d0e6f2b8a37",
"timestamp": "2026-09-30T14:05:11Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}Authorizations
Bearer token authentication
Body
Show child attributes
Show child attributes
Response
The billing page with the switched instrument.
The merchant billing page.
Everything the merchant billing page renders. Every company reads it. When invoicing is false, platform billing is left out: the upcoming charge is zero with no groups and no scheduled date, there are no invoices, transaction_rates is null, and the pull schedule is null.
Show child attributes
Show child attributes
curl --request PATCH \
--url https://api.fluid.app/api/settings/billing/instrument \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"instrument": {
"bank_account_id": 3187
}
}
'import requests
url = "https://api.fluid.app/api/settings/billing/instrument"
payload = { "instrument": { "bank_account_id": 3187 } }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({instrument: {bank_account_id: 3187}})
};
fetch('https://api.fluid.app/api/settings/billing/instrument', 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.fluid.app/api/settings/billing/instrument",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'instrument' => [
'bank_account_id' => 3187
]
]),
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.fluid.app/api/settings/billing/instrument"
payload := strings.NewReader("{\n \"instrument\": {\n \"bank_account_id\": 3187\n }\n}")
req, _ := http.NewRequest("PATCH", 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.patch("https://api.fluid.app/api/settings/billing/instrument")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"instrument\": {\n \"bank_account_id\": 3187\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/settings/billing/instrument")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"instrument\": {\n \"bank_account_id\": 3187\n }\n}"
response = http.request(request)
puts response.read_body{
"billing": {
"invoicing": true,
"upcoming": {
"total_cents": 18420,
"scheduled_at": "2026-10-01T06:00:00Z",
"groups": [
{
"label": "Payments",
"amount_cents": 12870,
"entries": [
{
"product_code": "txn_fee",
"description": "Transaction fee",
"quantity": "429.0",
"unit": "transaction",
"amount_cents": 12870
}
]
},
{
"label": "Mist",
"amount_cents": 5550,
"entries": [
{
"product_code": "mist_ai",
"description": "Mist AI usage",
"quantity": "5550.0",
"unit": "unit",
"amount_cents": 5550
}
]
}
]
},
"invoices": [
{
"number": "FLB-1405-2026-0008",
"period_start": "2026-08-01T00:00:00Z",
"period_end": "2026-09-01T00:00:00Z",
"total_cents": 21630,
"owed_cents": 21630,
"collected_at_source_cents": 0,
"paid_with_credits_cents": 0,
"status": "finalized",
"paid_cents": 21630,
"balance_cents": 0,
"processing_cents": 0,
"groups": [
{
"label": "Payments",
"amount_cents": 21630,
"entries": [
{
"product_code": "txn_fee",
"description": "Transaction fee",
"quantity": "721.0",
"unit": "transaction",
"amount_cents": 21630
}
]
}
]
}
],
"billing_email": "angela.martin@dundermifflin.com",
"payment_method": {
"status": "usable",
"method": "auto_debit",
"bank": "PNC Bank",
"mask": "••••6789",
"bank_account_id": 3187,
"instrument_type": "us_bank_account",
"display": {
"bank_name": "PNC Bank",
"last4": "6789"
}
},
"transaction_rates": {
"reset_period": "monthly_calendar",
"accumulated_cents": 4829150,
"minimum_volume_cents": null,
"tiers": [
{
"threshold_cents": 0,
"rate_percent": "2.9",
"fixed_cents": 30,
"current": true
},
{
"threshold_cents": 10000000,
"rate_percent": "2.5",
"fixed_cents": 30,
"current": false
}
]
},
"pull_schedule": {
"frequency": "weekly",
"next_pull_at": "2026-10-01T06:00:00Z"
}
},
"status": 200,
"meta": {
"request_uuid": "7c2e9a41-3b8d-4f62-a1c5-9d0e6f2b8a37",
"timestamp": "2026-09-30T14:05:11Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}