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
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ı | Tip | Açıklama |
|---|---|---|
externalUsernamezorunlu | string | Your identifier for the user. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
ttlMs | integer |
| Durum | Anlam |
|---|---|
200 | Enrollment secret. |
400 | Missing or invalid request field. |
401 | Authentication 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). |
429 | Rate 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 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
externalUsernamezorunlu | string | Your identifier for the user. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
success | boolean | |
message | string |
| Durum | Anlam |
|---|---|
200 | New enrollment secret. |
400 | Missing or invalid request field. |
401 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
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ı | Tip | Açıklama |
|---|---|---|
requestIdzorunlu | string | A PENDING login request of this workspace. |
codezorunlu | string | One 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) | Tip | Açıklama |
|---|---|---|
success | boolean | |
message | string |
| Durum | Anlam |
|---|---|
200 | Request approved. |
400 | `requestId and code are required` or `Invalid or already used recovery code`. |
401 | Authentication 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`. |
429 | Too many recovery code attempts for this user (Retry-After), or WAF limit. |
500 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
externalUsernamezorunlu | string | Your identifier for the user (the one used at enrollment). |
typezorunlu | string | Action 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`). |
referenceId | string | null | Your own reference (order id, transaction id). Echoed in status, consume and webhooks. |
clientIp | string | null | The 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. |
userAgent | string | null | The end user's browser user agent. |
details | LoginDetailsInput | Transaction 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. |
requireBiometric | boolean | Require Face ID / Touch ID on the phone (verified server-side). |
requireNumberMatch | boolean | Force number matching (step-up) for this request. |
challengeDigits | 2 | 3 | Digits 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. |
context | ActionContext | Anything 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). |
securityChanges | object | When 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. |
destination | object | Where 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. |
expiresIn | integer | How 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). |
qrPairing | string | A 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`. |
reply | object | Ask 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. |
clientSignals | string | Is 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`). |
deviceRiskRequestId | string | Device 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. |
deviceRisk | object | Instead of deviceRiskRequestId: the page's report from `@touchque/web` `deviceRisk.collect()`, relayed untouched. |
browserProof | BrowserProof | Proof 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) | Tip | Açıklama |
|---|---|---|
message | string | `Request sent`, or `A previous request is already pending on the device.` when an identical pending request was reused. |
requestId | string | |
status | LoginStatus | Only present when an existing pending request was reused. |
challengeCode | string | Number 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. |
expiresAt | string | The request expires 30 seconds after creation (5 minutes with `reply`). |
requiresPasskey | boolean | Present (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`. |
caseCode | string | "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). |
reasons | RiskReason[] | Why number matching or a passkey is needed (from a fixed list, never a score); absent for a plain push. |
destination | object | Only with a `destination`: whether the user approved it before, and the destinations it looks like (also shown on the phone). |
telemetryToken | string | Bearer token for `POST /login/{requestId}/telemetry` (behavioral biometrics widget). Only on newly created requests of workspaces with behavioral biometrics enabled. |
canary | object | Mirror 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`. |
| Durum | Anlam |
|---|---|
200 | Request created (or an identical pending one reused). |
400 | `invalid_request` (missing `externalUsername` / `type`), `invalid_details`, `unknown_action`. |
401 | Authentication 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | Login request id. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
status | LoginStatus | A PENDING request past `expiresAt` is reported as EXPIRED. CONFIRMED is final and does not expire. |
externalUsername | string | Bound user — check it matches the user you are signing in. |
type | string | Action type slug the request was created with. |
referenceId | string | null | |
details | LoginDetails | Normalised transaction details (always the array form), or `null` when none were sent. |
expiresAt | string | |
consumed | boolean | Whether `POST /login/{id}/consume` already used this approval. |
confirmedVia | ConfirmedVia | How 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. |
pairing | object | Requests 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). |
requiresPasskey | boolean | Present (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`. |
assurance | Assurance | null | Only for CONFIRMED requests. |
approvalProof | ApprovalProof | null | Only for CONFIRMED requests approved by a hardware-bound phone. |
reply | object | CONFIRMED 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). |
provisional | boolean | Vishing 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. |
reconfirmedAt | string | null | When the phone re-confirmed a provisional approval after the call. |
revoked | boolean | The 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. |
| Durum | Anlam |
|---|---|
200 | Request status. |
401 | Authentication 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 | Rate 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | Login request id (`requestId`). |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
consumed | boolean | |
requestId | string | |
externalUsername | string | |
type | string | |
referenceId | string | null | |
details | LoginDetails | Normalised transaction details (always the array form), or `null` when none were sent. |
confirmedVia | ConfirmedVia | How 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. |
assurance | Assurance | What a partner can rely on for an approved request. Only a passkey is phishing-resistant (origin-bound). |
approvalProof | ApprovalProof | null | |
provisional | boolean | Vishing 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. |
reconfirmedAt | string | null | When the phone re-confirmed a provisional approval after the call. |
revoked | boolean | The 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. |
| Durum | Anlam |
|---|---|
200 | Approval consumed. |
400 | `invalid_request` — malformed id. |
401 | Authentication 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). |
429 | Rate 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | Login request id (`requestId`). |
| Durum | Anlam |
|---|---|
200 | The request's record. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | Login request id (`requestId`). |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
reason | "chargeback" | "account_takeover" | "social_engineering" | "other" | |
note | string |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
reported | boolean | |
alreadyReported | boolean | True when this request had already been reported (idempotent). |
requestId | string | |
trainingLabel | boolean | Whether 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. |
| Durum | Anlam |
|---|---|
200 | Reported. |
400 | `invalid_request`, `invalid_reason`, `invalid_note`. |
401 | Authentication 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ı)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
requestIdzorunlu | path | string | Login request id from `POST /login/request`. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
mouseDistance | number | |
mouseJitter | number | |
clicks | number | Clicks with a mouse or a pen (a tap and Enter on a button are not counted). |
touches | number | Touches: with these, no mouse movement is not a sign. |
keystrokes | number | |
keystrokeSpeedAvg | number | |
deviceSignals | object | Browser recognition signals. Stored only when the workspace enabled `TenantPolicy.deviceFingerprintingEnabled`; otherwise dropped. |
deviceFingerprint | string | v1 widget fingerprint (used only when `deviceSignals` is absent or invalid and fingerprinting is enabled). |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
accepted | boolean | False when the request is unknown, no longer PENDING, or processing failed. Telemetry is advisory and never fails the page. |
| Durum | Anlam |
|---|---|
200 | Processed (or ignored). |
401 | `TELEMETRY_TOKEN_REQUIRED` — missing `Authorization: Bearer` header. |
403 | `TELEMETRY_TOKEN_INVALID` (unknown, expired or wrong token) or `ORIGIN_NOT_ALLOWED`. |
429 | Rate 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. |
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ı | Tip | Açıklama |
|---|---|---|
externalUsernamezorunlu | string | |
typezorunlu | string | Action type slug or id (as in `POST /login/request`). |
details | LoginDetailsInput | Transaction 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. |
clientIp | string | null | |
userAgent | string | null | |
ttlSeconds | integer | |
requestId | string | The 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). |
requireNumberMatch | boolean | Add a 2-digit matching number (when no linked request supplies one). |
includeQrImage | boolean | Set false to skip rendering `qrDataUrl`. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
challengeId | string | |
qr | string | Text to render as a QR code (prefix `TQ2`), scanned by the user's phone. |
qrDataUrl | string | null | Ready-to-render PNG data URL of `qr`, or null (`includeQrImage: false` or rendering failed). |
expiresAt | string | |
expiresInSeconds | integer | |
totpAvailable | boolean | Whether the typed time-based code fallback (`POST /offline/totp/verify`) is enabled. |
challengeCode | string | Number matching: print this under the QR; the phone offers it among two decoys. |
| Durum | Anlam |
|---|---|
200 | Challenge created. |
400 | Missing/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`. |
401 | Authentication 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). |
423 | User's 2FA is frozen (`frozenUntil`). |
429 | `too_many_pending_challenges`, or the workspace quota / WAF limit. |
500 | `device_secret_unavailable` or unexpected error. |
503 | Offline 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ı | Tip | Açıklama |
|---|---|---|
externalUsernameszorunlu | string[] | Users × steps at most 24,000 a call (50 users for 4 hours, 1,000 for 12 minutes). |
fromStep | integer | First 30-second step (default: the current one; from the current step - 1). |
steps | integer | How many steps (default 480: 4 hours). The window ends at most 480 steps after the current one. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
stepSeconds | integer | |
fromStep | integer | |
steps | integer | |
notAfterStep | integer | |
kdf | object | |
users | object[] | Only users who can use time-based codes now (a linked phone set up for offline codes, approvals not frozen). |
| Durum | Anlam |
|---|---|
200 | The digests. |
400 | `externalUsernames: 1 to 50 user names`, or `steps` / `fromStep` out of range. |
401 | Authentication 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. |
429 | The workspace quota. |
500 | Unexpected server error. |
503 | Offline 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ı | Tip | Açıklama |
|---|---|---|
externalUsernamezorunlu | string | |
codezorunlu | string | The rolling 7-character code from the app (same alphabet as `/offline/verify`). |
type | string | Action 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. |
requestId | string | Linked push login request; a REJECTED one is refused (410). |
clientIp | string | End-user IP (logging only). |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
approved | boolean | |
externalUsername | string |
| Durum | Anlam |
|---|---|
200 | Code 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. |
500 | Unexpected server error. |
503 | Offline 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ı | Tip | Açıklama |
|---|---|---|
challengeIdzorunlu | string | |
codezorunlu | string | 7 characters from `ABCDEFGHJKLMNPQRSTUVWXYZ23456789` shown by the phone; case-insensitive, spaces and hyphens ignored. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
approved | boolean | |
challengeId | string | |
externalUsername | string | |
type | string |
| Durum | Anlam |
|---|---|
200 | Code accepted. |
400 | `challengeId is required` / `code is required`. |
401 | Wrong 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. |
500 | Unexpected server error. |
503 | Offline sign is not configured on this server (`offline_sign_not_configured`). |
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ı | Tip | Açıklama |
|---|---|---|
nonceHashzorunlu | string | base64url 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. |
keyThumbprintzorunlu | string | RFC 7638 thumbprint of the browser's own non-extractable key: the pairing binds to exactly that browser. |
clientIp | string | null | The browser's address: shown on the phone with its place, and compared with the phone's. |
userAgent | string | null | |
browser | string | null | What the phone names the browser, e.g. `Chrome 155`. |
os | string | null | Its operating system, e.g. `macOS`. |
ttlSeconds | integer | How long the code can be scanned. |
| Yanıt alanı (201) | Tip | Açıklama |
|---|---|---|
pairingId | string | |
expiresAt | string |
| Durum | Anlam |
|---|---|
201 | Registered. |
400 | `invalid_request`. |
401 | Authentication 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`. |
500 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | Pairing id. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
pairingId | string | |
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). |
keyThumbprint | string | |
expiresAt | string | |
externalUsername | string | Once scanned: the account the phone holds with your workspace. |
scannedAt | string | |
confirmedAt | string | null | |
phone | object | |
browser | object | |
proximity | object | How near the phone that scanned was to the browser: each `true`, `false` or `null` (cannot be told, e.g. a private address). |
requestId | string | null | |
outcome | object | |
reportedAt | string |
| Durum | Anlam |
|---|---|
200 | The pairing. |
401 | Authentication 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 | Authentication 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). |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | Pairing id. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
reasonzorunlu | "policy" | "device_not_approved" | "too_many_browsers" | "rate_limited" | "no_account" | "other" | |
messagezorunlu | string | What the phone shows. |
caseCode | string | null | Your own case code for the refusal, shown on the phone. |
deviceCode | string | null | The computer's code an administrator approves (`K7Q-2PD`). |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
pairingId | string | |
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). |
keyThumbprint | string | |
expiresAt | string | |
externalUsername | string | Once scanned: the account the phone holds with your workspace. |
scannedAt | string | |
confirmedAt | string | null | |
phone | object | |
browser | object | |
proximity | object | How near the phone that scanned was to the browser: each `true`, `false` or `null` (cannot be told, e.g. a private address). |
requestId | string | null | |
outcome | object | |
reportedAt | string |
| Durum | Anlam |
|---|---|
200 | Refused. |
400 | `invalid_request`. |
401 | Authentication 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 | Authentication 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. |
429 | Rate 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 | Unexpected server error. |
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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
externalUsername | query | string | Your identifier for the user. |
open | query | "true" | "false" | `true`: only running recoveries. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
recoveries | Recovery[] |
| Durum | Anlam |
|---|---|
200 | Recoveries. |
400 | `invalid_request` — pass `externalUsername` or `open=true`. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
externalUsernamezorunlu | string | |
clientIp | string | The user's IP address (what the risk engine and the vouchers see). |
userAgent | string | |
displayName | string | How the vouchers know the user ("Ada Lovelace"). |
fallbackVouchers | string[] | Fill up a short named list, e.g. with the organization's admins. Never instead of the named vouchers. |
required | integer | More vouchers than the floor of 2. |
coolOffMinutes | integer | A longer cooling-off than the floor (15 minutes; default 60). |
details | LoginDetail[] | What the vouchers' phones show instead of the default English lines. |
noticeDetails | LoginDetail[] | What the old phone shows (approve to move now, reject to stop) instead of the default English lines. |
| Yanıt alanı (201) | Tip | Açıklama |
|---|---|---|
bindCode | string | One-time; shown once. |
bindUri | string | Show it as a QR for the Touchque app on the new phone: `touchque://recover?id=…&code=…`. |
riskContext | object |
| Durum | Anlam |
|---|---|
201 | Started; waiting for the new phone. |
400 | `invalid_request`, `invalid_details`. |
401 | Authentication 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. |
500 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
externalUsernamezorunlu | query | string | Your identifier for the user. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
externalUsername | string | |
vouchers | RecoveryVoucherEligibility[] | |
updatedAt | string | null | |
probationUntil | string | null | The user's own account is on probation after a vouch recovery until then. |
| Durum | Anlam |
|---|---|
200 | The vouchers. |
400 | `invalid_request` — missing `externalUsername`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
externalUsernamezorunlu | string | |
voucherszorunlu | string[] | Other users of this workspace; at most 5 are kept. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
externalUsername | string | |
vouchers | RecoveryVoucherEligibility[] | |
updatedAt | string | null | |
probationUntil | string | null | The user's own account is on probation after a vouch recovery until then. |
| Durum | Anlam |
|---|---|
200 | The vouchers as stored. |
400 | `invalid_request`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The recovery id. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
recoveryId | string | |
externalUsername | string | |
method | "vouch" | "old_phone" | "transfer" | |
status | "AWAITING_DEVICE" | "VOUCHING" | "COOLING" | "COMPLETED" | "VETOED" | "EXPIRED" | "FAILED" | |
required | integer | |
approvals | integer | |
vouchers | RecoveryVoucherState[] | |
oldPhone | object | |
coolOffMinutes | integer | |
coolOffUntil | string | null | |
elevated | boolean | |
reasons | "risk_engine_unavailable" | "risk_hard_signals" | "risk_challenge" | "recent_fraud_report" | "recent_recovery" | "vouchers_recently_changed"[] | |
location | string | null | |
newPhoneBound | boolean | |
expiresAt | string | |
completedAt | string | null | |
endedReason | string | null | e.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`. |
endedBy | string | null | |
createdAt | string | |
receipts | RecoveryReceipt[] |
| Durum | Anlam |
|---|---|
200 | The recovery. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The recovery id. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
by | string | Who stopped it (shown in the receipts), e.g. the admin's e-mail. |
reason | string | Default `partner_veto`. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
recoveryId | string | |
externalUsername | string | |
method | "vouch" | "old_phone" | "transfer" | |
status | "AWAITING_DEVICE" | "VOUCHING" | "COOLING" | "COMPLETED" | "VETOED" | "EXPIRED" | "FAILED" | |
required | integer | |
approvals | integer | |
vouchers | RecoveryVoucherState[] | |
oldPhone | object | |
coolOffMinutes | integer | |
coolOffUntil | string | null | |
elevated | boolean | |
reasons | "risk_engine_unavailable" | "risk_hard_signals" | "risk_challenge" | "recent_fraud_report" | "recent_recovery" | "vouchers_recently_changed"[] | |
location | string | null | |
newPhoneBound | boolean | |
expiresAt | string | |
completedAt | string | null | |
endedReason | string | null | e.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`. |
endedBy | string | null | |
createdAt | string | |
receipts | RecoveryReceipt[] |
| Durum | Anlam |
|---|---|
200 | Vetoed. |
401 | Authentication 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 | Authentication 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. |
429 | Rate 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 | Unexpected server error. |
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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
externalUsername | query | string | The person. |
open | query | "true" | "false" | `true`: open ones only. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
sessions | AssistSession[] |
| Durum | Anlam |
|---|---|
200 | Sessions. |
400 | `invalid_request` — pass `externalUsername` or `open=true`. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
externalUsernamezorunlu | string | The person IT is helping. |
agentzorunlu | object | |
reason | string | A ticket or a few words, for the log. |
ttlMinutes | integer | Default 30. |
notify | boolean | Send the person's phone the notice "<agent> from IT is working on your account now" (nothing to approve). Default true. |
| Yanıt alanı (201) | Tip | Açıklama |
|---|---|---|
id | string | |
externalUsername | string | |
status | "OPEN" | "ENDED" | |
agent | object | |
reason | string | null | |
notified | boolean | |
openedAt | string | |
expiresAt | string | |
endedAt | string | null | |
endedReason | string | null | E.g. `ended`, `expired`, `replaced`. |
phone | boolean | The person has a working Touchque phone to check on. `false`: they move to a new phone with Never Locked Out. |
frozen | boolean | Their approvals are frozen (see `POST /assist/{id}/unfreeze`). |
checks | AssistCheck[] |
| Durum | Anlam |
|---|---|
201 | Open. |
400 | `invalid_request`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The assist session id. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
id | string | |
externalUsername | string | |
status | "OPEN" | "ENDED" | |
agent | object | |
reason | string | null | |
notified | boolean | |
openedAt | string | |
expiresAt | string | |
endedAt | string | null | |
endedReason | string | null | E.g. `ended`, `expired`, `replaced`. |
phone | boolean | The person has a working Touchque phone to check on. `false`: they move to a new phone with Never Locked Out. |
frozen | boolean | Their approvals are frozen (see `POST /assist/{id}/unfreeze`). |
checks | AssistCheck[] |
| Durum | Anlam |
|---|---|
200 | The session. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The assist session id. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
by | string | |
reason | string |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
id | string | |
externalUsername | string | |
status | "OPEN" | "ENDED" | |
agent | object | |
reason | string | null | |
notified | boolean | |
openedAt | string | |
expiresAt | string | |
endedAt | string | null | |
endedReason | string | null | E.g. `ended`, `expired`, `replaced`. |
phone | boolean | The person has a working Touchque phone to check on. `false`: they move to a new phone with Never Locked Out. |
frozen | boolean | Their approvals are frozen (see `POST /assist/{id}/unfreeze`). |
checks | AssistCheck[] |
| Durum | Anlam |
|---|---|
200 | Ended. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The assist session id. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
requestIdzorunlu | string | |
actionzorunlu | string | What 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) | Tip | Açıklama |
|---|---|---|
id | string | |
externalUsername | string | |
status | "OPEN" | "ENDED" | |
agent | object | |
reason | string | null | |
notified | boolean | |
openedAt | string | |
expiresAt | string | |
endedAt | string | null | |
endedReason | string | null | E.g. `ended`, `expired`, `replaced`. |
phone | boolean | The person has a working Touchque phone to check on. `false`: they move to a new phone with Never Locked Out. |
frozen | boolean | Their approvals are frozen (see `POST /assist/{id}/unfreeze`). |
checks | AssistCheck[] |
| Durum | Anlam |
|---|---|
200 | Used. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The assist session id. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
requestIdzorunlu | string |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
unfrozen | boolean | |
session | AssistSession | IT 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. |
| Durum | Anlam |
|---|---|
200 | Done. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The assist session id. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
actionzorunlu | string | What the help desk is about to do, in your words: `reset_2fa`, `reset_password`, `activation_link`, `recovery_link`, `unlock`, `new_phone`, `remove_passkey`, ... |
actionText | string | Shown on the phone: "IT (<agent>) is about to <actionText>". Default `action` with spaces. |
details | object[] | Your own lines for the phone instead of the default (who, about to, why, is that you?). |
| Yanıt alanı (201) | Tip | Açıklama |
|---|---|---|
requestId | string | |
challengeCode | string | Show it to the agent only: they read it to the person on the call, who types it on the phone. |
expiresAt | string | |
action | string |
| Durum | Anlam |
|---|---|
201 | Sent. |
400 | `invalid_request`, `invalid_details`. |
401 | Authentication 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 | Authentication 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. |
500 | Unexpected server error. |
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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
externalUsernamezorunlu | query | string | Your identifier for the user. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
browsers | BrowserKeyInfo[] |
| Durum | Anlam |
|---|---|
200 | Known browsers. |
400 | `invalid_request` — missing `externalUsername`. |
401 | Authentication 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. 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ı | Tip | Açıklama |
|---|---|---|
externalUsernamezorunlu | string | |
thumbprint | string | One browser; omitted: all of the user's browsers. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
forgotten | integer | How many browsers were forgotten. |
| Durum | Anlam |
|---|---|
200 | Forgotten. |
400 | `invalid_request` — missing `externalUsername` or a malformed `thumbprint`. |
401 | Authentication 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. 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ı | Tip | Açıklama |
|---|---|---|
externalUsernamezorunlu | string | Your identifier for the user. |
type | string | Action 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`. |
clientIp | string | null | The END USER's IP address. Without it the network cannot be compared with earlier sign-ins and the answer is `prompt: true`. |
userAgent | string | null | The end user's browser user agent. |
clientSignals | string | Is 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`). |
deviceRiskRequestId | string | Device 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. |
deviceRisk | object | Instead of deviceRiskRequestId: the page's report from `@touchque/web` `deviceRisk.collect()`, relayed untouched. |
browserProof | BrowserProof | Proof 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. |
maxAgeSeconds | integer | Your 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. |
context | ActionContext | Anything 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) | Tip | Açıklama |
|---|---|---|
prompt | boolean | `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`. |
reasons | RiskReason[] | 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. |
caseCode | string | "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). |
| Durum | Anlam |
|---|---|
200 | The answer. |
400 | `invalid_request` (missing `externalUsername`, bad `type` or `maxAgeSeconds`) or `unknown_action`. |
401 | Authentication 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. |
429 | Rate 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 | Unexpected server error. |
GET/device-risk/accounts/{externalUsername}The visitorIds an account used
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
externalUsernamezorunlu | path | string | The account. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
externalUsername | string | |
visitors | DeviceRiskVisitor[] |
| Durum | Anlam |
|---|---|
200 | Its visitors, newest first. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected server error. |
DELETE/device-risk/accounts/{externalUsername}Delete one person's identifications
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
externalUsernamezorunlu | path | string | The account. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
reports | integer | |
visitors | integer |
| Durum | Anlam |
|---|---|
200 | What was deleted (visitors left with none go too; the account leaves the engine's counters). |
400 | `invalid_request`. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
requestId | string | null | As 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. |
deviceRisk | DeviceRiskReport | The 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`. |
externalUsername | string | The account the page is for, when there is one (accounts per visitor). |
clientIp | string | The end user's address; default: the address the browser identified from. |
| Yanıt alanı (200) | Tip | Açı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. |
requestId | string | null | |
visitorId | string | null | |
confidence | number | null | |
visitor | object | null | |
counts | object | null | The engine's counts for this visitor: accounts_24h, accounts_30d, signups_24h, countries_24h, resets_7d. |
network | DeviceRiskNetwork | The 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. |
velocity | DeviceRiskVelocity | This visitor's counts: accounts, sign-ups, countries and stored-id resets (the risk engine's), identifications (Touchque's). null for a count not known. |
bot | DeviceRiskBot | One 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). |
signals | DeviceRiskVerdictSignal[] | |
stepUp | boolean | Ask 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`). |
wouldStepUp | boolean | |
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. |
caseCode | string | "Why?": the decision record, opened by this code in the dashboard. |
| Durum | Anlam |
|---|---|
200 | The visitor and the engine's verdict. |
400 | `invalid_request`: an unknown `event` or a bad `externalUsername`. |
401 | Authentication 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 | Authentication 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. |
429 | Rate 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 | Unexpected server error. |
POST/device-risk/delete-allDelete every visitor
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Gövde alanı | Tip | Açıklama |
|---|---|---|
confirmzorunlu | string |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
deleted | integer |
| Durum | Anlam |
|---|---|
200 | How many were deleted. |
400 | `invalid_request`. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
from | query | string | Start: YYYY-MM-DD (UTC) or an ISO time. Default: 7 days before `to`. |
to | query | string | End: YYYY-MM-DD (UTC, the whole day) or an ISO time. Default: now. |
signal | query | string | Only identifications that raised this signal code. |
stepUp | query | boolean | `true`: only the ones that asked for more; `false`: only the others. |
kind | query | "sign_in" | "sign_up" | "password_reset" | "approval" | The page. |
origin | query | string | The page's origin, like https://shop.example.com. |
ip | query | string | An 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`. |
account | query | string | The account (externalUsername). |
visitorId | query | string | One visitor (`tqv_…`). |
requestId | query | string | One identification (`dre_…`). |
cursor | query | string | The `nextCursor` of the previous page (opaque). |
limit | query | integer | 1 to 100, default 25. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
events | DeviceRiskIdentification[] | |
nextCursor | string | null | |
from | string | |
to | string | |
signalTexts | object |
| Durum | Anlam |
|---|---|
200 | A page. |
400 | A 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`… |
401 | Authentication 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 | Authentication 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. |
500 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
requestIdzorunlu | path | string | From deviceRisk.identify(). |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
requestId | string | |
visitorId | string | |
confidence | number | |
matchedBy | "key" | "sid" | "traits" | "new" | |
sealed | boolean | |
purpose | "sign_in" | "sign_up" | "password_reset" | "approval" | |
origin | string | null | The page origin the report was made on. |
country | string | null | |
createdAt | string | |
usedAt | string | null | |
externalUsername | string | null | The account it was used for (one per identification). |
visitor | object | firstSeenAt, lastSeenAt, seenCount, status (your admin's mark), coarse labels. |
facts | object | What the page showed: codes, evidence (finding names), reset, twins, privateWindow. |
verdict | object | null | The risk engine's answer: stepUp, requires, mode, signals (each enforced or not), caseCode. |
network | DeviceRiskNetwork | The 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. |
velocity | DeviceRiskVelocity | This visitor's counts: accounts, sign-ups, countries and stored-id resets (the risk engine's), identifications (Touchque's). null for a count not known. |
bot | DeviceRiskBot | One 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). |
| Durum | Anlam |
|---|---|
200 | The identification. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
from | query | string | First day (YYYY-MM-DD, UTC): visitors seen since, with that range's identifications. |
to | query | string | Last day (YYYY-MM-DD, UTC). |
format | query | "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) | Tip | Açıklama |
|---|---|---|
exportedAt | string | |
from | string | null | |
to | string | null | |
visitors | object[] | |
truncated | boolean | |
stopped | boolean | Present (true) only when the export failed midway: the document is incomplete. |
| Durum | Anlam |
|---|---|
200 | No keyed hashes and no addresses. |
401 | Authentication 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 | Authentication 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. |
500 | Unexpected 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
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
X-Touchque-Proxy-Secret | header | string | Your first-party proxy only (server-side, never in the page). |
X-Touchque-Client-IP | header | string | The visitor's address; read only with a valid `X-Touchque-Proxy-Secret`. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
requestId | string | |
at | string | |
visitorId | string | |
kind | "sign_in" | "sign_up" | "password_reset" | "approval" | |
origin | string | null | The page's origin. |
externalUsername | string | null | |
country | string | null | |
network | object | null | The address as the risk engine saw it: place (no coordinates), operator, kind of network. |
confidence | number | null | |
matchedBy | "key" | "sid" | "traits" | "new" | null | |
sealed | boolean | |
stepUp | boolean | |
signals | object[] | |
caseCode | string | null | |
bot | object |
| Durum | Anlam |
|---|---|
200 | The 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)
| Durum | Anlam |
|---|---|
200 | Counts for the last 30 days (signals: 7 days); trend30d per UTC day. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
limit | query | integer |
| Durum | Anlam |
|---|---|
200 | { events, signalTexts }. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected server error. |
GET/device-risk/settingsDevice risk settings
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
enabled | boolean | Off by default. |
retentionDays | integer | |
retentionRange | object | |
siteKey | string | null | Public: the web SDK's deviceRisk.identify() sends it. Issued when Device risk is first turned on. |
origins | string[] | Page origins that may identify, besides pages on your organization's verified domains and their subdomains (Organization → Domains). |
pages | string[] | |
signals | DeviceRiskSignal[] | |
alerts | DeviceRiskAlerts | Alerts: 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. |
alertRules | object[] | Each rule: id, label, unit, min, max and the default threshold. |
alertDelivery | object | |
verifiedDomains | array | null | Your organization's verified domains (Organization → Domains); null when they cannot be read. |
offDomainOrigins | string[] | Origins on none of the verified domains: allowed, only pointed out. |
firstParty | object | null | The 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. |
proxySecret | string | Owners, 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. |
| Durum | Anlam |
|---|---|
200 | The settings. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
enabled | boolean | |
retentionDays | integer | |
origins | string[] | |
alerts | DeviceRiskAlerts | Alerts: 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) | Tip | Açıklama |
|---|---|---|
enabled | boolean | Off by default. |
retentionDays | integer | |
retentionRange | object | |
siteKey | string | null | Public: the web SDK's deviceRisk.identify() sends it. Issued when Device risk is first turned on. |
origins | string[] | Page origins that may identify, besides pages on your organization's verified domains and their subdomains (Organization → Domains). |
pages | string[] | |
signals | DeviceRiskSignal[] | |
alerts | DeviceRiskAlerts | Alerts: 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. |
alertRules | object[] | Each rule: id, label, unit, min, max and the default threshold. |
alertDelivery | object | |
verifiedDomains | array | null | Your organization's verified domains (Organization → Domains); null when they cannot be read. |
offDomainOrigins | string[] | Origins on none of the verified domains: allowed, only pointed out. |
firstParty | object | null | The 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. |
proxySecret | string | Owners, 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. |
| Durum | Anlam |
|---|---|
200 | The settings. |
400 | `invalid_request`. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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) | Tip | Açıklama |
|---|---|---|
enabled | boolean | Off by default. |
retentionDays | integer | |
retentionRange | object | |
siteKey | string | null | Public: the web SDK's deviceRisk.identify() sends it. Issued when Device risk is first turned on. |
origins | string[] | Page origins that may identify, besides pages on your organization's verified domains and their subdomains (Organization → Domains). |
pages | string[] | |
signals | DeviceRiskSignal[] | |
alerts | DeviceRiskAlerts | Alerts: 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. |
alertRules | object[] | Each rule: id, label, unit, min, max and the default threshold. |
alertDelivery | object | |
verifiedDomains | array | null | Your organization's verified domains (Organization → Domains); null when they cannot be read. |
offDomainOrigins | string[] | Origins on none of the verified domains: allowed, only pointed out. |
firstParty | object | null | The 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. |
proxySecret | string | Owners, 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. |
| Durum | Anlam |
|---|---|
200 | The settings. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
days | query | 30 | 90 | 365 | 30, 90 or 365 (default 30). |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
days | integer | |
points | object[] |
| Durum | Anlam |
|---|---|
200 | { days, points }. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
filter | query | "all" | "flagged" | "marked" | `flagged`: a signal in the last 7 days; `marked`: trusted or step up. |
signal | query | string | Only visitors flagged with this signal code in the last 7 days (`device_tampered`, `device_many_accounts`…). |
q | query | string | A 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. |
cursor | query | string | The `nextCursor` of the previous page. |
limit | query | integer | 1 to 100, default 25. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
visitors | DeviceRiskVisitor[] | |
nextCursor | string | null | |
truncated | boolean | The search matched more visitors than one answer looks at. |
signalTexts | object |
| Durum | Anlam |
|---|---|
200 | A page of visitors. |
400 | `cidr_too_broad`: a range wider than /16 for IPv4 or /48 for IPv6. |
401 | Authentication 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 | Authentication 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. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
visitorIdzorunlu | path | string | The visitor's id (`tqv_…`). |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
visitor | DeviceRiskVisitor |
| Durum | Anlam |
|---|---|
200 | The visitor. |
401 | Authentication 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 | Authentication 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. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
visitorIdzorunlu | path | string | The visitor's id (`tqv_…`). |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
forgotten | boolean |
| Durum | Anlam |
|---|---|
200 | Forgotten, here and in the risk engine's counters. |
401 | Authentication 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 | Authentication 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. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
visitorIdzorunlu | path | string | The visitor's id (`tqv_…`). |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
statuszorunlu | "none" | "trusted" | "step_up" |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
visitor | DeviceRiskVisitor |
| Durum | Anlam |
|---|---|
200 | The visitor. |
400 | `invalid_request`. |
401 | Authentication 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 | Authentication 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. |
429 | Rate 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 | Unexpected server error. |
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ı | Tip | Açıklama |
|---|---|---|
externalUsernamezorunlu | string | |
typezorunlu | string | An action type you defined. |
safeTxzorunlu | SafeTx | A 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. |
referenceId | string | null | |
expiresIn | integer | |
clientIp | string | null | |
userAgent | string | null |
| Durum | Anlam |
|---|---|
200 | The request: requestId, challengeCode and how the server classed the transaction (class, flags, hashes, rows). |
400 | `invalid_request` or `invalid_safe_tx`. |
401 | Authentication 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. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The requestId. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
status | "PENDING" | "CONFIRMED" | "REJECTED" | "EXPIRED" | |
safeTx | SafeGuardApprovalResult | What the guard gets once approved. |
| Durum | Anlam |
|---|---|
200 | { requestId, externalUsername, status, provisional, safeTx }. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Durum | Anlam |
|---|---|
200 | { approvers: [{ externalUsername, platform, cryptoKey, registeredAt }] }. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
chainIdzorunlu | integer | |
ownerszorunlu | string[] | |
thresholdzorunlu | integer | |
locale | "tr" | "en" |
| Durum | Anlam |
|---|---|
200 | { tx: { to, value, data }, predicted, rows, dataHash, saltNonce, contracts }. |
400 | `invalid_request` or `invalid_safe_tx`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
safeId | query | string | Only this Safe. |
status | query | "PENDING" | "CONFIRMED" | "REJECTED" | "EXPIRED" | "REFUSED" | PENDING, CONFIRMED, REJECTED, EXPIRED or REFUSED. |
cursor | query | string | nextCursor of the previous page. |
limit | query | integer | At most 100. |
| Durum | Anlam |
|---|---|
200 | { approvals, refused, nextCursor }; each approval with its case code. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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) | Tip | Açıklama |
|---|---|---|
safes | SafeGuardSafe[] |
| Durum | Anlam |
|---|---|
200 | { safes, activity: { days, refused }, networks: [{ chainId, name, test, available, guard, reason }] }. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
chainIdzorunlu | integer | |
safezorunlu | string | |
guard | string | Optional; if given, it must be Touchque's guard on this network (`guard_mismatch` otherwise). |
namezorunlu | string |
| Yanıt alanı (201) | Tip | Açıklama |
|---|---|---|
safe | SafeGuardSafe |
| Durum | Anlam |
|---|---|
201 | { safe }. |
400 | `invalid_request` or `invalid_safe_tx`. |
401 | Authentication 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 | Authentication 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). |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The Safe's id in Safe Guard. |
fresh | query | "1" | 1: read the chain now, not the 30-second cache. |
| Durum | Anlam |
|---|---|
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). |
401 | Authentication 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 | Authentication 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. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The Safe's id in Safe Guard. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
name | string | |
policy | SafeGuardPolicy | Touchque's limits on top of the guard, checked before any phone is asked (`over_limit`). The guard does not know them. |
| Durum | Anlam |
|---|---|
200 | { safe }. |
400 | `invalid_request` or `invalid_safe_tx`. |
401 | Authentication 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 | Authentication 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. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The Safe's id in Safe Guard. |
| Durum | Anlam |
|---|---|
204 | Removed. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The Safe's id in Safe Guard. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
externalUsernamezorunlu | string |
| Durum | Anlam |
|---|---|
200 | As POST /safe-guard/approvals. |
400 | `invalid_request` or `invalid_safe_tx`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The Safe's id in Safe Guard. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
kindzorunlu | "setup" | "install" | "remove_guard" | "add_recipient" | "remove_recipient" | "lock" | "thresholds" | "delays" | "add_approver" | "remove_approver" | "test" | |
args | object | |
locale | "tr" | "en" |
| Durum | Anlam |
|---|---|
200 | { tx, class, flags, rows, safeTxHash, governanceHash, domainHash, messageHash, needsPhones }. |
400 | `invalid_request` or `invalid_safe_tx`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/safe-guard/safes/{id}/proposalsThe Safe's latest proposals
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The Safe's id in Safe Guard. |
| Durum | Anlam |
|---|---|
200 | { proposals }. |
401 | Authentication 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 | Authentication 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. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The Safe's id in Safe Guard. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
kindzorunlu | "install" | |
argszorunlu | object | { approvers: [crypto keys], threshold, govThreshold, govDelay, exitDelay, book?: [{ address, label }], lock? } |
| Durum | Anlam |
|---|---|
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`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The Safe's id in Safe Guard. |
pidzorunlu | path | string | The proposal's id. |
| Durum | Anlam |
|---|---|
200 | { proposal }. |
401 | Authentication 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 | Authentication 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. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The Safe's id in Safe Guard. |
pidzorunlu | path | string | The proposal's id. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
externalUsernamezorunlu | string |
| Durum | Anlam |
|---|---|
200 | As POST /safe-guard/approvals. |
400 | `invalid_request` or `invalid_safe_tx`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The Safe's id in Safe Guard. |
pidzorunlu | path | string | The proposal's id. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
signaturezorunlu | string |
| Durum | Anlam |
|---|---|
200 | { proposal }. |
400 | `bad_signature`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The Safe's id in Safe Guard. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
kindzorunlu | "setup" | "install" | "remove_guard" | "add_recipient" | "remove_recipient" | "lock" | "thresholds" | "delays" | "add_approver" | "remove_approver" | "test" | |
args | object | |
externalUsernamezorunlu | string | |
locale | "tr" | "en" |
| Durum | Anlam |
|---|---|
200 | As POST /safe-guard/approvals. |
400 | `invalid_request` or `invalid_safe_tx`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The Safe's id in Safe Guard. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
governanceHashzorunlu | string | |
externalUsernamezorunlu | string |
| Durum | Anlam |
|---|---|
200 | As POST /safe-guard/approvals. |
400 | `invalid_request` or `invalid_safe_tx`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
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) | Tip | Açıklama |
|---|---|---|
enabled | boolean | Passkey sign-in (`TenantPolicy.passwordlessLoginEnabled`) is on: show the passkey button and passkey autofill. Off: show neither. |
userVerification | "required" | "preferred" | null | What the options will ask of the authenticator; null when off. |
| Durum | Anlam |
|---|---|
200 | Whether passkey sign-in is on. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
externalUsername | string | The account to sign in. Leave it out for passkey autofill: any passkey of the site. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
attemptId | string | Pass back to `/webauthn/authenticate/primary/verify` (valid 5 minutes, single use). |
options | PublicKeyCredentialRequestOptionsJSON | WebAuthn authentication options as produced by `@simplewebauthn/server` `generateAuthenticationOptions` (pass to `navigator.credentials.get`). |
| Durum | Anlam |
|---|---|
200 | Attempt id and authentication options. |
400 | `externalUsername must be a string`. |
401 | Authentication 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. |
429 | Rate 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 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
attemptIdzorunlu | string | |
responsezorunlu | WebAuthnCredentialResponseJSON | The browser's `PublicKeyCredential` serialised to JSON (`RegistrationResponseJSON` / `AuthenticationResponseJSON` from `@simplewebauthn/browser`), relayed unchanged by your backend. |
| Durum | Anlam |
|---|---|
200 | Signed in, or step-up required. |
400 | Missing fields, `Login session not found or expired`, `Verification failed` (+`message`), `Login could not be verified`. |
401 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
externalUsernamezorunlu | query | string | The user. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
credentials | WebAuthnCredentialSummary[] |
| Durum | Anlam |
|---|---|
200 | Credentials. |
400 | `externalUsername query parameter is required`. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | Credential record `id` from `GET /webauthn/credentials` (not the WebAuthn `credentialId`). |
externalUsernamezorunlu | query | string | The user the passkey belongs to. Required since 3.3.0: a credential of another user is `404`. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
deleted | boolean |
| Durum | Anlam |
|---|---|
200 | Deleted. |
400 | `externalUsername is required`. |
401 | Authentication 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`. |
429 | Rate 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 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
requestIdzorunlu | string | A PENDING login request of this workspace. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
challenge | string | base64url |
rpId | string | |
allowCredentials | object[] | |
userVerification | "required" | "preferred" | |
timeout | integer |
| Durum | Anlam |
|---|---|
200 | Authentication options. |
400 | Missing or invalid request field. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
requestIdzorunlu | string | |
responsezorunlu | WebAuthnCredentialResponseJSON | The browser's `PublicKeyCredential` serialised to JSON (`RegistrationResponseJSON` / `AuthenticationResponseJSON` from `@simplewebauthn/browser`), relayed unchanged by your backend. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
success | boolean | |
message | string | |
externalUsername | string | The user that was approved — open the session for this user, never for a name the browser sent. |
requestId | string |
| Durum | Anlam |
|---|---|
200 | Request approved. |
400 | Missing fields, `Login session not found or expired`, `Verification failed` (+`message`), `Login could not be verified`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
externalUsernamezorunlu | string | |
discoverable | boolean | Register a resident (discoverable) credential with a stable WebAuthn user handle — needed for passwordless sign-in. |
approvalRequestId | string | Required 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) | Tip | Açıklama |
|---|---|---|
challenge | string | base64url |
rp | object | |
user | object | |
pubKeyCredParams | object[] | |
timeout | integer | |
excludeCredentials | object[] | |
authenticatorSelection | object | |
attestation | "none" | "direct" | `direct` only when `TenantPolicy.requireVerifiedAuthenticator` is on. |
| Durum | Anlam |
|---|---|
200 | Registration options. |
400 | Missing or invalid request field. |
401 | Authentication 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`. |
429 | Rate 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 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
externalUsernamezorunlu | string | |
responsezorunlu | WebAuthnCredentialResponseJSON | The browser's `PublicKeyCredential` serialised to JSON (`RegistrationResponseJSON` / `AuthenticationResponseJSON` from `@simplewebauthn/browser`), relayed unchanged by your backend. |
label | string | Display 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) | Tip | Açıklama |
|---|---|---|
verified | boolean | |
credentialId | string | base64url WebAuthn credential id. |
| Durum | Anlam |
|---|---|
200 | Credential registered. |
400 | Missing fields, `Registration session not found or expired`, `Verification failed` (+`message`), `Registration could not be verified`, or `unverified_authenticator`. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected server error. |
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)
| Durum | Anlam |
|---|---|
200 | Action types. |
401 | Authentication 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. 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ı | Tip | Açıklama |
|---|---|---|
typezorunlu | string | |
namezorunlu | string | |
description | string | Only updated when sent. |
critical | boolean | Only updated when sent; defaults to false on create. |
secondThought | object | null | Only updated when sent; null turns them off. Second Thought questions the phone asks before Approve (see ActionType.secondThought). |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
id | string | |
integrationId | string | |
type | string | Slug used as `type` in `POST /login/request`. |
name | string | Display name on the approval screen. |
description | string | null | |
icon | string | null | |
critical | boolean | Critical actions always use number matching, refuse recovery codes (unless `TenantPolicy.allowRecoveryForCritical`) and are refused by the offline TOTP fallback. |
active | boolean | Disabled types (Dashboard) answer 403 `action_disabled`. |
secondThought | object | null | Second 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. |
createdAt | string | |
updatedAt | string |
| Durum | Anlam |
|---|---|
200 | The stored action type. |
400 | `invalid_request`. |
401 | Authentication 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. 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/actionsList Actions
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
actions | Action[] |
| Durum | Anlam |
|---|---|
200 | Actions. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
trigger | ActionTrigger | Where 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. |
code | string | |
template | ActionTemplateRef | |
slug | string | |
replaces | string | |
secrets | string[] | |
allowedHosts | string[] | |
capabilities | ActionCapability[] | |
onFailure | "continue" | "step_up" | "deny" | |
limit | integer | |
since | string |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
trigger | ActionTrigger | Where 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. |
evaluated | integer | |
from | string | null | |
to | string | null | |
matched | integer | Events where the draft made a decision call or a notification. |
changed | integer | null | Pre triggers: decisions that would have come out differently. |
transitions | object | null | e.g. `{ "push→number_match": 12, "push→deny": 1 }`. |
notifications | object | Would-be notifications by type (not sent). |
errors | integer | |
timeouts | integer | |
errorSamples | object[] | |
p50Ms | integer | |
p95Ms | integer | |
samples | object[] | |
assumedCapabilities | ActionCapability[] |
| Durum | Anlam |
|---|---|
200 | The report. |
400 | `invalid_request`, `invalid_template`, `action_invalid`. |
401 | Authentication 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 | Authentication 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). |
500 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
trigger | query | ActionTrigger | Only this trigger. |
limit | query | integer | 1-100 (default 20). |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
events | object[] |
| Durum | Anlam |
|---|---|
200 | Events. |
400 | `invalid_request`. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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) | Tip | Açıklama |
|---|---|---|
secrets | ActionSecret[] |
| Durum | Anlam |
|---|---|
200 | Secret names. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
namezorunlu | path | string | Secret name. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
valuezorunlu | string |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
name | string | |
createdAt | string | |
updatedAt | string |
| Durum | Anlam |
|---|---|
200 | Changed. |
201 | Added. |
400 | `invalid_request`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
DELETE/actions/secrets/{name}Delete a secret
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
namezorunlu | path | string | Secret name. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
deleted | boolean |
| Durum | Anlam |
|---|---|
200 | Deleted. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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) | Tip | Açıklama |
|---|---|---|
templates | object[] |
| Durum | Anlam |
|---|---|
200 | Templates. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected server error. |
POST/actions/templates/{id}/renderPreview a template as code
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | Template id. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
triggerzorunlu | ActionTrigger | Where 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. |
params | object |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
code | string | |
secrets | string[] | |
allowedHosts | string[] | |
capabilities | ActionCapability[] |
| Durum | Anlam |
|---|---|
200 | The code and what it needs. |
400 | `invalid_request`, `invalid_template`. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
trigger | ActionTrigger | Where 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. |
code | string | |
template | ActionTemplateRef | |
slug | string | |
secrets | string[] | |
allowedHosts | string[] | |
capabilities | ActionCapability[] | |
eventId | string | |
event | object | |
network | boolean |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
outcome | "ok" | "error" | "timeout" | |
error | string | null | |
durationMs | integer | |
cpuMs | number | |
calls | ActionCall[] | |
notifications | object[] | |
logs | ActionLogLine[] | |
reasons | RiskReason[] | |
wouldBe | object | null | For a recorded pre-trigger event: the decision with this Action alone (`verdict`: deny, passkey, number_match, push; or prompt, silent). |
eventId | string | null | |
event | object | |
assumedCapabilities | ActionCapability[] | |
note | string |
| Durum | Anlam |
|---|---|
200 | What the run did. |
400 | `invalid_request`, `invalid_template`, `action_invalid` (does not compile). |
401 | Authentication 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 | Authentication 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). |
500 | Unexpected 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) | Tip | Açıklama |
|---|---|---|
triggers | object[] | |
capabilities | object[] | |
limits | object |
| Durum | Anlam |
|---|---|
200 | The catalogue. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected server error. |
GET/actions/{slug}An Action, its code and versions
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
slugzorunlu | path | string | The Action's slug. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
action | Action | |
code | string | null | The active version's code (or the latest one). |
versions | ActionVersion[] |
| Durum | Anlam |
|---|---|
200 | The Action. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
slugzorunlu | path | string | The Action's slug. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
trigger | ActionTrigger | Where 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. |
name | string | |
code | string | JavaScript 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`. |
template | ActionTemplateRef | |
secrets | string[] | Names of secrets this version may read (`event.secrets.NAME`) or use in notifications. |
allowedHosts | string[] | The only hosts `api.fetch` and webhook notifications may reach (`*.example.com` allowed). |
capabilities | ActionCapability[] | |
onFailure | "continue" | "step_up" | "deny" | Pre triggers only: what an error or timeout of this Action means. `continue` never blocks a sign-in. |
order | integer | |
enabled | boolean | |
activate | boolean | `false` saves the version without making it live. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
action | Action | |
version | ActionVersion | |
deployed | boolean | This version is the one running now. |
approval | object | null | |
warnings | string[] | E.g. a decision call the trigger does not offer, a capability not asked for, a secret not set yet. |
| Durum | Anlam |
|---|---|
200 | A new or unchanged version of an existing Action. |
201 | Created. |
400 | `invalid_request`, `invalid_template`, `action_invalid` (does not compile or export onExecute). |
401 | Authentication 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 | Authentication 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). |
500 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
slugzorunlu | path | string | The Action's slug. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
name | string | |
enabled | boolean | |
order | integer | |
onFailure | "continue" | "step_up" | "deny" |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
action | Action |
| Durum | Anlam |
|---|---|
200 | Updated. |
400 | `invalid_request`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
DELETE/actions/{slug}Delete an Action and its versions
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
slugzorunlu | path | string | The Action's slug. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
deleted | boolean |
| Durum | Anlam |
|---|---|
200 | Deleted. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
slugzorunlu | path | string | The Action's slug. |
limit | query | integer | 1-200 (default 50). |
before | query | string | Runs before this time (paging). |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
logs | object[] |
| Durum | Anlam |
|---|---|
200 | Runs. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/actions/{slug}/metricsMetrics of an Action
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
slugzorunlu | path | string | The Action's slug. |
window | query | "1h" | "24h" | "7d" | "30d" | 1h, 24h (default), 7d or 30d. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
window | "1h" | "24h" | "7d" | "30d" | |
runs | integer | |
errors | integer | |
timeouts | integer | |
errorRate | number | |
p50Ms | integer | |
p95Ms | integer | |
decisions | object | |
notifications | object |
| Durum | Anlam |
|---|---|
200 | Metrics. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
slugzorunlu | path | string | The Action's slug. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
version | integer |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
action | Action | |
version | ActionVersion |
| Durum | Anlam |
|---|---|
200 | Rolled back. |
401 | Authentication 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 | Authentication 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). |
429 | Rate 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 | Unexpected server error. |
GET/actions/{slug}/versions/{number}One version with its code
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
slugzorunlu | path | string | The Action's slug. |
numberzorunlu | path | integer | Version number. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
number | integer | |
status | "ready" | "pending_approval" | "rejected" | |
active | boolean | |
capabilities | ActionCapability[] | |
approvedCapabilities | ActionCapability[] | |
allowedHosts | string[] | |
secrets | string[] | |
template | ActionTemplateRef | null | |
codeHash | string | |
code | string | `GET /actions/{slug}/versions/{number}` only. |
createdAt | string | |
createdBy | string | null | |
approvedAt | string | null |
| Durum | Anlam |
|---|---|
200 | The version. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/agentsThe workspace's agents and its kill switch
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
status | query | "active" | "suspended" | "revoked" | Only agents in this status. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
agents | Agent[] | |
killSwitch | AgentKillSwitch |
| Durum | Anlam |
|---|---|
200 | Agents. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
namezorunlu | string | |
description | string | What the agent is for. |
ownerEmail | string | The 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" | |
allowedTypeszorunlu | string[] | Active action types of the workspace. |
publicKey | PublicJwk | An 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. |
publicKeys | PublicJwk[] | |
reviewInDays | integer | Default 90. |
| Yanıt alanı (201) | Tip | Açıklama |
|---|---|---|
agent | Agent | An 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`. |
| Durum | Anlam |
|---|---|
201 | Created. |
400 | `invalid_request`, `invalid_key`, `unknown_type`, `invalid_owner`. |
401 | Authentication 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 | Authentication 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. |
429 | Rate 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 | Unexpected 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) | Tip | Açıklama |
|---|---|---|
audience | string |
| Durum | Anlam |
|---|---|
200 | The audience. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
externalUsernamezorunlu | string | The person the agent acts for (their phone approves). |
typezorunlu | string | One of the agent's allowed action types. |
authorizationDetailszorunlu | AuthorizationDetail[] | |
reason | string | The 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. |
expiresIn | integer | Seconds the phone may approve it (default 300). |
locale | "tr" | "en" | Language of the rows Touchque draws (default tr). |
referenceId | string | |
clientIp | string | The person's own address, when the agent's app knows it. |
userAgent | string | |
mandateId | string | Approve 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) | Tip | Açıklama |
|---|---|---|
approvalId | string | |
status | "pending" | "approved" | |
secondApprover | string | |
mandate | Mandate | A bounded standing permission the person approved once on the phone. Requests within it (POST /agents/approvals with mandateId) are approved without a push. |
presence | string | |
challengeCode | string | |
expiresAt | string | |
reasons | object[] | |
caseCode | string |
| Durum | Anlam |
|---|---|
201 | Sent 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ı | Tip | Açıklama |
|---|---|---|
tokenzorunlu | string |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
approval | object |
| Durum | Anlam |
|---|---|
200 | The approval, now used. |
400 | `invalid_request`. |
401 | `invalid_token` (not signed by Touchque, another workspace, unknown), `token_expired`. |
403 | Authentication 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`…). |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
approvalIdzorunlu | path | string | From POST /agents/approvals. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
approvalId | string | |
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. |
secondApprover | string | |
secondChallengeCode | string | |
mandateId | string | |
presence | string | |
challengeCode | string | While pending and interactive: show it in the conversation. |
expiresAt | string | |
caseCode | string | |
reason | string | |
approvalToken | string | When 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). |
tokenExpiresIn | integer |
| Durum | Anlam |
|---|---|
200 | The 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
limit | query | integer | How many events (1 to the page maximum). |
after | query | string | The cursor of the last page. |
since | query | string | Start at this time (ISO 8601) when there is no cursor. |
| Durum | Anlam |
|---|---|
200 | Events and the next cursor. |
400 | `invalid_request` or `invalid_cursor`. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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) | Tip | Açıklama |
|---|---|---|
keys | object[] |
| Durum | Anlam |
|---|---|
200 | JWKS. |
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ı | Tip | Açıklama |
|---|---|---|
engagedzorunlu | boolean | |
reason | string |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
killSwitch | AgentKillSwitch |
| Durum | Anlam |
|---|---|
200 | The kill switch. |
400 | `invalid_request`. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
externalUsernamezorunlu | string | |
typezorunlu | string | |
maxCountzorunlu | integer | |
maxTotalzorunlu | object | |
perRequest | string | The most one request may move, in the same currency. |
recipients | string[] | IBANs or account numbers it may pay; none = any (still subject to the agent's policy). |
validFor | integer | Seconds (default 86400). |
reason | string | |
presence | "interactive" | A mandate is always approved with the person in the conversation. |
expiresIn | integer | Seconds the phone may approve it (default 300). |
locale | "tr" | "en" |
| Yanıt alanı (201) | Tip | Açıklama |
|---|---|---|
mandateId | string | |
status | "pending" | "active" | "rejected" | "expired" | "provisional" | "revoked" | "exhausted" | |
externalUsername | string | |
type | string | |
maxCount | integer | |
usedCount | integer | |
maxTotal | object | |
used | object | |
perRequest | object | |
recipients | string[] | iban:… / account:… identifiers; empty = any. |
validUntil | string | |
challengeCode | string | While pending: show it in the conversation. |
approvalExpiresAt | string | |
revokedAt | string | null |
| Durum | Anlam |
|---|---|
201 | Sent 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
mandateIdzorunlu | path | string | The mandate. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
mandateId | string | |
status | "pending" | "active" | "rejected" | "expired" | "provisional" | "revoked" | "exhausted" | |
externalUsername | string | |
type | string | |
maxCount | integer | |
usedCount | integer | |
maxTotal | object | |
used | object | |
perRequest | object | |
recipients | string[] | iban:… / account:… identifiers; empty = any. |
validUntil | string | |
challengeCode | string | While pending: show it in the conversation. |
approvalExpiresAt | string | |
revokedAt | string | null |
| Durum | Anlam |
|---|---|
200 | The 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
mandateIdzorunlu | path | string | The mandate. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
mandateId | string | |
status | "pending" | "active" | "rejected" | "expired" | "provisional" | "revoked" | "exhausted" | |
externalUsername | string | |
type | string | |
maxCount | integer | |
usedCount | integer | |
maxTotal | object | |
used | object | |
perRequest | object | |
recipients | string[] | iban:… / account:… identifiers; empty = any. |
validUntil | string | |
challengeCode | string | While pending: show it in the conversation. |
approvalExpiresAt | string | |
revokedAt | string | null |
| Durum | Anlam |
|---|---|
200 | Revoked. |
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) | Tip | Açıklama |
|---|---|---|
agent | object | |
workspace | object | |
scope | string |
| Durum | Anlam |
|---|---|
200 | The 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) | Tip | Açıklama |
|---|---|---|
access_token | string | `tqat_…`, opaque. |
token_type | string | |
expires_in | integer | |
scope | string | Space separated: `agent:read`, `approvals:request`, `approvals:read`, `vault:read`. |
| Durum | Anlam |
|---|---|
200 | A 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
externalUsername | query | string | The person. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
accounts | AgentVaultAccount[] |
| Durum | Anlam |
|---|---|
200 | Accounts. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
connectionzorunlu | path | string | The connection. |
externalUsernamezorunlu | path | string | The person. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
accessTokenzorunlu | string | |
refreshToken | string | |
expiresIn | integer | |
scope | string |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
account | AgentVaultAccount |
| Durum | Anlam |
|---|---|
200 | Kept, sealed. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
connectionzorunlu | path | string | The connection. |
externalUsernamezorunlu | path | string | The person. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
removed | boolean |
| Durum | Anlam |
|---|---|
200 | Deleted. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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) | Tip | Açıklama |
|---|---|---|
connections | AgentVaultConnection[] |
| Durum | Anlam |
|---|---|
200 | Connections, with how many people have tokens kept. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
namezorunlu | path | string | Lowercase letters, digits and dashes. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
providerzorunlu | "google" | "microsoft" | "github" | "facebook" | "linkedin" | "x" | "oidc" | |
clientIdzorunlu | string | |
clientSecret | string | |
tenant | string | Microsoft: common, organizations, consumers or a directory id. |
issuer | string | OpenID Connect: the issuer URL. |
agentIds | string[] |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
connection | AgentVaultConnection |
| Durum | Anlam |
|---|---|
200 | Replaced. |
201 | Added. |
400 | `invalid_request`, `unknown_agent`. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
namezorunlu | path | string | The connection. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
removed | boolean | |
tokensDeleted | integer |
| Durum | Anlam |
|---|---|
200 | Removed. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
externalUsernamezorunlu | string | |
connectionzorunlu | string | |
scope | string |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
access_token | string | |
token_type | "Bearer" | |
expires_in | integer | |
scope | string | |
connection | string |
| Durum | Anlam |
|---|---|
200 | A 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) | Tip | Açıklama |
|---|---|---|
policy | object | |
defaults | object |
| Durum | Anlam |
|---|---|
200 | The workspace policy. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
policy | object |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
policy | object |
| Durum | Anlam |
|---|---|
200 | The saved policy. |
400 | The policy's own validation code. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected server error. |
GET/agents/{agentId}An agent
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
agentIdzorunlu | path | string | The agent's id. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
agent | Agent | An 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`. |
| Durum | Anlam |
|---|---|
200 | The agent. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
PATCH/agents/{agentId}Change, hand over or renew an agent
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
agentIdzorunlu | path | string | The agent's id. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
name | string | |
description | string | null | |
ownerEmail | string | A new owner also resumes an agent suspended because its owner left. |
platform | string | |
allowedTypes | string[] | |
reviewInDays | integer | Renews the review date from now. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
agent | Agent | An 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`. |
| Durum | Anlam |
|---|---|
200 | Updated. |
400 | `invalid_request`, `unknown_type`, `invalid_owner`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
agentIdzorunlu | path | string | The agent's id. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
agent | Agent | An 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`. |
| Durum | Anlam |
|---|---|
200 | Revoked. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
agentIdzorunlu | path | string | The agent's id. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
blocks | object[] |
| Durum | Anlam |
|---|---|
200 | Blocks. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
agentIdzorunlu | path | string | The agent's id. |
externalUsernamezorunlu | path | string | The person. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
lifted | boolean |
| Durum | Anlam |
|---|---|
200 | Lifted. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
agentIdzorunlu | path | string | The agent's id. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
publicKeyzorunlu | PublicJwk | An 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) | Tip | Açıklama |
|---|---|---|
agent | Agent | An 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`. |
| Durum | Anlam |
|---|---|
201 | Added. |
400 | `invalid_key`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
agentIdzorunlu | path | string | The agent's id. |
kidzorunlu | path | string | The key's kid. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
agent | Agent | An 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`. |
| Durum | Anlam |
|---|---|
200 | Removed. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/agents/{agentId}/mandatesAn agent's mandates
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
agentIdzorunlu | path | string | The agent's id. |
externalUsername | query | string | Only this person's. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
mandates | Mandate[] |
| Durum | Anlam |
|---|---|
200 | Mandates. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
agentIdzorunlu | path | string | The agent's id. |
mandateIdzorunlu | path | string | The mandate. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
mandateId | string | |
status | "pending" | "active" | "rejected" | "expired" | "provisional" | "revoked" | "exhausted" | |
externalUsername | string | |
type | string | |
maxCount | integer | |
usedCount | integer | |
maxTotal | object | |
used | object | |
perRequest | object | |
recipients | string[] | iban:… / account:… identifiers; empty = any. |
validUntil | string | |
challengeCode | string | While pending: show it in the conversation. |
approvalExpiresAt | string | |
revokedAt | string | null |
| Durum | Anlam |
|---|---|
200 | Revoked. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
agentIdzorunlu | path | string | The agent's id. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
policyzorunlu | AgentPolicy | What 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) | Tip | Açıklama |
|---|---|---|
agent | Agent | An 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`. |
| Durum | Anlam |
|---|---|
200 | The agent with its policy. |
400 | `invalid_policy`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
POST/agents/{agentId}/resumeResume a suspended agent
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
agentIdzorunlu | path | string | The agent's id. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
agent | Agent | An 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`. |
| Durum | Anlam |
|---|---|
200 | Active again. |
401 | Authentication 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 | Authentication 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). |
429 | Rate 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 | Unexpected server error. |
POST/agents/{agentId}/suspendSuspend an agent
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
agentIdzorunlu | path | string | The agent's id. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
reason | string |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
agent | Agent | An 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`. |
| Durum | Anlam |
|---|---|
200 | Suspended. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/identity/apisList APIs
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
POST/identity/apisAdd an API
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Durum | Anlam |
|---|---|
201 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/identity/apis/{id}Get an API
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
PATCH/identity/apis/{id}Change an API
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
DELETE/identity/apis/{id}Remove an API
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
204 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/identity/attack-protection/eventsWhat attack protection caught lately
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
limit | query | string | Filter or option: limit. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/identity/clientsList apps
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Durum | Anlam |
|---|---|
201 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/identity/clients/{clientId}Get an app
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
clientIdzorunlu | path | string | The clientId. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
PATCH/identity/clients/{clientId}Change an app
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
clientIdzorunlu | path | string | The clientId. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
clientIdzorunlu | path | string | The clientId. |
| Durum | Anlam |
|---|---|
204 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
POST/identity/clients/{clientId}/rotate-secretRotate an app's secret
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
clientIdzorunlu | path | string | The clientId. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/identity/connectionsList connections
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
POST/identity/connectionsAdd a social or enterprise connection
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Durum | Anlam |
|---|---|
201 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/identity/connections/{id}Get a connection
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
PATCH/identity/connections/{id}Change a connection
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
204 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Durum | Anlam |
|---|---|
201 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
DELETE/identity/custom-domains/{id}Remove a custom domain
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
204 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
channelzorunlu | path | string | The channel. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
channelzorunlu | path | string | The channel. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
channelzorunlu | path | string | The channel. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/identity/jobsRecent imports and exports
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/identity/organizationsList organizations
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
q | query | string | Filter or option: q. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
POST/identity/organizationsAdd an organization
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Durum | Anlam |
|---|---|
201 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/identity/organizations/{id}Get an organization
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
PATCH/identity/organizations/{id}Change an organization
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
DELETE/identity/organizations/{id}Remove an organization
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
204 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
PUT/identity/organizations/{id}/connectionsSet the organization's connections
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/identity/organizations/{id}/invitationsInvitations
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
201 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
DELETE/identity/organizations/{id}/invitations/{invitationId}Revoke an invitation
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
invitationIdzorunlu | path | string | The invitationId. |
| Durum | Anlam |
|---|---|
204 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/identity/organizations/{id}/membersMembers and their roles there
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
POST/identity/organizations/{id}/membersAdd members
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
DELETE/identity/organizations/{id}/members/{userId}Remove a member
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
userIdzorunlu | path | string | The userId. |
| Durum | Anlam |
|---|---|
204 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
userIdzorunlu | path | string | The userId. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
to | query | string | Filter or option: to. |
limit | query | string | Filter or option: limit. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/identity/rolesList roles
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
POST/identity/rolesAdd a role
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Durum | Anlam |
|---|---|
201 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/identity/roles/{id}Get a role
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
PATCH/identity/roles/{id}Change a role and its permissions
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
DELETE/identity/roles/{id}Remove a role
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
204 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/identity/roles/{id}/usersWho has the role
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/identity/tenantGet the tenant
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`). |
429 | Rate 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 | Unexpected server error. |
PUT/identity/tenantTurn Touchque Login on, or change its settings
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected server error. |
POST/identity/tenant/signing-keys/rotateRotate the token signing key
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/identity/usersSearch customers
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
q | query | string | Filter or option: q. |
blocked | query | string | Filter or option: blocked. |
emailVerified | query | string | Filter or option: emailVerified. |
connection | query | string | Filter or option: connection. |
organization | query | string | Filter or option: organization. |
limit | query | string | Filter or option: limit. |
cursor | query | string | Filter or option: cursor. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
POST/identity/usersAdd a customer
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Gövde alanı | Tip | Açıklama |
|---|---|---|
emailzorunlu | string | |
emailVerified | boolean | |
password | string | Checked against the tenant's password policy. |
passwordHash | string | A bcrypt ($2a/$2b/$2y) or argon2 ($argon2id…) hash as it is; replaced with Argon2id at the next sign-in. |
customPasswordHash | object | An 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. |
name | string | |
givenName | string | |
familyName | string | |
nickname | string | |
picture | string | |
phone | string | E.164. |
locale | string | |
userMetadata | object | Editable by the user. |
appMetadata | object | Only you and your Actions write it. |
sendVerificationEmail | boolean |
| Durum | Anlam |
|---|---|
201 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Durum | Anlam |
|---|---|
202 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/identity/users-exports/{id}An export's progress
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Durum | Anlam |
|---|---|
202 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/identity/users-imports/{id}An import's progress
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/identity/users/{id}Get a customer
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
emailzorunlu | string | |
emailVerified | boolean | |
password | string | Checked against the tenant's password policy. |
passwordHash | string | A bcrypt ($2a/$2b/$2y) or argon2 ($argon2id…) hash as it is; replaced with Argon2id at the next sign-in. |
customPasswordHash | object | An 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. |
name | string | |
givenName | string | |
familyName | string | |
nickname | string | |
picture | string | |
phone | string | E.164. |
locale | string | |
userMetadata | object | Editable by the user. |
appMetadata | object | Only you and your Actions write it. |
sendVerificationEmail | boolean |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
DELETE/identity/users/{id}Erase a customer (KVKK/GDPR)
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
POST/identity/users/{id}/blockBlock (signs out everywhere)
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
accountIdzorunlu | path | string | The accountId. |
| Durum | Anlam |
|---|---|
204 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
DELETE/identity/users/{id}/identities/{identityId}Unlink a provider account
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
identityIdzorunlu | path | string | The identityId. |
force | query | string | Filter or option: force. |
| Durum | Anlam |
|---|---|
204 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/identity/users/{id}/logsThe customer's activity
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
limit | query | string | Filter or option: limit. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
202 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/identity/users/{id}/rolesThe customer's roles
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
DELETE/identity/users/{id}/rolesTake roles (body { roleIds, organizationId })
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
DELETE/identity/users/{id}/roles/{roleId}Take one role
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
roleIdzorunlu | path | string | The roleId. |
organizationId | query | string | Filter or option: organizationId. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/identity/users/{id}/sessionsSigned-in sessions
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
DELETE/identity/users/{id}/sessionsSign out everywhere
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
DELETE/identity/users/{id}/sessions/{sessionId}End one session
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
sessionIdzorunlu | path | string | The sessionId. |
| Durum | Anlam |
|---|---|
204 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
POST/identity/users/{id}/unblockUnblock
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
200 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
POST/identity/users/{id}/verification-emailSend a verification email
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
idzorunlu | path | string | The object's id. |
| Durum | Anlam |
|---|---|
202 | Done. |
400 | `invalid_request` with `field` and `message`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/mobile/devicesList the devices inside your app
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
externalUsername | query | string | Only this user's devices. |
status | query | "active" | "revoked" | "all" | Default `active`. |
limit | query | integer | 1–50, default 20. |
cursor | query | string | `nextCursor` of the previous page. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
devices | MobileDevice[] | |
nextCursor | string | null |
| Durum | Anlam |
|---|---|
200 | Newest first. |
400 | `invalid_request`. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected server error. |
GET/mobile/devices/{deviceId}A device inside your app
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
deviceIdzorunlu | path | string | The mobile SDK device's id. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
device | MobileDevice | A device inside your app that approves for one of your users. |
| Durum | Anlam |
|---|---|
200 | The device. |
401 | Authentication 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 | Authentication 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. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
deviceIdzorunlu | path | string | The mobile SDK device's id. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
removed | boolean | |
wasLinked | boolean |
| Durum | Anlam |
|---|---|
200 | Removed. |
401 | Authentication 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 | Authentication 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. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
deviceIdzorunlu | path | string | The mobile SDK device's id. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
via | "touchque" | "webhook" | |
ok | boolean | APNs / FCM accepted it, or the webhook was handed to your URL. |
reason | string | Why not, e.g. BadDeviceToken, UNREGISTERED, no_webhook_url. |
| Durum | Anlam |
|---|---|
200 | Sent (or tried). |
401 | Authentication 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 | Authentication 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). |
429 | Rate 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 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
externalUsernamezorunlu | string | |
replace | boolean | Move the user from the device they approve with today. |
ttlSeconds | integer | Default: the workspace's `enrollTtlSeconds` (600). |
| Yanıt alanı (201) | Tip | Açıklama |
|---|---|---|
enrollmentId | string | |
enrollmentToken | string | One-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. |
externalUsername | string | |
expiresAt | string | |
replace | boolean | |
replacesDeviceId | string | With `replace`: the device that approves today and stops when the token is used. |
| Durum | Anlam |
|---|---|
201 | The token. Not cached (`Cache-Control: no-store`). |
400 | `invalid_request`. |
401 | Authentication 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 | Authentication 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`. |
429 | Rate 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 | Unexpected server error. |
GET/mobile/settingsYour Mobile SDK settings
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
settings | MobileSdkSettings |
| Durum | Anlam |
|---|---|
200 | The settings (defaults when never set). |
401 | Authentication 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 | Authentication 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. 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 | Unexpected 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ı | Tip | Açıklama |
|---|---|---|
iosAppIds | string[] | |
androidPackages | string[] | |
androidCerts | object | Package name → SHA-256 fingerprints ("AB:CD:…" or plain hex). Certificates of apps not in androidPackages are dropped. |
attestation | "off" | "optional" | "required" | |
enrollTtlSeconds | integer | |
apns | object | null | |
fcm | object | null |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
settings | MobileSdkSettings |
| Durum | Anlam |
|---|---|
200 | The settings now. |
400 | `invalid_settings`. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected server error. |
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)
| Durum | Anlam |
|---|---|
200 | Users. |
401 | Authentication 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. 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 | Error message of the failure. |
GET/users/{username}Get one enrolled user
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
usernamezorunlu | path | string | The `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) | Tip | Açıklama |
|---|---|---|
externalUsername | string | |
deviceId | string | null | Linked phone, or null when not linked yet. |
used | boolean | True once the enrollment secret was linked to a phone. |
frozen | boolean | Manual freeze flag (automatic freezes after rejections are time-limited and not reflected here). |
createdAt | string | |
expireAt | string | null | Link deadline of the enrollment secret. |
device | DevicePosture | null | The linked phone's posture, or null before a phone is linked. |
| Durum | Anlam |
|---|---|
200 | User. |
401 | Authentication 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`. |
429 | Rate 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 | Error message of the failure. |
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ı | Tip | Açıklama |
|---|---|---|
deviceIdzorunlu | string | A device that confirmed at least one login for this user in your workspace. |
externalUsernamezorunlu | string | |
reasonzorunlu | "CONFIRMED_FRAUD" | "ACCOUNT_TAKEOVER" | "SOCIAL_ENGINEERING" | "OTHER" |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
flagged | boolean | |
deviceId | string |
| Durum | Anlam |
|---|---|
200 | Flagged. |
400 | Missing fields or invalid `reason`. |
401 | Authentication 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. |
429 | Rate 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 | Unexpected 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
externalUsernamezorunlu | query | string | The user. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
devices | TrustedDevice[] |
| Durum | Anlam |
|---|---|
200 | Trusted devices. |
400 | `externalUsername query parameter is required`. |
401 | Authentication 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 | Authentication 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. 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 | Unexpected server error. |
POST/device/trust/revokeRevoke device trust
Kimlik: HMAC imzalı (x-api-key, x-timestamp, x-nonce, x-signature)
| Gövde alanı | Tip | Açıklama |
|---|---|---|
externalUsernamezorunlu | string | |
deviceId | string | Revoke only this device; omit to revoke all of the user's trusted devices. |
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
revoked | integer |
| Durum | Anlam |
|---|---|
200 | Number of revoked trust records. |
400 | `externalUsername is required`. |
401 | Authentication 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. 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 | Unexpected server error. |
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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
type | query | string | Exact event type (e.g. `LOGIN_CONFIRM`). |
ip | query | string | Exact IP address. |
username | query | string | Exact `externalUsername` (named `username` here). |
format | query | "csv" | `csv` for a CSV download; anything else returns JSON. |
| Durum | Anlam |
|---|---|
200 | Log entries. |
401 | Authentication 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 | Authentication 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. 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`. |
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
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
tokenzorunlu | path | string | The token in `canary.url`, without `.gif`. |
| Durum | Anlam |
|---|---|
204 | Received (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
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
tokenzorunlu | path | string | The token in `canary.url` from `POST /login/request`. |
| Durum | Anlam |
|---|---|
200 | 1x1 transparent GIF. |
GET/healthHealth check (database + security controls)
Kimlik: Herkese açık
| Yanıt alanı (200) | Tip | Açı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. |
degraded | string[] | Names of the degraded controls (only when degraded). |
| Durum | Anlam |
|---|---|
200 | Healthy (security controls may still report `degraded`). |
500 | Database unreachable (`status: degraded`). |
GET/openapi.jsonThis OpenAPI document
Served with `Cache-Control: public, max-age=300`.
Kimlik: Herkese açık
| Durum | Anlam |
|---|---|
200 | OpenAPI 3.1 document. |
GET/pingLiveness check
Kimlik: Herkese açık
| Yanıt alanı (200) | Tip | Açıklama |
|---|---|---|
pong | boolean |
| Durum | Anlam |
|---|---|
200 | Alive. |
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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
x-signaturezorunlu | header | string | Hex HMAC-SHA256 of the canonical payload. |
x-timestampzorunlu | header | string | Send time, ISO 8601 (not signed). |
x-noncezorunlu | header | string | Same value as `jti`. |
Idempotency-Keyzorunlu | header | string | Same value as `jti`. |
x-callback-eventzorunlu | header | "APPROVAL_RECONFIRMED" | "APPROVAL_REVOKED" | The event type. |
x-api-keyzorunlu | header | string | The workspace's integration API key. Not proof of origin — verify the signature. |
| Gövde alanı | Tip | Açı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. |
externalUsernamezorunlu | string | |
integrationIdzorunlu | string | |
timestampzorunlu | string | |
jtizorunlu | string | |
requestIdzorunlu | string | The 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`. |
signaturezorunlu | string |
| Durum | Anlam |
|---|---|
2XX | Acknowledged. |
default | Any 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
x-signaturezorunlu | header | string | Hex HMAC-SHA256 of the canonical payload. |
x-timestampzorunlu | header | string | Send time, ISO 8601 (not signed). |
x-noncezorunlu | header | string | Same value as `jti`. |
Idempotency-Keyzorunlu | header | string | Same value as `jti`. |
x-callback-eventzorunlu | header | "ASSIST_OPENED" | "ASSIST_ENDED" | "ASSIST_CHECK_PASSED" | "ASSIST_CHECK_FAILED" | "ASSIST_UNFROZEN" | "ASSIST_CLAIM_CONFIRMED" | "ASSIST_CLAIM_UNVERIFIED" | The event type. |
x-api-keyzorunlu | header | string | The workspace's integration API key. Not proof of origin — verify the signature. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
eventzorunlu | "ASSIST_OPENED" | "ASSIST_ENDED" | "ASSIST_CHECK_PASSED" | "ASSIST_CHECK_FAILED" | "ASSIST_UNFROZEN" | "ASSIST_CLAIM_CONFIRMED" | "ASSIST_CLAIM_UNVERIFIED" | |
externalUsername | string | null | |
integrationIdzorunlu | string | |
timestampzorunlu | string | |
jtizorunlu | string | |
assistId | string | |
agentRef | string | |
agentName | string | |
requestId | string | |
action | string | null | |
outcome | "pending" | "verified" | "wrong_number" | "not_me" | "coached" | "declined" | "expired" | |
reason | string | |
expiresAt | string | |
caseCode | string | null | As in `/logs/cases/{code}`. |
signaturezorunlu | string |
| Durum | Anlam |
|---|---|
2XX | Acknowledged. |
default | Any 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
x-signaturezorunlu | header | string | Hex HMAC-SHA256 of the canonical payload. |
x-timestampzorunlu | header | string | Send time, ISO 8601 (not signed). |
x-noncezorunlu | header | string | Same value as `jti`. |
Idempotency-Keyzorunlu | header | string | Same value as `jti`. |
x-callback-eventzorunlu | header | "DEVICE_LINKED" | "DEVICE_UNLINKED" | The event type. |
x-api-keyzorunlu | header | string | The workspace's integration API key. Not proof of origin — verify the signature. |
| Gövde alanı | Tip | Açı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. |
externalUsernamezorunlu | string | |
integrationIdzorunlu | string | |
timestampzorunlu | string | |
jtizorunlu | string | |
deviceIdzorunlu | string | The 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`). |
signaturezorunlu | string |
| Durum | Anlam |
|---|---|
2XX | Acknowledged. |
default | Any 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
x-signaturezorunlu | header | string | Hex HMAC-SHA256 of the canonical payload. |
x-timestampzorunlu | header | string | Send time, ISO 8601 (not signed). |
x-noncezorunlu | header | string | Same value as `jti`. |
Idempotency-Keyzorunlu | header | string | Same value as `jti`. |
x-callback-eventzorunlu | header | "DEVICE_RISK_SIGNAL" | "DEVICE_RISK_ALERT" | The event type. |
x-api-keyzorunlu | header | string | The workspace's integration API key. Not proof of origin — verify the signature. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
eventzorunlu | "DEVICE_RISK_SIGNAL" | "DEVICE_RISK_ALERT" | |
externalUsername | string | null | |
integrationIdzorunlu | string | |
timestampzorunlu | string | |
jtizorunlu | string | |
requestId | string | null | DEVICE_RISK_SIGNAL: the identification (`dre_…`). |
visitorId | string | null | DEVICE_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" | |
confidence | number | null | |
matchedBy | string | null | |
sealed | boolean | |
country | string | null | |
signals | object[] | |
verdict | object | |
alert | object | DEVICE_RISK_ALERT: rule (signup_burst | many_accounts | tamper_spike), label, value, threshold, window, visitorId, requestId, purpose, at. |
signaturezorunlu | string |
| Durum | Anlam |
|---|---|
2XX | Acknowledged. |
default | Any 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
x-signaturezorunlu | header | string | Hex HMAC-SHA256 of the canonical payload (see above). |
x-timestampzorunlu | header | string | Send time, ISO 8601 (not signed; same value as the signed `timestamp` field). |
x-noncezorunlu | header | string | Same value as `jti` (not signed). |
Idempotency-Keyzorunlu | header | string | The `requestId` — stable across retries and redeliveries. |
x-callback-eventzorunlu | header | "SUCCESS" | "REJECTED" | `SUCCESS` or `REJECTED`. |
x-api-keyzorunlu | header | string | The 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-namezorunlu | header | string | Sender name (the backend package name). |
x-sdk-versionzorunlu | header | string | Sender version. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
statuszorunlu | "SUCCESS" | "REJECTED" | |
actionzorunlu | "LOGIN_CONFIRM" | "LOGIN_REJECT" | |
requestIdzorunlu | string | |
externalUsernamezorunlu | string | |
integrationIdzorunlu | string | |
deviceIdzorunlu | string | null | Approving phone. For passwordless passkey sign-ins this is the passkey record id. |
referenceIdzorunlu | string | null | |
timestampzorunlu | string | Send time (also in `x-timestamp`). Covered by the signature — use it for freshness checks. |
jtizorunlu | string | Unique per delivery attempt series (also sent as `x-nonce`). A redelivery from the retry queue gets a new `jti`; deduplicate on `requestId` / `Idempotency-Key`. |
riskScorezorunlu | number | |
riskFactorszorunlu | string[] | 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`. |
assurance | Assurance | What a partner can rely on for an approved request. Only a passkey is phishing-resistant (origin-bound). |
approvalProof | ApprovalProof | Device-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. |
frozenUntil | string | REJECTED only: present when this rejection froze the user's 2FA. |
provisional | boolean | SUCCESS only. Approved while the user was on a call (Vishing Shield): critical actions wait for `APPROVAL_RECONFIRMED`; `APPROVAL_REVOKED` means end the session. |
reconfirmedAt | string | null | SUCCESS only (a redelivery may carry it). |
revoked | boolean | SUCCESS only (a redelivery may carry it): the user took the approval back. |
revokeReason | "UNDO" | "COACHED" | null | SUCCESS only. |
signaturezorunlu | string | Same value as the `x-signature` header. |
| Durum | Anlam |
|---|---|
2XX | Acknowledged. The body is ignored. |
default | Any 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
x-signaturezorunlu | header | string | Hex HMAC-SHA256 of the canonical payload. |
x-timestampzorunlu | header | string | Send time, ISO 8601 (not signed). |
x-noncezorunlu | header | string | Same value as `jti`. |
Idempotency-Keyzorunlu | header | string | Same value as `jti`. |
x-callback-eventzorunlu | header | string | The event type. |
x-api-keyzorunlu | header | string | The workspace's integration API key. Not proof of origin — verify the signature. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
eventzorunlu | string | |
externalUsernamezorunlu | string | |
integrationIdzorunlu | string | |
timestampzorunlu | string | |
jtizorunlu | string | |
deviceIdzorunlu | string | |
platformzorunlu | "ios" | "android" | |
appId | string | null | |
pushToken | string | null | The 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. |
requestId | string | null | |
expiresAt | string | null | Drop the push after this. |
alert | object | null | Suggested notification text (English); translate or replace it. |
datazorunlu | object | |
signaturezorunlu | string |
| Durum | Anlam |
|---|---|
2XX | Acknowledged. |
default | Any 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
x-signaturezorunlu | header | string | Hex HMAC-SHA256 of the canonical payload. |
x-timestampzorunlu | header | string | Send time, ISO 8601 (not signed). |
x-noncezorunlu | header | string | Same value as `jti`. |
Idempotency-Keyzorunlu | header | string | Same value as `jti`. |
x-callback-eventzorunlu | header | "PASSKEY_REGISTERED" | "PASSKEY_DELETED" | The event type. |
x-api-keyzorunlu | header | string | The workspace's integration API key. Not proof of origin — verify the signature. |
| Gövde alanı | Tip | Açı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. |
externalUsernamezorunlu | string | |
integrationIdzorunlu | string | |
timestampzorunlu | string | |
jtizorunlu | string | |
idzorunlu | string | Credential record id, as in `GET /webauthn/credentials` and `DELETE /webauthn/credentials/{id}`. |
credentialIdzorunlu | string | null | base64url 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). |
backedUp | boolean | `PASSKEY_REGISTERED` only: the passkey is backed up (synced) by its provider. |
label | string | null | `PASSKEY_REGISTERED` only: the display label the passkey was stored with. |
signaturezorunlu | string |
| Durum | Anlam |
|---|---|
2XX | Acknowledged. |
default | Any 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)
| Parametre | Yer | Tip | Açıklama |
|---|---|---|---|
x-signaturezorunlu | header | string | Hex HMAC-SHA256 of the canonical payload. |
x-timestampzorunlu | header | string | Send time, ISO 8601 (not signed). |
x-noncezorunlu | header | string | Same value as `jti`. |
Idempotency-Keyzorunlu | header | string | Same value as `jti`. |
x-callback-eventzorunlu | header | "RECOVERY_STARTED" | "RECOVERY_DEVICE_BOUND" | "RECOVERY_COOLING" | "RECOVERY_COMPLETED" | "RECOVERY_VETOED" | "RECOVERY_EXPIRED" | "RECOVERY_FAILED" | The event type. |
x-api-keyzorunlu | header | string | The workspace's integration API key. Not proof of origin — verify the signature. |
| Gövde alanı | Tip | Açıklama |
|---|---|---|
eventzorunlu | "RECOVERY_STARTED" | "RECOVERY_DEVICE_BOUND" | "RECOVERY_COOLING" | "RECOVERY_COMPLETED" | "RECOVERY_VETOED" | "RECOVERY_EXPIRED" | "RECOVERY_FAILED" | |
externalUsernamezorunlu | string | |
integrationIdzorunlu | string | |
timestampzorunlu | string | |
jtizorunlu | string | |
recoveryIdzorunlu | string | |
statuszorunlu | string | |
method | string | `RECOVERY_COMPLETED`: `vouch` or `old_phone`. |
probationUntil | string | null | `RECOVERY_COMPLETED` by vouch: critical actions are refused until then. |
reason | string | Ended events: why. |
signaturezorunlu | string |
| Durum | Anlam |
|---|---|
2XX | Acknowledged. |
default | Any other status (or a timeout) is retried in-process, then dropped. |