Dokümantasyon

REST referansı

Tüm partner uçları, OpenAPI 3.1 tanımından üretilir. Postman, Insomnia veya bir kod üreticisine aktarın: openapi.json · api.touchque.com/openapi.json

Enrollment
POST/auth/generate-secretCreate an enrollment secret (QR) for a user

Issues a one-time device-pairing secret plus 10 recovery codes. The user scans `qrCodeDataUrl` with the Touchque app within 5 minutes; you then receive a `DEVICE_LINKED` event webhook. If the user has an unlinked secret whose 5 minutes have passed, it is rotated in place (new secret, new recovery codes). WAF limit: 15/min per IP.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
externalUsernamezorunlustringYour identifier for the user.
Yanıt alanı (200)TipAçıklama
ttlMsinteger
DurumAnlam
200Enrollment secret.
400Missing or invalid request field.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`Integration not found...` Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
409`Secret already linked to a device` (use `POST /auth/secret/reset`) or `Secret already generated` (still within its 5 minutes; `expiresAt` and `ttlRemainingMs` say how long).
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/auth/secret/resetReset a user's enrollment

Rotates the user's secret in place and returns the new one immediately: unlinks the phone, lifts a freeze, clears the rejection counter and issues 10 new recovery codes (old ones stop working). The user must link again within 5 minutes. WAF limit: 5/min per IP.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
externalUsernamezorunlustringYour identifier for the user.
Yanıt alanı (200)TipAçıklama
successboolean
messagestring
DurumAnlam
200New enrollment secret.
400Missing or invalid request field.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`Integration not found...` Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
404`No secret found for this user`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
Login
POST/login/recoveryApprove a pending request with a recovery code

Lower-assurance fallback when the phone is unavailable: confirms a PENDING request (`confirmedVia: RECOVERY_CODE`) and burns the code; fires the SUCCESS webhook. Refused for passkey-only requests and, unless `TenantPolicy.allowRecoveryForCritical`, for critical action types. The request's `expiresAt` is not checked — any request still in status PENDING can be approved. 10 attempts per user per 15 minutes.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
requestIdzorunlustringA PENDING login request of this workspace.
codezorunlustringOne of the user's recovery codes (`XXXXX-XXXXX`, Crockford base32; case, spaces and hyphens are ignored, O/I/L are folded to 0/1). Legacy 8-hex-character codes are still accepted.
Yanıt alanı (200)TipAçıklama
successboolean
messagestring
DurumAnlam
200Request approved.
400`requestId and code are required` or `Invalid or already used recovery code`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`phishing_resistant_required` (passkey-only request, or one the Vishing Shield moved to a passkey), the critical-action refusal, or `step_up_required`: the request was number-matched for a reason a recovery code cannot answer (its `riskFactors` carry `require_number_match`, `repeated_failures`, `policy_step_up`, `policy_unavailable`, `geo_unverified`, `post_approval_step_up`, `vishing_suspected` or `phishing_origin`); it needs the phone. A request number-matched only because the workspace always asks, because the risk engine was unreachable or because of the lost phone's own state is still accepted. Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
404`Pending login request not found` or `Active 2FA secret not found for user`.
429Too many recovery code attempts for this user (Retry-After), or WAF limit.
500Unexpected server error.
POST/login/requestAsk the user to approve a sign-in or action

Sends an approval request (push + socket) to the user's linked phone and returns its `requestId`. Poll `GET /login/status/{id}` or wait for the webhook; the request expires after 30 seconds.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
externalUsernamezorunlustringYour identifier for the user (the one used at enrollment).
typezorunlustringAction type: the `type` slug of an action type defined via `POST /action-types` or the Dashboard, or its `id` (UUID). Undefined types are refused (400 `unknown_action`).
referenceIdstring | nullYour own reference (order id, transaction id). Echoed in status, consume and webhooks.
clientIpstring | nullThe END USER's IP address (not your server's). Used for location display, geo policy and risk. Non-IP and loopback values are ignored. When absent, risk scoring falls back to the caller's IP and the location stays unresolved.
userAgentstring | nullThe end user's browser user agent.
detailsLoginDetailsInputTransaction context shown on the approval screen (e.g. amount, recipient). Either a map of label → value (order kept) or an array of `{ label, value }`. At most 8 entries; labels 1–40 and values 1–120 characters after trimming; numbers and booleans are converted to strings; control characters and Unicode bidi overrides are rejected (400 `invalid_details`). Invalid input is rejected, never truncated. An empty map/array counts as no details.
requireBiometricbooleanRequire Face ID / Touch ID on the phone (verified server-side).
requireNumberMatchbooleanForce number matching (step-up) for this request.
challengeDigits2 | 3Digits of the matching number when one is shown: 3 for 100–999. The longer of this and the workspace policy (`TenantPolicy.challengeDigits`) wins: a request can lengthen the number, never shorten it.
contextActionContextAnything your Actions should know about this request and that Touchque cannot (roles, plan, amount, tenant). At most 4 KB of JSON. Your Actions read it as `event.context`; it is never shown on the phone and not stored on the request (only in the recorded Actions event, kept 30 days).
securityChangesobjectWhen the user's sign-in security last changed in your own system, each an ISO 8601 time or epoch milliseconds. Touchque adds what it saw itself (the phone linked, moved or recovered, passkeys added or removed; for Touchque Login customers also password, email and second-factor changes; the newest wins) and gives access rules and Actions the minutes since each: `minutesSince.passwordChange`, `.mfaChange`, `.deviceChange`, `.emailChange`, `.phoneChange`, `.anyChange` (a kind with no known change is left out, so a rule on it does not apply). Example rule: refuse your `PAYOUT_CHANGE` within 24 hours of a 2FA change.
destinationobjectWhere the action sends money or value. Touchque shows it in full on the phone, first and in groups of four (`TR33 0006 1005 …`), and checks it against the destinations of this kind the user approved before (and `known`): one that looks like one of them but is not the same (same start and end with a different middle, confusable or mixed-alphabet letters, one or two characters off) gets a warning row above it. Access rules read `destination.lookalike`, `destination.known`, `destination.kind`; Actions read `event.request.destination`. Do not repeat it in `details`. 400 `invalid_request` for an IBAN whose check digits fail.
locale"tr" | "en"Language of the rows Touchque adds (the destination and its warning). Default tr.
expiresInintegerHow long the push waits for the person, in seconds (default 30). Longer suits a request the person has to read first, such as an AI agent asking on their behalf (CIBA). Ignored for `reply` (5 minutes) and `qrPairing` (90 seconds).
qrPairingstringA browser pairing by QR code (`POST /qr-pairings`) that the user scanned and went on with in the Touchque app (`state: confirmed`). Only the phone that scanned it is asked, for the account it scanned with, once: always with number matching, for 90 seconds, the browser key's fingerprint added to `details` (so the phone's hardware-key signature covers it) and the pairing carried to the phone, which checks it is the code it scanned. 409 `pairing_not_confirmed` / `pairing_other_user` / `pairing_other_device`, 410 `pairing_expired`, 404 `pairing_not_found`. Cannot go with `reply`.
replyobjectAsk the approver to type something back on the phone: today `kind: code`, a sign-in code another service sent them (a text message, WhatsApp, e-mail). Give a one-time P-256 public key: the phone encrypts what was typed to it (ECDH P-256, HKDF-SHA256 with the request id as salt and `touchque-code-reply-v1` as info, AES-256-GCM with `touchque-code-reply:<requestId>` as additional data; `v1.<its one-time key>.<nonce|ciphertext|tag>`, base64url) and Touchque hands the ciphertext back in `GET /login/status` `reply`: it never sees the code. Such a request lives 5 minutes and is never folded into another pending one.
clientSignalsstringIs a person at the page or software driving the browser (Playwright, a headless Chrome, an AI browser agent)? The end user's page check from `@touchque/web` `startClientSignals().encode()`, passed through untouched (booleans, counts and timings only). With signs of automation the request is never silent and asks with number matching; the workspace can block it instead (`TenantPolicy.automatedClients`: 403 `blocked` with reason `automated_client`).
deviceRiskRequestIdstringDevice risk (a paid add-on, off by default): the page's identification from `@touchque/web` `deviceRisk.identify()`, or the script tag's `touchque_request_id` field as it came (after a dot, how the pointer moved: counts weighed as `device_pointer_synthetic`, never kept). Used only when the workspace turned Device risk on, for this account only (another account gets `device_report_replayed`). The risk engine counts the visitor and decides: its signals only ever ask for more (reported only until Touchque enforces them), a visitor your admin marked "step up always" asks at once, and a sign-in with a device signal is never silent.
deviceRiskobjectInstead of deviceRiskRequestId: the page's report from `@touchque/web` `deviceRisk.collect()`, relayed untouched.
browserProofBrowserProofProof from the end user's browser that it holds its device-bound key: a non-extractable ECDSA P-256 key made with WebCrypto and kept in IndexedDB (`@touchque/web` `browserKey.proof()`). Pass it through untouched: the JSON object, its JSON text, or the base64url(JSON) form of the `X-Touchque-Browser` header. `{ v: 1, jwk: { kty: "EC", crv: "P-256", x, y }, aud: <page origin>, iat: <unix seconds>, nonce: <base64url, 16 random bytes>, sig: <base64url P1363 r||s> }`, signed over the UTF-8 text `touchque-browser:v1\n{aud}\n{iat}\n{nonce}` with ECDSA SHA-256. Accepted when `iat` is within 5 minutes, the signature is valid, the nonce is new (each proof works once per endpoint) and, when the workspace's organization has verified domains (Organization → Domains) or the workspace has passkey origins, `aud` is an https origin on one of those sites (`http://localhost` and `http://127.0.0.1` outside production). Anything else reads as "no known browser", never as an error.
Yanıt alanı (200)TipAçıklama
messagestring`Request sent`, or `A previous request is already pending on the device.` when an identical pending request was reused.
requestIdstring
statusLoginStatusOnly present when an existing pending request was reused.
challengeCodestringNumber matching (step-up): show this number to the user, who picks it on the phone. Present when number matching is required (critical action, `requireNumberMatch`, risk engine, access policy, tenant policy, geo policy); a trusted device does not waive it. 2 digits by default (`TenantPolicy.challengeDigits`). Absent for passkey-only requests.
expiresAtstringThe request expires 30 seconds after creation (5 minutes with `reply`).
requiresPasskeybooleanPresent (true) when the workspace policy demands a phishing-resistant factor for this action: no push is sent; approve it with `POST /webauthn/login/options` + `/webauthn/login/verify`.
caseCodestring"Why?" case code of this decision (6 characters without I, O, 0 or 1, e.g. `K7P-2QX`). Show it to the user ("Tell your support team: K7P-2QX"); your team opens the full decision (each check, the rule that matched, what would have let it through) by this code in the dashboard (Logs → Look up a case).
reasonsRiskReason[]Why number matching or a passkey is needed (from a fixed list, never a score); absent for a plain push.
destinationobjectOnly with a `destination`: whether the user approved it before, and the destinations it looks like (also shown on the phone).
telemetryTokenstringBearer token for `POST /login/{requestId}/telemetry` (behavioral biometrics widget). Only on newly created requests of workspaces with behavioral biometrics enabled.
canaryobjectMirror Alarm: have the page that shows this sign-in load `url` (a hidden image) and send a beacon to it without `.gif` (`@touchque/web` does both). If that page is not on your site, i.e. a real-time phishing proxy, the approval is refused (`reason: phishing_origin`) and the phone warns the user. Your Content-Security-Policy must allow its host in `img-src` and `connect-src`. Valid until 5 minutes after `expiresAt`.
DurumAnlam
200Request created (or an identical pending one reused).
400`invalid_request` (missing `externalUsername` / `type`), `invalid_details`, `unknown_action`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`integration_not_found`; `action_disabled`; `device_keys_lost` (the linked phone reported that its security keys were destroyed because its passcode or screen lock was turned off; no push is sent, the user links the app again or uses a recovery code); `passkey_not_registered` (`error: phishing_resistant_required`, `passkeyRegistered: false` — policy demands a passkey and the user has none); `blocked` with `reason` `geo_policy` (+`countryCode`), `access_policy` (+`ruleName`), `risk` (+`requestId`; the score is not disclosed — `GET /login/status` shows `rejectedBy: risk_engine`) `provisional` (a critical action while an approval this user gave during a call waits to be re-confirmed on the phone, at most 12 hours; see `provisional` on `GET /login/status`) or `action` (one of your Actions refused it: +`action`, its slug; `error` is the reason it gave). `passkey_not_registered` with `reason: action` when an Action asked for a passkey the user does not have. Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
404`device_not_linked` — the user has no linked phone (enroll with `POST /auth/generate-secret`).
423`frozen` — the user's 2FA is frozen. Automatic freezes (after repeated rejections) lift at `frozenUntil` and send Retry-After; a manual freeze has `retryAfter: null`.
429`rate_limited` (`error: too_many_login_requests`) — too many approval requests for this user — or the workspace quota / WAF limit (see `TooManyRequests`).
500`internal_error`.
503`policy_unavailable` — a critical action could not be checked against the access policy; retry.
GET/login/status/{id}Get a login request's status

Returns the state of a request of your workspace plus what it is bound to (user, action, reference, details), so you can check an approval is for THIS user and transaction. `assurance` and `approvalProof` are only set for CONFIRMED requests. This path bypasses the WAF entirely (no per-IP rate limit), so polling is safe.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringLogin request id.
Yanıt alanı (200)TipAçıklama
statusLoginStatusA PENDING request past `expiresAt` is reported as EXPIRED. CONFIRMED is final and does not expire.
externalUsernamestringBound user — check it matches the user you are signing in.
typestringAction type slug the request was created with.
referenceIdstring | null
detailsLoginDetailsNormalised transaction details (always the array form), or `null` when none were sent.
expiresAtstring
consumedbooleanWhether `POST /login/{id}/consume` already used this approval.
confirmedViaConfirmedViaHow a CONFIRMED request was approved: `DEVICE` (push on the phone), `WEBAUTHN` (passkey approval of a pending request), `WEBAUTHN_PRIMARY` (passwordless passkey sign-in), `RECOVERY_CODE`. `null` while not confirmed.
rejectReason"user_reported_coached" | "user_reported_not_me"REJECTED only, when the user said more than no: someone on the phone told them to approve or to scan the code (Vishing Shield; their 2FA is frozen), or it was not them.
pairingobjectRequests created with `qrPairing`: the pairing and the browser key it binds.
rejectedBy"user" | "risk_engine" | "server"REJECTED only: who ended the request — the user on the phone, the risk engine (blocked before the push, or refused after the approval), or the server (the approval carried an invalid device signature, or a device that reports itself compromised tried to approve a critical action).
requiresPasskeybooleanPresent (true) for passkey-only requests, and for a PENDING request the Vishing Shield moved to a passkey at the tap (the user was on a call; `riskFactors` carry `vishing_suspected`): finish it in the browser with `POST /webauthn/login/options` + `/webauthn/login/verify`; `expiresAt` was extended by 180 seconds for the ceremony. The SDKs report it as `passkey_required`.
assuranceAssurance | nullOnly for CONFIRMED requests.
approvalProofApprovalProof | nullOnly for CONFIRMED requests approved by a hardware-bound phone.
replyobjectCONFIRMED requests created with `reply`, when the approver typed it back: the ciphertext, decrypted with your one-time key. An approval without it means the approver approved without typing (an older app).
provisionalbooleanVishing Shield: the phone approved while the user was on a call. Still CONFIRMED; the user's critical actions are refused (403 `blocked` / `provisional`) until the phone re-confirms it after the call (`reconfirmedAt`, `APPROVAL_RECONFIRMED`) or the user takes it back (`revoked`, `APPROVAL_REVOKED`). Treat a session built on it as limited.
reconfirmedAtstring | nullWhen the phone re-confirmed a provisional approval after the call.
revokedbooleanThe user took this approval back on the phone: end any session or action built on it. A revoked approval that was not consumed yet can no longer be (409 `revoked`).
revokeReason"UNDO" | "COACHED" | null`COACHED`: someone on the phone told the user to approve. `UNDO`: the user undid it.
DurumAnlam
200Request status.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`Integration not found.` Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500`Failed to check login status`.
POST/login/{id}/consumeUse an approval exactly once (step-up guard)

Atomically marks a CONFIRMED request as used and returns what was approved. The first call wins; every later call answers 409 `already_used` (replayed token, second tab, retried form post). Call it right before running the protected action. No request body. There is no time limit once a request is CONFIRMED — an approval can be consumed at any later time.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringLogin request id (`requestId`).
Yanıt alanı (200)TipAçıklama
consumedboolean
requestIdstring
externalUsernamestring
typestring
referenceIdstring | null
detailsLoginDetailsNormalised transaction details (always the array form), or `null` when none were sent.
confirmedViaConfirmedViaHow a CONFIRMED request was approved: `DEVICE` (push on the phone), `WEBAUTHN` (passkey approval of a pending request), `WEBAUTHN_PRIMARY` (passwordless passkey sign-in), `RECOVERY_CODE`. `null` while not confirmed.
assuranceAssuranceWhat a partner can rely on for an approved request. Only a passkey is phishing-resistant (origin-bound).
approvalProofApprovalProof | null
provisionalbooleanVishing Shield: the phone approved while the user was on a call. Still CONFIRMED; the user's critical actions are refused (403 `blocked` / `provisional`) until the phone re-confirms it after the call (`reconfirmedAt`, `APPROVAL_RECONFIRMED`) or the user takes it back (`revoked`, `APPROVAL_REVOKED`). Treat a session built on it as limited.
reconfirmedAtstring | nullWhen the phone re-confirmed a provisional approval after the call.
revokedbooleanThe user took this approval back on the phone: end any session or action built on it. A revoked approval that was not consumed yet can no longer be (409 `revoked`).
revokeReason"UNDO" | "COACHED" | null`COACHED`: someone on the phone told the user to approve. `UNDO`: the user undid it.
DurumAnlam
200Approval consumed.
400`invalid_request` — malformed id.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`integration_not_found`. Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
404`not_found`.
409`already_used`, `rejected`, `expired` or `not_approved` (still pending).
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500`internal_error`.
GET/login/{id}/recordWhat a platform request did (Touchque platform only)

For Touchque's own SSO: a request it sent for a customer organization (header `x-touchque-on-behalf-of`, honoured only for a platform organization's key), as that organization's case view shows it: status, how it was answered, the number the sign-in page showed once the request is over, the phone's platform, the risk score and reasons, and the phone-side case code. Any other caller, or another organization, gets 404.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringLogin request id (`requestId`).
DurumAnlam
200The request's record.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500`internal_error`.
POST/login/{id}/report-fraudReport a request as fraud after the fact

For a sign-in or transaction you later learned was fraudulent (chargeback, account takeover, social engineering). Recorded in the audit log and, when a person acted on the request (see `trainingLabel`), sent to the risk engine as a strong training label. Does not change the request's status. Idempotent (`alreadyReported: true` on repeats). At most 60 reports per minute per workspace; WAF limit: 120/min per IP.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringLogin request id (`requestId`).
Gövde alanıTipAçıklama
reason"chargeback" | "account_takeover" | "social_engineering" | "other"
notestring
Yanıt alanı (200)TipAçıklama
reportedboolean
alreadyReportedbooleanTrue when this request had already been reported (idempotent).
requestIdstring
trainingLabelbooleanWhether the report was sent to the risk engine as a training label. Only a request a person acted on in the last 180 days is: approved, rejected by the user, or answered with an offline code. A request that was still pending, expired unanswered, or was ended by the risk engine or the server is recorded but is no training label; when it is under 7 days old, the user's pushes in your workspace still need number matching for the next 14 days.
DurumAnlam
200Reported.
400`invalid_request`, `invalid_reason`, `invalid_note`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`integration_not_found`. Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
404`not_found`.
429`integration_quota_exceeded` — more than 60 reports in a minute for this workspace (Retry-After) — or the WAF limit (see `TooManyRequests`).
500`internal_error`.
POST/login/{requestId}/telemetrySubmit behavioral telemetry (browser widget)

Called from the END USER's browser by the `@touchque/web` behavioral widget — not by your backend and not HMAC-signed. Authorised by the request's `telemetryToken`. When the browser sends an `Origin` and the workspace's organization has verified domains (Organization → Domains), the origin's host must be one of them or under one (`localhost` outside production); one that is not even on the same site counts as Mirror Alarm evidence, like the canary. Advisory: may raise the request's risk score, never changes its status. Always answers 200 once authorised (`accepted: false` when ignored). WAF limit: 20/min per IP.

Kimlik: Telemetri token'ı (tarayıcı)

