{"openapi":"3.1.0","info":{"title":"bind.co API - v1","description":"bind.co is a consent-scoped API for the inbox. A user connects Gmail or Outlook on bind.co's consent screen and approves the scopes your application requests. You then read structured records built from that inbox: the user's profile, their contacts and the roles those contacts play, drafted emails, files, and operations such as expenses and payroll changes. You get fields, never raw email, and only within the scopes the user consented to.\n\n**Base URL** `https://api.bind.co/v1`. **Auth:** OAuth 2.0 authorization code with PKCE (`S256`); the OAuth endpoints sit at the root (`/oauth2/authorize`, `/oauth2/token`, …), as `/.well-known/oauth-authorization-server` advertises. The webhook routes and the authorize preflight take your client credentials over HTTP Basic. **No sandbox:** once your application is `APPROVED`, test it on your own inbox ([Test your integration](https://api.bind.co/docs/testing)).\n\n**What every record guarantees.** bind.co reads the inbox; fixed rules decide what you receive.\n- **A documented shape.** Every resource has one schema. Operation types publish theirs at `GET /v1/operations/{type}/schema`; `GET /v1/operations` lists the types (neither needs a token), and new ones arrive without a new API version.\n- **Confidence and evidence.** Every inferred field carries `bind_inference_confidence` (0–1); operation records list the emails and files they were built from.\n- **One thing, one record.** The same contact or expense seen many times is one record. Merges can be undone.\n- **People have the last word.** A confirmed or corrected record is never overwritten by later mail; newer readings of profiles, contacts and roles arrive as suggestions to accept or reject.\n- **Pushed, not polled.** Changes arrive as signed webhooks.\n\n**Start here:** the [Quickstart](https://api.bind.co/docs/quickstart) — from a new application to your first record and webhook.\n\n**Conventions.** Paths are lowercase with words joined by hyphens; an operation-type segment is the `path` that `GET /v1/operations` lists (`payroll-operations`). Bodies and query strings use snake_case. Every id is an opaque string with a type prefix (`con_3SrGoE2zltj`): send it back exactly as received. Timestamps are UTC, ending in `Z`. Every error uses one envelope ([Errors](https://api.bind.co/docs/errors)); every list pages the same way ([Pagination](https://api.bind.co/docs/pagination-and-idempotency)).\n\n**Guides:**\n\n- [Quickstart](https://api.bind.co/docs/quickstart) — from a new application to your first record and your first webhook.\n- **Build with bind.co**\n    - [What you can build](https://api.bind.co/docs/build-with-bind) — four applications you can build on bind.co, with the scopes each needs.\n    - [Recipe: map your network](https://api.bind.co/docs/recipe-map-your-network) — everyone the user works with, what each is to them, and when they last spoke.\n    - [Recipe: client re-engagement](https://api.bind.co/docs/recipe-client-reengagement) — the user's clients, why each is worth contacting now, and an email ready to send.\n    - [Recipe: expense capture](https://api.bind.co/docs/recipe-expense-capture) — receipts and invoices from the mail as expense records to review and approve.\n    - [Recipe: document collection](https://api.bind.co/docs/recipe-document-collection) — what is missing on each record, documents already in the mailbox, and messages to ask for the rest.\n- **Concepts**\n    - [Profile](https://api.bind.co/docs/profile) — the user, their profile and their companies, and how suggestions work.\n    - [Contacts and roles](https://api.bind.co/docs/contacts-and-roles) — one contact, many roles: how bind.co builds them, merges them and keeps your edits.\n    - [Emails](https://api.bind.co/docs/emails) — what an email is in bind.co, and how it links to records.\n    - [Files](https://api.bind.co/docs/files) — attachments, one file per user, and how files become evidence.\n    - [Drafts and goals](https://api.bind.co/docs/drafts-and-goals) — the emails bind.co suggests for the user's contacts, and the goals that shape them.\n    - [Operations](https://api.bind.co/docs/operations) — records found in the mail: their lifecycle, evidence, confidence, documents and the chaser.\n    - [Mailbox sync](https://api.bind.co/docs/mailbox-sync) — how the webhooks tell you about new mail, and what a sync never changes.\n- [Authentication and scopes](https://api.bind.co/docs/authentication) — the consent chain, the scopes each route needs, token lifetimes, refresh and revocation.\n- [Webhooks](https://api.bind.co/docs/webhooks) — registering endpoints, verifying signatures, and every event type with its payload.\n- [Pagination and idempotency](https://api.bind.co/docs/pagination-and-idempotency) — paging through lists, and retrying writes safely with `Idempotency-Key`.\n- [Errors](https://api.bind.co/docs/errors) — the error envelope and every `error` code, deep-linked from `error_uri`.\n- [Rate limits](https://api.bind.co/docs/rate-limits) — every limit and budget, and the `429` / `Retry-After` contract.\n- [Test your integration](https://api.bind.co/docs/testing) — who can sign in to your application at each review status, and how to test end to end on your own data.\n- [Generate a client](https://api.bind.co/docs/generate-a-client) — a typed client for your language, generated from the OpenAPI reference.\n- [Changelog](https://api.bind.co/docs/changelog) — every change to the API, and what to change in your client.\n- [Webhook event types (JSON)](https://api.bind.co/v1/docs/webhooks/event-types) — the live list of subscribable types (no authentication, 60 requests per minute).\n- [All guides](https://api.bind.co/docs) — the docs home.\n","version":"1.0"},"servers":[{"url":"https://api.bind.co/v1","description":"bind.co API v1"}],"paths":{"/oauth2/clients/me":{"get":{"tags":["OAuth2"],"summary":"Learn who the signed-in user is","description":"Call it right after exchanging the code at `POST /oauth2/token`: returns the user's public id, to store against your own user record, and their email address. Routes that act for the user never take this id: the access token already says who the user is. `GET /v1/webhook-events` accepts it to filter your events. Needs the `profile` scope.\n\nRequired scopes: `profile:read`","operationId":"get_me","responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientMeResponse"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"security":[{"oauth2":["profile:read"]}],"x-required-scopes":["profile:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/oauth2/clients/me \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/oauth2/clients/me',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/oauth2/token":{"post":{"tags":["OAuth2"],"summary":"Exchange a code or refresh token for tokens","description":"Exchange an authorization code or refresh token for access tokens. Served at the API root, with no\n`/v1` (`/oauth2/token`), as `/.well-known/oauth-authorization-server` advertises it.\n\n- Client authentication by HTTP Basic, or `client_id` + `client_secret` in the form\n  (RFC 6749 §2.3.1); `client_public_id` is accepted as a legacy alias of `client_id`\n- `Cache-Control: no-store` and `Pragma: no-cache` on every response (RFC 6749 §5.1)\n- Refresh-token rotation (RFC 9700 §4.14)\n- PKCE required, S256 only (RFC 7636): send the `code_verifier` with `grant_type=authorization_code`\n- Standard error codes (RFC 6749 §5.2), with `hint.missing` / `hint.expected` naming a missing\n  or malformed parameter\n- Only an approved application obtains tokens; any other answers `invalid_client`","operationId":"oauth2_token","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"properties":{"grant_type":{"type":"string","enum":["authorization_code","refresh_token"],"title":"Grant Type","description":"`authorization_code` exchanges a sign-in code; `refresh_token` exchanges a refresh token."},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"The code the sign-in redirect carried; with `authorization_code`."},"redirect_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Uri","description":"The `redirect_uri` the sign-in was started with; with `authorization_code`."},"code_verifier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Verifier","description":"The PKCE verifier whose `S256` challenge started the sign-in; with `authorization_code`."},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token","description":"The refresh token to exchange; with `refresh_token`."},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope","description":"With `refresh_token`: a narrower space-separated set of the scopes already granted."},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id","description":"Your application's client id, when it does not authenticate with HTTP Basic."},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret","description":"Your application's client secret, when it does not authenticate with HTTP Basic."}},"type":"object","required":["grant_type"],"title":"TokenForm","description":"The form `POST /oauth2/token` reads (`application/x-www-form-urlencoded`).","examples":[{"code":"SplxlOBeZQQYbYS6WxSbIA","code_verifier":"dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk","grant_type":"authorization_code","redirect_uri":"https://app.example.com/callback"}]},"example":{"code":"SplxlOBeZQQYbYS6WxSbIA","code_verifier":"dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk","grant_type":"authorization_code","redirect_uri":"https://app.example.com/callback"}}},"required":true},"responses":{"200":{"description":"Access + refresh tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"422":{"$ref":"#/components/responses/ValidationFailed"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"security":[{"clientBasic":[]}],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/oauth2/token \\\n  -u \"$CLIENT_ID:$CLIENT_SECRET\" \\\n  -d 'code=SplxlOBeZQQYbYS6WxSbIA&code_verifier=dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk&grant_type=authorization_code&redirect_uri=https%3A%2F%2Fapp.example.com%2Fcallback'"},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.post(\n    'https://api.bind.co/oauth2/token',\n    auth=(client_id, client_secret),\n    data={'code': 'SplxlOBeZQQYbYS6WxSbIA', 'code_verifier': 'dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk', 'grant_type': 'authorization_code', 'redirect_uri': 'https://app.example.com/callback'},\n)\nprint(response.status_code, response.json())"}]}},"/oauth2/revoke":{"post":{"tags":["OAuth2"],"summary":"Revoke an access or refresh token (RFC 7009).","description":"Client-authenticated token revocation. Always returns HTTP 200 — even for unknown or invalid tokens — to avoid leaking token validity (RFC 7009 §2.2). Revoking an access token also revokes the linked refresh token (and vice versa) so a logged-out client can't silently mint new access tokens from a still-valid refresh.\n\nServed at the API root, with no `/v1` (for example `/oauth2/token`), as `/.well-known/oauth-authorization-server` advertises it.","operationId":"oauth2_revoke","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"properties":{"token":{"type":"string","title":"Token","description":"The access or refresh token."},"token_type_hint":{"anyOf":[{"type":"string","enum":["access_token","refresh_token"]},{"type":"null"}],"title":"Token Type Hint","description":"Which kind of token `token` is: `access_token` or `refresh_token`."},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id","description":"Your application's client id, when it does not authenticate with HTTP Basic."},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret","description":"Your application's client secret, when it does not authenticate with HTTP Basic."}},"type":"object","required":["token"],"title":"TokenRevocationForm","description":"The form `POST /oauth2/revoke` and `POST /oauth2/introspect` read (`application/x-www-form-urlencoded`).","examples":[{"token":"q8dK2mVx7RtN0pLwZ4bY9sGcH1fJ3eUa6iOuT5yWnBk","token_type_hint":"access_token"}]},"example":{"token":"q8dK2mVx7RtN0pLwZ4bY9sGcH1fJ3eUa6iOuT5yWnBk","token_type_hint":"access_token"}}},"required":true},"responses":{"200":{"description":"Always an empty JSON object, whether or not the token was known.","content":{"application/json":{"schema":{},"example":{}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"422":{"$ref":"#/components/responses/ValidationFailed"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"security":[{"clientBasic":[]}],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/oauth2/revoke \\\n  -u \"$CLIENT_ID:$CLIENT_SECRET\" \\\n  -d 'token=q8dK2mVx7RtN0pLwZ4bY9sGcH1fJ3eUa6iOuT5yWnBk&token_type_hint=access_token'"},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.post(\n    'https://api.bind.co/oauth2/revoke',\n    auth=(client_id, client_secret),\n    data={'token': 'q8dK2mVx7RtN0pLwZ4bY9sGcH1fJ3eUa6iOuT5yWnBk', 'token_type_hint': 'access_token'},\n)\nprint(response.status_code, response.json())"}]}},"/oauth2/introspect":{"post":{"tags":["OAuth2"],"summary":"Introspect an access or refresh token (RFC 7662).","description":"Client-authenticated token introspection. Restricted to **own tokens only** — a client can introspect only tokens that it itself issued. Returns `{active: false}` for unknown / revoked / expired tokens (RFC 7662 §2.2).\n\nServed at the API root, with no `/v1` (for example `/oauth2/token`), as `/.well-known/oauth-authorization-server` advertises it.","operationId":"oauth2_introspect","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"properties":{"token":{"type":"string","title":"Token","description":"The access or refresh token."},"token_type_hint":{"anyOf":[{"type":"string","enum":["access_token","refresh_token"]},{"type":"null"}],"title":"Token Type Hint","description":"Which kind of token `token` is: `access_token` or `refresh_token`."},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id","description":"Your application's client id, when it does not authenticate with HTTP Basic."},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret","description":"Your application's client secret, when it does not authenticate with HTTP Basic."}},"type":"object","required":["token"],"title":"TokenRevocationForm","description":"The form `POST /oauth2/revoke` and `POST /oauth2/introspect` read (`application/x-www-form-urlencoded`).","examples":[{"token":"q8dK2mVx7RtN0pLwZ4bY9sGcH1fJ3eUa6iOuT5yWnBk","token_type_hint":"access_token"}]},"example":{"token":"q8dK2mVx7RtN0pLwZ4bY9sGcH1fJ3eUa6iOuT5yWnBk","token_type_hint":"access_token"}}},"required":true},"responses":{"200":{"description":"The token's state; `sub` is the user's public id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntrospectionResponse"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"422":{"$ref":"#/components/responses/ValidationFailed"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"security":[{"clientBasic":[]}],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/oauth2/introspect \\\n  -u \"$CLIENT_ID:$CLIENT_SECRET\" \\\n  -d 'token=q8dK2mVx7RtN0pLwZ4bY9sGcH1fJ3eUa6iOuT5yWnBk&token_type_hint=access_token'"},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.post(\n    'https://api.bind.co/oauth2/introspect',\n    auth=(client_id, client_secret),\n    data={'token': 'q8dK2mVx7RtN0pLwZ4bY9sGcH1fJ3eUa6iOuT5yWnBk', 'token_type_hint': 'access_token'},\n)\nprint(response.status_code, response.json())"}]}},"/oauth2/authorize/preflight":{"get":{"tags":["OAuth2"],"summary":"Dry-run /oauth2/authorize without writing consent or issuing a code","description":"Runs the same checks as `GET /oauth2/authorize` and reports each one. It never records consent, issues a code or sends email, so you can check an authorize URL before sending real users to it.\n\nSend the query parameters of your authorize URL; `response_type` and `scope` are required here, and `state` and the other browser-only parameters are ignored. Authenticate with your application's credentials over HTTP Basic (`client_id:client_secret`, as at `POST /oauth2/token`); they can check only your own application.\n\nA complete request answers HTTP 200, and the body's `ok` says whether every check passed. `first_failure.error` is the same `error` code the real `/oauth2/authorize` would answer for that input.","operationId":"oauth2_authorize_preflight","parameters":[{"name":"response_type","in":"query","required":true,"schema":{"type":"string","description":"Only `code` is supported.","title":"Response Type"},"description":"Only `code` is supported."},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Your application's client id.","title":"Client Id"},"description":"Your application's client id."},{"name":"client_public_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Legacy alias for `client_id`; refused when both are sent with different values.","title":"Client Public Id"},"description":"Legacy alias for `client_id`; refused when both are sent with different values."},{"name":"redirect_uri","in":"query","required":true,"schema":{"type":"string","description":"The `redirect_uri` you will send to `/oauth2/authorize`.","title":"Redirect Uri"},"description":"The `redirect_uri` you will send to `/oauth2/authorize`."},{"name":"scope","in":"query","required":true,"schema":{"type":"string","description":"The space-separated scopes you will request.","title":"Scope"},"description":"The space-separated scopes you will request."},{"name":"code_challenge","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"PKCE challenge (RFC 7636), as you will send it to `/oauth2/authorize`. Required.","title":"Code Challenge"},"description":"PKCE challenge (RFC 7636), as you will send it to `/oauth2/authorize`. Required."},{"name":"code_challenge_method","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Required, `S256` only.","title":"Code Challenge Method"},"description":"Required, `S256` only."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightResponse"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"422":{"$ref":"#/components/responses/ValidationFailed"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"security":[{"clientBasic":[]}],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/oauth2/authorize/preflight \\\n  -u \"$CLIENT_ID:$CLIENT_SECRET\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/oauth2/authorize/preflight',\n    auth=(client_id, client_secret),\n)\nprint(response.status_code, response.json())"}]}},"/oauth2/authorize":{"get":{"tags":["OAuth2"],"summary":"Start the bind.co-hosted consent flow.","description":"Served at the API root, with no `/v1` (for example `/oauth2/token`), as `/.well-known/oauth-authorization-server` advertises it.\n\nBrowser-facing OAuth 2.0 authorization endpoint (RFC 6749 §4.1.1). Send the end user here to connect their inbox: bind.co verifies the client and the `redirect_uri`, signs the user in with their email provider, and renders the consent screen.\n\nPKCE is required: send `code_challenge` with `code_challenge_method=S256`, then the matching `code_verifier` at `POST /oauth2/token`.\n\nSend `provider=gmail` or `provider=microsoft` to skip the provider picker. `client_public_id` is accepted as a legacy alias for `client_id`. Failures that can be attributed to a verified `redirect_uri` are returned there as `?error=...`; anything that fails before the client and the `redirect_uri` are verified renders an HTML error page instead, so a bad request can never be bounced to an unverified URI.","operationId":"oauth2_authorize","parameters":[{"name":"redirect_uri","in":"query","required":true,"schema":{"type":"string","description":"Where the user is sent once the flow completes. Must be registered for the client.","title":"Redirect Uri"},"description":"Where the user is sent once the flow completes. Must be registered for the client."},{"name":"response_type","in":"query","required":false,"schema":{"type":"string","description":"Only `code` is supported.","default":"","title":"Response Type"},"description":"Only `code` is supported."},{"name":"scope","in":"query","required":false,"schema":{"type":"string","description":"Space-separated scopes, each registered for the client.","default":"","title":"Scope"},"description":"Space-separated scopes, each registered for the client."},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Your application's client id.","title":"Client Id"},"description":"Your application's client id."},{"name":"client_public_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Legacy alias for `client_id`; refused when both are sent with different values.","title":"Client Public Id"},"description":"Legacy alias for `client_id`; refused when both are sent with different values."},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque client value, echoed back on every redirect to `redirect_uri`.","title":"State"},"description":"Opaque client value, echoed back on every redirect to `redirect_uri`."},{"name":"code_challenge","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"PKCE challenge (RFC 7636). Required.","title":"Code Challenge"},"description":"PKCE challenge (RFC 7636). Required."},{"name":"code_challenge_method","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Required, `S256` only.","title":"Code Challenge Method"},"description":"Required, `S256` only."},{"name":"login_hint","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Email address to pre-fill at the identity provider.","title":"Login Hint"},"description":"Email address to pre-fill at the identity provider."},{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/EmailProviderType"},{"type":"null"}],"description":"Skip the provider picker.","title":"Provider"},"description":"Skip the provider picker."},{"name":"prompt","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/AuthorizePrompt"},{"type":"null"}],"description":"`none`, `consent`, or `select_account`.","title":"Prompt"},"description":"`none`, `consent`, or `select_account`."}],"responses":{"200":{"description":"The sign-in or consent page, or an error page for a request that cannot be returned to a verified `redirect_uri`.","content":{"text/html":{"schema":{"type":"string"},"example":"<!doctype html><html lang=\"en\">…</html>"}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/oauth2/authorize"},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/oauth2/authorize',\n)\nprint(response.status_code, response.headers)"}]}},"/.well-known/oauth-authorization-server":{"get":{"tags":["OAuth2"],"summary":"OAuth 2.0 Authorization Server Metadata (RFC 8414).","description":"Public discovery document advertising bind.co's OAuth2 endpoints, supported grant types, auth methods, response types, PKCE methods, and the catalogue of advertisable scopes. Cached by clients.","operationId":"oauth_authorization_server_metadata","responses":{"200":{"description":"The authorization server metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorizationServerMetadata"},"example":{"issuer":"https://api.bind.co","authorization_endpoint":"https://api.bind.co/oauth2/authorize","token_endpoint":"https://api.bind.co/oauth2/token","revocation_endpoint":"https://api.bind.co/oauth2/revoke","introspection_endpoint":"https://api.bind.co/oauth2/introspect","response_types_supported":["code"],"grant_types_supported":["authorization_code","refresh_token"],"token_endpoint_auth_methods_supported":["client_secret_basic","client_secret_post"],"revocation_endpoint_auth_methods_supported":["client_secret_basic","client_secret_post"],"introspection_endpoint_auth_methods_supported":["client_secret_basic","client_secret_post"],"code_challenge_methods_supported":["S256"],"scopes_supported":["contacts:read","contacts:write","drafts:read","drafts:send","drafts:write","files:read","files:write","operations:expenses:read","operations:expenses:write","operations:payroll_operations:read","operations:payroll_operations:write","operations:purchase_loan_financing:read","operations:purchase_loan_financing:write","profile:read","profile:write"]}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/.well-known/oauth-authorization-server"},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/.well-known/oauth-authorization-server',\n)\nprint(response.status_code, response.json())"}]}},"/webhook-endpoints":{"post":{"tags":["OAuth2 Client Webhook Management (Developer)"],"summary":"Register a webhook endpoint","description":"Register a URL that receives signed events, and get its signing `secret`, shown only in this answer. An unknown event type, or a URL that is not `https://` on a public host, is a 400; going over the active endpoints cap is a 409. Authenticate with your application's own credentials over HTTP Basic (`client_id:client_secret`, as at `POST /oauth2/token`), never a user's token.","operationId":"create_webhook_endpoint","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Accepted so you can send it on every POST and PATCH. This route is called as your app rather than for a user, so the key is not stored: a repeated request runs again.","x-idempotency-key-stored":false,"title":"Idempotency-Key"},"description":"Optional. Accepted so you can send it on every POST and PATCH. This route is called as your app rather than for a user, so the key is not stored: a repeated request runs again."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointCreate"}}}},"responses":{"201":{"description":"Created; the body is the new record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointWithSecret"}}},"headers":{"Location":{"description":"The path of the created record.","schema":{"type":"string"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"400":{"$ref":"#/components/responses/BadRequest"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"401":{"$ref":"#/components/responses/Unauthenticated"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"security":[{"clientBasic":[]}],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/webhook-endpoints \\\n  -u \"$CLIENT_ID:$CLIENT_SECRET\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"description\": \"production\", \"event_types\": [\"contacts.first_completed\", \"expenses.completed\"], \"url\": \"https://api.example.com/bind/webhooks\"}'"},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/webhook-endpoints',\n    auth=(client_id, client_secret),\n    json={'description': 'production', 'event_types': ['contacts.first_completed', 'expenses.completed'], 'url': 'https://api.example.com/bind/webhooks'},\n)\nprint(response.status_code, response.json())"}]},"get":{"tags":["OAuth2 Client Webhook Management (Developer)"],"summary":"List webhook endpoints","description":"A page of the endpoints your application registered, disabled ones included. Authenticate with your application's own credentials over HTTP Basic (`client_id:client_secret`, as at `POST /oauth2/token`), never a user's token.","operationId":"list_webhook_endpoints","parameters":[{"name":"page_number","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number to retrieve.","default":1,"title":"Page Number"},"description":"Page number to retrieve."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"Number of items per page.","default":50,"title":"Page Size"},"description":"Number of items per page."},{"name":"page_token","in":"query","required":false,"schema":{"type":"string"},"description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointPage"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"consecutive_failures":0,"created_at":"2026-09-11T08:00:00Z","description":"production","disabled_reason":null,"event_types":["contacts.first_completed","expenses.completed"],"id":"we_2f1c7a1e-4b7d-4c1e-9c0e-5d2a1b3c4d5e","last_failure_at":null,"last_success_at":"2026-09-11T08:05:00Z","previous_secret_expires_at":null,"status":"active","updated_at":"2026-09-11T08:00:00Z","url":"https://api.example.com/bind/webhooks"}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"401":{"$ref":"#/components/responses/Unauthenticated"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"security":[{"clientBasic":[]}],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/webhook-endpoints \\\n  -u \"$CLIENT_ID:$CLIENT_SECRET\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/webhook-endpoints',\n    auth=(client_id, client_secret),\n)\nprint(response.status_code, response.json())"}]}},"/webhook-endpoints/{public_id}":{"get":{"tags":["OAuth2 Client Webhook Management (Developer)"],"summary":"Get a webhook endpoint","description":"One of your endpoints; any other id is a 404. Authenticate with your application's own credentials over HTTP Basic (`client_id:client_secret`, as at `POST /oauth2/token`), never a user's token.","operationId":"get_webhook_endpoint","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","pattern":"^we_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["we_6a0f8d2c-1b3e-4c5d-8e7f-9a0b1c2d3e4f"],"description":"A webhook endpoint id: `we_` and an opaque string. Treat it as opaque.","title":"Public Id"},"description":"The endpoint's id, as registering it returned it."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointOut"}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"401":{"$ref":"#/components/responses/Unauthenticated"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"security":[{"clientBasic":[]}],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/webhook-endpoints/we_6a0f8d2c-1b3e-4c5d-8e7f-9a0b1c2d3e4f \\\n  -u \"$CLIENT_ID:$CLIENT_SECRET\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/webhook-endpoints/we_6a0f8d2c-1b3e-4c5d-8e7f-9a0b1c2d3e4f',\n    auth=(client_id, client_secret),\n)\nprint(response.status_code, response.json())"}]},"patch":{"tags":["OAuth2 Client Webhook Management (Developer)"],"summary":"Update a webhook endpoint","description":"Change the URL, note, event types or status; fields left out are untouched. `status: active` re-enables a disabled endpoint, a 409 when the active endpoints cap is reached. Authenticate with your application's own credentials over HTTP Basic (`client_id:client_secret`, as at `POST /oauth2/token`), never a user's token.","operationId":"update_webhook_endpoint","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","pattern":"^we_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["we_6a0f8d2c-1b3e-4c5d-8e7f-9a0b1c2d3e4f"],"description":"A webhook endpoint id: `we_` and an opaque string. Treat it as opaque.","title":"Public Id"},"description":"The endpoint's id, as registering it returned it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Accepted so you can send it on every POST and PATCH. This route is called as your app rather than for a user, so the key is not stored: a repeated request runs again.","x-idempotency-key-stored":false,"title":"Idempotency-Key"},"description":"Optional. Accepted so you can send it on every POST and PATCH. This route is called as your app rather than for a user, so the key is not stored: a repeated request runs again."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointPatch"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointOut"}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"400":{"$ref":"#/components/responses/BadRequest"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"401":{"$ref":"#/components/responses/Unauthenticated"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"security":[{"clientBasic":[]}],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X PATCH https://api.bind.co/v1/webhook-endpoints/we_6a0f8d2c-1b3e-4c5d-8e7f-9a0b1c2d3e4f \\\n  -u \"$CLIENT_ID:$CLIENT_SECRET\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"status\": \"active\"}'"},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.patch(\n    'https://api.bind.co/v1/webhook-endpoints/we_6a0f8d2c-1b3e-4c5d-8e7f-9a0b1c2d3e4f',\n    auth=(client_id, client_secret),\n    json={'status': 'active'},\n)\nprint(response.status_code, response.json())"}]},"delete":{"tags":["OAuth2 Client Webhook Management (Developer)"],"summary":"Disable a webhook endpoint","description":"Disable the endpoint and cancel its pending deliveries; it stays in the list. Authenticate with your application's own credentials over HTTP Basic (`client_id:client_secret`, as at `POST /oauth2/token`), never a user's token.","operationId":"delete_webhook_endpoint","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","pattern":"^we_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["we_6a0f8d2c-1b3e-4c5d-8e7f-9a0b1c2d3e4f"],"description":"A webhook endpoint id: `we_` and an opaque string. Treat it as opaque.","title":"Public Id"},"description":"The endpoint's id, as registering it returned it."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"204":{"description":"Done; there is no body.","headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"401":{"$ref":"#/components/responses/Unauthenticated"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"security":[{"clientBasic":[]}],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X DELETE https://api.bind.co/v1/webhook-endpoints/we_6a0f8d2c-1b3e-4c5d-8e7f-9a0b1c2d3e4f \\\n  -u \"$CLIENT_ID:$CLIENT_SECRET\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.delete(\n    'https://api.bind.co/v1/webhook-endpoints/we_6a0f8d2c-1b3e-4c5d-8e7f-9a0b1c2d3e4f',\n    auth=(client_id, client_secret),\n)\nprint(response.status_code, response.headers)"}]}},"/webhook-endpoints/{public_id}/rotate-secret":{"post":{"tags":["OAuth2 Client Webhook Management (Developer)"],"summary":"Rotate a webhook endpoint's secret","description":"Get a new signing `secret`, shown only in this answer. For a while, requests carry a signature with the previous secret too, until `previous_secret_expires_at`. Authenticate with your application's own credentials over HTTP Basic (`client_id:client_secret`, as at `POST /oauth2/token`), never a user's token.","operationId":"rotate_webhook_endpoint_secret","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","pattern":"^we_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["we_6a0f8d2c-1b3e-4c5d-8e7f-9a0b1c2d3e4f"],"description":"A webhook endpoint id: `we_` and an opaque string. Treat it as opaque.","title":"Public Id"},"description":"The endpoint's id, as registering it returned it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Accepted so you can send it on every POST and PATCH. This route is called as your app rather than for a user, so the key is not stored: a repeated request runs again.","x-idempotency-key-stored":false,"title":"Idempotency-Key"},"description":"Optional. Accepted so you can send it on every POST and PATCH. This route is called as your app rather than for a user, so the key is not stored: a repeated request runs again."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointWithSecret"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"401":{"$ref":"#/components/responses/Unauthenticated"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"security":[{"clientBasic":[]}],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/webhook-endpoints/we_6a0f8d2c-1b3e-4c5d-8e7f-9a0b1c2d3e4f/rotate-secret \\\n  -u \"$CLIENT_ID:$CLIENT_SECRET\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/webhook-endpoints/we_6a0f8d2c-1b3e-4c5d-8e7f-9a0b1c2d3e4f/rotate-secret',\n    auth=(client_id, client_secret),\n)\nprint(response.status_code, response.json())"}]}},"/webhook-endpoints/{public_id}/test":{"post":{"tags":["OAuth2 Client Webhook Management (Developer)"],"summary":"Send a test event to a webhook endpoint","description":"Send a signed test event right away and return what your endpoint answered. Authenticate with your application's own credentials over HTTP Basic (`client_id:client_secret`, as at `POST /oauth2/token`), never a user's token.","operationId":"test_webhook_endpoint","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","pattern":"^we_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["we_6a0f8d2c-1b3e-4c5d-8e7f-9a0b1c2d3e4f"],"description":"A webhook endpoint id: `we_` and an opaque string. Treat it as opaque.","title":"Public Id"},"description":"The endpoint's id, as registering it returned it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Accepted so you can send it on every POST and PATCH. This route is called as your app rather than for a user, so the key is not stored: a repeated request runs again.","x-idempotency-key-stored":false,"title":"Idempotency-Key"},"description":"Optional. Accepted so you can send it on every POST and PATCH. This route is called as your app rather than for a user, so the key is not stored: a repeated request runs again."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointTestResult"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"401":{"$ref":"#/components/responses/Unauthenticated"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"security":[{"clientBasic":[]}],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/webhook-endpoints/we_6a0f8d2c-1b3e-4c5d-8e7f-9a0b1c2d3e4f/test \\\n  -u \"$CLIENT_ID:$CLIENT_SECRET\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/webhook-endpoints/we_6a0f8d2c-1b3e-4c5d-8e7f-9a0b1c2d3e4f/test',\n    auth=(client_id, client_secret),\n)\nprint(response.status_code, response.json())"}]}},"/webhook-deliveries":{"get":{"tags":["OAuth2 Client Webhook Management (Developer)"],"summary":"List webhook deliveries","description":"Every delivery to your endpoints, newest first, filtered by the parameters sent. Authenticate with your application's own credentials over HTTP Basic (`client_id:client_secret`, as at `POST /oauth2/token`), never a user's token.","operationId":"list_webhook_deliveries","parameters":[{"name":"endpoint_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^we_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["we_6a0f8d2c-1b3e-4c5d-8e7f-9a0b1c2d3e4f"],"description":"A webhook endpoint id: `we_` and an opaque string. Treat it as opaque."},{"type":"null"}],"description":"Only deliveries to this endpoint.","title":"Endpoint Id"},"description":"Only deliveries to this endpoint."},{"name":"event_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^evt_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["evt_2c9e4b7a-5d1f-4e8a-b3c6-7d0e1f2a3b4c"],"description":"A webhook event id: `evt_` and an opaque string. Treat it as opaque."},{"type":"null"}],"description":"Only deliveries of this event.","title":"Event Id"},"description":"Only deliveries of this event."},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"Only deliveries of this event type.","title":"Event Type"},"description":"Only deliveries of this event type."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/WebhookDeliveryStatus"},{"type":"null"}],"description":"Only deliveries in this status.","title":"Status"},"description":"Only deliveries in this status."},{"name":"created_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"description":"Only deliveries queued at or after this time.","title":"Created After"},"description":"Only deliveries queued at or after this time."},{"name":"created_before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"description":"Only deliveries queued before this time.","title":"Created Before"},"description":"Only deliveries queued before this time."},{"name":"page_number","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number to retrieve.","default":1,"title":"Page Number"},"description":"Page number to retrieve."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"Number of items per page.","default":50,"title":"Page Size"},"description":"Number of items per page."},{"name":"page_token","in":"query","required":false,"schema":{"type":"string"},"description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDeliverySummaryPage"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"attempt_count":1,"completed_at":"2026-09-11T08:00:02Z","created_at":"2026-09-11T08:00:01Z","endpoint_id":"we_2f1c7a1e-4b7d-4c1e-9c0e-5d2a1b3c4d5e","event_id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","event_type":"contacts.completed","id":"dlv_9d2c4e7a-1b3f-4c5d-8e9f-0a1b2c3d4e5f","last_error":null,"last_status_code":200,"next_attempt_at":null,"origin":"fanout","status":"succeeded","updated_at":"2026-09-11T08:00:02Z"}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"401":{"$ref":"#/components/responses/Unauthenticated"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"security":[{"clientBasic":[]}],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/webhook-deliveries \\\n  -u \"$CLIENT_ID:$CLIENT_SECRET\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/webhook-deliveries',\n    auth=(client_id, client_secret),\n)\nprint(response.status_code, response.json())"}]}},"/webhook-deliveries/{public_id}":{"get":{"tags":["OAuth2 Client Webhook Management (Developer)"],"summary":"Get a webhook delivery","description":"One delivery to your endpoints, with every attempt and the full event; any other id is a 404. Authenticate with your application's own credentials over HTTP Basic (`client_id:client_secret`, as at `POST /oauth2/token`), never a user's token.","operationId":"get_webhook_delivery","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","pattern":"^dlv_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["dlv_9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b"],"description":"A webhook delivery id: `dlv_` and an opaque string. Treat it as opaque.","title":"Public Id"},"description":"The delivery's id, as the delivery log lists it."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDeliveryDetail"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"401":{"$ref":"#/components/responses/Unauthenticated"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"security":[{"clientBasic":[]}],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/webhook-deliveries/dlv_9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b \\\n  -u \"$CLIENT_ID:$CLIENT_SECRET\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/webhook-deliveries/dlv_9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b',\n    auth=(client_id, client_secret),\n)\nprint(response.status_code, response.json())"}]}},"/webhook-deliveries/{public_id}/redeliver":{"post":{"tags":["OAuth2 Client Webhook Management (Developer)"],"summary":"Redeliver a webhook delivery","description":"Queue the same event to the same endpoint again, as a new delivery. A delivery not attempted yet, an endpoint no longer active, or a user whose consent no longer admits the event, is a 409. Authenticate with your application's own credentials over HTTP Basic (`client_id:client_secret`, as at `POST /oauth2/token`), never a user's token.","operationId":"redeliver_webhook_delivery","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","pattern":"^dlv_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["dlv_9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b"],"description":"A webhook delivery id: `dlv_` and an opaque string. Treat it as opaque.","title":"Public Id"},"description":"The delivery's id, as the delivery log lists it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Accepted so you can send it on every POST and PATCH. This route is called as your app rather than for a user, so the key is not stored: a repeated request runs again.","x-idempotency-key-stored":false,"title":"Idempotency-Key"},"description":"Optional. Accepted so you can send it on every POST and PATCH. This route is called as your app rather than for a user, so the key is not stored: a repeated request runs again."}],"responses":{"202":{"description":"Accepted; the work finishes in the background.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookDeliverySummary"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"401":{"$ref":"#/components/responses/Unauthenticated"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"security":[{"clientBasic":[]}],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/webhook-deliveries/dlv_9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b/redeliver \\\n  -u \"$CLIENT_ID:$CLIENT_SECRET\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/webhook-deliveries/dlv_9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b/redeliver',\n    auth=(client_id, client_secret),\n)\nprint(response.status_code, response.json())"}]}},"/webhook-events":{"get":{"tags":["OAuth2 Client Webhook Management (Developer)"],"summary":"List webhook events","description":"Events sent to your application, newest first, filtered by the parameters sent. The `user_id` filter refuses a value that is not a user id. Authenticate with your application's own credentials over HTTP Basic (`client_id:client_secret`, as at `POST /oauth2/token`), never a user's token.","operationId":"list_webhook_events","parameters":[{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"description":"Only events of this type.","title":"Type"},"description":"Only events of this type."},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^usr_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["usr_0d6f2a4e-5b7c-4e1d-9a83-2c4b6e8f1a20"],"description":"A user id: `usr_` and an opaque string. Treat it as opaque."},{"type":"null"}],"description":"The inbox owner's user id.","title":"User Id"},"description":"The inbox owner's user id."},{"name":"occurred_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"description":"Only events at or after this time.","title":"Occurred After"},"description":"Only events at or after this time."},{"name":"occurred_before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"description":"Only events before this time.","title":"Occurred Before"},"description":"Only events before this time."},{"name":"page_number","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number to retrieve.","default":1,"title":"Page Number"},"description":"Page number to retrieve."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"Number of items per page.","default":50,"title":"Page Size"},"description":"Number of items per page."},{"name":"page_token","in":"query","required":false,"schema":{"type":"string"},"description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEventSummaryPage"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"created_at":"2026-09-11T08:00:01Z","id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","occurred_at":"2026-09-11T08:00:00Z","type":"contacts.completed","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44"}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"401":{"$ref":"#/components/responses/Unauthenticated"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"security":[{"clientBasic":[]}],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/webhook-events \\\n  -u \"$CLIENT_ID:$CLIENT_SECRET\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/webhook-events',\n    auth=(client_id, client_secret),\n)\nprint(response.status_code, response.json())"}]}},"/webhook-events/{public_id}":{"get":{"tags":["OAuth2 Client Webhook Management (Developer)"],"summary":"Get a webhook event","description":"One event sent to your application, with its payload; any other id is a 404. Authenticate with your application's own credentials over HTTP Basic (`client_id:client_secret`, as at `POST /oauth2/token`), never a user's token.","operationId":"get_webhook_event","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","pattern":"^evt_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["evt_2c9e4b7a-5d1f-4e8a-b3c6-7d0e1f2a3b4c"],"description":"A webhook event id: `evt_` and an opaque string. Treat it as opaque.","title":"Public Id"},"description":"The event's id, as the event log lists it and the `X-Webhook-Event-Id` header carries it."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEventDetail"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"401":{"$ref":"#/components/responses/Unauthenticated"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"security":[{"clientBasic":[]}],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/webhook-events/evt_2c9e4b7a-5d1f-4e8a-b3c6-7d0e1f2a3b4c \\\n  -u \"$CLIENT_ID:$CLIENT_SECRET\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/webhook-events/evt_2c9e4b7a-5d1f-4e8a-b3c6-7d0e1f2a3b4c',\n    auth=(client_id, client_secret),\n)\nprint(response.status_code, response.json())"}]}},"/webhook-events/{public_id}/redeliver":{"post":{"tags":["OAuth2 Client Webhook Management (Developer)"],"summary":"Redeliver a webhook event","description":"Queue the event again to every active endpoint of yours still eligible for it, as new deliveries. An event no endpoint of yours admits any more is a 409. Authenticate with your application's own credentials over HTTP Basic (`client_id:client_secret`, as at `POST /oauth2/token`), never a user's token.","operationId":"redeliver_webhook_event","parameters":[{"name":"public_id","in":"path","required":true,"schema":{"type":"string","pattern":"^evt_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["evt_2c9e4b7a-5d1f-4e8a-b3c6-7d0e1f2a3b4c"],"description":"A webhook event id: `evt_` and an opaque string. Treat it as opaque.","title":"Public Id"},"description":"The event's id, as the event log lists it and the `X-Webhook-Event-Id` header carries it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Accepted so you can send it on every POST and PATCH. This route is called as your app rather than for a user, so the key is not stored: a repeated request runs again.","x-idempotency-key-stored":false,"title":"Idempotency-Key"},"description":"Optional. Accepted so you can send it on every POST and PATCH. This route is called as your app rather than for a user, so the key is not stored: a repeated request runs again."}],"responses":{"202":{"description":"Accepted; the work finishes in the background.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEventRedeliverResponse"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"401":{"$ref":"#/components/responses/Unauthenticated"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"security":[{"clientBasic":[]}],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/webhook-events/evt_2c9e4b7a-5d1f-4e8a-b3c6-7d0e1f2a3b4c/redeliver \\\n  -u \"$CLIENT_ID:$CLIENT_SECRET\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/webhook-events/evt_2c9e4b7a-5d1f-4e8a-b3c6-7d0e1f2a3b4c/redeliver',\n    auth=(client_id, client_secret),\n)\nprint(response.status_code, response.json())"}]}},"/profile/user":{"get":{"tags":["Profile"],"summary":"Get the user","description":"The user's facts from their Google or Microsoft sign-in, or as they edited them.\n\nRequired scopes: `profile:read`","operationId":"user_get_one","security":[{"oauth2":["profile:read"]}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"404":{"$ref":"#/components/responses/NotFound"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["profile:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/profile/user \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/profile/user',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]},"patch":{"tags":["Profile"],"summary":"Edit the user","description":"Partial update: send only the fields you are changing; `null` clears one. An edited field is never overwritten by a later sign-in.\n\nRequired scopes: `profile:write`","operationId":"user_edit","security":[{"oauth2":["profile:write"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserFactsEdit"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["profile:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X PATCH https://api.bind.co/v1/profile/user \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"phones\": [{\"kind\": \"business\", \"number\": \"+1 617 555 0100\"}], \"preferred_language\": \"en-US\", \"timezone\": \"America/New_York\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.patch(\n    'https://api.bind.co/v1/profile/user',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'phones': [{'kind': 'business', 'number': '+1 617 555 0100'}], 'preferred_language': 'en-US', 'timezone': 'America/New_York'},\n)\nprint(response.status_code, response.json())"}]}},"/profile/user-profile":{"get":{"tags":["Profile"],"summary":"Get the user profile","description":"What bind.co inferred about the user from their inbox, or what they saved; each field carries its `bind_inference_confidence` (1.0 once a person set it).\n\nRequired scopes: `profile:read`","operationId":"user_profile_get_one","security":[{"oauth2":["profile:read"]}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileResponse"}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["profile:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/profile/user-profile \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/profile/user-profile',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]},"patch":{"tags":["Profile"],"summary":"Edit the user profile","description":"Partial update: the fields sent are saved with confidence 1.0. Send the suggested values to accept a suggestion. Saving clears the suggestion flag; later inbox refreshes no longer overwrite the profile and only flag a new suggestion.\n\nRequired scopes: `profile:write`","operationId":"user_profile_edit","security":[{"oauth2":["profile:write"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileEdit"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileResponse"}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["profile:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X PATCH https://api.bind.co/v1/profile/user-profile \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"profession\": \"Graphic Designer\", \"title\": \"Founder and CEO\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.patch(\n    'https://api.bind.co/v1/profile/user-profile',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'profession': 'Graphic Designer', 'title': 'Founder and CEO'},\n)\nprint(response.status_code, response.json())"}]}},"/profile/user-profile/confirm":{"post":{"tags":["Profile"],"summary":"Confirm the user profile","description":"Keep the profile as it is; this also rejects a pending suggestion. Saving clears the suggestion flag; later inbox refreshes no longer overwrite the profile and only flag a new suggestion. A profile not built yet is a 409.\n\nRequired scopes: `profile:write`","operationId":"user_profile_confirm","security":[{"oauth2":["profile:write"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileResponse"}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["profile:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/profile/user-profile/confirm \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/profile/user-profile/confirm',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/profile/user-profile/reset":{"post":{"tags":["Profile"],"summary":"Reset the user profile","description":"Hand the profile back to bind.co: the saved values stay until the next inbox refresh, which updates them again like a profile nobody saved, and any suggestion is cleared. A profile nobody saved is unchanged; one not built yet is a 409.\n\nRequired scopes: `profile:write`","operationId":"user_profile_reset","security":[{"oauth2":["profile:write"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileResponse"}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["profile:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/profile/user-profile/reset \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/profile/user-profile/reset',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/profile/user-profile/suggestions":{"get":{"tags":["Profile"],"summary":"Get the user profile suggestions","description":"While a suggestion is flagged, each field where the newest inference differs from the saved profile, with both values; otherwise `{}`.\n\nRequired scopes: `profile:read`","operationId":"user_profile_suggestions","responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserProfileSuggestions"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"security":[{"oauth2":["profile:read"]}],"x-required-scopes":["profile:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/profile/user-profile/suggestions \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/profile/user-profile/suggestions',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/profile/company/search":{"post":{"tags":["Profile"],"summary":"Search the user's companies","description":"A page of the companies the user is linked to. With no body, the first page holds up to 50 of them.\n\nRequired scopes: `profile:read`","operationId":"company_search","security":[{"oauth2":["profile:read"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Accepted so you can send it on every POST. A search changes nothing, so repeating it is already safe: the key is not stored and each request answers with the current results.","x-idempotency-key-stored":false,"title":"Idempotency-Key"},"description":"Optional. Accepted so you can send it on every POST. A search changes nothing, so repeating it is already safe: the key is not stored and each request answers with the current results."}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/PageRequest"},{"type":"null"}],"title":"Page"},"example":{"page_number":2,"page_size":50}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyResponsePage"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"company_id":"cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d","company_kind":"business","company_legal_name":"Northwind Studio LLC","company_name":"Northwind Studio","company_source":"gmail_hd","country":"US","founded_year":2017,"home_currency":"USD","primary_domain":"northwind-studio.com","primary_email":"hello@northwind-studio.com","primary_jurisdiction":"US-MA"}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["profile:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/profile/company/search \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"page_number\": 2, \"page_size\": 50}'"},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/profile/company/search',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n    json={'page_number': 2, 'page_size': 50},\n)\nprint(response.status_code, response.json())"}]}},"/profile/company/{company_id}":{"get":{"tags":["Profile"],"summary":"Get a company","description":"A company the user is linked to; any other company is a 404.\n\nRequired scopes: `profile:read`","operationId":"company_get_one","security":[{"oauth2":["profile:read"]}],"parameters":[{"name":"company_id","in":"path","required":true,"schema":{"type":"string","pattern":"^cmp_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d"],"description":"A company id: `cmp_` and an opaque string. Treat it as opaque.","title":"Company Id"},"description":"The company's id, as the companies search returns it."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyResponse"}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["profile:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/profile/company/cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/profile/company/cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]},"patch":{"tags":["Profile"],"summary":"Edit a company","description":"Partial update by a company admin or subject; it applies to every member. An edited field is never overwritten by a later sign-in. `company_kind` is first-party only.\n\nRequired scopes: `profile:write`","operationId":"company_edit","security":[{"oauth2":["profile:write"]}],"parameters":[{"name":"company_id","in":"path","required":true,"schema":{"type":"string","pattern":"^cmp_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d"],"description":"A company id: `cmp_` and an opaque string. Treat it as opaque.","title":"Company Id"},"description":"The company's id, as the companies search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyEdit"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyResponse"}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["profile:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X PATCH https://api.bind.co/v1/profile/company/cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"company_legal_name\": \"Northwind Studio LLC\", \"founded_year\": 2017, \"primary_jurisdiction\": \"US-DE\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.patch(\n    'https://api.bind.co/v1/profile/company/cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'company_legal_name': 'Northwind Studio LLC', 'founded_year': 2017, 'primary_jurisdiction': 'US-DE'},\n)\nprint(response.status_code, response.json())"}]}},"/profile/company-profile/{company_id}":{"get":{"tags":["Profile"],"summary":"Get a company profile","description":"What bind.co inferred about a company the user is linked to, or what a member saved; each field carries its `bind_inference_confidence` (1.0 once a person set it).\n\nRequired scopes: `profile:read`","operationId":"company_profile_get_one","security":[{"oauth2":["profile:read"]}],"parameters":[{"name":"company_id","in":"path","required":true,"schema":{"type":"string","pattern":"^cmp_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d"],"description":"A company id: `cmp_` and an opaque string. Treat it as opaque.","title":"Company Id"},"description":"The company's id, as the companies search returns it."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyProfileResponse"}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["profile:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/profile/company-profile/cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/profile/company-profile/cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]},"patch":{"tags":["Profile"],"summary":"Edit a company profile","description":"Partial update by a company admin or subject: the fields sent are saved with confidence 1.0. Send the suggested values to accept a suggestion. Saving clears the suggestion flag; later inbox refreshes no longer overwrite the profile and only flag a new suggestion.\n\nRequired scopes: `profile:write`","operationId":"company_profile_edit","security":[{"oauth2":["profile:write"]}],"parameters":[{"name":"company_id","in":"path","required":true,"schema":{"type":"string","pattern":"^cmp_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d"],"description":"A company id: `cmp_` and an opaque string. Treat it as opaque.","title":"Company Id"},"description":"The company's id, as the companies search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyProfileEdit"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyProfileResponse"}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["profile:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X PATCH https://api.bind.co/v1/profile/company-profile/cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"aliases\": [\"Northwind\", \"NW Studio\"], \"fiscal_year_end\": \"12-31\", \"reporting_currency\": \"USD\", \"tax_numbers\": [{\"jurisdiction\": \"US\", \"number\": \"12-3456789\", \"type\": \"EIN\"}]}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.patch(\n    'https://api.bind.co/v1/profile/company-profile/cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'aliases': ['Northwind', 'NW Studio'], 'fiscal_year_end': '12-31', 'reporting_currency': 'USD', 'tax_numbers': [{'jurisdiction': 'US', 'number': '12-3456789', 'type': 'EIN'}]},\n)\nprint(response.status_code, response.json())"}]}},"/profile/company-profile/{company_id}/confirm":{"post":{"tags":["Profile"],"summary":"Confirm a company profile","description":"Keep the profile as it is (company admin or subject); this also rejects a pending suggestion. Saving clears the suggestion flag; later inbox refreshes no longer overwrite the profile and only flag a new suggestion. A profile not built yet is a 409.\n\nRequired scopes: `profile:write`","operationId":"company_profile_confirm","security":[{"oauth2":["profile:write"]}],"parameters":[{"name":"company_id","in":"path","required":true,"schema":{"type":"string","pattern":"^cmp_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d"],"description":"A company id: `cmp_` and an opaque string. Treat it as opaque.","title":"Company Id"},"description":"The company's id, as the companies search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyProfileResponse"}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["profile:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/profile/company-profile/cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d/confirm \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/profile/company-profile/cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d/confirm',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/profile/company-profile/{company_id}/reset":{"post":{"tags":["Profile"],"summary":"Reset a company profile","description":"Company admin or subject. Hand the profile back to bind.co: the saved values stay until the next inbox refresh, which updates them again like a profile nobody saved, and any suggestion is cleared. A profile nobody saved is unchanged; one not built yet is a 409.\n\nRequired scopes: `profile:write`","operationId":"company_profile_reset","security":[{"oauth2":["profile:write"]}],"parameters":[{"name":"company_id","in":"path","required":true,"schema":{"type":"string","pattern":"^cmp_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d"],"description":"A company id: `cmp_` and an opaque string. Treat it as opaque.","title":"Company Id"},"description":"The company's id, as the companies search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyProfileResponse"}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["profile:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/profile/company-profile/cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d/reset \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/profile/company-profile/cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d/reset',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/profile/company-profile/{company_id}/suggestions":{"get":{"tags":["Profile"],"summary":"Get the company profile suggestions","description":"While a suggestion is flagged, each field where the newest inference differs from the saved profile, with both values; otherwise `{}`.\n\nRequired scopes: `profile:read`","operationId":"company_profile_suggestions","security":[{"oauth2":["profile:read"]}],"parameters":[{"name":"company_id","in":"path","required":true,"schema":{"type":"string","pattern":"^cmp_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d"],"description":"A company id: `cmp_` and an opaque string. Treat it as opaque.","title":"Company Id"},"description":"The company's id, as the companies search returns it."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyProfileSuggestions"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["profile:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/profile/company-profile/cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d/suggestions \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/profile/company-profile/cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d/suggestions',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/contacts":{"get":{"tags":["Contacts"],"summary":"List contacts","description":"The user's contacts, `active` only unless `status` says otherwise, each with every email address and the company each belongs to. Filters on pending suggestion, contact date ranges (inclusive), an address (`email`, primary or not) and a company (`company_name`); `search` matches name, primary email, title and profession; `sort_by` takes signed keys. `POST /v1/contacts/search` takes the same filters in a body.\n\nRequired scopes: `contacts:read`","operationId":"list_contacts","security":[{"oauth2":["contacts:read"]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Matches the contact's name, primary email, title and profession.","title":"Search"},"description":"Matches the contact's name, primary email, title and profession."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ProfileStatusFilter"}},{"type":"null"}],"description":"Default `active` only.","title":"Status"},"description":"Default `active` only."},{"name":"has_suggestion","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"True for only those with a suggested change waiting; false for only those without.","title":"Has Suggestion"},"description":"True for only those with a suggested change waiting; false for only those without."},{"name":"last_contact_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"description":"Last exchanged email on or after this time.","title":"Last Contact From"},"description":"Last exchanged email on or after this time."},{"name":"last_contact_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"description":"Last exchanged email on or before this time.","title":"Last Contact To"},"description":"Last exchanged email on or before this time."},{"name":"first_contact_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"description":"First exchanged email on or after this time.","title":"First Contact From"},"description":"First exchanged email on or after this time."},{"name":"first_contact_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"description":"First exchanged email on or before this time.","title":"First Contact To"},"description":"First exchanged email on or before this time."},{"name":"email","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":320},{"type":"null"}],"description":"Only the contact holding this address, primary or not (exact, ignoring case).","title":"Email"},"description":"Only the contact holding this address, primary or not (exact, ignoring case)."},{"name":"company_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"description":"Only contacts with an address at this company (exact, ignoring case).","title":"Company Name"},"description":"Only contacts with an address at this company (exact, ignoring case)."},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Signed sort keys, `-` for descending; unknown keys are refused (422). Default `contact_name`.","title":"Sort By"},"description":"Signed sort keys, `-` for descending; unknown keys are refused (422). Default `contact_name`."},{"name":"page_number","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number to retrieve.","default":1,"title":"Page Number"},"description":"Page number to retrieve."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"Number of items per page.","default":50,"title":"Page Size"},"description":"Number of items per page."},{"name":"page_token","in":"query","required":false,"schema":{"type":"string"},"description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactProfileResponsePage"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"contact_address":{"bind_inference_confidence":null,"value":null},"contact_date_of_birth":{"bind_inference_confidence":null,"value":null},"contact_direct_first_contact":"2024-01-19T08:03:00Z","contact_direct_last_contact":"2026-10-02T15:04:00Z","contact_id":"con_3SrGoE2zltj","contact_name":{"bind_inference_confidence":0.95,"value":"Dana Ruiz"},"contact_phone":{"bind_inference_confidence":null,"value":null},"contact_primary_email":{"bind_inference_confidence":0.99,"value":"dana@acme.com"},"contact_profession":{"bind_inference_confidence":0.8,"value":"Accounting"},"contact_relationship_strength":{"bind_inference_confidence":0.7,"value":7},"contact_status":"active","contact_summary":{"bind_inference_confidence":0.84,"value":"Acme's controller; handles the monthly close."},"contact_title":{"bind_inference_confidence":0.9,"value":"Controller"},"contact_tone":{"bind_inference_confidence":0.66,"value":4},"email_addresses":[{"company_name":{"bind_inference_confidence":0.9,"value":"Acme"},"email_address":"dana@acme.com"},{"company_name":{"bind_inference_confidence":null,"value":null},"email_address":"dana.ruiz@gmail.com"}],"first_contact":"2024-01-18T09:12:00Z","last_contact":"2026-10-02T15:04:00Z","other_indirect_first_contact":"2024-03-02T10:45:00Z","other_indirect_last_contact":"2025-11-14T16:30:00Z","suggestion_updated_at":null,"truth_updated_at":null,"user_direct_first_contact":"2024-01-18T09:12:00Z","user_direct_last_contact":"2026-09-30T11:20:00Z","user_indirect_first_contact":null,"user_indirect_last_contact":null}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["contacts:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/contacts \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/contacts',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]},"post":{"tags":["Contacts"],"summary":"Create a contact","description":"Add a contact the inbox has not shown yet, saved as set by a person: the name, the email address and any profile details sent, each with confidence 1.0. Give it roles with `POST /v1/roles`. An address another active or dismissed contact already holds, a user whose mailbox has not been read yet, or a create while contacts are being refreshed from the inbox, is a 409.\n\nRequired scopes: `contacts:write`","operationId":"contact_create","security":[{"oauth2":["contacts:write"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactCreateBody"}}}},"responses":{"201":{"description":"Created; the body is the new record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactProfileResponse"}}},"headers":{"Location":{"description":"The path of the created record.","schema":{"type":"string"}},"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["contacts:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/contacts \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"contact_name\": \"Ada Lovelace\", \"contact_primary_email\": \"ada@example.com\", \"contact_title\": \"CFO\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/contacts',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'contact_name': 'Ada Lovelace', 'contact_primary_email': 'ada@example.com', 'contact_title': 'CFO'},\n)\nprint(response.status_code, response.json())"}]}},"/contacts/search":{"post":{"tags":["Contacts"],"summary":"Search contacts","description":"The user's contacts, `active` only unless `status` says otherwise, each with every email address and the company each belongs to. Filters on pending suggestion, contact date ranges (inclusive), an address (`email`, primary or not) and a company (`company_name`); `search` matches name, primary email, title and profession; `sort_by` takes signed keys. The same list as `GET /v1/contacts`.\n\nRequired scopes: `contacts:read`","operationId":"search_contacts","security":[{"oauth2":["contacts:read"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Accepted so you can send it on every POST. A search changes nothing, so repeating it is already safe: the key is not stored and each request answers with the current results.","x-idempotency-key-stored":false,"title":"Idempotency-Key"},"description":"Optional. Accepted so you can send it on every POST. A search changes nothing, so repeating it is already safe: the key is not stored and each request answers with the current results."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactSearchRequest"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactProfileResponsePage"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"contact_address":{"bind_inference_confidence":null,"value":null},"contact_date_of_birth":{"bind_inference_confidence":null,"value":null},"contact_direct_first_contact":"2024-01-19T08:03:00Z","contact_direct_last_contact":"2026-10-02T15:04:00Z","contact_id":"con_3SrGoE2zltj","contact_name":{"bind_inference_confidence":0.95,"value":"Dana Ruiz"},"contact_phone":{"bind_inference_confidence":null,"value":null},"contact_primary_email":{"bind_inference_confidence":0.99,"value":"dana@acme.com"},"contact_profession":{"bind_inference_confidence":0.8,"value":"Accounting"},"contact_relationship_strength":{"bind_inference_confidence":0.7,"value":7},"contact_status":"active","contact_summary":{"bind_inference_confidence":0.84,"value":"Acme's controller; handles the monthly close."},"contact_title":{"bind_inference_confidence":0.9,"value":"Controller"},"contact_tone":{"bind_inference_confidence":0.66,"value":4},"email_addresses":[{"company_name":{"bind_inference_confidence":0.9,"value":"Acme"},"email_address":"dana@acme.com"},{"company_name":{"bind_inference_confidence":null,"value":null},"email_address":"dana.ruiz@gmail.com"}],"first_contact":"2024-01-18T09:12:00Z","last_contact":"2026-10-02T15:04:00Z","other_indirect_first_contact":"2024-03-02T10:45:00Z","other_indirect_last_contact":"2025-11-14T16:30:00Z","suggestion_updated_at":null,"truth_updated_at":null,"user_direct_first_contact":"2024-01-18T09:12:00Z","user_direct_last_contact":"2026-09-30T11:20:00Z","user_indirect_first_contact":null,"user_indirect_last_contact":null}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["contacts:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/contacts/search \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"sort_by\": [\"-last_contact\"], \"page_number\": 1, \"page_size\": 50}'"},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/contacts/search',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n    json={'sort_by': ['-last_contact'], 'page_number': 1, 'page_size': 50},\n)\nprint(response.status_code, response.json())"}]}},"/contacts/{contact_id}":{"get":{"tags":["Contacts"],"summary":"Get a contact","description":"A contact in any status but merged: what the inbox tells about the person, each detail with its `bind_inference_confidence` (1.0 once a person set it). Last and first contact are facts read from the mailbox.\n\nRequired scopes: `contacts:read`","operationId":"contact_get_one","security":[{"oauth2":["contacts:read"]}],"parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"string","pattern":"^con_[0-9A-Za-z]{11}$","examples":["con_3SrGoE2zltj"],"description":"A contact id: `con_` and an opaque string. Treat it as opaque.","title":"Contact Id"},"description":"The contact's id, as the contacts search returns it."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactProfileResponse"}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["contacts:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/contacts/con_3SrGoE2zltj \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/contacts/con_3SrGoE2zltj',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]},"patch":{"tags":["Contacts"],"summary":"Edit a contact","description":"Partial update of an active contact: the fields sent are saved with confidence 1.0, `null` clears one, except the name. Primary email and last contact are not editable (422). Saving clears the suggestion flag; later inbox refreshes no longer change the saved fields and only flag a new suggestion. A dismissed contact is a 409.\n\nRequired scopes: `contacts:write`","operationId":"contact_edit","security":[{"oauth2":["contacts:write"]}],"parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"string","pattern":"^con_[0-9A-Za-z]{11}$","examples":["con_3SrGoE2zltj"],"description":"A contact id: `con_` and an opaque string. Treat it as opaque.","title":"Contact Id"},"description":"The contact's id, as the contacts search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactProfileEdit"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactProfileResponse"}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["contacts:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X PATCH https://api.bind.co/v1/contacts/con_3SrGoE2zltj \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"contact_name\": \"Dana Ruiz-Ortega\", \"contact_phone\": \"+1 617 555 0142\", \"contact_title\": \"CFO\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.patch(\n    'https://api.bind.co/v1/contacts/con_3SrGoE2zltj',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'contact_name': 'Dana Ruiz-Ortega', 'contact_phone': '+1 617 555 0142', 'contact_title': 'CFO'},\n)\nprint(response.status_code, response.json())"}]}},"/contacts/{contact_id}/confirm":{"post":{"tags":["Contacts"],"summary":"Confirm a contact","description":"Keep the contact as it is; this also rejects a pending suggestion. Saving clears the suggestion flag; later inbox refreshes no longer change the saved fields and only flag a new suggestion. A dismissed contact is a 409. A contact not built yet is a 409.\n\nRequired scopes: `contacts:write`","operationId":"contact_confirm","security":[{"oauth2":["contacts:write"]}],"parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"string","pattern":"^con_[0-9A-Za-z]{11}$","examples":["con_3SrGoE2zltj"],"description":"A contact id: `con_` and an opaque string. Treat it as opaque.","title":"Contact Id"},"description":"The contact's id, as the contacts search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactProfileResponse"}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["contacts:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/contacts/con_3SrGoE2zltj/confirm \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/contacts/con_3SrGoE2zltj/confirm',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/contacts/{contact_id}/reject":{"post":{"tags":["Contacts"],"summary":"Reject a contact","description":"Dismiss an active contact: it and its roles leave every list, nothing is deleted, and it can be restored. A contact already dismissed is a 409.\n\nRequired scopes: `contacts:write`","operationId":"contact_reject","security":[{"oauth2":["contacts:write"]}],"parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"string","pattern":"^con_[0-9A-Za-z]{11}$","examples":["con_3SrGoE2zltj"],"description":"A contact id: `con_` and an opaque string. Treat it as opaque.","title":"Contact Id"},"description":"The contact's id, as the contacts search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactProfileResponse"}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["contacts:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/contacts/con_3SrGoE2zltj/reject \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/contacts/con_3SrGoE2zltj/reject',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/contacts/{contact_id}/restore":{"post":{"tags":["Contacts"],"summary":"Restore a contact","description":"Bring back a contact a person rejected, active and as set by a person. Any other contact, including one bind.co dismissed as a newsletter, is a 409.\n\nRequired scopes: `contacts:write`","operationId":"contact_restore","security":[{"oauth2":["contacts:write"]}],"parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"string","pattern":"^con_[0-9A-Za-z]{11}$","examples":["con_3SrGoE2zltj"],"description":"A contact id: `con_` and an opaque string. Treat it as opaque.","title":"Contact Id"},"description":"The contact's id, as the contacts search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactProfileResponse"}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["contacts:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/contacts/con_3SrGoE2zltj/restore \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/contacts/con_3SrGoE2zltj/restore',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/contacts/{contact_id}/merge":{"post":{"tags":["Contacts"],"summary":"Merge contacts into this one","description":"Fold each listed contact into this one: addresses, roles and history move over and the folded contacts become `merged`. Every contact must be the user's (404), active, listed once and not this one (422); nothing is merged unless all are. A merge can be undone with `POST /v1/contacts/{contact_id}/unmerge`.\n\nRequired scopes: `contacts:write`","operationId":"contact_merge","security":[{"oauth2":["contacts:write"]}],"parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"string","pattern":"^con_[0-9A-Za-z]{11}$","examples":["con_3SrGoE2zltj"],"description":"A contact id: `con_` and an opaque string. Treat it as opaque.","title":"Contact Id"},"description":"The contact's id, as the contacts search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactMergeBody"},"example":{"loser_contact_ids":["con_K5qkIECrRvk","con_1KhA9w7bROa"]}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactProfileResponse"}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["contacts:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/contacts/con_3SrGoE2zltj/merge \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"loser_contact_ids\": [\"con_K5qkIECrRvk\", \"con_1KhA9w7bROa\"]}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/contacts/con_3SrGoE2zltj/merge',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'loser_contact_ids': ['con_K5qkIECrRvk', 'con_1KhA9w7bROa']},\n)\nprint(response.status_code, response.json())"}]}},"/contacts/{contact_id}/unmerge":{"post":{"tags":["Contacts"],"summary":"Unmerge contacts from this one","description":"Undo merges into this contact, made by a person or by bind.co's duplicate check, newest first: each merged-away contact comes back active with its own id, addresses, roles and history, and bind.co never merges the two again on its own. Name the contacts to bring back, or leave the list out to undo every merge into this one. This contact must be active; a merge made before merges could be undone, a contact changed since, a later merge touching them, or a merge already running, is a 409, and nothing is undone unless all can be.\n\nRequired scopes: `contacts:write`","operationId":"contact_unmerge","security":[{"oauth2":["contacts:write"]}],"parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"string","pattern":"^con_[0-9A-Za-z]{11}$","examples":["con_3SrGoE2zltj"],"description":"A contact id: `con_` and an opaque string. Treat it as opaque.","title":"Contact Id"},"description":"The contact's id, as the contacts search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactUnmergeBody"},"example":{"loser_contact_ids":["con_K5qkIECrRvk"]}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactUnmergeResponse"},"example":{"contact":{"contact_address":{"bind_inference_confidence":null,"value":null},"contact_date_of_birth":{"bind_inference_confidence":null,"value":null},"contact_direct_first_contact":"2024-01-19T08:03:00Z","contact_direct_last_contact":"2026-10-02T15:04:00Z","contact_id":"con_3SrGoE2zltj","contact_name":{"bind_inference_confidence":0.95,"value":"Dana Ruiz"},"contact_phone":{"bind_inference_confidence":null,"value":null},"contact_primary_email":{"bind_inference_confidence":0.99,"value":"dana@acme.com"},"contact_profession":{"bind_inference_confidence":0.8,"value":"Accounting"},"contact_relationship_strength":{"bind_inference_confidence":0.7,"value":7},"contact_status":"active","contact_summary":{"bind_inference_confidence":0.84,"value":"Acme's controller; handles the monthly close."},"contact_title":{"bind_inference_confidence":0.9,"value":"Controller"},"contact_tone":{"bind_inference_confidence":0.66,"value":4},"email_addresses":[{"company_name":{"bind_inference_confidence":0.9,"value":"Acme"},"email_address":"dana@acme.com"},{"company_name":{"bind_inference_confidence":null,"value":null},"email_address":"dana.ruiz@gmail.com"}],"first_contact":"2024-01-18T09:12:00Z","last_contact":"2026-10-02T15:04:00Z","other_indirect_first_contact":"2024-03-02T10:45:00Z","other_indirect_last_contact":"2025-11-14T16:30:00Z","suggestion_updated_at":null,"truth_updated_at":null,"user_direct_first_contact":"2024-01-18T09:12:00Z","user_direct_last_contact":"2026-09-30T11:20:00Z","user_indirect_first_contact":null,"user_indirect_last_contact":null},"restored_contact_ids":["con_K5qkIECrRvk"]}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["contacts:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/contacts/con_3SrGoE2zltj/unmerge \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"loser_contact_ids\": [\"con_K5qkIECrRvk\"]}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/contacts/con_3SrGoE2zltj/unmerge',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'loser_contact_ids': ['con_K5qkIECrRvk']},\n)\nprint(response.status_code, response.json())"}]}},"/contacts/{contact_id}/suggestions":{"get":{"tags":["Contacts"],"summary":"Get a contact's suggestions","description":"While a suggestion is flagged, the details where the newest inference differs from the saved contact; otherwise `{}`.\n\nRequired scopes: `contacts:read`","operationId":"contact_suggestions","security":[{"oauth2":["contacts:read"]}],"parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"string","pattern":"^con_[0-9A-Za-z]{11}$","examples":["con_3SrGoE2zltj"],"description":"A contact id: `con_` and an opaque string. Treat it as opaque.","title":"Contact Id"},"description":"The contact's id, as the contacts search returns it."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactProfileSuggestions"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["contacts:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/contacts/con_3SrGoE2zltj/suggestions \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/contacts/con_3SrGoE2zltj/suggestions',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/contacts/{contact_id}/reset":{"post":{"tags":["Contacts"],"summary":"Reset a contact","description":"Hand an active contact back to bind.co: the saved values stay until the next inbox refresh, which updates them again like a contact nobody saved, and any suggestion is cleared. A contact nobody saved is unchanged; a dismissed or not yet built contact is a 409.\n\nRequired scopes: `contacts:write`","operationId":"contact_reset","security":[{"oauth2":["contacts:write"]}],"parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"string","pattern":"^con_[0-9A-Za-z]{11}$","examples":["con_3SrGoE2zltj"],"description":"A contact id: `con_` and an opaque string. Treat it as opaque.","title":"Contact Id"},"description":"The contact's id, as the contacts search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactProfileResponse"}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["contacts:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/contacts/con_3SrGoE2zltj/reset \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/contacts/con_3SrGoE2zltj/reset',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/roles":{"get":{"tags":["Contacts"],"summary":"List contact roles","description":"The user's roles on active contacts, `active` only unless `status` says otherwise, each with its contact's name, primary email and first and last contact. Filters on type, stage, contact, pending suggestion, contact date ranges (inclusive), an address of the contact (`email`, primary or not) and a company (`company_name`); `search` matches the contact's name, primary email, title and profession; `sort_by` takes signed keys. `POST /v1/roles/search` takes the same filters in a body.\n\nRequired scopes: `contacts:read`","operationId":"list_roles","security":[{"oauth2":["contacts:read"]}],"parameters":[{"name":"entity_type","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Only these roles (matches any).","title":"Entity Type"},"description":"Only these roles (matches any)."},{"name":"entity_stage","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Only these stages (matches any).","title":"Entity Stage"},"description":"Only these stages (matches any)."},{"name":"contact_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^con_[0-9A-Za-z]{11}$","examples":["con_3SrGoE2zltj"],"description":"A contact id: `con_` and an opaque string. Treat it as opaque."},{"type":"null"}],"description":"Only this contact's roles.","title":"Contact Id"},"description":"Only this contact's roles."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Matches the contact's name, primary email, title and profession.","title":"Search"},"description":"Matches the contact's name, primary email, title and profession."},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/ProfileStatusFilter"}},{"type":"null"}],"description":"Default `active` only.","title":"Status"},"description":"Default `active` only."},{"name":"has_suggestion","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"True for only those with a suggested change waiting; false for only those without.","title":"Has Suggestion"},"description":"True for only those with a suggested change waiting; false for only those without."},{"name":"last_contact_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"description":"Last exchanged email on or after this time.","title":"Last Contact From"},"description":"Last exchanged email on or after this time."},{"name":"last_contact_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"description":"Last exchanged email on or before this time.","title":"Last Contact To"},"description":"Last exchanged email on or before this time."},{"name":"first_contact_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"description":"First exchanged email on or after this time.","title":"First Contact From"},"description":"First exchanged email on or after this time."},{"name":"first_contact_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"description":"First exchanged email on or before this time.","title":"First Contact To"},"description":"First exchanged email on or before this time."},{"name":"email","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":320},{"type":"null"}],"description":"Only the contact holding this address, primary or not (exact, ignoring case).","title":"Email"},"description":"Only the contact holding this address, primary or not (exact, ignoring case)."},{"name":"company_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"description":"Only contacts with an address at this company (exact, ignoring case).","title":"Company Name"},"description":"Only contacts with an address at this company (exact, ignoring case)."},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Signed sort keys, `-` for descending; unknown keys are refused (422). Default `contact_name`.","title":"Sort By"},"description":"Signed sort keys, `-` for descending; unknown keys are refused (422). Default `contact_name`."},{"name":"page_number","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number to retrieve.","default":1,"title":"Page Number"},"description":"Page number to retrieve."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"Number of items per page.","default":50,"title":"Page Size"},"description":"Number of items per page."},{"name":"page_token","in":"query","required":false,"schema":{"type":"string"},"description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleProfileRowPage"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"category_contact_role_id":"rol_1S9dCsGYrSI","contact_direct_first_contact":"2024-01-19T08:03:00Z","contact_direct_last_contact":"2026-10-02T15:04:00Z","contact_id":"con_3SrGoE2zltj","contact_name":{"bind_inference_confidence":0.95,"value":"Dana Ruiz"},"contact_primary_email":{"bind_inference_confidence":0.99,"value":"dana@acme.com"},"contact_role_status":"active","dismissed_at":null,"entity_stage":{"bind_inference_confidence":0.81,"value":"ACTIVE"},"entity_type":{"bind_inference_confidence":0.92,"value":"ACCOUNTANT"},"entity_type_inferred":{"bind_inference_confidence":null,"value":null},"entity_type_inferred_streak":0,"first_contact":"2024-01-18T09:12:00Z","home_currency":{"bind_inference_confidence":0.77,"value":"USD"},"last_contact":"2026-10-02T15:04:00Z","other_indirect_first_contact":"2024-03-02T10:45:00Z","other_indirect_last_contact":"2025-11-14T16:30:00Z","suggestion_updated_at":null,"truth_updated_at":null,"user_direct_first_contact":"2024-01-18T09:12:00Z","user_direct_last_contact":"2026-09-30T11:20:00Z","user_indirect_first_contact":null,"user_indirect_last_contact":null}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["contacts:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/roles \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/roles',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]},"post":{"tags":["Contacts"],"summary":"Create a contact role","description":"Give an active contact a role type it does not hold yet, saved as set by a person. A type the contact had dismissed comes back with its id and history. An unknown or inactive contact is a 404; a type the contact already holds is a 409.\n\nRequired scopes: `contacts:write`","operationId":"role_create","security":[{"oauth2":["contacts:write"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleCreateBody"}}}},"responses":{"201":{"description":"Created; the body is the new record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleProfileResponse"}}},"headers":{"Location":{"description":"The path of the created record.","schema":{"type":"string"}},"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["contacts:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/roles \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"contact_id\": \"con_3SrGoE2zltj\", \"entity_stage\": \"ACTIVE\", \"entity_type\": \"ACCOUNTANT\", \"home_currency\": \"USD\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/roles',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'contact_id': 'con_3SrGoE2zltj', 'entity_stage': 'ACTIVE', 'entity_type': 'ACCOUNTANT', 'home_currency': 'USD'},\n)\nprint(response.status_code, response.json())"}]}},"/roles/search":{"post":{"tags":["Contacts"],"summary":"Search contact roles","description":"The user's roles on active contacts, `active` only unless `status` says otherwise, each with its contact's name, primary email and first and last contact. Filters on type, stage, contact, pending suggestion, contact date ranges (inclusive), an address of the contact (`email`, primary or not) and a company (`company_name`); `search` matches the contact's name, primary email, title and profession; `sort_by` takes signed keys. The same list as `GET /v1/roles`.\n\nRequired scopes: `contacts:read`","operationId":"search_roles","security":[{"oauth2":["contacts:read"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Accepted so you can send it on every POST. A search changes nothing, so repeating it is already safe: the key is not stored and each request answers with the current results.","x-idempotency-key-stored":false,"title":"Idempotency-Key"},"description":"Optional. Accepted so you can send it on every POST. A search changes nothing, so repeating it is already safe: the key is not stored and each request answers with the current results."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleSearchRequest"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleProfileRowPage"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"category_contact_role_id":"rol_1S9dCsGYrSI","contact_direct_first_contact":"2024-01-19T08:03:00Z","contact_direct_last_contact":"2026-10-02T15:04:00Z","contact_id":"con_3SrGoE2zltj","contact_name":{"bind_inference_confidence":0.95,"value":"Dana Ruiz"},"contact_primary_email":{"bind_inference_confidence":0.99,"value":"dana@acme.com"},"contact_role_status":"active","dismissed_at":null,"entity_stage":{"bind_inference_confidence":0.81,"value":"ACTIVE"},"entity_type":{"bind_inference_confidence":0.92,"value":"ACCOUNTANT"},"entity_type_inferred":{"bind_inference_confidence":null,"value":null},"entity_type_inferred_streak":0,"first_contact":"2024-01-18T09:12:00Z","home_currency":{"bind_inference_confidence":0.77,"value":"USD"},"last_contact":"2026-10-02T15:04:00Z","other_indirect_first_contact":"2024-03-02T10:45:00Z","other_indirect_last_contact":"2025-11-14T16:30:00Z","suggestion_updated_at":null,"truth_updated_at":null,"user_direct_first_contact":"2024-01-18T09:12:00Z","user_direct_last_contact":"2026-09-30T11:20:00Z","user_indirect_first_contact":null,"user_indirect_last_contact":null}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["contacts:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/roles/search \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"sort_by\": [\"-last_contact\"], \"page_number\": 1, \"page_size\": 50}'"},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/roles/search',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n    json={'sort_by': ['-last_contact'], 'page_number': 1, 'page_size': 50},\n)\nprint(response.status_code, response.json())"}]}},"/roles/families":{"get":{"tags":["Contacts"],"summary":"Get the role families","description":"How contact role types group into families, and each family's refresh and stage settings, as they apply to the user's company.\n\nRequired scopes: `contacts:read`","operationId":"role_families_get","responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleFamilyConfig"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"security":[{"oauth2":["contacts:read"]}],"x-required-scopes":["contacts:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/roles/families \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/roles/families',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/roles/{role_id}":{"get":{"tags":["Contacts"],"summary":"Get a contact role","description":"A contact role in any status but merged: its type, stage and currency, each with its `bind_inference_confidence` (1.0 once a person set it), and the type the inbox currently suggests with how many refreshes in a row it has won.\n\nRequired scopes: `contacts:read`","operationId":"role_get_one","security":[{"oauth2":["contacts:read"]}],"parameters":[{"name":"role_id","in":"path","required":true,"schema":{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","examples":["rol_1S9dCsGYrSI"],"description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","title":"Role Id"},"description":"The contact role's id, as the roles list returns it."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleProfileResponse"}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["contacts:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/roles/rol_1S9dCsGYrSI \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/roles/rol_1S9dCsGYrSI',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]},"patch":{"tags":["Contacts"],"summary":"Edit a contact role","description":"Partial update of an active role: the fields sent are saved with confidence 1.0. `entity_type` must be a contact role type the contact does not hold already (409); `entity_stage` must be a stage of the type (422). Saving clears the suggestion flag; later inbox refreshes no longer change the role and only flag a new suggestion. A dismissed role is a 409; restore it first.\n\nRequired scopes: `contacts:write`","operationId":"role_edit","security":[{"oauth2":["contacts:write"]}],"parameters":[{"name":"role_id","in":"path","required":true,"schema":{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","examples":["rol_1S9dCsGYrSI"],"description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","title":"Role Id"},"description":"The contact role's id, as the roles list returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleProfileEdit"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleProfileResponse"}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["contacts:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X PATCH https://api.bind.co/v1/roles/rol_1S9dCsGYrSI \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_stage\": \"ACTIVE\", \"home_currency\": \"EUR\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.patch(\n    'https://api.bind.co/v1/roles/rol_1S9dCsGYrSI',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'entity_stage': 'ACTIVE', 'home_currency': 'EUR'},\n)\nprint(response.status_code, response.json())"}]}},"/roles/{role_id}/confirm":{"post":{"tags":["Contacts"],"summary":"Confirm a contact role","description":"Keep the role as it is; this also rejects a pending suggestion. Saving clears the suggestion flag; later inbox refreshes no longer change the role and only flag a new suggestion. A dismissed role is a 409; restore it first. A role not scored yet is a 409.\n\nRequired scopes: `contacts:write`","operationId":"role_confirm","security":[{"oauth2":["contacts:write"]}],"parameters":[{"name":"role_id","in":"path","required":true,"schema":{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","examples":["rol_1S9dCsGYrSI"],"description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","title":"Role Id"},"description":"The contact role's id, as the roles list returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleProfileResponse"}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["contacts:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/roles/rol_1S9dCsGYrSI/confirm \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/roles/rol_1S9dCsGYrSI/confirm',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/roles/{role_id}/reject":{"post":{"tags":["Contacts"],"summary":"Reject a contact role","description":"Dismiss an active role: it leaves every list but keeps its id and history, and can be restored. A role already dismissed is a 409.\n\nRequired scopes: `contacts:write`","operationId":"role_reject","security":[{"oauth2":["contacts:write"]}],"parameters":[{"name":"role_id","in":"path","required":true,"schema":{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","examples":["rol_1S9dCsGYrSI"],"description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","title":"Role Id"},"description":"The contact role's id, as the roles list returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleProfileResponse"}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["contacts:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/roles/rol_1S9dCsGYrSI/reject \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/roles/rol_1S9dCsGYrSI/reject',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/roles/{role_id}/restore":{"post":{"tags":["Contacts"],"summary":"Restore a contact role","description":"Bring a dismissed role back, active and as set by a person. A role that is not dismissed, or whose contact is not active, is a 409.\n\nRequired scopes: `contacts:write`","operationId":"role_restore","security":[{"oauth2":["contacts:write"]}],"parameters":[{"name":"role_id","in":"path","required":true,"schema":{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","examples":["rol_1S9dCsGYrSI"],"description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","title":"Role Id"},"description":"The contact role's id, as the roles list returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleProfileResponse"}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["contacts:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/roles/rol_1S9dCsGYrSI/restore \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/roles/rol_1S9dCsGYrSI/restore',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/roles/{role_id}/suggestions":{"get":{"tags":["Contacts"],"summary":"Get a contact role's suggestions","description":"While a suggestion is flagged, the stage and currency where the newest inference differs from the saved role, and the suggested type; otherwise `{}`.\n\nRequired scopes: `contacts:read`","operationId":"role_suggestions","security":[{"oauth2":["contacts:read"]}],"parameters":[{"name":"role_id","in":"path","required":true,"schema":{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","examples":["rol_1S9dCsGYrSI"],"description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","title":"Role Id"},"description":"The contact role's id, as the roles list returns it."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleProfileSuggestions"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["contacts:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/roles/rol_1S9dCsGYrSI/suggestions \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/roles/rol_1S9dCsGYrSI/suggestions',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/roles/{role_id}/reset":{"post":{"tags":["Contacts"],"summary":"Reset a contact role","description":"Hand an active role back to bind.co: the saved values stay until the next inbox refresh, which updates them again like a role nobody saved, and any suggestion is cleared. A role nobody saved is unchanged; a dismissed role is a 409.\n\nRequired scopes: `contacts:write`","operationId":"role_reset","security":[{"oauth2":["contacts:write"]}],"parameters":[{"name":"role_id","in":"path","required":true,"schema":{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","examples":["rol_1S9dCsGYrSI"],"description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","title":"Role Id"},"description":"The contact role's id, as the roles list returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleProfileResponse"}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["contacts:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/roles/rol_1S9dCsGYrSI/reset \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/roles/rol_1S9dCsGYrSI/reset',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/drafts":{"get":{"tags":["Drafts"],"summary":"List drafts","description":"A page of the user's drafts: the emails suggested for their contacts, one per contact role.\n\nRequired scopes: `drafts:read`","operationId":"list_drafts","security":[{"oauth2":["drafts:read"]}],"parameters":[{"name":"folder","in":"query","required":false,"schema":{"$ref":"#/components/schemas/DraftFolder","description":"Filter drafts by folder","default":"new"},"description":"Filter drafts by folder"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search in contact name and email address","title":"Search"},"description":"Search in contact name and email address"},{"name":"goal_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^gol_[0-9A-Za-z]{11}$","examples":["gol_9CUsxyeaCIs"],"description":"A draft goal id: `gol_` and an opaque string. Treat it as opaque."},{"type":"null"}],"description":"Filter drafts by goal id","title":"Goal Id"},"description":"Filter drafts by goal id"},{"name":"page_number","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number to retrieve.","default":1,"title":"Page Number"},"description":"Page number to retrieve."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"Number of items per page.","default":50,"title":"Page Size"},"description":"Number of items per page."},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Sort results by field. Use '-' prefix for descending order.","default":["-draft_priority_score"],"title":"Sort By"},"description":"Sort results by field. Use '-' prefix for descending order."},{"name":"page_token","in":"query","required":false,"schema":{"type":"string"},"description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedDrafts"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"client_connection_contact_date":{"bind_inference_confidence":0.7,"value":"2026-10-02T15:04:00Z"},"client_connection_contact_draft_email":{"bind_inference_confidence":0.8,"value":"Hi Dana, here is the pricing..."},"client_connection_contact_draft_subject":{"bind_inference_confidence":0.8,"value":"Pricing for Q3"},"client_connection_contact_objective":{"bind_inference_confidence":0.8,"value":"Send the updated pricing."},"client_connection_contact_reason":{"bind_inference_confidence":0.8,"value":"Dana asked for it two weeks ago."},"client_connection_priority":{"bind_inference_confidence":0.6,"value":2},"client_connection_summary":{"bind_inference_confidence":0.9,"value":"Discussed the Q3 renewal; Dana asked for updated pricing."},"contact_email":"dana@acme.com","contact_name":{"bind_inference_confidence":0.95,"value":"Dana Ruiz"},"draft_created_at":"2026-10-02T15:04:00Z","draft_email_body":{"bind_inference_confidence":1.0,"value":"Hi Dana, as promised, here is the updated pricing..."},"draft_email_subject":{"bind_inference_confidence":1.0,"value":"Updated pricing for Q3"},"draft_email_to":"dana@acme.com","draft_folder":"new","draft_id":"drf_9Eob4pBVAa5","draft_priority_score":98.7,"entity_stage":{"bind_inference_confidence":0.8,"value":"ACTIVE"},"entity_type":{"bind_inference_confidence":0.95,"value":"CLIENT"},"relationship_strength":{"bind_inference_confidence":0.7,"value":7},"truth_updates":{"truth_operation":null,"truth_reason":null,"truth_updated_at":null}}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["drafts:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/drafts \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/drafts',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/drafts/count":{"get":{"tags":["Drafts"],"summary":"Count drafts by folder","description":"The number of the user's drafts in each folder, one item per folder. There are only a few folders,\nso the first page always holds every one of them.\n\nRequired scopes: `drafts:read`","operationId":"count_drafts","security":[{"oauth2":["drafts:read"]}],"parameters":[{"name":"goal_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^gol_[0-9A-Za-z]{11}$","examples":["gol_9CUsxyeaCIs"],"description":"A draft goal id: `gol_` and an opaque string. Treat it as opaque."},{"type":"null"}],"description":"Count only the drafts for this goal id","title":"Goal Id"},"description":"Count only the drafts for this goal id"},{"name":"page_number","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number to retrieve.","default":1,"title":"Page Number"},"description":"Page number to retrieve."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"Number of items per page.","default":50,"title":"Page Size"},"description":"Number of items per page."},{"name":"page_token","in":"query","required":false,"schema":{"type":"string"},"description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftCountPage"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"count":12,"draft_folder":"new"}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["drafts:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/drafts/count \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/drafts/count',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/drafts/{draft_id}":{"patch":{"tags":["Drafts"],"summary":"Update a draft","description":"Save every field of the draft while the user edits it; it stays in the folder the body names.\n\nRequired scopes: `drafts:write`","operationId":"update_draft","security":[{"oauth2":["drafts:write"]}],"parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"string","pattern":"^drf_[0-9A-Za-z]{11}$","examples":["drf_9Eob4pBVAa5"],"description":"A draft id: `drf_` and an opaque string. Treat it as opaque.","title":"Draft Id"},"description":"The draft's id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftUpdate"},"example":{"client_connection_summary":"Meeting summary","client_connection_contact_objective":"Follow up on project","client_connection_contact_reason":"Project update needed","client_connection_contact_date":"2026-03-20T10:00:00Z","client_connection_contact_draft_subject":"Project Update","client_connection_contact_draft_email":"Hi, let's discuss the project...","client_connection_priority":1,"draft_email_to":"contact@example.com","draft_email_cc":"","draft_email_bcc":"","draft_email_subject":"Project Update","draft_email_body":"Hi, let's discuss the project...","draft_email_message_id":"","draft_email_thread_id":"","truth_updates":{"truth_updated_at":"2026-03-20T10:00:00Z","truth_operation":"UPDATE","truth_reason":"Auto-saved changes"},"draft_folder":"draft","draft_refresh_subject_and_body":false}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Draft"}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["drafts:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X PATCH https://api.bind.co/v1/drafts/drf_9Eob4pBVAa5 \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"client_connection_summary\": \"Meeting summary\", \"client_connection_contact_objective\": \"Follow up on project\", \"client_connection_contact_reason\": \"Project update needed\", \"client_connection_contact_date\": \"2026-03-20T10:00:00Z\", \"client_connection_contact_draft_subject\": \"Project Update\", \"client_connection_contact_draft_email\": \"Hi, let'\"'\"'s discuss the project...\", \"client_connection_priority\": 1, \"draft_email_to\": \"contact@example.com\", \"draft_email_cc\": \"\", \"draft_email_bcc\": \"\", \"draft_email_subject\": \"Project Update\", \"draft_email_body\": \"Hi, let'\"'\"'s discuss the project...\", \"draft_email_message_id\": \"\", \"draft_email_thread_id\": \"\", \"truth_updates\": {\"truth_updated_at\": \"2026-03-20T10:00:00Z\", \"truth_operation\": \"UPDATE\", \"truth_reason\": \"Auto-saved changes\"}, \"draft_folder\": \"draft\", \"draft_refresh_subject_and_body\": false}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.patch(\n    'https://api.bind.co/v1/drafts/drf_9Eob4pBVAa5',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'client_connection_summary': 'Meeting summary', 'client_connection_contact_objective': 'Follow up on project', 'client_connection_contact_reason': 'Project update needed', 'client_connection_contact_date': '2026-03-20T10:00:00Z', 'client_connection_contact_draft_subject': 'Project Update', 'client_connection_contact_draft_email': \"Hi, let's discuss the project...\", 'client_connection_priority': 1, 'draft_email_to': 'contact@example.com', 'draft_email_cc': '', 'draft_email_bcc': '', 'draft_email_subject': 'Project Update', 'draft_email_body': \"Hi, let's discuss the project...\", 'draft_email_message_id': '', 'draft_email_thread_id': '', 'truth_updates': {'truth_updated_at': '2026-03-20T10:00:00Z', 'truth_operation': 'UPDATE', 'truth_reason': 'Auto-saved changes'}, 'draft_folder': 'draft', 'draft_refresh_subject_and_body': False},\n)\nprint(response.status_code, response.json())"}]},"get":{"tags":["Drafts"],"summary":"Get a draft","description":"One of the user's drafts, exactly as a row of `GET /v1/drafts` shows it.\n\nRequired scopes: `drafts:read`","operationId":"get_draft","security":[{"oauth2":["drafts:read"]}],"parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"string","pattern":"^drf_[0-9A-Za-z]{11}$","examples":["drf_9Eob4pBVAa5"],"description":"A draft id: `drf_` and an opaque string. Treat it as opaque.","title":"Draft Id"},"description":"The draft's id."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Draft"}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["drafts:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/drafts/drf_9Eob4pBVAa5 \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/drafts/drf_9Eob4pBVAa5',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/drafts/{draft_id}/later":{"post":{"tags":["Drafts"],"summary":"Move a draft to Later","description":"Save the draft and move it to the `later` folder until `draft_later_at`.\n\nRequired scopes: `drafts:write`","operationId":"move_draft_to_later","security":[{"oauth2":["drafts:write"]}],"parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"string","pattern":"^drf_[0-9A-Za-z]{11}$","examples":["drf_9Eob4pBVAa5"],"description":"A draft id: `drf_` and an opaque string. Treat it as opaque.","title":"Draft Id"},"description":"The draft's id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftUpdate"},"example":{"client_connection_summary":"Meeting summary","client_connection_contact_objective":"Follow up on project","client_connection_contact_reason":"Project update needed","client_connection_contact_date":"2026-03-20T10:00:00Z","client_connection_contact_draft_subject":"Project Update","client_connection_contact_draft_email":"Hi, let's discuss the project...","client_connection_priority":1,"draft_email_to":"contact@example.com","draft_email_cc":"","draft_email_bcc":"","draft_email_subject":"Project Update","draft_email_body":"Hi, let's discuss the project...","draft_email_message_id":"","draft_email_thread_id":"","draft_later_at":"2026-03-25T10:00:00Z","truth_updates":{"truth_updated_at":"2026-03-20T10:00:00Z","truth_operation":"UPDATE","truth_reason":"Scheduled for later"},"draft_folder":"later"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Draft"}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["drafts:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/drafts/drf_9Eob4pBVAa5/later \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"client_connection_summary\": \"Meeting summary\", \"client_connection_contact_objective\": \"Follow up on project\", \"client_connection_contact_reason\": \"Project update needed\", \"client_connection_contact_date\": \"2026-03-20T10:00:00Z\", \"client_connection_contact_draft_subject\": \"Project Update\", \"client_connection_contact_draft_email\": \"Hi, let'\"'\"'s discuss the project...\", \"client_connection_priority\": 1, \"draft_email_to\": \"contact@example.com\", \"draft_email_cc\": \"\", \"draft_email_bcc\": \"\", \"draft_email_subject\": \"Project Update\", \"draft_email_body\": \"Hi, let'\"'\"'s discuss the project...\", \"draft_email_message_id\": \"\", \"draft_email_thread_id\": \"\", \"draft_later_at\": \"2026-03-25T10:00:00Z\", \"truth_updates\": {\"truth_updated_at\": \"2026-03-20T10:00:00Z\", \"truth_operation\": \"UPDATE\", \"truth_reason\": \"Scheduled for later\"}, \"draft_folder\": \"later\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/drafts/drf_9Eob4pBVAa5/later',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'client_connection_summary': 'Meeting summary', 'client_connection_contact_objective': 'Follow up on project', 'client_connection_contact_reason': 'Project update needed', 'client_connection_contact_date': '2026-03-20T10:00:00Z', 'client_connection_contact_draft_subject': 'Project Update', 'client_connection_contact_draft_email': \"Hi, let's discuss the project...\", 'client_connection_priority': 1, 'draft_email_to': 'contact@example.com', 'draft_email_cc': '', 'draft_email_bcc': '', 'draft_email_subject': 'Project Update', 'draft_email_body': \"Hi, let's discuss the project...\", 'draft_email_message_id': '', 'draft_email_thread_id': '', 'draft_later_at': '2026-03-25T10:00:00Z', 'truth_updates': {'truth_updated_at': '2026-03-20T10:00:00Z', 'truth_operation': 'UPDATE', 'truth_reason': 'Scheduled for later'}, 'draft_folder': 'later'},\n)\nprint(response.status_code, response.json())"}]}},"/drafts/{draft_id}/reject":{"post":{"tags":["Drafts"],"summary":"Reject a draft","description":"Reject the suggested draft: it moves to the `deleted` folder and is not sent.\n\nRequired scopes: `drafts:write`","operationId":"reject_draft","security":[{"oauth2":["drafts:write"]}],"parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"string","pattern":"^drf_[0-9A-Za-z]{11}$","examples":["drf_9Eob4pBVAa5"],"description":"A draft id: `drf_` and an opaque string. Treat it as opaque.","title":"Draft Id"},"description":"The draft's id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftUpdate"},"example":{"client_connection_summary":"Meeting summary","client_connection_contact_objective":"Follow up on project","client_connection_contact_reason":"Project update needed","client_connection_contact_date":"2026-03-20T10:00:00Z","client_connection_contact_draft_subject":"Project Update","client_connection_contact_draft_email":"Hi, let's discuss the project...","client_connection_priority":1,"draft_email_to":"contact@example.com","draft_email_cc":"","draft_email_bcc":"","draft_email_subject":"Project Update","draft_email_body":"Hi, let's discuss the project...","draft_email_message_id":"","draft_email_thread_id":"","truth_updates":{"truth_updated_at":"2026-03-20T10:00:00Z","truth_operation":"DELETE","truth_reason":"Not a good fit"},"draft_folder":"deleted"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Draft"}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["drafts:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/drafts/drf_9Eob4pBVAa5/reject \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"client_connection_summary\": \"Meeting summary\", \"client_connection_contact_objective\": \"Follow up on project\", \"client_connection_contact_reason\": \"Project update needed\", \"client_connection_contact_date\": \"2026-03-20T10:00:00Z\", \"client_connection_contact_draft_subject\": \"Project Update\", \"client_connection_contact_draft_email\": \"Hi, let'\"'\"'s discuss the project...\", \"client_connection_priority\": 1, \"draft_email_to\": \"contact@example.com\", \"draft_email_cc\": \"\", \"draft_email_bcc\": \"\", \"draft_email_subject\": \"Project Update\", \"draft_email_body\": \"Hi, let'\"'\"'s discuss the project...\", \"draft_email_message_id\": \"\", \"draft_email_thread_id\": \"\", \"truth_updates\": {\"truth_updated_at\": \"2026-03-20T10:00:00Z\", \"truth_operation\": \"DELETE\", \"truth_reason\": \"Not a good fit\"}, \"draft_folder\": \"deleted\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/drafts/drf_9Eob4pBVAa5/reject',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'client_connection_summary': 'Meeting summary', 'client_connection_contact_objective': 'Follow up on project', 'client_connection_contact_reason': 'Project update needed', 'client_connection_contact_date': '2026-03-20T10:00:00Z', 'client_connection_contact_draft_subject': 'Project Update', 'client_connection_contact_draft_email': \"Hi, let's discuss the project...\", 'client_connection_priority': 1, 'draft_email_to': 'contact@example.com', 'draft_email_cc': '', 'draft_email_bcc': '', 'draft_email_subject': 'Project Update', 'draft_email_body': \"Hi, let's discuss the project...\", 'draft_email_message_id': '', 'draft_email_thread_id': '', 'truth_updates': {'truth_updated_at': '2026-03-20T10:00:00Z', 'truth_operation': 'DELETE', 'truth_reason': 'Not a good fit'}, 'draft_folder': 'deleted'},\n)\nprint(response.status_code, response.json())"}]}},"/drafts/{draft_id}/save":{"post":{"tags":["Drafts"],"summary":"Save a draft","description":"Save the draft and move it to the `draft` folder.\n\nRequired scopes: `drafts:write`","operationId":"save_draft","security":[{"oauth2":["drafts:write"]}],"parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"string","pattern":"^drf_[0-9A-Za-z]{11}$","examples":["drf_9Eob4pBVAa5"],"description":"A draft id: `drf_` and an opaque string. Treat it as opaque.","title":"Draft Id"},"description":"The draft's id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftUpdate"},"example":{"client_connection_summary":"Meeting summary","client_connection_contact_objective":"Follow up on project","client_connection_contact_reason":"Project update needed","client_connection_contact_date":"2026-03-20T10:00:00Z","client_connection_contact_draft_subject":"Project Update","client_connection_contact_draft_email":"Hi, let's discuss the project...","client_connection_priority":1,"draft_email_to":"contact@example.com","draft_email_cc":"","draft_email_bcc":"","draft_email_subject":"Project Update","draft_email_body":"Hi, let's discuss the project...","draft_email_message_id":"","draft_email_thread_id":"","truth_updates":{"truth_updated_at":"2026-03-20T10:00:00Z","truth_operation":"UPDATE","truth_reason":"Saved as draft"},"draft_folder":"draft"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Draft"}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["drafts:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/drafts/drf_9Eob4pBVAa5/save \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"client_connection_summary\": \"Meeting summary\", \"client_connection_contact_objective\": \"Follow up on project\", \"client_connection_contact_reason\": \"Project update needed\", \"client_connection_contact_date\": \"2026-03-20T10:00:00Z\", \"client_connection_contact_draft_subject\": \"Project Update\", \"client_connection_contact_draft_email\": \"Hi, let'\"'\"'s discuss the project...\", \"client_connection_priority\": 1, \"draft_email_to\": \"contact@example.com\", \"draft_email_cc\": \"\", \"draft_email_bcc\": \"\", \"draft_email_subject\": \"Project Update\", \"draft_email_body\": \"Hi, let'\"'\"'s discuss the project...\", \"draft_email_message_id\": \"\", \"draft_email_thread_id\": \"\", \"truth_updates\": {\"truth_updated_at\": \"2026-03-20T10:00:00Z\", \"truth_operation\": \"UPDATE\", \"truth_reason\": \"Saved as draft\"}, \"draft_folder\": \"draft\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/drafts/drf_9Eob4pBVAa5/save',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'client_connection_summary': 'Meeting summary', 'client_connection_contact_objective': 'Follow up on project', 'client_connection_contact_reason': 'Project update needed', 'client_connection_contact_date': '2026-03-20T10:00:00Z', 'client_connection_contact_draft_subject': 'Project Update', 'client_connection_contact_draft_email': \"Hi, let's discuss the project...\", 'client_connection_priority': 1, 'draft_email_to': 'contact@example.com', 'draft_email_cc': '', 'draft_email_bcc': '', 'draft_email_subject': 'Project Update', 'draft_email_body': \"Hi, let's discuss the project...\", 'draft_email_message_id': '', 'draft_email_thread_id': '', 'truth_updates': {'truth_updated_at': '2026-03-20T10:00:00Z', 'truth_operation': 'UPDATE', 'truth_reason': 'Saved as draft'}, 'draft_folder': 'draft'},\n)\nprint(response.status_code, response.json())"}]}},"/drafts/{draft_id}/send":{"post":{"tags":["Drafts"],"summary":"Send a draft","description":"Send the draft, as last saved, as an email and return the provider's id of the sent email. The\nrequest has no body; the draft's fields are not changed.\nA draft already sent is a 409 `already_sent` carrying the sent message id; no second email goes out.\n\nRequired scopes: `drafts:send`, `drafts:write`","operationId":"send_draft","security":[{"oauth2":["drafts:send","drafts:write"]}],"parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"string","pattern":"^drf_[0-9A-Za-z]{11}$","examples":["drf_9Eob4pBVAa5"],"description":"A draft id: `drf_` and an opaque string. Treat it as opaque.","title":"Draft Id"},"description":"The draft's id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftSendResponse"}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"409":{"description":"`already_sent` when the draft was sent before (no second email goes out; `hint.draft_email_message_id` is the sent message), or `idempotency_in_progress` while a request with the same Idempotency-Key runs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"502":{"description":"`email_send_failed` when the user's mailbox could not be used or the mail provider did not confirm the send. `hint.may_have_sent` says whether the email may have gone out; the draft is not marked sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["drafts:send","drafts:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/drafts/drf_9Eob4pBVAa5/send \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/drafts/drf_9Eob4pBVAa5/send',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/drafts/goals":{"get":{"tags":["Drafts"],"summary":"List goals","description":"A page of the user's goals with the given status.\n\nRequired scopes: `drafts:read`","operationId":"list_draft_goals","security":[{"oauth2":["drafts:read"]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"$ref":"#/components/schemas/DraftGoalStatus","description":"Only goals with this status; `active` when left out.","default":"active"},"description":"Only goals with this status; `active` when left out."},{"name":"page_number","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number to retrieve.","default":1,"title":"Page Number"},"description":"Page number to retrieve."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"Number of items per page.","default":50,"title":"Page Size"},"description":"Number of items per page."},{"name":"page_token","in":"query","required":false,"schema":{"type":"string"},"description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftGoalResponsePage"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"draft_goal_activated_at":"2026-10-01T09:00:00Z","draft_goal_created_at":"2026-10-01T09:00:00Z","draft_goal_deactivated_at":null,"draft_goal_definition":"Ask each active client whether they want to renew their retainer for next year.","draft_goal_deleted_at":null,"draft_goal_description":"Q4 renewals","draft_goal_id":"gol_9CUsxyeaCIs","draft_goal_min_confidence":0.8,"status":"active","target_contact_ids":["con_3SrGoE2zltj"],"target_role_ids":["CLIENT"],"target_role_stages":{"CLIENT":["ACTIVE"]},"user_id":"usr_0d6f2a4e-5b7c-4e1d-9a83-2c4b6e8f1a20"}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["drafts:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/drafts/goals \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/drafts/goals',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]},"post":{"tags":["Drafts"],"summary":"Create a goal","operationId":"create_draft_goal","security":[{"oauth2":["drafts:write"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftGoalCreate"}}}},"responses":{"201":{"description":"Created; the body is the new record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftGoalResponse"}}},"headers":{"Location":{"description":"The path of the created record.","schema":{"type":"string"}},"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["drafts:write"],"description":"Required scopes: `drafts:write`","x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/drafts/goals \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"draft_goal_definition\": \"Ask each active client whether they want to renew their retainer for next year.\", \"draft_goal_description\": \"Q4 renewals\", \"draft_goal_min_confidence\": 0.8, \"is_active\": true, \"target_contact_ids\": [\"con_3SrGoE2zltj\"], \"target_role_ids\": [\"CLIENT\"], \"target_role_stages\": {\"CLIENT\": [\"ACTIVE\"]}}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/drafts/goals',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'draft_goal_definition': 'Ask each active client whether they want to renew their retainer for next year.', 'draft_goal_description': 'Q4 renewals', 'draft_goal_min_confidence': 0.8, 'is_active': True, 'target_contact_ids': ['con_3SrGoE2zltj'], 'target_role_ids': ['CLIENT'], 'target_role_stages': {'CLIENT': ['ACTIVE']}},\n)\nprint(response.status_code, response.json())"}]}},"/drafts/goals/{goal_id}":{"patch":{"tags":["Drafts"],"summary":"Update a goal","operationId":"update_draft_goal","security":[{"oauth2":["drafts:write"]}],"parameters":[{"name":"goal_id","in":"path","required":true,"schema":{"type":"string","pattern":"^gol_[0-9A-Za-z]{11}$","examples":["gol_9CUsxyeaCIs"],"description":"A draft goal id: `gol_` and an opaque string. Treat it as opaque.","title":"Goal Id"},"description":"The goal's id."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftGoalUpdate"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftGoalResponse"}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["drafts:write"],"description":"Required scopes: `drafts:write`","x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X PATCH https://api.bind.co/v1/drafts/goals/gol_9CUsxyeaCIs \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"draft_goal_definition\": \"Ask each active client whether they want to renew before December 15.\", \"is_active\": true}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.patch(\n    'https://api.bind.co/v1/drafts/goals/gol_9CUsxyeaCIs',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'draft_goal_definition': 'Ask each active client whether they want to renew before December 15.', 'is_active': True},\n)\nprint(response.status_code, response.json())"}]},"delete":{"tags":["Drafts"],"summary":"Delete a goal","operationId":"delete_draft_goal","security":[{"oauth2":["drafts:write"]}],"parameters":[{"name":"goal_id","in":"path","required":true,"schema":{"type":"string","pattern":"^gol_[0-9A-Za-z]{11}$","examples":["gol_9CUsxyeaCIs"],"description":"A draft goal id: `gol_` and an opaque string. Treat it as opaque.","title":"Goal Id"},"description":"The goal's id."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftGoalDeleteResponse"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["drafts:write"],"description":"Required scopes: `drafts:write`","x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X DELETE https://api.bind.co/v1/drafts/goals/gol_9CUsxyeaCIs \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.delete(\n    'https://api.bind.co/v1/drafts/goals/gol_9CUsxyeaCIs',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]},"get":{"tags":["Drafts"],"summary":"Get a goal","description":"One of the user's goals, exactly as `POST /v1/drafts/goals` and the goals list return it.\n\nRequired scopes: `drafts:read`","operationId":"draft_goal_get_one","security":[{"oauth2":["drafts:read"]}],"parameters":[{"name":"goal_id","in":"path","required":true,"schema":{"type":"string","pattern":"^gol_[0-9A-Za-z]{11}$","examples":["gol_9CUsxyeaCIs"],"description":"A draft goal id: `gol_` and an opaque string. Treat it as opaque.","title":"Goal Id"},"description":"The goal's id."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftGoalResponse"}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["drafts:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/drafts/goals/gol_9CUsxyeaCIs \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/drafts/goals/gol_9CUsxyeaCIs',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/drafts/goals/available-roles":{"get":{"tags":["Drafts"],"summary":"List the roles a goal can target","operationId":"list_goal_available_roles","security":[{"oauth2":["drafts:read"]}],"parameters":[{"name":"min_confidence","in":"query","required":false,"schema":{"type":"number","maximum":1,"minimum":0,"description":"Role confidence floor (0 to 1, in steps of 0.1) previewed for this goal","default":0.8,"title":"Min Confidence"},"description":"Role confidence floor (0 to 1, in steps of 0.1) previewed for this goal"},{"name":"page_number","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number to retrieve.","default":1,"title":"Page Number"},"description":"Page number to retrieve."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"description":"Number of items per page.","default":50,"title":"Page Size"},"description":"Number of items per page."},{"name":"page_token","in":"query","required":false,"schema":{"type":"string"},"description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftGoalAvailableRolePage"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"available_stages":["ACTIVE","PROSPECT"],"high_confidence_targets":41,"role_id":"CLIENT","total_targets":48}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["drafts:read"],"description":"Required scopes: `drafts:read`","x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/drafts/goals/available-roles \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/drafts/goals/available-roles',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/emails/{email_id}/web-link":{"get":{"tags":["Emails"],"summary":"Get an email's link in the provider's web client","description":"Retrieves the provider's message and thread ids for a given email_id plus a\ndirect link to open the message in that provider's web client. Ensures the\nemail belongs to the authenticated user.\n\nRequired scopes: `profile:read`","operationId":"get_email_web_link","security":[{"oauth2":["profile:read"]}],"parameters":[{"name":"email_id","in":"path","required":true,"schema":{"type":"string","pattern":"^eml_[0-9A-Za-z]{11}$","examples":["eml_16nJ9iKYhhC"],"description":"An email id: `eml_` and an opaque string. Treat it as opaque.","title":"Email Id"},"description":"The email's id, as a record's evidence lists it."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/EmailIdentifiersResponse"},{"type":"null"}],"title":"Response Get Email Web Link"},"example":{"email_id":"eml_16nJ9iKYhhC","email_message_id":"18c2f4a9b7d3e1f0","email_thread_id":"18c2f1d07a6b9e42","email_web_url":"https://mail.google.com/mail/u/0/#all/18c2f4a9b7d3e1f0"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["profile:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/emails/eml_16nJ9iKYhhC/web-link \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/emails/eml_16nJ9iKYhhC/web-link',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations":{"get":{"tags":["Operations Catalogue"],"summary":"List operation types","description":"Every operation type available to work with, each with its title, current schema version, the consent scopes it requires, and its callable verbs. Fetch a type's full shape from `GET /v1/operations/{type}/schema`. No token needed; 60 requests per minute.","operationId":"list_operations","responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationCatalogue"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/operations"},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/operations',\n)\nprint(response.status_code, response.json())"}]}},"/operations/{operation_type}/schema":{"get":{"tags":["Operations Catalogue"],"summary":"Get an operation type's schema","description":"The machine-readable shape of one operation type: the business record's JSON Schema (each field documented), the search request's JSON Schema (all filters, status values, pagination and sort), the consent scopes required, and the callable verbs. `operation_type` is the type's identifier (`payroll_operations`); its path segment (`payroll-operations`) is accepted too. No token needed; 60 requests per minute.","operationId":"get_operation_schema","parameters":[{"name":"operation_type","in":"path","required":true,"schema":{"type":"string","title":"Operation Type"},"description":"The operation type, as `GET /v1/operations` lists it; for example `expenses`."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationSchemaDetail"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"404":{"$ref":"#/components/responses/NotFound"},"422":{"$ref":"#/components/responses/ValidationFailed"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET 'https://api.bind.co/v1/operations/{operation_type}/schema'"},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/operations/{operation_type}/schema',\n)\nprint(response.status_code, response.json())"}]}},"/operations/expenses/search":{"post":{"tags":["Operations:expenses"],"summary":"Search expenses","description":"List this user's `expenses` operations. Supports typed per-field filters (a `_from`/`_to` range for dates & amounts, substring for text, multi-value match for codes/enums), a `status` filter, full-text `search`, and signed `sort_by`. Returns a paginated envelope of operations with the business fields flat on each row.\n\nRequired scopes: `operations:expenses:read`","operationId":"expenses_search","security":[{"oauth2":["operations:expenses:read"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Accepted so you can send it on every POST. A search changes nothing, so repeating it is already safe: the key is not stored and each request answers with the current results.","x-idempotency-key-stored":false,"title":"Idempotency-Key"},"description":"Optional. Accepted so you can send it on every POST. A search changes nothing, so repeating it is already safe: the key is not stored and each request answers with the current results."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpensesSearchRequest"},"example":{"search":null,"page_number":1,"page_size":50,"page_token":null,"sort_by":["-vendor_normalised"],"status":["active"],"chaser_status":["in_self_help"],"vendor_normalised":null,"expense_date_from":"2026-10-01","expense_date_to":"2026-10-01","due_date_from":"2026-10-01","due_date_to":"2026-10-01","total_amount_from":"1234.56","total_amount_to":"1234.56","currency_code":[],"payment_status":["paid"],"vendor_email_domain":null,"document_number":null,"completeness_state":["incomplete"],"payment_date_from":"2026-10-01","payment_date_to":"2026-10-01","counterpart_contact_role_id":["rol_1S9dCsGYrSI"],"is_on_behalf_of":null,"on_behalf_of_contact_role_id":["rol_1S9dCsGYrSI"]}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpensesRowPage"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"expenses","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","vendor_normalised":{"value":null,"bind_inference_confidence":0.92},"expense_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"due_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"total_amount":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"payment_status":{"value":"paid","bind_inference_confidence":0.92},"vendor_email_domain":{"value":null,"bind_inference_confidence":0.92},"document_number":{"value":null,"bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"payment_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:expenses:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/expenses/search \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"sort_by\": [\"-vendor_normalised\"], \"page_number\": 1, \"page_size\": 50}'"},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/expenses/search',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n    json={'sort_by': ['-vendor_normalised'], 'page_number': 1, 'page_size': 50},\n)\nprint(response.status_code, response.json())"}]}},"/operations/expenses/{operation_id}":{"get":{"tags":["Operations:expenses"],"summary":"Get an expense","description":"Fetch a single `expenses` operation by id for this user. A cross-user, missing, or hidden (pending/merged/deleted) operation resolves to 404.\n\nRequired scopes: `operations:expenses:read`","operationId":"expenses_get_one","security":[{"oauth2":["operations:expenses:read"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpensesRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"expenses","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","vendor_normalised":{"value":null,"bind_inference_confidence":0.92},"expense_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"due_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"total_amount":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"payment_status":{"value":"paid","bind_inference_confidence":0.92},"vendor_email_domain":{"value":null,"bind_inference_confidence":0.92},"document_number":{"value":null,"bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"payment_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:expenses:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13 \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]},"patch":{"tags":["Operations:expenses"],"summary":"Edit an expense","description":"Fix a review-ready operation's fields and commit it as human-corrected (status → `corrected`). Partial update: send only the fields you are changing — they are merged into the existing record, an omitted field is left unchanged, and a field sent as `null` is cleared. Valid from `active`, `pending_approval`, `approved`, or `corrected`.\n\nRequired scopes: `operations:expenses:write`","operationId":"expenses_edit","security":[{"oauth2":["operations:expenses:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpensesEditBody"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpensesRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"expenses","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","vendor_normalised":{"value":null,"bind_inference_confidence":0.92},"expense_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"due_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"total_amount":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"payment_status":{"value":"paid","bind_inference_confidence":0.92},"vendor_email_domain":{"value":null,"bind_inference_confidence":0.92},"document_number":{"value":null,"bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"payment_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:expenses:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X PATCH https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13 \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"currency_code\": \"CAD\", \"document_number\": \"INV-20431\", \"expense_date\": \"2026-10-01\", \"payment_date\": \"2026-10-01\", \"payment_status\": \"paid\", \"total_amount\": \"55.37\", \"vendor_email_domain\": \"northwindhosting.com\", \"vendor_normalised\": \"Northwind Hosting\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.patch(\n    'https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'currency_code': 'CAD', 'document_number': 'INV-20431', 'expense_date': '2026-10-01', 'payment_date': '2026-10-01', 'payment_status': 'paid', 'total_amount': '55.37', 'vendor_email_domain': 'northwindhosting.com', 'vendor_normalised': 'Northwind Hosting'},\n)\nprint(response.status_code, response.json())"}]},"delete":{"tags":["Operations:expenses"],"summary":"Delete an expense","description":"Hide an operation you don't want to see (soft-delete; status → `deleted`). The record is retained but never returned by reads.\n\nRequired scopes: `operations:expenses:write`","operationId":"expenses_delete","security":[{"oauth2":["operations:expenses:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpensesRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"expenses","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","vendor_normalised":{"value":null,"bind_inference_confidence":0.92},"expense_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"due_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"total_amount":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"payment_status":{"value":"paid","bind_inference_confidence":0.92},"vendor_email_domain":{"value":null,"bind_inference_confidence":0.92},"document_number":{"value":null,"bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"payment_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:expenses:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X DELETE https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13 \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.delete(\n    'https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/expenses":{"post":{"tags":["Operations:expenses"],"summary":"Create an expense","description":"Add an operation of type `expenses` that bind.co did not find in the mail. The body carries the business record; it is stored as an approved, human-provided record and answered with `201`. Idempotent on the record's identity — re-asserting the same record returns the existing operation with `200`.\n\nRequired scopes: `operations:expenses:write`","operationId":"expenses_create","security":[{"oauth2":["operations:expenses:write"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpensesCreateBody"}}}},"responses":{"201":{"description":"Created; the body is the new record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpensesRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"expenses","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","vendor_normalised":{"value":null,"bind_inference_confidence":0.92},"expense_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"due_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"total_amount":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"payment_status":{"value":"paid","bind_inference_confidence":0.92},"vendor_email_domain":{"value":null,"bind_inference_confidence":0.92},"document_number":{"value":null,"bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"payment_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Location":{"description":"The path of the created record.","schema":{"type":"string"}},"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:expenses:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/expenses \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"currency_code\": \"CAD\", \"document_number\": \"INV-20431\", \"expense_date\": \"2026-10-01\", \"payment_date\": \"2026-10-01\", \"payment_status\": \"paid\", \"total_amount\": \"55.37\", \"vendor_email_domain\": \"northwindhosting.com\", \"vendor_normalised\": \"Northwind Hosting\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/expenses',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'currency_code': 'CAD', 'document_number': 'INV-20431', 'expense_date': '2026-10-01', 'payment_date': '2026-10-01', 'payment_status': 'paid', 'total_amount': '55.37', 'vendor_email_domain': 'northwindhosting.com', 'vendor_normalised': 'Northwind Hosting'},\n)\nprint(response.status_code, response.json())"}]}},"/operations/expenses/{operation_id}/confirm":{"post":{"tags":["Operations:expenses"],"summary":"Confirm an expense","description":"Confirm a review-ready operation as correct, as-is (status → `approved`). Valid from `active` or `pending_approval`.\n\nRequired scopes: `operations:expenses:write`","operationId":"expenses_confirm","security":[{"oauth2":["operations:expenses:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpensesRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"expenses","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","vendor_normalised":{"value":null,"bind_inference_confidence":0.92},"expense_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"due_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"total_amount":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"payment_status":{"value":"paid","bind_inference_confidence":0.92},"vendor_email_domain":{"value":null,"bind_inference_confidence":0.92},"document_number":{"value":null,"bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"payment_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:expenses:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/confirm \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/confirm',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/expenses/{operation_id}/reject":{"post":{"tags":["Operations:expenses"],"summary":"Reject an expense","description":"Mark a review-ready operation an error (status → `rejected`). Valid from `active` or `pending_approval`.\n\nRequired scopes: `operations:expenses:write`","operationId":"expenses_reject","security":[{"oauth2":["operations:expenses:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpensesRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"expenses","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","vendor_normalised":{"value":null,"bind_inference_confidence":0.92},"expense_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"due_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"total_amount":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"payment_status":{"value":"paid","bind_inference_confidence":0.92},"vendor_email_domain":{"value":null,"bind_inference_confidence":0.92},"document_number":{"value":null,"bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"payment_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:expenses:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/reject \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/reject',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/expenses/{operation_id}/restore":{"post":{"tags":["Operations:expenses"],"summary":"Restore an expense","description":"Bring back an operation you rejected or deleted, unchanged, in the state it had before: `active`, `pending_approval`, `approved` or `corrected`. Any other operation is a 409.\n\nRequired scopes: `operations:expenses:write`","operationId":"expenses_restore","security":[{"oauth2":["operations:expenses:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpensesRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"expenses","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","vendor_normalised":{"value":null,"bind_inference_confidence":0.92},"expense_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"due_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"total_amount":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"payment_status":{"value":"paid","bind_inference_confidence":0.92},"vendor_email_domain":{"value":null,"bind_inference_confidence":0.92},"document_number":{"value":null,"bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"payment_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:expenses:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/restore \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/restore',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/expenses/{operation_id}/reset":{"post":{"tags":["Operations:expenses"],"summary":"Reset an expense","description":"Drop your confirmation and corrections: the operation goes back to the values bind.co inferred from its emails and documents and lands review-ready again. An operation nobody confirmed or corrected is unchanged. A rejected or deleted operation (restore it first), or one created by hand with nothing inferred, is a 409.\n\nRequired scopes: `operations:expenses:write`","operationId":"expenses_reset","security":[{"oauth2":["operations:expenses:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpensesRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"expenses","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","vendor_normalised":{"value":null,"bind_inference_confidence":0.92},"expense_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"due_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"total_amount":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"payment_status":{"value":"paid","bind_inference_confidence":0.92},"vendor_email_domain":{"value":null,"bind_inference_confidence":0.92},"document_number":{"value":null,"bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"payment_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:expenses:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/reset \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/reset',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/expenses/{operation_id}/merge":{"post":{"tags":["Operations:expenses"],"summary":"Merge duplicate expenses","description":"Consolidate duplicate operations into this one (the winner). Each loser named in the body must be `active` (422 otherwise); the winner must not be `rejected` (422). The losers are hidden (`merged`), their evidence is re-parented onto the winner. A winner still awaiting a decision is re-blended to carry the best version of each field and lands review-ready, awaiting `confirm`; an `approved` or `corrected` winner keeps its values and status and only gains the evidence. Undone with `unmerge`.\n\nRequired scopes: `operations:expenses:write`","operationId":"expenses_merge","security":[{"oauth2":["operations:expenses:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergeBody"},"example":{"loser_operation_ids":["op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44"]}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpensesRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"expenses","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","vendor_normalised":{"value":null,"bind_inference_confidence":0.92},"expense_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"due_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"total_amount":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"payment_status":{"value":"paid","bind_inference_confidence":0.92},"vendor_email_domain":{"value":null,"bind_inference_confidence":0.92},"document_number":{"value":null,"bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"payment_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:expenses:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/merge \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"loser_operation_ids\": [\"op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44\"]}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/merge',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'loser_operation_ids': ['op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44']},\n)\nprint(response.status_code, response.json())"}]}},"/operations/expenses/{operation_id}/unmerge":{"post":{"tags":["Operations:expenses"],"summary":"Unmerge expenses","description":"Undo merges into this operation, made by you or by bind.co's duplicate check: each merged-away operation comes back `active` with its own id and evidence, this operation loses what it took from them and, unless someone confirmed or corrected it since, is re-blended. bind.co never merges the two again on its own. Name the operations to bring back, or leave the list out to undo every merge into this one. A merge made before merges were recorded, one changed since, or a merge or unmerge already running for you, is a 409.\n\nRequired scopes: `operations:expenses:write`","operationId":"expenses_unmerge","security":[{"oauth2":["operations:expenses:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnmergeBody"},"example":{"loser_operation_ids":["op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44"]}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpensesUnmergeResult"},"example":{"operation":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"expenses","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","vendor_normalised":{"value":null,"bind_inference_confidence":0.92},"expense_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"due_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"total_amount":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"payment_status":{"value":"paid","bind_inference_confidence":0.92},"vendor_email_domain":{"value":null,"bind_inference_confidence":0.92},"document_number":{"value":null,"bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"payment_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}},"restored_operation_ids":["op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44"]}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:expenses:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/unmerge \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"loser_operation_ids\": [\"op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44\"]}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/unmerge',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'loser_operation_ids': ['op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44']},\n)\nprint(response.status_code, response.json())"}]}},"/operations/expenses/{operation_id}/chaser":{"get":{"tags":["Operations:expenses"],"summary":"What the chaser is doing with an expense","description":"See where the chaser is with one operation: its current stage, what is still missing, and what it will do next and when. A cross-user, missing, or hidden operation resolves to 404.\n\nRequired scopes: `operations:expenses:read`","operationId":"expenses_chaser_view","security":[{"oauth2":["operations:expenses:read"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationChaserView"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:expenses:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/expenses/chaser/self-help":{"get":{"tags":["Operations:expenses"],"summary":"Self-help queue for expenses","description":"List this user's `expenses` operations that are waiting in the self-help phase, each with its unsatisfied fields and the candidate values found on the user's other operations, ready for the owner to review.\n\nRequired scopes: `operations:expenses:read`","operationId":"expenses_self_help_queue","security":[{"oauth2":["operations:expenses:read"]}],"parameters":[{"name":"page_number","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page Number"},"description":"Page number to retrieve."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"default":50,"title":"Page Size"},"description":"Number of items per page."},{"name":"page_token","in":"query","required":false,"schema":{"type":"string"},"description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelfHelpQueueItemPage"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"chaser_status":"in_self_help","gaps":[{"candidates":[{"canonical_path":"expense_date","observed":{"bind_inference_confidence":0.94,"value":"2026-10-14"},"source_operation_id":"op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44"}],"canonical_path":"expense_date","document_candidates":[],"reason":"absent"}],"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:expenses:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/operations/expenses/chaser/self-help \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/operations/expenses/chaser/self-help',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/expenses/chaser/owner-escalation":{"get":{"tags":["Operations:expenses"],"summary":"Owner-escalation queue for expenses","description":"List this user's `expenses` operations the system couldn't complete on its own and handed to a person, each with its still-missing fields. Fill them via the edit/confirm routes to resolve it, or dismiss it to stop chasing.\n\nRequired scopes: `operations:expenses:read`","operationId":"expenses_owner_escalation_queue","security":[{"oauth2":["operations:expenses:read"]}],"parameters":[{"name":"page_number","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page Number"},"description":"Page number to retrieve."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"default":50,"title":"Page Size"},"description":"Number of items per page."},{"name":"page_token","in":"query","required":false,"schema":{"type":"string"},"description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnerEscalationQueueItemPage"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"chaser_status":"escalated_to_owner","gaps":[{"canonical_path":"expense_date","reason":"below_threshold"}],"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","pending_draft":{"body":"Hi Dana, could you confirm the date on invoice INV-2207? Thanks, Maya","counterpart_email":"dana@acme.com","counterpart_name":"Dana Ruiz","missing_item":"the invoice date","subject":"Invoice INV-2207: date missing"}}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:expenses:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/operations/expenses/chaser/owner-escalation \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/operations/expenses/chaser/owner-escalation',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/expenses/chaser/outreach-approval":{"get":{"tags":["Operations:expenses"],"summary":"Outreach awaiting your approval for expenses","description":"List this user's `expenses` operations for which the system prepared a message to a counterpart, each rendered for review. Nothing has been sent — approve a draft to record that it should go out, or reject it. One decision per operation.\n\nRequired scopes: `drafts:read`, `operations:expenses:read`","operationId":"expenses_outreach_approval_queue","security":[{"oauth2":["drafts:read","operations:expenses:read"]}],"parameters":[{"name":"page_number","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page Number"},"description":"Page number to retrieve."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"default":50,"title":"Page Size"},"description":"Number of items per page."},{"name":"page_token","in":"query","required":false,"schema":{"type":"string"},"description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachApprovalDraftItemPage"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"body":"Hi Dana, could you confirm the date on invoice INV-2207? Thanks, Maya","chaser_status":"pending_approval","counterpart_email":"dana@acme.com","counterpart_name":"Dana Ruiz","missing_item":"the invoice date","operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","subject":"Invoice INV-2207: date missing"}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["drafts:read","operations:expenses:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/operations/expenses/chaser/outreach-approval \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/operations/expenses/chaser/outreach-approval',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/expenses/{operation_id}/chaser/self-help/confirm":{"post":{"tags":["Operations:expenses"],"summary":"Confirm a self-help candidate for an expense","description":"Accept one candidate value the system found on your other operations to fill a gap. It attaches the source evidence to this operation and re-checks the answer. Not reversible.\n\nRequired scopes: `operations:expenses:write`","operationId":"expenses_self_help_confirm","security":[{"oauth2":["operations:expenses:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelfHelpDecisionBody"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpensesRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"expenses","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","vendor_normalised":{"value":null,"bind_inference_confidence":0.92},"expense_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"due_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"total_amount":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"payment_status":{"value":"paid","bind_inference_confidence":0.92},"vendor_email_domain":{"value":null,"bind_inference_confidence":0.92},"document_number":{"value":null,"bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"payment_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:expenses:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/self-help/confirm \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"canonical_path\": \"expense_date\", \"source_operation_id\": \"op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/self-help/confirm',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'canonical_path': 'expense_date', 'source_operation_id': 'op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44'},\n)\nprint(response.status_code, response.json())"}]}},"/operations/expenses/{operation_id}/chaser/self-help/reject":{"post":{"tags":["Operations:expenses"],"summary":"Reject a self-help candidate for an expense","description":"Decline one candidate value the system suggested. It won't be offered again and it leaves the shortlist; the operation stays open for its other candidates.\n\nRequired scopes: `operations:expenses:write`","operationId":"expenses_self_help_reject","security":[{"oauth2":["operations:expenses:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelfHelpDecisionBody"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpensesRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"expenses","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","vendor_normalised":{"value":null,"bind_inference_confidence":0.92},"expense_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"due_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"total_amount":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"payment_status":{"value":"paid","bind_inference_confidence":0.92},"vendor_email_domain":{"value":null,"bind_inference_confidence":0.92},"document_number":{"value":null,"bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"payment_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:expenses:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/self-help/reject \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"canonical_path\": \"expense_date\", \"source_operation_id\": \"op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/self-help/reject',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'canonical_path': 'expense_date', 'source_operation_id': 'op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44'},\n)\nprint(response.status_code, response.json())"}]}},"/operations/expenses/{operation_id}/chaser/owner-escalation/dismiss":{"post":{"tags":["Operations:expenses"],"summary":"Dismiss an escalated expense","description":"Stop chasing an operation the system handed you — it moves to a 'done chasing' state. The operation itself is unchanged.\n\nRequired scopes: `operations:expenses:write`","operationId":"expenses_owner_escalation_dismiss","security":[{"oauth2":["operations:expenses:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpensesRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"expenses","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","vendor_normalised":{"value":null,"bind_inference_confidence":0.92},"expense_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"due_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"total_amount":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"payment_status":{"value":"paid","bind_inference_confidence":0.92},"vendor_email_domain":{"value":null,"bind_inference_confidence":0.92},"document_number":{"value":null,"bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"payment_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:expenses:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/owner-escalation/dismiss \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/owner-escalation/dismiss',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/expenses/{operation_id}/chaser/outreach-approval/confirm":{"post":{"tags":["Operations:expenses"],"summary":"Approve outreach for an expense","description":"Confirm the message the system prepared for a counterpart. Nothing is sent right now — this records that the draft is good to go. One decision per operation.\n\nRequired scopes: `drafts:write`, `operations:expenses:write`","operationId":"expenses_outreach_approval_confirm","security":[{"oauth2":["drafts:write","operations:expenses:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpensesRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"expenses","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","vendor_normalised":{"value":null,"bind_inference_confidence":0.92},"expense_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"due_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"total_amount":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"payment_status":{"value":"paid","bind_inference_confidence":0.92},"vendor_email_domain":{"value":null,"bind_inference_confidence":0.92},"document_number":{"value":null,"bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"payment_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["drafts:write","operations:expenses:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/outreach-approval/confirm \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/outreach-approval/confirm',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/expenses/{operation_id}/chaser/outreach-approval/reject":{"post":{"tags":["Operations:expenses"],"summary":"Reject outreach for an expense","description":"Reject the message the system prepared for a counterpart, so it is not sent. Optionally say why, using one of the operation's allowed rejection reasons: depending on the reason the system stops chasing, stops asking about one missing field, tries another recipient or wording, gives up, or hands the operation to you. One decision per operation.\n\nRequired scopes: `drafts:write`, `operations:expenses:write`","operationId":"expenses_outreach_approval_reject","security":[{"oauth2":["drafts:write","operations:expenses:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/OutreachApprovalRejectBody"},{"type":"null"}],"title":"Body"},"example":{"reason":"wording_needs_work"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpensesRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"expenses","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","vendor_normalised":{"value":null,"bind_inference_confidence":0.92},"expense_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"due_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"total_amount":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"payment_status":{"value":"paid","bind_inference_confidence":0.92},"vendor_email_domain":{"value":null,"bind_inference_confidence":0.92},"document_number":{"value":null,"bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"payment_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["drafts:write","operations:expenses:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/outreach-approval/reject \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"reason\": \"wording_needs_work\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/expenses/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/outreach-approval/reject',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'reason': 'wording_needs_work'},\n)\nprint(response.status_code, response.json())"}]}},"/operations/payroll-operations/search":{"post":{"tags":["Operations:payroll_operations"],"summary":"Search payroll operations","description":"List this user's `payroll_operations` operations. Supports typed per-field filters (a `_from`/`_to` range for dates & amounts, substring for text, multi-value match for codes/enums), a `status` filter, full-text `search`, and signed `sort_by`. Returns a paginated envelope of operations with the business fields flat on each row.\n\nRequired scopes: `operations:payroll_operations:read`","operationId":"payroll_operations_search","security":[{"oauth2":["operations:payroll_operations:read"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Accepted so you can send it on every POST. A search changes nothing, so repeating it is already safe: the key is not stored and each request answers with the current results.","x-idempotency-key-stored":false,"title":"Idempotency-Key"},"description":"Optional. Accepted so you can send it on every POST. A search changes nothing, so repeating it is already safe: the key is not stored and each request answers with the current results."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayrollOperationsSearchRequest"},"example":{"search":null,"page_number":1,"page_size":50,"page_token":null,"sort_by":["-employee_normalised"],"status":["active"],"chaser_status":["in_self_help"],"employee_normalised":null,"employee_external_id":null,"department":null,"payroll_provider":null,"operation_verb":["add"],"operation_target":["employee"],"operation_request_date_from":"2026-10-01","operation_request_date_to":"2026-10-01","effective_date_from":"2026-10-01","effective_date_to":"2026-10-01","amount_primary_from":"1234.56","amount_primary_to":"1234.56","currency_code":[],"reasoning_summary":null,"approval_state":["proposed"],"completeness_state":["incomplete"],"counterpart_contact_role_id":["rol_1S9dCsGYrSI"],"is_on_behalf_of":null,"on_behalf_of_contact_role_id":["rol_1S9dCsGYrSI"]}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayrollOperationsRowPage"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"payroll_operations","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","employee_normalised":{"value":null,"bind_inference_confidence":0.92},"employee_external_id":{"value":null,"bind_inference_confidence":0.92},"department":{"value":null,"bind_inference_confidence":0.92},"payroll_provider":{"value":null,"bind_inference_confidence":0.92},"operation_verb":{"value":"add","bind_inference_confidence":0.92},"operation_target":{"value":"employee","bind_inference_confidence":0.92},"operation_request_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"effective_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"amount_primary":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"reasoning_summary":{"value":null,"bind_inference_confidence":0.92},"approval_state":{"value":"proposed","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"fields":[{"name":"hours_per_week","old_unit":"hours","old_value":"40","unit":"hours","value":"32"}],"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:payroll_operations:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/payroll-operations/search \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"sort_by\": [\"-employee_normalised\"], \"page_number\": 1, \"page_size\": 50}'"},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/payroll-operations/search',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n    json={'sort_by': ['-employee_normalised'], 'page_number': 1, 'page_size': 50},\n)\nprint(response.status_code, response.json())"}]}},"/operations/payroll-operations/{operation_id}":{"get":{"tags":["Operations:payroll_operations"],"summary":"Get a payroll operation","description":"Fetch a single `payroll_operations` operation by id for this user. A cross-user, missing, or hidden (pending/merged/deleted) operation resolves to 404.\n\nRequired scopes: `operations:payroll_operations:read`","operationId":"payroll_operations_get_one","security":[{"oauth2":["operations:payroll_operations:read"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayrollOperationsRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"payroll_operations","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","employee_normalised":{"value":null,"bind_inference_confidence":0.92},"employee_external_id":{"value":null,"bind_inference_confidence":0.92},"department":{"value":null,"bind_inference_confidence":0.92},"payroll_provider":{"value":null,"bind_inference_confidence":0.92},"operation_verb":{"value":"add","bind_inference_confidence":0.92},"operation_target":{"value":"employee","bind_inference_confidence":0.92},"operation_request_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"effective_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"amount_primary":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"reasoning_summary":{"value":null,"bind_inference_confidence":0.92},"approval_state":{"value":"proposed","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"fields":[{"name":"hours_per_week","old_unit":"hours","old_value":"40","unit":"hours","value":"32"}],"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:payroll_operations:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13 \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]},"patch":{"tags":["Operations:payroll_operations"],"summary":"Edit a payroll operation","description":"Fix a review-ready operation's fields and commit it as human-corrected (status → `corrected`). Partial update: send only the fields you are changing — they are merged into the existing record, an omitted field is left unchanged, and a field sent as `null` is cleared. Valid from `active`, `pending_approval`, `approved`, or `corrected`.\n\nRequired scopes: `operations:payroll_operations:write`","operationId":"payroll_operations_edit","security":[{"oauth2":["operations:payroll_operations:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayrollOperationsEditBody"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayrollOperationsRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"payroll_operations","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","employee_normalised":{"value":null,"bind_inference_confidence":0.92},"employee_external_id":{"value":null,"bind_inference_confidence":0.92},"department":{"value":null,"bind_inference_confidence":0.92},"payroll_provider":{"value":null,"bind_inference_confidence":0.92},"operation_verb":{"value":"add","bind_inference_confidence":0.92},"operation_target":{"value":"employee","bind_inference_confidence":0.92},"operation_request_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"effective_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"amount_primary":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"reasoning_summary":{"value":null,"bind_inference_confidence":0.92},"approval_state":{"value":"proposed","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"fields":[{"name":"hours_per_week","old_unit":"hours","old_value":"40","unit":"hours","value":"32"}],"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:payroll_operations:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X PATCH https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13 \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"approval_state\": \"proposed\", \"department\": \"Engineering\", \"effective_date\": \"2026-11-01\", \"employee_external_id\": \"E-1042\", \"employee_normalised\": \"Joe Black\", \"fields\": [{\"name\": \"hours_per_week\", \"old_unit\": \"hours\", \"old_value\": \"40\", \"unit\": \"hours\", \"value\": \"32\"}], \"operation_request_date\": \"2026-10-20\", \"operation_target\": \"hours\", \"operation_verb\": \"change\", \"payroll_provider\": \"Gusto\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.patch(\n    'https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'approval_state': 'proposed', 'department': 'Engineering', 'effective_date': '2026-11-01', 'employee_external_id': 'E-1042', 'employee_normalised': 'Joe Black', 'fields': [{'name': 'hours_per_week', 'old_unit': 'hours', 'old_value': '40', 'unit': 'hours', 'value': '32'}], 'operation_request_date': '2026-10-20', 'operation_target': 'hours', 'operation_verb': 'change', 'payroll_provider': 'Gusto'},\n)\nprint(response.status_code, response.json())"}]},"delete":{"tags":["Operations:payroll_operations"],"summary":"Delete a payroll operation","description":"Hide an operation you don't want to see (soft-delete; status → `deleted`). The record is retained but never returned by reads.\n\nRequired scopes: `operations:payroll_operations:write`","operationId":"payroll_operations_delete","security":[{"oauth2":["operations:payroll_operations:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayrollOperationsRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"payroll_operations","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","employee_normalised":{"value":null,"bind_inference_confidence":0.92},"employee_external_id":{"value":null,"bind_inference_confidence":0.92},"department":{"value":null,"bind_inference_confidence":0.92},"payroll_provider":{"value":null,"bind_inference_confidence":0.92},"operation_verb":{"value":"add","bind_inference_confidence":0.92},"operation_target":{"value":"employee","bind_inference_confidence":0.92},"operation_request_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"effective_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"amount_primary":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"reasoning_summary":{"value":null,"bind_inference_confidence":0.92},"approval_state":{"value":"proposed","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"fields":[{"name":"hours_per_week","old_unit":"hours","old_value":"40","unit":"hours","value":"32"}],"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:payroll_operations:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X DELETE https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13 \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.delete(\n    'https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/payroll-operations":{"post":{"tags":["Operations:payroll_operations"],"summary":"Create a payroll operation","description":"Add an operation of type `payroll_operations` that bind.co did not find in the mail. The body carries the business record; it is stored as an approved, human-provided record and answered with `201`. Idempotent on the record's identity — re-asserting the same record returns the existing operation with `200`.\n\nRequired scopes: `operations:payroll_operations:write`","operationId":"payroll_operations_create","security":[{"oauth2":["operations:payroll_operations:write"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayrollOperationsCreateBody"}}}},"responses":{"201":{"description":"Created; the body is the new record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayrollOperationsRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"payroll_operations","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","employee_normalised":{"value":null,"bind_inference_confidence":0.92},"employee_external_id":{"value":null,"bind_inference_confidence":0.92},"department":{"value":null,"bind_inference_confidence":0.92},"payroll_provider":{"value":null,"bind_inference_confidence":0.92},"operation_verb":{"value":"add","bind_inference_confidence":0.92},"operation_target":{"value":"employee","bind_inference_confidence":0.92},"operation_request_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"effective_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"amount_primary":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"reasoning_summary":{"value":null,"bind_inference_confidence":0.92},"approval_state":{"value":"proposed","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"fields":[{"name":"hours_per_week","old_unit":"hours","old_value":"40","unit":"hours","value":"32"}],"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Location":{"description":"The path of the created record.","schema":{"type":"string"}},"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:payroll_operations:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/payroll-operations \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"approval_state\": \"proposed\", \"department\": \"Engineering\", \"effective_date\": \"2026-11-01\", \"employee_external_id\": \"E-1042\", \"employee_normalised\": \"Joe Black\", \"fields\": [{\"name\": \"hours_per_week\", \"old_unit\": \"hours\", \"old_value\": \"40\", \"unit\": \"hours\", \"value\": \"32\"}], \"operation_request_date\": \"2026-10-20\", \"operation_target\": \"hours\", \"operation_verb\": \"change\", \"payroll_provider\": \"Gusto\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/payroll-operations',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'approval_state': 'proposed', 'department': 'Engineering', 'effective_date': '2026-11-01', 'employee_external_id': 'E-1042', 'employee_normalised': 'Joe Black', 'fields': [{'name': 'hours_per_week', 'old_unit': 'hours', 'old_value': '40', 'unit': 'hours', 'value': '32'}], 'operation_request_date': '2026-10-20', 'operation_target': 'hours', 'operation_verb': 'change', 'payroll_provider': 'Gusto'},\n)\nprint(response.status_code, response.json())"}]}},"/operations/payroll-operations/{operation_id}/confirm":{"post":{"tags":["Operations:payroll_operations"],"summary":"Confirm a payroll operation","description":"Confirm a review-ready operation as correct, as-is (status → `approved`). Valid from `active` or `pending_approval`.\n\nRequired scopes: `operations:payroll_operations:write`","operationId":"payroll_operations_confirm","security":[{"oauth2":["operations:payroll_operations:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayrollOperationsRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"payroll_operations","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","employee_normalised":{"value":null,"bind_inference_confidence":0.92},"employee_external_id":{"value":null,"bind_inference_confidence":0.92},"department":{"value":null,"bind_inference_confidence":0.92},"payroll_provider":{"value":null,"bind_inference_confidence":0.92},"operation_verb":{"value":"add","bind_inference_confidence":0.92},"operation_target":{"value":"employee","bind_inference_confidence":0.92},"operation_request_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"effective_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"amount_primary":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"reasoning_summary":{"value":null,"bind_inference_confidence":0.92},"approval_state":{"value":"proposed","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"fields":[{"name":"hours_per_week","old_unit":"hours","old_value":"40","unit":"hours","value":"32"}],"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:payroll_operations:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/confirm \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/confirm',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/payroll-operations/{operation_id}/reject":{"post":{"tags":["Operations:payroll_operations"],"summary":"Reject a payroll operation","description":"Mark a review-ready operation an error (status → `rejected`). Valid from `active` or `pending_approval`.\n\nRequired scopes: `operations:payroll_operations:write`","operationId":"payroll_operations_reject","security":[{"oauth2":["operations:payroll_operations:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayrollOperationsRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"payroll_operations","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","employee_normalised":{"value":null,"bind_inference_confidence":0.92},"employee_external_id":{"value":null,"bind_inference_confidence":0.92},"department":{"value":null,"bind_inference_confidence":0.92},"payroll_provider":{"value":null,"bind_inference_confidence":0.92},"operation_verb":{"value":"add","bind_inference_confidence":0.92},"operation_target":{"value":"employee","bind_inference_confidence":0.92},"operation_request_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"effective_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"amount_primary":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"reasoning_summary":{"value":null,"bind_inference_confidence":0.92},"approval_state":{"value":"proposed","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"fields":[{"name":"hours_per_week","old_unit":"hours","old_value":"40","unit":"hours","value":"32"}],"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:payroll_operations:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/reject \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/reject',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/payroll-operations/{operation_id}/restore":{"post":{"tags":["Operations:payroll_operations"],"summary":"Restore a payroll operation","description":"Bring back an operation you rejected or deleted, unchanged, in the state it had before: `active`, `pending_approval`, `approved` or `corrected`. Any other operation is a 409.\n\nRequired scopes: `operations:payroll_operations:write`","operationId":"payroll_operations_restore","security":[{"oauth2":["operations:payroll_operations:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayrollOperationsRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"payroll_operations","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","employee_normalised":{"value":null,"bind_inference_confidence":0.92},"employee_external_id":{"value":null,"bind_inference_confidence":0.92},"department":{"value":null,"bind_inference_confidence":0.92},"payroll_provider":{"value":null,"bind_inference_confidence":0.92},"operation_verb":{"value":"add","bind_inference_confidence":0.92},"operation_target":{"value":"employee","bind_inference_confidence":0.92},"operation_request_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"effective_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"amount_primary":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"reasoning_summary":{"value":null,"bind_inference_confidence":0.92},"approval_state":{"value":"proposed","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"fields":[{"name":"hours_per_week","old_unit":"hours","old_value":"40","unit":"hours","value":"32"}],"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:payroll_operations:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/restore \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/restore',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/payroll-operations/{operation_id}/reset":{"post":{"tags":["Operations:payroll_operations"],"summary":"Reset a payroll operation","description":"Drop your confirmation and corrections: the operation goes back to the values bind.co inferred from its emails and documents and lands review-ready again. An operation nobody confirmed or corrected is unchanged. A rejected or deleted operation (restore it first), or one created by hand with nothing inferred, is a 409.\n\nRequired scopes: `operations:payroll_operations:write`","operationId":"payroll_operations_reset","security":[{"oauth2":["operations:payroll_operations:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayrollOperationsRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"payroll_operations","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","employee_normalised":{"value":null,"bind_inference_confidence":0.92},"employee_external_id":{"value":null,"bind_inference_confidence":0.92},"department":{"value":null,"bind_inference_confidence":0.92},"payroll_provider":{"value":null,"bind_inference_confidence":0.92},"operation_verb":{"value":"add","bind_inference_confidence":0.92},"operation_target":{"value":"employee","bind_inference_confidence":0.92},"operation_request_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"effective_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"amount_primary":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"reasoning_summary":{"value":null,"bind_inference_confidence":0.92},"approval_state":{"value":"proposed","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"fields":[{"name":"hours_per_week","old_unit":"hours","old_value":"40","unit":"hours","value":"32"}],"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:payroll_operations:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/reset \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/reset',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/payroll-operations/{operation_id}/merge":{"post":{"tags":["Operations:payroll_operations"],"summary":"Merge duplicate payroll operations","description":"Consolidate duplicate operations into this one (the winner). Each loser named in the body must be `active` (422 otherwise); the winner must not be `rejected` (422). The losers are hidden (`merged`), their evidence is re-parented onto the winner. A winner still awaiting a decision is re-blended to carry the best version of each field and lands review-ready, awaiting `confirm`; an `approved` or `corrected` winner keeps its values and status and only gains the evidence. Undone with `unmerge`.\n\nRequired scopes: `operations:payroll_operations:write`","operationId":"payroll_operations_merge","security":[{"oauth2":["operations:payroll_operations:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergeBody"},"example":{"loser_operation_ids":["op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44"]}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayrollOperationsRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"payroll_operations","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","employee_normalised":{"value":null,"bind_inference_confidence":0.92},"employee_external_id":{"value":null,"bind_inference_confidence":0.92},"department":{"value":null,"bind_inference_confidence":0.92},"payroll_provider":{"value":null,"bind_inference_confidence":0.92},"operation_verb":{"value":"add","bind_inference_confidence":0.92},"operation_target":{"value":"employee","bind_inference_confidence":0.92},"operation_request_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"effective_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"amount_primary":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"reasoning_summary":{"value":null,"bind_inference_confidence":0.92},"approval_state":{"value":"proposed","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"fields":[{"name":"hours_per_week","old_unit":"hours","old_value":"40","unit":"hours","value":"32"}],"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:payroll_operations:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/merge \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"loser_operation_ids\": [\"op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44\"]}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/merge',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'loser_operation_ids': ['op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44']},\n)\nprint(response.status_code, response.json())"}]}},"/operations/payroll-operations/{operation_id}/unmerge":{"post":{"tags":["Operations:payroll_operations"],"summary":"Unmerge payroll operations","description":"Undo merges into this operation, made by you or by bind.co's duplicate check: each merged-away operation comes back `active` with its own id and evidence, this operation loses what it took from them and, unless someone confirmed or corrected it since, is re-blended. bind.co never merges the two again on its own. Name the operations to bring back, or leave the list out to undo every merge into this one. A merge made before merges were recorded, one changed since, or a merge or unmerge already running for you, is a 409.\n\nRequired scopes: `operations:payroll_operations:write`","operationId":"payroll_operations_unmerge","security":[{"oauth2":["operations:payroll_operations:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnmergeBody"},"example":{"loser_operation_ids":["op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44"]}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayrollOperationsUnmergeResult"},"example":{"operation":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"payroll_operations","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","employee_normalised":{"value":null,"bind_inference_confidence":0.92},"employee_external_id":{"value":null,"bind_inference_confidence":0.92},"department":{"value":null,"bind_inference_confidence":0.92},"payroll_provider":{"value":null,"bind_inference_confidence":0.92},"operation_verb":{"value":"add","bind_inference_confidence":0.92},"operation_target":{"value":"employee","bind_inference_confidence":0.92},"operation_request_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"effective_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"amount_primary":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"reasoning_summary":{"value":null,"bind_inference_confidence":0.92},"approval_state":{"value":"proposed","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"fields":[{"name":"hours_per_week","old_unit":"hours","old_value":"40","unit":"hours","value":"32"}],"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}},"restored_operation_ids":["op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44"]}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:payroll_operations:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/unmerge \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"loser_operation_ids\": [\"op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44\"]}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/unmerge',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'loser_operation_ids': ['op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44']},\n)\nprint(response.status_code, response.json())"}]}},"/operations/payroll-operations/{operation_id}/chaser":{"get":{"tags":["Operations:payroll_operations"],"summary":"What the chaser is doing with a payroll operation","description":"See where the chaser is with one operation: its current stage, what is still missing, and what it will do next and when. A cross-user, missing, or hidden operation resolves to 404.\n\nRequired scopes: `operations:payroll_operations:read`","operationId":"payroll_operations_chaser_view","security":[{"oauth2":["operations:payroll_operations:read"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationChaserView"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:payroll_operations:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/payroll-operations/chaser/self-help":{"get":{"tags":["Operations:payroll_operations"],"summary":"Self-help queue for payroll operations","description":"List this user's `payroll_operations` operations that are waiting in the self-help phase, each with its unsatisfied fields and the candidate values found on the user's other operations, ready for the owner to review.\n\nRequired scopes: `operations:payroll_operations:read`","operationId":"payroll_operations_self_help_queue","security":[{"oauth2":["operations:payroll_operations:read"]}],"parameters":[{"name":"page_number","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page Number"},"description":"Page number to retrieve."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"default":50,"title":"Page Size"},"description":"Number of items per page."},{"name":"page_token","in":"query","required":false,"schema":{"type":"string"},"description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelfHelpQueueItemPage"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"chaser_status":"in_self_help","gaps":[{"candidates":[{"canonical_path":"expense_date","observed":{"bind_inference_confidence":0.94,"value":"2026-10-14"},"source_operation_id":"op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44"}],"canonical_path":"expense_date","document_candidates":[],"reason":"absent"}],"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:payroll_operations:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/operations/payroll-operations/chaser/self-help \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/operations/payroll-operations/chaser/self-help',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/payroll-operations/chaser/owner-escalation":{"get":{"tags":["Operations:payroll_operations"],"summary":"Owner-escalation queue for payroll operations","description":"List this user's `payroll_operations` operations the system couldn't complete on its own and handed to a person, each with its still-missing fields. Fill them via the edit/confirm routes to resolve it, or dismiss it to stop chasing.\n\nRequired scopes: `operations:payroll_operations:read`","operationId":"payroll_operations_owner_escalation_queue","security":[{"oauth2":["operations:payroll_operations:read"]}],"parameters":[{"name":"page_number","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page Number"},"description":"Page number to retrieve."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"default":50,"title":"Page Size"},"description":"Number of items per page."},{"name":"page_token","in":"query","required":false,"schema":{"type":"string"},"description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnerEscalationQueueItemPage"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"chaser_status":"escalated_to_owner","gaps":[{"canonical_path":"expense_date","reason":"below_threshold"}],"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","pending_draft":{"body":"Hi Dana, could you confirm the date on invoice INV-2207? Thanks, Maya","counterpart_email":"dana@acme.com","counterpart_name":"Dana Ruiz","missing_item":"the invoice date","subject":"Invoice INV-2207: date missing"}}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:payroll_operations:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/operations/payroll-operations/chaser/owner-escalation \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/operations/payroll-operations/chaser/owner-escalation',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/payroll-operations/chaser/outreach-approval":{"get":{"tags":["Operations:payroll_operations"],"summary":"Outreach awaiting your approval for payroll operations","description":"List this user's `payroll_operations` operations for which the system prepared a message to a counterpart, each rendered for review. Nothing has been sent — approve a draft to record that it should go out, or reject it. One decision per operation.\n\nRequired scopes: `drafts:read`, `operations:payroll_operations:read`","operationId":"payroll_operations_outreach_approval_queue","security":[{"oauth2":["drafts:read","operations:payroll_operations:read"]}],"parameters":[{"name":"page_number","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page Number"},"description":"Page number to retrieve."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"default":50,"title":"Page Size"},"description":"Number of items per page."},{"name":"page_token","in":"query","required":false,"schema":{"type":"string"},"description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachApprovalDraftItemPage"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"body":"Hi Dana, could you confirm the date on invoice INV-2207? Thanks, Maya","chaser_status":"pending_approval","counterpart_email":"dana@acme.com","counterpart_name":"Dana Ruiz","missing_item":"the invoice date","operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","subject":"Invoice INV-2207: date missing"}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["drafts:read","operations:payroll_operations:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/operations/payroll-operations/chaser/outreach-approval \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/operations/payroll-operations/chaser/outreach-approval',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/payroll-operations/{operation_id}/chaser/self-help/confirm":{"post":{"tags":["Operations:payroll_operations"],"summary":"Confirm a self-help candidate for a payroll operation","description":"Accept one candidate value the system found on your other operations to fill a gap. It attaches the source evidence to this operation and re-checks the answer. Not reversible.\n\nRequired scopes: `operations:payroll_operations:write`","operationId":"payroll_operations_self_help_confirm","security":[{"oauth2":["operations:payroll_operations:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelfHelpDecisionBody"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayrollOperationsRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"payroll_operations","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","employee_normalised":{"value":null,"bind_inference_confidence":0.92},"employee_external_id":{"value":null,"bind_inference_confidence":0.92},"department":{"value":null,"bind_inference_confidence":0.92},"payroll_provider":{"value":null,"bind_inference_confidence":0.92},"operation_verb":{"value":"add","bind_inference_confidence":0.92},"operation_target":{"value":"employee","bind_inference_confidence":0.92},"operation_request_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"effective_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"amount_primary":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"reasoning_summary":{"value":null,"bind_inference_confidence":0.92},"approval_state":{"value":"proposed","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"fields":[{"name":"hours_per_week","old_unit":"hours","old_value":"40","unit":"hours","value":"32"}],"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:payroll_operations:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/self-help/confirm \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"canonical_path\": \"expense_date\", \"source_operation_id\": \"op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/self-help/confirm',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'canonical_path': 'expense_date', 'source_operation_id': 'op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44'},\n)\nprint(response.status_code, response.json())"}]}},"/operations/payroll-operations/{operation_id}/chaser/self-help/reject":{"post":{"tags":["Operations:payroll_operations"],"summary":"Reject a self-help candidate for a payroll operation","description":"Decline one candidate value the system suggested. It won't be offered again and it leaves the shortlist; the operation stays open for its other candidates.\n\nRequired scopes: `operations:payroll_operations:write`","operationId":"payroll_operations_self_help_reject","security":[{"oauth2":["operations:payroll_operations:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelfHelpDecisionBody"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayrollOperationsRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"payroll_operations","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","employee_normalised":{"value":null,"bind_inference_confidence":0.92},"employee_external_id":{"value":null,"bind_inference_confidence":0.92},"department":{"value":null,"bind_inference_confidence":0.92},"payroll_provider":{"value":null,"bind_inference_confidence":0.92},"operation_verb":{"value":"add","bind_inference_confidence":0.92},"operation_target":{"value":"employee","bind_inference_confidence":0.92},"operation_request_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"effective_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"amount_primary":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"reasoning_summary":{"value":null,"bind_inference_confidence":0.92},"approval_state":{"value":"proposed","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"fields":[{"name":"hours_per_week","old_unit":"hours","old_value":"40","unit":"hours","value":"32"}],"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:payroll_operations:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/self-help/reject \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"canonical_path\": \"expense_date\", \"source_operation_id\": \"op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/self-help/reject',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'canonical_path': 'expense_date', 'source_operation_id': 'op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44'},\n)\nprint(response.status_code, response.json())"}]}},"/operations/payroll-operations/{operation_id}/chaser/owner-escalation/dismiss":{"post":{"tags":["Operations:payroll_operations"],"summary":"Dismiss an escalated payroll operation","description":"Stop chasing an operation the system handed you — it moves to a 'done chasing' state. The operation itself is unchanged.\n\nRequired scopes: `operations:payroll_operations:write`","operationId":"payroll_operations_owner_escalation_dismiss","security":[{"oauth2":["operations:payroll_operations:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayrollOperationsRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"payroll_operations","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","employee_normalised":{"value":null,"bind_inference_confidence":0.92},"employee_external_id":{"value":null,"bind_inference_confidence":0.92},"department":{"value":null,"bind_inference_confidence":0.92},"payroll_provider":{"value":null,"bind_inference_confidence":0.92},"operation_verb":{"value":"add","bind_inference_confidence":0.92},"operation_target":{"value":"employee","bind_inference_confidence":0.92},"operation_request_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"effective_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"amount_primary":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"reasoning_summary":{"value":null,"bind_inference_confidence":0.92},"approval_state":{"value":"proposed","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"fields":[{"name":"hours_per_week","old_unit":"hours","old_value":"40","unit":"hours","value":"32"}],"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:payroll_operations:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/owner-escalation/dismiss \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/owner-escalation/dismiss',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/payroll-operations/{operation_id}/chaser/outreach-approval/confirm":{"post":{"tags":["Operations:payroll_operations"],"summary":"Approve outreach for a payroll operation","description":"Confirm the message the system prepared for a counterpart. Nothing is sent right now — this records that the draft is good to go. One decision per operation.\n\nRequired scopes: `drafts:write`, `operations:payroll_operations:write`","operationId":"payroll_operations_outreach_approval_confirm","security":[{"oauth2":["drafts:write","operations:payroll_operations:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayrollOperationsRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"payroll_operations","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","employee_normalised":{"value":null,"bind_inference_confidence":0.92},"employee_external_id":{"value":null,"bind_inference_confidence":0.92},"department":{"value":null,"bind_inference_confidence":0.92},"payroll_provider":{"value":null,"bind_inference_confidence":0.92},"operation_verb":{"value":"add","bind_inference_confidence":0.92},"operation_target":{"value":"employee","bind_inference_confidence":0.92},"operation_request_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"effective_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"amount_primary":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"reasoning_summary":{"value":null,"bind_inference_confidence":0.92},"approval_state":{"value":"proposed","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"fields":[{"name":"hours_per_week","old_unit":"hours","old_value":"40","unit":"hours","value":"32"}],"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["drafts:write","operations:payroll_operations:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/outreach-approval/confirm \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/outreach-approval/confirm',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/payroll-operations/{operation_id}/chaser/outreach-approval/reject":{"post":{"tags":["Operations:payroll_operations"],"summary":"Reject outreach for a payroll operation","description":"Reject the message the system prepared for a counterpart, so it is not sent. Optionally say why, using one of the operation's allowed rejection reasons: depending on the reason the system stops chasing, stops asking about one missing field, tries another recipient or wording, gives up, or hands the operation to you. One decision per operation.\n\nRequired scopes: `drafts:write`, `operations:payroll_operations:write`","operationId":"payroll_operations_outreach_approval_reject","security":[{"oauth2":["drafts:write","operations:payroll_operations:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/OutreachApprovalRejectBody"},{"type":"null"}],"title":"Body"},"example":{"reason":"wording_needs_work"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayrollOperationsRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"payroll_operations","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","employee_normalised":{"value":null,"bind_inference_confidence":0.92},"employee_external_id":{"value":null,"bind_inference_confidence":0.92},"department":{"value":null,"bind_inference_confidence":0.92},"payroll_provider":{"value":null,"bind_inference_confidence":0.92},"operation_verb":{"value":"add","bind_inference_confidence":0.92},"operation_target":{"value":"employee","bind_inference_confidence":0.92},"operation_request_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"effective_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"amount_primary":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"reasoning_summary":{"value":null,"bind_inference_confidence":0.92},"approval_state":{"value":"proposed","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"fields":[{"name":"hours_per_week","old_unit":"hours","old_value":"40","unit":"hours","value":"32"}],"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["drafts:write","operations:payroll_operations:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/outreach-approval/reject \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"reason\": \"wording_needs_work\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/payroll-operations/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/outreach-approval/reject',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'reason': 'wording_needs_work'},\n)\nprint(response.status_code, response.json())"}]}},"/operations/purchase-loan-financing/search":{"post":{"tags":["Operations:purchase_loan_financing"],"summary":"Search purchase loan financing requests","description":"List this user's `purchase_loan_financing` operations. Supports typed per-field filters (a `_from`/`_to` range for dates & amounts, substring for text, multi-value match for codes/enums), a `status` filter, full-text `search`, and signed `sort_by`. Returns a paginated envelope of operations with the business fields flat on each row.\n\nRequired scopes: `operations:purchase_loan_financing:read`","operationId":"purchase_loan_financing_search","security":[{"oauth2":["operations:purchase_loan_financing:read"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional. Accepted so you can send it on every POST. A search changes nothing, so repeating it is already safe: the key is not stored and each request answers with the current results.","x-idempotency-key-stored":false,"title":"Idempotency-Key"},"description":"Optional. Accepted so you can send it on every POST. A search changes nothing, so repeating it is already safe: the key is not stored and each request answers with the current results."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseLoanFinancingSearchRequest"},"example":{"search":null,"page_number":1,"page_size":50,"page_token":null,"sort_by":["-buyer_normalised"],"status":["active"],"chaser_status":["in_self_help"],"buyer_normalised":null,"asset_type":null,"purchase_price_from":"1234.56","purchase_price_to":"1234.56","down_payment_from":"1234.56","down_payment_to":"1234.56","currency_code":[],"target_close_date_from":"2026-10-01","target_close_date_to":"2026-10-01","completeness_state":["incomplete"],"company_id":"cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d","counterpart_contact_role_id":["rol_1S9dCsGYrSI"],"is_on_behalf_of":null,"on_behalf_of_contact_role_id":["rol_1S9dCsGYrSI"]}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseLoanFinancingRowPage"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"purchase_loan_financing","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","buyer_normalised":{"value":null,"bind_inference_confidence":0.92},"asset_type":{"value":null,"bind_inference_confidence":0.92},"purchase_price":{"value":"1234.56","bind_inference_confidence":0.92},"down_payment":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"target_close_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"company_id":{"value":"cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:purchase_loan_financing:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/purchase-loan-financing/search \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"sort_by\": [\"-buyer_normalised\"], \"page_number\": 1, \"page_size\": 50}'"},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/purchase-loan-financing/search',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n    json={'sort_by': ['-buyer_normalised'], 'page_number': 1, 'page_size': 50},\n)\nprint(response.status_code, response.json())"}]}},"/operations/purchase-loan-financing/{operation_id}":{"get":{"tags":["Operations:purchase_loan_financing"],"summary":"Get a purchase loan financing request","description":"Fetch a single `purchase_loan_financing` operation by id for this user. A cross-user, missing, or hidden (pending/merged/deleted) operation resolves to 404.\n\nRequired scopes: `operations:purchase_loan_financing:read`","operationId":"purchase_loan_financing_get_one","security":[{"oauth2":["operations:purchase_loan_financing:read"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseLoanFinancingRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"purchase_loan_financing","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","buyer_normalised":{"value":null,"bind_inference_confidence":0.92},"asset_type":{"value":null,"bind_inference_confidence":0.92},"purchase_price":{"value":"1234.56","bind_inference_confidence":0.92},"down_payment":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"target_close_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"company_id":{"value":"cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:purchase_loan_financing:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13 \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]},"patch":{"tags":["Operations:purchase_loan_financing"],"summary":"Edit a purchase loan financing request","description":"Fix a review-ready operation's fields and commit it as human-corrected (status → `corrected`). Partial update: send only the fields you are changing — they are merged into the existing record, an omitted field is left unchanged, and a field sent as `null` is cleared. Valid from `active`, `pending_approval`, `approved`, or `corrected`.\n\nRequired scopes: `operations:purchase_loan_financing:write`","operationId":"purchase_loan_financing_edit","security":[{"oauth2":["operations:purchase_loan_financing:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseLoanFinancingEditBody"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseLoanFinancingRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"purchase_loan_financing","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","buyer_normalised":{"value":null,"bind_inference_confidence":0.92},"asset_type":{"value":null,"bind_inference_confidence":0.92},"purchase_price":{"value":"1234.56","bind_inference_confidence":0.92},"down_payment":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"target_close_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"company_id":{"value":"cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"ETag":{"description":"The record's entity tag; send it as `If-Match` to change the record only if it is unchanged.","schema":{"type":"string"}},"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:purchase_loan_financing:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X PATCH https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13 \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"asset_type\": \"business\", \"buyer_normalised\": \"Northwind Holdings\", \"currency_code\": \"CAD\", \"down_payment\": \"170000.00\", \"purchase_price\": \"850000.00\", \"target_close_date\": \"2027-01-15\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.patch(\n    'https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'asset_type': 'business', 'buyer_normalised': 'Northwind Holdings', 'currency_code': 'CAD', 'down_payment': '170000.00', 'purchase_price': '850000.00', 'target_close_date': '2027-01-15'},\n)\nprint(response.status_code, response.json())"}]},"delete":{"tags":["Operations:purchase_loan_financing"],"summary":"Delete a purchase loan financing request","description":"Hide an operation you don't want to see (soft-delete; status → `deleted`). The record is retained but never returned by reads.\n\nRequired scopes: `operations:purchase_loan_financing:write`","operationId":"purchase_loan_financing_delete","security":[{"oauth2":["operations:purchase_loan_financing:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseLoanFinancingRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"purchase_loan_financing","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","buyer_normalised":{"value":null,"bind_inference_confidence":0.92},"asset_type":{"value":null,"bind_inference_confidence":0.92},"purchase_price":{"value":"1234.56","bind_inference_confidence":0.92},"down_payment":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"target_close_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"company_id":{"value":"cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:purchase_loan_financing:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X DELETE https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13 \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.delete(\n    'https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/purchase-loan-financing":{"post":{"tags":["Operations:purchase_loan_financing"],"summary":"Create a purchase loan financing request","description":"Add an operation of type `purchase_loan_financing` that bind.co did not find in the mail. The body carries the business record; it is stored as an approved, human-provided record and answered with `201`. Idempotent on the record's identity — re-asserting the same record returns the existing operation with `200`.\n\nRequired scopes: `operations:purchase_loan_financing:write`","operationId":"purchase_loan_financing_create","security":[{"oauth2":["operations:purchase_loan_financing:write"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseLoanFinancingCreateBody"}}}},"responses":{"201":{"description":"Created; the body is the new record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseLoanFinancingRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"purchase_loan_financing","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","buyer_normalised":{"value":null,"bind_inference_confidence":0.92},"asset_type":{"value":null,"bind_inference_confidence":0.92},"purchase_price":{"value":"1234.56","bind_inference_confidence":0.92},"down_payment":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"target_close_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"company_id":{"value":"cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Location":{"description":"The path of the created record.","schema":{"type":"string"}},"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:purchase_loan_financing:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/purchase-loan-financing \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"asset_type\": \"business\", \"buyer_normalised\": \"Northwind Holdings\", \"currency_code\": \"CAD\", \"down_payment\": \"170000.00\", \"purchase_price\": \"850000.00\", \"target_close_date\": \"2027-01-15\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/purchase-loan-financing',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'asset_type': 'business', 'buyer_normalised': 'Northwind Holdings', 'currency_code': 'CAD', 'down_payment': '170000.00', 'purchase_price': '850000.00', 'target_close_date': '2027-01-15'},\n)\nprint(response.status_code, response.json())"}]}},"/operations/purchase-loan-financing/{operation_id}/confirm":{"post":{"tags":["Operations:purchase_loan_financing"],"summary":"Confirm a purchase loan financing request","description":"Confirm a review-ready operation as correct, as-is (status → `approved`). Valid from `active` or `pending_approval`.\n\nRequired scopes: `operations:purchase_loan_financing:write`","operationId":"purchase_loan_financing_confirm","security":[{"oauth2":["operations:purchase_loan_financing:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseLoanFinancingRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"purchase_loan_financing","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","buyer_normalised":{"value":null,"bind_inference_confidence":0.92},"asset_type":{"value":null,"bind_inference_confidence":0.92},"purchase_price":{"value":"1234.56","bind_inference_confidence":0.92},"down_payment":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"target_close_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"company_id":{"value":"cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:purchase_loan_financing:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/confirm \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/confirm',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/purchase-loan-financing/{operation_id}/reject":{"post":{"tags":["Operations:purchase_loan_financing"],"summary":"Reject a purchase loan financing request","description":"Mark a review-ready operation an error (status → `rejected`). Valid from `active` or `pending_approval`.\n\nRequired scopes: `operations:purchase_loan_financing:write`","operationId":"purchase_loan_financing_reject","security":[{"oauth2":["operations:purchase_loan_financing:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseLoanFinancingRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"purchase_loan_financing","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","buyer_normalised":{"value":null,"bind_inference_confidence":0.92},"asset_type":{"value":null,"bind_inference_confidence":0.92},"purchase_price":{"value":"1234.56","bind_inference_confidence":0.92},"down_payment":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"target_close_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"company_id":{"value":"cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:purchase_loan_financing:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/reject \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/reject',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/purchase-loan-financing/{operation_id}/restore":{"post":{"tags":["Operations:purchase_loan_financing"],"summary":"Restore a purchase loan financing request","description":"Bring back an operation you rejected or deleted, unchanged, in the state it had before: `active`, `pending_approval`, `approved` or `corrected`. Any other operation is a 409.\n\nRequired scopes: `operations:purchase_loan_financing:write`","operationId":"purchase_loan_financing_restore","security":[{"oauth2":["operations:purchase_loan_financing:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseLoanFinancingRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"purchase_loan_financing","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","buyer_normalised":{"value":null,"bind_inference_confidence":0.92},"asset_type":{"value":null,"bind_inference_confidence":0.92},"purchase_price":{"value":"1234.56","bind_inference_confidence":0.92},"down_payment":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"target_close_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"company_id":{"value":"cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:purchase_loan_financing:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/restore \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/restore',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/purchase-loan-financing/{operation_id}/reset":{"post":{"tags":["Operations:purchase_loan_financing"],"summary":"Reset a purchase loan financing request","description":"Drop your confirmation and corrections: the operation goes back to the values bind.co inferred from its emails and documents and lands review-ready again. An operation nobody confirmed or corrected is unchanged. A rejected or deleted operation (restore it first), or one created by hand with nothing inferred, is a 409.\n\nRequired scopes: `operations:purchase_loan_financing:write`","operationId":"purchase_loan_financing_reset","security":[{"oauth2":["operations:purchase_loan_financing:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseLoanFinancingRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"purchase_loan_financing","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","buyer_normalised":{"value":null,"bind_inference_confidence":0.92},"asset_type":{"value":null,"bind_inference_confidence":0.92},"purchase_price":{"value":"1234.56","bind_inference_confidence":0.92},"down_payment":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"target_close_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"company_id":{"value":"cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:purchase_loan_financing:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/reset \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/reset',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/purchase-loan-financing/{operation_id}/merge":{"post":{"tags":["Operations:purchase_loan_financing"],"summary":"Merge duplicate purchase loan financing requests","description":"Consolidate duplicate operations into this one (the winner). Each loser named in the body must be `active` (422 otherwise); the winner must not be `rejected` (422). The losers are hidden (`merged`), their evidence is re-parented onto the winner. A winner still awaiting a decision is re-blended to carry the best version of each field and lands review-ready, awaiting `confirm`; an `approved` or `corrected` winner keeps its values and status and only gains the evidence. Undone with `unmerge`.\n\nRequired scopes: `operations:purchase_loan_financing:write`","operationId":"purchase_loan_financing_merge","security":[{"oauth2":["operations:purchase_loan_financing:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergeBody"},"example":{"loser_operation_ids":["op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44"]}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseLoanFinancingRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"purchase_loan_financing","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","buyer_normalised":{"value":null,"bind_inference_confidence":0.92},"asset_type":{"value":null,"bind_inference_confidence":0.92},"purchase_price":{"value":"1234.56","bind_inference_confidence":0.92},"down_payment":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"target_close_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"company_id":{"value":"cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:purchase_loan_financing:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/merge \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"loser_operation_ids\": [\"op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44\"]}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/merge',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'loser_operation_ids': ['op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44']},\n)\nprint(response.status_code, response.json())"}]}},"/operations/purchase-loan-financing/{operation_id}/unmerge":{"post":{"tags":["Operations:purchase_loan_financing"],"summary":"Unmerge purchase loan financing requests","description":"Undo merges into this operation, made by you or by bind.co's duplicate check: each merged-away operation comes back `active` with its own id and evidence, this operation loses what it took from them and, unless someone confirmed or corrected it since, is re-blended. bind.co never merges the two again on its own. Name the operations to bring back, or leave the list out to undo every merge into this one. A merge made before merges were recorded, one changed since, or a merge or unmerge already running for you, is a 409.\n\nRequired scopes: `operations:purchase_loan_financing:write`","operationId":"purchase_loan_financing_unmerge","security":[{"oauth2":["operations:purchase_loan_financing:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnmergeBody"},"example":{"loser_operation_ids":["op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44"]}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseLoanFinancingUnmergeResult"},"example":{"operation":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"purchase_loan_financing","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","buyer_normalised":{"value":null,"bind_inference_confidence":0.92},"asset_type":{"value":null,"bind_inference_confidence":0.92},"purchase_price":{"value":"1234.56","bind_inference_confidence":0.92},"down_payment":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"target_close_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"company_id":{"value":"cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}},"restored_operation_ids":["op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44"]}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:purchase_loan_financing:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/unmerge \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"loser_operation_ids\": [\"op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44\"]}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/unmerge',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'loser_operation_ids': ['op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44']},\n)\nprint(response.status_code, response.json())"}]}},"/operations/purchase-loan-financing/{operation_id}/chaser":{"get":{"tags":["Operations:purchase_loan_financing"],"summary":"What the chaser is doing with a purchase loan financing request","description":"See where the chaser is with one operation: its current stage, what is still missing, and what it will do next and when. A cross-user, missing, or hidden operation resolves to 404.\n\nRequired scopes: `operations:purchase_loan_financing:read`","operationId":"purchase_loan_financing_chaser_view","security":[{"oauth2":["operations:purchase_loan_financing:read"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OperationChaserView"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:purchase_loan_financing:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/purchase-loan-financing/chaser/self-help":{"get":{"tags":["Operations:purchase_loan_financing"],"summary":"Self-help queue for purchase loan financing requests","description":"List this user's `purchase_loan_financing` operations that are waiting in the self-help phase, each with its unsatisfied fields and the candidate values found on the user's other operations, ready for the owner to review.\n\nRequired scopes: `operations:purchase_loan_financing:read`","operationId":"purchase_loan_financing_self_help_queue","security":[{"oauth2":["operations:purchase_loan_financing:read"]}],"parameters":[{"name":"page_number","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page Number"},"description":"Page number to retrieve."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"default":50,"title":"Page Size"},"description":"Number of items per page."},{"name":"page_token","in":"query","required":false,"schema":{"type":"string"},"description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelfHelpQueueItemPage"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"chaser_status":"in_self_help","gaps":[{"candidates":[{"canonical_path":"expense_date","observed":{"bind_inference_confidence":0.94,"value":"2026-10-14"},"source_operation_id":"op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44"}],"canonical_path":"expense_date","document_candidates":[],"reason":"absent"}],"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:purchase_loan_financing:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/operations/purchase-loan-financing/chaser/self-help \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/operations/purchase-loan-financing/chaser/self-help',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/purchase-loan-financing/chaser/owner-escalation":{"get":{"tags":["Operations:purchase_loan_financing"],"summary":"Owner-escalation queue for purchase loan financing requests","description":"List this user's `purchase_loan_financing` operations the system couldn't complete on its own and handed to a person, each with its still-missing fields. Fill them via the edit/confirm routes to resolve it, or dismiss it to stop chasing.\n\nRequired scopes: `operations:purchase_loan_financing:read`","operationId":"purchase_loan_financing_owner_escalation_queue","security":[{"oauth2":["operations:purchase_loan_financing:read"]}],"parameters":[{"name":"page_number","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page Number"},"description":"Page number to retrieve."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"default":50,"title":"Page Size"},"description":"Number of items per page."},{"name":"page_token","in":"query","required":false,"schema":{"type":"string"},"description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnerEscalationQueueItemPage"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"chaser_status":"escalated_to_owner","gaps":[{"canonical_path":"expense_date","reason":"below_threshold"}],"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","pending_draft":{"body":"Hi Dana, could you confirm the date on invoice INV-2207? Thanks, Maya","counterpart_email":"dana@acme.com","counterpart_name":"Dana Ruiz","missing_item":"the invoice date","subject":"Invoice INV-2207: date missing"}}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:purchase_loan_financing:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/operations/purchase-loan-financing/chaser/owner-escalation \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/operations/purchase-loan-financing/chaser/owner-escalation',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/purchase-loan-financing/chaser/outreach-approval":{"get":{"tags":["Operations:purchase_loan_financing"],"summary":"Outreach awaiting your approval for purchase loan financing requests","description":"List this user's `purchase_loan_financing` operations for which the system prepared a message to a counterpart, each rendered for review. Nothing has been sent — approve a draft to record that it should go out, or reject it. One decision per operation.\n\nRequired scopes: `drafts:read`, `operations:purchase_loan_financing:read`","operationId":"purchase_loan_financing_outreach_approval_queue","security":[{"oauth2":["drafts:read","operations:purchase_loan_financing:read"]}],"parameters":[{"name":"page_number","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page Number"},"description":"Page number to retrieve."},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":250,"minimum":1,"default":50,"title":"Page Size"},"description":"Number of items per page."},{"name":"page_token","in":"query","required":false,"schema":{"type":"string"},"description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachApprovalDraftItemPage"},"example":{"total_items":137,"total_pages":3,"page_number":1,"page_size":50,"items":[{"body":"Hi Dana, could you confirm the date on invoice INV-2207? Thanks, Maya","chaser_status":"pending_approval","counterpart_email":"dana@acme.com","counterpart_name":"Dana Ruiz","missing_item":"the invoice date","operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","subject":"Invoice INV-2207: date missing"}],"next_page_token":"eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"}}},"headers":{"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"500":{"$ref":"#/components/responses/ServerError"},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["drafts:read","operations:purchase_loan_financing:read"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X GET https://api.bind.co/v1/operations/purchase-loan-financing/chaser/outreach-approval \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\""},{"lang":"Python","label":"Python","source":"import requests\n\nresponse = requests.get(\n    'https://api.bind.co/v1/operations/purchase-loan-financing/chaser/outreach-approval',\n    headers={\"Authorization\": f\"Bearer {access_token}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/purchase-loan-financing/{operation_id}/chaser/self-help/confirm":{"post":{"tags":["Operations:purchase_loan_financing"],"summary":"Confirm a self-help candidate for a purchase loan financing request","description":"Accept one candidate value the system found on your other operations to fill a gap. It attaches the source evidence to this operation and re-checks the answer. Not reversible.\n\nRequired scopes: `operations:purchase_loan_financing:write`","operationId":"purchase_loan_financing_self_help_confirm","security":[{"oauth2":["operations:purchase_loan_financing:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelfHelpDecisionBody"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseLoanFinancingRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"purchase_loan_financing","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","buyer_normalised":{"value":null,"bind_inference_confidence":0.92},"asset_type":{"value":null,"bind_inference_confidence":0.92},"purchase_price":{"value":"1234.56","bind_inference_confidence":0.92},"down_payment":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"target_close_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"company_id":{"value":"cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:purchase_loan_financing:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/self-help/confirm \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"canonical_path\": \"expense_date\", \"source_operation_id\": \"op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/self-help/confirm',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'canonical_path': 'expense_date', 'source_operation_id': 'op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44'},\n)\nprint(response.status_code, response.json())"}]}},"/operations/purchase-loan-financing/{operation_id}/chaser/self-help/reject":{"post":{"tags":["Operations:purchase_loan_financing"],"summary":"Reject a self-help candidate for a purchase loan financing request","description":"Decline one candidate value the system suggested. It won't be offered again and it leaves the shortlist; the operation stays open for its other candidates.\n\nRequired scopes: `operations:purchase_loan_financing:write`","operationId":"purchase_loan_financing_self_help_reject","security":[{"oauth2":["operations:purchase_loan_financing:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelfHelpDecisionBody"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseLoanFinancingRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"purchase_loan_financing","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","buyer_normalised":{"value":null,"bind_inference_confidence":0.92},"asset_type":{"value":null,"bind_inference_confidence":0.92},"purchase_price":{"value":"1234.56","bind_inference_confidence":0.92},"down_payment":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"target_close_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"company_id":{"value":"cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:purchase_loan_financing:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/self-help/reject \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"canonical_path\": \"expense_date\", \"source_operation_id\": \"op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/self-help/reject',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'canonical_path': 'expense_date', 'source_operation_id': 'op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44'},\n)\nprint(response.status_code, response.json())"}]}},"/operations/purchase-loan-financing/{operation_id}/chaser/owner-escalation/dismiss":{"post":{"tags":["Operations:purchase_loan_financing"],"summary":"Dismiss an escalated purchase loan financing request","description":"Stop chasing an operation the system handed you — it moves to a 'done chasing' state. The operation itself is unchanged.\n\nRequired scopes: `operations:purchase_loan_financing:write`","operationId":"purchase_loan_financing_owner_escalation_dismiss","security":[{"oauth2":["operations:purchase_loan_financing:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseLoanFinancingRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"purchase_loan_financing","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","buyer_normalised":{"value":null,"bind_inference_confidence":0.92},"asset_type":{"value":null,"bind_inference_confidence":0.92},"purchase_price":{"value":"1234.56","bind_inference_confidence":0.92},"down_payment":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"target_close_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"company_id":{"value":"cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["operations:purchase_loan_financing:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/owner-escalation/dismiss \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/owner-escalation/dismiss',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/purchase-loan-financing/{operation_id}/chaser/outreach-approval/confirm":{"post":{"tags":["Operations:purchase_loan_financing"],"summary":"Approve outreach for a purchase loan financing request","description":"Confirm the message the system prepared for a counterpart. Nothing is sent right now — this records that the draft is good to go. One decision per operation.\n\nRequired scopes: `drafts:write`, `operations:purchase_loan_financing:write`","operationId":"purchase_loan_financing_outreach_approval_confirm","security":[{"oauth2":["drafts:write","operations:purchase_loan_financing:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseLoanFinancingRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"purchase_loan_financing","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","buyer_normalised":{"value":null,"bind_inference_confidence":0.92},"asset_type":{"value":null,"bind_inference_confidence":0.92},"purchase_price":{"value":"1234.56","bind_inference_confidence":0.92},"down_payment":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"target_close_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"company_id":{"value":"cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["drafts:write","operations:purchase_loan_financing:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/outreach-approval/confirm \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\""},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/outreach-approval/confirm',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n)\nprint(response.status_code, response.json())"}]}},"/operations/purchase-loan-financing/{operation_id}/chaser/outreach-approval/reject":{"post":{"tags":["Operations:purchase_loan_financing"],"summary":"Reject outreach for a purchase loan financing request","description":"Reject the message the system prepared for a counterpart, so it is not sent. Optionally say why, using one of the operation's allowed rejection reasons: depending on the reason the system stops chasing, stops asking about one missing field, tries another recipient or wording, gives up, or hands the operation to you. One decision per operation.\n\nRequired scopes: `drafts:write`, `operations:purchase_loan_financing:write`","operationId":"purchase_loan_financing_outreach_approval_reject","security":[{"oauth2":["drafts:write","operations:purchase_loan_financing:write"]}],"parameters":[{"name":"operation_id","in":"path","required":true,"schema":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"],"description":"An operation id: `op_` and an opaque string. Treat it as opaque.","title":"Operation Id"},"description":"The operation's id, as the operation type's search returns it."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused.","title":"Idempotency-Key"},"description":"Optional. A unique value you choose (a UUID works) so a retried request is applied once. Repeat the exact same request with the same key and you get the first answer back, kept for 7 days; a different request with the same key is refused."},{"name":"If-Match","in":"header","required":false,"schema":{"type":"string"},"description":"The record's `ETag`: the change is refused with `412` when the record no longer has it. Omit it to change the record whatever its state."}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/OutreachApprovalRejectBody"},{"type":"null"}],"title":"Body"},"example":{"reason":"wording_needs_work"}}}},"responses":{"200":{"description":"The request succeeded; the body is the result.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurchaseLoanFinancingRow"},"example":{"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","operation_type":"purchase_loan_financing","status":"active","confirmed_at":"2026-10-02T15:04:00Z","last_action":null,"last_actor":null,"chaser_status":"in_self_help","chaser_status_at":"2026-10-02T15:04:00Z","chaser_status_at_source":"status","buyer_normalised":{"value":null,"bind_inference_confidence":0.92},"asset_type":{"value":null,"bind_inference_confidence":0.92},"purchase_price":{"value":"1234.56","bind_inference_confidence":0.92},"down_payment":{"value":"1234.56","bind_inference_confidence":0.92},"currency_code":{"value":null,"bind_inference_confidence":0.92},"target_close_date":{"value":"2026-10-01","bind_inference_confidence":0.92},"completeness_state":{"value":"incomplete","bind_inference_confidence":0.92},"company_id":{"value":"cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d","bind_inference_confidence":0.92},"counterpart_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"is_on_behalf_of":{"value":null,"bind_inference_confidence":0.92},"on_behalf_of_contact_role_id":{"value":"rol_1S9dCsGYrSI","bind_inference_confidence":0.92},"evidence":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}],"assessment":{"bind_inference_confidence":0.91,"completeness_state":"complete"},"batch":{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"},"schema":{"operation_type":"expenses","version":98}}}},"headers":{"Idempotent-Replayed":{"$ref":"#/components/headers/Idempotent-Replayed"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"422":{"$ref":"#/components/responses/ValidationFailed"},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthenticated"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"500":{"$ref":"#/components/responses/ServerError"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"503":{"description":"Temporarily unavailable: `temporarily_unavailable`. Nothing changed; wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"record_busy":{"summary":"Another change to this record is running; retry.","value":{"type":"https://api.bind.co/docs/errors#temporarily_unavailable","title":"Temporarily unavailable","status":503,"error":"temporarily_unavailable","error_description":"Another change to this record is running; retry.","error_uri":"https://api.bind.co/docs/errors#temporarily_unavailable","fault":"server_problem","hint":{"field":"If-Match","retry_after_seconds":1},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Another change to this record is running; retry."}}}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}},"429":{"$ref":"#/components/responses/RateLimited"}},"x-required-scopes":["drafts:write","operations:purchase_loan_financing:write"],"x-codeSamples":[{"lang":"Shell","label":"curl","source":"curl -X POST https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/outreach-approval/reject \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Idempotency-Key: $(uuidgen)\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"reason\": \"wording_needs_work\"}'"},{"lang":"Python","label":"Python","source":"import uuid\n\nimport requests\n\nresponse = requests.post(\n    'https://api.bind.co/v1/operations/purchase-loan-financing/op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13/chaser/outreach-approval/reject',\n    headers={\"Authorization\": f\"Bearer {access_token}\", \"Idempotency-Key\": f\"{uuid.uuid4()}\"},\n    json={'reason': 'wording_needs_work'},\n)\nprint(response.status_code, response.json())"}]}}},"components":{"schemas":{"AppliedRejection":{"type":"string","enum":["suppress_operation_chasing","suppress_specific_gap","mark_counterparty_invalid_retry_alternate","redraft_with_alternate_template","transition_to_exhausted_immediately","escalate_to_owner_immediately","unimplemented_default","no_reason"],"title":"AppliedRejection","description":"What rejecting a draft did: one value per follow-up a rejection reason can lead to, plus the plain\nrejection (`unimplemented_default`, `no_reason`) used when the reason's follow-up is not available yet\nor no reason was given.","example":"suppress_specific_gap"},"AuthorizationServerMetadata":{"properties":{"issuer":{"type":"string","title":"Issuer","description":"The authorization server's identifier; every endpoint below starts with it."},"authorization_endpoint":{"type":"string","title":"Authorization Endpoint","description":"Where to send the user to sign in and consent."},"token_endpoint":{"type":"string","title":"Token Endpoint","description":"Where to exchange an authorization code or a refresh token for tokens."},"revocation_endpoint":{"type":"string","title":"Revocation Endpoint","description":"Where to revoke an access or refresh token."},"introspection_endpoint":{"type":"string","title":"Introspection Endpoint","description":"Where to ask whether a token is still active."},"response_types_supported":{"items":{"type":"string"},"type":"array","title":"Response Types Supported","description":"The authorization response types: only `code`."},"grant_types_supported":{"items":{"type":"string"},"type":"array","title":"Grant Types Supported","description":"The grant types the token endpoint accepts."},"token_endpoint_auth_methods_supported":{"items":{"type":"string"},"type":"array","title":"Token Endpoint Auth Methods Supported","description":"How your application authenticates at the token endpoint."},"revocation_endpoint_auth_methods_supported":{"items":{"type":"string"},"type":"array","title":"Revocation Endpoint Auth Methods Supported","description":"How your application authenticates at the revocation endpoint."},"introspection_endpoint_auth_methods_supported":{"items":{"type":"string"},"type":"array","title":"Introspection Endpoint Auth Methods Supported","description":"How your application authenticates at the introspection endpoint."},"code_challenge_methods_supported":{"items":{"type":"string"},"type":"array","title":"Code Challenge Methods Supported","description":"The PKCE methods accepted: only `S256`."},"scopes_supported":{"items":{"type":"string"},"type":"array","title":"Scopes Supported","description":"Every scope an application can request."}},"type":"object","required":["issuer","authorization_endpoint","token_endpoint","revocation_endpoint","introspection_endpoint","response_types_supported","grant_types_supported","token_endpoint_auth_methods_supported","revocation_endpoint_auth_methods_supported","introspection_endpoint_auth_methods_supported","code_challenge_methods_supported","scopes_supported"],"title":"AuthorizationServerMetadata","examples":[{"authorization_endpoint":"https://api.bind.co/oauth2/authorize","code_challenge_methods_supported":["S256"],"grant_types_supported":["authorization_code","refresh_token"],"introspection_endpoint":"https://api.bind.co/oauth2/introspect","introspection_endpoint_auth_methods_supported":["client_secret_basic","client_secret_post"],"issuer":"https://api.bind.co","response_types_supported":["code"],"revocation_endpoint":"https://api.bind.co/oauth2/revoke","revocation_endpoint_auth_methods_supported":["client_secret_basic","client_secret_post"],"scopes_supported":["contacts:read","contacts:write","drafts:read","drafts:send","drafts:write","files:read","files:write","operations:expenses:read","operations:expenses:write","operations:payroll_operations:read","operations:payroll_operations:write","operations:purchase_loan_financing:read","operations:purchase_loan_financing:write","profile:read","profile:write"],"token_endpoint":"https://api.bind.co/oauth2/token","token_endpoint_auth_methods_supported":["client_secret_basic","client_secret_post"]}],"description":"Returned by `oauth_authorization_server_metadata`."},"AuthorizePrompt":{"type":"string","enum":["none","consent","select_account"],"title":"AuthorizePrompt","example":"consent","description":"`none` signs in without showing a screen, or fails; `consent` always shows the consent screen; `select_account` lets the user pick the account first."},"BindErrorBody":{"properties":{"type":{"type":"string","title":"Type","description":"RFC 9457 problem type: a link to this error's section of the errors guide, equal to `error_uri`."},"title":{"type":"string","title":"Title","description":"RFC 9457 title: a short, fixed summary of the error code.","examples":["Invalid request"]},"status":{"type":"integer","title":"Status","description":"RFC 9457 status: the HTTP status code of this answer.","examples":[400]},"error":{"type":"string","title":"Error","description":"Stable machine-readable error code (RFC 6749 codes plus bind.co extensions).","examples":["invalid_request"]},"error_description":{"type":"string","title":"Error Description","description":"Human-readable explanation of the error."},"error_uri":{"type":"string","title":"Error Uri","description":"Deep link to the docs page section explaining this error and how to fix it."},"fault":{"type":"string","title":"Fault","description":"Whose problem the error is: client_problem, user_problem, or server_problem.","examples":["client_problem"]},"hint":{"$ref":"#/components/schemas/BindErrorHint","description":"Structured diagnostic for the integrator. Common keys: `missing` (list of missing param names), `received` and `expected` (echoes), `valid_statuses` (allowed enum values), `validation_errors` (on a `422`). Never contains secrets."},"request_id":{"type":"string","title":"Request Id","description":"Request ID for correlating with server logs. Paste this into support requests."},"detail":{"type":"string","title":"Detail","description":"RFC 9457 detail: the explanation of this occurrence, equal to `error_description`."}},"type":"object","required":["type","title","status","error","error_description","error_uri","fault","request_id","detail"],"title":"BindErrorBody","description":"The error body returned by every bind.co endpoint on a failure.\n\nIt carries the RFC 9457 problem-details members `type`, `title`, `status` and `detail` next to the\nOAuth-style `error`, `error_description` and `error_uri`, under the `application/json` content type.","examples":[{"detail":"Contact not found.","error":"not_found","error_description":"Contact not found.","error_uri":"https://api.bind.co/docs/errors#not_found","fault":"client_problem","hint":{},"request_id":"req_Q2hhbmdlTWUxMjM0","status":404,"title":"Not found","type":"https://api.bind.co/docs/errors#not_found"}]},"BindErrorHint":{"properties":{"validation_errors":{"anyOf":[{"items":{"$ref":"#/components/schemas/ValidationErrorItem"},"type":"array"},{"type":"null"}],"title":"Validation Errors","description":"On a `422`: every field that failed validation, each listed once."},"missing":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Missing","description":"The required parameters the request left out."},"expected":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"string"},{"type":"null"}],"title":"Expected","description":"What the request needed: every required parameter, or the shape of a refused value."},"grant_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grant Type","description":"On a token request: the `grant_type` the request sent."},"limit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Limit","description":"On a `429`: the limit that was reached, such as `60 per 1 minute`."},"retry_after_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retry After Seconds","description":"On a `429` or `503`: seconds to wait before retrying, as the `Retry-After` header says."}},"additionalProperties":true,"type":"object","title":"BindErrorHint","description":"Structured diagnostic for the integrator; the keys depend on the error, and never hold secrets.","examples":[{"missing":["client_secret"]}]},"ChaserFollowUpChannel":{"type":"string","enum":["off","shadow","email"],"title":"ChaserFollowUpChannel","description":"Whether and how the system follows up on incomplete operations of this type: `off` (no\nfollow-up), `shadow` (follow-up messages are prepared for your approval and nothing is sent), or\n`email` (email follow-ups are chosen for this operation type; until sending is switched on they\nare still prepared for your approval and nothing is sent).","example":"email"},"ChaserGapOut":{"properties":{"canonical_path":{"type":"string","title":"Canonical Path","description":"The missing field, or `document:<TYPES>` for a missing document (`document:<TYPES>#<requirement_id>` when the requirement checks the document's contents)."},"reason":{"$ref":"#/components/schemas/GapReason","description":"Why it counts as missing (absent, below_threshold, missing document, non-conforming document)."},"required_min_confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Required Min Confidence","description":"The confidence the field needs to count as known, 0-1."},"observed_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Observed Confidence","description":"The confidence it has now, 0-1; null when absent."},"failures":{"items":{"$ref":"#/components/schemas/ConditionFailure"},"type":"array","title":"Failures","description":"For a non-conforming document: which checks on its contents failed, and why."}},"additionalProperties":false,"type":"object","required":["canonical_path","reason","required_min_confidence"],"title":"ChaserGapOut","description":"One thing the chaser is still trying to get for the operation.","examples":[{"canonical_path":"expense_date","failures":[],"observed_confidence":0.55,"reason":"below_threshold","required_min_confidence":0.8}]},"ChaserNextActionKind":{"type":"string","enum":["not_chased","chaser_off","state_unreadable","config_unreadable","await_first_scan","advance_to_counterpart_outreach","counterpart_reattempt","escalate_to_owner","document_handoff_to_owner","auto_exhaust","await_approval","await_reply","none_terminal"],"title":"ChaserNextActionKind","example":"await_reply","description":"What the follow-up does next: nothing, because the record is not followed up (`not_chased`), follow-up is off (`chaser_off`) or its state or settings cannot be read (`state_unreadable`, `config_unreadable`); wait for the next mail check (`await_first_scan`); write to the other party (`advance_to_counterpart_outreach`) or write again (`counterpart_reattempt`); hand over to the inbox owner (`escalate_to_owner`, `document_handoff_to_owner`); give up (`auto_exhaust`); wait for approval (`await_approval`) or a reply (`await_reply`); or nothing more, as it is finished (`none_terminal`)."},"ChaserPhase":{"type":"string","enum":["self_help","counterpart_outreach","owner_escalation"],"title":"ChaserPhase","description":"`self_help` looks for the missing item in the user's own mail; `counterpart_outreach` asks the other party for it; `owner_escalation` hands it to the user.","example":"self_help"},"ChaserProgressOut":{"properties":{"at":{"type":"string","format":"date-time","title":"At","description":"When the chaser noticed the items had arrived.","examples":["2026-10-02T15:04:00Z"]},"closed_paths":{"items":{"type":"string"},"type":"array","title":"Closed Paths","description":"The missing items that arrived."}},"additionalProperties":false,"type":"object","required":["at"],"title":"ChaserProgressOut","description":"The last time missing items arrived while the chaser waited on the other party.","examples":[{"at":"2026-10-16T08:12:40Z","closed_paths":["invoice_number"]}]},"ChaserRejectionOut":{"properties":{"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"The reason given; null when none was given."},"applied":{"$ref":"#/components/schemas/AppliedRejection","description":"What the chaser did about it."},"template_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Id","description":"The wording the rejected message used."},"recipient_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recipient Email","description":"Who the rejected message was addressed to."},"gap_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gap Path","description":"The missing item the rejection said to stop asking about."},"at":{"type":"string","format":"date-time","title":"At","description":"When the message was rejected.","examples":["2026-10-02T15:04:00Z"]}},"additionalProperties":false,"type":"object","required":["reason","applied","at"],"title":"ChaserRejectionOut","description":"One rejected message and what the rejection did.","examples":[{"applied":"redraft_with_alternate_template","at":"2026-10-15T13:05:22Z","gap_path":null,"reason":"wording_needs_work","recipient_email":"billing@acme.com","template_id":"expense_chaser_v1_request_invoice"}]},"ChaserStatusAtSource":{"type":"string","enum":["status","phase_entry"],"title":"ChaserStatusAtSource","description":"Where an operation's `chaser_status_at` comes from: the recorded moment the status changed,\nor — for records kept before that moment was tracked — when the current stage began.","example":"status"},"ChaserThreadOut":{"properties":{"email_id":{"type":"string","pattern":"^eml_[0-9A-Za-z]{11}$","title":"Email Id","description":"The email the operation came from.","examples":["eml_16nJ9iKYhhC"]},"thread_id":{"type":"string","title":"Thread Id","description":"The conversation that email belongs to."}},"additionalProperties":false,"type":"object","required":["email_id","thread_id"],"title":"ChaserThreadOut","description":"Record of the email conversation the prepared message is addressed into.","examples":[{"email_id":"eml_16nJ9iKYhhC","thread_id":"18c2f1d07a6b9e42"}]},"ClientMeResponse":{"properties":{"user_id":{"type":"string","pattern":"^usr_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"User Id","description":"The user's public id. Routes take the user from the access token, so never send it as `user_id`.","examples":["usr_0d6f2a4e-5b7c-4e1d-9a83-2c4b6e8f1a20"]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"The user's email address."}},"type":"object","required":["user_id","email"],"title":"ClientMeResponse","description":"The user the access token acts for.","examples":[{"email":"maya@northwind-studio.com","user_id":"usr_0d6f2a4e-5b7c-4e1d-9a83-2c4b6e8f1a20"}]},"CompanyEdit":{"properties":{"company_name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Company Name","description":"The name the company goes by. Cannot be cleared."},"company_legal_name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Company Legal Name","description":"The company's registered legal name."},"country":{"anyOf":[{"type":"string","maxLength":2,"minLength":1,"pattern":"^[A-Z]{2}$"},{"type":"null"}],"title":"Country","description":"The company's country (ISO 3166-1 alpha-2); stored in upper case."},"home_currency":{"anyOf":[{"type":"string","maxLength":3,"minLength":1,"pattern":"^[A-Z]{3}$"},{"type":"null"}],"title":"Home Currency","description":"The currency the company reports in (ISO 4217); stored in upper case."},"primary_jurisdiction":{"anyOf":[{"type":"string","maxLength":64,"minLength":1},{"type":"null"}],"title":"Primary Jurisdiction","description":"The jurisdiction the company is registered in, such as a country or state code."},"primary_email":{"anyOf":[{"type":"string","maxLength":320,"minLength":1,"pattern":"^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$"},{"type":"null"}],"title":"Primary Email","description":"The company's main contact email address."},"founded_year":{"anyOf":[{"type":"integer","maximum":9999.0,"minimum":1000.0},{"type":"null"}],"title":"Founded Year","description":"The year the company was founded."},"company_kind":{"anyOf":[{"$ref":"#/components/schemas/CompanyKind"},{"type":"null"}],"description":"The kind of legal or economic subject the company is; first-party applications only. Cannot be cleared."}},"additionalProperties":false,"type":"object","title":"CompanyEdit","description":"A partial edit of a company: only the fields sent change, and `null` clears one.","examples":[{"company_legal_name":"Northwind Studio LLC","founded_year":2017,"primary_jurisdiction":"US-DE"}]},"CompanyKind":{"type":"string","enum":["business","individual","estate","trust","non_profit","government","other"],"title":"CompanyKind","description":"What the company is: a `business`, an `individual`, an `estate`, a `trust`, a `non_profit`, a `government` body, or `other`.","example":"business"},"CompanyProfileEdit":{"properties":{"company_name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Company Name","description":"The name the company goes by."},"aliases":{"anyOf":[{"items":{"type":"string","maxLength":255,"minLength":1},"type":"array","maxItems":20},{"type":"null"}],"title":"Aliases","description":"Other names the company goes by; replaces the whole list."},"business_vertical":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Business Vertical","description":"The company's sector, such as `Retail Trade`."},"inc_type":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Inc Type","description":"The company's legal form, such as `llc`."},"tax_numbers":{"anyOf":[{"items":{"$ref":"#/components/schemas/TaxNumberEdit"},"type":"array","maxItems":20},{"type":"null"}],"title":"Tax Numbers","description":"The company's tax and registration numbers; replaces the whole list."},"fiscal_year_end":{"anyOf":[{"type":"string","maxLength":5,"minLength":1,"pattern":"^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$"},{"type":"null"}],"title":"Fiscal Year End","description":"The last day of the company's fiscal year, as `MM-DD`."},"reporting_currency":{"anyOf":[{"type":"string","maxLength":3,"minLength":1,"pattern":"^[A-Z]{3}$"},{"type":"null"}],"title":"Reporting Currency","description":"The currency the company reports in (ISO 4217); stored in upper case."},"hero_resume":{"anyOf":[{"type":"string","maxLength":4000,"minLength":1},{"type":"null"}],"title":"Hero Resume","description":"A concise summary of what the company does and for whom."},"address":{"anyOf":[{"$ref":"#/components/schemas/PostalAddressEdit"},{"type":"null"}],"description":"The company's postal address; replaces the whole address."},"phones":{"anyOf":[{"items":{"$ref":"#/components/schemas/PhoneEdit"},"type":"array","maxItems":20},{"type":"null"}],"title":"Phones","description":"The company's phone numbers; replaces the whole list."}},"additionalProperties":false,"type":"object","title":"CompanyProfileEdit","description":"A partial edit of a company profile: the fields sent are saved with confidence 1.0.","examples":[{"aliases":["Northwind","NW Studio"],"fiscal_year_end":"12-31","reporting_currency":"USD","tax_numbers":[{"jurisdiction":"US","number":"12-3456789","type":"EIN"}]}]},"CompanyProfileResponse":{"properties":{"company_id":{"type":"string","pattern":"^cmp_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"Company Id","description":"The company's public id.","examples":["cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d"]},"company_name":{"$ref":"#/components/schemas/ScoredText","description":"The name the company goes by."},"aliases":{"$ref":"#/components/schemas/ScoredTextList","description":"Other names the company goes by, such as trading names and abbreviations."},"business_vertical":{"$ref":"#/components/schemas/ScoredText","description":"The company's sector, such as `Retail Trade` or `Construction`."},"inc_type":{"$ref":"#/components/schemas/ScoredText","description":"The company's legal form, such as `sole_proprietorship`, `partnership`, `corporation` or `llc`."},"tax_numbers":{"$ref":"#/components/schemas/ScoredTaxNumberList","description":"The company's tax and registration numbers."},"fiscal_year_end":{"$ref":"#/components/schemas/ScoredText","description":"The last day of the company's fiscal year, as `MM-DD`."},"reporting_currency":{"$ref":"#/components/schemas/ScoredText","description":"The currency the company reports in (ISO 4217)."},"hero_resume":{"$ref":"#/components/schemas/ScoredText","description":"A concise summary of what the company does and for whom."},"address":{"$ref":"#/components/schemas/ScoredPostalAddress","description":"The company's postal address."},"phones":{"$ref":"#/components/schemas/ScoredPhoneList","description":"The company's phone numbers."},"truth_updated_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Truth Updated At","description":"When a person last saved the profile; null if never."},"suggestion_updated_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Suggestion Updated At","description":"When a suggested change last arrived; null when none is waiting."}},"type":"object","required":["company_id","company_name","aliases","business_vertical","inc_type","tax_numbers","fiscal_year_end","reporting_currency","hero_resume","address","phones","truth_updated_at","suggestion_updated_at"],"title":"CompanyProfileResponse","description":"What bind.co inferred about a company from the inbox, or what a member saved.","examples":[{"address":{"bind_inference_confidence":0.84,"value":{"city":"Boston","country":"US","postal_code":"02108","region":"MA","street":"12 Market Street"}},"aliases":{"bind_inference_confidence":0.8,"value":["Northwind"]},"business_vertical":{"bind_inference_confidence":0.82,"value":"Professional, Scientific, and Technical Services"},"company_id":"cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d","company_name":{"bind_inference_confidence":0.97,"value":"Northwind Studio"},"fiscal_year_end":{"bind_inference_confidence":0.65,"value":"12-31"},"hero_resume":{"bind_inference_confidence":0.78,"value":"Brand identity and packaging for consumer start-ups."},"inc_type":{"bind_inference_confidence":0.76,"value":"llc"},"phones":{"bind_inference_confidence":0.81,"value":[{"kind":"business","number":"+1 617 555 0100"}]},"reporting_currency":{"bind_inference_confidence":0.95,"value":"USD"},"suggestion_updated_at":null,"tax_numbers":{"bind_inference_confidence":0.9,"value":[{"jurisdiction":"US","number":"12-3456789","type":"EIN"}]},"truth_updated_at":"2026-09-14T10:22:05Z"}]},"CompanyProfileSuggestions":{"properties":{"suggestion_updated_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Suggestion Updated At","description":"When the waiting suggestion arrived."},"company_name":{"anyOf":[{"$ref":"#/components/schemas/TextSuggestion"},{"type":"null"}],"description":"The name the company goes by."},"aliases":{"anyOf":[{"$ref":"#/components/schemas/TextListSuggestion"},{"type":"null"}],"description":"Other names the company goes by, such as trading names and abbreviations."},"business_vertical":{"anyOf":[{"$ref":"#/components/schemas/TextSuggestion"},{"type":"null"}],"description":"The company's sector, such as `Retail Trade` or `Construction`."},"inc_type":{"anyOf":[{"$ref":"#/components/schemas/TextSuggestion"},{"type":"null"}],"description":"The company's legal form, such as `sole_proprietorship`, `partnership`, `corporation` or `llc`."},"tax_numbers":{"anyOf":[{"$ref":"#/components/schemas/TaxNumberListSuggestion"},{"type":"null"}],"description":"The company's tax and registration numbers."},"fiscal_year_end":{"anyOf":[{"$ref":"#/components/schemas/TextSuggestion"},{"type":"null"}],"description":"The last day of the company's fiscal year, as `MM-DD`."},"reporting_currency":{"anyOf":[{"$ref":"#/components/schemas/TextSuggestion"},{"type":"null"}],"description":"The currency the company reports in (ISO 4217)."},"hero_resume":{"anyOf":[{"$ref":"#/components/schemas/TextSuggestion"},{"type":"null"}],"description":"A concise summary of what the company does and for whom."},"address":{"anyOf":[{"$ref":"#/components/schemas/PostalAddressSuggestion"},{"type":"null"}],"description":"The company's postal address."},"phones":{"anyOf":[{"$ref":"#/components/schemas/PhoneListSuggestion"},{"type":"null"}],"description":"The company's phone numbers."}},"type":"object","title":"CompanyProfileSuggestions","description":"Each field where the newest inference differs from the saved company profile; `{}` when nothing is waiting.","examples":[{"reporting_currency":{"current":{"bind_inference_confidence":1.0,"value":"USD"},"suggested":{"bind_inference_confidence":0.83,"value":"CAD"}},"suggestion_updated_at":"2026-10-03T07:41:12Z"}]},"CompanyResponse":{"properties":{"company_id":{"type":"string","pattern":"^cmp_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"Company Id","description":"The company's public id.","examples":["cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d"]},"company_name":{"type":"string","title":"Company Name","description":"The name the company goes by."},"company_legal_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Legal Name","description":"The company's registered legal name."},"company_kind":{"$ref":"#/components/schemas/CompanyKind","description":"What the company is: a business, an individual working alone, an estate, a trust, a non-profit, a government body or other."},"company_source":{"$ref":"#/components/schemas/CompanySource","description":"`gmail_hd` / `msft_tenant`: a member signed in with a Google Workspace or Microsoft work account on this domain. `email_domain`: identified by email domain only."},"primary_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Domain","description":"The email domain the company uses; null for an `individual`."},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"The company's country (ISO 3166-1 alpha-2)."},"home_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Home Currency","description":"The currency the company reports in (ISO 4217)."},"primary_jurisdiction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Jurisdiction","description":"The jurisdiction the company is registered in, such as a country or state code."},"primary_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Primary Email","description":"The company's main contact email address."},"founded_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Founded Year","description":"The year the company was founded."}},"type":"object","required":["company_id","company_name","company_legal_name","company_kind","company_source","primary_domain","country","home_currency","primary_jurisdiction","primary_email","founded_year"],"title":"CompanyResponse","description":"A company the user is linked to.","examples":[{"company_id":"cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d","company_kind":"business","company_legal_name":"Northwind Studio LLC","company_name":"Northwind Studio","company_source":"gmail_hd","country":"US","founded_year":2017,"home_currency":"USD","primary_domain":"northwind-studio.com","primary_email":"hello@northwind-studio.com","primary_jurisdiction":"US-MA"}]},"CompanySource":{"type":"string","enum":["email_domain","gmail_hd","msft_tenant","manual"],"title":"CompanySource","description":"How the company was identified: by its email domain, or verified by the sign-in provider\n(Google Workspace `hd`, Microsoft work tenant), or entered by hand.","example":"email_domain"},"CompareOperator":{"type":"string","enum":["present","eq","ne","gt","gte","lt","lte","between","in","matches"],"title":"CompareOperator","example":"gt","description":"`present` (has a value), `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `between` (inclusive), `in` (one of a list) or `matches` (a pattern)."},"CompletenessState":{"type":"string","enum":["incomplete","complete"],"title":"CompletenessState","description":"Whether every field the operation type requires is filled in: `incomplete` while at least one\nis missing, `complete` once all are. While incomplete, the system may follow up to collect what\nis missing.","example":"incomplete"},"ConditionFailure":{"properties":{"condition_index":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Condition Index","description":"The position of the failed check in the requirement's list, from 0."},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Field","description":"The document field the check reads."},"operator":{"anyOf":[{"$ref":"#/components/schemas/CompareOperator"},{"type":"null"}],"description":"How the check compares the field."},"reason":{"$ref":"#/components/schemas/ConditionFailureReason","description":"Why the check failed."},"operand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operand","description":"What the field was compared against: `const`, `op_field:<field>` or `op_date:<date>`."}},"type":"object","required":["reason"],"title":"ConditionFailure","description":"Why one condition failed on a document. `condition_index`, `field` and `operator` are None\nonly for INVALID_CONFIG, where the conditions could not be read at all. `operand` names what\nthe document value was compared against.","examples":[{"condition_index":0,"field":"expiry_date","operand":"op_date:opened_at","operator":"gt","reason":"comparison_failed"}]},"ConditionFailureReason":{"type":"string","enum":["field_missing","field_empty","low_confidence","value_too_long","unparseable_value","op_value_missing","op_value_unparseable","op_value_looks_like_company","comparison_failed","not_in_set","invalid_config"],"title":"ConditionFailureReason","example":"comparison_failed","description":"Why a check failed: the field is missing (`field_missing`) or empty (`field_empty`), read with low confidence (`low_confidence`), too long (`value_too_long`) or unreadable (`unparseable_value`); the record value it is compared with is missing (`op_value_missing`), unreadable (`op_value_unparseable`) or a company name (`op_value_looks_like_company`); the comparison failed (`comparison_failed`); the value is not one of those allowed (`not_in_set`); or the checks themselves could not be read (`invalid_config`)."},"ContactCreateBody":{"properties":{"contact_name":{"type":"string","maxLength":320,"minLength":1,"title":"Contact Name","description":"The contact's name."},"contact_primary_email":{"type":"string","maxLength":320,"pattern":"^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$","title":"Contact Primary Email","description":"The contact's email address; stored in lower case."},"contact_summary":{"anyOf":[{"type":"string","maxLength":1500,"minLength":1},{"type":"null"}],"title":"Contact Summary","description":"A short note on who the contact is."},"contact_relationship_strength":{"anyOf":[{"type":"integer","maximum":10.0,"minimum":1.0},{"type":"null"}],"title":"Contact Relationship Strength","description":"How strong the relationship is, 1 to 10; stronger is more familiar and warmer."},"contact_tone":{"anyOf":[{"type":"integer","maximum":10.0,"minimum":1.0},{"type":"null"}],"title":"Contact Tone","description":"The tone of the exchanges, 1 to 10; higher is warmer, less direct and less formal."},"contact_phone":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Contact Phone","description":"The contact's phone number."},"contact_address":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Contact Address","description":"The contact's postal address."},"contact_title":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Contact Title","description":"The contact's job title."},"contact_profession":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Contact Profession","description":"The contact's profession."},"contact_date_of_birth":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Contact Date Of Birth","description":"The contact's date of birth."}},"additionalProperties":false,"type":"object","required":["contact_name","contact_primary_email"],"title":"ContactCreateBody","example":{"contact_name":"Ada Lovelace","contact_primary_email":"ada@example.com","contact_title":"CFO"},"description":"The request body of `contact_create`."},"ContactEmailAddress":{"properties":{"email_address":{"type":"string","title":"Email Address","description":"The email address."},"company_name":{"$ref":"#/components/schemas/ScoredText","description":"The company the address belongs to, with bind.co's confidence; a null value when unknown, such as a personal mailbox, and a null confidence when not scored yet. Rescored over time."}},"type":"object","required":["email_address","company_name"],"title":"ContactEmailAddress","description":"One email address of a contact, with the company it belongs to.","examples":[{"company_name":{"bind_inference_confidence":0.9,"value":"Acme"},"email_address":"dana@acme.com"}]},"ContactMergeBody":{"properties":{"loser_contact_ids":{"items":{"type":"string","pattern":"^con_[0-9A-Za-z]{11}$","description":"A contact id: `con_` and an opaque string. Treat it as opaque.","examples":["con_3SrGoE2zltj"]},"type":"array","maxItems":100,"minItems":1,"title":"Loser Contact Ids","description":"The duplicate contacts to fold in, each listed once; never the contact in the path.","examples":[["con_K5qkIECrRvk","con_1KhA9w7bROa"]]}},"additionalProperties":false,"type":"object","required":["loser_contact_ids"],"title":"ContactMergeBody","description":"The contacts to fold into the contact in the path."},"ContactProfileEdit":{"properties":{"contact_name":{"type":"string","maxLength":320,"minLength":1,"title":"Contact Name","description":"The contact's name."},"contact_summary":{"anyOf":[{"type":"string","maxLength":1500,"minLength":1},{"type":"null"}],"title":"Contact Summary","description":"A short summary of who the contact is to the user."},"contact_relationship_strength":{"anyOf":[{"type":"integer","maximum":10.0,"minimum":1.0},{"type":"null"}],"title":"Contact Relationship Strength","description":"1 (weak or recent) to 10 (close and long-standing)."},"contact_tone":{"anyOf":[{"type":"integer","maximum":10.0,"minimum":1.0},{"type":"null"}],"title":"Contact Tone","description":"How the user writes to the contact: 1 direct and strictly business, 10 open and friendly."},"contact_phone":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Contact Phone","description":"The contact's phone number."},"contact_address":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Contact Address","description":"The contact's postal address."},"contact_title":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Contact Title","description":"The contact's job title."},"contact_profession":{"anyOf":[{"type":"string","maxLength":500,"minLength":1},{"type":"null"}],"title":"Contact Profession","description":"The contact's profession."},"contact_date_of_birth":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Contact Date Of Birth","description":"The contact's date of birth."}},"additionalProperties":false,"type":"object","title":"ContactProfileEdit","description":"A partial edit of a contact: the fields sent are saved with confidence 1.0, and `null` clears one (the name\ncannot be cleared).","examples":[{"contact_name":"Dana Ruiz-Ortega","contact_phone":"+1 617 555 0142","contact_title":"CFO"}]},"ContactProfileResponse":{"properties":{"user_direct_first_contact":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"User Direct First Contact","description":"When the user first emailed the contact directly (the contact in To); null if never."},"user_direct_last_contact":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"User Direct Last Contact","description":"When the user last emailed the contact directly (the contact in To); null if never."},"contact_direct_first_contact":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Contact Direct First Contact","description":"When the contact first emailed the user; null if never."},"contact_direct_last_contact":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Contact Direct Last Contact","description":"When the contact last emailed the user; null if never."},"user_indirect_first_contact":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"User Indirect First Contact","description":"When the user first sent an email with the contact copied (Cc or Bcc); null if never."},"user_indirect_last_contact":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"User Indirect Last Contact","description":"When the user last sent an email with the contact copied (Cc or Bcc); null if never."},"other_indirect_first_contact":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Other Indirect First Contact","description":"When the contact was first copied (Cc or Bcc) on an email someone else sent the user; null if never."},"other_indirect_last_contact":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Other Indirect Last Contact","description":"When the contact was last copied (Cc or Bcc) on an email someone else sent the user; null if never."},"contact_id":{"type":"string","pattern":"^con_[0-9A-Za-z]{11}$","title":"Contact Id","description":"The contact's id.","examples":["con_3SrGoE2zltj"]},"contact_status":{"$ref":"#/components/schemas/ContactStatus","description":"`active`, `merged` into another contact, or `dismissed`."},"contact_name":{"$ref":"#/components/schemas/ScoredText","description":"The contact's name."},"contact_primary_email":{"$ref":"#/components/schemas/ScoredText","description":"The contact's main email address."},"email_addresses":{"items":{"$ref":"#/components/schemas/ContactEmailAddress"},"type":"array","title":"Email Addresses","description":"Every email address known for the contact, the primary first, each with its company."},"last_contact":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Last Contact","description":"The latest of the `*_last_contact` times; null if none."},"first_contact":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"First Contact","description":"The earliest of the `*_first_contact` times; null if none."},"contact_summary":{"$ref":"#/components/schemas/ScoredText","description":"A short summary of who the contact is to the user."},"contact_relationship_strength":{"$ref":"#/components/schemas/ScoredInteger","description":"1 (weak or recent) to 10 (close and long-standing)."},"contact_tone":{"$ref":"#/components/schemas/ScoredInteger","description":"How the user writes to the contact: 1 direct and strictly business, 10 open and friendly."},"contact_phone":{"$ref":"#/components/schemas/ScoredText","description":"The contact's phone number."},"contact_address":{"$ref":"#/components/schemas/ScoredText","description":"The contact's postal address."},"contact_title":{"$ref":"#/components/schemas/ScoredText","description":"The contact's job title."},"contact_profession":{"$ref":"#/components/schemas/ScoredText","description":"The contact's profession."},"contact_date_of_birth":{"$ref":"#/components/schemas/ScoredDate","description":"The contact's date of birth."},"truth_updated_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Truth Updated At","description":"When the contact was last saved by a person; null if never."},"suggestion_updated_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Suggestion Updated At","description":"When a suggested change last arrived; null when none is waiting."}},"type":"object","required":["user_direct_first_contact","user_direct_last_contact","contact_direct_first_contact","contact_direct_last_contact","user_indirect_first_contact","user_indirect_last_contact","other_indirect_first_contact","other_indirect_last_contact","contact_id","contact_status","contact_name","contact_primary_email","email_addresses","last_contact","first_contact","contact_summary","contact_relationship_strength","contact_tone","contact_phone","contact_address","contact_title","contact_profession","contact_date_of_birth","truth_updated_at","suggestion_updated_at"],"title":"ContactProfileResponse","description":"One of the user's contacts, with bind.co's confidence in each value.","examples":[{"contact_address":{"bind_inference_confidence":null,"value":null},"contact_date_of_birth":{"bind_inference_confidence":null,"value":null},"contact_direct_first_contact":"2024-01-19T08:03:00Z","contact_direct_last_contact":"2026-10-02T15:04:00Z","contact_id":"con_3SrGoE2zltj","contact_name":{"bind_inference_confidence":0.95,"value":"Dana Ruiz"},"contact_phone":{"bind_inference_confidence":null,"value":null},"contact_primary_email":{"bind_inference_confidence":0.99,"value":"dana@acme.com"},"contact_profession":{"bind_inference_confidence":0.8,"value":"Accounting"},"contact_relationship_strength":{"bind_inference_confidence":0.7,"value":7},"contact_status":"active","contact_summary":{"bind_inference_confidence":0.84,"value":"Acme's controller; handles the monthly close."},"contact_title":{"bind_inference_confidence":0.9,"value":"Controller"},"contact_tone":{"bind_inference_confidence":0.66,"value":4},"email_addresses":[{"company_name":{"bind_inference_confidence":0.9,"value":"Acme"},"email_address":"dana@acme.com"},{"company_name":{"bind_inference_confidence":null,"value":null},"email_address":"dana.ruiz@gmail.com"}],"first_contact":"2024-01-18T09:12:00Z","last_contact":"2026-10-02T15:04:00Z","other_indirect_first_contact":"2024-03-02T10:45:00Z","other_indirect_last_contact":"2025-11-14T16:30:00Z","suggestion_updated_at":null,"truth_updated_at":null,"user_direct_first_contact":"2024-01-18T09:12:00Z","user_direct_last_contact":"2026-09-30T11:20:00Z","user_indirect_first_contact":null,"user_indirect_last_contact":null}]},"ContactProfileSuggestions":{"properties":{"suggestion_updated_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Suggestion Updated At","description":"When the waiting suggestion arrived."},"contact_name":{"anyOf":[{"$ref":"#/components/schemas/TextSuggestion"},{"type":"null"}],"description":"The contact's name."},"contact_summary":{"anyOf":[{"$ref":"#/components/schemas/TextSuggestion"},{"type":"null"}],"description":"A short summary of who the contact is to the user."},"contact_relationship_strength":{"anyOf":[{"$ref":"#/components/schemas/IntegerSuggestion"},{"type":"null"}],"description":"1 (weak or recent) to 10 (close and long-standing)."},"contact_tone":{"anyOf":[{"$ref":"#/components/schemas/IntegerSuggestion"},{"type":"null"}],"description":"How the user writes to the contact: 1 direct and strictly business, 10 open and friendly."},"contact_phone":{"anyOf":[{"$ref":"#/components/schemas/TextSuggestion"},{"type":"null"}],"description":"The contact's phone number."},"contact_address":{"anyOf":[{"$ref":"#/components/schemas/TextSuggestion"},{"type":"null"}],"description":"The contact's postal address."},"contact_title":{"anyOf":[{"$ref":"#/components/schemas/TextSuggestion"},{"type":"null"}],"description":"The contact's job title."},"contact_profession":{"anyOf":[{"$ref":"#/components/schemas/TextSuggestion"},{"type":"null"}],"description":"The contact's profession."},"contact_date_of_birth":{"anyOf":[{"$ref":"#/components/schemas/DateSuggestion"},{"type":"null"}],"description":"The contact's date of birth."}},"type":"object","title":"ContactProfileSuggestions","description":"The details where the newest inference differs from the saved contact; `{}` when nothing is waiting.","examples":[{"contact_name":{"current":{"bind_inference_confidence":1.0,"value":"Dana Ruiz"},"suggested":{"bind_inference_confidence":0.82,"value":"Dana Ruiz-Ortega"}},"contact_title":{"current":{"bind_inference_confidence":1.0,"value":"Controller"},"suggested":{"bind_inference_confidence":0.87,"value":"CFO"}},"suggestion_updated_at":"2026-10-03T07:41:12Z"}]},"ContactRoleStatus":{"type":"string","enum":["active","merged","dismissed"],"title":"ContactRoleStatus","example":"active","description":"`active` is in use; `merged` was folded into another role; `dismissed` was set aside."},"ContactSearchRequest":{"properties":{"search":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search","description":"Search details"},"page_number":{"type":"integer","minimum":1.0,"title":"Page Number","description":"Page number to retrieve.","default":1},"page_size":{"type":"integer","maximum":250.0,"minimum":1.0,"title":"Page Size","description":"Number of items per page.","default":50},"page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Token","description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."},"sort_by":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Sort By","description":"Signed sort keys, `-` for descending; unknown keys are refused (422). Default `contact_name`."},"status":{"anyOf":[{"items":{"$ref":"#/components/schemas/ProfileStatusFilter"},"type":"array"},{"type":"null"}],"title":"Status","description":"Default `active` only."},"has_suggestion":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Suggestion","description":"True for only those with a suggested change waiting; false for only those without."},"last_contact_from":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Last Contact From","description":"Last exchanged email on or after this time."},"last_contact_to":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Last Contact To","description":"Last exchanged email on or before this time."},"first_contact_from":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"First Contact From","description":"First exchanged email on or after this time."},"first_contact_to":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"First Contact To","description":"First exchanged email on or before this time."},"email":{"anyOf":[{"type":"string","maxLength":320},{"type":"null"}],"title":"Email","description":"Only the contact holding this address, primary or not (exact, ignoring case)."},"company_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Company Name","description":"Only contacts with an address at this company (exact, ignoring case)."}},"additionalProperties":false,"type":"object","title":"ContactSearchRequest","examples":[{"company_name":"Acme","last_contact_from":"2026-01-01T00:00:00Z","page_number":1,"page_size":50,"search":"dana","sort_by":["-last_contact"]}],"description":"The request body of `search_contacts`."},"ContactStatus":{"type":"string","enum":["active","merged","dismissed"],"title":"ContactStatus","example":"active","description":"`active` is in use; `merged` was folded into another contact; `dismissed` was set aside."},"ContactUnmergeBody":{"properties":{"loser_contact_ids":{"anyOf":[{"items":{"type":"string","pattern":"^con_[0-9A-Za-z]{11}$","description":"A contact id: `con_` and an opaque string. Treat it as opaque.","examples":["con_3SrGoE2zltj"]},"type":"array","maxItems":100,"minItems":1},{"type":"null"}],"title":"Loser Contact Ids","description":"The merged-away contacts to bring back. Leave it out to undo every merge into this contact.","examples":[["con_K5qkIECrRvk"]]}},"additionalProperties":false,"type":"object","title":"ContactUnmergeBody","description":"The request body of `contact_unmerge`."},"ContactUnmergeResponse":{"properties":{"contact":{"$ref":"#/components/schemas/ContactProfileResponse","description":"This contact after the unmerge."},"restored_contact_ids":{"items":{"type":"string","pattern":"^con_[0-9A-Za-z]{11}$","description":"A contact id: `con_` and an opaque string. Treat it as opaque.","examples":["con_3SrGoE2zltj"]},"type":"array","title":"Restored Contact Ids","description":"The contacts brought back, each active under its own id.","examples":[["con_K5qkIECrRvk"]]}},"type":"object","required":["contact","restored_contact_ids"],"title":"ContactUnmergeResponse","description":"Returned by `contact_unmerge`."},"Draft":{"properties":{"client_connection_summary":{"$ref":"#/components/schemas/ScoredText","description":"What the user and the contact have been discussing."},"client_connection_contact_objective":{"$ref":"#/components/schemas/ScoredText","description":"What the suggested email sets out to achieve."},"client_connection_contact_reason":{"$ref":"#/components/schemas/ScoredText","description":"Why now is a good time to write to the contact."},"client_connection_contact_date":{"$ref":"#/components/schemas/ScoredUtcDateTime","description":"When the email is suggested to go out."},"client_connection_contact_draft_subject":{"$ref":"#/components/schemas/ScoredText","description":"The subject bind.co suggested."},"client_connection_contact_draft_email":{"$ref":"#/components/schemas/ScoredText","description":"The body bind.co suggested."},"client_connection_priority":{"$ref":"#/components/schemas/ScoredInteger","description":"Suggested order of attention; a lower number comes first."},"contact_name":{"$ref":"#/components/schemas/ScoredText","description":"The contact's name."},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email","description":"The contact's email address."},"relationship_strength":{"$ref":"#/components/schemas/ScoredInteger","description":"How strong the relationship is, 1 (weak or recent) to 10 (close and long-standing)."},"last_contact":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Last Contact","description":"When the user and the contact last exchanged email."},"truth_updates":{"$ref":"#/components/schemas/UpdateTruth","description":"Why the draft changed; on a write, send at least `truth_reason`."},"draft_folder":{"type":"string","enum":["new","draft","later","deleted","pinged"],"title":"Draft Folder","description":"The folder the draft is in: new, draft, later, deleted (rejected) or pinged (sent)."},"draft_later_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Draft Later At","description":"For a draft moved to `later`: when it comes back."},"draft_email_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Email To","description":"Recipients, comma-separated."},"draft_email_cc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Email Cc","description":"Copied recipients, comma-separated."},"draft_email_bcc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Email Bcc","description":"Blind-copied recipients, comma-separated."},"draft_email_subject":{"$ref":"#/components/schemas/ScoredText","description":"The subject the user will send."},"draft_email_body":{"$ref":"#/components/schemas/ScoredText","description":"The body the user will send."},"draft_email_message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Email Message Id","description":"The mail provider's id of the sent message; empty until sent."},"draft_email_thread_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Email Thread Id","description":"The conversation the email is sent into; empty for a new conversation."},"draft_id":{"anyOf":[{"type":"string","pattern":"^drf_[0-9A-Za-z]{11}$","description":"A draft id: `drf_` and an opaque string. Treat it as opaque.","examples":["drf_9Eob4pBVAa5"]},{"type":"null"}],"title":"Draft Id","description":"The draft's id."},"first_contact":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"First Contact","description":"When the user and the contact first exchanged email."},"draft_priority_score":{"type":"number","title":"Draft Priority Score","description":"Ranking score; drafts list highest first by default.","default":0},"draft_created_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Draft Created At","description":"When the draft was suggested."},"goal":{"anyOf":[{"$ref":"#/components/schemas/DraftGoalSummary"},{"type":"null"}],"description":"The goal the draft serves, if any."},"entity_type":{"$ref":"#/components/schemas/ScoredText","description":"The role the contact plays for the user."},"entity_stage":{"$ref":"#/components/schemas/ScoredText","description":"The stage the relationship is at in that role."}},"type":"object","required":["client_connection_summary","client_connection_contact_objective","client_connection_contact_reason","client_connection_contact_date","client_connection_contact_draft_subject","client_connection_contact_draft_email","client_connection_priority","contact_name","relationship_strength","truth_updates","draft_folder","draft_email_subject","draft_email_body","entity_type","entity_stage"],"title":"Draft","description":"An email suggested for one of the user's contacts, as the user is editing it.","examples":[{"client_connection_contact_date":{"bind_inference_confidence":0.7,"value":"2026-10-02T15:04:00Z"},"client_connection_contact_draft_email":{"bind_inference_confidence":0.8,"value":"Hi Dana, here is the pricing..."},"client_connection_contact_draft_subject":{"bind_inference_confidence":0.8,"value":"Pricing for Q3"},"client_connection_contact_objective":{"bind_inference_confidence":0.8,"value":"Send the updated pricing."},"client_connection_contact_reason":{"bind_inference_confidence":0.8,"value":"Dana asked for it two weeks ago."},"client_connection_priority":{"bind_inference_confidence":0.6,"value":2},"client_connection_summary":{"bind_inference_confidence":0.9,"value":"Discussed the Q3 renewal; Dana asked for updated pricing."},"contact_email":"dana@acme.com","contact_name":{"bind_inference_confidence":0.95,"value":"Dana Ruiz"},"draft_created_at":"2026-10-02T15:04:00Z","draft_email_body":{"bind_inference_confidence":1.0,"value":"Hi Dana, as promised, here is the updated pricing..."},"draft_email_subject":{"bind_inference_confidence":1.0,"value":"Updated pricing for Q3"},"draft_email_to":"dana@acme.com","draft_folder":"new","draft_id":"drf_9Eob4pBVAa5","draft_priority_score":98.7,"entity_stage":{"bind_inference_confidence":0.8,"value":"ACTIVE"},"entity_type":{"bind_inference_confidence":0.95,"value":"CLIENT"},"relationship_strength":{"bind_inference_confidence":0.7,"value":7},"truth_updates":{"truth_operation":null,"truth_reason":null,"truth_updated_at":null}}]},"DraftCount":{"properties":{"draft_folder":{"type":"string","enum":["new","draft","later","deleted","pinged"],"title":"Draft Folder","description":"The folder."},"count":{"type":"integer","title":"Count","description":"How many of the user's drafts are in it."}},"type":"object","required":["draft_folder","count"],"title":"DraftCount","description":"How many of the user's drafts one folder holds.","examples":[{"count":12,"draft_folder":"new"}]},"DraftFolder":{"type":"string","enum":["new","draft","later","deleted","pinged"],"title":"DraftFolder","example":"new","description":"The folder a draft is in: `new`, `draft` (being edited), `later` (saved for later), `deleted` (rejected) or `pinged` (sent)."},"DraftGoalAvailableRole":{"properties":{"role_id":{"type":"string","title":"Role Id","description":"The role, as used in `target_role_ids`."},"total_targets":{"type":"integer","title":"Total Targets","description":"How many active contacts hold the role."},"high_confidence_targets":{"type":"integer","title":"High Confidence Targets","description":"How many of them hold it with at least `min_confidence`."},"available_stages":{"items":{"type":"string"},"type":"array","title":"Available Stages","description":"The stages those confident roles are at, for `target_role_stages`.","default":[]}},"type":"object","required":["role_id","total_targets","high_confidence_targets"],"title":"DraftGoalAvailableRole","description":"A role a goal can target, with how many of the user's active contacts hold it.","examples":[{"available_stages":["ACTIVE","PROSPECT"],"high_confidence_targets":41,"role_id":"CLIENT","total_targets":48}]},"DraftGoalAvailableRolePage":{"properties":{"total_items":{"type":"integer","title":"Total Items","description":"Total number of items across all pages.","examples":[137]},"total_pages":{"type":"integer","title":"Total Pages","description":"Total number of pages available.","examples":[3]},"page_number":{"type":"integer","title":"Page Number","description":"The current page number.","examples":[1]},"page_size":{"type":"integer","title":"Page Size","description":"The number of items per page.","examples":[50]},"items":{"items":{"$ref":"#/components/schemas/DraftGoalAvailableRole"},"type":"array","title":"Items","description":"The list of items for the current page."},"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Page Token","description":"Pass as `page_token` to get the next page; null on the last page.","examples":["eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"]}},"type":"object","required":["total_items","total_pages","page_number","page_size","items"],"title":"DraftGoalAvailableRolePage","description":"A page of the roles a goal can target."},"DraftGoalCreate":{"properties":{"draft_goal_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Goal Description","description":"A short name for the goal."},"draft_goal_definition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Goal Definition","description":"What the goal's drafts should achieve, in plain words; bind.co writes the drafts toward it."},"draft_goal_min_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0,"description":"Lowest role confidence (0 to 1, in steps of 0.1) a contact role needs for this goal to target it; 0.8 when not set."},{"type":"null"}],"title":"Draft Goal Min Confidence","description":"Lowest role confidence (0 to 1, in steps of 0.1) a contact role needs for this goal to target it; 0.8 when not set."},"target_contact_ids":{"items":{"type":"string","pattern":"^con_[0-9A-Za-z]{11}$","description":"A contact id: `con_` and an opaque string. Treat it as opaque.","examples":["con_3SrGoE2zltj"]},"type":"array","title":"Target Contact Ids","description":"Only draft to these contacts; empty for no contact filter. A goal needs this or `target_role_ids`.","default":[]},"target_role_ids":{"items":{"type":"string"},"type":"array","title":"Target Role Ids","description":"The contact roles to draft to, such as CLIENT; empty means every role. A goal needs this or `target_contact_ids`.","default":[]},"target_role_stages":{"additionalProperties":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}]},"type":"object","title":"Target Role Stages","description":"For each role in `target_role_ids`, the stages to draft to; a role left out or set to null takes every stage.","default":{}},"is_active":{"type":"boolean","title":"Is Active","description":"True to activate the goal now; false keeps it a `draft`.","default":false}},"type":"object","title":"DraftGoalCreate","description":"A new goal for the drafts bind.co suggests.","examples":[{"draft_goal_definition":"Ask each active client whether they want to renew their retainer for next year.","draft_goal_description":"Q4 renewals","draft_goal_min_confidence":0.8,"is_active":true,"target_contact_ids":["con_3SrGoE2zltj"],"target_role_ids":["CLIENT"],"target_role_stages":{"CLIENT":["ACTIVE"]}}]},"DraftGoalDeleteResponse":{"properties":{"deleted":{"type":"boolean","const":true,"title":"Deleted","description":"Always true: a goal that could not be deleted is an error.","default":true}},"type":"object","title":"DraftGoalDeleteResponse","description":"A goal that was deleted.","examples":[{"deleted":true}]},"DraftGoalResponse":{"properties":{"draft_goal_id":{"type":"string","pattern":"^gol_[0-9A-Za-z]{11}$","title":"Draft Goal Id","description":"The goal's id.","examples":["gol_9CUsxyeaCIs"]},"user_id":{"type":"string","pattern":"^usr_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"User Id","description":"The user's public id.","examples":["usr_0d6f2a4e-5b7c-4e1d-9a83-2c4b6e8f1a20"]},"draft_goal_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Goal Description","description":"A short name for the goal."},"draft_goal_definition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Goal Definition","description":"What the goal's drafts should achieve, in plain words; bind.co writes the drafts toward it."},"draft_goal_min_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0,"description":"Lowest role confidence (0 to 1, in steps of 0.1) a contact role needs for this goal to target it; 0.8 when not set."},{"type":"null"}],"title":"Draft Goal Min Confidence","description":"Lowest role confidence (0 to 1, in steps of 0.1) a contact role needs for this goal to target it; 0.8 when not set."},"target_contact_ids":{"items":{"type":"string","pattern":"^con_[0-9A-Za-z]{11}$","description":"A contact id: `con_` and an opaque string. Treat it as opaque.","examples":["con_3SrGoE2zltj"]},"type":"array","title":"Target Contact Ids","description":"Only draft to these contacts; empty for no contact filter. A goal needs this or `target_role_ids`."},"target_role_ids":{"items":{"type":"string"},"type":"array","title":"Target Role Ids","description":"The contact roles to draft to, such as CLIENT; empty means every role. A goal needs this or `target_contact_ids`."},"target_role_stages":{"additionalProperties":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}]},"type":"object","title":"Target Role Stages","description":"For each role in `target_role_ids`, the stages to draft to; a role left out or set to null takes every stage."},"status":{"$ref":"#/components/schemas/DraftGoalStatus","description":"`draft` until first activated, then `active` or `inactive`; `deleted` once deleted."},"draft_goal_created_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Draft Goal Created At","description":"When the goal was created."},"draft_goal_activated_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Draft Goal Activated At","description":"When the goal was last activated; null if never."},"draft_goal_deactivated_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Draft Goal Deactivated At","description":"When the goal was deactivated; null while it is active or was never deactivated."},"draft_goal_deleted_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Draft Goal Deleted At","description":"When the goal was deleted; null unless deleted."}},"type":"object","required":["draft_goal_id","user_id","draft_goal_description","draft_goal_definition","draft_goal_min_confidence","target_contact_ids","target_role_ids","target_role_stages","status","draft_goal_created_at","draft_goal_activated_at","draft_goal_deactivated_at","draft_goal_deleted_at"],"title":"DraftGoalResponse","description":"A goal the user set for the drafts bind.co suggests.","examples":[{"draft_goal_activated_at":"2026-10-01T09:00:00Z","draft_goal_created_at":"2026-10-01T09:00:00Z","draft_goal_deactivated_at":null,"draft_goal_definition":"Ask each active client whether they want to renew their retainer for next year.","draft_goal_deleted_at":null,"draft_goal_description":"Q4 renewals","draft_goal_id":"gol_9CUsxyeaCIs","draft_goal_min_confidence":0.8,"status":"active","target_contact_ids":["con_3SrGoE2zltj"],"target_role_ids":["CLIENT"],"target_role_stages":{"CLIENT":["ACTIVE"]},"user_id":"usr_0d6f2a4e-5b7c-4e1d-9a83-2c4b6e8f1a20"}]},"DraftGoalStatus":{"type":"string","enum":["draft","active","inactive","deleted"],"title":"DraftGoalStatus","example":"active","description":"`draft` is being written; `active` is in use; `inactive` is paused; `deleted` is removed."},"DraftGoalSummary":{"properties":{"draft_goal_id":{"type":"string","pattern":"^gol_[0-9A-Za-z]{11}$","title":"Draft Goal Id","description":"The goal's id.","examples":["gol_9CUsxyeaCIs"]},"draft_goal_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Goal Description","description":"A short name for the goal."},"draft_goal_definition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Goal Definition","description":"What the goal's drafts should achieve, in plain words; bind.co writes the drafts toward it."},"draft_goal_min_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0,"description":"Lowest role confidence (0 to 1, in steps of 0.1) a contact role needs for this goal to target it; 0.8 when not set."},{"type":"null"}],"title":"Draft Goal Min Confidence","description":"Lowest role confidence (0 to 1, in steps of 0.1) a contact role needs for this goal to target it; 0.8 when not set."},"status":{"$ref":"#/components/schemas/DraftGoalStatus","description":"`draft` until first activated, then `active` or `inactive`; `deleted` once deleted."},"draft_goal_created_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Draft Goal Created At","description":"When the goal was created."},"draft_goal_activated_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Draft Goal Activated At","description":"When the goal was last activated; null if never."}},"type":"object","required":["draft_goal_id","draft_goal_description","draft_goal_definition","draft_goal_min_confidence","status","draft_goal_created_at","draft_goal_activated_at"],"title":"DraftGoalSummary","description":"The goal a draft serves.","examples":[{"draft_goal_activated_at":"2026-10-01T09:00:00Z","draft_goal_created_at":"2026-10-01T09:00:00Z","draft_goal_definition":"Ask each active client whether they want to renew their retainer for next year.","draft_goal_description":"Q4 renewals","draft_goal_id":"gol_9CUsxyeaCIs","draft_goal_min_confidence":0.8,"status":"active"}]},"DraftGoalUpdate":{"properties":{"draft_goal_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Goal Description","description":"A short name for the goal."},"draft_goal_definition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Goal Definition","description":"What the goal's drafts should achieve, in plain words; bind.co writes the drafts toward it."},"draft_goal_min_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0,"description":"Lowest role confidence (0 to 1, in steps of 0.1) a contact role needs for this goal to target it; 0.8 when not set."},{"type":"null"}],"title":"Draft Goal Min Confidence","description":"Lowest role confidence (0 to 1, in steps of 0.1) a contact role needs for this goal to target it; 0.8 when not set."},"target_contact_ids":{"anyOf":[{"items":{"type":"string","pattern":"^con_[0-9A-Za-z]{11}$","description":"A contact id: `con_` and an opaque string. Treat it as opaque.","examples":["con_3SrGoE2zltj"]},"type":"array"},{"type":"null"}],"title":"Target Contact Ids","description":"Only draft to these contacts; empty for no contact filter. A goal needs this or `target_role_ids`. Replaces the whole list."},"target_role_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Target Role Ids","description":"The contact roles to draft to, such as CLIENT; empty means every role. A goal needs this or `target_contact_ids`. Replaces the whole list."},"target_role_stages":{"anyOf":[{"additionalProperties":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}]},"type":"object"},{"type":"null"}],"title":"Target Role Stages","description":"For each role in `target_role_ids`, the stages to draft to; a role left out or set to null takes every stage. Applies only when `target_role_ids` is sent; without it the stages already set are kept."},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active","description":"True to activate the goal, false to deactivate it."}},"type":"object","title":"DraftGoalUpdate","description":"A partial edit of a goal: only the fields sent change.","examples":[{"draft_goal_definition":"Ask each active client whether they want to renew before December 15.","is_active":true}]},"DraftSendResponse":{"properties":{"draft_id":{"type":"string","pattern":"^drf_[0-9A-Za-z]{11}$","title":"Draft Id","description":"The draft that was sent.","examples":["drf_9Eob4pBVAa5"]},"sent":{"type":"boolean","const":true,"title":"Sent","description":"Always true: a draft that could not be sent is an error.","default":true},"message_id":{"type":"string","title":"Message Id","description":"The mailbox provider's id of the sent email."}},"type":"object","required":["draft_id","message_id"],"title":"DraftSendResponse","description":"A draft sent as an email from the user's mailbox.","examples":[{"draft_id":"drf_9Eob4pBVAa5","message_id":"18f2c9a7b1d4e305","sent":true}]},"DraftUpdate":{"properties":{"client_connection_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Connection Summary","description":"What the user and the contact have been discussing."},"client_connection_contact_objective":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Connection Contact Objective","description":"What the suggested email sets out to achieve."},"client_connection_contact_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Connection Contact Reason","description":"Why now is a good time to write to the contact."},"client_connection_contact_date":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Client Connection Contact Date","description":"When the email is suggested to go out."},"client_connection_contact_draft_subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Connection Contact Draft Subject","description":"The subject bind.co suggested."},"client_connection_contact_draft_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Connection Contact Draft Email","description":"The body bind.co suggested."},"client_connection_priority":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Client Connection Priority","description":"Suggested order of attention; a lower number comes first."},"contact_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Name","description":"The contact's name."},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email","description":"The contact's email address."},"relationship_strength":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Relationship Strength","description":"How strong the relationship is, 1 (weak or recent) to 10 (close and long-standing)."},"last_contact":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Last Contact","description":"When the user and the contact last exchanged email."},"truth_updates":{"$ref":"#/components/schemas/UpdateTruth","description":"Why the draft changed; on a write, send at least `truth_reason`."},"draft_folder":{"type":"string","enum":["new","draft","later","deleted","pinged"],"title":"Draft Folder","description":"The folder the draft is in: new, draft, later, deleted (rejected) or pinged (sent)."},"draft_later_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Draft Later At","description":"For a draft moved to `later`: when it comes back."},"draft_email_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Email To","description":"Recipients, comma-separated."},"draft_email_cc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Email Cc","description":"Copied recipients, comma-separated."},"draft_email_bcc":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Email Bcc","description":"Blind-copied recipients, comma-separated."},"draft_email_subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Email Subject","description":"The subject the user will send."},"draft_email_body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Email Body","description":"The body the user will send."},"draft_email_message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Email Message Id","description":"The mail provider's id of the sent message; empty until sent."},"draft_email_thread_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Draft Email Thread Id","description":"The conversation the email is sent into; empty for a new conversation."},"draft_refresh_subject_and_body":{"type":"boolean","title":"Draft Refresh Subject And Body","description":"True to have bind.co write a new subject and body.","default":false}},"type":"object","required":["truth_updates","draft_folder"],"title":"DraftUpdate","description":"A draft as the user edited it. The draft is the one the path names; a `draft_id` in the body is\nignored.","examples":[{"draft_email_body":"Hi Dana, here is the updated pricing...","draft_email_subject":"Updated pricing for Q3","draft_email_to":"dana@acme.com","draft_folder":"draft","draft_refresh_subject_and_body":false,"truth_updates":{"truth_operation":null,"truth_reason":"Edited the greeting","truth_updated_at":null}}]},"EmailIdentifiersResponse":{"properties":{"email_id":{"type":"string","pattern":"^eml_[0-9A-Za-z]{11}$","title":"Email Id","description":"The email's id, as given in a record's evidence.","examples":["eml_16nJ9iKYhhC"]},"email_message_id":{"type":"string","title":"Email Message Id","description":"The message's ID in the provider's API — Gmail's message id, or Microsoft Graph's id; not the RFC 2822 `Message-ID` header."},"email_thread_id":{"type":"string","title":"Email Thread Id","description":"The conversation the message belongs to — Gmail's threadId, or Microsoft Graph's conversationId."},"email_web_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Web Url","description":"Direct link to open the message in the provider's web client. Null for messages collected before links were stored."}},"type":"object","required":["email_id","email_message_id","email_thread_id"],"title":"EmailIdentifiersResponse","description":"The mail provider's own identifiers for an email, and a link that opens it in the provider's web client.","examples":[{"email_id":"eml_16nJ9iKYhhC","email_message_id":"18c2f4a9b7d3e1f0","email_thread_id":"18c2f1d07a6b9e42","email_web_url":"https://mail.google.com/mail/u/0/#all/18c2f4a9b7d3e1f0"}]},"EmailProviderType":{"type":"string","enum":["gmail","microsoft"],"title":"EmailProviderType","example":"gmail","description":"The user's mail provider: `gmail` or `microsoft`."},"ErrorClass":{"type":"string","enum":["timeout","connection_refused","connection_error","tls_error","protocol_error","redirect_not_followed","http_4xx_retryable","http_410_gone","http_4xx","http_5xx","ssrf_rejected","endpoint_inactive","undeliverable"],"title":"ErrorClass","example":"timeout","description":"Why the last attempt failed: a `timeout`; the endpoint refused or dropped the connection (`connection_refused`, `connection_error`); a certificate or protocol problem (`tls_error`, `protocol_error`); a redirect, which is never followed (`redirect_not_followed`); an answer of 408 or 429 that is retried (`http_4xx_retryable`), of 410 that disables the endpoint (`http_410_gone`), of another 4xx (`http_4xx`) or of a 5xx (`http_5xx`); a URL that resolves to a private address (`ssrf_rejected`); an endpoint that is no longer active (`endpoint_inactive`); or an event that could not be sent at all (`undeliverable`)."},"ExpensesCompletenessStateScored":{"properties":{"value":{"anyOf":[{"$ref":"#/components/schemas/CompletenessState"},{"type":"null"}],"description":"Whether every required field has been populated from evidence: incomplete or complete."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"ExpensesCompletenessStateScored","description":"Whether every required field has been populated from evidence: incomplete or complete."},"ExpensesCounterpartContactRoleIdScored":{"properties":{"value":{"anyOf":[{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","examples":["rol_1S9dCsGYrSI"]},{"type":"null"}],"title":"Value","description":"The contact role of the other party to the operation, from the user's contacts; null when not identified."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"ExpensesCounterpartContactRoleIdScored","description":"The contact role of the other party to the operation, from the user's contacts; null when not identified."},"ExpensesCreateBody":{"properties":{"expense_date":{"type":"string","title":"Expense Date","description":"The date the transaction occurred."},"payment_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Date","description":"The date the expense was paid, when the document states one. Null for an unpaid document."},"total_amount":{"type":"string","format":"decimal","title":"Total Amount","description":"The expense's total, including tax.","examples":["1234.56"]},"currency_code":{"type":"string","title":"Currency Code","description":"The ISO 4217 currency code of the amounts. Null when the source names no currency, or when there is no amount."},"payment_status":{"type":"string","enum":["paid","paid_late","payable","unpaid","partially_paid","unknown"],"title":"Payment Status","description":"The payment state, derived from the payment and due dates: paid, paid_late, payable, unpaid, partially_paid or unknown."},"document_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Number","description":"The document's own identifier (invoice, receipt, or reference number)."},"on_behalf_of_contact_role_id":{"anyOf":[{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","examples":["rol_1S9dCsGYrSI"]},{"type":"null"}],"title":"On Behalf Of Contact Role Id","description":"The id of the client contact role this operation is recorded on behalf of, when your account operates on behalf of others. Validated against your own contact roles. Leave unset for an operation that is directly your own."},"vendor_normalised":{"type":"string","title":"Vendor Normalised","description":"The vendor's clean business name, used to match expenses from the same vendor (e.g. Northwind Hosting)."},"due_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due Date","description":"The date payment is due; null when the document states none."},"vendor_email_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vendor Email Domain","description":"The vendor's sending email domain, lowercased (e.g. northwindhosting.com); null when unknown or a personal email provider."}},"additionalProperties":false,"type":"object","required":["expense_date","total_amount","currency_code","payment_status","vendor_normalised"],"title":"ExpensesCreateBody","examples":[{"currency_code":"CAD","document_number":"INV-20431","expense_date":"2026-10-01","payment_date":"2026-10-01","payment_status":"paid","total_amount":"55.37","vendor_email_domain":"northwindhosting.com","vendor_normalised":"Northwind Hosting"}],"description":"The request body of `expenses_create`."},"ExpensesCurrencyCodeScored":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value","description":"The ISO 4217 currency code of the amounts. Null when the source names no currency, or when there is no amount."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"ExpensesCurrencyCodeScored","description":"The ISO 4217 currency code of the amounts. Null when the source names no currency, or when there is no amount."},"ExpensesDocumentNumberScored":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value","description":"The document's own identifier (invoice, receipt, or reference number)."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"ExpensesDocumentNumberScored","description":"The document's own identifier (invoice, receipt, or reference number)."},"ExpensesDueDateScored":{"properties":{"value":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Value","description":"The date payment is due; null when the document states none."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"ExpensesDueDateScored","description":"The date payment is due; null when the document states none."},"ExpensesEditBody":{"properties":{"expense_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expense Date","description":"The date the transaction occurred."},"payment_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Date","description":"The date the expense was paid, when the document states one. Null for an unpaid document."},"total_amount":{"anyOf":[{"type":"string","format":"decimal","examples":["1234.56"]},{"type":"null"}],"title":"Total Amount","description":"The expense's total, including tax."},"currency_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency Code","description":"The ISO 4217 currency code of the amounts. Null when the source names no currency, or when there is no amount."},"payment_status":{"anyOf":[{"type":"string","enum":["paid","paid_late","payable","unpaid","partially_paid","unknown"]},{"type":"null"}],"title":"Payment Status","description":"The payment state, derived from the payment and due dates: paid, paid_late, payable, unpaid, partially_paid or unknown."},"document_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Number","description":"The document's own identifier (invoice, receipt, or reference number)."},"on_behalf_of_contact_role_id":{"anyOf":[{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","examples":["rol_1S9dCsGYrSI"]},{"type":"null"}],"title":"On Behalf Of Contact Role Id","description":"The id of the client contact role this operation is recorded on behalf of, when your account operates on behalf of others. Validated against your own contact roles. Leave unset for an operation that is directly your own."},"vendor_normalised":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vendor Normalised","description":"The vendor's clean business name, used to match expenses from the same vendor (e.g. Northwind Hosting)."},"due_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due Date","description":"The date payment is due; null when the document states none."},"vendor_email_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vendor Email Domain","description":"The vendor's sending email domain, lowercased (e.g. northwindhosting.com); null when unknown or a personal email provider."}},"additionalProperties":false,"type":"object","title":"ExpensesEditBody","examples":[{"currency_code":"CAD","document_number":"INV-20431","expense_date":"2026-10-01","payment_date":"2026-10-01","payment_status":"paid","total_amount":"55.37","vendor_email_domain":"northwindhosting.com","vendor_normalised":"Northwind Hosting"}],"description":"The request body of `expenses_edit`."},"ExpensesExpenseDateScored":{"properties":{"value":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Value","description":"The date the transaction occurred."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"ExpensesExpenseDateScored","description":"The date the transaction occurred."},"ExpensesIsOnBehalfOfScored":{"properties":{"value":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Value","description":"True when the operation is recorded on behalf of one of the user's clients rather than for the user directly."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"ExpensesIsOnBehalfOfScored","description":"True when the operation is recorded on behalf of one of the user's clients rather than for the user directly."},"ExpensesOnBehalfOfContactRoleIdScored":{"properties":{"value":{"anyOf":[{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","examples":["rol_1S9dCsGYrSI"]},{"type":"null"}],"title":"Value","description":"The id of the client contact role this operation is recorded on behalf of, when your account operates on behalf of others. Validated against your own contact roles. Leave unset for an operation that is directly your own."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"ExpensesOnBehalfOfContactRoleIdScored","description":"The id of the client contact role this operation is recorded on behalf of, when your account operates on behalf of others. Validated against your own contact roles. Leave unset for an operation that is directly your own."},"ExpensesPaymentDateScored":{"properties":{"value":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Value","description":"The date the expense was paid, when the document states one. Null for an unpaid document."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"ExpensesPaymentDateScored","description":"The date the expense was paid, when the document states one. Null for an unpaid document."},"ExpensesPaymentStatus":{"type":"string","enum":["paid","paid_late","payable","unpaid","partially_paid","unknown"],"title":"ExpensesPaymentStatus","example":"paid","description":"The payment state, derived from the payment and due dates: paid, paid_late, payable, unpaid, partially_paid or unknown."},"ExpensesPaymentStatusScored":{"properties":{"value":{"anyOf":[{"$ref":"#/components/schemas/ExpensesPaymentStatus"},{"type":"null"}],"description":"The payment state, derived from the payment and due dates: paid, paid_late, payable, unpaid, partially_paid or unknown."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"ExpensesPaymentStatusScored","description":"The payment state, derived from the payment and due dates: paid, paid_late, payable, unpaid, partially_paid or unknown."},"ExpensesRow":{"properties":{"operation_id":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"Operation Id","description":"Unique identifier of the operation.","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"]},"operation_type":{"type":"string","title":"Operation Type","description":"The operation type (e.g. expenses, payroll_operations).","examples":["expenses"]},"status":{"$ref":"#/components/schemas/OperationStatus","description":"The operation's lifecycle status (e.g. active, pending_approval, approved, rejected)."},"confirmed_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Confirmed At","description":"When the operation's current values were last committed."},"last_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Action","description":"The most recent status change applied to the operation."},"last_actor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Actor","description":"Who last acted on the operation."},"chaser_status":{"anyOf":[{"$ref":"#/components/schemas/OperationChaserStatus"},{"type":"null"}],"description":"Where the chaser is with this operation; null if it has never been chased."},"chaser_status_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Chaser Status At","description":"When the chaser status last changed; null if never chased."},"chaser_status_at_source":{"anyOf":[{"$ref":"#/components/schemas/ChaserStatusAtSource"},{"type":"null"}],"description":"`status` when `chaser_status_at` is the recorded change time; `phase_entry` when only the start of the current stage is known (older records)."},"vendor_normalised":{"anyOf":[{"$ref":"#/components/schemas/ExpensesVendorNormalisedScored"},{"type":"null"}],"description":"The vendor's clean business name, used to match expenses from the same vendor (e.g. Northwind Hosting)."},"expense_date":{"anyOf":[{"$ref":"#/components/schemas/ExpensesExpenseDateScored"},{"type":"null"}],"description":"The date the transaction occurred."},"due_date":{"anyOf":[{"$ref":"#/components/schemas/ExpensesDueDateScored"},{"type":"null"}],"description":"The date payment is due; null when the document states none."},"total_amount":{"anyOf":[{"$ref":"#/components/schemas/ExpensesTotalAmountScored"},{"type":"null"}],"description":"The expense's total, including tax."},"currency_code":{"anyOf":[{"$ref":"#/components/schemas/ExpensesCurrencyCodeScored"},{"type":"null"}],"description":"The ISO 4217 currency code of the amounts. Null when the source names no currency, or when there is no amount."},"payment_status":{"anyOf":[{"$ref":"#/components/schemas/ExpensesPaymentStatusScored"},{"type":"null"}],"description":"The payment state, derived from the payment and due dates: paid, paid_late, payable, unpaid, partially_paid or unknown."},"vendor_email_domain":{"anyOf":[{"$ref":"#/components/schemas/ExpensesVendorEmailDomainScored"},{"type":"null"}],"description":"The vendor's sending email domain, lowercased (e.g. northwindhosting.com); null when unknown or a personal email provider."},"document_number":{"anyOf":[{"$ref":"#/components/schemas/ExpensesDocumentNumberScored"},{"type":"null"}],"description":"The document's own identifier (invoice, receipt, or reference number)."},"completeness_state":{"anyOf":[{"$ref":"#/components/schemas/ExpensesCompletenessStateScored"},{"type":"null"}],"description":"Whether every required field has been populated from evidence: incomplete or complete."},"payment_date":{"anyOf":[{"$ref":"#/components/schemas/ExpensesPaymentDateScored"},{"type":"null"}],"description":"The date the expense was paid, when the document states one. Null for an unpaid document."},"counterpart_contact_role_id":{"anyOf":[{"$ref":"#/components/schemas/ExpensesCounterpartContactRoleIdScored"},{"type":"null"}],"description":"The contact role of the other party to the operation, from the user's contacts; null when not identified."},"is_on_behalf_of":{"anyOf":[{"$ref":"#/components/schemas/ExpensesIsOnBehalfOfScored"},{"type":"null"}],"description":"True when the operation is recorded on behalf of one of the user's clients rather than for the user directly."},"on_behalf_of_contact_role_id":{"anyOf":[{"$ref":"#/components/schemas/ExpensesOnBehalfOfContactRoleIdScored"},{"type":"null"}],"description":"The id of the client contact role this operation is recorded on behalf of, when your account operates on behalf of others. Validated against your own contact roles. Leave unset for an operation that is directly your own."},"evidence":{"items":{"$ref":"#/components/schemas/PublicEvidenceItem"},"type":"array","title":"Evidence","description":"The files and emails this operation was built from."},"assessment":{"anyOf":[{"$ref":"#/components/schemas/PublicAssessment"},{"type":"null"}],"description":"The overall confidence and completeness of the operation."},"batch":{"anyOf":[{"$ref":"#/components/schemas/PublicBatch"},{"type":"null"}],"description":"The ingest batch this operation came from."},"schema":{"$ref":"#/components/schemas/PublicSchemaRef","description":"The operation type and schema version this operation was reconciled under."}},"type":"object","required":["operation_id","operation_type","status","schema"],"title":"ExpensesRow","description":"One expense as the API returns it: its status, chaser state, fields with their confidence, and the evidence it was built from."},"ExpensesSearchRequest":{"properties":{"search":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search","description":"Search details"},"page_number":{"type":"integer","minimum":1.0,"title":"Page Number","description":"Page number to retrieve.","default":1},"page_size":{"type":"integer","maximum":250.0,"minimum":1.0,"title":"Page Size","description":"Number of items per page.","default":50},"page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Token","description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."},"sort_by":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Sort By","description":"Field names of the record to sort by, in order; prefix a name with `-` to sort it descending.","examples":[["-vendor_normalised"]]},"status":{"anyOf":[{"items":{"$ref":"#/components/schemas/VisibleOperationStatus"},"type":"array"},{"type":"null"}],"title":"Status","description":"Filter to these lifecycle statuses (matches any). Allowed: active, pending_approval, approved, corrected, rejected."},"chaser_status":{"anyOf":[{"items":{"$ref":"#/components/schemas/OperationChaserStatus"},"type":"array"},{"type":"null"}],"title":"Chaser Status","description":"Filter to operations whose chaser is in one of these statuses (matches any). Operations the chaser has never looked at have no chaser status and are excluded."},"vendor_normalised":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vendor Normalised","description":"Case-insensitive substring match on `vendor_normalised`."},"expense_date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Expense Date From","description":"Inclusive lower bound (>=) on `expense_date`."},"expense_date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Expense Date To","description":"Inclusive upper bound (<=) on `expense_date`."},"due_date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Due Date From","description":"Inclusive lower bound (>=) on `due_date`."},"due_date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Due Date To","description":"Inclusive upper bound (<=) on `due_date`."},"total_amount_from":{"anyOf":[{"type":"string","format":"decimal","examples":["1234.56"]},{"type":"null"}],"title":"Total Amount From","description":"Inclusive lower bound (>=) on `total_amount`."},"total_amount_to":{"anyOf":[{"type":"string","format":"decimal","examples":["1234.56"]},{"type":"null"}],"title":"Total Amount To","description":"Inclusive upper bound (<=) on `total_amount`."},"currency_code":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Currency Code","description":"Match any of the given values on `currency_code` (exact/IN)."},"payment_status":{"anyOf":[{"items":{"$ref":"#/components/schemas/ExpensesPaymentStatus"},"type":"array"},{"type":"null"}],"title":"Payment Status","description":"Match any of the given values on `payment_status` (exact/IN)."},"vendor_email_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vendor Email Domain","description":"Case-insensitive substring match on `vendor_email_domain`."},"document_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Document Number","description":"Case-insensitive substring match on `document_number`."},"completeness_state":{"anyOf":[{"items":{"$ref":"#/components/schemas/CompletenessState"},"type":"array"},{"type":"null"}],"title":"Completeness State","description":"Match any of the given values on `completeness_state` (exact/IN)."},"payment_date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Payment Date From","description":"Inclusive lower bound (>=) on `payment_date`."},"payment_date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Payment Date To","description":"Inclusive upper bound (<=) on `payment_date`."},"counterpart_contact_role_id":{"anyOf":[{"items":{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","examples":["rol_1S9dCsGYrSI"]},"type":"array"},{"type":"null"}],"title":"Counterpart Contact Role Id","description":"Match any of the given values on `counterpart_contact_role_id` (exact/IN)."},"is_on_behalf_of":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is On Behalf Of","description":"Exact match (true/false) on `is_on_behalf_of`."},"on_behalf_of_contact_role_id":{"anyOf":[{"items":{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","examples":["rol_1S9dCsGYrSI"]},"type":"array"},{"type":"null"}],"title":"On Behalf Of Contact Role Id","description":"Match any of the given values on `on_behalf_of_contact_role_id` (exact/IN)."}},"type":"object","title":"ExpensesSearchRequest","description":"The request body of `expenses_search`."},"ExpensesTotalAmountScored":{"properties":{"value":{"anyOf":[{"type":"string","format":"decimal","examples":["1234.56"]},{"type":"null"}],"title":"Value","description":"The expense's total, including tax."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"ExpensesTotalAmountScored","description":"The expense's total, including tax."},"ExpensesUnmergeResult":{"properties":{"operation":{"anyOf":[{"$ref":"#/components/schemas/ExpensesRow"},{"type":"null"}],"description":"This operation after the unmerge; null while it has no record a read would return yet."},"restored_operation_ids":{"items":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"An operation id: `op_` and an opaque string. Treat it as opaque.","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"]},"type":"array","title":"Restored Operation Ids","description":"The operations brought back, each `active` under its own id.","examples":[["op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44"]]}},"type":"object","required":["operation","restored_operation_ids"],"title":"ExpensesUnmergeResult","description":"Returned by `expenses_unmerge`."},"ExpensesVendorEmailDomainScored":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value","description":"The vendor's sending email domain, lowercased (e.g. northwindhosting.com); null when unknown or a personal email provider."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"ExpensesVendorEmailDomainScored","description":"The vendor's sending email domain, lowercased (e.g. northwindhosting.com); null when unknown or a personal email provider."},"ExpensesVendorNormalisedScored":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value","description":"The vendor's clean business name, used to match expenses from the same vendor (e.g. Northwind Hosting)."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"ExpensesVendorNormalisedScored","description":"The vendor's clean business name, used to match expenses from the same vendor (e.g. Northwind Hosting)."},"GapReason":{"type":"string","enum":["absent","below_threshold","missing_mandatory_document","missing_optional_document","non_conforming_mandatory_document","non_conforming_optional_document"],"title":"GapReason","description":"Why something counts as missing: the value is `absent` or read with too little confidence (`below_threshold`); a required or optional document is missing (`missing_mandatory_document`, `missing_optional_document`) or does not meet what the record needs (`non_conforming_mandatory_document`, `non_conforming_optional_document`).","example":"absent"},"IntrospectionResponse":{"properties":{"active":{"type":"boolean","title":"Active","description":"Whether the token is currently valid."},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope","description":"Space-separated scopes the token carries."},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id","description":"The client the token was issued to."},"token_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Type","description":"`Bearer` for an active token."},"exp":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exp","description":"When the token expires, in Unix seconds."},"iat":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Iat","description":"When the token was issued, in Unix seconds."},"sub":{"anyOf":[{"type":"string","pattern":"^usr_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"A user id: `usr_` and an opaque string. Treat it as opaque.","examples":["usr_0d6f2a4e-5b7c-4e1d-9a83-2c4b6e8f1a20"]},{"type":"null"}],"title":"Sub","description":"The user's public id, the user the access token acts for."}},"type":"object","required":["active"],"title":"IntrospectionResponse","description":"RFC 7662 §2.2. An unknown, revoked or expired token answers `{\"active\": false}` only.","examples":[{"active":true,"client_id":"8f3a1c9d2b7e4f60a5c1d8e9b2f3a4c5","exp":1792569600,"iat":1792566000,"scope":"profile documents operations:expenses","sub":"usr_0d6f2a4e-5b7c-4e1d-9a83-2c4b6e8f1a20","token_type":"Bearer"}]},"JsonValue":{"description":"Any JSON value: an object, array, string, number, boolean or null.","example":{"net_days":30}},"MergeBody":{"properties":{"loser_operation_ids":{"items":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"An operation id: `op_` and an opaque string. Treat it as opaque.","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"]},"type":"array","minItems":1,"title":"Loser Operation Ids","description":"The ids of the operations to merge into the winner (the path operation). At least one; must not include the winner.","examples":[["op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44"]]}},"additionalProperties":false,"type":"object","required":["loser_operation_ids"],"title":"MergeBody","description":"Consolidate duplicate operations into one. The WINNER is the operation in\nthe request path; `loser_operation_ids` are the duplicates to fold into it.\nEvery loser must be the caller's own, the same operation type, and currently\nvisible. On merge each loser's evidence is re-parented onto the winner, the\nlosers become `merged` (hidden), and the winner is re-blended to carry the best\nversion of each field. Undone with `unmerge`; the winner lands review-ready,\nawaiting `confirm`."},"NextChaserAction":{"properties":{"kind":{"$ref":"#/components/schemas/ChaserNextActionKind","description":"What the chaser will do next."},"due_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Due At","description":"When the wait for that action ends; null when nothing is waiting on time."},"earliest_scan_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Earliest Scan At","description":"The soonest the chaser can act after `due_at`, since it acts on its next scan."}},"type":"object","required":["kind"],"title":"NextChaserAction","description":"What follow-up will do next for the operation. `due_at` is when the step becomes due (it is\ntaken at the first mail check after that time); `earliest_scan_at` is the soonest that check can\nhappen, since nothing is decided between checks.","examples":[{"due_at":"2026-10-18T13:10:02Z","earliest_scan_at":"2026-10-18T13:15:00Z","kind":"await_reply"}]},"OperationCatalogue":{"properties":{"operations":{"items":{"$ref":"#/components/schemas/OperationTypeInfo"},"type":"array","title":"Operations","description":"Every operation type, sorted by `operation_type`."}},"type":"object","required":["operations"],"title":"OperationCatalogue","description":"`GET /v1/operations` — every operation type this client can work with.","examples":[{"operations":[{"description":null,"operation_type":"expenses","optional_consent_scopes":["drafts:read","drafts:write","operations:expenses:write"],"path":"/v1/operations/expenses","required_consent_scopes":["operations:expenses:read"],"title":"Expense","verbs":[{"method":"POST","name":"search","path":"/v1/operations/expenses/search","summary":"Search expenses"},{"method":"GET","name":"get_one","path":"/v1/operations/expenses/{operation_id}","summary":"Get an expense"}],"version":98}]}]},"OperationChaserStatus":{"type":"string","enum":["idle","in_self_help","pending_approval","in_counterpart_outreach","sent_awaiting_reply","reply_received","rejected","escalated_to_owner","exhausted"],"title":"OperationChaserStatus","description":"`idle` has nothing to follow up now; `in_self_help` offers what the user's mail already holds; `pending_approval` has a prepared message waiting for a person; `in_counterpart_outreach` is asking the other party; `sent_awaiting_reply` waits for their answer; `reply_received` got one; `rejected` had its message turned down; `escalated_to_owner` was handed to the user; `exhausted` has nothing left to try.","example":"in_self_help"},"OperationChaserView":{"properties":{"operation_id":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"Operation Id","description":"The operation the chaser is working on.","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"]},"canonical_version":{"type":"integer","title":"Canonical Version","description":"The schema version the operation is held to."},"follow_up_channel":{"anyOf":[{"$ref":"#/components/schemas/ChaserFollowUpChannel"},{"type":"null"}],"description":"Whether and how the system follows up on this operation type; null when its configuration could not be read."},"chaser_status":{"anyOf":[{"$ref":"#/components/schemas/OperationChaserStatus"},{"type":"null"}],"description":"The chaser status; null when never chased."},"phase":{"anyOf":[{"$ref":"#/components/schemas/ChaserPhase"},{"type":"null"}],"description":"The current stage; null when never chased."},"phase_entered_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Phase Entered At","description":"When the current stage began."},"attempts_in_phase":{"type":"integer","title":"Attempts In Phase","description":"Messages prepared in the current stage.","default":0},"max_attempts_in_phase":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Attempts In Phase","description":"Messages allowed in the current stage; null outside counterpart outreach."},"last_attempt_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Last Attempt At","description":"When the last message was prepared."},"last_scanned_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Last Scanned At","description":"When the chaser last looked at the operation."},"gaps":{"items":{"$ref":"#/components/schemas/ChaserGapOut"},"type":"array","title":"Gaps","description":"What is still missing."},"unchased_gaps":{"items":{"$ref":"#/components/schemas/ChaserGapOut"},"type":"array","title":"Unchased Gaps","description":"Missing fields the chaser is set not to ask about."},"gaps_addressed":{"items":{"type":"string"},"type":"array","title":"Gaps Addressed","description":"Missing items the owner has already dealt with."},"next_action":{"$ref":"#/components/schemas/NextChaserAction","description":"What the chaser will do next, and when."},"would_have_approver_decision":{"anyOf":[{"$ref":"#/components/schemas/OutreachApprovalDecision"},{"type":"null"}],"description":"The recorded decision on the last prepared message, if any."},"last_rejection_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Rejection Reason","description":"The reason given when the last message was rejected."},"rejections":{"items":{"$ref":"#/components/schemas/ChaserRejectionOut"},"type":"array","title":"Rejections","description":"Every rejected message, oldest first."},"allowed_rejection_reasons":{"items":{"type":"string"},"type":"array","title":"Allowed Rejection Reasons","description":"The reasons that may be given when rejecting a message for this operation."},"thread_ref":{"anyOf":[{"$ref":"#/components/schemas/ChaserThreadOut"},{"type":"null"}],"description":"Record of the conversation the prepared message is addressed into (audit only); null until a message is prepared."},"last_progress":{"anyOf":[{"$ref":"#/components/schemas/ChaserProgressOut"},{"type":"null"}],"description":"The last time missing items arrived while waiting on the other party, if any."}},"additionalProperties":false,"type":"object","required":["operation_id","canonical_version","follow_up_channel","next_action"],"title":"OperationChaserView","description":"What the chaser is doing with one operation: its stage, what is still missing, and what it\nwill do next and when.","examples":[{"allowed_rejection_reasons":["wrong_counterparty","wording_needs_work","gap_handled_offline","do_not_contact","vendor_unresponsive_known"],"attempts_in_phase":1,"canonical_version":98,"chaser_status":"sent_awaiting_reply","follow_up_channel":"email","gaps":[{"canonical_path":"expense_date","failures":[],"observed_confidence":0.55,"reason":"below_threshold","required_min_confidence":0.8}],"gaps_addressed":[],"last_attempt_at":"2026-10-15T13:10:02Z","last_progress":null,"last_rejection_reason":"wording_needs_work","last_scanned_at":"2026-10-16T08:12:40Z","max_attempts_in_phase":3,"next_action":{"due_at":"2026-10-18T13:10:02Z","earliest_scan_at":"2026-10-18T13:15:00Z","kind":"await_reply"},"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","phase":"counterpart_outreach","phase_entered_at":"2026-10-15T09:00:00Z","rejections":[{"applied":"redraft_with_alternate_template","at":"2026-10-15T13:05:22Z","gap_path":null,"reason":"wording_needs_work","recipient_email":"billing@acme.com","template_id":"expense_chaser_v1_request_invoice"}],"thread_ref":{"email_id":"eml_16nJ9iKYhhC","thread_id":"18c2f1d07a6b9e42"},"unchased_gaps":[],"would_have_approver_decision":"approved"}]},"OperationDocFieldRef":{"properties":{"name":{"type":"string","title":"Name","description":"The field's name."},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value","description":"The extracted value."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"Confidence in the extracted value, 0-1."}},"type":"object","required":["name"],"title":"OperationDocFieldRef","description":"One field extracted from a document.","examples":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}]},"OperationSchemaDetail":{"properties":{"operation_type":{"type":"string","title":"Operation Type","description":"The operation type's identifier, as used in bodies, scopes and event types, such as `payroll_operations`."},"path":{"type":"string","title":"Path","description":"Where the type's routes live: the identifier with hyphens for underscores, such as `/v1/operations/payroll-operations`."},"title":{"type":"string","title":"Title","description":"The type's human name."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"What the type records; null when not set."},"version":{"type":"integer","title":"Version","description":"The current schema version of the type."},"required_consent_scopes":{"items":{"type":"string"},"type":"array","title":"Required Consent Scopes","description":"The consent scopes needed to search and read the type's records: its `:read` scopes."},"optional_consent_scopes":{"items":{"type":"string"},"type":"array","title":"Optional Consent Scopes","description":"The other consent scopes the type's routes check, needed only for those routes: its `:write` scopes (which include read) to change records, and the `drafts` scopes for the outreach awaiting approval. Read-only integrations do not need them."},"status_values":{"items":{"type":"string"},"type":"array","title":"Status Values","description":"The `status` values a search can filter on."},"record_schema":{"additionalProperties":{"$ref":"#/components/schemas/JsonValue"},"type":"object","title":"Record Schema","description":"The JSON Schema of an operation as a read returns it; each field carries its description."},"search_schema":{"additionalProperties":{"$ref":"#/components/schemas/JsonValue"},"type":"object","title":"Search Schema","description":"The JSON Schema of the search request: every filter, pagination and sort."},"verbs":{"items":{"$ref":"#/components/schemas/OperationVerb"},"type":"array","title":"Verbs","description":"The routes available on the type."}},"type":"object","required":["operation_type","path","title","version","required_consent_scopes","status_values","record_schema","search_schema","verbs"],"title":"OperationSchemaDetail","description":"`GET /v1/operations/{type}/schema` — one type's full machine-readable shape.\n\n`record_schema` is the JSON Schema of an operation as a read returns it (each\nfield carries its curated description); `search_schema` is the search request's\nJSON Schema (documents every filter, the `status` values, pagination and sort).","examples":[{"description":null,"operation_type":"expenses","optional_consent_scopes":["drafts:read","drafts:write","operations:expenses:write"],"path":"/v1/operations/expenses","record_schema":{"$defs":{"ExpensesTotalAmountScored":{"properties":{"value":{"anyOf":[{"format":"decimal","type":"string"},{"type":"null"}]},"bind_inference_confidence":{"anyOf":[{"maximum":1,"minimum":0,"type":"number"},{"type":"null"}]}},"type":"object"}},"properties":{"total_amount":{"anyOf":[{"$ref":"#/$defs/ExpensesTotalAmountScored"},{"type":"null"}],"description":"The document grand total."}},"title":"ExpensesRow","type":"object"},"required_consent_scopes":["operations:expenses:read"],"search_schema":{"properties":{"page_number":{"default":1,"minimum":1,"type":"integer"}},"title":"ExpensesSearchRequest","type":"object"},"status_values":["active","pending_approval","approved","corrected","rejected"],"title":"Expense","verbs":[{"method":"POST","name":"search","path":"/v1/operations/expenses/search","summary":"Search expenses"},{"method":"GET","name":"get_one","path":"/v1/operations/expenses/{operation_id}","summary":"Get an expense"}],"version":98}]},"OperationStatus":{"type":"string","enum":["active","pending_approval","approved","corrected","rejected","merged","deleted"],"title":"OperationStatus","description":"`active` was found in the user's mail and is open; `pending_approval` waits for a person; `approved` was confirmed; `corrected` was confirmed with a person's changes; `rejected` was turned down; `merged` was folded into another operation, which an unmerge restores; `deleted` was deleted.","example":"active"},"OperationTypeInfo":{"properties":{"operation_type":{"type":"string","title":"Operation Type","description":"The operation type's identifier, as used in bodies, scopes and event types, such as `payroll_operations`."},"path":{"type":"string","title":"Path","description":"Where the type's routes live: the identifier with hyphens for underscores, such as `/v1/operations/payroll-operations`."},"title":{"type":"string","title":"Title","description":"The type's human name."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"What the type records; null when not set."},"version":{"type":"integer","title":"Version","description":"The current schema version of the type."},"required_consent_scopes":{"items":{"type":"string"},"type":"array","title":"Required Consent Scopes","description":"The consent scopes needed to search and read the type's records: its `:read` scopes."},"optional_consent_scopes":{"items":{"type":"string"},"type":"array","title":"Optional Consent Scopes","description":"The other consent scopes the type's routes check, needed only for those routes: its `:write` scopes (which include read) to change records, and the `drafts` scopes for the outreach awaiting approval. Read-only integrations do not need them."},"verbs":{"items":{"$ref":"#/components/schemas/OperationVerb"},"type":"array","title":"Verbs","description":"The routes available on the type."}},"type":"object","required":["operation_type","path","title","version","required_consent_scopes","verbs"],"title":"OperationTypeInfo","description":"One operation type in the catalogue index.","examples":[{"description":null,"operation_type":"expenses","optional_consent_scopes":["drafts:read","drafts:write","operations:expenses:write"],"path":"/v1/operations/expenses","required_consent_scopes":["operations:expenses:read"],"title":"Expense","verbs":[{"method":"POST","name":"search","path":"/v1/operations/expenses/search","summary":"Search expenses"},{"method":"GET","name":"get_one","path":"/v1/operations/expenses/{operation_id}","summary":"Get an expense"}],"version":98}]},"OperationVerb":{"properties":{"name":{"type":"string","title":"Name","description":"The verb's stable name."},"method":{"type":"string","title":"Method","description":"The HTTP method."},"path":{"type":"string","title":"Path","description":"The route path, with `{operation_id}` where an operation's id goes."},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary","description":"What the verb does, in a few words."}},"type":"object","required":["name","method","path"],"title":"OperationVerb","description":"One callable verb on an operation type.","examples":[{"method":"POST","name":"search","path":"/v1/operations/expenses/search","summary":"Search expenses"}]},"OutreachApprovalDecision":{"type":"string","enum":["approved","rejected"],"title":"OutreachApprovalDecision","description":"The approver's verdict on a message awaiting approval. Approving records the decision; it\nsends nothing.","example":"approved"},"OutreachApprovalDraftItem":{"properties":{"operation_id":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"Operation Id","description":"The operation the message is about.","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"]},"chaser_status":{"$ref":"#/components/schemas/OperationChaserStatus","description":"Always `pending_approval`: a prepared message is waiting for a person."},"counterpart_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Counterpart Name","description":"Who the draft is addressed to, if known."},"counterpart_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Counterpart Email","description":"The counterpart's email, if it was resolved."},"missing_item":{"type":"string","title":"Missing Item","description":"What the draft is asking the counterpart for."},"subject":{"type":"string","title":"Subject","description":"The rendered draft subject."},"body":{"type":"string","title":"Body","description":"The rendered draft body."}},"additionalProperties":false,"type":"object","required":["operation_id","chaser_status","missing_item","subject","body"],"title":"OutreachApprovalDraftItem","description":"One operation in the queue of outreach awaiting your approval: the message the system would send\nto a counterpart, rendered for a person to approve or reject. Nothing is sent from here; approving\nonly records the decision.","examples":[{"body":"Hi Dana, could you confirm the date on invoice INV-2207? Thanks, Maya","chaser_status":"pending_approval","counterpart_email":"dana@acme.com","counterpart_name":"Dana Ruiz","missing_item":"the invoice date","operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","subject":"Invoice INV-2207: date missing"}]},"OutreachApprovalRejectBody":{"properties":{"reason":{"anyOf":[{"type":"string","maxLength":64,"pattern":"^[a-z][a-z0-9_]*$"},{"type":"null"}],"title":"Reason","description":"Why the message is rejected; one of the operation's `allowed_rejection_reasons`."},"gap_path":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"title":"Gap Path","description":"For a reason that skips one missing item: the item (a field, never a document) to stop asking about."}},"additionalProperties":false,"type":"object","title":"OutreachApprovalRejectBody","description":"Optional reason for rejecting a prepared message. Send no body to simply reject it.","examples":[{"reason":"wording_needs_work"}]},"OwnerEscalationGap":{"properties":{"canonical_path":{"type":"string","title":"Canonical Path","description":"The missing field, or `document:<TYPES>` for a missing document."},"reason":{"$ref":"#/components/schemas/GapReason","description":"Why the field is a gap (absent, below_threshold, missing document)."}},"additionalProperties":false,"type":"object","required":["canonical_path","reason"],"title":"OwnerEscalationGap","description":"One still-unsatisfied field on an escalated operation.","examples":[{"canonical_path":"expense_date","reason":"below_threshold"}]},"OwnerEscalationQueueItem":{"properties":{"operation_id":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"Operation Id","description":"The escalated operation.","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"]},"chaser_status":{"$ref":"#/components/schemas/OperationChaserStatus","description":"The chaser phase status — escalated_to_owner."},"gaps":{"items":{"$ref":"#/components/schemas/OwnerEscalationGap"},"type":"array","title":"Gaps","description":"The fields still missing."},"pending_draft":{"anyOf":[{"$ref":"#/components/schemas/PendingDraft"},{"type":"null"}],"description":"The message that was waiting for approval when time ran out, if any; nothing was sent."}},"additionalProperties":false,"type":"object","required":["operation_id","chaser_status","gaps"],"title":"OwnerEscalationQueueItem","description":"One operation that has been escalated to the owner: its still-open gaps, for a human to\nresolve (fill the fields → it leaves the queue) or dismiss (stop chasing it).","examples":[{"chaser_status":"escalated_to_owner","gaps":[{"canonical_path":"expense_date","reason":"below_threshold"}],"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13","pending_draft":{"body":"Hi Dana, could you confirm the date on invoice INV-2207? Thanks, Maya","counterpart_email":"dana@acme.com","counterpart_name":"Dana Ruiz","missing_item":"the invoice date","subject":"Invoice INV-2207: date missing"}}]},"PageRequest":{"properties":{"page_number":{"type":"integer","minimum":1.0,"title":"Page Number","description":"Page number to retrieve.","default":1},"page_size":{"type":"integer","maximum":250.0,"minimum":1.0,"title":"Page Size","description":"Number of items per page.","default":50},"page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Token","description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."}},"additionalProperties":false,"type":"object","title":"PageRequest","description":"Which page of a list to return.","examples":[{"page_number":2,"page_size":50}]},"PaginatedDrafts":{"properties":{"total_items":{"type":"integer","title":"Total Items","description":"Total number of items across all pages.","examples":[137]},"total_pages":{"type":"integer","title":"Total Pages","description":"Total number of pages available.","examples":[3]},"page_number":{"type":"integer","title":"Page Number","description":"The current page number.","examples":[1]},"page_size":{"type":"integer","title":"Page Size","description":"The number of items per page.","examples":[50]},"items":{"items":{"$ref":"#/components/schemas/Draft"},"type":"array","title":"Items","description":"The list of items for the current page."},"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Page Token","description":"Pass as `page_token` to get the next page; null on the last page.","examples":["eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"]}},"type":"object","required":["total_items","total_pages","page_number","page_size","items"],"title":"PaginatedDrafts","description":"Returned by `list_drafts`."},"PayrollOperationsAmountPrimaryScored":{"properties":{"value":{"anyOf":[{"type":"string","format":"decimal","examples":["1234.56"]},{"type":"null"}],"title":"Value","description":"The primary monetary amount (bonus, contractor payment, pay change, and similar). Null when non-monetary."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PayrollOperationsAmountPrimaryScored","description":"The primary monetary amount (bonus, contractor payment, pay change, and similar). Null when non-monetary."},"PayrollOperationsApprovalState":{"type":"string","enum":["proposed","confirmed","submitted","approved","rejected","voided","applied"],"title":"PayrollOperationsApprovalState","example":"proposed","description":"Where this payroll instruction stands on its way to final approval. bind.co prepares payroll operations as drafts that the payroll side usually has to approve; this field tracks that approval, while status tracks the record in bind.co. proposed: found by bind.co, waiting for a person to confirm. confirmed: a person agrees it is real. submitted: sent to the payroll provider. approved: the payroll provider accepted it. rejected: stopped before it was applied. voided: withdrawn after it was submitted, before it was applied. applied: included in a posted pay run. Null when not known."},"PayrollOperationsApprovalStateScored":{"properties":{"value":{"anyOf":[{"$ref":"#/components/schemas/PayrollOperationsApprovalState"},{"type":"null"}],"description":"Where this payroll instruction stands on its way to final approval. bind.co prepares payroll operations as drafts that the payroll side usually has to approve; this field tracks that approval, while status tracks the record in bind.co. proposed: found by bind.co, waiting for a person to confirm. confirmed: a person agrees it is real. submitted: sent to the payroll provider. approved: the payroll provider accepted it. rejected: stopped before it was applied. voided: withdrawn after it was submitted, before it was applied. applied: included in a posted pay run. Null when not known."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PayrollOperationsApprovalStateScored","description":"Where this payroll instruction stands on its way to final approval. bind.co prepares payroll operations as drafts that the payroll side usually has to approve; this field tracks that approval, while status tracks the record in bind.co. proposed: found by bind.co, waiting for a person to confirm. confirmed: a person agrees it is real. submitted: sent to the payroll provider. approved: the payroll provider accepted it. rejected: stopped before it was applied. voided: withdrawn after it was submitted, before it was applied. applied: included in a posted pay run. Null when not known."},"PayrollOperationsCompletenessStateScored":{"properties":{"value":{"anyOf":[{"$ref":"#/components/schemas/CompletenessState"},{"type":"null"}],"description":"Whether every field the operation type requires is filled in."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PayrollOperationsCompletenessStateScored","description":"Whether every field the operation type requires is filled in."},"PayrollOperationsCounterpartContactRoleIdScored":{"properties":{"value":{"anyOf":[{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","examples":["rol_1S9dCsGYrSI"]},{"type":"null"}],"title":"Value","description":"The contact role of the other party to the operation, from the user's contacts; null when not identified."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PayrollOperationsCounterpartContactRoleIdScored","description":"The contact role of the other party to the operation, from the user's contacts; null when not identified."},"PayrollOperationsCreateBody":{"properties":{"fields":{"anyOf":[{"items":{"$ref":"#/components/schemas/PayrollOperationsCreateBodyFieldsItem"},"type":"array"},{"type":"null"}],"title":"Fields","description":"Operation-specific details as name/value pairs (e.g. a wage change carries old and new salary; a vacation carries start/end and day count)."},"currency_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency Code","description":"The ISO 4217 currency code of the amount. Null when there is no amount, or when the source names no currency."},"amount_primary":{"anyOf":[{"type":"string","format":"decimal","examples":["1234.56"]},{"type":"null"}],"title":"Amount Primary","description":"The primary monetary amount (bonus, contractor payment, pay change, and similar). Null when non-monetary."},"approval_state":{"anyOf":[{"type":"string","enum":["proposed","confirmed","submitted","approved","rejected","voided","applied"]},{"type":"null"}],"title":"Approval State","description":"Where this payroll instruction stands on its way to final approval. bind.co prepares payroll operations as drafts that the payroll side usually has to approve; this field tracks that approval, while status tracks the record in bind.co. proposed: found by bind.co, waiting for a person to confirm. confirmed: a person agrees it is real. submitted: sent to the payroll provider. approved: the payroll provider accepted it. rejected: stopped before it was applied. voided: withdrawn after it was submitted, before it was applied. applied: included in a posted pay run. Null when not known."},"effective_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effective Date","description":"The date the operation takes effect on payroll (a pay run's period-end; a termination's last working day)."},"operation_verb":{"type":"string","enum":["add","delete","change"],"title":"Operation Verb","description":"The action: add (a new hire, contractor, bonus or other new record), change (a raise, an update, or any correction or adjustment to an existing value), or delete (a termination or void)."},"operation_target":{"type":"string","enum":["employee","termination","wage","bonus","reimbursement","contractor","contractor_pay","allowance","deduction","benefit","vacation","sick_leave","parental_leave","leave_of_absence","hours","tax","banking","payroll_run","furlough","equity"],"title":"Operation Target","description":"What the operation acts on, the single most specific kind. employee: a hire or a change to an employee's profile. termination: a separation, layoff, resignation or dismissal. wage: a confirmed salary or hourly-rate change. bonus: one-time extra pay or commission. reimbursement: an out-of-pocket expense paid back through payroll. contractor: a new contractor relationship. contractor_pay: a payment to an existing contractor for work done. allowance: a recurring allowance or stipend, such as travel or phone. deduction: a recurring deduction from pay, such as a garnishment or retirement contribution. benefit: enrolment in, or a change to, health, dental, life insurance or a retirement plan. vacation: vacation days taken or recorded. sick_leave: sick days taken or recorded. parental_leave: maternity, paternity or parental leave. leave_of_absence: other leave, such as jury duty, bereavement or military leave. hours: time worked, or a correction to hours or overtime. tax: tax withholding setup or tax form processing. banking: a direct-deposit setup or change. payroll_run: running a pay cycle. furlough: temporary unpaid leave or reduced hours. equity: a confirmed equity grant, vesting or option exercise."},"payroll_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payroll Provider","description":"The payroll platform that runs payroll for the company (e.g. Gusto, ADP)."},"reasoning_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reasoning Summary","description":"A short note on why this is a payroll change; free text on create."},"operation_request_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operation Request Date","description":"The date the operation was requested, when that is earlier than effective_date."},"on_behalf_of_contact_role_id":{"anyOf":[{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","examples":["rol_1S9dCsGYrSI"]},{"type":"null"}],"title":"On Behalf Of Contact Role Id","description":"The id of the client contact role this operation is recorded on behalf of, when your account operates on behalf of others. Validated against your own contact roles. Leave unset for an operation that is directly your own."},"employee_normalised":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Employee Normalised","description":"The employee's full name, as First Last (e.g. Joe Black)."},"employee_external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Employee External Id","description":"The employee's identifier in the HR or payroll system (employee number, badge or payroll id); null when not stated."},"department":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Department","description":"The employee's department (e.g. Engineering); null when not stated."}},"additionalProperties":false,"type":"object","required":["operation_verb","operation_target"],"title":"PayrollOperationsCreateBody","examples":[{"approval_state":"proposed","department":"Engineering","effective_date":"2026-11-01","employee_external_id":"E-1042","employee_normalised":"Joe Black","fields":[{"name":"hours_per_week","old_unit":"hours","old_value":"40","unit":"hours","value":"32"}],"operation_request_date":"2026-10-20","operation_target":"hours","operation_verb":"change","payroll_provider":"Gusto"}],"description":"The request body of `payroll_operations_create`."},"PayrollOperationsCreateBodyFieldsItem":{"properties":{"name":{"type":"string","title":"Name","description":"The detail's name in snake_case (e.g. vacation_days_allocated, hours_per_week, bonus_type)."},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit","description":"The value's unit, when it has one: days, hours, or an ISO 4217 currency code such as CAD."},"value":{"type":"string","title":"Value","description":"The detail's value, as a string (e.g. 32, 2026-04-30, resignation)."},"old_unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Old Unit","description":"The unit of old_value; null when there is no old_value or it has no unit."},"old_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Old Value","description":"The value before the change, when operation_verb is CHANGE (e.g. 40 when hours go from 40 to 32); null otherwise."}},"type":"object","required":["name","value"],"title":"PayrollOperationsCreateBodyFieldsItem","examples":[{"name":"hours_per_week","old_unit":"hours","old_value":"40","unit":"hours","value":"32"}],"description":"Operation-specific details as name/value pairs (e.g. a wage change carries old and new salary; a vacation carries start/end and day count)."},"PayrollOperationsCurrencyCodeScored":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value","description":"The ISO 4217 currency code of the amount. Null when there is no amount, or when the source names no currency."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PayrollOperationsCurrencyCodeScored","description":"The ISO 4217 currency code of the amount. Null when there is no amount, or when the source names no currency."},"PayrollOperationsDepartmentScored":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value","description":"The employee's department (e.g. Engineering); null when not stated."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PayrollOperationsDepartmentScored","description":"The employee's department (e.g. Engineering); null when not stated."},"PayrollOperationsEditBody":{"properties":{"fields":{"anyOf":[{"items":{"$ref":"#/components/schemas/PayrollOperationsEditBodyFieldsItem"},"type":"array"},{"type":"null"}],"title":"Fields","description":"Operation-specific details as name/value pairs (e.g. a wage change carries old and new salary; a vacation carries start/end and day count)."},"currency_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency Code","description":"The ISO 4217 currency code of the amount. Null when there is no amount, or when the source names no currency."},"amount_primary":{"anyOf":[{"type":"string","format":"decimal","examples":["1234.56"]},{"type":"null"}],"title":"Amount Primary","description":"The primary monetary amount (bonus, contractor payment, pay change, and similar). Null when non-monetary."},"approval_state":{"anyOf":[{"type":"string","enum":["proposed","confirmed","submitted","approved","rejected","voided","applied"]},{"type":"null"}],"title":"Approval State","description":"Where this payroll instruction stands on its way to final approval. bind.co prepares payroll operations as drafts that the payroll side usually has to approve; this field tracks that approval, while status tracks the record in bind.co. proposed: found by bind.co, waiting for a person to confirm. confirmed: a person agrees it is real. submitted: sent to the payroll provider. approved: the payroll provider accepted it. rejected: stopped before it was applied. voided: withdrawn after it was submitted, before it was applied. applied: included in a posted pay run. Null when not known."},"effective_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effective Date","description":"The date the operation takes effect on payroll (a pay run's period-end; a termination's last working day)."},"operation_verb":{"anyOf":[{"type":"string","enum":["add","delete","change"]},{"type":"null"}],"title":"Operation Verb","description":"The action: add (a new hire, contractor, bonus or other new record), change (a raise, an update, or any correction or adjustment to an existing value), or delete (a termination or void)."},"operation_target":{"anyOf":[{"type":"string","enum":["employee","termination","wage","bonus","reimbursement","contractor","contractor_pay","allowance","deduction","benefit","vacation","sick_leave","parental_leave","leave_of_absence","hours","tax","banking","payroll_run","furlough","equity"]},{"type":"null"}],"title":"Operation Target","description":"What the operation acts on, the single most specific kind. employee: a hire or a change to an employee's profile. termination: a separation, layoff, resignation or dismissal. wage: a confirmed salary or hourly-rate change. bonus: one-time extra pay or commission. reimbursement: an out-of-pocket expense paid back through payroll. contractor: a new contractor relationship. contractor_pay: a payment to an existing contractor for work done. allowance: a recurring allowance or stipend, such as travel or phone. deduction: a recurring deduction from pay, such as a garnishment or retirement contribution. benefit: enrolment in, or a change to, health, dental, life insurance or a retirement plan. vacation: vacation days taken or recorded. sick_leave: sick days taken or recorded. parental_leave: maternity, paternity or parental leave. leave_of_absence: other leave, such as jury duty, bereavement or military leave. hours: time worked, or a correction to hours or overtime. tax: tax withholding setup or tax form processing. banking: a direct-deposit setup or change. payroll_run: running a pay cycle. furlough: temporary unpaid leave or reduced hours. equity: a confirmed equity grant, vesting or option exercise."},"payroll_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payroll Provider","description":"The payroll platform that runs payroll for the company (e.g. Gusto, ADP)."},"reasoning_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reasoning Summary","description":"A short note on why this is a payroll change; free text on create."},"operation_request_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operation Request Date","description":"The date the operation was requested, when that is earlier than effective_date."},"on_behalf_of_contact_role_id":{"anyOf":[{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","examples":["rol_1S9dCsGYrSI"]},{"type":"null"}],"title":"On Behalf Of Contact Role Id","description":"The id of the client contact role this operation is recorded on behalf of, when your account operates on behalf of others. Validated against your own contact roles. Leave unset for an operation that is directly your own."},"employee_normalised":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Employee Normalised","description":"The employee's full name, as First Last (e.g. Joe Black)."},"employee_external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Employee External Id","description":"The employee's identifier in the HR or payroll system (employee number, badge or payroll id); null when not stated."},"department":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Department","description":"The employee's department (e.g. Engineering); null when not stated."}},"additionalProperties":false,"type":"object","title":"PayrollOperationsEditBody","examples":[{"approval_state":"proposed","department":"Engineering","effective_date":"2026-11-01","employee_external_id":"E-1042","employee_normalised":"Joe Black","fields":[{"name":"hours_per_week","old_unit":"hours","old_value":"40","unit":"hours","value":"32"}],"operation_request_date":"2026-10-20","operation_target":"hours","operation_verb":"change","payroll_provider":"Gusto"}],"description":"The request body of `payroll_operations_edit`."},"PayrollOperationsEditBodyFieldsItem":{"properties":{"name":{"type":"string","title":"Name","description":"The detail's name in snake_case (e.g. vacation_days_allocated, hours_per_week, bonus_type)."},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit","description":"The value's unit, when it has one: days, hours, or an ISO 4217 currency code such as CAD."},"value":{"type":"string","title":"Value","description":"The detail's value, as a string (e.g. 32, 2026-04-30, resignation)."},"old_unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Old Unit","description":"The unit of old_value; null when there is no old_value or it has no unit."},"old_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Old Value","description":"The value before the change, when operation_verb is CHANGE (e.g. 40 when hours go from 40 to 32); null otherwise."}},"type":"object","required":["name","value"],"title":"PayrollOperationsEditBodyFieldsItem","examples":[{"name":"hours_per_week","old_unit":"hours","old_value":"40","unit":"hours","value":"32"}],"description":"Operation-specific details as name/value pairs (e.g. a wage change carries old and new salary; a vacation carries start/end and day count)."},"PayrollOperationsEffectiveDateScored":{"properties":{"value":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Value","description":"The date the operation takes effect on payroll (a pay run's period-end; a termination's last working day)."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PayrollOperationsEffectiveDateScored","description":"The date the operation takes effect on payroll (a pay run's period-end; a termination's last working day)."},"PayrollOperationsEmployeeExternalIdScored":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value","description":"The employee's identifier in the HR or payroll system (employee number, badge or payroll id); null when not stated."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PayrollOperationsEmployeeExternalIdScored","description":"The employee's identifier in the HR or payroll system (employee number, badge or payroll id); null when not stated."},"PayrollOperationsEmployeeNormalisedScored":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value","description":"The employee's full name, as First Last (e.g. Joe Black)."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PayrollOperationsEmployeeNormalisedScored","description":"The employee's full name, as First Last (e.g. Joe Black)."},"PayrollOperationsFieldsItem":{"properties":{"name":{"type":"string","title":"Name","description":"The detail's name in snake_case (e.g. vacation_days_allocated, hours_per_week, bonus_type)."},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit","description":"The value's unit, when it has one: days, hours, or an ISO 4217 currency code such as CAD."},"value":{"type":"string","title":"Value","description":"The detail's value, as a string (e.g. 32, 2026-04-30, resignation)."},"old_unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Old Unit","description":"The unit of old_value; null when there is no old_value or it has no unit."},"old_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Old Value","description":"The value before the change, when operation_verb is CHANGE (e.g. 40 when hours go from 40 to 32); null otherwise."}},"type":"object","required":["name","value"],"title":"PayrollOperationsFieldsItem","examples":[{"name":"hours_per_week","old_unit":"hours","old_value":"40","unit":"hours","value":"32"}],"description":"Operation-specific details as name/value pairs (e.g. a wage change carries old and new salary; a vacation carries start/end and day count). When known, the list also carries these details by name (`base_salary`: the employee's base salary as a plain number such as 85000, with its ISO 4217 currency code in `unit` when known; `base_salary_currency`: the ISO 4217 code of the base salary's currency, such as CAD; `hire_start_date`: a new hire's first day of work, as YYYY-MM-DD; `vacation_period_start`: the first day of a vacation or leave, as YYYY-MM-DD; `vacation_period_end`: the last day of a vacation or leave, as YYYY-MM-DD)."},"PayrollOperationsIsOnBehalfOfScored":{"properties":{"value":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Value","description":"True when the operation is recorded on behalf of one of the user's clients rather than for the user directly."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PayrollOperationsIsOnBehalfOfScored","description":"True when the operation is recorded on behalf of one of the user's clients rather than for the user directly."},"PayrollOperationsOnBehalfOfContactRoleIdScored":{"properties":{"value":{"anyOf":[{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","examples":["rol_1S9dCsGYrSI"]},{"type":"null"}],"title":"Value","description":"The id of the client contact role this operation is recorded on behalf of, when your account operates on behalf of others. Validated against your own contact roles. Leave unset for an operation that is directly your own."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PayrollOperationsOnBehalfOfContactRoleIdScored","description":"The id of the client contact role this operation is recorded on behalf of, when your account operates on behalf of others. Validated against your own contact roles. Leave unset for an operation that is directly your own."},"PayrollOperationsOperationRequestDateScored":{"properties":{"value":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Value","description":"The date the operation was requested, when that is earlier than effective_date."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PayrollOperationsOperationRequestDateScored","description":"The date the operation was requested, when that is earlier than effective_date."},"PayrollOperationsOperationTarget":{"type":"string","enum":["employee","termination","wage","bonus","reimbursement","contractor","contractor_pay","allowance","deduction","benefit","vacation","sick_leave","parental_leave","leave_of_absence","hours","tax","banking","payroll_run","furlough","equity"],"title":"PayrollOperationsOperationTarget","example":"employee","description":"What the operation acts on, the single most specific kind. employee: a hire or a change to an employee's profile. termination: a separation, layoff, resignation or dismissal. wage: a confirmed salary or hourly-rate change. bonus: one-time extra pay or commission. reimbursement: an out-of-pocket expense paid back through payroll. contractor: a new contractor relationship. contractor_pay: a payment to an existing contractor for work done. allowance: a recurring allowance or stipend, such as travel or phone. deduction: a recurring deduction from pay, such as a garnishment or retirement contribution. benefit: enrolment in, or a change to, health, dental, life insurance or a retirement plan. vacation: vacation days taken or recorded. sick_leave: sick days taken or recorded. parental_leave: maternity, paternity or parental leave. leave_of_absence: other leave, such as jury duty, bereavement or military leave. hours: time worked, or a correction to hours or overtime. tax: tax withholding setup or tax form processing. banking: a direct-deposit setup or change. payroll_run: running a pay cycle. furlough: temporary unpaid leave or reduced hours. equity: a confirmed equity grant, vesting or option exercise."},"PayrollOperationsOperationTargetScored":{"properties":{"value":{"anyOf":[{"$ref":"#/components/schemas/PayrollOperationsOperationTarget"},{"type":"null"}],"description":"What the operation acts on, the single most specific kind. employee: a hire or a change to an employee's profile. termination: a separation, layoff, resignation or dismissal. wage: a confirmed salary or hourly-rate change. bonus: one-time extra pay or commission. reimbursement: an out-of-pocket expense paid back through payroll. contractor: a new contractor relationship. contractor_pay: a payment to an existing contractor for work done. allowance: a recurring allowance or stipend, such as travel or phone. deduction: a recurring deduction from pay, such as a garnishment or retirement contribution. benefit: enrolment in, or a change to, health, dental, life insurance or a retirement plan. vacation: vacation days taken or recorded. sick_leave: sick days taken or recorded. parental_leave: maternity, paternity or parental leave. leave_of_absence: other leave, such as jury duty, bereavement or military leave. hours: time worked, or a correction to hours or overtime. tax: tax withholding setup or tax form processing. banking: a direct-deposit setup or change. payroll_run: running a pay cycle. furlough: temporary unpaid leave or reduced hours. equity: a confirmed equity grant, vesting or option exercise."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PayrollOperationsOperationTargetScored","description":"What the operation acts on, the single most specific kind. employee: a hire or a change to an employee's profile. termination: a separation, layoff, resignation or dismissal. wage: a confirmed salary or hourly-rate change. bonus: one-time extra pay or commission. reimbursement: an out-of-pocket expense paid back through payroll. contractor: a new contractor relationship. contractor_pay: a payment to an existing contractor for work done. allowance: a recurring allowance or stipend, such as travel or phone. deduction: a recurring deduction from pay, such as a garnishment or retirement contribution. benefit: enrolment in, or a change to, health, dental, life insurance or a retirement plan. vacation: vacation days taken or recorded. sick_leave: sick days taken or recorded. parental_leave: maternity, paternity or parental leave. leave_of_absence: other leave, such as jury duty, bereavement or military leave. hours: time worked, or a correction to hours or overtime. tax: tax withholding setup or tax form processing. banking: a direct-deposit setup or change. payroll_run: running a pay cycle. furlough: temporary unpaid leave or reduced hours. equity: a confirmed equity grant, vesting or option exercise."},"PayrollOperationsOperationVerbScored":{"properties":{"value":{"anyOf":[{"type":"string","enum":["add","delete","change"]},{"type":"null"}],"title":"Value","description":"The action: add (a new hire, contractor, bonus or other new record), change (a raise, an update, or any correction or adjustment to an existing value), or delete (a termination or void)."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PayrollOperationsOperationVerbScored","description":"The action: add (a new hire, contractor, bonus or other new record), change (a raise, an update, or any correction or adjustment to an existing value), or delete (a termination or void)."},"PayrollOperationsPayrollProviderScored":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value","description":"The payroll platform that runs payroll for the company (e.g. Gusto, ADP)."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PayrollOperationsPayrollProviderScored","description":"The payroll platform that runs payroll for the company (e.g. Gusto, ADP)."},"PayrollOperationsReasoningSummaryScored":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value","description":"A short note on why this is a payroll change; free text on create."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PayrollOperationsReasoningSummaryScored","description":"A short note on why this is a payroll change; free text on create."},"PayrollOperationsRow":{"properties":{"operation_id":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"Operation Id","description":"Unique identifier of the operation.","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"]},"operation_type":{"type":"string","title":"Operation Type","description":"The operation type (e.g. expenses, payroll_operations).","examples":["payroll_operations"]},"status":{"$ref":"#/components/schemas/OperationStatus","description":"The operation's lifecycle status (e.g. active, pending_approval, approved, rejected)."},"confirmed_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Confirmed At","description":"When the operation's current values were last committed."},"last_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Action","description":"The most recent status change applied to the operation."},"last_actor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Actor","description":"Who last acted on the operation."},"chaser_status":{"anyOf":[{"$ref":"#/components/schemas/OperationChaserStatus"},{"type":"null"}],"description":"Where the chaser is with this operation; null if it has never been chased."},"chaser_status_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Chaser Status At","description":"When the chaser status last changed; null if never chased."},"chaser_status_at_source":{"anyOf":[{"$ref":"#/components/schemas/ChaserStatusAtSource"},{"type":"null"}],"description":"`status` when `chaser_status_at` is the recorded change time; `phase_entry` when only the start of the current stage is known (older records)."},"employee_normalised":{"anyOf":[{"$ref":"#/components/schemas/PayrollOperationsEmployeeNormalisedScored"},{"type":"null"}],"description":"The employee's full name, as First Last (e.g. Joe Black)."},"employee_external_id":{"anyOf":[{"$ref":"#/components/schemas/PayrollOperationsEmployeeExternalIdScored"},{"type":"null"}],"description":"The employee's identifier in the HR or payroll system (employee number, badge or payroll id); null when not stated."},"department":{"anyOf":[{"$ref":"#/components/schemas/PayrollOperationsDepartmentScored"},{"type":"null"}],"description":"The employee's department (e.g. Engineering); null when not stated."},"payroll_provider":{"anyOf":[{"$ref":"#/components/schemas/PayrollOperationsPayrollProviderScored"},{"type":"null"}],"description":"The payroll platform that runs payroll for the company (e.g. Gusto, ADP)."},"operation_verb":{"anyOf":[{"$ref":"#/components/schemas/PayrollOperationsOperationVerbScored"},{"type":"null"}],"description":"The action: add (a new hire, contractor, bonus or other new record), change (a raise, an update, or any correction or adjustment to an existing value), or delete (a termination or void)."},"operation_target":{"anyOf":[{"$ref":"#/components/schemas/PayrollOperationsOperationTargetScored"},{"type":"null"}],"description":"What the operation acts on, the single most specific kind. employee: a hire or a change to an employee's profile. termination: a separation, layoff, resignation or dismissal. wage: a confirmed salary or hourly-rate change. bonus: one-time extra pay or commission. reimbursement: an out-of-pocket expense paid back through payroll. contractor: a new contractor relationship. contractor_pay: a payment to an existing contractor for work done. allowance: a recurring allowance or stipend, such as travel or phone. deduction: a recurring deduction from pay, such as a garnishment or retirement contribution. benefit: enrolment in, or a change to, health, dental, life insurance or a retirement plan. vacation: vacation days taken or recorded. sick_leave: sick days taken or recorded. parental_leave: maternity, paternity or parental leave. leave_of_absence: other leave, such as jury duty, bereavement or military leave. hours: time worked, or a correction to hours or overtime. tax: tax withholding setup or tax form processing. banking: a direct-deposit setup or change. payroll_run: running a pay cycle. furlough: temporary unpaid leave or reduced hours. equity: a confirmed equity grant, vesting or option exercise."},"operation_request_date":{"anyOf":[{"$ref":"#/components/schemas/PayrollOperationsOperationRequestDateScored"},{"type":"null"}],"description":"The date the operation was requested, when that is earlier than effective_date."},"effective_date":{"anyOf":[{"$ref":"#/components/schemas/PayrollOperationsEffectiveDateScored"},{"type":"null"}],"description":"The date the operation takes effect on payroll (a pay run's period-end; a termination's last working day)."},"amount_primary":{"anyOf":[{"$ref":"#/components/schemas/PayrollOperationsAmountPrimaryScored"},{"type":"null"}],"description":"The primary monetary amount (bonus, contractor payment, pay change, and similar). Null when non-monetary."},"currency_code":{"anyOf":[{"$ref":"#/components/schemas/PayrollOperationsCurrencyCodeScored"},{"type":"null"}],"description":"The ISO 4217 currency code of the amount. Null when there is no amount, or when the source names no currency."},"reasoning_summary":{"anyOf":[{"$ref":"#/components/schemas/PayrollOperationsReasoningSummaryScored"},{"type":"null"}],"description":"A short note on why this is a payroll change; free text on create."},"approval_state":{"anyOf":[{"$ref":"#/components/schemas/PayrollOperationsApprovalStateScored"},{"type":"null"}],"description":"Where this payroll instruction stands on its way to final approval. bind.co prepares payroll operations as drafts that the payroll side usually has to approve; this field tracks that approval, while status tracks the record in bind.co. proposed: found by bind.co, waiting for a person to confirm. confirmed: a person agrees it is real. submitted: sent to the payroll provider. approved: the payroll provider accepted it. rejected: stopped before it was applied. voided: withdrawn after it was submitted, before it was applied. applied: included in a posted pay run. Null when not known."},"completeness_state":{"anyOf":[{"$ref":"#/components/schemas/PayrollOperationsCompletenessStateScored"},{"type":"null"}],"description":"Whether every field the operation type requires is filled in."},"counterpart_contact_role_id":{"anyOf":[{"$ref":"#/components/schemas/PayrollOperationsCounterpartContactRoleIdScored"},{"type":"null"}],"description":"The contact role of the other party to the operation, from the user's contacts; null when not identified."},"is_on_behalf_of":{"anyOf":[{"$ref":"#/components/schemas/PayrollOperationsIsOnBehalfOfScored"},{"type":"null"}],"description":"True when the operation is recorded on behalf of one of the user's clients rather than for the user directly."},"on_behalf_of_contact_role_id":{"anyOf":[{"$ref":"#/components/schemas/PayrollOperationsOnBehalfOfContactRoleIdScored"},{"type":"null"}],"description":"The id of the client contact role this operation is recorded on behalf of, when your account operates on behalf of others. Validated against your own contact roles. Leave unset for an operation that is directly your own."},"fields":{"items":{"$ref":"#/components/schemas/PayrollOperationsFieldsItem"},"type":"array","title":"Fields","description":"Operation-specific details as name/value pairs (e.g. a wage change carries old and new salary; a vacation carries start/end and day count). When known, the list also carries these details by name (`base_salary`: the employee's base salary as a plain number such as 85000, with its ISO 4217 currency code in `unit` when known; `base_salary_currency`: the ISO 4217 code of the base salary's currency, such as CAD; `hire_start_date`: a new hire's first day of work, as YYYY-MM-DD; `vacation_period_start`: the first day of a vacation or leave, as YYYY-MM-DD; `vacation_period_end`: the last day of a vacation or leave, as YYYY-MM-DD)."},"evidence":{"items":{"$ref":"#/components/schemas/PublicEvidenceItem"},"type":"array","title":"Evidence","description":"The files and emails this operation was built from."},"assessment":{"anyOf":[{"$ref":"#/components/schemas/PublicAssessment"},{"type":"null"}],"description":"The overall confidence and completeness of the operation."},"batch":{"anyOf":[{"$ref":"#/components/schemas/PublicBatch"},{"type":"null"}],"description":"The ingest batch this operation came from."},"schema":{"$ref":"#/components/schemas/PublicSchemaRef","description":"The operation type and schema version this operation was reconciled under."}},"type":"object","required":["operation_id","operation_type","status","schema"],"title":"PayrollOperationsRow","description":"One payroll operation as the API returns it: its status, chaser state, fields with their confidence, and the evidence it was built from."},"PayrollOperationsSearchRequest":{"properties":{"search":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search","description":"Search details"},"page_number":{"type":"integer","minimum":1.0,"title":"Page Number","description":"Page number to retrieve.","default":1},"page_size":{"type":"integer","maximum":250.0,"minimum":1.0,"title":"Page Size","description":"Number of items per page.","default":50},"page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Token","description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."},"sort_by":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Sort By","description":"Field names of the record to sort by, in order; prefix a name with `-` to sort it descending.","examples":[["-employee_normalised"]]},"status":{"anyOf":[{"items":{"$ref":"#/components/schemas/VisibleOperationStatus"},"type":"array"},{"type":"null"}],"title":"Status","description":"Filter to these lifecycle statuses (matches any). Allowed: active, pending_approval, approved, corrected, rejected."},"chaser_status":{"anyOf":[{"items":{"$ref":"#/components/schemas/OperationChaserStatus"},"type":"array"},{"type":"null"}],"title":"Chaser Status","description":"Filter to operations whose chaser is in one of these statuses (matches any). Operations the chaser has never looked at have no chaser status and are excluded."},"employee_normalised":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Employee Normalised","description":"Case-insensitive substring match on `employee_normalised`."},"employee_external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Employee External Id","description":"Case-insensitive substring match on `employee_external_id`."},"department":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Department","description":"Case-insensitive substring match on `department`."},"payroll_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payroll Provider","description":"Case-insensitive substring match on `payroll_provider`."},"operation_verb":{"anyOf":[{"items":{"type":"string","enum":["add","delete","change"]},"type":"array"},{"type":"null"}],"title":"Operation Verb","description":"Match any of the given values on `operation_verb` (exact/IN)."},"operation_target":{"anyOf":[{"items":{"$ref":"#/components/schemas/PayrollOperationsOperationTarget"},"type":"array"},{"type":"null"}],"title":"Operation Target","description":"Match any of the given values on `operation_target` (exact/IN)."},"operation_request_date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Operation Request Date From","description":"Inclusive lower bound (>=) on `operation_request_date`."},"operation_request_date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Operation Request Date To","description":"Inclusive upper bound (<=) on `operation_request_date`."},"effective_date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Effective Date From","description":"Inclusive lower bound (>=) on `effective_date`."},"effective_date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Effective Date To","description":"Inclusive upper bound (<=) on `effective_date`."},"amount_primary_from":{"anyOf":[{"type":"string","format":"decimal","examples":["1234.56"]},{"type":"null"}],"title":"Amount Primary From","description":"Inclusive lower bound (>=) on `amount_primary`."},"amount_primary_to":{"anyOf":[{"type":"string","format":"decimal","examples":["1234.56"]},{"type":"null"}],"title":"Amount Primary To","description":"Inclusive upper bound (<=) on `amount_primary`."},"currency_code":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Currency Code","description":"Match any of the given values on `currency_code` (exact/IN)."},"reasoning_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reasoning Summary","description":"Case-insensitive substring match on `reasoning_summary`."},"approval_state":{"anyOf":[{"items":{"$ref":"#/components/schemas/PayrollOperationsApprovalState"},"type":"array"},{"type":"null"}],"title":"Approval State","description":"Match any of the given values on `approval_state` (exact/IN)."},"completeness_state":{"anyOf":[{"items":{"$ref":"#/components/schemas/CompletenessState"},"type":"array"},{"type":"null"}],"title":"Completeness State","description":"Match any of the given values on `completeness_state` (exact/IN)."},"counterpart_contact_role_id":{"anyOf":[{"items":{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","examples":["rol_1S9dCsGYrSI"]},"type":"array"},{"type":"null"}],"title":"Counterpart Contact Role Id","description":"Match any of the given values on `counterpart_contact_role_id` (exact/IN)."},"is_on_behalf_of":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is On Behalf Of","description":"Exact match (true/false) on `is_on_behalf_of`."},"on_behalf_of_contact_role_id":{"anyOf":[{"items":{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","examples":["rol_1S9dCsGYrSI"]},"type":"array"},{"type":"null"}],"title":"On Behalf Of Contact Role Id","description":"Match any of the given values on `on_behalf_of_contact_role_id` (exact/IN)."}},"type":"object","title":"PayrollOperationsSearchRequest","description":"The request body of `payroll_operations_search`."},"PayrollOperationsUnmergeResult":{"properties":{"operation":{"anyOf":[{"$ref":"#/components/schemas/PayrollOperationsRow"},{"type":"null"}],"description":"This operation after the unmerge; null while it has no record a read would return yet."},"restored_operation_ids":{"items":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"An operation id: `op_` and an opaque string. Treat it as opaque.","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"]},"type":"array","title":"Restored Operation Ids","description":"The operations brought back, each `active` under its own id.","examples":[["op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44"]]}},"type":"object","required":["operation","restored_operation_ids"],"title":"PayrollOperationsUnmergeResult","description":"Returned by `payroll_operations_unmerge`."},"PendingDraft":{"properties":{"counterpart_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Counterpart Name","description":"Who the draft is addressed to, if known."},"counterpart_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Counterpart Email","description":"The counterpart's email, if it was resolved."},"missing_item":{"type":"string","title":"Missing Item","description":"What the draft is asking the counterpart for."},"subject":{"type":"string","title":"Subject","description":"The rendered draft subject."},"body":{"type":"string","title":"Body","description":"The rendered draft body."}},"additionalProperties":false,"type":"object","required":["missing_item","subject","body"],"title":"PendingDraft","description":"A counterpart message the system drafted that nobody approved or rejected in time, rendered\nfor the owner. Nothing has been sent.","examples":[{"body":"Hi Dana, could you confirm the date on invoice INV-2207? Thanks, Maya","counterpart_email":"dana@acme.com","counterpart_name":"Dana Ruiz","missing_item":"the invoice date","subject":"Invoice INV-2207: date missing"}]},"Phone":{"properties":{"number":{"type":"string","maxLength":64,"minLength":1,"title":"Number","description":"The phone number, as written."},"kind":{"type":"string","enum":["mobile","business","home","other"],"title":"Kind","description":"What the number is for."}},"additionalProperties":false,"type":"object","required":["number","kind"],"title":"Phone","description":"A phone number and what it is for.","examples":[{"kind":"business","number":"+1 617 555 0100"}]},"PhoneEdit":{"properties":{"number":{"type":"string","maxLength":64,"minLength":1,"title":"Number","description":"The phone number, as written."},"kind":{"type":"string","enum":["mobile","business","home","other"],"title":"Kind","description":"What the number is for."}},"additionalProperties":false,"type":"object","required":["number","kind"],"title":"PhoneEdit","description":"A phone number and what it is for.","examples":[{"kind":"business","number":"+1 617 555 0100"}]},"PostalAddress":{"properties":{"street":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Street","description":"The street address, with the building number."},"city":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"City","description":"The city or town."},"region":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Region","description":"The state, province or region."},"postal_code":{"anyOf":[{"type":"string","maxLength":32,"minLength":1},{"type":"null"}],"title":"Postal Code","description":"The postal or ZIP code."},"country":{"anyOf":[{"type":"string","pattern":"^[A-Z]{2}$"},{"type":"null"}],"title":"Country","description":"The country (ISO 3166-1 alpha-2)."}},"additionalProperties":false,"type":"object","title":"PostalAddress","description":"A postal address; any part may be unknown.","examples":[{"city":"Boston","country":"US","postal_code":"02108","region":"MA","street":"12 Market Street"}]},"PostalAddressEdit":{"properties":{"street":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Street","description":"The street address, with the building number."},"city":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"City","description":"The city or town."},"region":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Region","description":"The state, province or region."},"postal_code":{"anyOf":[{"type":"string","maxLength":32,"minLength":1},{"type":"null"}],"title":"Postal Code","description":"The postal or ZIP code."},"country":{"anyOf":[{"type":"string","maxLength":2,"minLength":1,"pattern":"^[A-Z]{2}$"},{"type":"null"}],"title":"Country","description":"The country (ISO 3166-1 alpha-2)."}},"additionalProperties":false,"type":"object","title":"PostalAddressEdit","description":"A postal address; send only the parts you know.","examples":[{"city":"Boston","country":"US","postal_code":"02108","region":"MA","street":"12 Market Street"}]},"PreflightCheck":{"properties":{"name":{"type":"string","title":"Name","description":"Stable check identifier; safe to switch on in code."},"ok":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ok","description":"`true` passed, `false` failed, `null` not run because an earlier check failed."},"detail":{"additionalProperties":true,"type":"object","title":"Detail","description":"Per-step diagnostic data (received/expected echoes, etc.)."}},"type":"object","required":["name","ok"],"title":"PreflightCheck","description":"One of the checks `/oauth2/authorize` runs, with what it received and expected in `detail`.","examples":[{"detail":{"matched":"https://app.example.com/oauth/callback"},"name":"redirect_uri_matches","ok":true}]},"PreflightFirstFailure":{"properties":{"error":{"type":"string","title":"Error","description":"The bind.co code of this failure, the same as `hint.bind_subcode` where a JSON answer carries it; see the Errors guide."},"error_description":{"type":"string","title":"Error Description","description":"Human-readable description of the failure."},"error_uri":{"type":"string","title":"Error Uri","description":"Deep link to the docs section explaining this code."},"check_name":{"type":"string","title":"Check Name","description":"Name of the failed check (matches one of `checks[].name`)."}},"type":"object","required":["error","error_description","error_uri","check_name"],"title":"PreflightFirstFailure","description":"The first check that failed, with its bind.co code and a link to its docs.","examples":[{"check_name":"redirect_uri_matches","error":"redirect_uri_mismatch","error_description":"redirect_uri does not match any URI registered for this client.","error_uri":"https://api.bind.co/docs/errors#redirect_uri_mismatch"}]},"PreflightResponse":{"properties":{"ok":{"type":"boolean","title":"Ok","description":"Whether every check passed."},"checks":{"items":{"$ref":"#/components/schemas/PreflightCheck"},"type":"array","title":"Checks","description":"Per-check report in the order they would run."},"first_failure":{"anyOf":[{"$ref":"#/components/schemas/PreflightFirstFailure"},{"type":"null"}],"description":"Summary of the first failed check (null when ok=True)."}},"type":"object","required":["ok","checks"],"title":"PreflightResponse","description":"What `/oauth2/authorize` would do with these parameters. When `ok` is `true` the same request would\nsucceed; when it is `false`, `first_failure` names the first failed check, and checks after it may be `null`.","examples":[{"checks":[{"detail":{"received":"code"},"name":"response_type","ok":true},{"detail":{"client_name":"Ledgerly","client_public_id":"8f3a1c9d2b7e4f60a5c1d8e9b2f3a4c5"},"name":"client_exists_active","ok":true},{"detail":{"current_status":"APPROVED"},"name":"client_status_valid","ok":true},{"detail":{"received":"https://app.example.com/callback","registered":["https://app.example.com/oauth/callback"]},"name":"redirect_uri_matches","ok":false},{"detail":{},"name":"scopes_registered","ok":null},{"detail":{},"name":"pkce","ok":null}],"first_failure":{"check_name":"redirect_uri_matches","error":"redirect_uri_mismatch","error_description":"redirect_uri does not match any URI registered for this client.","error_uri":"https://api.bind.co/docs/errors#redirect_uri_mismatch"},"ok":false}]},"ProfileStatusFilter":{"type":"string","enum":["active","dismissed"],"title":"ProfileStatusFilter","example":"active","description":"`active` for records in use; `dismissed` for records the user set aside."},"PublicAssessment":{"properties":{"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"The overall confidence in this operation, 0-1."},"completeness_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completeness State","description":"Whether every required field has been populated from evidence yet (incomplete or complete)."}},"type":"object","title":"PublicAssessment","description":"How the operation was assessed — the overall confidence and whether every\nrequired field is filled. Per-field confidence is returned on each field.","examples":[{"bind_inference_confidence":0.91,"completeness_state":"complete"}]},"PublicBatch":{"properties":{"channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel","description":"How the content arrived (e.g. email)."},"fetch_date_started":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Fetch Date Started","description":"When the batch started ingesting."},"fetch_date_completed":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Fetch Date Completed","description":"When the batch finished ingesting."}},"type":"object","title":"PublicBatch","description":"The ingest batch this operation came from.","examples":[{"channel":"email","fetch_date_completed":"2026-10-14T16:06:45Z","fetch_date_started":"2026-10-14T16:00:02Z"}]},"PublicDocTypeRef":{"properties":{"doc_type":{"$ref":"#/components/schemas/ScoredText","description":"The document classification (e.g. INVOICE, RECEIPT); confidence 1 when a person set or confirmed it."},"doc_type_version":{"type":"integer","title":"Doc Type Version","description":"The version of the document classification applied."},"requirement_set_satisfied":{"type":"boolean","title":"Requirement Set Satisfied","description":"Whether the document had all the fields this classification requires."},"fields":{"items":{"$ref":"#/components/schemas/OperationDocFieldRef"},"type":"array","title":"Fields","description":"The individual fields extracted from the document."}},"type":"object","required":["doc_type","doc_type_version","requirement_set_satisfied","fields"],"title":"PublicDocTypeRef","description":"A document classification found in a file, plus the fields extracted from it.","examples":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}]},"PublicEmailRef":{"properties":{"email_id":{"type":"string","pattern":"^eml_[0-9A-Za-z]{11}$","title":"Email Id","description":"The email's own identifier.","examples":["eml_16nJ9iKYhhC"]},"email_sender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Sender","description":"The email sender address."},"email_timestamp":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Email Timestamp","description":"When the email was sent."}},"type":"object","required":["email_id"],"title":"PublicEmailRef","description":"An email this operation was built from. The subject is left out, as it can carry sensitive free text.","examples":[{"email_id":"eml_16nJ9iKYhhC","email_sender":"receipts@delta.com","email_timestamp":"2026-10-14T16:01:47Z"}]},"PublicEvidenceItem":{"properties":{"evidence_type":{"type":"string","title":"Evidence Type","description":"The kind of evidence: 'file' or 'email'."},"role":{"type":"string","title":"Role","description":"How the evidence relates to the operation: 'primary', 'supporting', or 'related'."},"created_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Created At","description":"When the evidence was linked to the operation."},"file":{"anyOf":[{"$ref":"#/components/schemas/PublicFileRef"},{"type":"null"}],"description":"The file, when this is file evidence."},"email":{"anyOf":[{"$ref":"#/components/schemas/PublicEmailRef"},{"type":"null"}],"description":"The email, when this is email evidence."}},"type":"object","required":["evidence_type","role"],"title":"PublicEvidenceItem","description":"One piece of evidence (a file or an email) supporting this operation.","examples":[{"created_at":"2026-10-14T16:04:30Z","email":null,"evidence_type":"file","file":{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}},"role":"primary"}]},"PublicFileRef":{"properties":{"file_id":{"type":"string","pattern":"^fil_[0-9A-Za-z]{11}$","title":"File Id","description":"The file's identifier; the same file always has the same identifier.","examples":["fil_7Fa6vXlf9pU"]},"file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Name","description":"The file's name."},"file_mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Mime Type","description":"The file's media type (e.g. application/pdf)."},"file_summary":{"$ref":"#/components/schemas/ScoredText","description":"A short summary of the file's contents."},"doc_types":{"items":{"$ref":"#/components/schemas/PublicDocTypeRef"},"type":"array","title":"Doc Types","description":"The document classifications found in the file."}},"type":"object","required":["file_id","file_summary"],"title":"PublicFileRef","description":"A file this operation was built from.","examples":[{"doc_types":[{"doc_type":{"bind_inference_confidence":0.93,"value":"RECEIPT"},"doc_type_version":4,"fields":[{"bind_inference_confidence":0.97,"name":"total_amount","value":"412.60"}],"requirement_set_satisfied":true}],"file_id":"fil_7Fa6vXlf9pU","file_mime_type":"application/pdf","file_name":"receipt-2026-10-14.pdf","file_summary":{"bind_inference_confidence":0.9,"value":"Delta Air Lines e-ticket receipt, Boston to Chicago, $412.60."}}]},"PublicSchemaRef":{"properties":{"operation_type":{"type":"string","title":"Operation Type","description":"The operation type (e.g. expenses, payroll_operations)."},"version":{"type":"integer","title":"Version","description":"The schema version this operation was reconciled under."}},"type":"object","required":["operation_type","version"],"title":"PublicSchemaRef","description":"The canonical schema this operation is shaped by.","examples":[{"operation_type":"expenses","version":98}]},"PurchaseLoanFinancingAssetTypeScored":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value","description":"The kind of asset being acquired: business, property, franchise, commercial_asset or other."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PurchaseLoanFinancingAssetTypeScored","description":"The kind of asset being acquired: business, property, franchise, commercial_asset or other."},"PurchaseLoanFinancingBuyerNormalisedScored":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value","description":"The buyer's clean name: the party acquiring the asset and borrowing, never the seller or the lender."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PurchaseLoanFinancingBuyerNormalisedScored","description":"The buyer's clean name: the party acquiring the asset and borrowing, never the seller or the lender."},"PurchaseLoanFinancingCompanyIdScored":{"properties":{"value":{"anyOf":[{"type":"string","pattern":"^cmp_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"A company id: `cmp_` and an opaque string. Treat it as opaque.","examples":["cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d"]},{"type":"null"}],"title":"Value","description":"The company the operation belongs to."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PurchaseLoanFinancingCompanyIdScored","description":"The company the operation belongs to."},"PurchaseLoanFinancingCompletenessStateScored":{"properties":{"value":{"anyOf":[{"$ref":"#/components/schemas/CompletenessState"},{"type":"null"}],"description":"Whether every required field has been populated from evidence: incomplete or complete."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PurchaseLoanFinancingCompletenessStateScored","description":"Whether every required field has been populated from evidence: incomplete or complete."},"PurchaseLoanFinancingCounterpartContactRoleIdScored":{"properties":{"value":{"anyOf":[{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","examples":["rol_1S9dCsGYrSI"]},{"type":"null"}],"title":"Value","description":"The contact role of the other party to the operation, from the user's contacts; null when not identified."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PurchaseLoanFinancingCounterpartContactRoleIdScored","description":"The contact role of the other party to the operation, from the user's contacts; null when not identified."},"PurchaseLoanFinancingCreateBody":{"properties":{"asset_type":{"type":"string","enum":["business","property","franchise","commercial_asset","other"],"title":"Asset Type","description":"The kind of asset being acquired: business, property, franchise, commercial_asset or other."},"down_payment":{"anyOf":[{"type":"string","format":"decimal","examples":["1234.56"]},{"type":"null"}],"title":"Down Payment","description":"The buyer's intended down payment or equity contribution; null when not stated."},"currency_code":{"type":"string","title":"Currency Code","description":"The ISO 4217 currency code of the amounts; null when the source names none."},"purchase_price":{"type":"string","format":"decimal","title":"Purchase Price","description":"The agreed or expected purchase price of the asset.","examples":["1234.56"]},"target_close_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Close Date","description":"The buyer's intended closing or completion date; null when not stated."},"on_behalf_of_contact_role_id":{"anyOf":[{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","examples":["rol_1S9dCsGYrSI"]},{"type":"null"}],"title":"On Behalf Of Contact Role Id","description":"The id of the client contact role this operation is recorded on behalf of, when your account operates on behalf of others. Validated against your own contact roles. Leave unset for an operation that is directly your own."},"buyer_normalised":{"type":"string","title":"Buyer Normalised","description":"The buyer's clean name: the party acquiring the asset and borrowing, never the seller or the lender."}},"additionalProperties":false,"type":"object","required":["asset_type","currency_code","purchase_price","buyer_normalised"],"title":"PurchaseLoanFinancingCreateBody","examples":[{"asset_type":"business","buyer_normalised":"Northwind Holdings","currency_code":"CAD","down_payment":"170000.00","purchase_price":"850000.00","target_close_date":"2027-01-15"}],"description":"The request body of `purchase_loan_financing_create`."},"PurchaseLoanFinancingCurrencyCodeScored":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value","description":"The ISO 4217 currency code of the amounts; null when the source names none."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PurchaseLoanFinancingCurrencyCodeScored","description":"The ISO 4217 currency code of the amounts; null when the source names none."},"PurchaseLoanFinancingDownPaymentScored":{"properties":{"value":{"anyOf":[{"type":"string","format":"decimal","examples":["1234.56"]},{"type":"null"}],"title":"Value","description":"The buyer's intended down payment or equity contribution; null when not stated."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PurchaseLoanFinancingDownPaymentScored","description":"The buyer's intended down payment or equity contribution; null when not stated."},"PurchaseLoanFinancingEditBody":{"properties":{"asset_type":{"anyOf":[{"type":"string","enum":["business","property","franchise","commercial_asset","other"]},{"type":"null"}],"title":"Asset Type","description":"The kind of asset being acquired: business, property, franchise, commercial_asset or other."},"down_payment":{"anyOf":[{"type":"string","format":"decimal","examples":["1234.56"]},{"type":"null"}],"title":"Down Payment","description":"The buyer's intended down payment or equity contribution; null when not stated."},"currency_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency Code","description":"The ISO 4217 currency code of the amounts; null when the source names none."},"purchase_price":{"anyOf":[{"type":"string","format":"decimal","examples":["1234.56"]},{"type":"null"}],"title":"Purchase Price","description":"The agreed or expected purchase price of the asset."},"target_close_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Close Date","description":"The buyer's intended closing or completion date; null when not stated."},"on_behalf_of_contact_role_id":{"anyOf":[{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","examples":["rol_1S9dCsGYrSI"]},{"type":"null"}],"title":"On Behalf Of Contact Role Id","description":"The id of the client contact role this operation is recorded on behalf of, when your account operates on behalf of others. Validated against your own contact roles. Leave unset for an operation that is directly your own."},"buyer_normalised":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Buyer Normalised","description":"The buyer's clean name: the party acquiring the asset and borrowing, never the seller or the lender."}},"additionalProperties":false,"type":"object","title":"PurchaseLoanFinancingEditBody","examples":[{"asset_type":"business","buyer_normalised":"Northwind Holdings","currency_code":"CAD","down_payment":"170000.00","purchase_price":"850000.00","target_close_date":"2027-01-15"}],"description":"The request body of `purchase_loan_financing_edit`."},"PurchaseLoanFinancingIsOnBehalfOfScored":{"properties":{"value":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Value","description":"True when the operation is recorded on behalf of one of the user's clients rather than for the user directly."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PurchaseLoanFinancingIsOnBehalfOfScored","description":"True when the operation is recorded on behalf of one of the user's clients rather than for the user directly."},"PurchaseLoanFinancingOnBehalfOfContactRoleIdScored":{"properties":{"value":{"anyOf":[{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","examples":["rol_1S9dCsGYrSI"]},{"type":"null"}],"title":"Value","description":"The id of the client contact role this operation is recorded on behalf of, when your account operates on behalf of others. Validated against your own contact roles. Leave unset for an operation that is directly your own."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PurchaseLoanFinancingOnBehalfOfContactRoleIdScored","description":"The id of the client contact role this operation is recorded on behalf of, when your account operates on behalf of others. Validated against your own contact roles. Leave unset for an operation that is directly your own."},"PurchaseLoanFinancingPurchasePriceScored":{"properties":{"value":{"anyOf":[{"type":"string","format":"decimal","examples":["1234.56"]},{"type":"null"}],"title":"Value","description":"The agreed or expected purchase price of the asset."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PurchaseLoanFinancingPurchasePriceScored","description":"The agreed or expected purchase price of the asset."},"PurchaseLoanFinancingRow":{"properties":{"operation_id":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"Operation Id","description":"Unique identifier of the operation.","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"]},"operation_type":{"type":"string","title":"Operation Type","description":"The operation type (e.g. expenses, payroll_operations).","examples":["purchase_loan_financing"]},"status":{"$ref":"#/components/schemas/OperationStatus","description":"The operation's lifecycle status (e.g. active, pending_approval, approved, rejected)."},"confirmed_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Confirmed At","description":"When the operation's current values were last committed."},"last_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Action","description":"The most recent status change applied to the operation."},"last_actor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Actor","description":"Who last acted on the operation."},"chaser_status":{"anyOf":[{"$ref":"#/components/schemas/OperationChaserStatus"},{"type":"null"}],"description":"Where the chaser is with this operation; null if it has never been chased."},"chaser_status_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Chaser Status At","description":"When the chaser status last changed; null if never chased."},"chaser_status_at_source":{"anyOf":[{"$ref":"#/components/schemas/ChaserStatusAtSource"},{"type":"null"}],"description":"`status` when `chaser_status_at` is the recorded change time; `phase_entry` when only the start of the current stage is known (older records)."},"buyer_normalised":{"anyOf":[{"$ref":"#/components/schemas/PurchaseLoanFinancingBuyerNormalisedScored"},{"type":"null"}],"description":"The buyer's clean name: the party acquiring the asset and borrowing, never the seller or the lender."},"asset_type":{"anyOf":[{"$ref":"#/components/schemas/PurchaseLoanFinancingAssetTypeScored"},{"type":"null"}],"description":"The kind of asset being acquired: business, property, franchise, commercial_asset or other."},"purchase_price":{"anyOf":[{"$ref":"#/components/schemas/PurchaseLoanFinancingPurchasePriceScored"},{"type":"null"}],"description":"The agreed or expected purchase price of the asset."},"down_payment":{"anyOf":[{"$ref":"#/components/schemas/PurchaseLoanFinancingDownPaymentScored"},{"type":"null"}],"description":"The buyer's intended down payment or equity contribution; null when not stated."},"currency_code":{"anyOf":[{"$ref":"#/components/schemas/PurchaseLoanFinancingCurrencyCodeScored"},{"type":"null"}],"description":"The ISO 4217 currency code of the amounts; null when the source names none."},"target_close_date":{"anyOf":[{"$ref":"#/components/schemas/PurchaseLoanFinancingTargetCloseDateScored"},{"type":"null"}],"description":"The buyer's intended closing or completion date; null when not stated."},"completeness_state":{"anyOf":[{"$ref":"#/components/schemas/PurchaseLoanFinancingCompletenessStateScored"},{"type":"null"}],"description":"Whether every required field has been populated from evidence: incomplete or complete."},"company_id":{"anyOf":[{"$ref":"#/components/schemas/PurchaseLoanFinancingCompanyIdScored"},{"type":"null"}],"description":"The company the operation belongs to."},"counterpart_contact_role_id":{"anyOf":[{"$ref":"#/components/schemas/PurchaseLoanFinancingCounterpartContactRoleIdScored"},{"type":"null"}],"description":"The contact role of the other party to the operation, from the user's contacts; null when not identified."},"is_on_behalf_of":{"anyOf":[{"$ref":"#/components/schemas/PurchaseLoanFinancingIsOnBehalfOfScored"},{"type":"null"}],"description":"True when the operation is recorded on behalf of one of the user's clients rather than for the user directly."},"on_behalf_of_contact_role_id":{"anyOf":[{"$ref":"#/components/schemas/PurchaseLoanFinancingOnBehalfOfContactRoleIdScored"},{"type":"null"}],"description":"The id of the client contact role this operation is recorded on behalf of, when your account operates on behalf of others. Validated against your own contact roles. Leave unset for an operation that is directly your own."},"evidence":{"items":{"$ref":"#/components/schemas/PublicEvidenceItem"},"type":"array","title":"Evidence","description":"The files and emails this operation was built from."},"assessment":{"anyOf":[{"$ref":"#/components/schemas/PublicAssessment"},{"type":"null"}],"description":"The overall confidence and completeness of the operation."},"batch":{"anyOf":[{"$ref":"#/components/schemas/PublicBatch"},{"type":"null"}],"description":"The ingest batch this operation came from."},"schema":{"$ref":"#/components/schemas/PublicSchemaRef","description":"The operation type and schema version this operation was reconciled under."}},"type":"object","required":["operation_id","operation_type","status","schema"],"title":"PurchaseLoanFinancingRow","description":"One purchase loan financing request as the API returns it: its status, chaser state, fields with their confidence, and the evidence it was built from."},"PurchaseLoanFinancingSearchRequest":{"properties":{"search":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search","description":"Search details"},"page_number":{"type":"integer","minimum":1.0,"title":"Page Number","description":"Page number to retrieve.","default":1},"page_size":{"type":"integer","maximum":250.0,"minimum":1.0,"title":"Page Size","description":"Number of items per page.","default":50},"page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Token","description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."},"sort_by":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Sort By","description":"Field names of the record to sort by, in order; prefix a name with `-` to sort it descending.","examples":[["-buyer_normalised"]]},"status":{"anyOf":[{"items":{"$ref":"#/components/schemas/VisibleOperationStatus"},"type":"array"},{"type":"null"}],"title":"Status","description":"Filter to these lifecycle statuses (matches any). Allowed: active, pending_approval, approved, corrected, rejected."},"chaser_status":{"anyOf":[{"items":{"$ref":"#/components/schemas/OperationChaserStatus"},"type":"array"},{"type":"null"}],"title":"Chaser Status","description":"Filter to operations whose chaser is in one of these statuses (matches any). Operations the chaser has never looked at have no chaser status and are excluded."},"buyer_normalised":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Buyer Normalised","description":"Case-insensitive substring match on `buyer_normalised`."},"asset_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asset Type","description":"Case-insensitive substring match on `asset_type`."},"purchase_price_from":{"anyOf":[{"type":"string","format":"decimal","examples":["1234.56"]},{"type":"null"}],"title":"Purchase Price From","description":"Inclusive lower bound (>=) on `purchase_price`."},"purchase_price_to":{"anyOf":[{"type":"string","format":"decimal","examples":["1234.56"]},{"type":"null"}],"title":"Purchase Price To","description":"Inclusive upper bound (<=) on `purchase_price`."},"down_payment_from":{"anyOf":[{"type":"string","format":"decimal","examples":["1234.56"]},{"type":"null"}],"title":"Down Payment From","description":"Inclusive lower bound (>=) on `down_payment`."},"down_payment_to":{"anyOf":[{"type":"string","format":"decimal","examples":["1234.56"]},{"type":"null"}],"title":"Down Payment To","description":"Inclusive upper bound (<=) on `down_payment`."},"currency_code":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Currency Code","description":"Match any of the given values on `currency_code` (exact/IN)."},"target_close_date_from":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Target Close Date From","description":"Inclusive lower bound (>=) on `target_close_date`."},"target_close_date_to":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Target Close Date To","description":"Inclusive upper bound (<=) on `target_close_date`."},"completeness_state":{"anyOf":[{"items":{"$ref":"#/components/schemas/CompletenessState"},"type":"array"},{"type":"null"}],"title":"Completeness State","description":"Match any of the given values on `completeness_state` (exact/IN)."},"company_id":{"anyOf":[{"type":"string","pattern":"^cmp_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"A company id: `cmp_` and an opaque string. Treat it as opaque.","examples":["cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d"]},{"type":"null"}],"title":"Company Id","description":"Exact match on `company_id`."},"counterpart_contact_role_id":{"anyOf":[{"items":{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","examples":["rol_1S9dCsGYrSI"]},"type":"array"},{"type":"null"}],"title":"Counterpart Contact Role Id","description":"Match any of the given values on `counterpart_contact_role_id` (exact/IN)."},"is_on_behalf_of":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is On Behalf Of","description":"Exact match (true/false) on `is_on_behalf_of`."},"on_behalf_of_contact_role_id":{"anyOf":[{"items":{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","description":"A contact role id: `rol_` and an opaque string. Treat it as opaque.","examples":["rol_1S9dCsGYrSI"]},"type":"array"},{"type":"null"}],"title":"On Behalf Of Contact Role Id","description":"Match any of the given values on `on_behalf_of_contact_role_id` (exact/IN)."}},"type":"object","title":"PurchaseLoanFinancingSearchRequest","description":"The request body of `purchase_loan_financing_search`."},"PurchaseLoanFinancingTargetCloseDateScored":{"properties":{"value":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Value","description":"The buyer's intended closing or completion date; null when not stated."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"bind.co's confidence in this value, 0-1; null if not scored.","examples":[0.92]}},"type":"object","title":"PurchaseLoanFinancingTargetCloseDateScored","description":"The buyer's intended closing or completion date; null when not stated."},"PurchaseLoanFinancingUnmergeResult":{"properties":{"operation":{"anyOf":[{"$ref":"#/components/schemas/PurchaseLoanFinancingRow"},{"type":"null"}],"description":"This operation after the unmerge; null while it has no record a read would return yet."},"restored_operation_ids":{"items":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"An operation id: `op_` and an opaque string. Treat it as opaque.","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"]},"type":"array","title":"Restored Operation Ids","description":"The operations brought back, each `active` under its own id.","examples":[["op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44"]]}},"type":"object","required":["operation","restored_operation_ids"],"title":"PurchaseLoanFinancingUnmergeResult","description":"Returned by `purchase_loan_financing_unmerge`."},"RoleCreateBody":{"properties":{"contact_id":{"type":"string","pattern":"^con_[0-9A-Za-z]{11}$","title":"Contact Id","description":"The contact who plays the role.","examples":["con_3SrGoE2zltj"]},"entity_type":{"type":"string","maxLength":255,"minLength":1,"title":"Entity Type","description":"The role the contact plays for the user, such as CLIENT or ACCOUNTANT."},"entity_stage":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Entity Stage","description":"The stage the relationship is at in that role."},"home_currency":{"anyOf":[{"type":"string","pattern":"^[A-Za-z]{3}$"},{"type":"null"}],"title":"Home Currency","description":"The currency the contact deals in for this role (ISO 4217); stored in upper case."}},"additionalProperties":false,"type":"object","required":["contact_id","entity_type"],"title":"RoleCreateBody","description":"A new role for an active contact, saved as set by a person.","examples":[{"contact_id":"con_3SrGoE2zltj","entity_stage":"ACTIVE","entity_type":"ACCOUNTANT","home_currency":"USD"}]},"RoleFamily":{"properties":{"refresh_days":{"anyOf":[{"type":"integer","exclusiveMinimum":0.0},{"type":"null"}],"title":"Refresh Days","description":"Days after a role in this family was last scored before new email can re-score it; null uses the default."},"stage_change_min_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Stage Change Min Confidence","description":"The confidence, 0 to 1, a newly inferred stage needs to replace the stage held; null uses the default."}},"additionalProperties":false,"type":"object","title":"RoleFamily","description":"One family's definition.","examples":[{"refresh_days":30,"stage_change_min_confidence":0.8}]},"RoleFamilyConfig":{"properties":{"families":{"additionalProperties":{"$ref":"#/components/schemas/RoleFamily"},"propertyNames":{"maxLength":20,"minLength":1},"type":"object","title":"Families","description":"Each family's settings, by family name."},"map":{"additionalProperties":{"type":"string","maxLength":20,"minLength":1},"propertyNames":{"maxLength":20,"minLength":1},"type":"object","title":"Map","description":"The family of each role type, by upper-cased role type."}},"additionalProperties":false,"type":"object","title":"RoleFamilyConfig","description":"`families` defines each family; `map` assigns an entity_type name to one of them.","examples":[{"families":{"CLIENT":{"refresh_days":null,"stage_change_min_confidence":null},"PERSONAL":{"refresh_days":null,"stage_change_min_confidence":null},"VENDOR":{"refresh_days":30,"stage_change_min_confidence":0.8}},"map":{"ACCOUNTANT":"VENDOR","CLIENT":"CLIENT","FRIENDS_AND_FAMILY":"PERSONAL","VENDOR":"VENDOR"}}]},"RoleProfileEdit":{"properties":{"entity_type":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Entity Type","description":"The role the contact plays for the user. Cannot be cleared."},"entity_stage":{"anyOf":[{"type":"string"},{"type":"null"}],"maxLength":20,"title":"Entity Stage","description":"The stage the relationship is at in that role; stored in upper case."},"home_currency":{"anyOf":[{"type":"string","maxLength":3,"minLength":1,"pattern":"^[A-Z]{3}$"},{"type":"null"}],"title":"Home Currency","description":"The currency the contact deals in for this role (ISO 4217); stored in upper case."}},"additionalProperties":false,"type":"object","title":"RoleProfileEdit","description":"A person's partial edit of a role: only the fields sent change, `null` clears a stage or currency.","examples":[{"entity_stage":"ACTIVE","home_currency":"EUR"}]},"RoleProfileResponse":{"properties":{"category_contact_role_id":{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","title":"Category Contact Role Id","description":"The role's id.","examples":["rol_1S9dCsGYrSI"]},"contact_id":{"type":"string","pattern":"^con_[0-9A-Za-z]{11}$","title":"Contact Id","description":"The contact who plays the role.","examples":["con_3SrGoE2zltj"]},"contact_role_status":{"$ref":"#/components/schemas/ContactRoleStatus","description":"`active`, `merged` into another role, or `dismissed`."},"entity_type":{"$ref":"#/components/schemas/ScoredText","description":"The role the contact plays for the user."},"entity_stage":{"$ref":"#/components/schemas/ScoredText","description":"The stage the relationship is at in that role."},"home_currency":{"$ref":"#/components/schemas/ScoredText","description":"The currency the contact deals in for this role (ISO 4217)."},"entity_type_inferred":{"$ref":"#/components/schemas/ScoredText","description":"A different role the inbox keeps pointing to, if any."},"entity_type_inferred_streak":{"type":"integer","title":"Entity Type Inferred Streak","description":"How many refreshes in a row pointed to `entity_type_inferred`."},"truth_updated_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Truth Updated At","description":"When the role was last saved by a person; null if never."},"suggestion_updated_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Suggestion Updated At","description":"When a suggested change last arrived; null when none is waiting."},"dismissed_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Dismissed At","description":"When the role was dismissed; null unless dismissed."}},"type":"object","required":["category_contact_role_id","contact_id","contact_role_status","entity_type","entity_stage","home_currency","entity_type_inferred","entity_type_inferred_streak","truth_updated_at","suggestion_updated_at","dismissed_at"],"title":"RoleProfileResponse","description":"One role a contact plays for the user, with bind.co's confidence in each value.","examples":[{"category_contact_role_id":"rol_1S9dCsGYrSI","contact_id":"con_3SrGoE2zltj","contact_role_status":"active","dismissed_at":null,"entity_stage":{"bind_inference_confidence":0.81,"value":"ACTIVE"},"entity_type":{"bind_inference_confidence":0.92,"value":"ACCOUNTANT"},"entity_type_inferred":{"bind_inference_confidence":null,"value":null},"entity_type_inferred_streak":0,"home_currency":{"bind_inference_confidence":0.77,"value":"USD"},"suggestion_updated_at":null,"truth_updated_at":null}]},"RoleProfileRow":{"properties":{"user_direct_first_contact":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"User Direct First Contact","description":"When the user first emailed the contact directly (the contact in To); null if never."},"user_direct_last_contact":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"User Direct Last Contact","description":"When the user last emailed the contact directly (the contact in To); null if never."},"contact_direct_first_contact":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Contact Direct First Contact","description":"When the contact first emailed the user; null if never."},"contact_direct_last_contact":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Contact Direct Last Contact","description":"When the contact last emailed the user; null if never."},"user_indirect_first_contact":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"User Indirect First Contact","description":"When the user first sent an email with the contact copied (Cc or Bcc); null if never."},"user_indirect_last_contact":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"User Indirect Last Contact","description":"When the user last sent an email with the contact copied (Cc or Bcc); null if never."},"other_indirect_first_contact":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Other Indirect First Contact","description":"When the contact was first copied (Cc or Bcc) on an email someone else sent the user; null if never."},"other_indirect_last_contact":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Other Indirect Last Contact","description":"When the contact was last copied (Cc or Bcc) on an email someone else sent the user; null if never."},"category_contact_role_id":{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","title":"Category Contact Role Id","description":"The role's id.","examples":["rol_1S9dCsGYrSI"]},"contact_id":{"type":"string","pattern":"^con_[0-9A-Za-z]{11}$","title":"Contact Id","description":"The contact who plays the role.","examples":["con_3SrGoE2zltj"]},"contact_role_status":{"$ref":"#/components/schemas/ContactRoleStatus","description":"`active`, `merged` into another role, or `dismissed`."},"entity_type":{"$ref":"#/components/schemas/ScoredText","description":"The role the contact plays for the user."},"entity_stage":{"$ref":"#/components/schemas/ScoredText","description":"The stage the relationship is at in that role."},"home_currency":{"$ref":"#/components/schemas/ScoredText","description":"The currency the contact deals in for this role (ISO 4217)."},"entity_type_inferred":{"$ref":"#/components/schemas/ScoredText","description":"A different role the inbox keeps pointing to, if any."},"entity_type_inferred_streak":{"type":"integer","title":"Entity Type Inferred Streak","description":"How many refreshes in a row pointed to `entity_type_inferred`."},"truth_updated_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Truth Updated At","description":"When the role was last saved by a person; null if never."},"suggestion_updated_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Suggestion Updated At","description":"When a suggested change last arrived; null when none is waiting."},"dismissed_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Dismissed At","description":"When the role was dismissed; null unless dismissed."},"contact_name":{"$ref":"#/components/schemas/ScoredText","description":"The contact's name."},"contact_primary_email":{"$ref":"#/components/schemas/ScoredText","description":"The contact's main email address."},"first_contact":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"First Contact","description":"The earliest of the `*_first_contact` times; null if none."},"last_contact":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Last Contact","description":"The latest of the `*_last_contact` times; null if none."}},"type":"object","required":["user_direct_first_contact","user_direct_last_contact","contact_direct_first_contact","contact_direct_last_contact","user_indirect_first_contact","user_indirect_last_contact","other_indirect_first_contact","other_indirect_last_contact","category_contact_role_id","contact_id","contact_role_status","entity_type","entity_stage","home_currency","entity_type_inferred","entity_type_inferred_streak","truth_updated_at","suggestion_updated_at","dismissed_at","contact_name","contact_primary_email","first_contact","last_contact"],"title":"RoleProfileRow","description":"A role in a search result, with the contact it belongs to.","examples":[{"category_contact_role_id":"rol_1S9dCsGYrSI","contact_direct_first_contact":"2024-01-19T08:03:00Z","contact_direct_last_contact":"2026-10-02T15:04:00Z","contact_id":"con_3SrGoE2zltj","contact_name":{"bind_inference_confidence":0.95,"value":"Dana Ruiz"},"contact_primary_email":{"bind_inference_confidence":0.99,"value":"dana@acme.com"},"contact_role_status":"active","dismissed_at":null,"entity_stage":{"bind_inference_confidence":0.81,"value":"ACTIVE"},"entity_type":{"bind_inference_confidence":0.92,"value":"ACCOUNTANT"},"entity_type_inferred":{"bind_inference_confidence":null,"value":null},"entity_type_inferred_streak":0,"first_contact":"2024-01-18T09:12:00Z","home_currency":{"bind_inference_confidence":0.77,"value":"USD"},"last_contact":"2026-10-02T15:04:00Z","other_indirect_first_contact":"2024-03-02T10:45:00Z","other_indirect_last_contact":"2025-11-14T16:30:00Z","suggestion_updated_at":null,"truth_updated_at":null,"user_direct_first_contact":"2024-01-18T09:12:00Z","user_direct_last_contact":"2026-09-30T11:20:00Z","user_indirect_first_contact":null,"user_indirect_last_contact":null}]},"RoleProfileSuggestions":{"properties":{"suggestion_updated_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Suggestion Updated At","description":"When the waiting suggestion arrived."},"entity_type":{"anyOf":[{"$ref":"#/components/schemas/TextSuggestion"},{"type":"null"}],"description":"A different role the inbox keeps pointing to."},"entity_stage":{"anyOf":[{"$ref":"#/components/schemas/TextSuggestion"},{"type":"null"}],"description":"The stage the relationship is at in that role."},"home_currency":{"anyOf":[{"$ref":"#/components/schemas/TextSuggestion"},{"type":"null"}],"description":"The currency the contact deals in for this role (ISO 4217)."}},"type":"object","title":"RoleProfileSuggestions","description":"The stage and currency where the newest inference differs from the saved role, and the suggested role\ntype; `{}` when nothing is waiting.","examples":[{"entity_stage":{"current":{"bind_inference_confidence":1.0,"value":"PROSPECT"},"suggested":{"bind_inference_confidence":0.84,"value":"ACTIVE"}},"suggestion_updated_at":"2026-10-03T07:41:12Z"}]},"RoleSearchRequest":{"properties":{"search":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search","description":"Search details"},"page_number":{"type":"integer","minimum":1.0,"title":"Page Number","description":"Page number to retrieve.","default":1},"page_size":{"type":"integer","maximum":250.0,"minimum":1.0,"title":"Page Size","description":"Number of items per page.","default":50},"page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Token","description":"The `next_page_token` of the previous page, unchanged; it names the page and its size, so `page_number` and `page_size` are then ignored."},"sort_by":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Sort By","description":"Signed sort keys, `-` for descending; unknown keys are refused (422). Default `contact_name`, `entity_type`."},"status":{"anyOf":[{"items":{"$ref":"#/components/schemas/ProfileStatusFilter"},"type":"array"},{"type":"null"}],"title":"Status","description":"Default `active` only."},"has_suggestion":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Suggestion","description":"True for only those with a suggested change waiting; false for only those without."},"last_contact_from":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Last Contact From","description":"Last exchanged email on or after this time."},"last_contact_to":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Last Contact To","description":"Last exchanged email on or before this time."},"first_contact_from":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"First Contact From","description":"First exchanged email on or after this time."},"first_contact_to":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"First Contact To","description":"First exchanged email on or before this time."},"email":{"anyOf":[{"type":"string","maxLength":320},{"type":"null"}],"title":"Email","description":"Only the contact holding this address, primary or not (exact, ignoring case)."},"company_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Company Name","description":"Only contacts with an address at this company (exact, ignoring case)."},"entity_type":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Entity Type","description":"Only these roles (matches any)."},"entity_stage":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Entity Stage","description":"Only these stages (matches any)."},"contact_id":{"anyOf":[{"type":"string","pattern":"^con_[0-9A-Za-z]{11}$","description":"A contact id: `con_` and an opaque string. Treat it as opaque.","examples":["con_3SrGoE2zltj"]},{"type":"null"}],"title":"Contact Id","description":"Only this contact's roles."}},"additionalProperties":false,"type":"object","title":"RoleSearchRequest","examples":[{"email":"dana@acme.com","entity_type":["ACCOUNTANT"],"has_suggestion":true,"page_number":1,"page_size":50,"sort_by":["-last_contact"],"status":["active"]}],"description":"The request body of `search_roles`."},"ScoredUtcDateTime":{"properties":{"value":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Value","description":"The value; null when there is none."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"How confident bind.co is in the value, from 0 to 1; null when unknown.","examples":[0.92]}},"type":"object","required":["value","bind_inference_confidence"],"title":"ScoredUtcDateTime","description":"`{value, bind_inference_confidence}` for a UTC date-time."},"SelfHelpCandidateOut":{"properties":{"source_operation_id":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"Source Operation Id","description":"The owner's other operation this value came from.","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"]},"canonical_path":{"type":"string","title":"Canonical Path","description":"The gap field this candidate would fill."},"observed":{"$ref":"#/components/schemas/ScoredTextOrNumber","description":"The value on the source operation and the confidence in it, 0-1; `value` is null for a candidate found before values were kept."}},"additionalProperties":false,"type":"object","required":["source_operation_id","canonical_path","observed"],"title":"SelfHelpCandidateOut","description":"One value for a gap, found on another of the owner's operations for the same field, for a person to\nconfirm or reject.","examples":[{"canonical_path":"expense_date","observed":{"bind_inference_confidence":0.94,"value":"2026-10-14"},"source_operation_id":"op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44"}]},"SelfHelpDecisionBody":{"properties":{"canonical_path":{"type":"string","title":"Canonical Path","description":"The gap field the decision applies to."},"source_operation_id":{"anyOf":[{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"An operation id: `op_` and an opaque string. Treat it as opaque.","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"]},{"type":"null"}],"title":"Source Operation Id","description":"The candidate's source operation, from the queue (value candidates)."},"file_id":{"anyOf":[{"type":"string","pattern":"^fil_[0-9A-Za-z]{11}$","description":"A file id: `fil_` and an opaque string. Treat it as opaque.","examples":["fil_7Fa6vXlf9pU"]},{"type":"null"}],"title":"File Id","description":"The candidate file, from the queue (document candidates)."}},"additionalProperties":false,"type":"object","required":["canonical_path"],"title":"SelfHelpDecisionBody","description":"Confirm or reject one candidate on one gap of an operation. Exactly one of\n`source_operation_id` (a value candidate from another operation) or `file_id` (a document\ncandidate for a missing-document gap) names the candidate, as returned by the self-help queue.","examples":[{"canonical_path":"expense_date","source_operation_id":"op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44"}]},"SelfHelpDocumentCandidateOut":{"properties":{"file_id":{"type":"string","pattern":"^fil_[0-9A-Za-z]{11}$","title":"File Id","description":"The file's identifier; the same file always has the same identifier.","examples":["fil_7Fa6vXlf9pU"]},"file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Name","description":"The file's name as received."},"doc_type":{"type":"string","title":"Doc Type","description":"The document type the file was classified as, e.g. PASSPORT."},"classified_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Classified At","description":"When the classification was confirmed."},"conforms":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Conforms","description":"Whether the file's contents pass the requirement's checks; null when the requirement checks none."},"failures":{"items":{"$ref":"#/components/schemas/ConditionFailure"},"type":"array","title":"Failures","description":"The checks the file's contents failed, and why."}},"additionalProperties":false,"type":"object","required":["file_id","doc_type"],"title":"SelfHelpDocumentCandidateOut","description":"A classified file in your mailbox that could satisfy a missing-document gap.","examples":[{"classified_at":"2026-10-09T11:20:31Z","conforms":false,"doc_type":"PASSPORT","failures":[{"condition_index":0,"field":"expiry_date","operand":"op_date:opened_at","operator":"gt","reason":"comparison_failed"}],"file_id":"fil_1YNczuOA2H3","file_name":"passport-scan.pdf"}]},"SelfHelpGapOut":{"properties":{"canonical_path":{"type":"string","title":"Canonical Path","description":"The missing field, or `document:<TYPES>` for a missing document."},"reason":{"$ref":"#/components/schemas/GapReason","description":"Why the field is a gap (absent, below_threshold, missing document)."},"candidates":{"items":{"$ref":"#/components/schemas/SelfHelpCandidateOut"},"type":"array","title":"Candidates","description":"Values found on the owner's other operations that could fill the field."},"document_candidates":{"items":{"$ref":"#/components/schemas/SelfHelpDocumentCandidateOut"},"type":"array","title":"Document Candidates","description":"For a missing-document gap: classified files in your mailbox that could be the document."}},"additionalProperties":false,"type":"object","required":["canonical_path","reason","candidates"],"title":"SelfHelpGapOut","description":"One unsatisfied field on the operation plus its reviewable candidates.","examples":[{"candidates":[{"canonical_path":"expense_date","observed":{"bind_inference_confidence":0.94,"value":"2026-10-14"},"source_operation_id":"op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44"}],"canonical_path":"expense_date","document_candidates":[],"reason":"absent"}]},"SelfHelpQueueItem":{"properties":{"operation_id":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"Operation Id","description":"The operation with gaps.","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"]},"chaser_status":{"$ref":"#/components/schemas/OperationChaserStatus","description":"The chaser phase status, e.g. in_self_help."},"gaps":{"items":{"$ref":"#/components/schemas/SelfHelpGapOut"},"type":"array","title":"Gaps","description":"The fields still missing, each with its candidates."}},"additionalProperties":false,"type":"object","required":["operation_id","chaser_status","gaps"],"title":"SelfHelpQueueItem","description":"One operation in the self-help queue: its gaps and, per gap, the candidates to confirm/reject.","examples":[{"chaser_status":"in_self_help","gaps":[{"candidates":[{"canonical_path":"expense_date","observed":{"bind_inference_confidence":0.94,"value":"2026-10-14"},"source_operation_id":"op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44"}],"canonical_path":"expense_date","document_candidates":[],"reason":"absent"}],"operation_id":"op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"}]},"TaxNumber":{"properties":{"jurisdiction":{"type":"string","maxLength":64,"minLength":1,"title":"Jurisdiction","description":"Where the number is issued: a country or region code."},"type":{"type":"string","maxLength":64,"minLength":1,"title":"Type","description":"The kind of number, such as EIN, BN or VAT."},"number":{"type":"string","maxLength":64,"minLength":1,"title":"Number","description":"The number itself."}},"additionalProperties":false,"type":"object","required":["jurisdiction","type","number"],"title":"TaxNumber","description":"A tax or registration number.","examples":[{"jurisdiction":"US","number":"12-3456789","type":"EIN"}]},"TaxNumberEdit":{"properties":{"jurisdiction":{"type":"string","maxLength":64,"minLength":1,"title":"Jurisdiction","description":"Where the number is issued: a country or region code."},"type":{"type":"string","maxLength":64,"minLength":1,"title":"Type","description":"The kind of number, such as EIN, BN or VAT."},"number":{"type":"string","maxLength":64,"minLength":1,"title":"Number","description":"The number itself."}},"additionalProperties":false,"type":"object","required":["jurisdiction","type","number"],"title":"TaxNumberEdit","description":"A tax or registration number.","examples":[{"jurisdiction":"US","number":"12-3456789","type":"EIN"}]},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token","description":"The bearer token to send in the `Authorization` header."},"refresh_token":{"type":"string","title":"Refresh Token","description":"Exchange it at this endpoint for a new access token."},"expires_in":{"type":"integer","title":"Expires In","description":"Seconds until the access token expires.","examples":[3600]},"token_type":{"type":"string","title":"Token Type","description":"Always `Bearer`.","examples":["Bearer"]},"scope":{"type":"string","title":"Scope","description":"Space-separated scopes the access token carries."}},"type":"object","required":["access_token","refresh_token","expires_in","token_type","scope"],"title":"TokenResponse","description":"The tokens `POST /oauth2/token` issues.","examples":[{"access_token":"q8dK2mVx7RtN0pLwZ4bY9sGcH1fJ3eUa6iOuT5yWnBk","expires_in":3600,"refresh_token":"Xv3Lp9QzR2mT7nK0wB5cY8dF1gH4jS6aE2uIoPtNrMs","scope":"profile contacts operations:expenses","token_type":"Bearer"}]},"UnmergeBody":{"properties":{"loser_operation_ids":{"anyOf":[{"items":{"type":"string","pattern":"^op_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"An operation id: `op_` and an opaque string. Treat it as opaque.","examples":["op_5b1f0c7e-8a2d-4c3b-9e61-2f7d4a9c0b13"]},"type":"array","maxItems":100,"minItems":1},{"type":"null"}],"title":"Loser Operation Ids","description":"The merged-away operations to bring back. Leave it out to undo every merge into this operation.","examples":[["op_3f6c2a9e-8b1d-4c57-9e0a-5d2f7b8c1e44"]]}},"additionalProperties":false,"type":"object","title":"UnmergeBody","description":"Undo merges into the operation in the request path."},"UpdateTruth":{"properties":{"truth_updated_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Truth Updated At","description":"When the change was made; set by the server."},"truth_operation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Truth Operation","description":"The kind of change; set by the server."},"truth_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Truth Reason","description":"Why the user made the change, in their words."}},"type":"object","required":["truth_updated_at","truth_operation","truth_reason"],"title":"UpdateTruth","description":"Why a draft changed.","examples":[{"truth_operation":null,"truth_reason":"Softened the opening line","truth_updated_at":null}]},"UserFactsEdit":{"properties":{"full_name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Full Name","description":"The user's full name."},"first_name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"First Name","description":"The user's first name."},"family_name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Family Name","description":"The user's family name."},"preferred_language":{"anyOf":[{"type":"string","maxLength":35,"minLength":1,"pattern":"^[A-Za-z]{2,8}(-[A-Za-z0-9]{1,8})*$"},{"type":"null"}],"title":"Preferred Language","description":"The user's language, as a language tag such as `en-US`."},"timezone":{"anyOf":[{"type":"string","maxLength":64,"minLength":1},{"type":"null"}],"title":"Timezone","description":"The user's time zone, such as `America/New_York`."},"country":{"anyOf":[{"type":"string","maxLength":2,"minLength":1,"pattern":"^[A-Z]{2}$"},{"type":"null"}],"title":"Country","description":"The user's country (ISO 3166-1 alpha-2); stored in upper case."},"default_currency":{"anyOf":[{"type":"string","maxLength":3,"minLength":1,"pattern":"^[A-Z]{3}$"},{"type":"null"}],"title":"Default Currency","description":"The user's currency (ISO 4217); stored in upper case."},"phones":{"anyOf":[{"items":{"$ref":"#/components/schemas/PhoneEdit"},"type":"array","maxItems":20},{"type":"null"}],"title":"Phones","description":"The user's phone numbers; replaces the whole list."},"address":{"anyOf":[{"$ref":"#/components/schemas/PostalAddressEdit"},{"type":"null"}],"description":"The user's postal address; replaces the whole address."}},"additionalProperties":false,"type":"object","title":"UserFactsEdit","description":"A partial edit of the user's facts: only the fields sent change, and `null` clears one.","examples":[{"phones":[{"kind":"business","number":"+1 617 555 0100"}],"preferred_language":"en-US","timezone":"America/New_York"}]},"UserProfileEdit":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Title","description":"The user's title in their organization, such as founder or CEO."},"profession":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Profession","description":"What the user actually does, such as bookkeeper or graphic designer."},"bio":{"anyOf":[{"type":"string","maxLength":1000,"minLength":1},{"type":"null"}],"title":"Bio","description":"A short biography of the user."},"hero_resume":{"anyOf":[{"type":"string","maxLength":4000,"minLength":1},{"type":"null"}],"title":"Hero Resume","description":"A concise professional summary of the user's work, clients and expertise."}},"additionalProperties":false,"type":"object","title":"UserProfileEdit","description":"A partial edit of the user profile: the fields sent are saved with confidence 1.0.","examples":[{"profession":"Graphic Designer","title":"Founder and CEO"}]},"UserProfileResponse":{"properties":{"user_id":{"type":"string","pattern":"^usr_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"User Id","description":"The user's public id.","examples":["usr_0d6f2a4e-5b7c-4e1d-9a83-2c4b6e8f1a20"]},"title":{"$ref":"#/components/schemas/ScoredText","description":"The user's title in their organization, such as founder or CEO."},"profession":{"$ref":"#/components/schemas/ScoredText","description":"What the user actually does, such as bookkeeper or graphic designer."},"bio":{"$ref":"#/components/schemas/ScoredText","description":"A short biography of the user."},"hero_resume":{"$ref":"#/components/schemas/ScoredText","description":"A concise professional summary of the user's work, clients and expertise."},"truth_updated_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Truth Updated At","description":"When a person last saved the profile; null if never."},"suggestion_updated_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Suggestion Updated At","description":"When a suggested change last arrived; null when none is waiting."}},"type":"object","required":["user_id","title","profession","bio","hero_resume","truth_updated_at","suggestion_updated_at"],"title":"UserProfileResponse","description":"What bind.co inferred about the user from their inbox, or what they saved.","examples":[{"bio":{"bind_inference_confidence":0.71,"value":"Runs a small brand studio in Boston."},"hero_resume":{"bind_inference_confidence":0.74,"value":"Brand identity and packaging for consumer start-ups."},"profession":{"bind_inference_confidence":0.88,"value":"Graphic Designer"},"suggestion_updated_at":null,"title":{"bind_inference_confidence":0.93,"value":"Founder"},"truth_updated_at":null,"user_id":"usr_0d6f2a4e-5b7c-4e1d-9a83-2c4b6e8f1a20"}]},"UserProfileSuggestions":{"properties":{"suggestion_updated_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Suggestion Updated At","description":"When the waiting suggestion arrived."},"title":{"anyOf":[{"$ref":"#/components/schemas/TextSuggestion"},{"type":"null"}],"description":"The user's title in their organization, such as founder or CEO."},"profession":{"anyOf":[{"$ref":"#/components/schemas/TextSuggestion"},{"type":"null"}],"description":"What the user actually does, such as bookkeeper or graphic designer."},"bio":{"anyOf":[{"$ref":"#/components/schemas/TextSuggestion"},{"type":"null"}],"description":"A short biography of the user."},"hero_resume":{"anyOf":[{"$ref":"#/components/schemas/TextSuggestion"},{"type":"null"}],"description":"A concise professional summary of the user's work, clients and expertise."}},"type":"object","title":"UserProfileSuggestions","description":"Each field where the newest inference differs from the saved user profile; `{}` when nothing is waiting.","examples":[{"suggestion_updated_at":"2026-10-03T07:41:12Z","title":{"current":{"bind_inference_confidence":1.0,"value":"Founder"},"suggested":{"bind_inference_confidence":0.86,"value":"Founder and CEO"}}}]},"UserResponse":{"properties":{"user_id":{"type":"string","pattern":"^usr_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"User Id","description":"The user's public id.","examples":["usr_0d6f2a4e-5b7c-4e1d-9a83-2c4b6e8f1a20"]},"email":{"type":"string","title":"Email","description":"The email address the user signed in with."},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name","description":"The user's full name."},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name","description":"The user's first name."},"family_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Family Name","description":"The user's family name."},"preferred_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preferred Language","description":"The user's language, as a language tag such as `en-US`."},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone","description":"The user's time zone, as the mail provider reports it."},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"The user's country (ISO 3166-1 alpha-2)."},"default_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Currency","description":"The currency of the user's country (ISO 4217)."},"phones":{"anyOf":[{"items":{"$ref":"#/components/schemas/Phone"},"type":"array"},{"type":"null"}],"title":"Phones","description":"The user's phone numbers."},"address":{"anyOf":[{"$ref":"#/components/schemas/PostalAddress"},{"type":"null"}],"description":"The user's postal address."},"company_id":{"anyOf":[{"type":"string","pattern":"^cmp_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","description":"A company id: `cmp_` and an opaque string. Treat it as opaque.","examples":["cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d"]},{"type":"null"}],"title":"Company Id","description":"The user's main company: the company of their work email domain, or an `individual` company of their own."}},"type":"object","required":["user_id","email","full_name","first_name","family_name","preferred_language","timezone","country","default_currency","phones","address","company_id"],"title":"UserResponse","description":"The user's facts, from their Google or Microsoft sign-in or as they edited them.","examples":[{"address":{"city":"Boston","country":"US","postal_code":"02108","region":"MA","street":"12 Market Street"},"company_id":"cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d","country":"US","default_currency":"USD","email":"maya@northwind-studio.com","family_name":"Chen","first_name":"Maya","full_name":"Maya Chen","phones":[{"kind":"mobile","number":"+1 617 555 0100"}],"preferred_language":"en-US","timezone":"America/New_York","user_id":"usr_0d6f2a4e-5b7c-4e1d-9a83-2c4b6e8f1a20"}]},"ValidationErrorItem":{"properties":{"loc":{"type":"string","title":"Loc","description":"Where the failing value is, dot-joined: `body.page_size`, `query.status`."},"msg":{"type":"string","title":"Msg","description":"What is wrong with it, in English."},"type":{"type":"string","title":"Type","description":"A stable machine-readable name for the failure, such as `missing`."}},"type":"object","required":["loc","msg","type"],"title":"ValidationErrorItem","description":"One field a request failed validation on, as `hint.validation_errors` lists it.","examples":[{"loc":"body.page_size","msg":"Input should be less than or equal to 250","type":"less_than_equal"}]},"VisibleOperationStatus":{"type":"string","enum":["active","pending_approval","approved","corrected","rejected"],"title":"VisibleOperationStatus","example":"active","description":"`active` was found in the user's mail; `pending_approval` waits for a person; `approved` was confirmed; `corrected` was confirmed with changes; `rejected` was turned down."},"WebhookDeliveryAttemptOut":{"properties":{"attempt_number":{"type":"integer","title":"Attempt Number","description":"1 for the first attempt, counting up with each retry."},"attempted_at":{"type":"string","format":"date-time","title":"Attempted At","description":"When the request was sent.","examples":["2026-10-02T15:04:00Z"]},"duration_ms":{"type":"integer","title":"Duration Ms","description":"How long your endpoint took to answer, in milliseconds."},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code","description":"The HTTP status your endpoint answered; null when it did not."},"error_class":{"anyOf":[{"$ref":"#/components/schemas/ErrorClass"},{"type":"null"}],"description":"What kind of failure it was, when it failed."},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"The failure, in words."},"response_body_excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Body Excerpt","description":"The start of your endpoint's answer."}},"type":"object","required":["attempt_number","attempted_at","duration_ms","status_code","error_class","error_message","response_body_excerpt"],"title":"WebhookDeliveryAttemptOut","description":"One request bind.co made to your endpoint for a delivery.","examples":[{"attempt_number":1,"attempted_at":"2026-09-11T08:00:01Z","duration_ms":182,"error_class":null,"error_message":null,"response_body_excerpt":"ok","status_code":200}]},"WebhookDeliveryDetail":{"properties":{"id":{"type":"string","pattern":"^dlv_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"Id","description":"The delivery's id; a redelivery gets a new one.","examples":["dlv_9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b"]},"event_id":{"type":"string","pattern":"^evt_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"Event Id","description":"The event delivered.","examples":["evt_2c9e4b7a-5d1f-4e8a-b3c6-7d0e1f2a3b4c"]},"endpoint_id":{"type":"string","pattern":"^we_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"Endpoint Id","description":"The endpoint it is delivered to.","examples":["we_6a0f8d2c-1b3e-4c5d-8e7f-9a0b1c2d3e4f"]},"event_type":{"type":"string","title":"Event Type","description":"The event's type."},"status":{"$ref":"#/components/schemas/WebhookDeliveryStatus","description":"`pending`, `succeeded`, `failed` (retrying), `dead` or `cancelled`."},"origin":{"$ref":"#/components/schemas/WebhookDeliveryOrigin","description":"`fanout` when the event happened, `redeliver` when you asked for it again."},"attempt_count":{"type":"integer","title":"Attempt Count","description":"Attempts made so far."},"next_attempt_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Next Attempt At","description":"When the next retry is due, while it retries."},"last_status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Status Code","description":"The HTTP status your endpoint last answered."},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error","description":"What went wrong on the last failed attempt."},"completed_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Completed At","description":"When the delivery succeeded or was given up."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When the delivery was queued.","examples":["2026-10-02T15:04:00Z"]},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"When the delivery last changed.","examples":["2026-10-02T15:04:00Z"]},"attempts":{"items":{"$ref":"#/components/schemas/WebhookDeliveryAttemptOut"},"type":"array","title":"Attempts","description":"Every attempt, first to last."},"event":{"$ref":"#/components/schemas/WebhookEventDetail","description":"The event delivered, with its payload."}},"type":"object","required":["id","event_id","endpoint_id","event_type","status","origin","attempt_count","next_attempt_at","last_status_code","last_error","completed_at","created_at","updated_at","attempts","event"],"title":"WebhookDeliveryDetail","description":"A delivery with every attempt and the full event.","examples":[{"attempt_count":1,"attempts":[{"attempt_number":1,"attempted_at":"2026-09-11T08:00:01Z","duration_ms":182,"error_class":null,"error_message":null,"response_body_excerpt":"ok","status_code":200}],"completed_at":"2026-09-11T08:00:02Z","created_at":"2026-09-11T08:00:01Z","endpoint_id":"we_2f1c7a1e-4b7d-4c1e-9c0e-5d2a1b3c4d5e","event":{"created_at":"2026-09-11T08:00:01Z","data":{"created":42,"updated":7,"user_inbox_fetch_id":"fch_0OPMCd3plzE"},"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","occurred_at":"2026-09-11T08:00:00Z","type":"contacts.completed","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44"},"event_id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","event_type":"contacts.completed","id":"dlv_9d2c4e7a-1b3f-4c5d-8e9f-0a1b2c3d4e5f","last_error":null,"last_status_code":200,"next_attempt_at":null,"origin":"fanout","status":"succeeded","updated_at":"2026-09-11T08:00:02Z"}]},"WebhookDeliveryOrigin":{"type":"string","enum":["fanout","redeliver"],"title":"WebhookDeliveryOrigin","example":"fanout","description":"`fanout` when the event happened; `redeliver` when you asked to send it again."},"WebhookDeliveryStatus":{"type":"string","enum":["pending","succeeded","failed","dead","cancelled"],"title":"WebhookDeliveryStatus","example":"pending","description":"`pending` waits to be sent; `succeeded` got a 2xx; `failed` will be retried; `dead` ran out of retries; `cancelled` was stopped before it was sent."},"WebhookDeliverySummary":{"properties":{"id":{"type":"string","pattern":"^dlv_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"Id","description":"The delivery's id; a redelivery gets a new one.","examples":["dlv_9e8d7c6b-5a4f-4e3d-8c2b-1a0f9e8d7c6b"]},"event_id":{"type":"string","pattern":"^evt_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"Event Id","description":"The event delivered.","examples":["evt_2c9e4b7a-5d1f-4e8a-b3c6-7d0e1f2a3b4c"]},"endpoint_id":{"type":"string","pattern":"^we_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"Endpoint Id","description":"The endpoint it is delivered to.","examples":["we_6a0f8d2c-1b3e-4c5d-8e7f-9a0b1c2d3e4f"]},"event_type":{"type":"string","title":"Event Type","description":"The event's type."},"status":{"$ref":"#/components/schemas/WebhookDeliveryStatus","description":"`pending`, `succeeded`, `failed` (retrying), `dead` or `cancelled`."},"origin":{"$ref":"#/components/schemas/WebhookDeliveryOrigin","description":"`fanout` when the event happened, `redeliver` when you asked for it again."},"attempt_count":{"type":"integer","title":"Attempt Count","description":"Attempts made so far."},"next_attempt_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Next Attempt At","description":"When the next retry is due, while it retries."},"last_status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Last Status Code","description":"The HTTP status your endpoint last answered."},"last_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error","description":"What went wrong on the last failed attempt."},"completed_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Completed At","description":"When the delivery succeeded or was given up."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When the delivery was queued.","examples":["2026-10-02T15:04:00Z"]},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"When the delivery last changed.","examples":["2026-10-02T15:04:00Z"]}},"type":"object","required":["id","event_id","endpoint_id","event_type","status","origin","attempt_count","next_attempt_at","last_status_code","last_error","completed_at","created_at","updated_at"],"title":"WebhookDeliverySummary","description":"One event sent, or being sent, to one of your endpoints.","examples":[{"attempt_count":1,"completed_at":"2026-09-11T08:00:02Z","created_at":"2026-09-11T08:00:01Z","endpoint_id":"we_2f1c7a1e-4b7d-4c1e-9c0e-5d2a1b3c4d5e","event_id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","event_type":"contacts.completed","id":"dlv_9d2c4e7a-1b3f-4c5d-8e9f-0a1b2c3d4e5f","last_error":null,"last_status_code":200,"next_attempt_at":null,"origin":"fanout","status":"succeeded","updated_at":"2026-09-11T08:00:02Z"}]},"WebhookEndpointCreate":{"properties":{"url":{"type":"string","maxLength":2048,"minLength":1,"title":"Url","description":"HTTPS URL on a public host that receives the events."},"description":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Description","description":"Your own note on the endpoint, such as `production`."},"event_types":{"anyOf":[{"items":{"type":"string","maxLength":64,"minLength":1},"type":"array","maxItems":64,"minItems":1},{"type":"null"}],"title":"Event Types","description":"Event types this endpoint receives; null (the default) means every event the application is eligible for. An empty list is rejected."}},"additionalProperties":false,"type":"object","required":["url"],"title":"WebhookEndpointCreate","description":"A URL to send events to.","examples":[{"description":"production","event_types":["contacts.first_completed","expenses.completed"],"url":"https://api.example.com/bind/webhooks"}]},"WebhookEndpointOut":{"properties":{"id":{"type":"string","pattern":"^we_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"Id","description":"The endpoint's id.","examples":["we_6a0f8d2c-1b3e-4c5d-8e7f-9a0b1c2d3e4f"]},"url":{"type":"string","title":"Url","description":"HTTPS URL on a public host that receives the events."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Your own note on the endpoint, such as `production`."},"status":{"$ref":"#/components/schemas/WebhookEndpointStatus","description":"Whether events are sent to it."},"event_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Event Types","description":"Event types this endpoint receives; null (the default) means every event the application is eligible for. An empty list is rejected."},"disabled_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Disabled Reason","description":"Why bind.co disabled it, when `status` is `disabled_by_system`."},"consecutive_failures":{"type":"integer","title":"Consecutive Failures","description":"Deliveries failed in a row since the last success."},"last_success_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Last Success At","description":"When a delivery last succeeded."},"last_failure_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Last Failure At","description":"When a delivery last failed."},"previous_secret_expires_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Previous Secret Expires At","description":"Until when requests are also signed with the secret before the last rotation."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When the endpoint was registered.","examples":["2026-10-02T15:04:00Z"]},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"When the endpoint last changed.","examples":["2026-10-02T15:04:00Z"]}},"type":"object","required":["id","url","description","status","event_types","disabled_reason","consecutive_failures","last_success_at","last_failure_at","previous_secret_expires_at","created_at","updated_at"],"title":"WebhookEndpointOut","description":"A registered webhook endpoint.","examples":[{"consecutive_failures":0,"created_at":"2026-09-11T08:00:00Z","description":"production","disabled_reason":null,"event_types":["contacts.first_completed","expenses.completed"],"id":"we_2f1c7a1e-4b7d-4c1e-9c0e-5d2a1b3c4d5e","last_failure_at":null,"last_success_at":"2026-09-11T08:05:00Z","previous_secret_expires_at":null,"status":"active","updated_at":"2026-09-11T08:00:00Z","url":"https://api.example.com/bind/webhooks"}]},"WebhookEndpointPage":{"properties":{"total_items":{"type":"integer","title":"Total Items","description":"Total number of items across all pages.","examples":[137]},"total_pages":{"type":"integer","title":"Total Pages","description":"Total number of pages available.","examples":[3]},"page_number":{"type":"integer","title":"Page Number","description":"The current page number.","examples":[1]},"page_size":{"type":"integer","title":"Page Size","description":"The number of items per page.","examples":[50]},"items":{"items":{"$ref":"#/components/schemas/WebhookEndpointOut"},"type":"array","title":"Items","description":"The list of items for the current page."},"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Page Token","description":"Pass as `page_token` to get the next page; null on the last page.","examples":["eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"]}},"type":"object","required":["total_items","total_pages","page_number","page_size","items"],"title":"WebhookEndpointPage","description":"A page of the webhook endpoints your application registered."},"WebhookEndpointPatch":{"properties":{"url":{"anyOf":[{"type":"string","maxLength":2048,"minLength":1},{"type":"null"}],"title":"Url","description":"HTTPS URL on a public host that receives the events."},"description":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Description","description":"Your own note on the endpoint, such as `production`."},"status":{"anyOf":[{"type":"string","enum":["active","disabled_by_user"]},{"type":"null"}],"title":"Status","description":"`active` re-enables the endpoint and resets its failure count; `disabled_by_user` pauses it."},"event_types":{"anyOf":[{"items":{"type":"string","maxLength":64,"minLength":1},"type":"array","maxItems":64,"minItems":1},{"type":"null"}],"title":"Event Types","description":"Event types this endpoint receives; null (the default) means every event the application is eligible for. An empty list is rejected."}},"additionalProperties":false,"type":"object","title":"WebhookEndpointPatch","description":"Fields left out are untouched; `description: null` clears it; `event_types: null` restores\nevery event.","examples":[{"status":"active"}]},"WebhookEndpointStatus":{"type":"string","enum":["active","disabled_by_user","disabled_by_system"],"title":"WebhookEndpointStatus","example":"active","description":"`active` receives events; `disabled_by_user` was turned off by you; `disabled_by_system` was turned off by bind.co after deliveries kept failing."},"WebhookEndpointTestResult":{"properties":{"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code","description":"The HTTP status your endpoint answered; null when it did not."},"duration_ms":{"type":"integer","title":"Duration Ms","description":"How long it took, in milliseconds."},"error_class":{"anyOf":[{"$ref":"#/components/schemas/ErrorClass"},{"type":"null"}],"description":"What kind of failure it was, when it failed."},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message","description":"The failure, in words."}},"type":"object","required":["status_code","duration_ms","error_class","error_message"],"title":"WebhookEndpointTestResult","description":"What your endpoint answered to a test event.","examples":[{"duration_ms":143,"error_class":null,"error_message":null,"status_code":200}]},"WebhookEndpointWithSecret":{"properties":{"id":{"type":"string","pattern":"^we_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"Id","description":"The endpoint's id.","examples":["we_6a0f8d2c-1b3e-4c5d-8e7f-9a0b1c2d3e4f"]},"url":{"type":"string","title":"Url","description":"HTTPS URL on a public host that receives the events."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Your own note on the endpoint, such as `production`."},"status":{"$ref":"#/components/schemas/WebhookEndpointStatus","description":"Whether events are sent to it."},"event_types":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Event Types","description":"Event types this endpoint receives; null (the default) means every event the application is eligible for. An empty list is rejected."},"disabled_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Disabled Reason","description":"Why bind.co disabled it, when `status` is `disabled_by_system`."},"consecutive_failures":{"type":"integer","title":"Consecutive Failures","description":"Deliveries failed in a row since the last success."},"last_success_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Last Success At","description":"When a delivery last succeeded."},"last_failure_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Last Failure At","description":"When a delivery last failed."},"previous_secret_expires_at":{"anyOf":[{"type":"string","format":"date-time","examples":["2026-10-02T15:04:00Z"]},{"type":"null"}],"title":"Previous Secret Expires At","description":"Until when requests are also signed with the secret before the last rotation."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When the endpoint was registered.","examples":["2026-10-02T15:04:00Z"]},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"When the endpoint last changed.","examples":["2026-10-02T15:04:00Z"]},"secret":{"type":"string","title":"Secret","description":"The signing secret. Store it now: it is shown only once."}},"type":"object","required":["id","url","description","status","event_types","disabled_reason","consecutive_failures","last_success_at","last_failure_at","previous_secret_expires_at","created_at","updated_at","secret"],"title":"WebhookEndpointWithSecret","description":"Returned by create and rotate-secret only: the secret is never readable again.","examples":[{"consecutive_failures":0,"created_at":"2026-09-11T08:00:00Z","description":"production","disabled_reason":null,"event_types":["contacts.first_completed","expenses.completed"],"id":"we_2f1c7a1e-4b7d-4c1e-9c0e-5d2a1b3c4d5e","last_failure_at":null,"last_success_at":"2026-09-11T08:05:00Z","previous_secret_expires_at":null,"secret":"whsec_4f9a…","status":"active","updated_at":"2026-09-11T08:00:00Z","url":"https://api.example.com/bind/webhooks"}]},"WebhookEventDetail":{"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"Id","description":"The event's id; the same across retries, redeliveries and endpoints.","examples":["evt_2c9e4b7a-5d1f-4e8a-b3c6-7d0e1f2a3b4c"]},"type":{"type":"string","title":"Type","description":"The event type, such as `contacts.completed`."},"occurred_at":{"type":"string","format":"date-time","title":"Occurred At","description":"When it happened.","examples":["2026-10-02T15:04:00Z"]},"user_id":{"type":"string","pattern":"^usr_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"User Id","description":"The user's id, the user whose inbox the event is about.","examples":["usr_0d6f2a4e-5b7c-4e1d-9a83-2c4b6e8f1a20"]},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When bind.co recorded the event.","examples":["2026-10-02T15:04:00Z"]},"data":{"additionalProperties":true,"type":"object","title":"Data","description":"The event's payload, as the webhooks guide lists it for its type."}},"type":"object","required":["id","type","occurred_at","user_id","created_at","data"],"title":"WebhookEventDetail","description":"`data` is the event payload as it was signed and sent.","examples":[{"created_at":"2026-09-11T08:00:01Z","data":{"created":42,"updated":7,"user_inbox_fetch_id":"fch_0OPMCd3plzE"},"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","occurred_at":"2026-09-11T08:00:00Z","type":"contacts.completed","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44"}]},"WebhookEventRedeliverResponse":{"properties":{"deliveries":{"items":{"$ref":"#/components/schemas/WebhookDeliverySummary"},"type":"array","title":"Deliveries","description":"One new delivery per endpoint still eligible for the event."}},"type":"object","required":["deliveries"],"title":"WebhookEventRedeliverResponse","description":"The deliveries an event redelivery queued.","examples":[{"deliveries":[{"attempt_count":0,"completed_at":null,"created_at":"2026-09-11T08:00:01Z","endpoint_id":"we_2f1c7a1e-4b7d-4c1e-9c0e-5d2a1b3c4d5e","event_id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","event_type":"contacts.completed","id":"dlv_9d2c4e7a-1b3f-4c5d-8e9f-0a1b2c3d4e5f","last_error":null,"last_status_code":null,"next_attempt_at":null,"origin":"redeliver","status":"pending","updated_at":"2026-09-11T08:00:02Z"}]}]},"WebhookEventSummary":{"properties":{"id":{"type":"string","pattern":"^evt_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"Id","description":"The event's id; the same across retries, redeliveries and endpoints.","examples":["evt_2c9e4b7a-5d1f-4e8a-b3c6-7d0e1f2a3b4c"]},"type":{"type":"string","title":"Type","description":"The event type, such as `contacts.completed`."},"occurred_at":{"type":"string","format":"date-time","title":"Occurred At","description":"When it happened.","examples":["2026-10-02T15:04:00Z"]},"user_id":{"type":"string","pattern":"^usr_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"User Id","description":"The user's id, the user whose inbox the event is about.","examples":["usr_0d6f2a4e-5b7c-4e1d-9a83-2c4b6e8f1a20"]},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When bind.co recorded the event.","examples":["2026-10-02T15:04:00Z"]}},"type":"object","required":["id","type","occurred_at","user_id","created_at"],"title":"WebhookEventSummary","description":"An event sent to your application.","examples":[{"created_at":"2026-09-11T08:00:01Z","id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","occurred_at":"2026-09-11T08:00:00Z","type":"contacts.completed","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44"}]},"PostalAddressSuggestion":{"properties":{"current":{"$ref":"#/components/schemas/ScoredPostalAddress","description":"The saved value, and the confidence in it (1.0 when a person set it)."},"suggested":{"$ref":"#/components/schemas/ScoredPostalAddress","description":"The value the newest inbox refresh suggests instead, with its confidence."}},"type":"object","required":["current","suggested"],"title":"FieldSuggestion[PostalAddress]","examples":[{"current":{"bind_inference_confidence":1.0,"value":{"city":"Boston","country":"US","postal_code":"02108","region":"MA","street":"12 Market Street"}},"suggested":{"bind_inference_confidence":0.86,"value":{"city":"Boston","country":"US","postal_code":"02210","region":"MA","street":"400 Summer Street"}}}],"description":"The company's postal address."},"DateSuggestion":{"properties":{"current":{"$ref":"#/components/schemas/ScoredDate","description":"The saved value, and the confidence in it (1.0 when a person set it)."},"suggested":{"$ref":"#/components/schemas/ScoredDate","description":"The value the newest inbox refresh suggests instead, with its confidence."}},"type":"object","required":["current","suggested"],"title":"FieldSuggestion[date]","examples":[{"current":{"bind_inference_confidence":1.0,"value":"1984-03-09"},"suggested":{"bind_inference_confidence":0.86,"value":"1984-09-03"}}],"description":"The contact's date of birth."},"IntegerSuggestion":{"properties":{"current":{"$ref":"#/components/schemas/ScoredInteger","description":"The saved value, and the confidence in it (1.0 when a person set it)."},"suggested":{"$ref":"#/components/schemas/ScoredInteger","description":"The value the newest inbox refresh suggests instead, with its confidence."}},"type":"object","required":["current","suggested"],"title":"FieldSuggestion[int]","examples":[{"current":{"bind_inference_confidence":1.0,"value":6},"suggested":{"bind_inference_confidence":0.86,"value":8}}],"description":"1 (weak or recent) to 10 (close and long-standing)."},"PhoneListSuggestion":{"properties":{"current":{"$ref":"#/components/schemas/ScoredPhoneList","description":"The saved value, and the confidence in it (1.0 when a person set it)."},"suggested":{"$ref":"#/components/schemas/ScoredPhoneList","description":"The value the newest inbox refresh suggests instead, with its confidence."}},"type":"object","required":["current","suggested"],"title":"FieldSuggestion[list[Phone]]","examples":[{"current":{"bind_inference_confidence":1.0,"value":[{"kind":"business","number":"+1 617 555 0100"}]},"suggested":{"bind_inference_confidence":0.86,"value":[{"kind":"business","number":"+1 617 555 0100"},{"kind":"mobile","number":"+1 617 555 0199"}]}}],"description":"The company's phone numbers."},"TaxNumberListSuggestion":{"properties":{"current":{"$ref":"#/components/schemas/ScoredTaxNumberList","description":"The saved value, and the confidence in it (1.0 when a person set it)."},"suggested":{"$ref":"#/components/schemas/ScoredTaxNumberList","description":"The value the newest inbox refresh suggests instead, with its confidence."}},"type":"object","required":["current","suggested"],"title":"FieldSuggestion[list[TaxNumber]]","examples":[{"current":{"bind_inference_confidence":1.0,"value":[{"jurisdiction":"US","number":"12-3456789","type":"EIN"}]},"suggested":{"bind_inference_confidence":0.86,"value":[{"jurisdiction":"US","number":"12-3456789","type":"EIN"},{"jurisdiction":"US-MA","number":"123456789","type":"State tax ID"}]}}],"description":"The company's tax and registration numbers."},"TextListSuggestion":{"properties":{"current":{"$ref":"#/components/schemas/ScoredTextList","description":"The saved value, and the confidence in it (1.0 when a person set it)."},"suggested":{"$ref":"#/components/schemas/ScoredTextList","description":"The value the newest inbox refresh suggests instead, with its confidence."}},"type":"object","required":["current","suggested"],"title":"FieldSuggestion[list[str]]","examples":[{"current":{"bind_inference_confidence":1.0,"value":["Acme"]},"suggested":{"bind_inference_confidence":0.86,"value":["Acme","Acme Labs"]}}],"description":"Other names the company goes by, such as trading names and abbreviations."},"TextSuggestion":{"properties":{"current":{"$ref":"#/components/schemas/ScoredText","description":"The saved value, and the confidence in it (1.0 when a person set it)."},"suggested":{"$ref":"#/components/schemas/ScoredText","description":"The value the newest inbox refresh suggests instead, with its confidence."}},"type":"object","required":["current","suggested"],"title":"FieldSuggestion[str]","examples":[{"current":{"bind_inference_confidence":1.0,"value":"Founder"},"suggested":{"bind_inference_confidence":0.86,"value":"Founder and CEO"}}],"description":"The name the company goes by."},"CompanyResponsePage":{"properties":{"total_items":{"type":"integer","title":"Total Items","description":"Total number of items across all pages.","examples":[137]},"total_pages":{"type":"integer","title":"Total Pages","description":"Total number of pages available.","examples":[3]},"page_number":{"type":"integer","title":"Page Number","description":"The current page number.","examples":[1]},"page_size":{"type":"integer","title":"Page Size","description":"The number of items per page.","examples":[50]},"items":{"items":{"$ref":"#/components/schemas/CompanyResponse"},"type":"array","title":"Items","description":"The list of items for the current page."},"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Page Token","description":"Pass as `page_token` to get the next page; null on the last page.","examples":["eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"]}},"type":"object","required":["total_items","total_pages","page_number","page_size","items"],"title":"PaginatedResponse[CompanyResponse]","description":"Returned by `company_search`."},"ContactProfileResponsePage":{"properties":{"total_items":{"type":"integer","title":"Total Items","description":"Total number of items across all pages.","examples":[137]},"total_pages":{"type":"integer","title":"Total Pages","description":"Total number of pages available.","examples":[3]},"page_number":{"type":"integer","title":"Page Number","description":"The current page number.","examples":[1]},"page_size":{"type":"integer","title":"Page Size","description":"The number of items per page.","examples":[50]},"items":{"items":{"$ref":"#/components/schemas/ContactProfileResponse"},"type":"array","title":"Items","description":"The list of items for the current page."},"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Page Token","description":"Pass as `page_token` to get the next page; null on the last page.","examples":["eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"]}},"type":"object","required":["total_items","total_pages","page_number","page_size","items"],"title":"PaginatedResponse[ContactProfileResponse]","description":"Returned by `list_contacts`."},"DraftCountPage":{"properties":{"total_items":{"type":"integer","title":"Total Items","description":"Total number of items across all pages.","examples":[137]},"total_pages":{"type":"integer","title":"Total Pages","description":"Total number of pages available.","examples":[3]},"page_number":{"type":"integer","title":"Page Number","description":"The current page number.","examples":[1]},"page_size":{"type":"integer","title":"Page Size","description":"The number of items per page.","examples":[50]},"items":{"items":{"$ref":"#/components/schemas/DraftCount"},"type":"array","title":"Items","description":"The list of items for the current page."},"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Page Token","description":"Pass as `page_token` to get the next page; null on the last page.","examples":["eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"]}},"type":"object","required":["total_items","total_pages","page_number","page_size","items"],"title":"PaginatedResponse[DraftCount]","description":"Returned by `count_drafts`."},"DraftGoalResponsePage":{"properties":{"total_items":{"type":"integer","title":"Total Items","description":"Total number of items across all pages.","examples":[137]},"total_pages":{"type":"integer","title":"Total Pages","description":"Total number of pages available.","examples":[3]},"page_number":{"type":"integer","title":"Page Number","description":"The current page number.","examples":[1]},"page_size":{"type":"integer","title":"Page Size","description":"The number of items per page.","examples":[50]},"items":{"items":{"$ref":"#/components/schemas/DraftGoalResponse"},"type":"array","title":"Items","description":"The list of items for the current page."},"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Page Token","description":"Pass as `page_token` to get the next page; null on the last page.","examples":["eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"]}},"type":"object","required":["total_items","total_pages","page_number","page_size","items"],"title":"PaginatedResponse[DraftGoalResponse]","description":"Returned by `list_draft_goals`."},"ExpensesRowPage":{"properties":{"total_items":{"type":"integer","title":"Total Items","description":"Total number of items across all pages.","examples":[137]},"total_pages":{"type":"integer","title":"Total Pages","description":"Total number of pages available.","examples":[3]},"page_number":{"type":"integer","title":"Page Number","description":"The current page number.","examples":[1]},"page_size":{"type":"integer","title":"Page Size","description":"The number of items per page.","examples":[50]},"items":{"items":{"$ref":"#/components/schemas/ExpensesRow"},"type":"array","title":"Items","description":"The list of items for the current page."},"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Page Token","description":"Pass as `page_token` to get the next page; null on the last page.","examples":["eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"]}},"type":"object","required":["total_items","total_pages","page_number","page_size","items"],"title":"PaginatedResponse[ExpensesRow]","description":"Returned by `expenses_search`."},"OutreachApprovalDraftItemPage":{"properties":{"total_items":{"type":"integer","title":"Total Items","description":"Total number of items across all pages.","examples":[137]},"total_pages":{"type":"integer","title":"Total Pages","description":"Total number of pages available.","examples":[3]},"page_number":{"type":"integer","title":"Page Number","description":"The current page number.","examples":[1]},"page_size":{"type":"integer","title":"Page Size","description":"The number of items per page.","examples":[50]},"items":{"items":{"$ref":"#/components/schemas/OutreachApprovalDraftItem"},"type":"array","title":"Items","description":"The list of items for the current page."},"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Page Token","description":"Pass as `page_token` to get the next page; null on the last page.","examples":["eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"]}},"type":"object","required":["total_items","total_pages","page_number","page_size","items"],"title":"PaginatedResponse[OutreachApprovalDraftItem]","description":"Returned by `expenses_outreach_approval_queue`."},"OwnerEscalationQueueItemPage":{"properties":{"total_items":{"type":"integer","title":"Total Items","description":"Total number of items across all pages.","examples":[137]},"total_pages":{"type":"integer","title":"Total Pages","description":"Total number of pages available.","examples":[3]},"page_number":{"type":"integer","title":"Page Number","description":"The current page number.","examples":[1]},"page_size":{"type":"integer","title":"Page Size","description":"The number of items per page.","examples":[50]},"items":{"items":{"$ref":"#/components/schemas/OwnerEscalationQueueItem"},"type":"array","title":"Items","description":"The list of items for the current page."},"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Page Token","description":"Pass as `page_token` to get the next page; null on the last page.","examples":["eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"]}},"type":"object","required":["total_items","total_pages","page_number","page_size","items"],"title":"PaginatedResponse[OwnerEscalationQueueItem]","description":"Returned by `expenses_owner_escalation_queue`."},"PayrollOperationsRowPage":{"properties":{"total_items":{"type":"integer","title":"Total Items","description":"Total number of items across all pages.","examples":[137]},"total_pages":{"type":"integer","title":"Total Pages","description":"Total number of pages available.","examples":[3]},"page_number":{"type":"integer","title":"Page Number","description":"The current page number.","examples":[1]},"page_size":{"type":"integer","title":"Page Size","description":"The number of items per page.","examples":[50]},"items":{"items":{"$ref":"#/components/schemas/PayrollOperationsRow"},"type":"array","title":"Items","description":"The list of items for the current page."},"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Page Token","description":"Pass as `page_token` to get the next page; null on the last page.","examples":["eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"]}},"type":"object","required":["total_items","total_pages","page_number","page_size","items"],"title":"PaginatedResponse[PayrollOperationsRow]","description":"Returned by `payroll_operations_search`."},"PurchaseLoanFinancingRowPage":{"properties":{"total_items":{"type":"integer","title":"Total Items","description":"Total number of items across all pages.","examples":[137]},"total_pages":{"type":"integer","title":"Total Pages","description":"Total number of pages available.","examples":[3]},"page_number":{"type":"integer","title":"Page Number","description":"The current page number.","examples":[1]},"page_size":{"type":"integer","title":"Page Size","description":"The number of items per page.","examples":[50]},"items":{"items":{"$ref":"#/components/schemas/PurchaseLoanFinancingRow"},"type":"array","title":"Items","description":"The list of items for the current page."},"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Page Token","description":"Pass as `page_token` to get the next page; null on the last page.","examples":["eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"]}},"type":"object","required":["total_items","total_pages","page_number","page_size","items"],"title":"PaginatedResponse[PurchaseLoanFinancingRow]","description":"Returned by `purchase_loan_financing_search`."},"RoleProfileRowPage":{"properties":{"total_items":{"type":"integer","title":"Total Items","description":"Total number of items across all pages.","examples":[137]},"total_pages":{"type":"integer","title":"Total Pages","description":"Total number of pages available.","examples":[3]},"page_number":{"type":"integer","title":"Page Number","description":"The current page number.","examples":[1]},"page_size":{"type":"integer","title":"Page Size","description":"The number of items per page.","examples":[50]},"items":{"items":{"$ref":"#/components/schemas/RoleProfileRow"},"type":"array","title":"Items","description":"The list of items for the current page."},"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Page Token","description":"Pass as `page_token` to get the next page; null on the last page.","examples":["eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"]}},"type":"object","required":["total_items","total_pages","page_number","page_size","items"],"title":"PaginatedResponse[RoleProfileRow]","description":"Returned by `list_roles`."},"SelfHelpQueueItemPage":{"properties":{"total_items":{"type":"integer","title":"Total Items","description":"Total number of items across all pages.","examples":[137]},"total_pages":{"type":"integer","title":"Total Pages","description":"Total number of pages available.","examples":[3]},"page_number":{"type":"integer","title":"Page Number","description":"The current page number.","examples":[1]},"page_size":{"type":"integer","title":"Page Size","description":"The number of items per page.","examples":[50]},"items":{"items":{"$ref":"#/components/schemas/SelfHelpQueueItem"},"type":"array","title":"Items","description":"The list of items for the current page."},"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Page Token","description":"Pass as `page_token` to get the next page; null on the last page.","examples":["eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"]}},"type":"object","required":["total_items","total_pages","page_number","page_size","items"],"title":"PaginatedResponse[SelfHelpQueueItem]","description":"Returned by `expenses_self_help_queue`."},"WebhookDeliverySummaryPage":{"properties":{"total_items":{"type":"integer","title":"Total Items","description":"Total number of items across all pages.","examples":[137]},"total_pages":{"type":"integer","title":"Total Pages","description":"Total number of pages available.","examples":[3]},"page_number":{"type":"integer","title":"Page Number","description":"The current page number.","examples":[1]},"page_size":{"type":"integer","title":"Page Size","description":"The number of items per page.","examples":[50]},"items":{"items":{"$ref":"#/components/schemas/WebhookDeliverySummary"},"type":"array","title":"Items","description":"The list of items for the current page."},"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Page Token","description":"Pass as `page_token` to get the next page; null on the last page.","examples":["eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"]}},"type":"object","required":["total_items","total_pages","page_number","page_size","items"],"title":"PaginatedResponse[WebhookDeliverySummary]","description":"Returned by `list_webhook_deliveries`."},"WebhookEventSummaryPage":{"properties":{"total_items":{"type":"integer","title":"Total Items","description":"Total number of items across all pages.","examples":[137]},"total_pages":{"type":"integer","title":"Total Pages","description":"Total number of pages available.","examples":[3]},"page_number":{"type":"integer","title":"Page Number","description":"The current page number.","examples":[1]},"page_size":{"type":"integer","title":"Page Size","description":"The number of items per page.","examples":[50]},"items":{"items":{"$ref":"#/components/schemas/WebhookEventSummary"},"type":"array","title":"Items","description":"The list of items for the current page."},"next_page_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Page Token","description":"Pass as `page_token` to get the next page; null on the last page.","examples":["eyJwIjoyLCJzIjo1MCwibCI6IjNmMmI4YzFlNWQ0YTRlN2IifQ.Qm9uZC1zaWduYXR1cmUtZXhhbXBsZS1vbmx5LW5vdC1yZWFs"]}},"type":"object","required":["total_items","total_pages","page_number","page_size","items"],"title":"PaginatedResponse[WebhookEventSummary]","description":"Returned by `list_webhook_events`."},"ScoredPostalAddress":{"properties":{"value":{"anyOf":[{"$ref":"#/components/schemas/PostalAddress"},{"type":"null"}],"description":"The value; null when there is none."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"How confident bind.co is in the value, from 0 to 1; null when unknown.","examples":[0.92]}},"type":"object","required":["value","bind_inference_confidence"],"title":"Scored[PostalAddress]","description":"The company's postal address."},"ScoredTextOrNumber":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"null"}],"title":"Value","description":"The value; null when there is none."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"How confident bind.co is in the value, from 0 to 1; null when unknown.","examples":[0.92]}},"type":"object","required":["value","bind_inference_confidence"],"title":"Scored[Union[str, float]]","description":"The value on the source operation and the confidence in it, 0-1; `value` is null for a candidate found before values were kept."},"ScoredDate":{"properties":{"value":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Value","description":"The value; null when there is none."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"How confident bind.co is in the value, from 0 to 1; null when unknown.","examples":[0.92]}},"type":"object","required":["value","bind_inference_confidence"],"title":"Scored[date]","description":"The contact's date of birth."},"ScoredInteger":{"properties":{"value":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Value","description":"The value; null when there is none."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"How confident bind.co is in the value, from 0 to 1; null when unknown.","examples":[0.92]}},"type":"object","required":["value","bind_inference_confidence"],"title":"Scored[int]","description":"1 (weak or recent) to 10 (close and long-standing)."},"ScoredPhoneList":{"properties":{"value":{"anyOf":[{"items":{"$ref":"#/components/schemas/Phone"},"type":"array"},{"type":"null"}],"title":"Value","description":"The value; null when there is none."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"How confident bind.co is in the value, from 0 to 1; null when unknown.","examples":[0.92]}},"type":"object","required":["value","bind_inference_confidence"],"title":"Scored[list[Phone]]","description":"The company's phone numbers."},"ScoredTaxNumberList":{"properties":{"value":{"anyOf":[{"items":{"$ref":"#/components/schemas/TaxNumber"},"type":"array"},{"type":"null"}],"title":"Value","description":"The value; null when there is none."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"How confident bind.co is in the value, from 0 to 1; null when unknown.","examples":[0.92]}},"type":"object","required":["value","bind_inference_confidence"],"title":"Scored[list[TaxNumber]]","description":"The company's tax and registration numbers."},"ScoredTextList":{"properties":{"value":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Value","description":"The value; null when there is none."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"How confident bind.co is in the value, from 0 to 1; null when unknown.","examples":[0.92]}},"type":"object","required":["value","bind_inference_confidence"],"title":"Scored[list[str]]","description":"Other names the company goes by, such as trading names and abbreviations."},"ScoredText":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value","description":"The value; null when there is none."},"bind_inference_confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Bind Inference Confidence","description":"How confident bind.co is in the value, from 0 to 1; null when unknown.","examples":[0.92]}},"type":"object","required":["value","bind_inference_confidence"],"title":"Scored[str]","description":"The name the company goes by."},"WebhookEnvelope":{"type":"object","description":"What bind.co posts to your endpoint for every event, signed as the webhooks guide describes.","examples":[{"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"consent.granted","api_version":"v1","occurred_at":"2026-09-11T08:00:00Z","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44","data":{"client_public_id":"acme-payroll","scopes":["profile:read","operations:payroll_operations:read"]}}],"required":["id","type","api_version","occurred_at","user_id","data"],"properties":{"id":{"anyOf":[{"type":"string","pattern":"^evt_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["evt_2c9e4b7a-5d1f-4e8a-b3c6-7d0e1f2a3b4c"],"description":"A webhook event id: `evt_` and an opaque string. Treat it as opaque."},{"type":"null"}],"description":"The event's id; the same on every redelivery, so use it to drop duplicates. Null only for a test delivery."},"type":{"type":"string","description":"The event type, such as `contacts.completed`."},"api_version":{"type":"string","description":"The API version the payload follows.","example":"v1"},"occurred_at":{"type":"string","format":"date-time","description":"When the event happened."},"user_id":{"anyOf":[{"type":"string","pattern":"^usr_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["usr_0d6f2a4e-5b7c-4e1d-9a83-2c4b6e8f1a20"],"description":"A user id: `usr_` and an opaque string. Treat it as opaque."},{"type":"null"}],"description":"The user the event is about; null only for a test delivery."},"data":{"type":"object","description":"The event's own fields, as each event type lists them."}}},"ConsentGrantedData":{"type":"object","description":"The `data` of the events that carry `ConsentGrantedData`.","required":["client_public_id","scopes"],"properties":{"client_public_id":{"type":"string","description":"The client id of the application the event concerns."},"scopes":{"type":"array","items":{"type":"string"},"description":"The scopes the user granted."}},"examples":[{"client_public_id":"acme-payroll","scopes":["profile:read","operations:payroll_operations:read"]}]},"ConsentRevokedData":{"type":"object","description":"The `data` of the events that carry `ConsentRevokedData`.","required":["client_public_id"],"properties":{"client_public_id":{"type":"string","description":"The client id of the application the event concerns."}},"examples":[{"client_public_id":"acme-payroll"}]},"EmailSyncCompletedData":{"type":"object","description":"The `data` of the events that carry `EmailSyncCompletedData`.","required":["user_inbox_fetch_id","fetch_type","fetch_cardinal_number","had_work"],"properties":{"user_inbox_fetch_id":{"type":"string","pattern":"^fch_[0-9A-Za-z]{11}$","examples":["fch_0OPMCd3plzE"],"description":"The inbox sync the change came from; null on an event no single sync produced."},"fetch_type":{"type":"string","description":"What the sync read; `email` for the user's mail."},"fetch_cardinal_number":{"type":"integer","description":"The sync's position among the user's mail syncs, counted from 1."},"had_work":{"type":"boolean","description":"Whether the sync downloaded any mail."}},"examples":[{"user_inbox_fetch_id":"fch_0OPMCd3plzE","fetch_type":"email","fetch_cardinal_number":1,"had_work":true}]},"BatchCompletedData":{"type":"object","description":"The `data` of the events that carry `BatchCompletedData`.","required":["user_inbox_fetch_id","created","updated"],"properties":{"user_inbox_fetch_id":{"type":"string","pattern":"^fch_[0-9A-Za-z]{11}$","examples":["fch_0OPMCd3plzE"],"description":"The inbox sync the change came from; null on an event no single sync produced."},"created":{"minimum":0,"type":"integer","description":"How many records the batch created."},"updated":{"minimum":0,"type":"integer","description":"How many existing records the batch updated."}},"examples":[{"user_inbox_fetch_id":"fch_0OPMCd3plzE","created":1,"updated":0}]},"ProfileSuggestionAvailableData":{"type":"object","description":"The `data` of the events that carry `ProfileSuggestionAvailableData`.","required":["user_inbox_fetch_id","resource","company_id"],"properties":{"user_inbox_fetch_id":{"anyOf":[{"type":"string","pattern":"^fch_[0-9A-Za-z]{11}$","examples":["fch_0OPMCd3plzE"],"description":"An inbox fetch id: `fch_` and an opaque string. Treat it as opaque."},{"type":"null"}],"description":"The inbox sync the change came from; null on an event no single sync produced."},"resource":{"type":"string","enum":["user-profile","company-profile"],"description":"Which profile has a suggestion: `user-profile` or `company-profile`."},"company_id":{"anyOf":[{"type":"string","pattern":"^cmp_[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","examples":["cmp_7c1e9b3a-2f4d-4a6b-8e5c-9d0f1a2b3c4d"],"description":"A company id: `cmp_` and an opaque string. Treat it as opaque."},{"type":"null"}],"description":"The company whose profile has a suggestion; set only for `company-profile`."}},"examples":[{"user_inbox_fetch_id":null,"resource":"company-profile","company_id":"cmp_3f2b8c1e-5d4a-4e6f-9a7b-1c2d3e4f5a6b"}]},"ContactsSuggestionAvailableData":{"type":"object","description":"The `data` of the events that carry `ContactsSuggestionAvailableData`.","required":["user_inbox_fetch_id","contact_ids"],"properties":{"user_inbox_fetch_id":{"type":"string","pattern":"^fch_[0-9A-Za-z]{11}$","examples":["fch_0OPMCd3plzE"],"description":"The inbox sync the change came from; null on an event no single sync produced."},"contact_ids":{"type":"array","items":{"type":"string","pattern":"^con_[0-9A-Za-z]{11}$","examples":["con_3SrGoE2zltj"],"description":"A contact id: `con_` and an opaque string. Treat it as opaque."},"description":"The contacts that have a suggestion to accept or reject."}},"examples":[{"user_inbox_fetch_id":"fch_0OPMCd3plzE","contact_ids":["con_3qeHQKbrPqQ","con_KsNvcP0bZKK"]}]},"ContactRolesSuggestionAvailableData":{"type":"object","description":"The `data` of the events that carry `ContactRolesSuggestionAvailableData`.","required":["user_inbox_fetch_id","category_contact_role_ids"],"properties":{"user_inbox_fetch_id":{"type":"string","pattern":"^fch_[0-9A-Za-z]{11}$","examples":["fch_0OPMCd3plzE"],"description":"The inbox sync the change came from; null on an event no single sync produced."},"category_contact_role_ids":{"type":"array","items":{"type":"string","pattern":"^rol_[0-9A-Za-z]{11}$","examples":["rol_1S9dCsGYrSI"],"description":"A contact role id: `rol_` and an opaque string. Treat it as opaque."},"description":"The contact roles that have a suggestion to accept or reject."}},"examples":[{"user_inbox_fetch_id":"fch_0OPMCd3plzE","category_contact_role_ids":["rol_3DwEmtYQY9E","rol_8D9TwvpGsPO"]}]},"DocumentsSuggestionAvailableData":{"type":"object","description":"The `data` of the events that carry `DocumentsSuggestionAvailableData`.","required":["file_ids"],"properties":{"file_ids":{"type":"array","items":{"type":"string","pattern":"^fil_[0-9A-Za-z]{11}$","examples":["fil_7Fa6vXlf9pU"],"description":"A file id: `fil_` and an opaque string. Treat it as opaque."},"description":"The files whose document types have a suggestion to accept or reject."}},"examples":[{"file_ids":["fil_2wJyhgOT8GH","fil_4m0ww95XulT"]}]},"ApplicationSuspendedData":{"type":"object","description":"The `data` of the events that carry `ApplicationSuspendedData`.","required":["client_public_id","reason","suspended_at"],"properties":{"client_public_id":{"type":"string","description":"The client id of the application the event concerns."},"reason":{"type":"string","enum":["usage_limit","bind_admin"],"description":"Why the application was suspended."},"suspended_at":{"format":"date-time","type":"string","description":"When the application was suspended."}},"examples":[{"client_public_id":"acme-payroll","reason":"usage_limit","suspended_at":"2026-09-11T08:00:00Z"}]},"ApplicationResumedData":{"type":"object","description":"The `data` of the events that carry `ApplicationResumedData`.","required":["client_public_id","suspended_at","resumed_at"],"properties":{"client_public_id":{"type":"string","description":"The client id of the application the event concerns."},"suspended_at":{"format":"date-time","type":"string","description":"When the application was suspended."},"resumed_at":{"format":"date-time","type":"string","description":"When the application became active again."}},"examples":[{"client_public_id":"acme-payroll","suspended_at":"2026-09-10T06:00:00Z","resumed_at":"2026-09-11T08:00:00Z"}]},"MailboxAccessLostData":{"type":"object","description":"The `data` of the events that carry `MailboxAccessLostData`.","required":["provider","lost_at"],"properties":{"provider":{"type":"string","enum":["gmail","microsoft"],"description":"The user's mail provider."},"lost_at":{"format":"date-time","type":"string","description":"When bind.co first failed to reach the mailbox."}},"examples":[{"provider":"gmail","lost_at":"2026-09-11T08:00:00Z"}]},"MailboxAccessRestoredData":{"type":"object","description":"The `data` of the events that carry `MailboxAccessRestoredData`.","required":["provider","restored_at"],"properties":{"provider":{"type":"string","enum":["gmail","microsoft"],"description":"The user's mail provider."},"restored_at":{"format":"date-time","type":"string","description":"When the user reconnected the mailbox."}},"examples":[{"provider":"gmail","restored_at":"2026-09-11T08:00:00Z"}]},"OperationTypeCompletedData":{"type":"object","description":"The `data` of the events that carry `OperationTypeCompletedData`.","required":["user_inbox_fetch_id","operation_type","operations_created","operations_updated"],"properties":{"user_inbox_fetch_id":{"anyOf":[{"type":"string","pattern":"^fch_[0-9A-Za-z]{11}$","examples":["fch_0OPMCd3plzE"],"description":"An inbox fetch id: `fch_` and an opaque string. Treat it as opaque."},{"type":"null"}],"description":"The inbox sync the change came from; null on an event no single sync produced."},"operation_type":{"type":"string","description":"The operation type, as `GET /v1/operations` lists it."},"operations_created":{"minimum":0,"type":"integer","description":"How many operations the batch created."},"operations_updated":{"minimum":0,"type":"integer","description":"How many existing operations an email or document attached to."}},"examples":[{"user_inbox_fetch_id":"fch_0OPMCd3plzE","operation_type":"<operation_type>","operations_created":3,"operations_updated":1}]}},"securitySchemes":{"oauth2":{"type":"oauth2","description":"The user's access token, sent as `Authorization: Bearer <token>`. Authorization code grant with PKCE (`S256` only); the OAuth endpoints live at the API root.","flows":{"authorizationCode":{"authorizationUrl":"https://api.bind.co/oauth2/authorize","tokenUrl":"https://api.bind.co/oauth2/token","refreshUrl":"https://api.bind.co/oauth2/token","scopes":{"profile:read":"View who the user is, their own profile, the companies they belong to, and links to the emails a record came from.","profile:write":"View and edit the user's profile and companies. Includes `profile:read`.","contacts:read":"View the people and businesses the user deals with, and the roles they play.","contacts:write":"View and edit contacts and roles. Includes `contacts:read`.","drafts:read":"View drafted emails and the goals behind them.","drafts:write":"View, edit and decide on drafts and goals. Includes `drafts:read`.","drafts:send":"Send a draft from the user's mailbox, together with `drafts:write`.","files:read":"The user's files and their document types. The routes for files and documents are not in the public reference yet.","files:write":"Add files for the user and correct their document types. Includes `files:read`. The routes for files and documents are not in the public reference yet.","operations:expenses:read":"View the user's `expenses` records.","operations:expenses:write":"View and change the user's `expenses` records. Includes `operations:expenses:read`.","operations:payroll_operations:read":"View the user's `payroll_operations` records.","operations:payroll_operations:write":"View and change the user's `payroll_operations` records. Includes `operations:payroll_operations:read`.","operations:purchase_loan_financing:read":"View the user's `purchase_loan_financing` records.","operations:purchase_loan_financing:write":"View and change the user's `purchase_loan_financing` records. Includes `operations:purchase_loan_financing:read`."}}}},"clientBasic":{"type":"http","scheme":"basic","description":"Your application's own credentials: `client_id` as the user name and `client_secret` as the password."}},"responses":{"ValidationFailed":{"description":"Validation failed — see hint.validation_errors for per-field details.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"missing_body":{"summary":"Request validation failed: `body` — Field required.","value":{"type":"https://api.bind.co/docs/errors#invalid_request","title":"Invalid request","status":422,"error":"invalid_request","error_description":"Request validation failed: `body` — Field required.","error_uri":"https://api.bind.co/docs/errors#invalid_request","fault":"client_problem","hint":{"validation_errors":[{"loc":"body","type":"missing","msg":"Field required"}]},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Request validation failed: `body` — Field required."}},"out_of_range":{"summary":"Request validation failed: `body.page_size` — Input should be less than or equal to 250.","value":{"type":"https://api.bind.co/docs/errors#invalid_request","title":"Invalid request","status":422,"error":"invalid_request","error_description":"Request validation failed: `body.page_size` — Input should be less than or equal to 250.","error_uri":"https://api.bind.co/docs/errors#invalid_request","fault":"client_problem","hint":{"validation_errors":[{"loc":"body.page_size","type":"less_than_equal","msg":"Input should be less than or equal to 250"}]},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Request validation failed: `body.page_size` — Input should be less than or equal to 250."}},"idempotency_key_reused":{"summary":"This Idempotency-Key was already used with a different request.","value":{"type":"https://api.bind.co/docs/errors#idempotency_key_reused","title":"Idempotency key reused","status":422,"error":"idempotency_key_reused","error_description":"This Idempotency-Key was already used with a different request.","error_uri":"https://api.bind.co/docs/errors#idempotency_key_reused","fault":"client_problem","hint":{"header":"Idempotency-Key"},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"This Idempotency-Key was already used with a different request."}}}}}},"BadRequest":{"description":"Bad request — see error code in body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"invalid_id":{"summary":"`contact_id` is not a valid id: expected `con_…`. Ids are opaque strings; send them as this API returned them.","value":{"type":"https://api.bind.co/docs/errors#invalid_request","title":"Invalid request","status":400,"error":"invalid_request","error_description":"`contact_id` is not a valid id: expected `con_…`. Ids are opaque strings; send them as this API returned them.","error_uri":"https://api.bind.co/docs/errors#invalid_request","fault":"client_problem","hint":{"field":"contact_id","expected":"con_…"},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"`contact_id` is not a valid id: expected `con_…`. Ids are opaque strings; send them as this API returned them."}}}}}},"Unauthenticated":{"description":"Unauthenticated — see error code in body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"invalid_token":{"summary":"Could not validate credentials.","value":{"type":"https://api.bind.co/docs/errors#invalid_token","title":"Invalid token","status":401,"error":"invalid_token","error_description":"Could not validate credentials.","error_uri":"https://api.bind.co/docs/errors#invalid_token","fault":"client_problem","hint":{},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Could not validate credentials."}}}}}},"Forbidden":{"description":"Forbidden — see error code in body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"invalid_scope":{"summary":"Permission denied for scope 'contacts:read'.","value":{"type":"https://api.bind.co/docs/errors#invalid_scope","title":"Invalid scope","status":403,"error":"invalid_scope","error_description":"Permission denied for scope 'contacts:read'.","error_uri":"https://api.bind.co/docs/errors#invalid_scope","fault":"client_problem","hint":{"required_scope":"contacts:read","granted_scopes":["profile:read"]},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Permission denied for scope 'contacts:read'."}},"consent_revoked":{"summary":"Access denied: the consent has been revoked.","value":{"type":"https://api.bind.co/docs/errors#consent_revoked","title":"Consent revoked","status":403,"error":"invalid_grant","error_description":"Access denied: the consent has been revoked.","error_uri":"https://api.bind.co/docs/errors#consent_revoked","fault":"user_problem","hint":{"reason":"The user must re-consent via /oauth2/authorize.","bind_subcode":"consent_revoked"},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Access denied: the consent has been revoked."}},"client_not_approved":{"summary":"Access denied: the application 'Acme Books' is currently not active (SUSPENDED).","value":{"type":"https://api.bind.co/docs/errors#client_not_approved","title":"Application not approved","status":403,"error":"access_denied","error_description":"Access denied: the application 'Acme Books' is currently not active (SUSPENDED).","error_uri":"https://api.bind.co/docs/errors#client_not_approved","fault":"client_problem","hint":{"client_status":"SUSPENDED","active_statuses":["APPROVED","IMMUTABLE"],"bind_subcode":"client_not_approved"},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Access denied: the application 'Acme Books' is currently not active (SUSPENDED)."}},"access_denied":{"summary":"User not authorized.","value":{"type":"https://api.bind.co/docs/errors#access_denied","title":"Access denied","status":403,"error":"access_denied","error_description":"User not authorized.","error_uri":"https://api.bind.co/docs/errors#access_denied","fault":"client_problem","hint":{},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"User not authorized."}}}}}},"NotFound":{"description":"Not found — see error code in body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"not_found":{"summary":"The record was not found for this user.","value":{"type":"https://api.bind.co/docs/errors#not_found","title":"Not found","status":404,"error":"not_found","error_description":"The record was not found for this user.","error_uri":"https://api.bind.co/docs/errors#not_found","fault":"client_problem","hint":{},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"The record was not found for this user."}}}}}},"Conflict":{"description":"Conflict — see error code in body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"idempotency_in_progress":{"summary":"A request with this Idempotency-Key is still running.","value":{"type":"https://api.bind.co/docs/errors#idempotency_in_progress","title":"Idempotency key in progress","status":409,"error":"idempotency_in_progress","error_description":"A request with this Idempotency-Key is still running.","error_uri":"https://api.bind.co/docs/errors#idempotency_in_progress","fault":"client_problem","hint":{"header":"Idempotency-Key","reason":"Retry with the same key once it finishes."},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"A request with this Idempotency-Key is still running."}},"conflict":{"summary":"The request conflicts with the record's current state.","value":{"type":"https://api.bind.co/docs/errors#conflict","title":"Conflict","status":409,"error":"conflict","error_description":"The request conflicts with the record's current state.","error_uri":"https://api.bind.co/docs/errors#conflict","fault":"client_problem","hint":{},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"The request conflicts with the record's current state."}}}}}},"PreconditionFailed":{"description":"Precondition failed: `If-Match` names none of the record's current tags.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"precondition_failed":{"summary":"The record changed since you read it: `If-Match` names none of its current tags. Read it again, reapply your change, and send it with the new `ETag`.","value":{"type":"https://api.bind.co/docs/errors#precondition_failed","title":"Precondition failed","status":412,"error":"precondition_failed","error_description":"The record changed since you read it: `If-Match` names none of its current tags. Read it again, reapply your change, and send it with the new `ETag`.","error_uri":"https://api.bind.co/docs/errors#precondition_failed","fault":"client_problem","hint":{"field":"If-Match","current_etag":"\"3f1c9a\""},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"The record changed since you read it: `If-Match` names none of its current tags. Read it again, reapply your change, and send it with the new `ETag`."}}}}}},"ServerError":{"description":"Server error — see error code in body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"server_error":{"summary":"Unexpected server error.","value":{"type":"https://api.bind.co/docs/errors#server_error","title":"Server error","status":500,"error":"server_error","error_description":"Unexpected server error.","error_uri":"https://api.bind.co/docs/errors#server_error","fault":"server_problem","hint":{},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Unexpected server error."}}}}}},"RateLimited":{"description":"Rate limited: `rate_limited`. Wait the `Retry-After` seconds, then retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BindErrorBody"},"examples":{"rate_limited":{"summary":"Too many requests: this route allows 60 per MINUTE.","value":{"type":"https://api.bind.co/docs/errors#rate_limited","title":"Rate limited","status":429,"error":"rate_limited","error_description":"Too many requests: this route allows 60 per MINUTE.","error_uri":"https://api.bind.co/docs/errors#rate_limited","fault":"client_problem","hint":{"limit":"60 per 1 minute","retry_after_seconds":42},"request_id":"req_Q2hhbmdlTWUxMjM0","detail":"Too many requests: this route allows 60 per MINUTE."}}}}},"headers":{"Retry-After":{"description":"Seconds until the limit's window resets.","schema":{"type":"integer"}},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"X-RateLimit-Resource":{"$ref":"#/components/headers/X-RateLimit-Resource"}}}},"headers":{"Idempotent-Replayed":{"description":"`true` when this is the kept answer to an earlier request with the same `Idempotency-Key`; the request did not run again. Absent otherwise.","schema":{"type":"string","enum":["true"],"description":"`true`: the kept answer to an earlier request, replayed."}},"X-RateLimit-Limit":{"description":"Requests the route's window allows.","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Requests left in the current window. Counted per server instance, so approximate.","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"When the current window ends, in Unix seconds.","schema":{"type":"integer"}},"X-RateLimit-Resource":{"description":"The rate-limit family the route counts against, such as `read`.","schema":{"type":"string"}},"Deprecation":{"description":"Sent on every answer once this version is deprecated (RFC 9745): when it was deprecated, as `@` and Unix seconds.","schema":{"type":"string","example":"@1798761600"}},"Sunset":{"description":"Sent with `Deprecation` (RFC 8594): when this version stops answering, as an HTTP date.","schema":{"type":"string","example":"Wed, 30 Jun 2027 00:00:00 GMT"}},"Link":{"description":"Sent with `Deprecation`: the changelog entry that says what to change, with `rel=\"deprecation\"`.","schema":{"type":"string","example":"<https://api.bind.co/docs/changelog>; rel=\"deprecation\"; type=\"text/html\""}}}},"tags":[{"name":"OAuth2","description":"Send a user through consent, exchange the code for tokens, and manage those tokens.","x-displayName":"Sign-in and tokens"},{"name":"OAuth2 Client Webhook Management (Developer)","description":"Register the endpoints bind.co sends signed events to, and read what was sent. These routes take your application's own credentials, never a user's token.","x-displayName":"Webhooks"},{"name":"Profile","description":"The user's own profile and the companies they belong to.","x-displayName":"Profiles"},{"name":"Contacts","description":"The user's contacts and the roles each contact plays.","x-displayName":"Contacts"},{"name":"Drafts","description":"The emails bind.co suggests the user sends to their contacts, and the goals behind them. Reading drafts needs `drafts:read` and managing them `drafts:write`; sending one as a real email from the user's mailbox also needs `drafts:send`, a separate scope your app requests and the consent screen names on its own.","x-displayName":"Drafts"},{"name":"Emails","description":"A link that opens, in the user's mail provider, an email a record came from.","x-displayName":"Emails"},{"name":"Operations Catalogue","description":"Which operation types exist, and each type's record shape, scopes and verbs.","x-displayName":"Operation types"},{"name":"Operations:expenses","x-displayName":"Expenses","description":"Read, correct, confirm and follow up on `expenses` records."},{"name":"Operations:payroll_operations","x-displayName":"Payroll operations","description":"Read, correct, confirm and follow up on `payroll_operations` records."},{"name":"Operations:purchase_loan_financing","x-displayName":"Purchase loan financing","description":"Read, correct, confirm and follow up on `purchase_loan_financing` records."}],"webhooks":{"consent.granted":{"post":{"summary":"consent.granted","description":"The user allowed your application to access their inbox through bind.co.","operationId":"webhook_consent.granted","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookEnvelope"},{"properties":{"data":{"$ref":"#/components/schemas/ConsentGrantedData","description":"This event's fields."}}}]},"example":{"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"consent.granted","api_version":"v1","occurred_at":"2026-09-11T08:00:00Z","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44","data":{"client_public_id":"acme-payroll","scopes":["profile:read","operations:payroll_operations:read"]}}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried."}}}},"consent.revoked":{"post":{"summary":"consent.revoked","description":"The user disconnected your application; no further events will be sent for them.","operationId":"webhook_consent.revoked","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookEnvelope"},{"properties":{"data":{"$ref":"#/components/schemas/ConsentRevokedData","description":"This event's fields."}}}]},"example":{"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"consent.revoked","api_version":"v1","occurred_at":"2026-09-11T08:00:00Z","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44","data":{"client_public_id":"acme-payroll"}}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried."}}}},"email_sync.first_completed":{"post":{"summary":"email_sync.first_completed","description":"The user's first inbox sync finished: the most recent mail is stored and the history download is under way.","operationId":"webhook_email_sync.first_completed","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookEnvelope"},{"properties":{"data":{"$ref":"#/components/schemas/EmailSyncCompletedData","description":"This event's fields."}}}]},"example":{"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"email_sync.first_completed","api_version":"v1","occurred_at":"2026-09-11T08:00:00Z","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44","data":{"user_inbox_fetch_id":"fch_0OPMCd3plzE","fetch_type":"email","fetch_cardinal_number":1,"had_work":true}}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried."}}}},"email_sync.history_completed":{"post":{"summary":"email_sync.history_completed","description":"The history download finished: everything older than the first sync is stored; from here on syncs are incremental.","operationId":"webhook_email_sync.history_completed","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookEnvelope"},{"properties":{"data":{"$ref":"#/components/schemas/EmailSyncCompletedData","description":"This event's fields."}}}]},"example":{"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"email_sync.history_completed","api_version":"v1","occurred_at":"2026-09-11T08:00:00Z","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44","data":{"user_inbox_fetch_id":"fch_CZdKjZXJ2JD","fetch_type":"email","fetch_cardinal_number":3,"had_work":true}}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried."}}}},"email_sync.completed":{"post":{"summary":"email_sync.completed","description":"A routine inbox sync finished: new headers, bodies and attachments since the previous sync are stored.","operationId":"webhook_email_sync.completed","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookEnvelope"},{"properties":{"data":{"$ref":"#/components/schemas/EmailSyncCompletedData","description":"This event's fields."}}}]},"example":{"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"email_sync.completed","api_version":"v1","occurred_at":"2026-09-11T08:00:00Z","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44","data":{"user_inbox_fetch_id":"fch_7QfFQiCrtDk","fetch_type":"email","fetch_cardinal_number":7,"had_work":true}}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried."}}}},"profile.first_completed":{"post":{"summary":"profile.first_completed","description":"The user's profile was built for the very first time (`created` is 1). Sent once per user, whichever applications are connected then.","operationId":"webhook_profile.first_completed","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookEnvelope"},{"properties":{"data":{"$ref":"#/components/schemas/BatchCompletedData","description":"This event's fields."}}}]},"example":{"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"profile.first_completed","api_version":"v1","occurred_at":"2026-09-11T08:00:00Z","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44","data":{"user_inbox_fetch_id":"fch_0OPMCd3plzE","created":1,"updated":0}}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried."}}}},"profile.completed":{"post":{"summary":"profile.completed","description":"The user's profile was refreshed from their inbox, which happens every 90 days (`created` is 0 and `updated` is 1). The first build is `profile.first_completed`.","operationId":"webhook_profile.completed","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookEnvelope"},{"properties":{"data":{"$ref":"#/components/schemas/BatchCompletedData","description":"This event's fields."}}}]},"example":{"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"profile.completed","api_version":"v1","occurred_at":"2026-09-11T08:00:00Z","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44","data":{"user_inbox_fetch_id":"fch_0OPMCd3plzE","created":0,"updated":1}}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried."}}}},"profile.suggestion_available":{"post":{"summary":"profile.suggestion_available","description":"A profile a person has saved has a newer suggestion from the inbox. Read it from the resource's `suggestions` route; accept it with `edit`, or keep what you have with `confirm`. A `company-profile` suggestion is sent to each of the company's admins and subjects, with `user_inbox_fetch_id` null; one for `user-profile` carries the user's own fetch.","operationId":"webhook_profile.suggestion_available","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookEnvelope"},{"properties":{"data":{"$ref":"#/components/schemas/ProfileSuggestionAvailableData","description":"This event's fields."}}}]},"example":{"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"profile.suggestion_available","api_version":"v1","occurred_at":"2026-09-11T08:00:00Z","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44","data":{"user_inbox_fetch_id":null,"resource":"company-profile","company_id":"cmp_3f2b8c1e-5d4a-4e6f-9a7b-1c2d3e4f5a6b"}}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried."}}}},"contacts.first_completed":{"post":{"summary":"contacts.first_completed","description":"The very first batch of categorised contacts (including contact roles) ever recorded for this user is committed: `created` new contact roles, `updated` re-scored ones. Sent once per user; connect later and your first batch is a `contacts.completed`.","operationId":"webhook_contacts.first_completed","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookEnvelope"},{"properties":{"data":{"$ref":"#/components/schemas/BatchCompletedData","description":"This event's fields."}}}]},"example":{"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"contacts.first_completed","api_version":"v1","occurred_at":"2026-09-11T08:00:00Z","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44","data":{"user_inbox_fetch_id":"fch_0OPMCd3plzE","created":20,"updated":0}}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried."}}}},"contacts.completed":{"post":{"summary":"contacts.completed","description":"A batch of contact categorisation (including contact roles) beyond the user's first is committed: `created` new contact roles, `updated` re-scored ones.","operationId":"webhook_contacts.completed","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookEnvelope"},{"properties":{"data":{"$ref":"#/components/schemas/BatchCompletedData","description":"This event's fields."}}}]},"example":{"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"contacts.completed","api_version":"v1","occurred_at":"2026-09-11T08:00:00Z","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44","data":{"user_inbox_fetch_id":"fch_0OPMCd3plzE","created":42,"updated":7}}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried."}}}},"contacts.suggestion_available":{"post":{"summary":"contacts.suggestion_available","description":"Contacts a person has saved have a newer suggestion from the inbox; one event per committed batch. Read each from the contact's `suggestions` route; accept it with `edit`, or keep what you have with `confirm`.","operationId":"webhook_contacts.suggestion_available","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookEnvelope"},{"properties":{"data":{"$ref":"#/components/schemas/ContactsSuggestionAvailableData","description":"This event's fields."}}}]},"example":{"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"contacts.suggestion_available","api_version":"v1","occurred_at":"2026-09-11T08:00:00Z","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44","data":{"user_inbox_fetch_id":"fch_0OPMCd3plzE","contact_ids":["con_3qeHQKbrPqQ","con_KsNvcP0bZKK"]}}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried."}}}},"contact_roles.suggestion_available":{"post":{"summary":"contact_roles.suggestion_available","description":"Contact roles a person has saved have a newer suggestion from the inbox; one event per committed batch. Read each from the role's `suggestions` route; accept it with `edit`, or keep what you have with `confirm`.","operationId":"webhook_contact_roles.suggestion_available","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookEnvelope"},{"properties":{"data":{"$ref":"#/components/schemas/ContactRolesSuggestionAvailableData","description":"This event's fields."}}}]},"example":{"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"contact_roles.suggestion_available","api_version":"v1","occurred_at":"2026-09-11T08:00:00Z","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44","data":{"user_inbox_fetch_id":"fch_0OPMCd3plzE","category_contact_role_ids":["rol_3DwEmtYQY9E","rol_8D9TwvpGsPO"]}}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried."}}}},"drafts.first_completed":{"post":{"summary":"drafts.first_completed","description":"The very first draft proposal ever recorded for this user is committed (`updated` is always 0; drafts are never re-proposed in place). Sent once per user.","operationId":"webhook_drafts.first_completed","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookEnvelope"},{"properties":{"data":{"$ref":"#/components/schemas/BatchCompletedData","description":"This event's fields."}}}]},"example":{"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"drafts.first_completed","api_version":"v1","occurred_at":"2026-09-11T08:00:00Z","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44","data":{"user_inbox_fetch_id":"fch_0OPMCd3plzE","created":1,"updated":0}}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried."}}}},"drafts.completed":{"post":{"summary":"drafts.completed","description":"More draft proposals were generated for this fetch (`updated` is always 0; drafts are never re-proposed in place).","operationId":"webhook_drafts.completed","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookEnvelope"},{"properties":{"data":{"$ref":"#/components/schemas/BatchCompletedData","description":"This event's fields."}}}]},"example":{"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"drafts.completed","api_version":"v1","occurred_at":"2026-09-11T08:00:00Z","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44","data":{"user_inbox_fetch_id":"fch_0OPMCd3plzE","created":5,"updated":0}}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried."}}}},"documents.suggestion_available":{"post":{"summary":"documents.suggestion_available","description":"Documents whose type or fields a person has set were read again and the reading now differs from what they set; one event per committed batch. What they set is kept. The routes for files and documents are not in the public reference yet.","operationId":"webhook_documents.suggestion_available","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookEnvelope"},{"properties":{"data":{"$ref":"#/components/schemas/DocumentsSuggestionAvailableData","description":"This event's fields."}}}]},"example":{"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"documents.suggestion_available","api_version":"v1","occurred_at":"2026-09-11T08:00:00Z","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44","data":{"file_ids":["fil_2wJyhgOT8GH","fil_4m0ww95XulT"]}}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried."}}}},"application.suspended":{"post":{"summary":"application.suspended","description":"Your application was suspended (`usage_limit`: its AI allowance for the period ran out; `bind_admin`: bind.co suspended or delisted it). One event per connected user. Requests are refused and no events are sent until `application.resumed`; work on the user's inbox waits, so records may arrive late after the restart.","operationId":"webhook_application.suspended","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookEnvelope"},{"properties":{"data":{"$ref":"#/components/schemas/ApplicationSuspendedData","description":"This event's fields."}}}]},"example":{"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"application.suspended","api_version":"v1","occurred_at":"2026-09-11T08:00:00Z","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44","data":{"client_public_id":"acme-payroll","reason":"usage_limit","suspended_at":"2026-09-11T08:00:00Z"}}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried."}}}},"application.resumed":{"post":{"summary":"application.resumed","description":"Your application is active again. One event per connected user. Events that would have been sent while suspended are not replayed: read the user's records changed since `suspended_at`. Work that waited during the suspension runs now, so expect a burst of events.","operationId":"webhook_application.resumed","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookEnvelope"},{"properties":{"data":{"$ref":"#/components/schemas/ApplicationResumedData","description":"This event's fields."}}}]},"example":{"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"application.resumed","api_version":"v1","occurred_at":"2026-09-11T08:00:00Z","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44","data":{"client_public_id":"acme-payroll","suspended_at":"2026-09-10T06:00:00Z","resumed_at":"2026-09-11T08:00:00Z"}}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried."}}}},"mailbox.access_lost":{"post":{"summary":"mailbox.access_lost","description":"bind.co can no longer read the user's mailbox: they revoked access, changed their password, or an admin removed it. No new records arrive until they sign in to bind.co again. What you already received is unchanged.","operationId":"webhook_mailbox.access_lost","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookEnvelope"},{"properties":{"data":{"$ref":"#/components/schemas/MailboxAccessLostData","description":"This event's fields."}}}]},"example":{"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"mailbox.access_lost","api_version":"v1","occurred_at":"2026-09-11T08:00:00Z","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44","data":{"provider":"gmail","lost_at":"2026-09-11T08:00:00Z"}}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried."}}}},"mailbox.access_restored":{"post":{"summary":"mailbox.access_restored","description":"The user reconnected their mailbox after `mailbox.access_lost`; syncing resumes and mail that arrived meanwhile is picked up.","operationId":"webhook_mailbox.access_restored","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookEnvelope"},{"properties":{"data":{"$ref":"#/components/schemas/MailboxAccessRestoredData","description":"This event's fields."}}}]},"example":{"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"mailbox.access_restored","api_version":"v1","occurred_at":"2026-09-11T08:00:00Z","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44","data":{"provider":"gmail","restored_at":"2026-09-11T08:00:00Z"}}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried."}}}},"<operation_type>.completed":{"post":{"summary":"<operation_type>.completed","description":"A batch of operations of this type beyond the user's first was extracted for the user. `operations_created` is the number of new operations (for an email fetch, every one the fetch produced); `operations_updated` is the number of emails or documents in this batch that attached to an existing operation, so one operation can be counted more than once.","operationId":"webhook_<operation_type>.completed","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookEnvelope"},{"properties":{"data":{"$ref":"#/components/schemas/OperationTypeCompletedData","description":"This event's fields."}}}]},"example":{"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"<operation_type>.completed","api_version":"v1","occurred_at":"2026-09-11T08:00:00Z","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44","data":{"user_inbox_fetch_id":"fch_0OPMCd3plzE","operation_type":"<operation_type>","operations_created":3,"operations_updated":1}}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried."}}}},"<operation_type>.first_completed":{"post":{"summary":"<operation_type>.first_completed","description":"The very first operations of this type ever recorded for this user are committed; sent once per user, whichever applications are connected then. `operations_created` is the number of new operations (for an email fetch, every one the fetch produced); `operations_updated` is the number of emails or documents in this batch that attached to an existing operation, so one operation can be counted more than once.","operationId":"webhook_<operation_type>.first_completed","requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookEnvelope"},{"properties":{"data":{"$ref":"#/components/schemas/OperationTypeCompletedData","description":"This event's fields."}}}]},"example":{"id":"evt_7c9e6679-7425-40de-944b-e07fc1f90ae7","type":"<operation_type>.first_completed","api_version":"v1","occurred_at":"2026-09-11T08:00:00Z","user_id":"usr_3f2b8c1e-6a4d-4e9b-9c2f-1d7a5b8e0c44","data":{"user_inbox_fetch_id":"fch_0OPMCd3plzE","operation_type":"<operation_type>","operations_created":3,"operations_updated":1}}}}},"responses":{"2XX":{"description":"Any 2xx acknowledges the event; anything else is retried."}}}}}}