Ablo · Authentication Profile
Abloatai Authentication
Authentication
Ablo secures its APIs with http across 1 declared security scheme, as derived from its OpenAPI definitions.
Agent Infrastructuremulti-agent-coordinationconcurrency-controlState ManagementDatabasePostgresreal-time-syncMCPDeveloper Toolsbackend-infrastructure
Methods: http
Schemes: 1
OAuth flows:
API key in: header
Security Schemes
bearerAuth http
scheme: bearer
Source
Authentication Profile
generated: '2026-08-19'
method: searched
source: https://docs.abloatai.com/api-keys
docs: https://docs.abloatai.com/api-keys
derived_from: openapi/abloatai-api-openapi.yml
note: >-
The OpenAPI declares a single scheme — HTTP bearer — which understates the model considerably.
Ablo's real credential system is a prefix-typed capability class carried in the bearer token,
plus an optional scope set, plus an immutable server-side branch binding. All three are
authority boundaries and only the first is visible in the spec. There is no OAuth 2.0 and no
OIDC surface: /.well-known/openid-configuration and /.well-known/oauth-authorization-server
both 404 on the API host, so scopes/ is deliberately not emitted (the scope strings below are
key grants, not OAuth scopes).
summary:
types: [http]
http_schemes: [bearer]
api_key_in: [header]
oauth2_flows: []
openid_connect: false
mtls: false
schemes:
- name: bearerAuth
type: http
scheme: bearer
header: 'Authorization: Bearer <key>'
description: Your Ablo API key (sk_… / rk_…).
applied: global (every operation in the spec)
sources: [openapi/abloatai-api-openapi.yml]
credential_classes:
- prefix: sk_
name: trusted runtime secret
use: server, worker or agent that can hold a secret; default env var ABLO_API_KEY
browser_safe: false
note: 'With an empty scope set an sk_ key carries full org authority. Blocked client-side — using one from a browser raises browser_apikey_blocked.'
- prefix: rk_
name: restricted / delegated runtime
use: another runtime that needs only a delegated scope
browser_safe: false
- prefix: pk_
name: publishable browser key
use: browser bundle; read-only access to the org data plane
browser_safe: true
write: false
- prefix: ek_
name: ephemeral user session
use: short-lived, minted server-side and held in browser memory
browser_safe: true
minted_by: 'POST /v1/ephemeral_keys (mintEphemeralKey) or server.sessions.create()'
- prefix: mk_
name: project and branch management
use: CLI / CI management credential; the only class that can carry management scopes
browser_safe: false
legacy_spellings:
- 'sk_live_… / sk_test_… / rk_live_… continue to authenticate during migration'
- "The live/test segment is a legacy hint only, not the source of truth; the persisted branch binding controls the key."
scopes:
model: key-grant scopes (NOT OAuth scopes) — least privilege; an empty scope set on an sk_ key means full org authority
docs: https://docs.abloatai.com/api-keys#scopes
grants:
- {scope: 'schema:push', description: 'Author the schema artifact on the key''s bound plane (ablo push, ablo dev).'}
- {scope: 'project:manage', description: 'List, create and rename projects.', classes: [mk_]}
- {scope: 'branch:manage', description: 'List, create and delete child branches and mint their temporary credentials.', classes: [mk_]}
- {scope: 'organization:act-as', description: 'Cross-organization authority to mint a short-lived user session into a customer organization. Follows the Stripe Connect shape; the resulting session is still bounded by its can grant and expiry.'}
session_grants:
model: 'Per-session typed can grant, e.g. can: { records: [read, update] } — model/verb scoped, applied when minting an ek_ or rk_.'
authority_axes:
- axis: capability class
carried_by: key prefix
- axis: scope set
carried_by: server-side key row
- axis: branch binding
carried_by: immutable server-side binding
note: 'A temporary child-branch key can act only inside that child; it cannot manage siblings or gain root authority even with no scope strings.'
jwt:
supported: true
note: >-
The error registry documents a full third-party JWT path (jwt_issuer_untrusted,
jwt_audience_mismatch, jwt_missing_organization, jwt_org_membership_denied, issuer_register_forbidden),
so a customer's own IdP can be registered as a trusted issuer. This is not declared in the OpenAPI.
source: https://docs.abloatai.com/errors
credential_hygiene:
- 'A mint returns plaintext exactly once; only a hash is retained, so no API or MCP tool can hand a key back later.'
- 'Rotation: POST /v1/capabilities/{id}/rotate (rotateCapability) mints a replacement keeping the grant.'
- 'Revocation: DELETE /v1/capabilities/{id} (revokeCapability).'
failure_signalling:
header: X-Auth-Failure
cors_exposed: true
note: 'The specific auth failure code is echoed on a CORS-exposed response header, so a browser client can distinguish apikey_invalid from auth_no_credentials without reading the body.'
observed:
- {probe: 'GET https://api.abloatai.com/api/v1/schema (no credential)', http_status: 401, x_auth_failure: auth_no_credentials}
- {probe: 'GET https://api.abloatai.com/api/v1/schema (bogus bearer)', http_status: 401, x_auth_failure: apikey_invalid}
x-evidence:
- {url: 'https://docs.abloatai.com/api-keys', http_status: 200}
- {url: 'https://api.abloatai.com/.well-known/openid-configuration', http_status: 404}
- {url: 'https://api.abloatai.com/.well-known/oauth-authorization-server', http_status: 404}