Bearer token
Send your token in theAuthorization header on every request:
Creating a token
Generate a token in the Elementary app, then send it as the bearer token shown above. The token is displayed only once — copy it and store it securely.Personal token
User → Personal Tokens. User-scoped: inherits your own workspace
permissions, so it can read exactly the environments and assets you can.
Best for personal scripts and exploration.
Account token
Account → Account Tokens. Account-scoped with “Can View” permissions and
not tied to a single user. Best for shared services, CI, and integrations.
Creating one requires the Manage account tokens permission.
Authorization: Bearer header.
Which token should I use?
Both work identically on the wire — the difference is what the token is tied to:- Use a personal token for interactive work: notebooks, one-off scripts, and local exploration. Its access mirrors yours and is revoked automatically when your own access changes, so it’s convenient but tied to your account lifecycle (a token stops working if you leave the workspace or lose a permission).
- Use an account token for anything long-lived or shared: CI jobs, backend services, and third-party integrations. It isn’t attached to a person, so it keeps working through team changes and offboarding — which also makes it the token you must rotate and guard most carefully.
Environment scope
Every resource exceptGET /environments is nested under an environment:
GET /environments first to discover the ids you can access. Passing an
env_id you don’t have access to returns 403.
Visibility & permissions
Access is governed by your token’s role at three levels:- Environment access — the token must be able to view the environment (as
returned by
GET /environments). Otherwise every request under thatenv_idreturns403. - Resource scope — the asset, column, and lineage endpoints require the
assets view scope. A role that can reach the environment but isn’t granted
the assets resource returns
403. - Per-asset access — see below.
- List endpoints silently omit assets you can’t view. Asset-lineage edges are returned only when both of their endpoints are visible to you; an edge that touches a restricted asset is dropped entirely.
- Column-lineage edges are returned only when the downstream column’s asset is
visible to you. A returned edge’s
upstream_column_idmay reference a restricted upstream asset; only the id is exposed, not its metadata. - Get-one endpoints (
/assets/{id},/columns/{id}) return404for an object you can’t view — the same response as a nonexistent object, so the API never discloses that a restricted asset exists.
limit items while has_more is still true. Always iterate on
has_more, not on item count — see Pagination.
Errors
See Errors for the full error contract.