ParametreYerTipAçıklama
requestIdzorunlupathstringLogin request id from `POST /login/request`.
Gövde alanıTipAçıklama
mouseDistancenumber
mouseJitternumber
clicksnumberClicks with a mouse or a pen (a tap and Enter on a button are not counted).
touchesnumberTouches: with these, no mouse movement is not a sign.
keystrokesnumber
keystrokeSpeedAvgnumber
deviceSignalsobjectBrowser recognition signals. Stored only when the workspace enabled `TenantPolicy.deviceFingerprintingEnabled`; otherwise dropped.
deviceFingerprintstringv1 widget fingerprint (used only when `deviceSignals` is absent or invalid and fingerprinting is enabled).
Yanıt alanı (200)TipAçıklama
acceptedbooleanFalse when the request is unknown, no longer PENDING, or processing failed. Telemetry is advisory and never fails the page.
DurumAnlam
200Processed (or ignored).
401`TELEMETRY_TOKEN_REQUIRED` — missing `Authorization: Bearer` header.
403`TELEMETRY_TOKEN_INVALID` (unknown, expired or wrong token) or `ORIGIN_NOT_ALLOWED`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
Offline Sign
POST/offline/challengeCreate an offline-sign QR challenge

For when the phone is offline: returns a QR encrypted for the user's device. The user scans it, the app shows a 7-character code, you check it with `POST /offline/verify`. Requires `TenantPolicy.offlineSignEnabled` and a phone enrolled for offline sign. Critical actions need `offlineAllowedForCritical` and `details`. At most 5 open challenges per user. The risk engine, the workspace's country rules, its access rules and the post-approval step-up mark apply as for a push, also when `requestId` names one: a refusal is a 403, a step-up puts a number on the QR (`challengeCode`, or the linked push's own number). `requireNumberMatch` is read as on `POST /login/request` (`"true"` and `1` count). WAF limit: 20/min per IP; 600/min per workspace.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
externalUsernamezorunlustring
typezorunlustringAction type slug or id (as in `POST /login/request`).
detailsLoginDetailsInputTransaction context shown on the approval screen (e.g. amount, recipient). Either a map of label → value (order kept) or an array of `{ label, value }`. At most 8 entries; labels 1–40 and values 1–120 characters after trimming; numbers and booleans are converted to strings; control characters and Unicode bidi overrides are rejected (400 `invalid_details`). Invalid input is rejected, never truncated. An empty map/array counts as no details.
clientIpstring | null
userAgentstring | null
ttlSecondsinteger
requestIdstringThe push login request this QR is a fallback for. Its number-matching code is reused, and a request the phone already REJECTED is refused (409).
requireNumberMatchbooleanAdd a 2-digit matching number (when no linked request supplies one).
includeQrImagebooleanSet false to skip rendering `qrDataUrl`.
Yanıt alanı (200)TipAçıklama
challengeIdstring
qrstringText to render as a QR code (prefix `TQ2`), scanned by the user's phone.
qrDataUrlstring | nullReady-to-render PNG data URL of `qr`, or null (`includeQrImage: false` or rendering failed).
expiresAtstring
expiresInSecondsinteger
totpAvailablebooleanWhether the typed time-based code fallback (`POST /offline/totp/verify`) is enabled.
challengeCodestringNumber matching: print this under the QR; the phone offers it among two decoys.
DurumAnlam
200Challenge created.
400Missing/invalid field, `details are required for critical actions`, `details_too_large` (QR would exceed 2000 characters), `requestId must be a request id`, or `Invalid action type`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`Integration not found`, `offline_sign_disabled`, action type disabled, `phishing_resistant_required`, `passkey_required` (the linked push now waits for a passkey, or its page is a phishing proxy), `offline_not_allowed_for_critical`, `device_integrity_failed`, `{ code: 'device_keys_lost' }` (the phone's keys were destroyed when its passcode or screen lock was turned off), blocked by the risk engine (`riskScore`), or `{ code: 'blocked', reason: 'geo_policy' }` (a country rule, +`countryCode`) / `reason: 'access_policy'` (an access rule, +`ruleName`). Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
404`request_not_found` (linked `requestId`) or `No linked device found for this user`.
409`request_rejected`; `device_not_enrolled_for_offline` (the phone has not enrolled yet: the app enrols when it is next opened online, or, for a phone linked after its first day, right after its next approval, signed by its hardware key); `device_needs_reenrollment` (this server's offline key was rotated: the phone re-binds when it is next opened online, no action from the user).
423User's 2FA is frozen (`frozenUntil`).
429`too_many_pending_challenges`, or the workspace quota / WAF limit.
500`device_secret_unavailable` or unexpected error.
503Offline sign is not configured on this server (`offline_sign_not_configured`), or `{ code: 'policy_unavailable' }`: the access policy could not be read for a critical action; try again.
POST/offline/totp/verifiersDigests of the next time-based codes, for checking codes during a Touchque outage

For your own server to check a typed time-based code while it cannot reach Touchque (the Touchque RADIUS proxy uses it): salted, slow digests of each user's codes for the next steps, never a key. Requires `offlineSignEnabled`, `offlineTotpEnabled` and `outageVerifiersEnabled`; refused under a passkey-only policy. Users who cannot use time-based codes now get no entries: drop them. Fetch again every few minutes from the step you have, so removed and frozen users fall out within that time. Up to 480 steps (4 hours) ahead and 24,000 user-steps per call (50 users for 4 hours, 1,000 for 12 minutes); 30 calls a minute per workspace.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
externalUsernameszorunlustring[]Users × steps at most 24,000 a call (50 users for 4 hours, 1,000 for 12 minutes).
fromStepintegerFirst 30-second step (default: the current one; from the current step - 1).
stepsintegerHow many steps (default 480: 4 hours). The window ends at most 480 steps after the current one.
Yanıt alanı (200)TipAçıklama
stepSecondsinteger
fromStepinteger
stepsinteger
notAfterStepinteger
kdfobject
usersobject[]Only users who can use time-based codes now (a linked phone set up for offline codes, approvals not frozen).
DurumAnlam
200The digests.
400`externalUsernames: 1 to 50 user names`, or `steps` / `fromStep` out of range.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`outage_verifiers_disabled`, `phishing_resistant_required`. Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
429The workspace quota.
500Unexpected server error.
503Offline sign is not configured on this server (`offline_sign_not_configured`).
POST/offline/totp/verifyVerify a typed time-based offline code

Lower-assurance fallback without a QR: the user opens the app and types its rolling 7-character code. Requires `offlineSignEnabled` and `offlineTotpEnabled`; refused when the workspace requires phishing resistance, and for critical action types (the linked push's type, or `type`; with a linked push a critical `type` is refused too). Each time step can be used once. A correct code is still a sign-in: the risk engine, the workspace's country rules, its access rules and the post-approval step-up mark apply as for a push, also when `requestId` names one. A code has no number to match, so any step-up answers `step_up_required` (show the QR instead), as does a linked push that was number-matched for a reason a typed code cannot answer (see `riskFactors`). An unreachable risk engine alone, and `alwaysRequireChallenge`, do not refuse it. On success, PENDING push requests of the user (of `type`, or of every type when omitted) are expired. No webhook. WAF limit: 30/min per IP.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
externalUsernamezorunlustring
codezorunlustringThe rolling 7-character code from the app (same alphabet as `/offline/verify`).
typestringAction type. Optional — but the refusal of critical action types only happens when it is sent, and when it is omitted, pending push requests of ALL types are superseded on success.
requestIdstringLinked push login request; a REJECTED one is refused (410).
clientIpstringEnd-user IP (logging only).
Yanıt alanı (200)TipAçıklama
approvedboolean
externalUsernamestring
DurumAnlam
200Code accepted.
400`externalUsername is required`, `code is required`, `requestId must be a request id`.
401`invalid_code` (wrong or already used). Authentication failures also use 401 — see `Unauthorized`.
403`offline_totp_disabled`, `phishing_resistant_required`, `offline_totp_not_allowed_for_critical` (`Error`); or an `OfflineResult` with `passkey_required` (the linked push now waits for a passkey, or its page is a phishing proxy), `step_up_required` (scan the QR instead), `blocked` (the risk engine, or a workspace rule named in `blockedBy`) or `unavailable` (no risk verdict). Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
404`no_linked_device` (`OfflineResult`) or `request_not_found` (`Error`).
409`device_not_enrolled`.
410`request_rejected`.
423`frozen` (`frozenUntil`).
429`too_many_failures`, or the workspace quota / WAF limit.
500Unexpected server error.
503Offline sign is not configured on this server (`offline_sign_not_configured`).
POST/offline/verifyVerify the code typed for an offline challenge

Checks the 7-character code. 5 attempts per challenge; wrong codes also count towards a per-user lockout (`TenantPolicy.maxFailedChallenges`, default 5 per hour). On success, PENDING push requests of the same user and action type are expired (superseded). It does NOT confirm the linked push request and sends no webhook — treat `approved: true` as the approval. WAF limit: 30/min per IP.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
challengeIdzorunlustring
codezorunlustring7 characters from `ABCDEFGHJKLMNPQRSTUVWXYZ23456789` shown by the phone; case-insensitive, spaces and hyphens ignored.
Yanıt alanı (200)TipAçıklama
approvedboolean
challengeIdstring
externalUsernamestring
typestring
DurumAnlam
200Code accepted.
400`challengeId is required` / `code is required`.
401Wrong code (`invalid_code`, or `locked` after the last attempt) with `attemptsLeft`. Authentication failures also use 401 — see `Unauthorized`.
403`Integration not found`; or an `OfflineResult` with `passkey_required` (the linked push now waits for a passkey, or its page is a phishing proxy). Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
404`unknown_challenge`.
409`device_not_enrolled` — the phone's offline key is missing or from a rotated server key.
410`used`, `locked`, `expired` or `request_rejected`.
429`too_many_failures` for this user, or the workspace quota / WAF limit.
500Unexpected server error.
503Offline sign is not configured on this server (`offline_sign_not_configured`).
QR Pairing
POST/qr-pairingsRegister a browser pairing code

Pair a browser (an extension, a desktop app) to a user by a QR code they scan with the Touchque app, like signing in to a messenger on the web. Put the pairing id, a one-time nonce and the browser key's thumbprint in the code: `touchque://pair-browser?v=1&p=<pairingId>&n=<nonce>&k=<keyThumbprint>`.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
nonceHashzorunlustringbase64url SHA-256 of the one-time nonce you put in the QR code (at least 20 characters; 32 random bytes recommended). Touchque never sees the nonce until the phone scans it.
keyThumbprintzorunlustringRFC 7638 thumbprint of the browser's own non-extractable key: the pairing binds to exactly that browser.
clientIpstring | nullThe browser's address: shown on the phone with its place, and compared with the phone's.
userAgentstring | null
browserstring | nullWhat the phone names the browser, e.g. `Chrome 155`.
osstring | nullIts operating system, e.g. `macOS`.
ttlSecondsintegerHow long the code can be scanned.
Yanıt alanı (201)TipAçıklama
pairingIdstring
expiresAtstring
DurumAnlam
201Registered.
400`invalid_request`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`integration_not_found`. Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
429`rate_limited`.
500Unexpected server error.
GET/qr-pairings/{id}A pairing's state

Where a pairing stands; once scanned, the account the phone holds with your workspace and how near the phone was to the browser. Poll it every second or two while the code is shown.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringPairing id.
Yanıt alanı (200)TipAçıklama
pairingIdstring
state"waiting" | "scanned" | "confirmed" | "requested" | "refused" | "reported" | "expired"`scanned`: a phone read the code and shows what is being paired; `confirmed`: the person went on, ask the phone now (`POST /login/request` with `qrPairing`); `requested`: asked (`requestId`); `refused`: you refused it, or the person declined it on the phone (`outcome.reason: declined`); `reported`: the person said someone told them to scan it (their 2FA is frozen: treat it as an attack).
keyThumbprintstring
expiresAtstring
externalUsernamestringOnce scanned: the account the phone holds with your workspace.
scannedAtstring
confirmedAtstring | null
phoneobject
browserobject
proximityobjectHow near the phone that scanned was to the browser: each `true`, `false` or `null` (cannot be told, e.g. a private address).
requestIdstring | null
outcomeobject
reportedAtstring
DurumAnlam
200The pairing.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found` (not yours, or gone).
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/qr-pairings/{id}/outcomeRefuse a scanned pairing

Your own checks refused a pairing that was scanned (an organization rule, a computer an administrator must approve first, too many browsers): the phone shows `message`, and the case or device code.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringPairing id.
Gövde alanıTipAçıklama
reasonzorunlu"policy" | "device_not_approved" | "too_many_browsers" | "rate_limited" | "no_account" | "other"
messagezorunlustringWhat the phone shows.
caseCodestring | nullYour own case code for the refusal, shown on the phone.
deviceCodestring | nullThe computer's code an administrator approves (`K7Q-2PD`).
Yanıt alanı (200)TipAçıklama
pairingIdstring
state"waiting" | "scanned" | "confirmed" | "requested" | "refused" | "reported" | "expired"`scanned`: a phone read the code and shows what is being paired; `confirmed`: the person went on, ask the phone now (`POST /login/request` with `qrPairing`); `requested`: asked (`requestId`); `refused`: you refused it, or the person declined it on the phone (`outcome.reason: declined`); `reported`: the person said someone told them to scan it (their 2FA is frozen: treat it as an attack).
keyThumbprintstring
expiresAtstring
externalUsernamestringOnce scanned: the account the phone holds with your workspace.
scannedAtstring
confirmedAtstring | null
phoneobject
browserobject
proximityobjectHow near the phone that scanned was to the browser: each `true`, `false` or `null` (cannot be told, e.g. a private address).
requestIdstring | null
outcomeobject
reportedAtstring
DurumAnlam
200Refused.
400`invalid_request`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
409`not_open`: it was not scanned, or it already ended.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
Recovery
GET/recoveryList recoveries

A user's recoveries (also completed transfers, `method: transfer`), newest first, or with `open=true` every running one of the workspace (e.g. for an admin's veto screen). At most 50.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
externalUsernamequerystringYour identifier for the user.
openquery"true" | "false"`true`: only running recoveries.
Yanıt alanı (200)TipAçıklama
recoveriesRecovery[]
DurumAnlam
200Recoveries.
400`invalid_request` — pass `externalUsername` or `open=true`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/recovery/startStart moving a user to a new phone (Vouch)

For a user whose phone is lost, dead or replaced, after you checked the first factor (password, upstream IdP). Show `bindUri` as a QR: the Touchque app on the new phone scans it and binds its hardware key to this recovery. Then each voucher gets a number-matched approval on their own phone; the numbers appear in `vouchers[].code` (show them to the user, who reads one to each colleague on a call). The old phone, if alive, gets a request too: approving moves the account at once, rejecting stops it.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
externalUsernamezorunlustring
clientIpstringThe user's IP address (what the risk engine and the vouchers see).
userAgentstring
displayNamestringHow the vouchers know the user ("Ada Lovelace").
fallbackVouchersstring[]Fill up a short named list, e.g. with the organization's admins. Never instead of the named vouchers.
requiredintegerMore vouchers than the floor of 2.
coolOffMinutesintegerA longer cooling-off than the floor (15 minutes; default 60).
detailsLoginDetail[]What the vouchers' phones show instead of the default English lines.
noticeDetailsLoginDetail[]What the old phone shows (approve to move now, reject to stop) instead of the default English lines.
Yanıt alanı (201)TipAçıklama
bindCodestringOne-time; shown once.
bindUristringShow it as a QR for the Touchque app on the new phone: `touchque://recover?id=…&code=…`.
riskContextobject
DurumAnlam
201Started; waiting for the new phone.
400`invalid_request`, `invalid_details`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`blocked` (`reason: risk`). Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
404`device_not_linked`: no phone to recover; link one with a new QR.
409`recovery_in_progress` (`recoveryId`), `not_enough_vouchers` (`required`, `eligible`, `vouchers`).
423`frozen` (`frozenUntil`).
429`rate_limited`: three recoveries today.
500Unexpected server error.
GET/recovery/vouchersA user's recovery vouchers

The colleagues the user named to vouch for a move to a new phone, and whether each can vouch today (`eligible`, or `reason`: `no_phone`, `no_hardware_key`, `keys_lost`, `frozen`, `on_probation`, `same_phone`). `probationUntil` is set while the user's own account is on probation after a vouch recovery.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
externalUsernamezorunluquerystringYour identifier for the user.
Yanıt alanı (200)TipAçıklama
externalUsernamestring
vouchersRecoveryVoucherEligibility[]
updatedAtstring | null
probationUntilstring | nullThe user's own account is on probation after a vouch recovery until then.
DurumAnlam
200The vouchers.
400`invalid_request` — missing `externalUsername`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`user_not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/recovery/vouchersName a user's recovery vouchers

Replaces the list (at most 5 other users of this workspace; the user themself and duplicates are dropped). Ask for the user's phone (or a passkey) before you call it: whoever can change the list chooses who may move the account. A list changed in the last 72 hours asks a recovery for one more voucher.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
externalUsernamezorunlustring
voucherszorunlustring[]Other users of this workspace; at most 5 are kept.
Yanıt alanı (200)TipAçıklama
externalUsernamestring
vouchersRecoveryVoucherEligibility[]
updatedAtstring | null
probationUntilstring | nullThe user's own account is on probation after a vouch recovery until then.
DurumAnlam
200The vouchers as stored.
400`invalid_request`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`user_not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/recovery/{id}Recovery status

Moves the recovery on from what the phones answered, then returns it with the receipt chain. Poll it every few seconds while the user waits; the codes are present only while they can be used.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe recovery id.
Yanıt alanı (200)TipAçıklama
recoveryIdstring
externalUsernamestring
method"vouch" | "old_phone" | "transfer"
status"AWAITING_DEVICE" | "VOUCHING" | "COOLING" | "COMPLETED" | "VETOED" | "EXPIRED" | "FAILED"
requiredinteger
approvalsinteger
vouchersRecoveryVoucherState[]
oldPhoneobject
coolOffMinutesinteger
coolOffUntilstring | null
elevatedboolean
reasons"risk_engine_unavailable" | "risk_hard_signals" | "risk_challenge" | "recent_fraud_report" | "recent_recovery" | "vouchers_recently_changed"[]
locationstring | null
newPhoneBoundboolean
expiresAtstring
completedAtstring | null
endedReasonstring | nulle.g. `cooling_off_ended`, `old_phone_approved`, `voucher_rejected`, `old_phone_rejected`, `voucher_revoked`, `partner_veto`, `not_enough_approvals`, `not_bound`, `replaced`, `new_phone_key_changed`.
endedBystring | null
createdAtstring
receiptsRecoveryReceipt[]
DurumAnlam
200The recovery.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`recovery_not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/recovery/{id}/vetoStop a running recovery

E.g. an organization admin who does not believe it. Does not freeze the user's 2FA.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe recovery id.
Gövde alanıTipAçıklama
bystringWho stopped it (shown in the receipts), e.g. the admin's e-mail.
reasonstringDefault `partner_veto`.
Yanıt alanı (200)TipAçıklama
recoveryIdstring
externalUsernamestring
method"vouch" | "old_phone" | "transfer"
status"AWAITING_DEVICE" | "VOUCHING" | "COOLING" | "COMPLETED" | "VETOED" | "EXPIRED" | "FAILED"
requiredinteger
approvalsinteger
vouchersRecoveryVoucherState[]
oldPhoneobject
coolOffMinutesinteger
coolOffUntilstring | null
elevatedboolean
reasons"risk_engine_unavailable" | "risk_hard_signals" | "risk_challenge" | "recent_fraud_report" | "recent_recovery" | "vouchers_recently_changed"[]
locationstring | null
newPhoneBoundboolean
expiresAtstring
completedAtstring | null
endedReasonstring | nulle.g. `cooling_off_ended`, `old_phone_approved`, `voucher_rejected`, `old_phone_rejected`, `voucher_revoked`, `partner_veto`, `not_enough_approvals`, `not_bound`, `replaced`, `new_phone_key_changed`.
endedBystring | null
createdAtstring
receiptsRecoveryReceipt[]
DurumAnlam
200Vetoed.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`recovery_not_found`.
409`recovery_not_open`: already completed, vetoed, expired or failed.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
Help Desk
GET/assistList assist sessions

A person's sessions, or every open one, newest first (50 at most).

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
externalUsernamequerystringThe person.
openquery"true" | "false"`true`: open ones only.
Yanıt alanı (200)TipAçıklama
sessionsAssistSession[]
DurumAnlam
200Sessions.
400`invalid_request` — pass `externalUsername` or `open=true`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/assistStart helping a person

Call it before your help desk acts on someone's account: a short-lived session bound to the agent and the person. By default their phone gets a calm notice, nothing to approve: "<agent> from IT is working on your account now." While it is open, the person's "someone says they're from IT" button shows this agent; with none open it tells them to hang up, and you get `ASSIST_CLAIM_UNVERIFIED`.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
externalUsernamezorunlustringThe person IT is helping.
agentzorunluobject
reasonstringA ticket or a few words, for the log.
ttlMinutesintegerDefault 30.
notifybooleanSend the person's phone the notice "<agent> from IT is working on your account now" (nothing to approve). Default true.
Yanıt alanı (201)TipAçıklama
idstring
externalUsernamestring
status"OPEN" | "ENDED"
agentobject
reasonstring | null
notifiedboolean
openedAtstring
expiresAtstring
endedAtstring | null
endedReasonstring | nullE.g. `ended`, `expired`, `replaced`.
phonebooleanThe person has a working Touchque phone to check on. `false`: they move to a new phone with Never Locked Out.
frozenbooleanTheir approvals are frozen (see `POST /assist/{id}/unfreeze`).
checksAssistCheck[]
DurumAnlam
201Open.
400`invalid_request`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`user_not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/assist/{id}Assist session and its checks

Poll it while a check is `pending`.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe assist session id.
Yanıt alanı (200)TipAçıklama
idstring
externalUsernamestring
status"OPEN" | "ENDED"
agentobject
reasonstring | null
notifiedboolean
openedAtstring
expiresAtstring
endedAtstring | null
endedReasonstring | nullE.g. `ended`, `expired`, `replaced`.
phonebooleanThe person has a working Touchque phone to check on. `false`: they move to a new phone with Never Locked Out.
frozenbooleanTheir approvals are frozen (see `POST /assist/{id}/unfreeze`).
checksAssistCheck[]
DurumAnlam
200The session.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`assist_not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/assist/{id}/endStop helping

Ends the session; checks still waiting on the phone expire.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe assist session id.
Gövde alanıTipAçıklama
bystring
reasonstring
Yanıt alanı (200)TipAçıklama
idstring
externalUsernamestring
status"OPEN" | "ENDED"
agentobject
reasonstring | null
notifiedboolean
openedAtstring
expiresAtstring
endedAtstring | null
endedReasonstring | nullE.g. `ended`, `expired`, `replaced`.
phonebooleanThe person has a working Touchque phone to check on. `false`: they move to a new phone with Never Locked Out.
frozenbooleanTheir approvals are frozen (see `POST /assist/{id}/unfreeze`).
checksAssistCheck[]
DurumAnlam
200Ended.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`assist_not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/assist/{id}/spendUse a passed check for its action

Call it right before you take the action: a `verified` check for the same `action`, at most ten minutes old, used once. Anything else is `428 check_required`.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe assist session id.
Gövde alanıTipAçıklama
requestIdzorunlustring
actionzorunlustringWhat the help desk is about to do, in your words: `reset_2fa`, `reset_password`, `activation_link`, `recovery_link`, `unlock`, `new_phone`, `remove_passkey`, ...
Yanıt alanı (200)TipAçıklama
idstring
externalUsernamestring
status"OPEN" | "ENDED"
agentobject
reasonstring | null
notifiedboolean
openedAtstring
expiresAtstring
endedAtstring | null
endedReasonstring | nullE.g. `ended`, `expired`, `replaced`.
phonebooleanThe person has a working Touchque phone to check on. `false`: they move to a new phone with Never Locked Out.
frozenbooleanTheir approvals are frozen (see `POST /assist/{id}/unfreeze`).
checksAssistCheck[]
DurumAnlam
200Used.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`assist_not_found`.
409`assist_not_open`, `busy`.
428`check_required`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/assist/{id}/unfreezeUnlock the person's approvals

Lifts a freeze (after "this isn't me" or repeated rejections), using a passed check for `unlock`.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe assist session id.
Gövde alanıTipAçıklama
requestIdzorunlustring
Yanıt alanı (200)TipAçıklama
unfrozenboolean
sessionAssistSessionIT working on a person's account. `OPEN` until ended, expired or replaced; while it is open, the person's phone answers "someone says they're from IT" with this agent's name, role and since when.
DurumAnlam
200Done.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`assist_not_found`.
409`assist_not_open`, `busy`.
428`check_required`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/assist/{id}/verifyCheck the person before a sensitive action

Sends the person's phone a critical, number-matched request (type `HELPDESK_VERIFY`): "IT (<agent>) is about to <action> because someone on a call asked. Is that you on the call?" Show `challengeCode` to the agent; they read it to the person, who types it and approves with Face ID. Default deny. Wrong digits, "this isn't me" or "someone told me to" block it and raise an alert (`ASSIST_CHECK_FAILED`); "this isn't me" also freezes the account. The Vishing Shield does not block it: a call with IT is expected here.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe assist session id.
Gövde alanıTipAçıklama
actionzorunlustringWhat the help desk is about to do, in your words: `reset_2fa`, `reset_password`, `activation_link`, `recovery_link`, `unlock`, `new_phone`, `remove_passkey`, ...
actionTextstringShown on the phone: "IT (<agent>) is about to <actionText>". Default `action` with spaces.
detailsobject[]Your own lines for the phone instead of the default (who, about to, why, is that you?).
Yanıt alanı (201)TipAçıklama
requestIdstring
challengeCodestringShow it to the agent only: they read it to the person on the call, who types it on the phone.
expiresAtstring
actionstring
DurumAnlam
201Sent.
400`invalid_request`, `invalid_details`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`assist_not_found`.
409`assist_not_open`, `no_phone` (with `route: never_locked_out`).
429`rate_limited` — ten checks per session.
500Unexpected server error.
Risk
GET/risk/browsersList a user's known browsers

The browsers that may sign this user in silently (forgotten ones are not listed), most recently seen first, at most 100.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
externalUsernamezorunluquerystringYour identifier for the user.
Yanıt alanı (200)TipAçıklama
browsersBrowserKeyInfo[]
DurumAnlam
200Known browsers.
400`invalid_request` — missing `externalUsername`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`integration_not_found`. Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500`internal_error`.
POST/risk/browsers/forgetForget a user's known browsers

A forgotten browser asks the phone again at its next sign-in; a new real approval makes it known again. Without `thumbprint` every browser of the user is forgotten (e.g. after a password reset or a reported takeover).

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
externalUsernamezorunlustring
thumbprintstringOne browser; omitted: all of the user's browsers.
Yanıt alanı (200)TipAçıklama
forgottenintegerHow many browsers were forgotten.
DurumAnlam
200Forgotten.
400`invalid_request` — missing `externalUsername` or a malformed `thumbprint`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`integration_not_found`. Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500`internal_error`.
POST/risk/checkMay this sign-in skip the phone approval?

Silent sign-ins (re-prompt fatigue): call it before `POST /login/request` with the end user's `browserProof`. `prompt: false` means the sign-in may go on without asking the phone: the browser proved its device-bound key, passed a real second factor (a push that was not provisional, a passkey or an offline QR) within the allowed window, on the phone linked now, from a country and network the user approved from before, and the risk engine sees nothing new or risky. Otherwise call `POST /login/request` as usual, with the same `browserProof`, so the approval makes the browser known.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
externalUsernamezorunlustringYour identifier for the user.
typestringAction type slug or id, as on `POST /login/request`. A critical action is never silent. Undefined types answer 400 `unknown_action`, disabled ones 403 `action_disabled`.
clientIpstring | nullThe END USER's IP address. Without it the network cannot be compared with earlier sign-ins and the answer is `prompt: true`.
userAgentstring | nullThe end user's browser user agent.
clientSignalsstringIs a person at the page or software driving the browser (Playwright, a headless Chrome, an AI browser agent)? The end user's page check from `@touchque/web` `startClientSignals().encode()`, passed through untouched (booleans, counts and timings only). With signs of automation the request is never silent and asks with number matching; the workspace can block it instead (`TenantPolicy.automatedClients`: 403 `blocked` with reason `automated_client`).
deviceRiskRequestIdstringDevice risk (a paid add-on, off by default): the page's identification from `@touchque/web` `deviceRisk.identify()`, or the script tag's `touchque_request_id` field as it came (after a dot, how the pointer moved: counts weighed as `device_pointer_synthetic`, never kept). Used only when the workspace turned Device risk on, for this account only (another account gets `device_report_replayed`). The risk engine counts the visitor and decides: its signals only ever ask for more (reported only until Touchque enforces them), a visitor your admin marked "step up always" asks at once, and a sign-in with a device signal is never silent.
deviceRiskobjectInstead of deviceRiskRequestId: the page's report from `@touchque/web` `deviceRisk.collect()`, relayed untouched.
browserProofBrowserProofProof from the end user's browser that it holds its device-bound key: a non-extractable ECDSA P-256 key made with WebCrypto and kept in IndexedDB (`@touchque/web` `browserKey.proof()`). Pass it through untouched: the JSON object, its JSON text, or the base64url(JSON) form of the `X-Touchque-Browser` header. `{ v: 1, jwk: { kty: "EC", crv: "P-256", x, y }, aud: <page origin>, iat: <unix seconds>, nonce: <base64url, 16 random bytes>, sig: <base64url P1363 r||s> }`, signed over the UTF-8 text `touchque-browser:v1\n{aud}\n{iat}\n{nonce}` with ECDSA SHA-256. Accepted when `iat` is within 5 minutes, the signature is valid, the nonce is new (each proof works once per endpoint) and, when the workspace's organization has verified domains (Organization → Domains) or the workspace has passkey origins, `aud` is an https origin on one of those sites (`http://localhost` and `http://127.0.0.1` outside production). Anything else reads as "no known browser", never as an error.
maxAgeSecondsintegerYour own limit on the age of the browser's last real approval; `0` asks every time. The engine's own limit (7 days by default) applies when it is shorter.
contextActionContextAnything your Actions should know about this request and that Touchque cannot (roles, plan, amount, tenant). At most 4 KB of JSON. Your Actions read it as `event.context`; it is never shown on the phone and not stored on the request (only in the recorded Actions event, kept 30 days).
Yanıt alanı (200)TipAçıklama
promptboolean`false`: skip the phone approval for this sign-in (the browser proved its key, passed a real second factor recently on the same phone, and nothing about the sign-in is new). Anything else: ask as usual (`POST /login/request` with the same `browserProof`). Treat a missing or non-boolean value as `true`.
reasonsRiskReason[]Why it is silent, or why it asks (most important first).
assurance"high" | "normal" | "low"`high`: nothing new about this sign-in; `normal`: nothing wrong, but something is new or unknown; `low`: a risk signal.
silentMode"enforce" | "shadow"`shadow`: silent sign-ins are only measured (`prompt` is always `true`), also when the risk engine could not be asked.
caseCodestring"Why?" case code of this decision (6 characters without I, O, 0 or 1, e.g. `K7P-2QX`). Show it to the user ("Tell your support team: K7P-2QX"); your team opens the full decision (each check, the rule that matched, what would have let it through) by this code in the dashboard (Logs → Look up a case).
DurumAnlam
200The answer.
400`invalid_request` (missing `externalUsername`, bad `type` or `maxAgeSeconds`) or `unknown_action`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`integration_not_found`; `action_disabled`. Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
Device Risk
GET/device-risk/accounts/{externalUsername}The visitorIds an account used

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
externalUsernamezorunlupathstringThe account.
Yanıt alanı (200)TipAçıklama
externalUsernamestring
visitorsDeviceRiskVisitor[]
DurumAnlam
200Its visitors, newest first.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/device-risk/accounts/{externalUsername}Delete one person's identifications

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
externalUsernamezorunlupathstringThe account.
Yanıt alanı (200)TipAçıklama
reportsinteger
visitorsinteger
DurumAnlam
200What was deleted (visitors left with none go too; the account leaves the engine's counters).
400`invalid_request`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/device-risk/checkCheck an identification for an account (sign-up, reset, sign-in, approval)

For pages login.request and risk.check do not cover (sign-up, password reset), or to know before the push: binds the identification to the account (one account per identification, 15 minutes) and asks the risk engine, which counts per visitor and decides. Every signal only asks for more and never blocks. `requestId` (the `touchque_request_id` form field the script tag fills, or deviceRisk.identify) or `deviceRisk` (deviceRisk.collect, relayed by your server). Send the field as it came: a missing, empty, unknown or expired one is still a verdict (`report`), never an error. Same budget as `/login/request`.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
requestIdstring | nullAs the page sent it (`dre_…`, and after a dot the 18 characters the script tag adds on submit: how the pointer and the fingers moved, as counts the browser computed, weighed by the risk engine as `device_pointer_synthetic` and never kept); missing or empty: a verdict with `report: missing`. The answer's `requestId` is the identification alone.
deviceRiskDeviceRiskReportThe encoded report from `@touchque/web` `deviceRisk.collect({ purpose })`, passed untouched (the relay alternative to `deviceRisk.identify`). Collect it only on sign-in, sign-up, password-reset and approval pages, and name it in your privacy notice. Touchque keeps no raw trait: keyed hashes with a key of your workspace alone (no device is linked across Touchque customers) and coarse labels, for the retention your workspace sets (30 to 90 days).
event"sign_in" | "sign_up" | "password_reset" | "approval"Default `sign_in`.
externalUsernamestringThe account the page is for, when there is one (accounts per visitor).
clientIpstringThe end user's address; default: the address the browser identified from.
Yanıt alanı (200)TipAçıklama
report"ok" | "replayed" | "missing" | "unknown" | "expired" | "invalid"`replayed`: this identification was used for another account, or the report was sent twice (`device_report_replayed`). `missing` (no requestId or an empty one), `unknown` (made up, or another workspace's), `expired` (older than 15 minutes) and `invalid` (a relayed report that cannot be read): the tag was removed or blocked, `device_identification_missing` is raised; ad blockers do it to honest people too, so it only ever asks for a number-matched step-up.
requestIdstring | null
visitorIdstring | null
confidencenumber | null
visitorobject | null
countsobject | nullThe engine's counts for this visitor: accounts_24h, accounts_30d, signups_24h, countries_24h, resets_7d.
networkDeviceRiskNetworkThe address as the risk engine saw it for this event: the place (never coordinates), the operator and the kind of network. null when no address was given.
velocityDeviceRiskVelocityThis visitor's counts: accounts, sign-ups, countries and stored-id resets (the risk engine's), identifications (Touchque's). null for a count not known.
botDeviceRiskBotOne answer to "a bot?", summing up the signals (the risk engine still decides): `detected` the browser says it is driven (webdriver, a headless browser), `suspected` signs that point that way (the pointer moved like software, a zero-size window, software graphics).
signalsDeviceRiskVerdictSignal[]
stepUpbooleanAsk for more on this page (an emailed code, a passkey, a number-matched approval). Never a reason to refuse. True for your admin's "step up always" mark, for signals Touchque enforces, and when the risk engine cannot be asked (`engine: unavailable`).
wouldStepUpboolean
requires"none" | "number_match" | "passkey"What a step-up asks for (`none` without one). `passkey` only while Touchque's risk engine enforces phishing-resistant assurance; until then the same step-up asks for `number_match`.
mode"shadow" | "enforce"`enforce` when at least one raised signal is enforced.
caseCodestring"Why?": the decision record, opened by this code in the dashboard.
DurumAnlam
200The visitor and the engine's verdict.
400`invalid_request`: an unknown `event` or a bad `externalUsername`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
409`device_risk_off`: turn Device risk on in the dashboard.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/device-risk/delete-allDelete every visitor

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
confirmzorunlustring
Yanıt alanı (200)TipAçıklama
deletedinteger
DurumAnlam
200How many were deleted.
400`invalid_request`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/device-risk/eventsSearch identifications

The workspace's identifications, newest first, one page at a time: a date range (7 days by default, at most 90, within the retention) and any of the filters, each on an index. Pass `nextCursor` back as `cursor` until it is null; do not page by changing `from`/`to`. A search that would read too much answers 422 `search_too_broad`: narrow the range or add a filter. A workspace runs two searches at a time and 120 a minute. For everything at once use the export, the `device_risk.*` webhooks or the organization's log stream.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
fromquerystringStart: YYYY-MM-DD (UTC) or an ISO time. Default: 7 days before `to`.
toquerystringEnd: YYYY-MM-DD (UTC, the whole day) or an ISO time. Default: now.
signalquerystringOnly identifications that raised this signal code.
stepUpqueryboolean`true`: only the ones that asked for more; `false`: only the others.
kindquery"sign_in" | "sign_up" | "password_reset" | "approval"The page.
originquerystringThe page's origin, like https://shop.example.com.
ipquerystringAn address or a range in CIDR (`203.0.113.0/24`, `2001:db8:1::/48`): a range is /16 or narrower for IPv4 and /48 or narrower for IPv6. A filter only: no answer carries an address. Not with `requestId`.
accountquerystringThe account (externalUsername).
visitorIdquerystringOne visitor (`tqv_…`).
requestIdquerystringOne identification (`dre_…`).
cursorquerystringThe `nextCursor` of the previous page (opaque).
limitqueryinteger1 to 100, default 25.
Yanıt alanı (200)TipAçıklama
eventsDeviceRiskIdentification[]
nextCursorstring | null
fromstring
tostring
signalTextsobject
DurumAnlam
200A page.
400A filter that cannot be read: `invalid_range`, `range_too_long`, `out_of_retention`, `invalid_signal`, `invalid_ip`, `cidr_too_broad` (a range wider than /16 for IPv4 or /48 for IPv6), `invalid_filter` (`ip` with `requestId`), `invalid_cursor`, `invalid_limit`…
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
422`search_too_broad`: narrow the date range or add a filter.
429`search_busy`: two searches of this workspace are already running; or `integration_quota_exceeded`: more than 120 searches a minute. Retry after `Retry-After` seconds.
500Unexpected server error.
GET/device-risk/events/{requestId}Read an identification (trusted)

What Touchque saw for a `requestId` the page sent you: the visitor, how sure, what the page showed and the risk engine's verdict. Never trust the page's own copy.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
requestIdzorunlupathstringFrom deviceRisk.identify().
Yanıt alanı (200)TipAçıklama
requestIdstring
visitorIdstring
confidencenumber
matchedBy"key" | "sid" | "traits" | "new"
sealedboolean
purpose"sign_in" | "sign_up" | "password_reset" | "approval"
originstring | nullThe page origin the report was made on.
countrystring | null
createdAtstring
usedAtstring | null
externalUsernamestring | nullThe account it was used for (one per identification).
visitorobjectfirstSeenAt, lastSeenAt, seenCount, status (your admin's mark), coarse labels.
factsobjectWhat the page showed: codes, evidence (finding names), reset, twins, privateWindow.
verdictobject | nullThe risk engine's answer: stepUp, requires, mode, signals (each enforced or not), caseCode.
networkDeviceRiskNetworkThe address as the risk engine saw it for this event: the place (never coordinates), the operator and the kind of network. null when no address was given.
velocityDeviceRiskVelocityThis visitor's counts: accounts, sign-ups, countries and stored-id resets (the risk engine's), identifications (Touchque's). null for a count not known.
botDeviceRiskBotOne answer to "a bot?", summing up the signals (the risk engine still decides): `detected` the browser says it is driven (webdriver, a headless browser), `suspected` signs that point that way (the pointer moved like software, a zero-size window, software graphics).
DurumAnlam
200The identification.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/device-risk/exportExport the visitors and identifications of a date range (JSON)

Streamed, one export of a workspace at a time (either format). JSON: one document written visitor by visitor; its `truncated` comes last. At most 50 000 visitors, 500 identifications per visitor, 200 000 identifications and 48 MB in all: past any of them `truncated: true`, export a shorter range. `X-Touchque-Truncated: true` is sent when the cut is known before the first byte (more than 50 000 visitors). A failure after the first byte still ends the document, with `truncated: true` and `stopped: true`: it is incomplete.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
fromquerystringFirst day (YYYY-MM-DD, UTC): visitors seen since, with that range's identifications.
toquerystringLast day (YYYY-MM-DD, UTC).
formatquery"json" | "csv"`csv`: the identifications of the range, one row each (no address), streamed; at most 200 000 rows, `X-Touchque-Truncated: true` when cut. A file whose last line starts with `# export stopped` is incomplete: the export failed after the first rows. Default JSON.
Yanıt alanı (200)TipAçıklama
exportedAtstring
fromstring | null
tostring | null
visitorsobject[]
truncatedboolean
stoppedbooleanPresent (true) only when the export failed midway: the document is incomplete.
DurumAnlam
200No keyed hashes and no addresses.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
422`search_too_broad` (CSV): the range reads too many identifications; export a shorter one.
429`export_in_progress`: an export of this workspace is already running.
500Unexpected server error.
POST/device-risk/identifyIdentify the visitor on a page (the end user's browser)

Sent by `@touchque/web` `deviceRisk.identify({ siteKey, purpose })` from your sign-in, sign-up, password-reset or approval page, as `text/plain` JSON so no CORS preflight is needed. Only from pages on your organization's verified domains (Organization → Domains) or your listed origins (Device risk settings). The page gets `{ visitorId, requestId, confidence }` only: your server reads the signals and the verdict by `requestId`. Rate limited per address and per site key. Through your own first-party proxy, send `X-Touchque-Proxy-Secret` (the settings' `proxySecret`) and `X-Touchque-Client-IP` (the visitor's address) so the visitor's address is counted, not the proxy's.

Kimlik: Herkese açık

ParametreYerTipAçıklama
X-Touchque-Proxy-SecretheaderstringYour first-party proxy only (server-side, never in the page).
X-Touchque-Client-IPheaderstringThe visitor's address; read only with a valid `X-Touchque-Proxy-Secret`.
Yanıt alanı (200)TipAçıklama
requestIdstring
atstring
visitorIdstring
kind"sign_in" | "sign_up" | "password_reset" | "approval"
originstring | nullThe page's origin.
externalUsernamestring | null
countrystring | null
networkobject | nullThe address as the risk engine saw it: place (no coordinates), operator, kind of network.
confidencenumber | null
matchedBy"key" | "sid" | "traits" | "new" | null
sealedboolean
stepUpboolean
signalsobject[]
caseCodestring | null
botobject
DurumAnlam
200The identification.
400`invalid_request`, `report_malformed`, `report_stale`.
403`unknown_site_key`, `device_risk_off`, `origin_not_allowed`, `proxy_secret_invalid`.
409`report_replayed`: this report was already sent.
429`rate_limited`.
GET/device-risk/overviewVisitors, accounts per visitor, signals and coverage

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
200Counts for the last 30 days (signals: 7 days); trend30d per UTC day.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/device-risk/recentThe latest identifications (a live feed)

Newest first: each identification with its visitorId, page, account, confidence and the risk engine's verdict (signals, enforced or not, case code). Coarse labels only, never a raw trait.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
limitqueryinteger
DurumAnlam
200{ events, signalTexts }.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/device-risk/settingsDevice risk settings

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Yanıt alanı (200)TipAçıklama
enabledbooleanOff by default.
retentionDaysinteger
retentionRangeobject
siteKeystring | nullPublic: the web SDK's deviceRisk.identify() sends it. Issued when Device risk is first turned on.
originsstring[]Page origins that may identify, besides pages on your organization's verified domains and their subdomains (Organization → Domains).
pagesstring[]
signalsDeviceRiskSignal[]
alertsDeviceRiskAlertsAlerts: each rule alerts at most once an hour, to the webhook (DEVICE_RISK_ALERT) and/or by email to the owners and admins of the workspace's organization.
alertRulesobject[]Each rule: id, label, unit, min, max and the default threshold.
alertDeliveryobject
verifiedDomainsarray | nullYour organization's verified domains (Organization → Domains); null when they cannot be read.
offDomainOriginsstring[]Origins on none of the verified domains: allowed, only pointed out.
firstPartyobject | nullThe workspace's verified Touchque Login custom domain, where the tag (`{scriptBase}/vX.Y.Z/device.js`, the same bytes and integrity as the CDN's) and its identify call (`data-api="{apiBase}"`) are served first-party; null without one.
proxySecretstringOwners, admins and API keys only. Your own first-party proxy (/_tq/ on your domain) sends it as `X-Touchque-Proxy-Secret` on the identify call, with the visitor's address as `X-Touchque-Client-IP`. Keep it on the server like the API key; a new site key makes a new one.
DurumAnlam
200The settings.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
PUT/device-risk/settingsTurn Device risk on or off, set the retention, the page origins and the alerts

In production a new origin must use https (http only for localhost).

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
enabledboolean
retentionDaysinteger
originsstring[]
alertsDeviceRiskAlertsAlerts: each rule alerts at most once an hour, to the webhook (DEVICE_RISK_ALERT) and/or by email to the owners and admins of the workspace's organization.
Yanıt alanı (200)TipAçıklama
enabledbooleanOff by default.
retentionDaysinteger
retentionRangeobject
siteKeystring | nullPublic: the web SDK's deviceRisk.identify() sends it. Issued when Device risk is first turned on.
originsstring[]Page origins that may identify, besides pages on your organization's verified domains and their subdomains (Organization → Domains).
pagesstring[]
signalsDeviceRiskSignal[]
alertsDeviceRiskAlertsAlerts: each rule alerts at most once an hour, to the webhook (DEVICE_RISK_ALERT) and/or by email to the owners and admins of the workspace's organization.
alertRulesobject[]Each rule: id, label, unit, min, max and the default threshold.
alertDeliveryobject
verifiedDomainsarray | nullYour organization's verified domains (Organization → Domains); null when they cannot be read.
offDomainOriginsstring[]Origins on none of the verified domains: allowed, only pointed out.
firstPartyobject | nullThe workspace's verified Touchque Login custom domain, where the tag (`{scriptBase}/vX.Y.Z/device.js`, the same bytes and integrity as the CDN's) and its identify call (`data-api="{apiBase}"`) are served first-party; null without one.
proxySecretstringOwners, admins and API keys only. Your own first-party proxy (/_tq/ on your domain) sends it as `X-Touchque-Proxy-Secret` on the identify call, with the visitor's address as `X-Touchque-Client-IP`. Keep it on the server like the API key; a new site key makes a new one.
DurumAnlam
200The settings.
400`invalid_request`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/device-risk/site-key/rotateReplace the site key

Pages with the old key stop identifying.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Yanıt alanı (200)TipAçıklama
enabledbooleanOff by default.
retentionDaysinteger
retentionRangeobject
siteKeystring | nullPublic: the web SDK's deviceRisk.identify() sends it. Issued when Device risk is first turned on.
originsstring[]Page origins that may identify, besides pages on your organization's verified domains and their subdomains (Organization → Domains).
pagesstring[]
signalsDeviceRiskSignal[]
alertsDeviceRiskAlertsAlerts: each rule alerts at most once an hour, to the webhook (DEVICE_RISK_ALERT) and/or by email to the owners and admins of the workspace's organization.
alertRulesobject[]Each rule: id, label, unit, min, max and the default threshold.
alertDeliveryobject
verifiedDomainsarray | nullYour organization's verified domains (Organization → Domains); null when they cannot be read.
offDomainOriginsstring[]Origins on none of the verified domains: allowed, only pointed out.
firstPartyobject | nullThe workspace's verified Touchque Login custom domain, where the tag (`{scriptBase}/vX.Y.Z/device.js`, the same bytes and integrity as the CDN's) and its identify call (`data-api="{apiBase}"`) are served first-party; null without one.
proxySecretstringOwners, admins and API keys only. Your own first-party proxy (/_tq/ on your domain) sends it as `X-Touchque-Proxy-Secret` on the identify call, with the visitor's address as `X-Touchque-Client-IP`. Keep it on the server like the API key; a new site key makes a new one.
DurumAnlam
200The settings.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/device-risk/trendIdentifications, step-ups and signals per day

One point per UTC day, today last, from the daily rows the nightly job writes (kept 400 days, past the identifications' retention) and live where a day has none yet.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
daysquery30 | 90 | 36530, 90 or 365 (default 30).
Yanıt alanı (200)TipAçıklama
daysinteger
pointsobject[]
DurumAnlam
200{ days, points }.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/device-risk/visitorsList visitors

One page of an indexed query within the retention, newest first: a workspace with millions of visitors is searched and filtered, never listed whole. All the data goes out through the export, the `device_risk.*` webhooks and the organization's log stream.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
filterquery"all" | "flagged" | "marked"`flagged`: a signal in the last 7 days; `marked`: trusted or step up.
signalquerystringOnly visitors flagged with this signal code in the last 7 days (`device_tampered`, `device_many_accounts`…).
qquerystringA visitorId (`tqv_…`), a requestId (`dre_…`: its visitor), an IP address, a range in CIDR (/16 or narrower for IPv4, /48 or narrower for IPv6) or an account: the visitors of the newest 5 000 matching identifications within the retention, at most 500; past either `truncated: true`, narrow the search.
cursorquerystringThe `nextCursor` of the previous page.
limitqueryinteger1 to 100, default 25.
Yanıt alanı (200)TipAçıklama
visitorsDeviceRiskVisitor[]
nextCursorstring | null
truncatedbooleanThe search matched more visitors than one answer looks at.
signalTextsobject
DurumAnlam
200A page of visitors.
400`cidr_too_broad`: a range wider than /16 for IPv4 or /48 for IPv6.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
422`search_too_broad`: the search reads too many identifications; narrow it.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/device-risk/visitors/{visitorId}One visitor, its accounts and its latest identifications

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
visitorIdzorunlupathstringThe visitor's id (`tqv_…`).
Yanıt alanı (200)TipAçıklama
visitorDeviceRiskVisitor
DurumAnlam
200The visitor.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`: no visitor with this id in this workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/device-risk/visitors/{visitorId}Forget a visitor (it is new next time)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
visitorIdzorunlupathstringThe visitor's id (`tqv_…`).
Yanıt alanı (200)TipAçıklama
forgottenboolean
DurumAnlam
200Forgotten, here and in the risk engine's counters.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`: no visitor with this id in this workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
PUT/device-risk/visitors/{visitorId}/statusMark a visitor: trusted, step up always, or none

The risk engine reads the mark with every identification of the visitor. `trusted` keeps only the signals about the page and the report (another site, a reused identification); it never skips any other check. `step_up` asks on every sign-in from the visitor, enforced at once.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
visitorIdzorunlupathstringThe visitor's id (`tqv_…`).
Gövde alanıTipAçıklama
statuszorunlu"none" | "trusted" | "step_up"
Yanıt alanı (200)TipAçıklama
visitorDeviceRiskVisitor
DurumAnlam
200The visitor.
400`invalid_request`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`: no visitor with this id in this workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
Safe Guard
POST/safe-guard/approvalsAsk an approver's phone to approve a Safe transaction

Goes through the same pipeline as POST /login/request (freeze, push limit, risk engine, Actions, Vishing Shield, case code), always with biometrics. For a Safe registered in Safe Guard, its Touchque limits are checked first; its approvals keep working while Safe Guard is being turned off.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
externalUsernamezorunlustring
typezorunlustringAn action type you defined.
safeTxzorunluSafeTxA Safe transaction as the approver's phone will decode it. The phone gets these raw fields only, decodes them itself, reads the Safe and the guard from the chain from two built-in nodes, and signs only its own view.
referenceIdstring | null
expiresIninteger
clientIpstring | null
userAgentstring | null
DurumAnlam
200The request: requestId, challengeCode and how the server classed the transaction (class, flags, hashes, rows).
400`invalid_request` or `invalid_safe_tx`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`over_limit` (with limit, max, amount), a feature refusal, or the pipeline's own refusals (with a case code).
409`crypto_key_missing`: the phone has no crypto approval key yet.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/safe-guard/approvals/{id}A Safe approval request: its status and, once approved, the approval for the guard

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe requestId.
Yanıt alanı (200)TipAçıklama
status"PENDING" | "CONFIRMED" | "REJECTED" | "EXPIRED"
safeTxSafeGuardApprovalResultWhat the guard gets once approved.
DurumAnlam
200{ requestId, externalUsername, status, provisional, safeTx }.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/safe-guard/approversThe workspace's people and whether their phone has a crypto key

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
200{ approvers: [{ externalUsername, platform, cryptoKey, registeredAt }] }.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/safe-guard/createThe factory call that creates a new Safe, decoded

The canonical Safe v1.4.1 factory call with these owners and threshold, the rows it decodes to, the keccak256 of its data and the new Safe's address before it exists. The owner's own wallet sends it; then add the Safe with POST /safe-guard/safes. Touchque sends nothing.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
chainIdzorunluinteger
ownerszorunlustring[]
thresholdzorunluinteger
locale"tr" | "en"
DurumAnlam
200{ tx: { to, value, data }, predicted, rows, dataHash, saltNonce, contracts }.
400`invalid_request` or `invalid_safe_tx`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
422`guard_not_available`, `safe_contracts_missing` or `not_on_chain`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/safe-guard/historyApproval requests, newest first, and those refused before any phone was asked

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
safeIdquerystringOnly this Safe.
statusquery"PENDING" | "CONFIRMED" | "REJECTED" | "EXPIRED" | "REFUSED"PENDING, CONFIRMED, REJECTED, EXPIRED or REFUSED.
cursorquerystringnextCursor of the previous page.
limitqueryintegerAt most 100.
DurumAnlam
200{ approvals, refused, nextCursor }; each approval with its case code.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/safe-guard/overviewThe workspace's Safes with their chain state, and 30 days of requests

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Yanıt alanı (200)TipAçıklama
safesSafeGuardSafe[]
DurumAnlam
200{ safes, activity: { days, refused }, networks: [{ chainId, name, test, available, guard, reason }] }.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/safe-guard/safesAdd a Safe to Safe Guard

Nothing changes on chain. The Safe must be readable on its network. The guard is always Touchque's own contract on that network (GET /safe-guard/overview `networks`); until the contract is audited, only test networks are available in production.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
chainIdzorunluinteger
safezorunlustring
guardstringOptional; if given, it must be Touchque's guard on this network (`guard_mismatch` otherwise).
namezorunlustring
Yanıt alanı (201)TipAçıklama
safeSafeGuardSafe
DurumAnlam
201{ safe }.
400`invalid_request` or `invalid_safe_tx`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
409`exists` or `too_many`.
422`not_on_chain`, or `guard_not_available` (no Touchque guard on this network yet, or not before the audit).
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/safe-guard/safes/{id}One Safe: chain state, approvers matched to people, changes waiting on chain

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe Safe's id in Safe Guard.
freshquery"1"1: read the chain now, not the 30-second cache.
DurumAnlam
200{ safe, chain, changes, exit, pending, policy }: changes are the governance changes the phones were asked about, each with its stage (collecting, ready_to_schedule, waiting, ready_to_run), its approvals and the guard call to send next (scheduleTx, vetoTx); exit is the emergency exit the owners requested ({ at, pending, cancels, cancelTx }) or null; alerts are what the chain watcher saw on this Safe, newest first ({ id, kind, severity, details, phonesAsked, createdAt }: exit_requested, exit_cancelled, change_scheduled, change_vetoed, guard_removed, module_enabled, owners_changed, unknown_transaction).
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`: no such Safe in this workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
PATCH/safe-guard/safes/{id}Rename a Safe or set its Touchque limits

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe Safe's id in Safe Guard.
Gövde alanıTipAçıklama
namestring
policySafeGuardPolicyTouchque's limits on top of the guard, checked before any phone is asked (`over_limit`). The guard does not know them.
DurumAnlam
200{ safe }.
400`invalid_request` or `invalid_safe_tx`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`: no such Safe in this workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/safe-guard/safes/{id}Take a Safe out of Safe Guard

Only once its guard is off the Safe: while it is on, its approvals need this Safe here.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe Safe's id in Safe Guard.
DurumAnlam
204Removed.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`: no such Safe in this workspace.
409`guard_installed`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/safe-guard/safes/{id}/cancel-exitAsk an approver's phone to cancel the emergency exit the owners requested

The phone reads the requested exit from the chain and signs its cancel (purpose 4, subject the exit time). Once it has, GET /safe-guard/safes/{id} gives the `exit.cancelTx` (guard.cancelExit) that anyone may send with any wallet.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe Safe's id in Safe Guard.
Gövde alanıTipAçıklama
externalUsernamezorunlustring
DurumAnlam
200As POST /safe-guard/approvals.
400`invalid_request` or `invalid_safe_tx`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`: no such Safe in this workspace.
409`no_pending_exit`, `crypto_key_missing` or `not_an_approver`.
422`not_on_chain`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/safe-guard/safes/{id}/changeThe Safe transaction of a setup step or a change, and how the guard classes it

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe Safe's id in Safe Guard.
Gövde alanıTipAçıklama
kindzorunlu"setup" | "install" | "remove_guard" | "add_recipient" | "remove_recipient" | "lock" | "thresholds" | "delays" | "add_approver" | "remove_approver" | "test"
argsobject
locale"tr" | "en"
DurumAnlam
200{ tx, class, flags, rows, safeTxHash, governanceHash, domainHash, messageHash, needsPhones }.
400`invalid_request` or `invalid_safe_tx`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`: no such Safe in this workspace.
422`not_on_chain`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/safe-guard/safes/{id}/proposalsThe Safe's latest proposals

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe Safe's id in Safe Guard.
DurumAnlam
200{ proposals }.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`: no such Safe in this workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/safe-guard/safes/{id}/proposalsThe guard's install as one Safe transaction the owners sign off chain

The guard's setup (its batch target the canonical MultiSendCallOnly), the address book, the lock and setGuard in one delegatecall to MultiSendCallOnly, at the Safe's current nonce. The answer has the Safe's EIP-712 typed data for the owners' wallets (eth_signTypedData_v4) and the hashes a hardware wallet shows.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe Safe's id in Safe Guard.
Gövde alanıTipAçıklama
kindzorunlu"install"
argszorunluobject{ approvers: [crypto keys], threshold, govThreshold, govDelay, exitDelay, book?: [{ address, label }], lock? }
DurumAnlam
201{ proposal }: { id, kind, tx, safeTxHash, domainHash, messageHash, rows, args, calls, typedData, owners, need, signatures, done, stale, execTx, shown }.
400`invalid_request` or `invalid_safe_tx`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`: no such Safe in this workspace.
409`guard_installed` or `has_modules`.
422`not_on_chain`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/safe-guard/safes/{id}/proposals/{pid}One proposal, with the owners who signed and, once enough have, the execTransaction call

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe Safe's id in Safe Guard.
pidzorunlupathstringThe proposal's id.
DurumAnlam
200{ proposal }.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`: no such Safe in this workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/safe-guard/safes/{id}/proposals/{pid}/showShow the proposal on a person's phone, decoded there

The phone decodes the same Safe transaction on its own and shows it with the hashes a hardware wallet shows, for an owner to compare before signing. It approves nothing: the phone signs purpose 16 (preview), which the guard never accepts. The proposal's `shown` says what each phone answered (same, different, waiting, expired).

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe Safe's id in Safe Guard.
pidzorunlupathstringThe proposal's id.
Gövde alanıTipAçıklama
externalUsernamezorunlustring
DurumAnlam
200As POST /safe-guard/approvals.
400`invalid_request` or `invalid_safe_tx`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`: no such Safe in this workspace.
409`crypto_key_missing`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/safe-guard/safes/{id}/proposals/{pid}/signaturesAdd an owner's signature of the proposal

The owner's eth_signTypedData_v4 signature of `typedData`. Kept only when it recovers to a current owner and the Safe's nonce has not moved; the same owner signing again replaces theirs.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe Safe's id in Safe Guard.
pidzorunlupathstringThe proposal's id.
Gövde alanıTipAçıklama
signaturezorunlustring
DurumAnlam
200{ proposal }.
400`bad_signature`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`: no such Safe in this workspace.
409`not_an_owner` or `stale`.
422`not_on_chain`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/safe-guard/safes/{id}/sendAsk an approver's phone to approve a setup step or a change

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe Safe's id in Safe Guard.
Gövde alanıTipAçıklama
kindzorunlu"setup" | "install" | "remove_guard" | "add_recipient" | "remove_recipient" | "lock" | "thresholds" | "delays" | "add_approver" | "remove_approver" | "test"
argsobject
externalUsernamezorunlustring
locale"tr" | "en"
DurumAnlam
200As POST /safe-guard/approvals.
400`invalid_request` or `invalid_safe_tx`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`: no such Safe in this workspace.
409`guard_not_installed`, `crypto_key_missing` or `not_an_approver`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/safe-guard/safes/{id}/vetoAsk an approver's phone to stop a change waiting on chain

The phone decodes the waiting change again and signs a veto (purpose 3). Once it has, GET /safe-guard/safes/{id} gives the `vetoTx` (guard.veto) that anyone may send with any wallet.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe Safe's id in Safe Guard.
Gövde alanıTipAçıklama
governanceHashzorunlustring
externalUsernamezorunlustring
DurumAnlam
200As POST /safe-guard/approvals.
400`invalid_request` or `invalid_safe_tx`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`: no such Safe in this workspace.
409`not_waiting`, `crypto_key_missing` or `not_an_approver`.
422`not_on_chain`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
WebAuthn
GET/webauthn/authenticate/primary/availabilityIs passkey sign-in on

Whether passwordless passkey sign-in is on for the workspace, so a sign-in page shows its passkey button and passkey autofill only when it works (otherwise `POST /webauthn/authenticate/primary/options` answers 403 `passwordless_login_disabled`). Read-only.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Yanıt alanı (200)TipAçıklama
enabledbooleanPasskey sign-in (`TenantPolicy.passwordlessLoginEnabled`) is on: show the passkey button and passkey autofill. Off: show neither.
userVerification"required" | "preferred" | nullWhat the options will ask of the authenticator; null when off.
DurumAnlam
200Whether passkey sign-in is on.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/webauthn/authenticate/primary/optionsStart passwordless passkey sign-in

Passwordless sign-in (no password, no phone). Requires `TenantPolicy.passwordlessLoginEnabled`. User verification is required only when `passwordlessRequireUserVerification` is on. With `externalUsername` the options list that user's passkeys (404 when there are none). Without it they accept any discoverable passkey of the site (empty `allowCredentials`), for passkey autofill (WebAuthn conditional mediation): the passkey the user picks names the account, and its `userHandle` must match the one it was registered with.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
externalUsernamestringThe account to sign in. Leave it out for passkey autofill: any passkey of the site.
Yanıt alanı (200)TipAçıklama
attemptIdstringPass back to `/webauthn/authenticate/primary/verify` (valid 5 minutes, single use).
optionsPublicKeyCredentialRequestOptionsJSONWebAuthn authentication options as produced by `@simplewebauthn/server` `generateAuthenticationOptions` (pass to `navigator.credentials.get`).
DurumAnlam
200Attempt id and authentication options.
400`externalUsername must be a string`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`passwordless_login_disabled`. Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
404`no_passkey_registered` (only with `externalUsername`) — fall back to your password sign-in.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/webauthn/authenticate/primary/verifyFinish passwordless passkey sign-in

Verifies the assertion, then runs the risk engine and the workspace's country and access rules on the end user's `clientIp`. Success records a CONFIRMED login request (`confirmedVia: WEBAUTHN_PRIMARY`) and fires the SUCCESS webhook. If the engine answers CHALLENGE or asks for number matching (also when it is unreachable), an access rule requires step-up, the access policy cannot be read, or the country cannot be verified under a country rule, answers 200 with `requiresStepUp: true` — continue with `POST /login/request`. `alwaysRequireChallenge` does not step up a passkey. The attempt id is single-use even when verification fails.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
attemptIdzorunlustring
responsezorunluWebAuthnCredentialResponseJSONThe browser's `PublicKeyCredential` serialised to JSON (`RegistrationResponseJSON` / `AuthenticationResponseJSON` from `@simplewebauthn/browser`), relayed unchanged by your backend.
DurumAnlam
200Signed in, or step-up required.
400Missing fields, `Login session not found or expired`, `Verification failed` (+`message`), `Login could not be verified`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`passwordless_login_disabled`, `Login blocked by access policy` (+`ruleName`), `{ code: 'blocked', reason: 'geo_policy' }` (a country rule, +`countryCode`) or `{ code: 'blocked', reason: 'risk' }` (the risk engine). Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
404`This credential is not registered for this user`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/webauthn/credentialsList a user's passkeys

Labels and metadata only, no key material. Lists credentials of every relying party of the workspace.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
externalUsernamezorunluquerystringThe user.
Yanıt alanı (200)TipAçıklama
credentialsWebAuthnCredentialSummary[]
DurumAnlam
200Credentials.
400`externalUsername query parameter is required`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/webauthn/credentials/{id}Remove a passkey

A removed passkey sends the `PASSKEY_DELETED` event webhook.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringCredential record `id` from `GET /webauthn/credentials` (not the WebAuthn `credentialId`).
externalUsernamezorunluquerystringThe user the passkey belongs to. Required since 3.3.0: a credential of another user is `404`.
Yanıt alanı (200)TipAçıklama
deletedboolean
DurumAnlam
200Deleted.
400`externalUsername is required`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`Integration not found`. Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
404`Credential not found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/webauthn/login/optionsStart passkey approval of a pending request

Authentication options scoped to one PENDING login request (e.g. one created with `requiresPasskey: true`). Valid for 5 minutes.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
requestIdzorunlustringA PENDING login request of this workspace.
Yanıt alanı (200)TipAçıklama
challengestringbase64url
rpIdstring
allowCredentialsobject[]
userVerification"required" | "preferred"
timeoutinteger
DurumAnlam
200Authentication options.
400Missing or invalid request field.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`No PENDING login request found` or `No WebAuthn credential registered for this user`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/webauthn/login/verifyApprove a pending request with a passkey

Verifies the assertion and confirms the request (`confirmedVia: WEBAUTHN`, phishing-resistant), then fires the SUCCESS webhook. The request's `expiresAt` is not checked — a request still in status PENDING can be approved.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
requestIdzorunlustring
responsezorunluWebAuthnCredentialResponseJSONThe browser's `PublicKeyCredential` serialised to JSON (`RegistrationResponseJSON` / `AuthenticationResponseJSON` from `@simplewebauthn/browser`), relayed unchanged by your backend.
Yanıt alanı (200)TipAçıklama
successboolean
messagestring
externalUsernamestringThe user that was approved — open the session for this user, never for a name the browser sent.
requestIdstring
DurumAnlam
200Request approved.
400Missing fields, `Login session not found or expired`, `Verification failed` (+`message`), `Login could not be verified`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`No PENDING login request found` or `This credential is not registered for this user`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/webauthn/register/optionsStart passkey registration

Returns registration options for the browser. Your backend relays the ceremony: browser → your backend → Touchque (signed). The challenge is valid for 5 minutes. Uses the workspace's own relying party (domain) when configured. A user with a linked phone first approves a `PASSKEY_ENROLL` request: a passkey approves requests on its own, so a stolen session must not be able to add one.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
externalUsernamezorunlustring
discoverablebooleanRegister a resident (discoverable) credential with a stable WebAuthn user handle — needed for passwordless sign-in.
approvalRequestIdstringRequired when the user has a linked phone: the id of a `PASSKEY_ENROLL` request (`POST /login/request`, type `PASSKEY_ENROLL`, reserved and always critical) that the user approved on the phone or with an existing passkey, at most 10 minutes ago. Each approval unlocks one registration.
Yanıt alanı (200)TipAçıklama
challengestringbase64url
rpobject
userobject
pubKeyCredParamsobject[]
timeoutinteger
excludeCredentialsobject[]
authenticatorSelectionobject
attestation"none" | "direct"`direct` only when `TenantPolicy.requireVerifiedAuthenticator` is on.
DurumAnlam
200Registration options.
400Missing or invalid request field.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`enrollment_approval_required` (no `approvalRequestId`), `enrollment_approval_invalid` (unknown, not approved, another user or action, or older than 10 minutes) or `enrollment_approval_used`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/webauthn/register/verifyFinish passkey registration

Verifies the browser's attestation and stores the credential. When `TenantPolicy.requireVerifiedAuthenticator` is on, the authenticator must be listed in the FIDO Metadata Service. A stored passkey sends the `PASSKEY_REGISTERED` event webhook.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
externalUsernamezorunlustring
responsezorunluWebAuthnCredentialResponseJSONThe browser's `PublicKeyCredential` serialised to JSON (`RegistrationResponseJSON` / `AuthenticationResponseJSON` from `@simplewebauthn/browser`), relayed unchanged by your backend.
labelstringDisplay name for the credential. Everything outside printable ASCII and the characters `<` `>` is removed, then it is trimmed and cut to 64 characters; defaults to a name derived from the authenticator.
Yanıt alanı (200)TipAçıklama
verifiedboolean
credentialIdstringbase64url WebAuthn credential id.
DurumAnlam
200Credential registered.
400Missing fields, `Registration session not found or expired`, `Verification failed` (+`message`), `Registration could not be verified`, or `unverified_authenticator`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
Action Types
GET/action-typesList action types

All action types of the workspace, including disabled ones.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
200Action types.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`Integration not found`. Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500`internal_error`.
POST/action-typesCreate or update an action type

Idempotent upsert by `type` — safe to call on every start-up. Never re-enables a type an admin disabled in the Dashboard; `description` and `critical` change only when sent.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
typezorunlustring
namezorunlustring
descriptionstringOnly updated when sent.
criticalbooleanOnly updated when sent; defaults to false on create.
secondThoughtobject | nullOnly updated when sent; null turns them off. Second Thought questions the phone asks before Approve (see ActionType.secondThought).
Yanıt alanı (200)TipAçıklama
idstring
integrationIdstring
typestringSlug used as `type` in `POST /login/request`.
namestringDisplay name on the approval screen.
descriptionstring | null
iconstring | null
criticalbooleanCritical actions always use number matching, refuse recovery codes (unless `TenantPolicy.allowRecoveryForCritical`) and are refused by the offline TOTP fallback.
activebooleanDisabled types (Dashboard) answer 403 `action_disabled`.
secondThoughtobject | nullSecond Thought: at most two short yes/no questions the phone asks before Approve, from a fixed list (`someone_guiding`, `safe_account`, `remote_access`, `asked_for_code`, `support_call`, `met_online`, `promised_return`, `know_recipient`, `sim_in_hand`), in `locale` (tr or en). A risky answer, no answer (an app that does not know the questions yet) or answers whose signature does not verify make the approval provisional, as an approval during a call is: `provisional: true` on the result, the user's critical actions wait, and the phone asks "Was this you?" later (`APPROVAL_RECONFIRMED` / `APPROVAL_REVOKED`). Hold the action until it is reconfirmed. `null` turns it off.
createdAtstring
updatedAtstring
DurumAnlam
200The stored action type.
400`invalid_request`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`Integration not found`. Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500`internal_error`.
Actions
GET/actionsList Actions

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Yanıt alanı (200)TipAçıklama
actionsAction[]
DurumAnlam
200Actions.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/actions/dry-runReplay a draft against recent real decisions

How many recent decisions the draft would have changed and in which direction, how many notifications it would have sent, how often it fails and how long it takes. Nothing is sent; `api.fetch` is off; asked-for capabilities are assumed approved.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
triggerActionTriggerWhere in the pipeline the Action runs. `login.request` and `risk.check` run inside the request and can change its decision; the others run after the fact and can only notify, call allowed hosts and freeze the user.
codestring
templateActionTemplateRef
slugstring
replacesstring
secretsstring[]
allowedHostsstring[]
capabilitiesActionCapability[]
onFailure"continue" | "step_up" | "deny"
limitinteger
sincestring
Yanıt alanı (200)TipAçıklama
triggerActionTriggerWhere in the pipeline the Action runs. `login.request` and `risk.check` run inside the request and can change its decision; the others run after the fact and can only notify, call allowed hosts and freeze the user.
evaluatedinteger
fromstring | null
tostring | null
matchedintegerEvents where the draft made a decision call or a notification.
changedinteger | nullPre triggers: decisions that would have come out differently.
transitionsobject | nulle.g. `{ "push→number_match": 12, "push→deny": 1 }`.
notificationsobjectWould-be notifications by type (not sent).
errorsinteger
timeoutsinteger
errorSamplesobject[]
p50Msinteger
p95Msinteger
samplesobject[]
assumedCapabilitiesActionCapability[]
DurumAnlam
200The report.
400`invalid_request`, `invalid_template`, `action_invalid`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429`rate_limited` (30 runs per 10 minutes) or `dry_run_running` (one dry run per workspace at a time).
500Unexpected server error.
GET/actions/eventsRecorded events

The events triggers fired with (and, for pre triggers, what was decided), newest first, kept 30 days. Use an `id` with the test runner.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
triggerqueryActionTriggerOnly this trigger.
limitqueryinteger1-100 (default 20).
Yanıt alanı (200)TipAçıklama
eventsobject[]
DurumAnlam
200Events.
400`invalid_request`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/actions/secretsList secret names

Names only: a value is never returned once set.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Yanıt alanı (200)TipAçıklama
secretsActionSecret[]
DurumAnlam
200Secret names.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
PUT/actions/secrets/{name}Set a secret

Encrypted at rest (AES-256-GCM, bound to the workspace and the name). Only versions that declare the name can read it. At most 100 secrets of 4 KB.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
namezorunlupathstringSecret name.
Gövde alanıTipAçıklama
valuezorunlustring
Yanıt alanı (200)TipAçıklama
namestring
createdAtstring
updatedAtstring
DurumAnlam
200Changed.
201Added.
400`invalid_request`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
409`too_many_secrets`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/actions/secrets/{name}Delete a secret

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
namezorunlupathstringSecret name.
Yanıt alanı (200)TipAçıklama
deletedboolean
DurumAnlam
200Deleted.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`secret_not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/actions/templatesNo-code templates

Templates for the common Actions (alerts; block, step up or require a passkey by country, local time, role, amount, action or risk; always ask the phone when). A template renders to plain code you can edit.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Yanıt alanı (200)TipAçıklama
templatesobject[]
DurumAnlam
200Templates.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/actions/templates/{id}/renderPreview a template as code

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringTemplate id.
Gövde alanıTipAçıklama
triggerzorunluActionTriggerWhere in the pipeline the Action runs. `login.request` and `risk.check` run inside the request and can change its decision; the others run after the fact and can only notify, call allowed hosts and freeze the user.
paramsobject
Yanıt alanı (200)TipAçıklama
codestring
secretsstring[]
allowedHostsstring[]
capabilitiesActionCapability[]
DurumAnlam
200The code and what it needs.
400`invalid_request`, `invalid_template`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/actions/testRun an Action once (test runner)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
triggerActionTriggerWhere in the pipeline the Action runs. `login.request` and `risk.check` run inside the request and can change its decision; the others run after the fact and can only notify, call allowed hosts and freeze the user.
codestring
templateActionTemplateRef
slugstring
secretsstring[]
allowedHostsstring[]
capabilitiesActionCapability[]
eventIdstring
eventobject
networkboolean
Yanıt alanı (200)TipAçıklama
outcome"ok" | "error" | "timeout"
errorstring | null
durationMsinteger
cpuMsnumber
callsActionCall[]
notificationsobject[]
logsActionLogLine[]
reasonsRiskReason[]
wouldBeobject | nullFor a recorded pre-trigger event: the decision with this Action alone (`verdict`: deny, passkey, number_match, push; or prompt, silent).
eventIdstring | null
eventobject
assumedCapabilitiesActionCapability[]
notestring
DurumAnlam
200What the run did.
400`invalid_request`, `invalid_template`, `action_invalid` (does not compile).
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`event_not_found`, `action_not_found`.
429`rate_limited` (120 runs per 10 minutes).
500Unexpected server error.
GET/actions/triggersTriggers, decisions, capabilities and limits

Every trigger with the decisions its Actions can make, the loosening capabilities, the notification types and a sample event.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Yanıt alanı (200)TipAçıklama
triggersobject[]
capabilitiesobject[]
limitsobject
DurumAnlam
200The catalogue.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/actions/{slug}An Action, its code and versions

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
slugzorunlupathstringThe Action's slug.
Yanıt alanı (200)TipAçıklama
actionAction
codestring | nullThe active version's code (or the latest one).
versionsActionVersion[]
DurumAnlam
200The Action.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`action_not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
PUT/actions/{slug}Deploy an Action (create or new version)

Creates the Action or adds a version and makes it live at once (instant rollback with `POST /actions/{slug}/rollback`). The same code and settings again change nothing.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
slugzorunlupathstringThe Action's slug.
Gövde alanıTipAçıklama
triggerActionTriggerWhere in the pipeline the Action runs. `login.request` and `risk.check` run inside the request and can change its decision; the others run after the fact and can only notify, call allowed hosts and freeze the user.
namestring
codestringJavaScript exporting `onExecute`: `exports.onExecute = async (event, api) => { ... }`. Runs in a sandbox (QuickJS in WebAssembly): 50 ms CPU, 16 MB, no filesystem, network only through `api.fetch` to `allowedHosts`.
templateActionTemplateRef
secretsstring[]Names of secrets this version may read (`event.secrets.NAME`) or use in notifications.
allowedHostsstring[]The only hosts `api.fetch` and webhook notifications may reach (`*.example.com` allowed).
capabilitiesActionCapability[]
onFailure"continue" | "step_up" | "deny"Pre triggers only: what an error or timeout of this Action means. `continue` never blocks a sign-in.
orderinteger
enabledboolean
activateboolean`false` saves the version without making it live.
Yanıt alanı (200)TipAçıklama
actionAction
versionActionVersion
deployedbooleanThis version is the one running now.
approvalobject | null
warningsstring[]E.g. a decision call the trigger does not offer, a capability not asked for, a secret not set yet.
DurumAnlam
200A new or unchanged version of an existing Action.
201Created.
400`invalid_request`, `invalid_template`, `action_invalid` (does not compile or export onExecute).
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
409`trigger_mismatch`, `too_many_actions`, `too_many_versions` (200 per Action).
429`rate_limited` (60 deploys per 10 minutes).
500Unexpected server error.
PATCH/actions/{slug}Rename, turn on or off, reorder, change onFailure

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
slugzorunlupathstringThe Action's slug.
Gövde alanıTipAçıklama
namestring
enabledboolean
orderinteger
onFailure"continue" | "step_up" | "deny"
Yanıt alanı (200)TipAçıklama
actionAction
DurumAnlam
200Updated.
400`invalid_request`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`action_not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/actions/{slug}Delete an Action and its versions

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
slugzorunlupathstringThe Action's slug.
Yanıt alanı (200)TipAçıklama
deletedboolean
DurumAnlam
200Deleted.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`action_not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/actions/{slug}/logsRuns of an Action

Every live run: decision, notifications and their delivery, console output, error, duration. Newest first, kept 30 days.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
slugzorunlupathstringThe Action's slug.
limitqueryinteger1-200 (default 50).
beforequerystringRuns before this time (paging).
Yanıt alanı (200)TipAçıklama
logsobject[]
DurumAnlam
200Runs.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`action_not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/actions/{slug}/metricsMetrics of an Action

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
slugzorunlupathstringThe Action's slug.
windowquery"1h" | "24h" | "7d" | "30d"1h, 24h (default), 7d or 30d.
Yanıt alanı (200)TipAçıklama
window"1h" | "24h" | "7d" | "30d"
runsinteger
errorsinteger
timeoutsinteger
errorRatenumber
p50Msinteger
p95Msinteger
decisionsobject
notificationsobject
DurumAnlam
200Metrics.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`action_not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/actions/{slug}/rollbackRoll back to an earlier version

Without `version`: the newest runnable version before the active one. Takes effect at once.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
slugzorunlupathstringThe Action's slug.
Gövde alanıTipAçıklama
versioninteger
Yanıt alanı (200)TipAçıklama
actionAction
versionActionVersion
DurumAnlam
200Rolled back.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`action_not_found`, `version_not_found`.
409`nothing_to_roll_back_to`, `version_not_runnable` (waiting for approval).
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/actions/{slug}/versions/{number}One version with its code

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
slugzorunlupathstringThe Action's slug.
numberzorunlupathintegerVersion number.
Yanıt alanı (200)TipAçıklama
numberinteger
status"ready" | "pending_approval" | "rejected"
activeboolean
capabilitiesActionCapability[]
approvedCapabilitiesActionCapability[]
allowedHostsstring[]
secretsstring[]
templateActionTemplateRef | null
codeHashstring
codestring`GET /actions/{slug}/versions/{number}` only.
createdAtstring
createdBystring | null
approvedAtstring | null
DurumAnlam
200The version.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`action_not_found`, `version_not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
Agents
GET/agentsThe workspace's agents and its kill switch

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
statusquery"active" | "suspended" | "revoked"Only agents in this status.
Yanıt alanı (200)TipAçıklama
agentsAgent[]
killSwitchAgentKillSwitch
DurumAnlam
200Agents.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/agentsRegister an AI agent

An agent is a key, not a name: generate a key pair where the agent runs (the SDKs have a helper) and register only the public key. The agent then authenticates itself (`POST /agents/token`); it never holds your `tq_` key. Needs the `agents:write` scope. At most 200 agents per workspace.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
namezorunlustring
descriptionstringWhat the agent is for.
ownerEmailstringThe accountable person: a member of the workspace's organization. Default: the creator of the API key. When the owner leaves, the agent is suspended (`owner_left`).
platform"langchain" | "llamaindex" | "openai-agents" | "claude-agent-sdk" | "vercel-ai" | "mcp" | "custom"
allowedTypeszorunlustring[]Active action types of the workspace.
publicKeyPublicJwkAn agent's public key: EC P-256 (ES256) or OKP Ed25519 (EdDSA). Never send `d`: the private key stays with the agent. Without `kid`, the RFC 7638 thumbprint becomes the kid.
publicKeysPublicJwk[]
reviewInDaysintegerDefault 90.
Yanıt alanı (201)TipAçıklama
agentAgentAn AI agent of the workspace. `blocked` says what stops it right now (null when it may act): `workspace_paused` (kill switch), `suspended`, `revoked`, `review_overdue`.
DurumAnlam
201Created.
400`invalid_request`, `invalid_key`, `unknown_type`, `invalid_owner`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
409`agent_limit`; `name_too_similar` (with `similarTo`): the name reads like another agent's of the workspace (look-alike letters, 0/O, 1/l, case, spaces), and the phone shows the agent's name first.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/agents/approval-audienceThe audience of this workspace's approval tokens

The `aud` (`touchque:workspace:<id>`) every approval token issued for this workspace carries. The SDKs' offline check (`verifyApprovalToken`) fetches it once and refuses a token without it or with another workspace's, since `GET /agents/jwks.json` is one key set for every workspace.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Yanıt alanı (200)TipAçıklama
audiencestring
DurumAnlam
200The audience.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/agents/approvalsThe agent asks a person to approve on their phone (agent token)

Goes through the same pipeline as POST /login/request (freeze, push limit, risk engine, Actions, Vishing Shield, case code). The phone shows rows Touchque drew from `authorizationDetails` (the agent first, its reason marked unverified) and needs Face ID or the hardware key. At most 60 requests per agent and 5 per agent and person in 10 minutes. The risk engine also checks the agent against its own history (a burst of requests, an unusual amount, a new network, an unusual hour, a recipient new to this person): a step-up, which asks the person for the number. Every refusal carries a `caseCode` ("Why?").

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
externalUsernamezorunlustringThe person the agent acts for (their phone approves).
typezorunlustringOne of the agent's allowed action types.
authorizationDetailszorunluAuthorizationDetail[]
reasonstringThe agent's own words, shown on the phone as unverified.
presence"interactive" | "background"interactive (default): a person is in the agent's conversation and types the number shown there on the phone. background: no number; never for a critical action.
expiresInintegerSeconds the phone may approve it (default 300).
locale"tr" | "en"Language of the rows Touchque draws (default tr).
referenceIdstring
clientIpstringThe person's own address, when the agent's app knows it.
userAgentstring
mandateIdstringApprove within this active mandate (no push): same person and type, payments/purchases in its currency, within its count, total, per-request amount and recipients.
Yanıt alanı (201)TipAçıklama
approvalIdstring
status"pending" | "approved"
secondApproverstring
mandateMandateA bounded standing permission the person approved once on the phone. Requests within it (POST /agents/approvals with mandateId) are approved without a push.
presencestring
challengeCodestring
expiresAtstring
reasonsobject[]
caseCodestring
DurumAnlam
201Sent to the phone (or, within a mandate, approved at once: status approved and the mandate).
400`invalid_request`, `invalid_authorization_details`, `unknown_action`; `suspicious_content` (with `markers`: `instruction`, `data_url`): the agent's text carries an instruction to the model or a link built to carry data out, so whatever the agent read told it to ask; nothing reaches the phone.
401`invalid_token`, `invalid_dpop_proof`.
403`type_not_allowed`, `background_not_allowed`, `passkey_only_type`, `passkey_required`, `no_second_approver`, `four_eyes_required`, `mandate_mismatch`, `mandate_exceeded` (per request), `blocked_by_person`, `amount_over_limit`, `daily_amount_over_limit`, `recipient_not_allowed`, `new_recipient`, `agent_blocked`, `insufficient_scope`, and the refusals of POST /login/request (`blocked`, …).
404`device_not_linked`.
409`interactive_required`: the checks asked for number matching and the agent asked in the background, where nobody reads the number; ask again with presence interactive. Within a mandate: `mandate_pending`, `mandate_expired`, `mandate_revoked`, `mandate_exhausted`, `mandate_exceeded` (no room left).
423`frozen`.
429`rate_limited` (the agent's policy), `loop_detected` (the same request to the same person three times in 10 minutes).
POST/agents/approvals/redeemUse an agent's approval exactly once, before doing the thing

Your server calls this with the token the agent hands it, right before executing. Touchque checks its signature, workspace and expiry and that the approval is still usable, marks it used and answers what the person approved. Compare `authorizationDetails` with what you are about to execute (the SDKs do it with `expect`).

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
tokenzorunlustring
Yanıt alanı (200)TipAçıklama
approvalobject
DurumAnlam
200The approval, now used.
400`invalid_request`.
401`invalid_token` (not signed by Touchque, another workspace, unknown), `token_expired`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
409`already_redeemed`, or the approval's state (`provisional`, `revoked`, `stale`…).
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/agents/approvals/{approvalId}Where the agent's request is; the approval token once approved (agent token)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
approvalIdzorunlupathstringFrom POST /agents/approvals.
Yanıt alanı (200)TipAçıklama
approvalIdstring
status"pending" | "awaiting_second" | "approved" | "rejected" | "blocked" | "expired" | "provisional" | "revoked" | "stale" | "redeemed"awaiting_second: four eyes, the second person has not answered yet (secondChallengeCode, when their type needs a number). provisional: approved during a phone call (Vishing Shield), no token until the phone confirms it after the call. stale: approved more than 15 minutes ago; ask again. reason second_rejected: the second person said no. blocked with reason inhuman_approval: the number came back sooner than a person can read and type it (something drives the phone); no token.
secondApproverstring
secondChallengeCodestring
mandateIdstring
presencestring
challengeCodestringWhile pending and interactive: show it in the conversation.
expiresAtstring
caseCodestring
reasonstring
approvalTokenstringWhen approved: a JWS (ES256, typ touchque-approval+jwt, keys at GET /agents/jwks.json) with iss, aud touchque:workspace:<id>, sub (the person), act.sub (the agent), authorization_details, txn, jti, exp (5 minutes), cnf.jkt (the agent's DPoP key), amr, number_matched, details (the rows the phone showed) and proof (the phone's hardware signature over them).
tokenExpiresIninteger
DurumAnlam
200The state.
401`invalid_token`, `invalid_dpop_proof`.
403`agent_blocked`, `insufficient_scope`.
404`approval_not_found` (also another agent's request).
GET/agents/eventsThe workspace's agent events, for a SIEM

Oldest first. Page with `after` (a cursor this API gave); start with `since` (a date) or from the beginning.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
limitqueryintegerHow many events (1 to the page maximum).
afterquerystringThe cursor of the last page.
sincequerystringStart at this time (ISO 8601) when there is no cursor.
DurumAnlam
200Events and the next cursor.
400`invalid_request` or `invalid_cursor`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/agents/jwks.jsonThe keys approval tokens are signed with

For servers that verify approval tokens themselves. Redeeming still makes a token single-use.

Kimlik: Herkese açık

Yanıt alanı (200)TipAçıklama
keysobject[]
DurumAnlam
200JWKS.
PUT/agents/kill-switchStop (or restart) every agent of the workspace at once

While engaged, every agent call and token request is refused (`workspace_paused`), including tokens issued before.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
engagedzorunluboolean
reasonstring
Yanıt alanı (200)TipAçıklama
killSwitchAgentKillSwitch
DurumAnlam
200The kill switch.
400`invalid_request`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/agents/mandatesThe agent asks for a mandate: one approval for a bounded series of requests (agent token)

The phone shows what the mandate allows (type, how many, total, per request, recipients, until when) with number matching. Requests that would need four eyes cannot have a mandate.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
externalUsernamezorunlustring
typezorunlustring
maxCountzorunluinteger
maxTotalzorunluobject
perRequeststringThe most one request may move, in the same currency.
recipientsstring[]IBANs or account numbers it may pay; none = any (still subject to the agent's policy).
validForintegerSeconds (default 86400).
reasonstring
presence"interactive"A mandate is always approved with the person in the conversation.
expiresInintegerSeconds the phone may approve it (default 300).
locale"tr" | "en"
Yanıt alanı (201)TipAçıklama
mandateIdstring
status"pending" | "active" | "rejected" | "expired" | "provisional" | "revoked" | "exhausted"
externalUsernamestring
typestring
maxCountinteger
usedCountinteger
maxTotalobject
usedobject
perRequestobject
recipientsstring[]iban:… / account:… identifiers; empty = any.
validUntilstring
challengeCodestringWhile pending: show it in the conversation.
approvalExpiresAtstring
revokedAtstring | null
DurumAnlam
201Sent to the phone.
400`invalid_authorization_details`, `invalid_request`, `unknown_action`, `suspicious_content`.
403`type_not_allowed`, `background_not_allowed`, `four_eyes_required`, `blocked_by_person`, `amount_over_limit`, `recipient_not_allowed`, `passkey_only_type`, and the refusals of POST /login/request.
GET/agents/mandates/{mandateId}A mandate's state and what is left (agent token)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
mandateIdzorunlupathstringThe mandate.
Yanıt alanı (200)TipAçıklama
mandateIdstring
status"pending" | "active" | "rejected" | "expired" | "provisional" | "revoked" | "exhausted"
externalUsernamestring
typestring
maxCountinteger
usedCountinteger
maxTotalobject
usedobject
perRequestobject
recipientsstring[]iban:… / account:… identifiers; empty = any.
validUntilstring
challengeCodestringWhile pending: show it in the conversation.
approvalExpiresAtstring
revokedAtstring | null
DurumAnlam
200The mandate.
404`mandate_not_found`.
POST/agents/mandates/{mandateId}/revokeThe agent gives up its mandate (agent token)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
mandateIdzorunlupathstringThe mandate.
Yanıt alanı (200)TipAçıklama
mandateIdstring
status"pending" | "active" | "rejected" | "expired" | "provisional" | "revoked" | "exhausted"
externalUsernamestring
typestring
maxCountinteger
usedCountinteger
maxTotalobject
usedobject
perRequestobject
recipientsstring[]iban:… / account:… identifiers; empty = any.
validUntilstring
challengeCodestringWhile pending: show it in the conversation.
approvalExpiresAtstring
revokedAtstring | null
DurumAnlam
200Revoked.
404`mandate_not_found`.
GET/agents/meThe agent as it sees itself (agent token)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Yanıt alanı (200)TipAçıklama
agentobject
workspaceobject
scopestring
DurumAnlam
200The agent.
401`invalid_token`, `invalid_dpop_proof` (with a `WWW-Authenticate: DPoP` header).
403`agent_blocked` (with `reason`), `insufficient_scope`.
POST/agents/tokenAn agent gets its own token (client credentials, private_key_jwt, DPoP)

Called by the agent, not by your server. Form-encoded (or JSON):

Kimlik: Herkese açık

Yanıt alanı (200)TipAçıklama
access_tokenstring`tqat_…`, opaque.
token_typestring
expires_ininteger
scopestringSpace separated: `agent:read`, `approvals:request`, `approvals:read`, `vault:read`.
DurumAnlam
200A DPoP-bound token.
400`invalid_dpop_proof`, `unauthorized_client`, `unsupported_grant_type`, `invalid_scope`.
401`invalid_client`.
429`slow_down`: 60 requests a minute per address, 30 per agent.
GET/agents/vault/accountsToken vault: a person's connected accounts (never a token)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
externalUsernamequerystringThe person.
Yanıt alanı (200)TipAçıklama
accountsAgentVaultAccount[]
DurumAnlam
200Accounts.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
PUT/agents/vault/accounts/{connection}/{externalUsername}Token vault: keep a person's tokens after your own OAuth flow with them

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
connectionzorunlupathstringThe connection.
externalUsernamezorunlupathstringThe person.
Gövde alanıTipAçıklama
accessTokenzorunlustring
refreshTokenstring
expiresIninteger
scopestring
Yanıt alanı (200)TipAçıklama
accountAgentVaultAccount
DurumAnlam
200Kept, sealed.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`connection_not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/agents/vault/accounts/{connection}/{externalUsername}Token vault: delete a person's tokens

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
connectionzorunlupathstringThe connection.
externalUsernamezorunlupathstringThe person.
Yanıt alanı (200)TipAçıklama
removedboolean
DurumAnlam
200Deleted.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`account_not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/agents/vault/connectionsToken vault: the connections to other services

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Yanıt alanı (200)TipAçıklama
connectionsAgentVaultConnection[]
DurumAnlam
200Connections, with how many people have tokens kept.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
PUT/agents/vault/connections/{name}Token vault: add or replace a connection

Your own OAuth app at the service (Touchque refreshes people's tokens with it) and the agents that may get tokens from it. `clientSecret` is kept when left out of a replacement.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
namezorunlupathstringLowercase letters, digits and dashes.
Gövde alanıTipAçıklama
providerzorunlu"google" | "microsoft" | "github" | "facebook" | "linkedin" | "x" | "oidc"
clientIdzorunlustring
clientSecretstring
tenantstringMicrosoft: common, organizations, consumers or a directory id.
issuerstringOpenID Connect: the issuer URL.
agentIdsstring[]
Yanıt alanı (200)TipAçıklama
connectionAgentVaultConnection
DurumAnlam
200Replaced.
201Added.
400`invalid_request`, `unknown_agent`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/agents/vault/connections/{name}Token vault: remove a connection and every person's tokens kept for it

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
namezorunlupathstringThe connection.
Yanıt alanı (200)TipAçıklama
removedboolean
tokensDeletedinteger
DurumAnlam
200Removed.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`connection_not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/agents/vault/tokenA person's own access token at another service (agent token with vault:read)

For a connection that names this agent: the kept access token, refreshed by Touchque when it is about to expire. The refresh token never leaves. `scope` may only narrow what the person granted.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
externalUsernamezorunlustring
connectionzorunlustring
scopestring
Yanıt alanı (200)TipAçıklama
access_tokenstring
token_type"Bearer"
expires_ininteger
scopestring
connectionstring
DurumAnlam
200A Bearer token for the service.
403`connection_not_allowed`.
404`connection_not_found`, `not_connected`.
409`no_refresh_token`, `refresh_failed`: deposit new tokens.
GET/agents/workspace-policyThe floor every agent's policy sits on

The workspace's own rules for all its agents (an agent's policy can only be stricter), with the defaults.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Yanıt alanı (200)TipAçıklama
policyobject
defaultsobject
DurumAnlam
200The workspace policy.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
PUT/agents/workspace-policySet the floor for every agent's policy

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
policyobject
Yanıt alanı (200)TipAçıklama
policyobject
DurumAnlam
200The saved policy.
400The policy's own validation code.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/agents/{agentId}An agent

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
agentIdzorunlupathstringThe agent's id.
Yanıt alanı (200)TipAçıklama
agentAgentAn AI agent of the workspace. `blocked` says what stops it right now (null when it may act): `workspace_paused` (kill switch), `suspended`, `revoked`, `review_overdue`.
DurumAnlam
200The agent.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`agent_not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
PATCH/agents/{agentId}Change, hand over or renew an agent

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
agentIdzorunlupathstringThe agent's id.
Gövde alanıTipAçıklama
namestring
descriptionstring | null
ownerEmailstringA new owner also resumes an agent suspended because its owner left.
platformstring
allowedTypesstring[]
reviewInDaysintegerRenews the review date from now.
Yanıt alanı (200)TipAçıklama
agentAgentAn AI agent of the workspace. `blocked` says what stops it right now (null when it may act): `workspace_paused` (kill switch), `suspended`, `revoked`, `review_overdue`.
DurumAnlam
200Updated.
400`invalid_request`, `unknown_type`, `invalid_owner`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`agent_not_found`.
409`agent_revoked`, `name_too_similar`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/agents/{agentId}Revoke an agent for good

Its tokens stop at once. The record stays (status `revoked`) for the audit trail.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
agentIdzorunlupathstringThe agent's id.
Yanıt alanı (200)TipAçıklama
agentAgentAn AI agent of the workspace. `blocked` says what stops it right now (null when it may act): `workspace_paused` (kill switch), `suspended`, `revoked`, `review_overdue`.
DurumAnlam
200Revoked.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`agent_not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/agents/{agentId}/blocksThe people who stopped this agent asking them

A person stops an agent by answering "this wasn't me" or "someone told me to" on the phone, or by rejecting it three times in 30 minutes. Its requests to them answer 403 `blocked_by_person` until you lift it.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
agentIdzorunlupathstringThe agent's id.
Yanıt alanı (200)TipAçıklama
blocksobject[]
DurumAnlam
200Blocks.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`agent_not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/agents/{agentId}/blocks/{externalUsername}Let the agent ask this person again

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
agentIdzorunlupathstringThe agent's id.
externalUsernamezorunlupathstringThe person.
Yanıt alanı (200)TipAçıklama
liftedboolean
DurumAnlam
200Lifted.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`agent_not_found`, `block_not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/agents/{agentId}/keysAdd a key (rotation)

Add the new key, move the agent to it, then remove the old one. At most 3 keys.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
agentIdzorunlupathstringThe agent's id.
Gövde alanıTipAçıklama
publicKeyzorunluPublicJwkAn agent's public key: EC P-256 (ES256) or OKP Ed25519 (EdDSA). Never send `d`: the private key stays with the agent. Without `kid`, the RFC 7638 thumbprint becomes the kid.
Yanıt alanı (201)TipAçıklama
agentAgentAn AI agent of the workspace. `blocked` says what stops it right now (null when it may act): `workspace_paused` (kill switch), `suspended`, `revoked`, `review_overdue`.
DurumAnlam
201Added.
400`invalid_key`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`agent_not_found`.
409`key_exists`, `key_limit`, `agent_revoked`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/agents/{agentId}/keys/{kid}Remove a key

Tokens the agent got with this key stop at once.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
agentIdzorunlupathstringThe agent's id.
kidzorunlupathstringThe key's kid.
Yanıt alanı (200)TipAçıklama
agentAgentAn AI agent of the workspace. `blocked` says what stops it right now (null when it may act): `workspace_paused` (kill switch), `suspended`, `revoked`, `review_overdue`.
DurumAnlam
200Removed.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`agent_not_found`, `key_not_found`.
409`last_key`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/agents/{agentId}/mandatesAn agent's mandates

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
agentIdzorunlupathstringThe agent's id.
externalUsernamequerystringOnly this person's.
Yanıt alanı (200)TipAçıklama
mandatesMandate[]
DurumAnlam
200Mandates.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/agents/{agentId}/mandates/{mandateId}/revokeEnd an agent's mandate at once

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
agentIdzorunlupathstringThe agent's id.
mandateIdzorunlupathstringThe mandate.
Yanıt alanı (200)TipAçıklama
mandateIdstring
status"pending" | "active" | "rejected" | "expired" | "provisional" | "revoked" | "exhausted"
externalUsernamestring
typestring
maxCountinteger
usedCountinteger
maxTotalobject
usedobject
perRequestobject
recipientsstring[]iban:… / account:… identifiers; empty = any.
validUntilstring
challengeCodestringWhile pending: show it in the conversation.
approvalExpiresAtstring
revokedAtstring | null
DurumAnlam
200Revoked.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`mandate_not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
PUT/agents/{agentId}/policySet the agent's budgets, amounts, recipients and background rule

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
agentIdzorunlupathstringThe agent's id.
Gövde alanıTipAçıklama
policyzorunluAgentPolicyWhat the agent may ask for beyond its action types, checked before anything reaches the phone. PUT replaces it: fields left out fall back to the defaults.
Yanıt alanı (200)TipAçıklama
agentAgentAn AI agent of the workspace. `blocked` says what stops it right now (null when it may act): `workspace_paused` (kill switch), `suspended`, `revoked`, `review_overdue`.
DurumAnlam
200The agent with its policy.
400`invalid_policy`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`agent_not_found`.
409`agent_revoked`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/agents/{agentId}/resumeResume a suspended agent

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
agentIdzorunlupathstringThe agent's id.
Yanıt alanı (200)TipAçıklama
agentAgentAn AI agent of the workspace. `blocked` says what stops it right now (null when it may act): `workspace_paused` (kill switch), `suspended`, `revoked`, `review_overdue`.
DurumAnlam
200Active again.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`agent_not_found`.
409`agent_revoked`, `review_overdue` (renew first).
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/agents/{agentId}/suspendSuspend an agent

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
agentIdzorunlupathstringThe agent's id.
Gövde alanıTipAçıklama
reasonstring
Yanıt alanı (200)TipAçıklama
agentAgentAn AI agent of the workspace. `blocked` says what stops it right now (null when it may act): `workspace_paused` (kill switch), `suspended`, `revoked`, `review_overdue`.
DurumAnlam
200Suspended.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`agent_not_found`.
409`agent_revoked`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
Touchque Login
GET/identity/apisList APIs

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/identity/apisAdd an API

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
201Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/apis/{id}Get an API

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
PATCH/identity/apis/{id}Change an API

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/identity/apis/{id}Remove an API

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
204Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/attack-protectionAttack protection: brute force, suspicious addresses, bot challenge, breached passwords, new-device notices, the risk engine, rate limits

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
PUT/identity/attack-protectionChange attack protection (partial; the bot secret is write-only)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/attack-protection/eventsWhat attack protection caught lately

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
limitquerystringFilter or option: limit.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/clientsList apps

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/identity/clientsAdd an app (the secret is in the answer, once)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
201Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/clients/{clientId}Get an app

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
clientIdzorunlupathstringThe clientId.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
PATCH/identity/clients/{clientId}Change an app

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
clientIdzorunlupathstringThe clientId.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/identity/clients/{clientId}Remove an app (its refresh tokens end)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
clientIdzorunlupathstringThe clientId.
DurumAnlam
204Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/identity/clients/{clientId}/rotate-secretRotate an app's secret

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
clientIdzorunlupathstringThe clientId.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/connectionsList connections

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/identity/connectionsAdd a social or enterprise connection

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
201Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/connections/{id}Get a connection

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
PATCH/identity/connections/{id}Change a connection

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/identity/connections/{id}Remove a connection (its linked accounts go)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
204Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/custom-domainsList custom domains, and `verifiedDomains`: your organization's verified domains (null when they cannot be read)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/identity/custom-domainsAdd a custom domain (DNS records in the answer). On a verified domain of your organization it is verified at once (`proof: organization_domain`) and needs only the CNAME

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
201Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
PATCH/identity/custom-domains/{id}Make a verified domain the issuer

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/identity/custom-domains/{id}Remove a custom domain

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
204Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/identity/custom-domains/{id}/check-certificateCheck the domain's certificate at the sign-in edge now (`certificate`: status pending | active | error, notAfter, issuer, error)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/identity/custom-domains/{id}/verifyCheck the DNS TXT record (or, on a verified domain of your organization, verify it without one)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/deliveryEmail and SMS providers (secrets never returned; secretsSet lists which are stored), and `senderDomains` { organization, login }: the domains an email may be sent from

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
PUT/identity/delivery/{channel}Set the email (smtp, ses, postmark, sendgrid) or SMS (twilio, netgsm) provider

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
channelzorunlupathstringThe channel.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/identity/delivery/{channel}Remove the provider (Touchque's own transport is used again)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
channelzorunlupathstringThe channel.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/identity/delivery/{channel}/testSend one test message through the provider in use

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
channelzorunlupathstringThe channel.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/jobsRecent imports and exports

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/organizationsList organizations

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
qquerystringFilter or option: q.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/identity/organizationsAdd an organization

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
201Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/organizations/{id}Get an organization

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
PATCH/identity/organizations/{id}Change an organization

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/identity/organizations/{id}Remove an organization

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
204Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
PUT/identity/organizations/{id}/connectionsSet the organization's connections

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/organizations/{id}/invitationsInvitations

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/identity/organizations/{id}/invitationsInvite by email (the link opens the app's sign-in route)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
201Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/identity/organizations/{id}/invitations/{invitationId}Revoke an invitation

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
invitationIdzorunlupathstringThe invitationId.
DurumAnlam
204Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/organizations/{id}/membersMembers and their roles there

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/identity/organizations/{id}/membersAdd members

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/identity/organizations/{id}/members/{userId}Remove a member

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
userIdzorunlupathstringThe userId.
DurumAnlam
204Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/organizations/{id}/members/{userId}/rolesA member's roles there

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
userIdzorunlupathstringThe userId.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/outboxThe delivery log: what was sent, to whom, status and attempts. Message text only in the local dev inbox

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
toquerystringFilter or option: to.
limitquerystringFilter or option: limit.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/rolesList roles

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/identity/rolesAdd a role

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
201Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/roles/{id}Get a role

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
PATCH/identity/roles/{id}Change a role and its permissions

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/identity/roles/{id}Remove a role

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
204Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/roles/{id}/usersWho has the role

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/tenantGet the tenant

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_enabled`: turn Touchque Login on first (`PUT /identity/tenant`).
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
PUT/identity/tenantTurn Touchque Login on, or change its settings

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/identity/tenant/signing-keys/rotateRotate the token signing key

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/usersSearch customers

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
qquerystringFilter or option: q.
blockedquerystringFilter or option: blocked.
emailVerifiedquerystringFilter or option: emailVerified.
connectionquerystringFilter or option: connection.
organizationquerystringFilter or option: organization.
limitquerystringFilter or option: limit.
cursorquerystringFilter or option: cursor.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/identity/usersAdd a customer

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
emailzorunlustring
emailVerifiedboolean
passwordstringChecked against the tenant's password policy.
passwordHashstringA bcrypt ($2a/$2b/$2y) or argon2 ($argon2id…) hash as it is; replaced with Argon2id at the next sign-in.
customPasswordHashobjectAn old system's hash described like Auth0's custom_password_hash: algorithm (bcrypt, argon2, pbkdf2, scrypt, sha1, sha256, sha512, md5), hash { value, encoding }, salt { value, encoding, position }, digest, iterations, keylen, cost, blockSize, parallelization.
namestring
givenNamestring
familyNamestring
nicknamestring
picturestring
phonestringE.164.
localestring
userMetadataobjectEditable by the user.
appMetadataobjectOnly you and your Actions write it.
sendVerificationEmailboolean
DurumAnlam
201Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/identity/users-exportsExport customers (CSV or JSON lines; no hashes)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
202Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/users-exports/{id}An export's progress

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/users-exports/{id}/fileThe export file (kept 24 hours)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/identity/users-importsImport customers (JSON or NDJSON, with old password hashes)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
202Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/users-imports/{id}An import's progress

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/users/{id}Get a customer

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
PATCH/identity/users/{id}Change a customer (metadata is merged; null removes a key)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
Gövde alanıTipAçıklama
emailzorunlustring
emailVerifiedboolean
passwordstringChecked against the tenant's password policy.
passwordHashstringA bcrypt ($2a/$2b/$2y) or argon2 ($argon2id…) hash as it is; replaced with Argon2id at the next sign-in.
customPasswordHashobjectAn old system's hash described like Auth0's custom_password_hash: algorithm (bcrypt, argon2, pbkdf2, scrypt, sha1, sha256, sha512, md5), hash { value, encoding }, salt { value, encoding, position }, digest, iterations, keylen, cost, blockSize, parallelization.
namestring
givenNamestring
familyNamestring
nicknamestring
picturestring
phonestringE.164.
localestring
userMetadataobjectEditable by the user.
appMetadataobjectOnly you and your Actions write it.
sendVerificationEmailboolean
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/identity/users/{id}Erase a customer (KVKK/GDPR)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/identity/users/{id}/blockBlock (signs out everywhere)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/users/{id}/connected-accountsProvider accounts whose tokens the token vault keeps for the customer

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/identity/users/{id}/connected-accounts/{accountId}Stop apps using a provider account for the customer (deletes its stored tokens)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
accountIdzorunlupathstringThe accountId.
DurumAnlam
204Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/users/{id}/exportEverything about the customer (KVKK/GDPR access request)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/identity/users/{id}/identities/{identityId}Unlink a provider account

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
identityIdzorunlupathstringThe identityId.
forcequerystringFilter or option: force.
DurumAnlam
204Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/users/{id}/logsThe customer's activity

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
limitquerystringFilter or option: limit.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/identity/users/{id}/mfaReset second factors (passkeys, the Touchque app, email codes)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/identity/users/{id}/password-resetA password link, emailed or returned (`sendEmail: false`)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
202Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/users/{id}/rolesThe customer's roles

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/identity/users/{id}/rolesGive roles (tenant-wide or in an organization)

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/identity/users/{id}/rolesTake roles (body { roleIds, organizationId })

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/identity/users/{id}/roles/{roleId}Take one role

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
roleIdzorunlupathstringThe roleId.
organizationIdquerystringFilter or option: organizationId.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/identity/users/{id}/sessionsSigned-in sessions

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/identity/users/{id}/sessionsSign out everywhere

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/identity/users/{id}/sessions/{sessionId}End one session

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
sessionIdzorunlupathstringThe sessionId.
DurumAnlam
204Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/identity/users/{id}/unblockUnblock

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
200Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/identity/users/{id}/verification-emailSend a verification email

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
idzorunlupathstringThe object's id.
DurumAnlam
202Done.
400`invalid_request` with `field` and `message`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`not_found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
Mobile SDK
GET/mobile/devicesList the devices inside your app

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
externalUsernamequerystringOnly this user's devices.
statusquery"active" | "revoked" | "all"Default `active`.
limitqueryinteger1–50, default 20.
cursorquerystring`nextCursor` of the previous page.
Yanıt alanı (200)TipAçıklama
devicesMobileDevice[]
nextCursorstring | null
DurumAnlam
200Newest first.
400`invalid_request`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/mobile/devices/{deviceId}A device inside your app

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
deviceIdzorunlupathstringThe mobile SDK device's id.
Yanıt alanı (200)TipAçıklama
deviceMobileDeviceA device inside your app that approves for one of your users.
DurumAnlam
200The device.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`device_not_found`: no mobile SDK device with this id in this workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
DELETE/mobile/devices/{deviceId}Stop a device inside your app from approving

Revokes the device. If it is the user's approver, the user has no approver until you enrol again; requests waiting on it expire, and a `DEVICE_UNLINKED` webhook arrives with `via: mobile_sdk`. The SDK sees it on its next check and signs itself out.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
deviceIdzorunlupathstringThe mobile SDK device's id.
Yanıt alanı (200)TipAçıklama
removedboolean
wasLinkedboolean
DurumAnlam
200Removed.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`device_not_found`: no mobile SDK device with this id in this workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/mobile/devices/{deviceId}/test-pushSend a test push to a device inside your app

A harmless push the way a request would reach the device: sent by Touchque with your APNs key / FCM service account for its platform (see `push` in the settings), otherwise a `MOBILE_PUSH` webhook with `kind: test`. The SDK only connects and finds nothing waiting. Tells you which way it went and whether APNs / FCM accepted it.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
deviceIdzorunlupathstringThe mobile SDK device's id.
Yanıt alanı (200)TipAçıklama
via"touchque" | "webhook"
okbooleanAPNs / FCM accepted it, or the webhook was handed to your URL.
reasonstringWhy not, e.g. BadDeviceToken, UNREGISTERED, no_webhook_url.
DurumAnlam
200Sent (or tried).
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
404`device_not_found`: no mobile SDK device with this id in this workspace.
409`device_revoked` or `no_push_token` (the app has not called Touchque.setPushToken).
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/mobile/enrollmentsEnrol a user's device inside your app (Mobile SDK)

Issues a one-time enrollment token for one of your signed-in users. Your app passes it to the Touchque SDK (`Touchque.enroll`), which creates its hardware key, proves the app when it can, and becomes the user's approver: `/login/request` then reaches your app instead of the Touchque app. You authenticate the user before asking — the token makes whoever spends it their approver. A user who already approves from a device needs `replace: true` (the old device stops when the new one enrols); a frozen user (a request reported as not theirs) too. Earlier unused tokens of the user stop working. Then a `DEVICE_LINKED` webhook arrives with `via: mobile_sdk`.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
externalUsernamezorunlustring
replacebooleanMove the user from the device they approve with today.
ttlSecondsintegerDefault: the workspace's `enrollTtlSeconds` (600).
Yanıt alanı (201)TipAçıklama
enrollmentIdstring
enrollmentTokenstringOne-time. Hand it to your app over your own signed-in API (never in a URL or QR code); the SDK spends it in `Touchque.enroll(token)`. Only the newest token of a user works.
externalUsernamestring
expiresAtstring
replaceboolean
replacesDeviceIdstringWith `replace`: the device that approves today and stops when the token is used.
DurumAnlam
201The token. Not cached (`Cache-Control: no-store`).
400`invalid_request`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
409`already_enrolled` (with `deviceId`, `channel`: `mobile_sdk` | `touchque_app`, `platform`) or `account_frozen`: send `replace: true`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/mobile/settingsYour Mobile SDK settings

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Yanıt alanı (200)TipAçıklama
settingsMobileSdkSettings
DurumAnlam
200The settings (defaults when never set).
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
PUT/mobile/settingsSet which apps may enrol, whether they must prove themselves, and your push keys

Only the fields sent change. App Attest and Android Key Attestation need Touchque's trust anchors, which production has; set `attestation: required` once your released apps send evidence. `apns` / `fcm`: your own APNs key (.p8) / Firebase service account; Touchque then sends that platform's push itself (alert + the `touchque` wake-up data) instead of the `MOBILE_PUSH` webhook. The keys are sealed (AES-256-GCM) and never returned; `null` removes one.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
iosAppIdsstring[]
androidPackagesstring[]
androidCertsobjectPackage name → SHA-256 fingerprints ("AB:CD:…" or plain hex). Certificates of apps not in androidPackages are dropped.
attestation"off" | "optional" | "required"
enrollTtlSecondsinteger
apnsobject | null
fcmobject | null
Yanıt alanı (200)TipAçıklama
settingsMobileSdkSettings
DurumAnlam
200The settings now.
400`invalid_settings`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
Users
GET/usersList enrolled users

Every enrollment of the workspace, newest first. Not paginated.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

DurumAnlam
200Users.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`Integration not found`. Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Error message of the failure.
GET/users/{username}Get one enrolled user

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
usernamezorunlupathstringThe `externalUsername`, URL-encoded. Note: the server URL-decodes it a second time after routing, so a literal `%` in a username must be double-encoded (`%2525`), and a malformed escape answers 500.
Yanıt alanı (200)TipAçıklama
externalUsernamestring
deviceIdstring | nullLinked phone, or null when not linked yet.
usedbooleanTrue once the enrollment secret was linked to a phone.
frozenbooleanManual freeze flag (automatic freezes after rejections are time-limited and not reflected here).
createdAtstring
expireAtstring | nullLink deadline of the enrollment secret.
deviceDevicePosture | nullThe linked phone's posture, or null before a phone is linked.
DurumAnlam
200User.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`Integration not found`. Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
404`User not found`.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Error message of the failure.
Devices
POST/device/flag-deviceFlag a device as fraudulent (Trust Network)

Shares a fraud signal so other opted-in workspaces score that phone as risky. Requires `TenantPolicy.trustNetworkShareEnabled`, and the device must have confirmed at least one login for this user in your workspace. Note the reason values are upper case here (unlike `report-fraud`).

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
deviceIdzorunlustringA device that confirmed at least one login for this user in your workspace.
externalUsernamezorunlustring
reasonzorunlu"CONFIRMED_FRAUD" | "ACCOUNT_TAKEOVER" | "SOCIAL_ENGINEERING" | "OTHER"
Yanıt alanı (200)TipAçıklama
flaggedboolean
deviceIdstring
DurumAnlam
200Flagged.
400Missing fields or invalid `reason`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`TRUST_NETWORK_NOT_ENABLED`, `NO_LOGIN_HISTORY` (each with `message`), or `Integration not found`. Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
GET/device/trustList a user's trusted devices

Devices the user chose to trust for N days, unexpired only, newest first. Access policy rules see trust as `device.trusted`; it does not waive number matching.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
externalUsernamezorunluquerystringThe user.
Yanıt alanı (200)TipAçıklama
devicesTrustedDevice[]
DurumAnlam
200Trusted devices.
400`externalUsername query parameter is required`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
POST/device/trust/revokeRevoke device trust

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

Gövde alanıTipAçıklama
externalUsernamezorunlustring
deviceIdstringRevoke only this device; omit to revoke all of the user's trusted devices.
Yanıt alanı (200)TipAçıklama
revokedinteger
DurumAnlam
200Number of revoked trust records.
400`externalUsername is required`.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403`Integration not found`. Authentication failures (unknown, revoked or expired key, a key whose creator left its organization, invalid signature, IP not allowed, WAF block) also answer 403 — see the `Forbidden` response.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500Unexpected server error.
Logs
GET/logsFetch the workspace's event log

The 500 most recent log entries, newest first, optionally filtered. With `format=csv`, a CSV attachment (`logs.csv`) with the columns `type,username,ip,userAgent,createdAt,note`.

Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)

ParametreYerTipAçıklama
typequerystringExact event type (e.g. `LOGIN_CONFIRM`).
ipquerystringExact IP address.
usernamequerystringExact `externalUsername` (named `username` here).
formatquery"csv"`csv` for a CSV download; anything else returns JSON.
DurumAnlam
200Log entries.
401Authentication missing or not acceptable. `error` is one of `API_KEY_REQUIRED`, `SIGNATURE_REQUIRED`, `TIMESTAMP_REQUIRED`, `TIMESTAMP_EXPIRED`, `NONCE_REQUIRED`, `NONCE_INVALID`, `SIGNATURE_LEGACY_REJECTED`, each with a `message`.
403Authentication rejected or operation not permitted. Authentication failures: `SIGNATURE_INVALID`, `SIGNATURE_VERIFY_FAILED` (legacy key without secret), `API_KEY_INVALID` / `IP_BLOCKED` (legacy keys), `Invalid API key` / `Credential has been revoked` / `IP not allowed` (tq_ keys, plain message in `error`), `{ code: "credential_org_access_revoked", error }` (tq_ key whose creator is no longer a member of the organization it was created in), `{ code: "credential_expired", error }` (tq_ key past the expiry it was created with), `ACCESS_DENIED` (WAF ban). Most operations also answer 403 `Integration not found` when the key resolves to no workspace.
429Rate limited. The WAF limits each IP per endpoint (default 100/min, 300/min across endpoints; tighter on sensitive endpoints) and answers `{ error: "RATE_LIMITED", message, retryAfter }` without a Retry-After header; repeated abuse escalates to temporary IP bans (429, then 403 `ACCESS_DENIED`). Requests from 127.0.0.1 bypass the WAF. Quota-guarded endpoints also limit each workspace to 600 requests/min (`INTEGRATION_QUOTA_PER_MINUTE`), answering `{ error: "integration_quota_exceeded", message, retryAfter }` with Retry-After.
500`Failed to fetch logs`.
Mirror Alarm
POST/c/{token}Mirror Alarm beacon (end user's browser)

Sent with `navigator.sendBeacon` by the page that shows the sign-in (`@touchque/web` does it): `{ "origin": location.origin, "top": window.top === window, "referrer": document.referrer }` as `text/plain` JSON, so no CORS preflight is needed. Read together with the browser's own `Origin` header. Always 204.

Kimlik: Herkese açık

ParametreYerTipAçıklama
tokenzorunlupathstringThe token in `canary.url`, without `.gif`.
DurumAnlam
204Received (also for an unknown or expired token).
GET/c/{token}.gifMirror Alarm canary image (end user's browser)

Loaded by the page that shows the sign-in, as a hidden image (`@touchque/web` does it). The browser's `Referer` tells Touchque which page that is; one that is not on your site marks the request `phishing_origin`. Always the same 1x1 GIF with `Cache-Control: no-store`, whether or not the token is known. No CORS or cross-origin resource policy applies.

Kimlik: Herkese açık

ParametreYerTipAçıklama
tokenzorunlupathstringThe token in `canary.url` from `POST /login/request`.
DurumAnlam
2001x1 transparent GIF.
Meta
GET/healthHealth check (database + security controls)

Kimlik: Herkese açık

Yanıt alanı (200)TipAçıklama
status"ok" | "degraded"`degraded` (with HTTP 500) when the database is unreachable.
securityControls"ok" | "degraded"Whether any security control ran in its fallback mode in the last 5 minutes.
degradedstring[]Names of the degraded controls (only when degraded).
DurumAnlam
200Healthy (security controls may still report `degraded`).
500Database unreachable (`status: degraded`).
GET/openapi.jsonThis OpenAPI document

Served with `Cache-Control: public, max-age=300`.

Kimlik: Herkese açık

DurumAnlam
200OpenAPI 3.1 document.
GET/pingLiveness check

Kimlik: Herkese açık

Yanıt alanı (200)TipAçıklama
pongboolean
DurumAnlam
200Alive.
Webhooks
POSTcallback adresinizApproval re-confirmed or taken back (Vishing Shield)

Follow-ups to a SUCCESS login result. `APPROVAL_RECONFIRMED` when, after the call, the user confirms on the phone that an approval given during it (`provisional: true`) was theirs; `APPROVAL_REVOKED` when the user takes an approval back ("someone on the phone told me to approve", `reason: COACHED`, or an undo, `reason: UNDO`): end the session or stop the action built on it, and expect the user's 2FA to be frozen. Sent to the same `callbackUrl` as the other events; a handler that switches on `event` should ignore types it does not know.

Kimlik: Touchque gönderir, imzalı: x-signature = API secret'ınızla HMAC-SHA256 (Developers → Webhooks altındaki Signing secret aynı değerdir)

ParametreYerTipAçıklama
x-signaturezorunluheaderstringHex HMAC-SHA256 of the canonical payload.
x-timestampzorunluheaderstringSend time, ISO 8601 (not signed).
x-noncezorunluheaderstringSame value as `jti`.
Idempotency-KeyzorunluheaderstringSame value as `jti`.
x-callback-eventzorunluheader"APPROVAL_RECONFIRMED" | "APPROVAL_REVOKED"The event type.
x-api-keyzorunluheaderstringThe workspace's integration API key. Not proof of origin — verify the signature.
Gövde alanıTipAçıklama
eventzorunlu"APPROVAL_RECONFIRMED" | "APPROVAL_REVOKED"`APPROVAL_RECONFIRMED`: after the call, the user confirmed on the phone that a provisional approval was theirs; critical actions are allowed again. `APPROVAL_REVOKED`: the user took an approval back (provisional, or any from the last 15 minutes): end the session or stop the action built on it; the user's 2FA is frozen.
externalUsernamezorunlustring
integrationIdzorunlustring
timestampzorunlustring
jtizorunlustring
requestIdzorunlustringThe login request the event is about (its SUCCESS webhook came first).
reason"UNDO" | "COACHED"`APPROVAL_REVOKED` only. `COACHED`: someone on the phone told the user to approve; treat it as an account takeover in progress. Treat unknown values like `COACHED`.
signaturezorunlustring
DurumAnlam
2XXAcknowledged.
defaultAny other status (or a timeout) is retried in-process, then dropped.
POSTcallback adresinizHelp desk: a session opened or ended, a check answered, or an "IT" call nobody from IT made

`ASSIST_OPENED`, `ASSIST_ENDED`, `ASSIST_CHECK_PASSED`, `ASSIST_CHECK_FAILED` (`outcome`: `wrong_number`, `not_me`, `coached`, `declined`), `ASSIST_UNFROZEN`, `ASSIST_CLAIM_CONFIRMED` (the person checked that the agent is real) and `ASSIST_CLAIM_UNVERIFIED` (nobody from IT was working on the account: someone is pretending to be IT). Checks and unverified claims carry a case code. A check's approval never sends a `loginResult`.

Kimlik: Touchque gönderir, imzalı: x-signature = API secret'ınızla HMAC-SHA256 (Developers → Webhooks altındaki Signing secret aynı değerdir)

ParametreYerTipAçıklama
x-signaturezorunluheaderstringHex HMAC-SHA256 of the canonical payload.
x-timestampzorunluheaderstringSend time, ISO 8601 (not signed).
x-noncezorunluheaderstringSame value as `jti`.
Idempotency-KeyzorunluheaderstringSame value as `jti`.
x-callback-eventzorunluheader"ASSIST_OPENED" | "ASSIST_ENDED" | "ASSIST_CHECK_PASSED" | "ASSIST_CHECK_FAILED" | "ASSIST_UNFROZEN" | "ASSIST_CLAIM_CONFIRMED" | "ASSIST_CLAIM_UNVERIFIED"The event type.
x-api-keyzorunluheaderstringThe workspace's integration API key. Not proof of origin — verify the signature.
Gövde alanıTipAçıklama
eventzorunlu"ASSIST_OPENED" | "ASSIST_ENDED" | "ASSIST_CHECK_PASSED" | "ASSIST_CHECK_FAILED" | "ASSIST_UNFROZEN" | "ASSIST_CLAIM_CONFIRMED" | "ASSIST_CLAIM_UNVERIFIED"
externalUsernamestring | null
integrationIdzorunlustring
timestampzorunlustring
jtizorunlustring
assistIdstring
agentRefstring
agentNamestring
requestIdstring
actionstring | null
outcome"pending" | "verified" | "wrong_number" | "not_me" | "coached" | "declined" | "expired"
reasonstring
expiresAtstring
caseCodestring | nullAs in `/logs/cases/{code}`.
signaturezorunlustring
DurumAnlam
2XXAcknowledged.
defaultAny other status (or a timeout) is retried in-process, then dropped.
POSTcallback adresinizDevice linked or unlinked

`DEVICE_LINKED` when the user links the Touchque app by scanning the enrollment QR, or moves the account to a new phone with a transfer code (then with `via: transfer`); `DEVICE_UNLINKED` when the user disables 2FA from the phone.

Kimlik: Touchque gönderir, imzalı: x-signature = API secret'ınızla HMAC-SHA256 (Developers → Webhooks altındaki Signing secret aynı değerdir)

ParametreYerTipAçıklama
x-signaturezorunluheaderstringHex HMAC-SHA256 of the canonical payload.
x-timestampzorunluheaderstringSend time, ISO 8601 (not signed).
x-noncezorunluheaderstringSame value as `jti`.
Idempotency-KeyzorunluheaderstringSame value as `jti`.
x-callback-eventzorunluheader"DEVICE_LINKED" | "DEVICE_UNLINKED"The event type.
x-api-keyzorunluheaderstringThe workspace's integration API key. Not proof of origin — verify the signature.
Gövde alanıTipAçıklama
eventzorunlu"DEVICE_LINKED" | "DEVICE_UNLINKED"`DEVICE_LINKED`: the user scanned the enrollment QR, or moved the account to a new phone with a transfer code (`via: transfer`). `DEVICE_UNLINKED`: the user disabled 2FA from the phone.
externalUsernamezorunlustring
integrationIdzorunlustring
timestampzorunlustring
jtizorunlustring
deviceIdzorunlustringThe phone the account is now linked to (`DEVICE_LINKED`) or was unlinked from.
via"transfer" | "recovery" | "mobile_sdk"`DEVICE_LINKED`: present when the account moved from the user's previous phone with a transfer code (`transfer`) or by a recovery (`recovery`, with `recoveryId` and `method`) instead of an enrollment QR, or when your own app enrolled with the Mobile SDK (`mobile_sdk`, with `platform`, `attested` and, on a replace, `replacedDeviceId`). Approvals now come from `deviceId`; if the user did not move phones, treat it as a takeover. Treat unknown values like a link. `DEVICE_UNLINKED` with `mobile_sdk`: you removed the device or the user signed out in your app (`reason`: `removed` | `signed_out`).
signaturezorunlustring
DurumAnlam
2XXAcknowledged.
defaultAny other status (or a timeout) is retried in-process, then dropped.
POSTcallback adresinizDevice risk: a signal that asks for more, or an alert

`DEVICE_RISK_SIGNAL` when an identification or a `/device-risk/check` raised a signal that asks for more, enforced or in shadow (page loads of the same visitor with the same signals: once in 10 minutes; every check). `DEVICE_RISK_ALERT` when an alert rule of the workspace went off (Device risk → Settings → Alerts; at most once an hour per rule). Never a trait: identifiers, signals and the risk engine's verdict.

Kimlik: Touchque gönderir, imzalı: x-signature = API secret'ınızla HMAC-SHA256 (Developers → Webhooks altındaki Signing secret aynı değerdir)

ParametreYerTipAçıklama
x-signaturezorunluheaderstringHex HMAC-SHA256 of the canonical payload.
x-timestampzorunluheaderstringSend time, ISO 8601 (not signed).
x-noncezorunluheaderstringSame value as `jti`.
Idempotency-KeyzorunluheaderstringSame value as `jti`.
x-callback-eventzorunluheader"DEVICE_RISK_SIGNAL" | "DEVICE_RISK_ALERT"The event type.
x-api-keyzorunluheaderstringThe workspace's integration API key. Not proof of origin — verify the signature.
Gövde alanıTipAçıklama
eventzorunlu"DEVICE_RISK_SIGNAL" | "DEVICE_RISK_ALERT"
externalUsernamestring | null
integrationIdzorunlustring
timestampzorunlustring
jtizorunlustring
requestIdstring | nullDEVICE_RISK_SIGNAL: the identification (`dre_…`).
visitorIdstring | nullDEVICE_RISK_SIGNAL: the visitor (`tqv_…`); null when the page sent no identification.
purpose"sign_in" | "sign_up" | "password_reset" | "approval" | null
report"ok" | "replayed" | "missing" | "unknown" | "expired" | "invalid"
confidencenumber | null
matchedBystring | null
sealedboolean
countrystring | null
signalsobject[]
verdictobject
alertobjectDEVICE_RISK_ALERT: rule (signup_burst | many_accounts | tamper_spike), label, value, threshold, window, visitorId, requestId, purpose, at.
signaturezorunlustring
DurumAnlam
2XXAcknowledged.
defaultAny other status (or a timeout) is retried in-process, then dropped.
POSTcallback adresinizLogin request approved (SUCCESS) or rejected (REJECTED)

Sent when a login request is approved — on the phone, with a passkey (`/webauthn/login/verify`, `/webauthn/authenticate/primary/verify`) or with a recovery code — or rejected (on the phone, or by Touchque at the tap). Not sent for requests blocked at creation, for expiry, for offline-sign approvals, or while a request the Vishing Shield moved to a passkey is still waiting for it. A SUCCESS with `provisional: true` can be followed by an `approvalEvent`.

Kimlik: Touchque gönderir, imzalı: x-signature = API secret'ınızla HMAC-SHA256 (Developers → Webhooks altındaki Signing secret aynı değerdir)

ParametreYerTipAçıklama
x-signaturezorunluheaderstringHex HMAC-SHA256 of the canonical payload (see above).
x-timestampzorunluheaderstringSend time, ISO 8601 (not signed; same value as the signed `timestamp` field).
x-noncezorunluheaderstringSame value as `jti` (not signed).
Idempotency-KeyzorunluheaderstringThe `requestId` — stable across retries and redeliveries.
x-callback-eventzorunluheader"SUCCESS" | "REJECTED"`SUCCESS` or `REJECTED`.
x-api-keyzorunluheaderstringThe workspace's integration API key (or the literal `[integration-api-key]` when none is stored). Do not treat it as proof of origin — verify the signature.
x-sdk-namezorunluheaderstringSender name (the backend package name).
x-sdk-versionzorunluheaderstringSender version.
Gövde alanıTipAçıklama
statuszorunlu"SUCCESS" | "REJECTED"
actionzorunlu"LOGIN_CONFIRM" | "LOGIN_REJECT"
requestIdzorunlustring
externalUsernamezorunlustring
integrationIdzorunlustring
deviceIdzorunlustring | nullApproving phone. For passwordless passkey sign-ins this is the passkey record id.
referenceIdzorunlustring | null
timestampzorunlustringSend time (also in `x-timestamp`). Covered by the signature — use it for freshness checks.
jtizorunlustringUnique per delivery attempt series (also sent as `x-nonce`). A redelivery from the retry queue gets a new `jti`; deduplicate on `requestId` / `Idempotency-Key`.
riskScorezorunlunumber
riskFactorszorunlustring[]Risk factors (codes in `riskFactors`): - `tor_exit_node`: the end user's address is a Tor exit. Block-capable. - `known_malicious_ip` / `suspicious_ip_reputation`: address with a bad reputation. Block-capable. - `malicious_tool_detected` / `suspicious_user_agent_or_tool`: the browser is an attack or automation tool. Block-capable. - `impossible_travel`: too far from the user's last approved sign-in for the time between (accuracy radii subtracted). Step-up. - `datacenter_ip`: a cloud or hosting address. Step-up. - `origin_approval_country_mismatch`: the phone that approved is in another country than the browser. Step-up. - `ip_velocity_high` / `ip_velocity_critical`: many different people of your workspace from one address within an hour. Block-capable. - `mfa_fatigue_suspected` / `user_velocity_*`: many pushes to this user within an hour. Number matching. - `device_fingerprint_drift`: a browser this user never approved from. Block-capable. - `credential_stuffing_botnet_graph_anomaly`: one browser on many accounts within an hour. Block-capable. - `bot_pattern_no_mouse_movement` (step-up) / `bot_pattern_linear_movement` (block-capable): page behaviour of a script. - `client_ip_unusable`: the clientIp you sent is internal or reserved. Number matching. - `location_unverified`: you sent no usable clientIp (none, a loopback address, or not an address), so the end user's location and network could not be checked. Number matching; a recovery code still answers it. Only once Touchque enforces it. - `high_risk_action` / `high_risk_night_action`: the action is critical (at night in the user's time zone). - `new_device`, `repeated_failures`, `rapid_requests`, `trust_network_flagged_device`, `require_number_match`: local facts; number matching, never a block. - `risk_engine_unavailable`: no verdict could be obtained; the request fails closed (number matching, critical approvals refused). - `policy_step_up` / `policy_unavailable` / `geo_unverified` / `post_approval_step_up`: why the request was number-matched when nothing else on it says so: an access rule asked for step-up, the access policy could not be read, the end user's country could not be verified under a country rule (not recorded while the risk engine is unreachable), or an earlier approval was stepped up after the tap. Number matching; a recovery code or a typed offline code cannot approve such a request, nor one with `require_number_match` or `repeated_failures`. - `vishing_suspected`: the approving phone was on a call, or its screen was shared or remote-controlled, when the user tapped Approve (Vishing Shield, once enforced): the request was moved to a passkey (`requiresPasskey`), or refused (`reason: vishing_suspected`). No code (offline, time-based, recovery) can finish it. - `phishing_origin`: the sign-in page that showed this request is not on your site (Mirror Alarm): a real-time phishing proxy. The approval is refused (`reason: phishing_origin`) and no code can finish it. - `user_reported_coached`: the user said someone on the phone told them to approve (on the request, or on an approval taken back with `APPROVAL_REVOKED`). 2FA is frozen as for `user_reported_not_me`. - `approval_revoked`: the user took this approval back on the phone (`APPROVAL_REVOKED`). - `ctx_missing`: the phone sent its call / screen state with earlier approvals and none with this one. Shadow-mode factors are not returned until they are enforced: `mfa_fatigue_slow`, `approver_device_push_burst`, `approver_device_reported_fraud`, `user_recently_reported_fraud`, `recent_factor_enrollment`, `new_country_for_user`, `new_asn_for_user`, `location_unverified`.
assuranceAssuranceWhat a partner can rely on for an approved request. Only a passkey is phishing-resistant (origin-bound).
approvalProofApprovalProofDevice-signed proof of exactly what was approved. Present only when the approving phone has a registered hardware (Secure Enclave) key; verify it with the SDK's `verifyApprovalProof` against the public key you expect. `message` is the UTF-8 text that was signed — five lines joined by `\n`: ``` touchque-approve:v2 <requestId> <type> <challengeCode or empty> <detailsDigest or empty> ``` `detailsDigest` is the lowercase hex SHA-256 of the details as `label + "\u001F" + value`, items joined by `"\u001E"` (empty when there are no details).
reason"user_rejected" | "user_reported_fraud" | "user_reported_coached" | "user_blocked_agent" | "risk_reversed" | "risk_step_up" | "approval_signature_invalid" | "device_integrity_failed" | "vishing_suspected" | "phishing_origin"REJECTED only. `user_reported_fraud`: the user said "this wasn't me" (2FA frozen). `user_reported_coached`: the user said someone on the phone told them to approve (2FA frozen; a caller is working this user, so reset the password and end their sessions). `user_blocked_agent`: an AI agent's request, and the user also blocked the agent from asking them again (a plain no otherwise; no 2FA freeze). `risk_reversed`: the user approved, then the risk engine refused it on evidence that appeared at the tap (riskFactors lists it). `risk_step_up`: refused for now; the user's next request asks for number matching. `approval_signature_invalid`: the approval carried a device signature that did not verify. `device_integrity_failed`: the phone reports itself jailbroken or tampered and the action is critical. `vishing_suspected`: the phone was on a call (or its screen shared or remote-controlled) when the user approved a critical action, and the user has no passkey to finish it with. `phishing_origin`: the sign-in page was not on your site (Mirror Alarm). Treat unknown values as a rejection.
frozenUntilstringREJECTED only: present when this rejection froze the user's 2FA.
provisionalbooleanSUCCESS only. Approved while the user was on a call (Vishing Shield): critical actions wait for `APPROVAL_RECONFIRMED`; `APPROVAL_REVOKED` means end the session.
reconfirmedAtstring | nullSUCCESS only (a redelivery may carry it).
revokedbooleanSUCCESS only (a redelivery may carry it): the user took the approval back.
revokeReason"UNDO" | "COACHED" | nullSUCCESS only.
signaturezorunlustringSame value as the `x-signature` header.
DurumAnlam
2XXAcknowledged. The body is ignored.
defaultAny other status (or a timeout) is retried.
POSTcallback adresinizPush a request to a device inside your app

Sent for every request (sign-in, protected action, AI agent approval, recovery notice) to a device enrolled with the Mobile SDK, instead of a Touchque push. Forward `data` with your own APNs/FCM; the request itself travels end to end encrypted to the SDK. Without a `callbackUrl` no push is possible and the SDK only receives requests while your app is open.

Kimlik: Touchque gönderir, imzalı: x-signature = API secret'ınızla HMAC-SHA256 (Developers → Webhooks altındaki Signing secret aynı değerdir)

ParametreYerTipAçıklama
x-signaturezorunluheaderstringHex HMAC-SHA256 of the canonical payload.
x-timestampzorunluheaderstringSend time, ISO 8601 (not signed).
x-noncezorunluheaderstringSame value as `jti`.
Idempotency-KeyzorunluheaderstringSame value as `jti`.
x-callback-eventzorunluheaderstringThe event type.
x-api-keyzorunluheaderstringThe workspace's integration API key. Not proof of origin — verify the signature.
Gövde alanıTipAçıklama
eventzorunlustring
externalUsernamezorunlustring
integrationIdzorunlustring
timestampzorunlustring
jtizorunlustring
deviceIdzorunlustring
platformzorunlu"ios" | "android"
appIdstring | null
pushTokenstring | nullThe APNs / FCM token your app handed to the SDK (`setPushToken`), or null.
kindzorunlu"approval" | "notice" | "test"`test`: a test push sent from the dashboard or POST /mobile/devices/{deviceId}/test-push.
requestIdstring | null
expiresAtstring | nullDrop the push after this.
alertobject | nullSuggested notification text (English); translate or replace it.
datazorunluobject
signaturezorunlustring
DurumAnlam
2XXAcknowledged.
defaultAny other status (or a timeout) is retried in-process, then dropped.
POSTcallback adresinizPasskey registered or deleted

`PASSKEY_REGISTERED` when `POST /webauthn/register/verify` stores a new passkey for the user; `PASSKEY_DELETED` when `DELETE /webauthn/credentials/{id}` removes one. Sent to the same `callbackUrl` as the device events, so a handler that switches on `event` should ignore types it does not know. Use it to tell the user, for example by e-mail: a passkey added through a stolen session is a lasting second factor.

Kimlik: Touchque gönderir, imzalı: x-signature = API secret'ınızla HMAC-SHA256 (Developers → Webhooks altındaki Signing secret aynı değerdir)

ParametreYerTipAçıklama
x-signaturezorunluheaderstringHex HMAC-SHA256 of the canonical payload.
x-timestampzorunluheaderstringSend time, ISO 8601 (not signed).
x-noncezorunluheaderstringSame value as `jti`.
Idempotency-KeyzorunluheaderstringSame value as `jti`.
x-callback-eventzorunluheader"PASSKEY_REGISTERED" | "PASSKEY_DELETED"The event type.
x-api-keyzorunluheaderstringThe workspace's integration API key. Not proof of origin — verify the signature.
Gövde alanıTipAçıklama
eventzorunlu"PASSKEY_REGISTERED" | "PASSKEY_DELETED"`PASSKEY_REGISTERED`: `POST /webauthn/register/verify` stored a new passkey for the user. `PASSKEY_DELETED`: `DELETE /webauthn/credentials/{id}` removed one. If the user did not add or remove it, treat it as a takeover.
externalUsernamezorunlustring
integrationIdzorunlustring
timestampzorunlustring
jtizorunlustring
idzorunlustringCredential record id, as in `GET /webauthn/credentials` and `DELETE /webauthn/credentials/{id}`.
credentialIdzorunlustring | nullbase64url WebAuthn credential id. `null` only on a `PASSKEY_DELETED` for a passkey removed at the same moment by another call.
deviceType"singleDevice" | "multiDevice" | null`PASSKEY_REGISTERED` only. `multiDevice`: a synced passkey (iCloud Keychain, Google Password Manager).
backedUpboolean`PASSKEY_REGISTERED` only: the passkey is backed up (synced) by its provider.
labelstring | null`PASSKEY_REGISTERED` only: the display label the passkey was stored with.
signaturezorunlustring
DurumAnlam
2XXAcknowledged.
defaultAny other status (or a timeout) is retried in-process, then dropped.
POSTcallback adresinizA recovery moved on (Never Locked Out)

Every step of a recovery started with `POST /recovery/start`: the new phone bound, the vouchers' quorum reached (cooling-off), the account moved (`RECOVERY_COMPLETED`, followed by `DEVICE_LINKED` with `via: recovery`), or it ended without a move (vetoed, expired, failed). Approvals on a voucher's or the old phone's recovery request never send a `loginResult`.

Kimlik: Touchque gönderir, imzalı: x-signature = API secret'ınızla HMAC-SHA256 (Developers → Webhooks altındaki Signing secret aynı değerdir)

ParametreYerTipAçıklama
x-signaturezorunluheaderstringHex HMAC-SHA256 of the canonical payload.
x-timestampzorunluheaderstringSend time, ISO 8601 (not signed).
x-noncezorunluheaderstringSame value as `jti`.
Idempotency-KeyzorunluheaderstringSame value as `jti`.
x-callback-eventzorunluheader"RECOVERY_STARTED" | "RECOVERY_DEVICE_BOUND" | "RECOVERY_COOLING" | "RECOVERY_COMPLETED" | "RECOVERY_VETOED" | "RECOVERY_EXPIRED" | "RECOVERY_FAILED"The event type.
x-api-keyzorunluheaderstringThe workspace's integration API key. Not proof of origin — verify the signature.
Gövde alanıTipAçıklama
eventzorunlu"RECOVERY_STARTED" | "RECOVERY_DEVICE_BOUND" | "RECOVERY_COOLING" | "RECOVERY_COMPLETED" | "RECOVERY_VETOED" | "RECOVERY_EXPIRED" | "RECOVERY_FAILED"
externalUsernamezorunlustring
integrationIdzorunlustring
timestampzorunlustring
jtizorunlustring
recoveryIdzorunlustring
statuszorunlustring
methodstring`RECOVERY_COMPLETED`: `vouch` or `old_phone`.
probationUntilstring | null`RECOVERY_COMPLETED` by vouch: critical actions are refused until then.
reasonstringEnded events: why.
signaturezorunlustring
DurumAnlam
2XXAcknowledged.
defaultAny other status (or a timeout) is retried in-process, then dropped.