Enable a gateway for one country
Adds one country to the gateway’s coverage without touching the rest of
its list, so two admins seeding different countries never overwrite each
other. The link is judged against the account’s membership rules before
it is written: no second active non-card account of the same integration
type and recurring mode on the country (one regular and one
recurring-only PayPal account may share a country), and no live and test
card gateway on one country.
Linking a country the gateway already serves is a no-op that returns
200. Every link is recorded on the gateway’s audit trail with the
acting admin, or the merchant when an API key made the call.
On this operation a droplet token receives 403 and a JWT needs root
admin or an explicit gateways.update or apm.update role grant; the
gateway create and update operations keep their own authorization.
Returns 404 for an unknown gateway or a country the company has not
enabled, and 422 when a membership rule refuses the link or the
country code is not a two-letter ISO 3166-1 code.
curl --request POST \
--url https://api.fluid.app/api/payment/v2026-04/gateways/{id}/countries \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"country_code": "CA"
}
'import requests
url = "https://api.fluid.app/api/payment/v2026-04/gateways/{id}/countries"
payload = { "country_code": "CA" }
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({country_code: 'CA'})
};
fetch('https://api.fluid.app/api/payment/v2026-04/gateways/{id}/countries', 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/payment/v2026-04/gateways/{id}/countries",
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([
'country_code' => 'CA'
]),
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/payment/v2026-04/gateways/{id}/countries"
payload := strings.NewReader("{\n \"country_code\": \"CA\"\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.fluid.app/api/payment/v2026-04/gateways/{id}/countries")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"country_code\": \"CA\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/payment/v2026-04/gateways/{id}/countries")
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 \"country_code\": \"CA\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "stripe-usd",
"name": "Stripe (USD)",
"integration_type": "CreditCard",
"mode": "live",
"supported_sources": [
"visa",
"master",
"american_express",
"discover",
"jcb",
"diners_club",
"maestro",
"unionpay"
],
"country_codes": [
"US",
"CA"
],
"settings": {},
"created_at": "2026-09-14T15:22:08Z",
"updated_at": "2026-09-18T09:41:55Z"
},
"meta": {
"request_id": "0192a3f4-4051-7d6e-8f70-8b9c0d1e2f34",
"timestamp": "2026-09-18T09:41:55Z"
}
}{
"message": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
},
"status": "<string>"
}{
"message": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": "error",
"message": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
},
"errors": "<string>"
}{
"status": "error",
"message": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
},
"errors": "<string>"
}Authorizations
Merchant API key (fp_live_* for live, fp_test_* for sandbox) or an
admin-tier JWT (company admin or root admin). Non-admin JWTs are
rejected with 403; live API keys additionally require the merchant's
API access to be enabled.
A company admin, company token or partner token also needs the role
grant for the action, or gets 403: gateways.view, .create,
.update or .delete (or the matching apm.* grant) for gateway
configuration, transactions.update for purchase, authorize, verify,
capture, void and credit, and transactions.view to read transactions.
API keys, root admins and droplet tokens are not checked against roles.
Path Parameters
Gateway slug, UUID, or ID
Body
ISO 3166-1 alpha-2 code of the country to enable.
2^[A-Za-z]{2}$curl --request POST \
--url https://api.fluid.app/api/payment/v2026-04/gateways/{id}/countries \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"country_code": "CA"
}
'import requests
url = "https://api.fluid.app/api/payment/v2026-04/gateways/{id}/countries"
payload = { "country_code": "CA" }
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({country_code: 'CA'})
};
fetch('https://api.fluid.app/api/payment/v2026-04/gateways/{id}/countries', 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/payment/v2026-04/gateways/{id}/countries",
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([
'country_code' => 'CA'
]),
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/payment/v2026-04/gateways/{id}/countries"
payload := strings.NewReader("{\n \"country_code\": \"CA\"\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.fluid.app/api/payment/v2026-04/gateways/{id}/countries")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"country_code\": \"CA\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/payment/v2026-04/gateways/{id}/countries")
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 \"country_code\": \"CA\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "stripe-usd",
"name": "Stripe (USD)",
"integration_type": "CreditCard",
"mode": "live",
"supported_sources": [
"visa",
"master",
"american_express",
"discover",
"jcb",
"diners_club",
"maestro",
"unionpay"
],
"country_codes": [
"US",
"CA"
],
"settings": {},
"created_at": "2026-09-14T15:22:08Z",
"updated_at": "2026-09-18T09:41:55Z"
},
"meta": {
"request_id": "0192a3f4-4051-7d6e-8f70-8b9c0d1e2f34",
"timestamp": "2026-09-18T09:41:55Z"
}
}{
"message": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
},
"status": "<string>"
}{
"message": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"status": "error",
"message": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
},
"errors": "<string>"
}{
"status": "error",
"message": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
},
"errors": "<string>"
}