Build on SentraBridge
from your own tools.
A small, stable API for city IT teams and vendors: watch flows, start runs, move flows as YAML, follow a record, and plug in an AI assistant. It never hands out the records themselves.
export SENTRABRIDGE_URL="https://app.sentrabridge.com"
export SENTRABRIDGE_TOKEN="sbk_…" # from Settings → API & AI assistants
curl -s "$SENTRABRIDGE_URL/v1/me" \
-H "Authorization: Bearer $SENTRABRIDGE_TOKEN"{
"user": {
"id": 3,
"name": "Alex Rivera",
"role": "admin"
},
"workspace": {
"id": "01m74hqe1m08znmjtembcq6sf7",
"name": "City of Demo",
"timezone": "America/Los_Angeles"
}
}How a call works
41 supported endpoints and 16 assistant tools, all acting as a person in one workspace.
- 01Make a tokenSettings → API & AI assistants. Pick what it may do.
- 02Call the APISend the token as a bearer header from a script or system.
- 03SentraBridge checksThe token's role, your network rules and rate limits.
- 04Get the factsSettings, counts, record IDs, timings and plain errors.
Four ways in.
REST API
List and run flows, run their tests in a pipeline, read run history, trace a record, export the activity log.
Learn more →Webhooks
Send events into a flow at its private address, and receive signed status and audit-log webhooks.
Learn more →AI assistants
Connect Claude or another assistant over MCP: 16 tools, drafts only, every call logged.
Learn more →Data API
Publish a read-only flow as a JSON endpoint with keys, paging and its own OpenAPI file.
Learn more →Get a token
Sign in, open Settings → API & AI assistants and choose New token. Name it, pick what it can do and when it expires. The token is shown once; SentraBridge keeps only a fingerprint.
A token acts as you, in the workspace you made it in. Its role is the lower of your role and the limit you picked, so a viewer token made by an admin can only look.
Revoke a token on the same page and it stops working at once. If your access to the workspace ends, so does the token.
| Role | Can | Endpoints that need it |
|---|---|---|
| Viewer | Look: flows, runs, health, trace, approvals. | 16 |
| Builder | Also change, import, test and run flows. | 7 |
| Admin | Also connections, the activity log and usage. | 3 |
Base URL and authentication
The base address is the one you sign in at: https://app.sentrabridge.com. Supported endpoints start with /v1 (with a token) or /public (no token).
Send the token in an Authorization: Bearer header on every call. Use HTTPS only, and keep tokens out of source control. Answers are JSON unless the reference says otherwise.
If your workspace limits sign-ins to certain networks, tokens must call from those networks too.
export SENTRABRIDGE_URL="https://app.sentrabridge.com"
export SENTRABRIDGE_TOKEN="sbk_…" # from Settings → API & AI assistants
curl -s "$SENTRABRIDGE_URL/v1/flows" \
-H "Authorization: Bearer $SENTRABRIDGE_TOKEN"Making changes
Calls that change something (POST and PATCH) need only the token, like calls that read. Each change is written to the activity log under the token's person.
curl -s -X POST "$SENTRABRIDGE_URL/v1/flows/$FLOW_ID/run" \
-H "Authorization: Bearer $SENTRABRIDGE_TOKEN"Errors
Errors use ordinary HTTP status codes and a JSON body with a message written for people. Show it to your users as it is.
Messages never include record contents or credentials. Errors from connected systems are redacted before they are saved or returned.
# 401
{
"message": "Unauthenticated."
}
# 403
{
"message": "Your role (viewer) can't do this. Ask an admin."
}
# 404
{
"message": "Not found."
}
# 422
{
"message": "The yaml field is required.",
"errors": {
"yaml": [
"The yaml field is required."
]
}
}| Code | What it means |
|---|---|
401 | The token is missing, wrong, expired or revoked. |
403 | The token's role is too low, or the call came from a network that isn't allowed. Some answers add a code. |
404 | Nothing with that ID in the token's workspace. |
409 | It can't be done in the current state, such as deciding an approval twice. |
422 | Something in the request is wrong. errors lists messages per field; run and turn-on answers add problems. |
429 | Too many calls. Wait for the seconds in Retry-After. |
5xx | Our fault, or a connected system failed (502). Safe to retry reads. |
Rate limits
Limits are per minute. Token calls are counted per person; public calls per calling address. Limited endpoints share one counter, and each has its own ceiling.
Over the limit you get 429 with Retry-After; answers also carry X-RateLimit-Limit and X-RateLimit-Remaining.
Endpoints not in the table have no fixed limit today. Please poll no more than once a minute; we may add limits to protect everyone.
A published data API also has its own limit per caller, set on the flow (60 a minute unless changed).
| Endpoint | Limit | Counted per |
|---|---|---|
POST /v1/flows/{id}/run | 30 a minute | Person |
POST /v1/flows/{id}/tests/run | 60 a minute | Person |
POST /v1/flows/{id}/tests/{test}/run | 60 a minute | Person |
GET /v1/trace | 60 a minute | Person |
POST /v1/connections/{id}/test | 30 a minute | Person |
GET /v1/activity/export | 30 a minute | Person |
GET /public/data/{workspace}/{flow} | 600 a minute | Calling address |
GET /public/data/{workspace}/{flow}/openapi.json | 600 a minute | Calling address |
POST /hooks/{token} | 120 a minute | Calling address |
GET /public/platform-status | 240 a minute | Calling address |
GET /public/status/{slug} | 120 a minute | Calling address |
GET /public/status/feed.atom | 120 a minute | Calling address |
GET /public/status/feed.rss | 120 a minute | Calling address |
GET /public/status/maintenance.ics | 120 a minute | Calling address |
GET /public/status/subscribe | 60 a minute | Calling address |
POST /public/status/subscribe | 10 a minute | Calling address |
POST /mcp | 120 a minute | Person |
GET /public/openapi.json | 120 a minute | Calling address |
GET /public/egress-ips | 60 a minute | Calling address |
Lists and paging
Management lists are not paged. They return the newest items up to a cap: 200 runs, 50 runs for one flow, 200 approvals, 200 trace hops. Use the filters (status, flow_id) to narrow them.
The Data API is paged with limit and offset. Each answer has meta.total, meta.next_offset and a ready-made links.next; stop when it is null.
The activity log export streams the whole date range in one answer, as CSV or NDJSON.
{
"data": [
"…"
],
"meta": {
"total": 30,
"limit": 2,
"offset": 0,
"next_offset": 2
},
"links": {
"next": "https://app.sentrabridge.example/public/data/city-of-demo/permits?limit=2&offset=2"
}
}Versioning and stability
/v1 is the first supported version. Inside it we only add: new endpoints, new optional parameters and new fields. Write clients that ignore fields they don't know.
We don't remove or rename a documented endpoint or field, or change what it means, within /v1. A change like that would ship as a new version, announced ahead of time on this page.
Only what the API reference lists is supported. The web app uses other /v1 addresses; those are internal, unversioned and can change in any release.
| Stable in /v1 | May change |
|---|---|
| The 41 endpoints in the reference | Any other address the web app calls |
| Documented fields and their meaning | New fields appearing in answers |
| Token roles and the status codes above | The exact wording of messages |
| MCP tool names and required inputs | Step settings inside a flow's graph |
The pass-through rule
SentraBridge moves records between systems without keeping them. The API follows the same rule: it returns settings, counts, record IDs, timings and redacted errors.
You can see that record BLD-2026-0001 was read and what ID it got in the next system. You can't fetch its contents, because SentraBridge doesn't have them.
Two endpoints do carry records. The Data API reads them live from the source for each call. Flow tests return the made-up records saved with the test.
{
"label": "Changed 311 requests",
"status": "ok",
"records_in": 1,
"records_out": 41,
"records_failed": 0,
"record_ids": [
{
"source": "10411g"
},
{
"source": "5040"
}
]
}Four calls to try.
Set SENTRABRIDGE_URL and SENTRABRIDGE_TOKEN as above, then paste.
curl -s "$SENTRABRIDGE_URL/v1/runs?status=failed" \
-H "Authorization: Bearer $SENTRABRIDGE_TOKEN"curl -s "$SENTRABRIDGE_URL/v1/trace?id=REQ-1001" \
-H "Authorization: Bearer $SENTRABRIDGE_TOKEN"curl -s "$SENTRABRIDGE_URL/v1/flows/$FLOW_ID/export" \
-H "Authorization: Bearer $SENTRABRIDGE_TOKEN" \
-o flow.sentrabridge.yamlcurl -s "$SENTRABRIDGE_URL/public/platform-status"Also available
- OpenAPI: the whole reference as a machine-readable file at
/public/openapi.json, for client generators and API tools. - /scim/v2: SCIM 2.0 provisioning (RFC 7644) at /scim/v2 with a SCIM token from Settings → Security. Point your identity provider at it; it follows the standard, so it is not repeated here.
- Help: tell us what you're building, or what the API is missing.