Authentication
Every /api/v1 request requires an API key. Session cookies from the web app
are not accepted on Public API routes.
Availability
The Public API requires an active Pro subscription. Key creation is disabled
without API access, and every request checks the team's current entitlement.
A valid key from a team without access receives 403 plan_required.
Create and store a key
Open Settings → API keys, choose a name, and grant one or both scopes. The
secret starts with na_ and is displayed once. New Archive stores only its
hash, so a lost key cannot be recovered; revoke it and create another.
Store the key outside source control:
export NEW_ARCHIVE_URL="https://your-host"
export NEW_ARCHIVE_API_KEY="na_your_key"Send the key
Use the HTTP Bearer scheme on every request:
Authorization: Bearer na_your_keycurl --fail-with-body \
"$NEW_ARCHIVE_URL/api/v1/files/0198c9a0-7d3e-7c41-b7a2-3f9d1c2e4a5b" \
-H "Authorization: Bearer $NEW_ARCHIVE_API_KEY"A missing, malformed, expired, or revoked key returns 401 unauthorized. A
valid key without the required scope returns 403 forbidden.
Scopes and permissions
| Scope | Grants |
|---|---|
upload | Upload files and read their metadata or processing status. |
search | Search the library and read file metadata or processing status. |
Scopes cannot be changed after creation. Create a replacement key when its access needs to change.
A key acts as the member who created it and is restricted to that member's
team. Uploads are attributed to the creator. The upload scope is necessary
but not sufficient: the creator's current team role must also grant
files.upload. Revoking a key takes effect immediately.
Rate limit
Each key may make 120 requests in a 60-second window. A rejected request
returns 429 rate_limited and may include a Retry-After header containing
the number of seconds to wait.
HTTP/2 429
content-type: application/json
retry-after: 42
{"error":{"code":"rate_limited","message":"Rate limit exceeded"}}Key safety
- Keep keys in a secret manager or environment variable, never client-side browser code or a repository.
- Give each integration its own narrowly scoped key.
- Revoke unused or exposed keys immediately.
- Treat request logs carefully: an
Authorizationheader contains the full secret.