Device auth is off by default and enabled per project. When it is not enabled, every device
route returns
400 invalid_request_error (device_attest_not_configured). All three routes are
publishable-key only (rd_pk_…); any other credential is rejected 403 permission_error
(publishable_key_required).device:<hash>.
POST /v1/device/challenge
attest or assert. No request body. This step carries
the abuse bound: it is rate-limited per key (120/min) and per client IP (60/min), returning 429
rate_limit_error (mint_rate_limit_exceeded) with a Retry-After header.
201 Created:
POST /v1/device/attest
201 Created — the same shape as /v1/client-tokens:
POST /v1/device/assert
201 Created — the same { token, expires_at, end_user_id } shape as /device/attest.
Errors
Failures use the error envelope:400invalid_request_error— device auth not enabled for the project (device_attest_not_configured), or a malformed body (invalid_request).401authentication_error— any attestation/assertion verification failure (invalid_device_attestation).403permission_error— a non-publishable credential (publishable_key_required).429rate_limit_error—mint_rate_limit_exceeded(on/device/challenge).