Docs
Dashboard
API reference / CredentialsBeta

Create a credential

A website password (type: "password": sites, user name, password and an optional code source: totp with a 2FA key, push or url; needs the plan's loginDetails) or a secret (type: "secret": one value). Each field is sealed (AES-256-GCM under the platform's secrets key) and never returned. 409 credential_exists for a name the project has (change it with PATCH), 402 plan_limit beyond the plan's maxCredentials (200 by default), 400 code_url_not_allowed for a codeUrl that is not a public HTTPS address (503 code_url_unavailable when this platform cannot send codeUrl requests). Setting codeUrl answers with codeUrlSecret once. 60 writes per minute per project.

POST/v1/credentials

Request

Method and pathPOST/v1/credentials
Base URLhttps://api.boxline.dev
AuthenticationYour API key in the x-api-key header (or Authorization: Bearer). The examples read it from BOXLINE_API_KEY.
Rate limitYes. See Rate limits for the numbers and headers.

Body

JSON with content-type: application/json. Required.

NameTypeDefaultAllowed valuesDescription
namerequiredstring––Capitals, digits and _ (not PATH, HOME, BOXLINE_*, SANDBOXD_*, BASH_*). Up to 64 characters.
typerequiredstring–password, secret
originsstring[]––Sites, "https://example.com" or "https://*.example.com" (any subdomain). Required for a password. 1 to 20 items.
usernamestring––1 to 320 characters.
passwordstring––1 to 1024 characters.
totpSecretstring––The site's 2FA setup key (base32, spaces allowed) or an otpauth://totp/ link from its QR code. TOTP (RFC 6238): SHA-1, 30 s and 6 digits unless the link says otherwise. Alone it means codeSource totp.
codeSourcestring | null–totp, push, url, nulltotp (needs totpSecret), push (POST /v1/credentials/:name/codes), url (needs codeUrl), or null (no 2FA).
codeUrlstring––codeSource url: a public HTTPS endpoint the platform asks (signed POST) every 5 s while a wait lasts. Up to 2048 characters.
codeTimeoutSecondsinteger300–From 5 to 900.
valuestring––A secret's value. 1 to 8000 characters.
descriptionstring––Up to 500 characters.
shellbooleanfalse–
scopestringagentagent, shell, allagent: only the AI, as placeholders (agent runs, steps, scripts' step(), the type action); shell: only as environment variables in session shells and commands; all: both.

More examples:

secret
{  "name": "GITHUB_TOKEN",  "type": "secret",  "value": "ghp_…",  "description": "CI bot",  "scope": "shell"}
curl -X POST https://api.boxline.dev/v1/credentials \  -H "x-api-key: $BOXLINE_API_KEY" \  -H "content-type: application/json" \  -d '{"name": "SHOP", "type": "password", "origins": ["https://shop.example.com"], "username": "ops@example.com", "password": "'"$SHOP_PASSWORD"'", "totpSecret": "'"$SHOP_2FA_KEY"'", "scope": "all"}'

Responses

201 Created

The credential (without its values; codeUrlSecret once when codeUrl was set).

Fields

NameTypeDefaultAllowed valuesDescription
namestring––
typestring–password, secret
descriptionstring | null––
originsstring[] | null––Sites where the AI may type it (null = any site; always set for a password).
usernamestring––A password's user name.
hasTotpboolean––A password has a 2FA key (codeSource totp).
codeSourcestring | null–totp, push, url, nullWhere a password's 2FA codes come from (%NAME.otp%, boxline-otp NAME); null: no 2FA.
codeUrlstring | null––The endpoint the platform asks for codes (codeSource url).
codeTimeoutSecondsinteger––How long a wait for a pushed or asked code lasts. From 5 to 900.
previewstring | null––A secret's last 4 characters, for values of 24 characters or more; null for shorter values and for secrets with origins.
shellboolean––The AI may use it in bash commands; this also allows exporting it into shells.
scopestringagentagent, shell, allagent: only the AI, as placeholders (agent runs, steps, scripts' step(), the type action); shell: only as environment variables in session shells and commands; all: both.
createdAtstring––Format: date-time.
updatedAtstring––Format: date-time.
lastUsedAtstring | null––Format: date-time.
codeUrlSecretstring––Signs the platform's requests to codeUrl (Boxline-Signature
Response 201
{  "name": "SHOP",  "type": "password",  "description": "…",  "origins": [    "…"  ],  "username": "…",  "hasTotp": false,  "codeSource": "totp",  "codeUrl": "…",  "codeTimeoutSeconds": 5,  "preview": "••••1a2b",  "shell": false,  "scope": "agent",  "createdAt": "2026-09-29T10:00:00.000Z",  "updatedAt": "2026-09-29T10:00:00.000Z",  "lastUsedAt": "2026-09-29T10:00:00.000Z",  "codeUrlSecret": "whsec_…"}

Errors

Errors have a matching HTTP status and the same body. code is stable, so check it in your code; message is for people. See Errors and request ids.

StatusCodesWhen
400 Bad Requestinvalid_request, invalid_json, invalid_cursor, invalid_idempotency_key, invalid_extension, variables_with_extensions, terms_not_accepted, invalid_reset_token, invalid_confirmation_code, wrong_password, no_password, invalid_next, invalid_oauth_tokenThe request is not valid.
401 UnauthorizedunauthorizedMissing or invalid API key.
402 Payment Requiredfeature_not_in_plan, spend_limit, out_of_credit, plan_limit, spend_limit, out_of_credit, organization, project, plan, creditThe plan does not include this, a monthly allowance or spending limit is used up, the organization has no credit left, or the plan allows no more of this. spend_limit and out_of_credit carry error.details.limit: organization, project, plan or credit.
403 Forbiddenproject_suspended, organization_suspended, role_forbidden, forbidden, extension_denied, cross_site_request, console_login_required, impersonating, invite_email_mismatch, email_unconfirmedNot allowed.
409 Conflictsession_not_running, shell_disabled, browser_disabled, nothing_saved, not_resumable, invalid_state, conflict, email_taken, identity_in_use, provider_already_linked, last_sign_in_method, not_impersonating, machine_too_old, too_many_credential_values, limit_reached, terms_version_mismatch, no_project, last_owner, organization_not_empty, project_has_sessions, already_member, invite_pending, idempotency_in_progressThe current state does not allow it, or a request with this Idempotency-Key is still being answered.
429 Too Many Requestsrate_limited, concurrency_limitToo many requests, or the organization's concurrent sessions (its plan's) or the project's concurrencyCap are in use.
Error body
{  "error": {    "code": "not_found",    "message": "session not found",    "requestId": "req_4fJx0aQm2Lk9Pz7N"  }}

Learn more

These docs describe a beta API. Endpoints, fields and SDK methods may change before general availability; breaking changes will be listed in the changelog.