Bridge is Accountflow's public API: general ledger, trial balances, VAT terms, documents, bank reconciliation and webhooks — behind one OAuth2 client-credentials flow, scoped to exactly what your integration needs.
BASE https://api.next.accountflow.com/v1// Create an API client under organization settings → integrations,
// then exchange its credentials for a token:
let http = reqwest::Client::new();
let token: serde_json::Value = http
.post("https://auth.next.accountflow.com/realms/accountflow/protocol/openid-connect/token")
.form(&[
("grant_type", "client_credentials"),
("client_id", "com.accountflow.api.prod.4be9a1c803f2"),
("client_secret", "your-client-secret"),
])
.send().await?.json().await?;
let whoami = http
.get("https://api.next.accountflow.com/v1/whoami")
.bearer_auth(token["access_token"].as_str().unwrap())
.send().await?.text().await?;
println!("{whoami}"); // {"clientId":"...","mode":"SYSTEM","organizationId":"..."}
// Create an API client under organization settings → integrations,
// then exchange its credentials for a token:
var http = HttpClient.newHttpClient();
var form = "grant_type=client_credentials"
+ "&client_id=com.accountflow.api.prod.4be9a1c803f2"
+ "&client_secret=your-client-secret";
var tokenJson = http.send(HttpRequest.newBuilder()
.uri(URI.create("https://auth.next.accountflow.com/realms/accountflow/protocol/openid-connect/token"))
.header("Content-Type", "application/x-www-form-urlencoded")
.POST(BodyPublishers.ofString(form)).build(), BodyHandlers.ofString()).body();
var token = new ObjectMapper().readTree(tokenJson).get("access_token").asText();
var whoami = http.send(HttpRequest.newBuilder()
.uri(URI.create("https://api.next.accountflow.com/v1/whoami"))
.header("Authorization", "Bearer " + token).build(), BodyHandlers.ofString());
System.out.println(whoami.body()); // {"clientId":"...","mode":"SYSTEM",...}
# Create an API client under organization settings → integrations,
# then exchange its credentials for a token:
import requests
token = requests.post(
"https://auth.next.accountflow.com/realms/accountflow/protocol/openid-connect/token",
data={
"grant_type": "client_credentials",
"client_id": "com.accountflow.api.prod.4be9a1c803f2",
"client_secret": "your-client-secret",
},
).json()["access_token"]
whoami = requests.get(
"https://api.next.accountflow.com/v1/whoami",
headers={"Authorization": f"Bearer {token}"},
)
print(whoami.json()) # {'clientId': '...', 'mode': 'SYSTEM', 'organizationId': '...'}
// Create an API client under organization settings → integrations,
// then exchange its credentials for a token:
const tokenResponse = await fetch(
"https://auth.next.accountflow.com/realms/accountflow/protocol/openid-connect/token",
{
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
grant_type: "client_credentials",
client_id: "com.accountflow.api.prod.4be9a1c803f2",
client_secret: "your-client-secret",
}),
},
);
const { access_token } = await tokenResponse.json();
const whoami = await fetch("https://api.next.accountflow.com/v1/whoami", {
headers: { Authorization: `Bearer ${access_token}` },
});
console.log(await whoami.json()); // { clientId: "...", mode: "SYSTEM", ... }
Every endpoint with parameters, request and response schemas, and ready-to-run examples — rendered live from the OpenAPI spec, so it can never drift from the API.
Browse the reference →Create a client, mint a token, list your companies and page through a general ledger — the whole loop in a few minutes.
Start building →Cursor pagination, idempotency keys, tenancy and 404 semantics, rate limits, versioning — the rules every endpoint follows.
Read the rules →Every failure is an RFC 9457 problem document with a stable machine code. The complete catalog, with what to do about each.
See the catalog →