Org Inference Routes
GET /api/orgs/{org_id}/inference-routes
Section titled “GET /api/orgs/{org_id}/inference-routes”List Org Routes
The routes this org authored. Platform routes are not listed here.
Deliberately not the dispatchable list: the platform’s routes are configured
(keys, endpoint overrides, on/off) under /settings/ai/routes, and mixing
rows an org may delete with rows it may not into one list is how a delete
button ends up next to something it cannot act on.
Requires ADMIN or OWNER role.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| org_id | path | string (uuid) | yes |
Responses
| Status | Description | Body |
|---|---|---|
| 200 | Successful Response | OrgInferenceRouteListResponse |
| 422 | Validation Error | HTTPValidationError |
POST /api/orgs/{org_id}/inference-routes
Section titled “POST /api/orgs/{org_id}/inference-routes”Create Org Route
Author a route pointing at an endpoint this org runs.
Requires ADMIN or OWNER role, and byo_keys.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| org_id | path | string (uuid) | yes |
Request body (required)
| Field | Type | Required | Description |
|---|---|---|---|
| base_url | string | yes | The endpoint’s URL. Must be reachable from the public internet. |
| dialect | "anthropic" | "openai" | "voyage" | yes | The wire format the endpoint speaks — not the vendor. |
| label | string | yes | |
| slug | string | yes | Lowercase kebab-case. Globally unique across every organization, because it is also the name of this route’s credential setting. |
Responses
| Status | Description | Body |
|---|---|---|
| 201 | Successful Response | OrgInferenceRouteResponse |
| 422 | Validation Error | HTTPValidationError |
PATCH /api/orgs/{org_id}/inference-routes/{route_id}
Section titled “PATCH /api/orgs/{org_id}/inference-routes/{route_id}”Update Org Route
Change a route’s label, endpoint or on/off state.
slug and dialect are not editable. The slug is stored on offerings
and in the credential setting’s own name, so renaming it is a data migration
rather than an edit; the dialect decides which SDK is constructed, so
changing it under an offering would send one wire format to an endpoint
speaking another.
Switching a route off is allowed with offerings still pinned to it, and that is the difference from the admin surface: this row is the org’s own, a disabled route hard-fails at dispatch naming itself, and refusing here would remove the one control an org has when its endpoint is misbehaving.
Requires ADMIN or OWNER role.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| org_id | path | string (uuid) | yes | |
| route_id | path | string (uuid) | yes |
Request body (required)
| Field | Type | Required | Description |
|---|---|---|---|
| base_url | string | no | |
| enabled | boolean | no | |
| label | string | no |
Responses
| Status | Description | Body |
|---|---|---|
| 200 | Successful Response | OrgInferenceRouteResponse |
| 422 | Validation Error | HTTPValidationError |
DELETE /api/orgs/{org_id}/inference-routes/{route_id}
Section titled “DELETE /api/orgs/{org_id}/inference-routes/{route_id}”Delete Org Route
Remove a route.
Refused with 409 while any offering still pins it. Not a cascade: deleting
the endpoint out from under an offering would leave a model that resolves to
nothing, and the first anyone hears of it is a failed turn. The FK is
RESTRICT and would refuse anyway — this exists to say what is pinned,
which the database’s own error cannot.
Requires ADMIN or OWNER role.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| org_id | path | string (uuid) | yes | |
| route_id | path | string (uuid) | yes |
Responses
| Status | Description | Body |
|---|---|---|
| 204 | Successful Response | |
| 422 | Validation Error | HTTPValidationError |