API Tokens¶
API tokens let you issue credentials for automations (CI systems, scripts, external tools) that need to call the NATS Tower API of a specific NATS account without using interactive user logins.
Admins (superusers) create API tokens from the UI. Each token is scoped to a single account and can only call the account scoped API of that account — not installation level endpoints and not other accounts.
API tokens are managed per account, from the API Tokens page of the account (account table → ⋮ menu → Manage API Tokens).
Creating an API token¶
- Open the Accounts view of your NATS installation.
- Open the account's ⋮ menu and click Manage API Tokens.
- Click Add Token.
- Fill in:
- Name: a unique name for the token within the account
(e.g.
ci-automation). - Description (optional): anything that helps future readers.
- Expires (optional): an explicit expiration date. Leave empty for a token that never expires.
- Name: a unique name for the token within the account
(e.g.
- Click Create Token.
The generated token is shown once in a dialog — copy it, it is what your automation needs. Tokens can be listed (masked) and deleted at any time from the API Tokens page. Deleting a token revokes the automation's access immediately.
Using an API token¶
Send the token as a Bearer token in the Authorization header of your
requests to the account scoped API:
Authorization: Bearer <api token>
API tokens are only accepted by the account scoped routes of the account they were created for, for example:
POST /api/nats-tower/installations/{installation_id}/accounts/{account_id}/users/shortlived
Generating shortlived user credentials¶
The first API supported by API tokens generates shortlived NATS user credentials that are scoped to the subjects you specify. The generated user is ephemeral: it is not stored in NATS Tower and the JWT carries an explicit expiration, so the credentials stop working after the requested time to live.
Request¶
POST /api/nats-tower/installations/{installation_id}/accounts/{account_id}/users/shortlived
Authorization: Bearer <api token>
Content-Type: application/json
Body:
| Field | Type | Description |
|---|---|---|
name |
string | Name of the generated user (optional, defaults to shortlived). |
publish |
string[] | Subjects the user may publish to (optional). |
subscribe |
string[] | Subjects the user may subscribe to (optional). |
expires_in |
int | Time to live in seconds (optional, default 3600, max 86400 / 24 h). |
Use NATS subject wildcards to match multiple subjects:
*matches a single token and>matches one or more trailing tokens (e.g.sensors.>). Omitpublish/subscribeto generate a user with the full permissions of the account for the given time to live.
Example¶
curl -X POST \
'https://tower.example.org/api/nats-tower/installations/<installation_id>/accounts/<account_id>/users/shortlived' \
-H 'Authorization: Bearer <api token>' \
-H 'Content-Type: application/json' \
-d '{
"name": "ci-deploy",
"publish": ["deploy.>"],
"subscribe": ["deploy.status.>"],
"expires_in": 900
}'
Response¶
{
"public_key": "UB...<nkey public key of the generated user>",
"seed": "SU...<nkey seed of the generated user>",
"jwt": "eyJ...<signed user JWT with explicit expiration>",
"creds": "-----BEGIN NATS USER JWT-----\n...\n-----END NATS USER JWT-----\n\nNKEY Seed: SU...",
"expires_at": "2026-01-01T12:15:00.000Z"
}
credsis the standard NATS user credentials file. Write it to a file (e.g./tmp/ci.creds) and point your client at it:
nats --server nats://nats.example.org:4222 --creds /tmp/ci.creds pub deploy.start 'v1'
public_key/seed/jwtare the individual parts if you prefer to configure your client withNATS_USER+NATS_PASSWORD(seed) or with the user JWT directly.
Error handling¶
| Status | Meaning |
|---|---|
400 |
Invalid request body (bad subjects, expires_in out of range, …). |
401 |
The presented API token is invalid or expired. |
403 |
No token presented, or the token is not scoped to this account/installation. |
404 |
The account does not exist. |
Security notes¶
- Tokens only ever unlock the account scoped API of their account.
- Tokens can carry an expiration; prefer setting one for long-running automations.
- Shortlived user credentials are signed with the account's main signing key and expire after the requested time to live — they cannot outlive the TTL.
- Anyone with access to a token can use it: treat tokens like passwords and rotate (create new + delete old) when they may have leaked.