For developers & AI agents

The Obelisk API

One identity & security plane, fully discoverable. 39 endpoints across 9 surfaces — every one declares its method, path, auth, and shape. Humans read this page; agents read the same contract as JSON.

Start here

Everything an app or agent needs to use Obelisk is discoverable from a single request — no HTML scraping, no guesswork.

Base URL https://obeliskgate.com · Version obelisk-api-1

Authentication

Each endpoint declares one of four auth levels — a small closed vocabulary you can branch on:

LevelWhat it means
nonepublic
sessionobelisk_session cookie OR body.token
bearerOIDC access token (Authorization: Bearer)
ownersession + org owner/admin

Bearer tokens are OIDC access tokens presented as Authorization: Bearer <token>. Session auth accepts the HttpOnly obelisk_session cookie (browser) or a token in the JSON body (server-to-server).

Discovery

Well-known entry points for clients and agents:

WhatURL
openid_configuration/.well-known/openid-configuration
jwks/.well-known/jwks.json
manifest/api
agent_interface/.well-known/obelisk-agent
saml_idp_metadata/saml/idp/metadata
health/healthz
transparency/.well-known/obelisk-transparency.json
security_txt/.well-known/security.txt
changelog/changelog?format=json

release_history

Public-safe product history for humans and agents, bound to the revision serving it when deploy metadata is available.

MethodEndpointAuthWhat it does
GET/changelognoneHuman release history (HTML; versioned JSON with ?format=json or Accept: application/json).

Authentication & OIDC

Passkey-first sign-in + OIDC.

MethodEndpointAuthWhat it does
GET/authnoneThe immersive sign-in/sign-up experience (HTML).
GET/auth/assertion-optionsnoneBegin a (usernameless) passkey sign-in.
query — user: optional account name
POST/auth/assertion-verifynoneComplete a passkey sign-in; returns the session + where to go (home).
body — user: optional; response: WebAuthn assertion; deviceId: optional
POST/auth/verify-sessionnoneServer-to-server: validate a session token; returns { ok, identityId }.
body — token: macaroon
GET/auth/userinfobearerOIDC userinfo for an access token.
POST/auth/magic/requestnoneRequest an email magic-link (where enabled).
body — email: string; dryRun: session-gated: return the link, don't send

Account

The universal Obelisk account — one identity across every app.

MethodEndpointAuthWhat it does
GET/accountsessionYour account page (HTML; JSON with ?format=json → the full profile).
GET/account/exportsessionDownload a portable, secret-free copy of your account (JSON).
POST/auth/profilesessionSet your display name.
body — displayName: string
POST/auth/account/renamesessionChange your username (old name stays a resolvable alias).
body — newUsername: string
POST/auth/preferencessessionMerge your preferences (theme/lang/contrast/motion/text/email).
body — preferences: object
POST/auth/passkeys/listsessionList your passkeys (no public keys).
POST/auth/passkeys/renamesessionRename a passkey.
body — credId: string; label: string
POST/auth/passkeys/removesessionRemove a passkey (never the last one).
body — credId: string
POST/auth/passkeys/add-optionssessionBegin adding a passkey to your account.
POST/auth/passkeys/add-verifysessionFinish adding a passkey.
body — response: WebAuthn attestation
POST/auth/totp/setupsessionBegin TOTP setup (pending) → { secret, uri, qrSvg }.
POST/auth/totp/confirmsessionConfirm + activate TOTP with a code.
body — code: 6 digits
POST/auth/totp/disablesessionTurn off TOTP.
POST/auth/recovery/regeneratesessionGenerate new backup codes (shown once).
POST/auth/sessions/revokesessionRevoke a session.
body — identifier: string
POST/auth/devices/revokesessionSign out a whole device — revokes every session it holds, then drops it from the device ledger.
body — deviceId: string
POST/auth/signoutsessionClear the session cookie.

Organizations

Register a business/website for its own Obelisk Rating; manage a team.

MethodEndpointAuthWhat it does
POST/auth/orgs/createsessionCreate an organization (you become owner).
body — name: string; website: optional url
GET/org/:slugsessionOrg dashboard (HTML; JSON with ?format=json), member-gated.
POST/org/:slug/scanownerRun an external security-posture scan → an Obelisk Rating for the website.
body — website: optional override
POST/org/:slug/inviteownerCreate a role-scoped invite link.
body — role: member|admin; email: optional
POST/org/:slug/invite/revokeownerRevoke an invite.
body — code: string
GET/join/:codenoneAccept an invite (signs you in first if needed).

Per-project profile

The on-top layer: each project's own per-user profile slice, scoped to its OIDC client.

MethodEndpointAuthWhat it does
GET/api/project-profilebearerRead this project's profile slice for the token's user → { sub, project, profile }.
POST/api/project-profilebearerShallow-merge into this project's slice.
body — profile: object

SAML federation (Obelisk as your IdP)

Obelisk as the SAML 2.0 IdP for downstream platforms (GitHub, Slack, AWS, …).

MethodEndpointAuthWhat it does
GET/saml/idp/metadatanoneIdP metadata: entity ID, SSO URL, and the pinned X.509 signing certificate — hand this URL to any SAML service provider.
GET/saml/idp/ssononeSAML sign-on endpoint: authenticates passkey-first, then auto-POSTs an RSA-SHA256-signed assertion to the SP's ACS.
query — SAMLRequest: SP AuthnRequest (redirect binding)

The verified seal

The verified “Secured by Obelisk Gate” seal + per-site verification pages.

MethodEndpointAuthWhat it does
GET/embed/seal.jsnoneDrop-in loader: one script tag renders the live seal card on a relying party's page.
GET/embed/v1/sealnoneThe framed seal card itself (rendered live from obeliskgate.com; can't be forged).
GET/verify/:rpnonePublic verification page for a relying party — anyone can confirm the seal is genuine.

Website scan

The public website posture scan (the same engine behind the org Rating).

MethodEndpointAuthWhat it does
POST/api/scannoneScan a public https:// website's security posture → a rating with concrete levers. SSRF-guarded, throttled per client.
body — url: public https:// website (domains only)

Contact

Reach the team.

MethodEndpointAuthWhat it does
POST/api/contactnoneSend a message to the team (form-encoded: name, email, subject, message). Honeypot-protected, throttled.
body — name: string; email: string; subject: string?; message: string

Content negotiation & errors

Selected account, organization, API-manifest, and changelog surfaces return JSON with ?format=json or Accept: application/json; static editorial pages remain HTML.

Failures share one shape — { ok:false, reason:<code>, message?:<human> } on failures; HTTP status mirrors it. — and the HTTP status mirrors it, so a client can branch on either.

The machine-readable contract

This whole reference is generated from one manifest. Fetch it as JSON and an agent can discover and use every surface without reading a line of HTML:

curl -s https://obeliskgate.com/api?format=json

Building an agent? Start with Obelisk for agents, then the per-project profile contract. Questions → Help Center.