Billing
Move the company onto another plan
Moves the authenticated company onto another plan, sized to its usage, and sets how it is paid for. A price or credit amount Fluid agreed with the company stays as it was. Recorded, not yet billed. Only a company platform billing invoices has a plan to change.
PATCH
/
api
/
settings
/
billing
/
credits
Move the company onto another plan
curl --request PATCH \
--url https://api.fluid.app/api/settings/billing/credits \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"plan_key": "growth",
"billing_interval": "annual"
}
'import requests
url = "https://api.fluid.app/api/settings/billing/credits"
payload = {
"plan_key": "growth",
"billing_interval": "annual"
}
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({plan_key: 'growth', billing_interval: 'annual'})
};
fetch('https://api.fluid.app/api/settings/billing/credits', 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/credits",
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([
'plan_key' => 'growth',
'billing_interval' => 'annual'
]),
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/credits"
payload := strings.NewReader("{\n \"plan_key\": \"growth\",\n \"billing_interval\": \"annual\"\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/credits")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"plan_key\": \"growth\",\n \"billing_interval\": \"annual\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/settings/billing/credits")
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 \"plan_key\": \"growth\",\n \"billing_interval\": \"annual\"\n}"
response = http.request(request)
puts response.read_body{
"credits": {
"balance_cents": 184250,
"spendable_cents": 184250,
"expired_cents": 0,
"held_cents": 0,
"pending": {
"card": {
"amount_cents": 0,
"credit_cents": 0
},
"us_bank_account": {
"amount_cents": 0,
"credit_cents": 0
}
},
"drawn_cents": 0,
"pace": null,
"expiries": [
{
"at": "2027-09-12T16:20:05Z",
"cents": 110000
}
],
"next_expiry": {
"at": "2027-09-12T16:20:05Z",
"cents": 110000
},
"low_balance_cents": 2000,
"funded_categories": [
"ai"
],
"plan": {
"key": "growth",
"name": "Growth",
"monthly_price_cents": 1500000,
"bonus_percent": 10,
"included_credits": 16500,
"billing_interval": "annual",
"monthly_charge_cents": 1350000
},
"plans": [
{
"monthly_price_cents": 250000,
"bonus_percent": 0,
"included_credits": 2500
},
{
"monthly_price_cents": 1000000,
"bonus_percent": 10,
"included_credits": 11000
},
{
"monthly_price_cents": 2500000,
"bonus_percent": 20,
"included_credits": 30000
},
{
"monthly_price_cents": 5000000,
"bonus_percent": 30,
"included_credits": 65000
}
],
"credit_bonus_mode": "always",
"usage": {
"period_start": "2026-09-01T00:00:00Z",
"orders": 70012,
"ai": 18400,
"hosting": null,
"media": null,
"studios": null
},
"orders_percent": "1.45",
"rollover_months": 3,
"annual_discount_percent": 10,
"top_up_cents": 100,
"min_purchase_cents": 10000,
"max_purchase_cents": 1000000,
"discounts": [
{
"min_cents": 10000,
"percent_off": 0
},
{
"min_cents": 50000,
"percent_off": 5
},
{
"min_cents": 100000,
"percent_off": 10
},
{
"min_cents": 250000,
"percent_off": 15
},
{
"min_cents": 500000,
"percent_off": 20
},
{
"min_cents": 1000000,
"percent_off": 30
}
],
"purchasable": true,
"purchase_terms": {
"version": "2026-09-26",
"text": "Usage credits are prepaid. One credit pays for one US dollar of Fluid usage. Credits you buy, and any bonus credits on them, expire one year after the purchase date. Credits are not refundable and cannot move between companies, except where Fluid refunds unused purchased credits to the payment method that paid for them. If a payment is refunded, returned, or disputed, the credits it paid for, and their bonus share, are taken back, even when that makes the balance negative."
}
},
"status": 200,
"meta": {
"request_id": "f3b8c2d1-6a4e-4f7b-9c1d-2e5a8b7c4d90",
"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"
}
}Authorizations
Bearer token authentication
Body
application/json
Key of the plan to move to.
How the plan is paid for.
Available options:
monthly, annual What the plan costs each month, sized between the catalog's; it buys that much usage plus its tier's bonus. Null is the plan's own price.
Required range:
x >= 1Response
Success
The credits section of the billing page.
The company's credits: its plan, what its usage has drawn this month, and what more cost. One credit is one dollar, and every kind of usage draws on one balance. Priced but not billed or for sale yet.
Show child attributes
Show child attributes
⌘I
Move the company onto another plan
curl --request PATCH \
--url https://api.fluid.app/api/settings/billing/credits \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"plan_key": "growth",
"billing_interval": "annual"
}
'import requests
url = "https://api.fluid.app/api/settings/billing/credits"
payload = {
"plan_key": "growth",
"billing_interval": "annual"
}
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({plan_key: 'growth', billing_interval: 'annual'})
};
fetch('https://api.fluid.app/api/settings/billing/credits', 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/credits",
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([
'plan_key' => 'growth',
'billing_interval' => 'annual'
]),
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/credits"
payload := strings.NewReader("{\n \"plan_key\": \"growth\",\n \"billing_interval\": \"annual\"\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/credits")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"plan_key\": \"growth\",\n \"billing_interval\": \"annual\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/settings/billing/credits")
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 \"plan_key\": \"growth\",\n \"billing_interval\": \"annual\"\n}"
response = http.request(request)
puts response.read_body{
"credits": {
"balance_cents": 184250,
"spendable_cents": 184250,
"expired_cents": 0,
"held_cents": 0,
"pending": {
"card": {
"amount_cents": 0,
"credit_cents": 0
},
"us_bank_account": {
"amount_cents": 0,
"credit_cents": 0
}
},
"drawn_cents": 0,
"pace": null,
"expiries": [
{
"at": "2027-09-12T16:20:05Z",
"cents": 110000
}
],
"next_expiry": {
"at": "2027-09-12T16:20:05Z",
"cents": 110000
},
"low_balance_cents": 2000,
"funded_categories": [
"ai"
],
"plan": {
"key": "growth",
"name": "Growth",
"monthly_price_cents": 1500000,
"bonus_percent": 10,
"included_credits": 16500,
"billing_interval": "annual",
"monthly_charge_cents": 1350000
},
"plans": [
{
"monthly_price_cents": 250000,
"bonus_percent": 0,
"included_credits": 2500
},
{
"monthly_price_cents": 1000000,
"bonus_percent": 10,
"included_credits": 11000
},
{
"monthly_price_cents": 2500000,
"bonus_percent": 20,
"included_credits": 30000
},
{
"monthly_price_cents": 5000000,
"bonus_percent": 30,
"included_credits": 65000
}
],
"credit_bonus_mode": "always",
"usage": {
"period_start": "2026-09-01T00:00:00Z",
"orders": 70012,
"ai": 18400,
"hosting": null,
"media": null,
"studios": null
},
"orders_percent": "1.45",
"rollover_months": 3,
"annual_discount_percent": 10,
"top_up_cents": 100,
"min_purchase_cents": 10000,
"max_purchase_cents": 1000000,
"discounts": [
{
"min_cents": 10000,
"percent_off": 0
},
{
"min_cents": 50000,
"percent_off": 5
},
{
"min_cents": 100000,
"percent_off": 10
},
{
"min_cents": 250000,
"percent_off": 15
},
{
"min_cents": 500000,
"percent_off": 20
},
{
"min_cents": 1000000,
"percent_off": 30
}
],
"purchasable": true,
"purchase_terms": {
"version": "2026-09-26",
"text": "Usage credits are prepaid. One credit pays for one US dollar of Fluid usage. Credits you buy, and any bonus credits on them, expire one year after the purchase date. Credits are not refundable and cannot move between companies, except where Fluid refunds unused purchased credits to the payment method that paid for them. If a payment is refunded, returned, or disputed, the credits it paid for, and their bonus share, are taken back, even when that makes the balance negative."
}
},
"status": 200,
"meta": {
"request_id": "f3b8c2d1-6a4e-4f7b-9c1d-2e5a8b7c4d90",
"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"
}
}