Changes up to 100 contacts, each item the body contacts.update takes plus the id of the record to change. The body is checked as a whole first: a malformed item refuses the request with 422 validation_error at its path, such as items.3.name, and nothing is written. Then the items run one after another, each in its own transaction, so one that fails leaves the others written: an id that is not a live record of the workspace fails with not_found, and an expectedUpdatedAt the record has changed since fails with stale_version, nothing written for it. The answer is 200 with one result per item, in order, and the counts: a written item has outcomeupdated and the record; a failed one has outcomefailed and an error in the error envelope’s shape, with the code and details contacts.update would have answered. Like contacts.update, it takes no Idempotency-Key: sending the same body again is harmless, though an item sent with expectedUpdatedAt then fails with stale_version when the first request changed the record. A request counts against the api-key-bulk rate-limit policy as well as api-key.
An Enrik API key, sent as Authorization: Bearer <key>. A key reaches public operations only, and only those whose scopes it holds. A few parameters need a scope beyond their operation’s, which the parameter names. The scopes:
setup:read: Read the workspace setup and its company profile.
setup:run: Change the setup: confirm the company profile, authorize sponsored drafting and background company research, choose what to set up and complete setup.
workspace:read: Read the workspace’s own profile: its health summary and setup state.
crm:read: Read companies with their signals, contacts and the saved views over them.
crm:write: Create, update and restore companies and contacts, and create, update and delete saved views.
crm:delete: Delete companies and contacts.
twin:read: Read the Company Twin: structured company knowledge and its signals.
discovery:read: Read ICP profiles, ICP assessments, discovery briefs, discovery jobs, candidates and the signal library.
discovery:write: Create and change ICP profiles, discovery briefs and signal-definition drafts, and review discovery candidates.
discovery:run: Create, start and cancel discovery jobs, and edit a draft one. Uses provider budget.
enrichment:read: Read the enrichment configuration and its results, including a record’s enrichment, formula and custom-API cells.
enrichment:run: Launch and cancel enrichment. Spends enrichment credits.
automation:read: Read workflows and agents with their run history, including a record’s agent cells.
automation:run: Run existing workflows and agents.
exports:read: Read export jobs and the fields an export can carry.
exports:run: Create, preview, start, cancel and archive CSV exports of companies, contacts and candidates, and download the file. Also needs crm:read. Delivering an export to a webhook destination stays in the app.
integrations:read: Read connections, field mappings, CRM sync jobs and webhook destinations.
webhooks:read: Read webhook subscriptions, the event types they can name and their delivery log.
webhooks:write: Subscribe a receiver URL to webhook events; edit, test, pause, resume and archive a subscription and rotate its signing secret; redeliver an event. Only workspace owners and admins can grant it.
reporting:read: Read analytics and dashboards.
assistant:read: Read the Assistant: its threads, messages and pending approvals.
assistant:run: Converse with the Assistant. Uses the workspace’s AI quota.
assistant:write: Approve or reject the changes the Assistant proposes.
The contacts to change, each by its id, 1 to 100. The whole body is checked first: one malformed item refuses the request with 422 validation_error at its path, such as items.3.name, and nothing is written.
Required range: -9007199254740991 <= x <= 9007199254740991
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Enrik","colors":{"primary":"#4f46e5","light":"#818cf8","dark":"#4338ca"},"favicon":"https://mintlify.s3.us-west-1.amazonaws.com/enrik/favicon.svg","navbar":{"links":[{"href":"mailto:support@enrik.ai","label":"Contact support"}]},"footer":{"socials":{"website":"https://enrik.ai"}},"contextual":{"options":["copy"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"enrik","hasAudioNarration":false,"actualSubdomain":"enrik","customDomains":["docs.enrik.ai"],"gitSource":{"type":"github","owner":"simonrueba","repo":"enrik-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"collectionId":"a74d4468-3307-40c8-ac78-13cf5a523c78","liveDeploymentHistoryId":"6ac90f75d01a2240ccc78b3d","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ac90f75d01a2240ccc78b3d"},"feedback":{"thumbs":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ac90f75d01a2240ccc78b3d","clientVersion":"0.0.4074","searchFilterCounts":[{"language":"default","tag":"API reference","count":135},{"language":"default","tag":"Endpoints","count":130},{"language":"default","tag":"companies","count":20},{"language":"default","tag":"contacts","count":16},{"language":"default","tag":"companyCandidates","count":10},{"language":"default","tag":"companyDiscoveryJobs","count":10},{"language":"default","tag":"webhookSubscriptions","count":10},{"language":"default","tag":"icpProfiles","count":9},{"language":"default","tag":"signalDefinitions","count":9},{"language":"default","tag":"websiteOnboarding","count":9}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/contacts/update-up-to-100-contacts","slug":"/api-reference/contacts/update-up-to-100-contacts","pageMetadata":{"title":"Update up to 100 contacts","description":"Changes up to 100 contacts, each item the body `contacts.update` takes plus the `id` of the record to change. The body is checked as a whole first: a malformed item refuses the request with 422 `validation_error` at its path, such as `items.3.name`, and nothing is written. Then the items run one after another, each in its own transaction, so one that fails leaves the others written: an `id` that is not a live record of the workspace fails with `not_found`, and an `expectedUpdatedAt` the record has changed since fails with `stale_version`, nothing written for it. The answer is 200 with one result per item, in order, and the counts: a written item has `outcome` `updated` and the record; a failed one has `outcome` `failed` and an `error` in the error envelope’s shape, with the code and details `contacts.update` would have answered. Like `contacts.update`, it takes no `Idempotency-Key`: sending the same body again is harmless, though an item sent with `expectedUpdatedAt` then fails with `stale_version` when the first request changed the record. A request counts against the `api-key-bulk` rate-limit policy as well as `api-key`.","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/contacts/bulk-update","href":"/api-reference/contacts/update-up-to-100-contacts","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n code: \"code\",\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_components.p, {\n children: [\"Changes up to 100 contacts, each item the body \", _jsx(_components.code, {\n children: \"contacts.update\"\n }), \" takes plus the \", _jsx(_components.code, {\n children: \"id\"\n }), \" of the record to change. The body is checked as a whole first: a malformed item refuses the request with 422 \", _jsx(_components.code, {\n children: \"validation_error\"\n }), \" at its path, such as \", _jsx(_components.code, {\n children: \"items.3.name\"\n }), \", and nothing is written. Then the items run one after another, each in its own transaction, so one that fails leaves the others written: an \", _jsx(_components.code, {\n children: \"id\"\n }), \" that is not a live record of the workspace fails with \", _jsx(_components.code, {\n children: \"not_found\"\n }), \", and an \", _jsx(_components.code, {\n children: \"expectedUpdatedAt\"\n }), \" the record has changed since fails with \", _jsx(_components.code, {\n children: \"stale_version\"\n }), \", nothing written for it. The answer is 200 with one result per item, in order, and the counts: a written item has \", _jsx(_components.code, {\n children: \"outcome\"\n }), \" \", _jsx(_components.code, {\n children: \"updated\"\n }), \" and the record; a failed one has \", _jsx(_components.code, {\n children: \"outcome\"\n }), \" \", _jsx(_components.code, {\n children: \"failed\"\n }), \" and an \", _jsx(_components.code, {\n children: \"error\"\n }), \" in the error envelope’s shape, with the code and details \", _jsx(_components.code, {\n children: \"contacts.update\"\n }), \" would have answered. Like \", _jsx(_components.code, {\n children: \"contacts.update\"\n }), \", it takes no \", _jsx(_components.code, {\n children: \"Idempotency-Key\"\n }), \": sending the same body again is harmless, though an item sent with \", _jsx(_components.code, {\n children: \"expectedUpdatedAt\"\n }), \" then fails with \", _jsx(_components.code, {\n children: \"stale_version\"\n }), \" when the first request changed the record. A request counts against the \", _jsx(_components.code, {\n children: \"api-key-bulk\"\n }), \" rate-limit policy as well as \", _jsx(_components.code, {\n children: \"api-key\"\n }), \".\"]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Update up to 100 contacts","description":"Changes up to 100 contacts, each item the body `contacts.update` takes plus the `id` of the record to change. The body is checked as a whole first: a malformed item refuses the request with 422 `validation_error` at its path, such as `items.3.name`, and nothing is written. Then the items run one after another, each in its own transaction, so one that fails leaves the others written: an `id` that is not a live record of the workspace fails with `not_found`, and an `expectedUpdatedAt` the record has changed since fails with `stale_version`, nothing written for it. The answer is 200 with one result per item, in order, and the counts: a written item has `outcome` `updated` and the record; a failed one has `outcome` `failed` and an `error` in the error envelope’s shape, with the code and details `contacts.update` would have answered. Like `contacts.update`, it takes no `Idempotency-Key`: sending the same body again is harmless, though an item sent with `expectedUpdatedAt` then fails with `stale_version` when the first request changed the record. A request counts against the `api-key-bulk` rate-limit policy as well as `api-key`.","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/contacts/bulk-update","href":"/api-reference/contacts/update-up-to-100-contacts","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"contacts.bulkUpdate","summary":"Update up to 100 contacts","description":"Changes up to 100 contacts, each item the body `contacts.update` takes plus the `id` of the record to change. The body is checked as a whole first: a malformed item refuses the request with 422 `validation_error` at its path, such as `items.3.name`, and nothing is written. Then the items run one after another, each in its own transaction, so one that fails leaves the others written: an `id` that is not a live record of the workspace fails with `not_found`, and an `expectedUpdatedAt` the record has changed since fails with `stale_version`, nothing written for it. The answer is 200 with one result per item, in order, and the counts: a written item has `outcome` `updated` and the record; a failed one has `outcome` `failed` and an `error` in the error envelope’s shape, with the code and details `contacts.update` would have answered. Like `contacts.update`, it takes no `Idempotency-Key`: sending the same body again is harmless, though an item sent with `expectedUpdatedAt` then fails with `stale_version` when the first request changed the record. A request counts against the `api-key-bulk` rate-limit policy as well as `api-key`.","tags":["contacts"],"security":["5b87e747-d864-452f-b4e1-e3ff064511dd"],"requestBody":"3153882a-1916-4e30-9a8a-1fcfde8454c5","responses":{"200":"b7d51e91-d82a-4e1d-bf83-8293df3c0245","400":"92282cba-6efc-4e4b-9b9b-291813420811","401":"5f0fb6cd-29c5-465d-bf76-00215f8cdc08","403":"52a3dd7a-7d48-4b95-999a-2e7ae144aebf","409":"1c25ec88-0d3a-4292-9dc7-3cbeb5ec1f00","413":"c097ea21-988b-4530-a000-ce0c07033569","415":"31f51777-3121-49b1-883a-df13de59f400","422":"7c6cbb36-2643-45d0-9c50-7dcb22b29707","429":"106cbafc-9abb-4464-9a37-dfc7fbea4d3f","500":"50ec1059-45e2-443d-b306-7fd5e105533f","503":"2c3d95fa-440c-46bf-94cd-eb510a57d6b5","default":"b4b3f01c-8318-410f-8852-5b937e2b7868"},"x-mutation-class":"idempotent-by-nature","x-rate-class":"bulk","x-stability-level":"beta","method":"post","type":"path","servers":["d4b75ac2-20fc-4060-84ae-9370689f03ae"],"path":"/v1/contacts/bulk-update","baseUrlOptions":["https://api.enrik.ai"],"title":"Update up to 100 contacts","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"items":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([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":"The id of the contact to change.","isRequired":true,"uniqueKey":"\\items.items.[INDEX].id","typeLabel":"string\u003cuuid>"},"firstName":{"oneOf":[{"type":"string","description":"The first name; `null` clears it.","maxLength":255,"uniqueKey":"\\items.items.[INDEX].firstName.oneOf.0","typeLabel":"string"},{"type":"null","description":"The first name; `null` clears it.","uniqueKey":"\\items.items.[INDEX].firstName.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].firstName","typeLabel":"string | null"},"lastName":{"oneOf":[{"type":"string","description":"The last name; `null` clears it.","maxLength":255,"uniqueKey":"\\items.items.[INDEX].lastName.oneOf.0","typeLabel":"string"},{"type":"null","description":"The last name; `null` clears it.","uniqueKey":"\\items.items.[INDEX].lastName.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].lastName","typeLabel":"string | null"},"email":{"oneOf":[{"type":"string","description":"The e-mail address; `null` clears it.","format":"email","maxLength":254,"pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","uniqueKey":"\\items.items.[INDEX].email.oneOf.0","typeLabel":"string\u003cemail>"},{"type":"null","description":"The e-mail address; `null` clears it.","uniqueKey":"\\items.items.[INDEX].email.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].email","typeLabel":"string\u003cemail> | null"},"phone":{"oneOf":[{"type":"string","description":"The phone number; `null` clears it.","maxLength":50,"uniqueKey":"\\items.items.[INDEX].phone.oneOf.0","typeLabel":"string"},{"type":"null","description":"The phone number; `null` clears it.","uniqueKey":"\\items.items.[INDEX].phone.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].phone","typeLabel":"string | null"},"jobTitle":{"oneOf":[{"type":"string","description":"The job title; `null` clears it.","maxLength":255,"uniqueKey":"\\items.items.[INDEX].jobTitle.oneOf.0","typeLabel":"string"},{"type":"null","description":"The job title; `null` clears it.","uniqueKey":"\\items.items.[INDEX].jobTitle.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].jobTitle","typeLabel":"string | null"},"ownerUserId":{"oneOf":[{"type":"string","description":"The owning member, by user id; `null` clears it. List the members, and their ids, with `GET /v1/workspace-members` (needs `crm:write`).","format":"uuid","pattern":"^([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})$","uniqueKey":"\\items.items.[INDEX].ownerUserId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","description":"The owning member, by user id; `null` clears it. List the members, and their ids, with `GET /v1/workspace-members` (needs `crm:write`).","uniqueKey":"\\items.items.[INDEX].ownerUserId.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].ownerUserId","typeLabel":"string\u003cuuid> | null"},"companyId":{"oneOf":[{"type":"string","description":"The company the contact works for; `null` unlinks it.","format":"uuid","pattern":"^([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})$","uniqueKey":"\\items.items.[INDEX].companyId.oneOf.0","typeLabel":"string\u003cuuid>"},{"type":"null","description":"The company the contact works for; `null` unlinks it.","uniqueKey":"\\items.items.[INDEX].companyId.oneOf.1","typeLabel":"null"}],"uniqueKey":"\\items.items.[INDEX].companyId","typeLabel":"string\u003cuuid> | null"},"customFields":{"description":"Custom field values to set, by key; the keys left out keep their values.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"oneOf":[{}],"uniqueKey":"\\items.items.[INDEX].customFields.additionalProperties","typeLabel":"any"},"uniqueKey":"\\items.items.[INDEX].customFields","typeLabel":"object"},"expectedUpdatedAt":{"description":"The contact’s `updatedAt` as you read it. When the contact has changed since, the update is refused with 409 `stale_version` and nothing is written. Leave it out to apply the fields you send whatever changed meanwhile.","type":"string","format":"date-time","pattern":"^((\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\d|30)|(02)-(0[1-9]|1\\d|2[0-8])))T([01]\\d|2[0-3]):[0-5]\\d(:[0-5]\\d(\\.\\d+)?)?Z$","uniqueKey":"\\items.items.[INDEX].expectedUpdatedAt","typeLabel":"string\u003cdate-time>"}},"required":["id"],"additionalProperties":false,"description":"One contact to change: its `id` and the fields `contacts.update` takes. A field left out keeps its value.","uniqueKey":"\\items.items.[INDEX]","typeLabel":"object"},"description":"The contacts to change, each by its `id`, 1 to 100. The whole body is checked first: one malformed item refuses the request with 422 `validation_error` at its path, such as `items.3.name`, and nothing is written.","isRequired":true,"uniqueKey":"\\items","typeLabel":"object[]"}},"required":["items"],"additionalProperties":false,"description":"Up to 100 contacts to change.","uniqueKey":"","typeLabel":"object"},"example":{"items":[{"id":"0199a1b2-0000-7000-8000-00000000c101","jobTitle":"CTO"},{"id":"0199a1b2-0000-7000-8000-00000000c104","phone":null,"expectedUpdatedAt":"2026-09-29T08:00:00.000Z"}]},"examples":{"Example":{"title":"Example","value":{"items":[{"id":"0199a1b2-0000-7000-8000-00000000c101","jobTitle":"CTO"},{"id":"0199a1b2-0000-7000-8000-00000000c104","phone":null,"expectedUpdatedAt":"2026-09-29T08:00:00.000Z"}]}}},"exampleType":"examples"}},"exampleType":"examples"},"responses":{"b7d51e91-d82a-4e1d-bf83-8293df3c0245":{"description":"What a bulk write did, item by item.","headers":{"RateLimit":{"description":"What the API key has left under each rate-limit policy that counted this request: a Structured Field list with one `\"\u003cpolicy>\";r=\u003cremaining>;t=\u003cseconds>` item per policy. Read it as a list and honour every item, not only the smallest: continued traffic must satisfy each policy. `t` is the effective window in seconds (IETF RateLimit header fields, draft 11): quota is not guaranteed to be fully restored when it ends. When the answer also carries `Retry-After`, that takes priority. This operation writes many records in one request, so two policies count it: `api-key`, every request the key makes, and `api-key-bulk`, every request to a bulk operation.","schema":{"type":"string"},"example":"\"api-key\";r=599;t=60, \"api-key-bulk\";r=29;t=60"},"RateLimit-Policy":{"description":"The rate-limit policies that counted this request: a Structured Field list with one `\"\u003cpolicy>\";q=\u003crequests>;w=\u003cwindow in seconds>` item per policy. The limits belong to the key, not to the address it calls from. This operation writes many records in one request, so two policies count it: `api-key`, every request the key makes, and `api-key-bulk`, every request to a bulk operation.","schema":{"type":"string"},"example":"\"api-key\";q=600;w=60, \"api-key-bulk\";q=30;w=60"}},"content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","items":{"oneOf":[{"type":"object","description":"A contact a bulk write created or updated.","required":["index","outcome","contact"],"properties":{"index":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The item’s position in `items`, from 0.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.index","typeLabel":"integer"},"outcome":{"type":"string","enum":["created","updated"],"description":"`created` when the item created the contact; `updated` when the fields sent were written to an existing one. A bulk upsert creates when no live contact had the e-mail address; a bulk create only creates and a bulk update only updates.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.outcome","typeLabel":"enum\u003cstring>"},"contact":{"type":"object","properties":{"id":{"type":"string","description":"The contact’s id.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.id","typeLabel":"string"},"workspaceId":{"type":"string","description":"The workspace the contact belongs to.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.workspaceId","typeLabel":"string"},"firstName":{"oneOf":[{"description":"The first name.","type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.firstName.oneOf.0","typeLabel":"string"},{"description":"The first name.","type":"null","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.firstName.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.firstName","typeLabel":"string | null"},"lastName":{"oneOf":[{"description":"The last name.","type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.lastName.oneOf.0","typeLabel":"string"},{"description":"The last name.","type":"null","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.lastName.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.lastName","typeLabel":"string | null"},"email":{"oneOf":[{"description":"The e-mail address, lower-cased.","type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.email.oneOf.0","typeLabel":"string"},{"description":"The e-mail address, lower-cased.","type":"null","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.email.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.email","typeLabel":"string | null"},"phone":{"oneOf":[{"description":"The phone number.","type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.phone.oneOf.0","typeLabel":"string"},{"description":"The phone number.","type":"null","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.phone.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.phone","typeLabel":"string | null"},"jobTitle":{"oneOf":[{"description":"The job title.","type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.jobTitle.oneOf.0","typeLabel":"string"},{"description":"The job title.","type":"null","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.jobTitle.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.jobTitle","typeLabel":"string | null"},"ownerUserId":{"oneOf":[{"description":"The member who owns the contact, by user id. List the members, and their ids, with `GET /v1/workspace-members` (needs `crm:write`).","type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.ownerUserId.oneOf.0","typeLabel":"string"},{"description":"The member who owns the contact, by user id. List the members, and their ids, with `GET /v1/workspace-members` (needs `crm:write`).","type":"null","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.ownerUserId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.ownerUserId","typeLabel":"string | null"},"companyId":{"oneOf":[{"description":"The company the contact works for.","type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.companyId.oneOf.0","typeLabel":"string"},{"description":"The company the contact works for.","type":"null","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.companyId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.companyId","typeLabel":"string | null"},"customFields":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"oneOf":[{}],"uniqueKey":"results.items.[INDEX].oneOf.0.contact.customFields.additionalProperties","typeLabel":"any"},"description":"Custom field values, by the custom field’s key.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.customFields","typeLabel":"object"},"createdBy":{"oneOf":[{"description":"The user who created the contact; `null` when an API key did.","type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.createdBy.oneOf.0","typeLabel":"string"},{"description":"The user who created the contact; `null` when an API key did.","type":"null","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.createdBy.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.createdBy","typeLabel":"string | null"},"updatedBy":{"oneOf":[{"description":"The user who changed the contact last.","type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.updatedBy.oneOf.0","typeLabel":"string"},{"description":"The user who changed the contact last.","type":"null","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.updatedBy.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.updatedBy","typeLabel":"string | null"},"createdAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"When the contact was created.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.createdAt","typeLabel":"string\u003cdate-time>"},"updatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","description":"When the contact last changed. Send it back as `expectedUpdatedAt` to update safely.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.updatedAt","typeLabel":"string\u003cdate-time>"},"deletedAt":{"oneOf":[{"type":"string","description":"When the contact was deleted; `null` while it is live.","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.deletedAt.oneOf.0","typeLabel":"string\u003cdate-time>"},{"type":"null","description":"When the contact was deleted; `null` while it is live.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.deletedAt.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.deletedAt","typeLabel":"string\u003cdate-time> | null"},"company":{"oneOf":[{"type":"object","description":"With `include=company`: the linked company, or `null` when there is none or it is deleted.","required":["id","name","domain"],"properties":{"id":{"type":"string","description":"The company’s id.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.company.oneOf.0.id","typeLabel":"string"},"name":{"type":"string","description":"The company’s name.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.company.oneOf.0.name","typeLabel":"string"},"domain":{"oneOf":[{"description":"The company’s domain, such as `example.com`.","type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.company.oneOf.0.domain.oneOf.0","typeLabel":"string"},{"description":"The company’s domain, such as `example.com`.","type":"null","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.company.oneOf.0.domain.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.company.oneOf.0.domain","typeLabel":"string | null"}},"additionalProperties":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.company.oneOf.0","typeLabel":"object"},{"type":"null","description":"With `include=company`: the linked company, or `null` when there is none or it is deleted.","uniqueKey":"results.items.[INDEX].oneOf.0.contact.company.oneOf.1","typeLabel":"null"}],"uniqueKey":"results.items.[INDEX].oneOf.0.contact.company","typeLabel":"object | null"},"enrichmentCells":{"description":"With `include=enrichmentCells`: each enrichment column’s state for this record, by column id.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"definitionId":{"type":"string","description":"The column’s id.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.enrichmentCells.additionalProperties.definitionId","typeLabel":"string"},"fieldId":{"type":"string","description":"The custom field the column writes its value into.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.enrichmentCells.additionalProperties.fieldId","typeLabel":"string"},"status":{"type":"string","enum":["empty","queued","running","succeeded","failed","skipped","stale"],"description":"Where the cell stands: `empty`, `queued`, `running`, `succeeded`, `failed`, `skipped` or `stale`.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.enrichmentCells.additionalProperties.status","typeLabel":"enum\u003cstring>"},"lastErrorCode":{"oneOf":[{"description":"Why the last attempt failed, as a stable code; `null` when it did not.","type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.enrichmentCells.additionalProperties.lastErrorCode.oneOf.0","typeLabel":"string"},{"description":"Why the last attempt failed, as a stable code; `null` when it did not.","type":"null","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.enrichmentCells.additionalProperties.lastErrorCode.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.enrichmentCells.additionalProperties.lastErrorCode","typeLabel":"string | null"},"lastAppliedAt":{"oneOf":[{"description":"When a value was last written into the field, as an ISO 8601 instant.","type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.enrichmentCells.additionalProperties.lastAppliedAt.oneOf.0","typeLabel":"string"},{"description":"When a value was last written into the field, as an ISO 8601 instant.","type":"null","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.enrichmentCells.additionalProperties.lastAppliedAt.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.enrichmentCells.additionalProperties.lastAppliedAt","typeLabel":"string | null"},"latestRunId":{"oneOf":[{"description":"The run that last worked on this cell; `null` when none has.","type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.enrichmentCells.additionalProperties.latestRunId.oneOf.0","typeLabel":"string"},{"description":"The run that last worked on this cell; `null` when none has.","type":"null","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.enrichmentCells.additionalProperties.latestRunId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.enrichmentCells.additionalProperties.latestRunId","typeLabel":"string | null"}},"required":["definitionId","fieldId","status","lastErrorCode","lastAppliedAt","latestRunId"],"additionalProperties":true,"description":"The state of one enrichment column for one record. The value is in its field.","uniqueKey":"results.items.[INDEX].oneOf.0.contact.enrichmentCells.additionalProperties","typeLabel":"object"},"uniqueKey":"results.items.[INDEX].oneOf.0.contact.enrichmentCells","typeLabel":"object"},"formulaCells":{"description":"With `include=formulaCells`: each formula column’s state, by column id.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"definitionId":{"type":"string","description":"The column’s id.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.formulaCells.additionalProperties.definitionId","typeLabel":"string"},"fieldId":{"type":"string","description":"The custom field the column writes its value into.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.formulaCells.additionalProperties.fieldId","typeLabel":"string"},"status":{"type":"string","enum":["empty","queued","running","succeeded","failed","skipped","stale"],"description":"Where the cell stands: `empty`, `queued`, `running`, `succeeded`, `failed`, `skipped` or `stale`.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.formulaCells.additionalProperties.status","typeLabel":"enum\u003cstring>"},"lastErrorCode":{"oneOf":[{"description":"Why the last attempt failed, as a stable code; `null` when it did not.","type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.formulaCells.additionalProperties.lastErrorCode.oneOf.0","typeLabel":"string"},{"description":"Why the last attempt failed, as a stable code; `null` when it did not.","type":"null","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.formulaCells.additionalProperties.lastErrorCode.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.formulaCells.additionalProperties.lastErrorCode","typeLabel":"string | null"},"lastAppliedAt":{"oneOf":[{"description":"When a value was last written into the field, as an ISO 8601 instant.","type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.formulaCells.additionalProperties.lastAppliedAt.oneOf.0","typeLabel":"string"},{"description":"When a value was last written into the field, as an ISO 8601 instant.","type":"null","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.formulaCells.additionalProperties.lastAppliedAt.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.formulaCells.additionalProperties.lastAppliedAt","typeLabel":"string | null"}},"required":["definitionId","fieldId","status","lastErrorCode","lastAppliedAt"],"additionalProperties":true,"description":"The state of one formula column for one record. The value is in its field.","uniqueKey":"results.items.[INDEX].oneOf.0.contact.formulaCells.additionalProperties","typeLabel":"object"},"uniqueKey":"results.items.[INDEX].oneOf.0.contact.formulaCells","typeLabel":"object"},"customApiCells":{"description":"With `include=customApiCells`: each custom-API column’s state, by column id.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"definitionId":{"type":"string","description":"The column’s id.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.customApiCells.additionalProperties.definitionId","typeLabel":"string"},"fieldId":{"type":"string","description":"The custom field the column writes its value into.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.customApiCells.additionalProperties.fieldId","typeLabel":"string"},"status":{"type":"string","enum":["empty","queued","running","succeeded","failed","skipped","stale"],"description":"Where the cell stands: `empty`, `queued`, `running`, `succeeded`, `failed`, `skipped` or `stale`.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.customApiCells.additionalProperties.status","typeLabel":"enum\u003cstring>"},"lastErrorCode":{"oneOf":[{"description":"Why the last attempt failed, as a stable code; `null` when it did not.","type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.customApiCells.additionalProperties.lastErrorCode.oneOf.0","typeLabel":"string"},{"description":"Why the last attempt failed, as a stable code; `null` when it did not.","type":"null","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.customApiCells.additionalProperties.lastErrorCode.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.customApiCells.additionalProperties.lastErrorCode","typeLabel":"string | null"},"lastAppliedAt":{"oneOf":[{"description":"When a value was last written into the field, as an ISO 8601 instant.","type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.customApiCells.additionalProperties.lastAppliedAt.oneOf.0","typeLabel":"string"},{"description":"When a value was last written into the field, as an ISO 8601 instant.","type":"null","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.customApiCells.additionalProperties.lastAppliedAt.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.customApiCells.additionalProperties.lastAppliedAt","typeLabel":"string | null"},"latestRunId":{"oneOf":[{"description":"The run that last worked on this cell; `null` when none has.","type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.customApiCells.additionalProperties.latestRunId.oneOf.0","typeLabel":"string"},{"description":"The run that last worked on this cell; `null` when none has.","type":"null","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.customApiCells.additionalProperties.latestRunId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.customApiCells.additionalProperties.latestRunId","typeLabel":"string | null"}},"required":["definitionId","fieldId","status","lastErrorCode","lastAppliedAt","latestRunId"],"additionalProperties":true,"description":"The state of one custom-API column for one record. The value is in its field.","uniqueKey":"results.items.[INDEX].oneOf.0.contact.customApiCells.additionalProperties","typeLabel":"object"},"uniqueKey":"results.items.[INDEX].oneOf.0.contact.customApiCells","typeLabel":"object"},"agentCells":{"description":"With `include=agentCells`: each agent column’s state, by column id.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"object","properties":{"definitionId":{"type":"string","description":"The column’s id.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.agentCells.additionalProperties.definitionId","typeLabel":"string"},"fieldId":{"type":"string","description":"The custom field the column writes its value into.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.agentCells.additionalProperties.fieldId","typeLabel":"string"},"status":{"type":"string","enum":["empty","queued","running","succeeded","failed","skipped","stale"],"description":"Where the cell stands: `empty`, `queued`, `running`, `succeeded`, `failed`, `skipped` or `stale`.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.agentCells.additionalProperties.status","typeLabel":"enum\u003cstring>"},"lastErrorCode":{"oneOf":[{"description":"Why the last attempt failed, as a stable code; `null` when it did not.","type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.agentCells.additionalProperties.lastErrorCode.oneOf.0","typeLabel":"string"},{"description":"Why the last attempt failed, as a stable code; `null` when it did not.","type":"null","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.agentCells.additionalProperties.lastErrorCode.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.agentCells.additionalProperties.lastErrorCode","typeLabel":"string | null"},"lastAppliedAt":{"oneOf":[{"description":"When a value was last written into the field, as an ISO 8601 instant.","type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.agentCells.additionalProperties.lastAppliedAt.oneOf.0","typeLabel":"string"},{"description":"When a value was last written into the field, as an ISO 8601 instant.","type":"null","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.agentCells.additionalProperties.lastAppliedAt.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.agentCells.additionalProperties.lastAppliedAt","typeLabel":"string | null"},"latestRunId":{"oneOf":[{"description":"The run that last worked on this cell; `null` when none has.","type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.agentCells.additionalProperties.latestRunId.oneOf.0","typeLabel":"string"},{"description":"The run that last worked on this cell; `null` when none has.","type":"null","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.agentCells.additionalProperties.latestRunId.oneOf.1","typeLabel":"null"}],"isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact.agentCells.additionalProperties.latestRunId","typeLabel":"string | null"}},"required":["definitionId","fieldId","status","lastErrorCode","lastAppliedAt","latestRunId"],"additionalProperties":true,"description":"The state of one agent column for one record. The value is in its field.","uniqueKey":"results.items.[INDEX].oneOf.0.contact.agentCells.additionalProperties","typeLabel":"object"},"uniqueKey":"results.items.[INDEX].oneOf.0.contact.agentCells","typeLabel":"object"}},"required":["id","workspaceId","firstName","lastName","email","phone","jobTitle","ownerUserId","companyId","customFields","createdBy","updatedBy","createdAt","updatedAt","deletedAt"],"additionalProperties":true,"description":"The contact as it is now.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.0.contact","typeLabel":"object"}},"additionalProperties":true,"uniqueKey":"results.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"A bulk item that failed on its own.","required":["index","outcome","error"],"properties":{"index":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"The item’s position in `items`, from 0.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.1.index","typeLabel":"integer"},"outcome":{"type":"string","const":"failed","description":"The item was not written; nothing changed for it.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.1.outcome","typeLabel":"string"},"error":{"type":"object","properties":{"code":{"type":"string","x-extensible-enum":["malformed_json","invalid_sort","unauthenticated","insufficient_scope","permission_denied","beta_access_required","not_a_member","not_found","method_not_allowed","conflict","stale_version","idempotency_key_reused","request_in_flight","company_twin_research_already_running","company_twin_own_domain_conflict","concurrent_run_limit","gone","payload_too_large","unsupported_media_type","validation_error","rate_limited","internal_error","response_contract_violation","service_unavailable"],"description":"A stable, machine-readable code such as `not_found`. Branch on this, not on `message`. The known values are every code a public operation answers; more may be added, so handle an unknown one by its HTTP status.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.1.error.code","typeLabel":"string"},"message":{"type":"string","description":"A human-readable explanation. It may change; do not parse it.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.1.error.message","typeLabel":"string"},"requestId":{"type":"string","description":"The id of the request that failed. Quote it when you contact support.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.1.error.requestId","typeLabel":"string"},"details":{"description":"Structured detail for some codes. For `validation_error` it is usually an array with one entry per problem: `path` (the field, dotted), `message` and, where the case has a name, `code` (such as `related_record_not_found`). Other codes that cover several cases carry an object whose `code` names the case (such as `invalid_cursor`).","uniqueKey":"results.items.[INDEX].oneOf.1.error.details","typeLabel":"any"}},"required":["code","message","requestId"],"additionalProperties":true,"description":"Why, as the error envelope says it: the `code`, `message` and `details` the single call would have answered for this item, and the request’s `requestId`.","isRequired":true,"uniqueKey":"results.items.[INDEX].oneOf.1.error","typeLabel":"object"}},"additionalProperties":true,"uniqueKey":"results.items.[INDEX].oneOf.1","typeLabel":"object"}],"uniqueKey":"results.items.[INDEX]","typeLabel":"object"},"description":"One result per item, in the order of `items`.","isRequired":true,"uniqueKey":"results","typeLabel":"object[]"},"created":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"How many items created a record.","isRequired":true,"uniqueKey":"created","typeLabel":"integer"},"updated":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"How many items updated a record.","isRequired":true,"uniqueKey":"updated","typeLabel":"integer"},"failed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"How many items failed.","isRequired":true,"uniqueKey":"failed","typeLabel":"integer"}},"required":["results","created","updated","failed"],"additionalProperties":true,"description":"What a bulk write did, item by item.","uniqueKey":"","typeLabel":"object"},"example":{"results":[{"index":0,"outcome":"updated","contact":{"id":"0199a1b2-0000-7000-8000-00000000c101","workspaceId":"0199a1b2-0000-7000-8000-00000000b001","firstName":"Ada","lastName":"Lovelace","email":"ada@example.com","phone":"+43 1 234 5678","jobTitle":"CTO","ownerUserId":"0199a1b2-0000-7000-8000-00000000c001","companyId":"0199a1b2-0000-7000-8000-00000000d101","customFields":{"tier":"gold"},"createdBy":"0199a1b2-0000-7000-8000-00000000c001","updatedBy":"0199a1b2-0000-7000-8000-00000000c001","createdAt":"2026-09-29T08:00:00.000Z","updatedAt":"2026-09-30T09:30:00.000Z","deletedAt":null}},{"index":1,"outcome":"failed","error":{"code":"stale_version","message":"This record changed since it was read; re-read it and retry","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10","details":{"resourceType":"contact","resourceId":"0199a1b2-0000-7000-8000-00000000c104","currentUpdatedAt":"2026-09-30T09:30:00.000Z"}}}],"created":0,"updated":1,"failed":1},"examples":{"Example":{"title":"Example","value":{"results":[{"index":0,"outcome":"updated","contact":{"id":"0199a1b2-0000-7000-8000-00000000c101","workspaceId":"0199a1b2-0000-7000-8000-00000000b001","firstName":"Ada","lastName":"Lovelace","email":"ada@example.com","phone":"+43 1 234 5678","jobTitle":"CTO","ownerUserId":"0199a1b2-0000-7000-8000-00000000c001","companyId":"0199a1b2-0000-7000-8000-00000000d101","customFields":{"tier":"gold"},"createdBy":"0199a1b2-0000-7000-8000-00000000c001","updatedBy":"0199a1b2-0000-7000-8000-00000000c001","createdAt":"2026-09-29T08:00:00.000Z","updatedAt":"2026-09-30T09:30:00.000Z","deletedAt":null}},{"index":1,"outcome":"failed","error":{"code":"stale_version","message":"This record changed since it was read; re-read it and retry","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10","details":{"resourceType":"contact","resourceId":"0199a1b2-0000-7000-8000-00000000c104","currentUpdatedAt":"2026-09-30T09:30:00.000Z"}}}],"created":0,"updated":1,"failed":1}}},"exampleType":"examples"}},"exampleType":"examples"},"92282cba-6efc-4e4b-9b9b-291813420811":{"description":"The request could not be read. Branch on `error.code`; quote `error.requestId` to support.\n\nThe codes a public operation answers with it:\n\n- `malformed_json`: The body is not valid JSON, or is empty while `Content-Type` is `application/json`. Send valid JSON; omit `Content-Type` when there is no body.\n- `invalid_sort`: A sort names a field or direction the list does not support. Sort only by the fields the operation lists.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","x-extensible-enum":["malformed_json","invalid_sort","unauthenticated","insufficient_scope","permission_denied","beta_access_required","not_a_member","not_found","method_not_allowed","conflict","stale_version","idempotency_key_reused","request_in_flight","company_twin_research_already_running","company_twin_own_domain_conflict","concurrent_run_limit","gone","payload_too_large","unsupported_media_type","validation_error","rate_limited","internal_error","response_contract_violation","service_unavailable"],"description":"A stable, machine-readable code such as `not_found`. Branch on this, not on `message`. The known values are every code a public operation answers; more may be added, so handle an unknown one by its HTTP status.","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"A human-readable explanation. It may change; do not parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","description":"The id of the request that failed. Quote it when you contact support.","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"},"details":{"description":"Structured detail for some codes. For `validation_error` it is usually an array with one entry per problem: `path` (the field, dotted), `message` and, where the case has a name, `code` (such as `related_record_not_found`). Other codes that cover several cases carry an object whose `code` names the case (such as `invalid_cursor`).","uniqueKey":"error.details","typeLabel":"any"}},"required":["code","message","requestId"],"additionalProperties":true,"description":"What went wrong: the code to branch on, a message and the request id.","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"additionalProperties":true,"description":"The body of every error response.","uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"malformed_json","message":"Bad Request","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"malformed_json","message":"Bad Request","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"}}}},"exampleType":"examples"}},"exampleType":"examples"},"5f0fb6cd-29c5-465d-bf76-00215f8cdc08":{"description":"The request is not authenticated. Branch on `error.code`; quote `error.requestId` to support.\n\nThe codes a public operation answers with it:\n\n- `unauthenticated`: The key is missing, invalid, expired or revoked. Send a valid, unexpired key.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","x-extensible-enum":["malformed_json","invalid_sort","unauthenticated","insufficient_scope","permission_denied","beta_access_required","not_a_member","not_found","method_not_allowed","conflict","stale_version","idempotency_key_reused","request_in_flight","company_twin_research_already_running","company_twin_own_domain_conflict","concurrent_run_limit","gone","payload_too_large","unsupported_media_type","validation_error","rate_limited","internal_error","response_contract_violation","service_unavailable"],"description":"A stable, machine-readable code such as `not_found`. Branch on this, not on `message`. The known values are every code a public operation answers; more may be added, so handle an unknown one by its HTTP status.","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"A human-readable explanation. It may change; do not parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","description":"The id of the request that failed. Quote it when you contact support.","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"},"details":{"description":"Structured detail for some codes. For `validation_error` it is usually an array with one entry per problem: `path` (the field, dotted), `message` and, where the case has a name, `code` (such as `related_record_not_found`). Other codes that cover several cases carry an object whose `code` names the case (such as `invalid_cursor`).","uniqueKey":"error.details","typeLabel":"any"}},"required":["code","message","requestId"],"additionalProperties":true,"description":"What went wrong: the code to branch on, a message and the request id.","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"additionalProperties":true,"description":"The body of every error response.","uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"unauthenticated","message":"Unauthorized","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"unauthenticated","message":"Unauthorized","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"}}}},"exampleType":"examples"}},"exampleType":"examples"},"52a3dd7a-7d48-4b95-999a-2e7ae144aebf":{"description":"The caller may not do this. Branch on `error.code`; quote `error.requestId` to support.\n\nThe codes a public operation answers with it:\n\n- `insufficient_scope`: The key lacks a scope the operation, or a parameter such as `include` or `rankingMode`, needs. `details.missingScopes` names it; `WWW-Authenticate` lists every scope the request needs. Create a key with the missing scope.\n- `permission_denied`: The key’s scopes admit the operation, but its permissions do not cover this request: replaying a create needs `crm:read`, and a key keeps the permissions its scopes had when it was created. The message names the scope. Create a new key with the scope the message names.\n- `beta_access_required`: The workspace is not admitted to the beta, which every write except `feedback.submit` needs. Contact support.\n- `not_a_member`: `websiteOnboarding.getAccess`: the key’s workspace has been deleted. Use a key of a live workspace.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","x-extensible-enum":["malformed_json","invalid_sort","unauthenticated","insufficient_scope","permission_denied","beta_access_required","not_a_member","not_found","method_not_allowed","conflict","stale_version","idempotency_key_reused","request_in_flight","company_twin_research_already_running","company_twin_own_domain_conflict","concurrent_run_limit","gone","payload_too_large","unsupported_media_type","validation_error","rate_limited","internal_error","response_contract_violation","service_unavailable"],"description":"A stable, machine-readable code such as `not_found`. Branch on this, not on `message`. The known values are every code a public operation answers; more may be added, so handle an unknown one by its HTTP status.","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"A human-readable explanation. It may change; do not parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","description":"The id of the request that failed. Quote it when you contact support.","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"},"details":{"description":"Structured detail for some codes. For `validation_error` it is usually an array with one entry per problem: `path` (the field, dotted), `message` and, where the case has a name, `code` (such as `related_record_not_found`). Other codes that cover several cases carry an object whose `code` names the case (such as `invalid_cursor`).","uniqueKey":"error.details","typeLabel":"any"}},"required":["code","message","requestId"],"additionalProperties":true,"description":"What went wrong: the code to branch on, a message and the request id.","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"additionalProperties":true,"description":"The body of every error response.","uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"insufficient_scope","message":"Forbidden","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"insufficient_scope","message":"Forbidden","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"}}}},"exampleType":"examples"}},"exampleType":"examples"},"1c25ec88-0d3a-4292-9dc7-3cbeb5ec1f00":{"description":"The request conflicts with the current state. Branch on `error.code`; quote `error.requestId` to support.\n\nThe codes a public operation answers with it:\n\n- `conflict`: The request clashes with the current state, such as a duplicate domain or e-mail, a changed setup or a ranked list that changed. `details.code` names the case where there is one. Read fresh state, then decide.\n- `stale_version`: The record changed since the `expectedUpdatedAt` you sent. `details.currentUpdatedAt` is its current version. Read the record again and reapply your change.\n- `idempotency_key_reused`: The `Idempotency-Key` was used for a different command or body. Use a new key for a new command.\n- `request_in_flight`: The first request with this `Idempotency-Key` is still running. Retry shortly with the same key.\n- `company_twin_research_already_running`: `websiteOnboarding.confirmProfile`: research for this setup or website is already running. Read fresh setup state.\n- `company_twin_own_domain_conflict`: `websiteOnboarding.confirmProfile`: the website does not match the workspace’s company profile. Read fresh setup state, then confirm the profile with its own website.\n- `concurrent_run_limit`: `companyDiscoveryJobs.start` by an API key: the workspace already has as many discovery jobs queued or running as a key may start beside. `details.code` names the cap. Wait for a job to finish, or cancel one, then start again.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","x-extensible-enum":["malformed_json","invalid_sort","unauthenticated","insufficient_scope","permission_denied","beta_access_required","not_a_member","not_found","method_not_allowed","conflict","stale_version","idempotency_key_reused","request_in_flight","company_twin_research_already_running","company_twin_own_domain_conflict","concurrent_run_limit","gone","payload_too_large","unsupported_media_type","validation_error","rate_limited","internal_error","response_contract_violation","service_unavailable"],"description":"A stable, machine-readable code such as `not_found`. Branch on this, not on `message`. The known values are every code a public operation answers; more may be added, so handle an unknown one by its HTTP status.","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"A human-readable explanation. It may change; do not parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","description":"The id of the request that failed. Quote it when you contact support.","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"},"details":{"description":"Structured detail for some codes. For `validation_error` it is usually an array with one entry per problem: `path` (the field, dotted), `message` and, where the case has a name, `code` (such as `related_record_not_found`). Other codes that cover several cases carry an object whose `code` names the case (such as `invalid_cursor`).","uniqueKey":"error.details","typeLabel":"any"}},"required":["code","message","requestId"],"additionalProperties":true,"description":"What went wrong: the code to branch on, a message and the request id.","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"additionalProperties":true,"description":"The body of every error response.","uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"conflict","message":"Conflict","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"conflict","message":"Conflict","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"}}}},"exampleType":"examples"}},"exampleType":"examples"},"c097ea21-988b-4530-a000-ce0c07033569":{"description":"The body is over the size limit. Branch on `error.code`; quote `error.requestId` to support.\n\nThe codes a public operation answers with it:\n\n- `payload_too_large`: The body is over the size limit, currently 1 MiB. Send a smaller body.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","x-extensible-enum":["malformed_json","invalid_sort","unauthenticated","insufficient_scope","permission_denied","beta_access_required","not_a_member","not_found","method_not_allowed","conflict","stale_version","idempotency_key_reused","request_in_flight","company_twin_research_already_running","company_twin_own_domain_conflict","concurrent_run_limit","gone","payload_too_large","unsupported_media_type","validation_error","rate_limited","internal_error","response_contract_violation","service_unavailable"],"description":"A stable, machine-readable code such as `not_found`. Branch on this, not on `message`. The known values are every code a public operation answers; more may be added, so handle an unknown one by its HTTP status.","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"A human-readable explanation. It may change; do not parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","description":"The id of the request that failed. Quote it when you contact support.","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"},"details":{"description":"Structured detail for some codes. For `validation_error` it is usually an array with one entry per problem: `path` (the field, dotted), `message` and, where the case has a name, `code` (such as `related_record_not_found`). Other codes that cover several cases carry an object whose `code` names the case (such as `invalid_cursor`).","uniqueKey":"error.details","typeLabel":"any"}},"required":["code","message","requestId"],"additionalProperties":true,"description":"What went wrong: the code to branch on, a message and the request id.","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"additionalProperties":true,"description":"The body of every error response.","uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"payload_too_large","message":"Payload Too Large","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"payload_too_large","message":"Payload Too Large","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"}}}},"exampleType":"examples"}},"exampleType":"examples"},"31f51777-3121-49b1-883a-df13de59f400":{"description":"The body’s media type cannot be read. Branch on `error.code`; quote `error.requestId` to support.\n\nThe codes a public operation answers with it:\n\n- `unsupported_media_type`: The `Content-Type` header is not a media type. Send `Content-Type: application/json`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","x-extensible-enum":["malformed_json","invalid_sort","unauthenticated","insufficient_scope","permission_denied","beta_access_required","not_a_member","not_found","method_not_allowed","conflict","stale_version","idempotency_key_reused","request_in_flight","company_twin_research_already_running","company_twin_own_domain_conflict","concurrent_run_limit","gone","payload_too_large","unsupported_media_type","validation_error","rate_limited","internal_error","response_contract_violation","service_unavailable"],"description":"A stable, machine-readable code such as `not_found`. Branch on this, not on `message`. The known values are every code a public operation answers; more may be added, so handle an unknown one by its HTTP status.","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"A human-readable explanation. It may change; do not parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","description":"The id of the request that failed. Quote it when you contact support.","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"},"details":{"description":"Structured detail for some codes. For `validation_error` it is usually an array with one entry per problem: `path` (the field, dotted), `message` and, where the case has a name, `code` (such as `related_record_not_found`). Other codes that cover several cases carry an object whose `code` names the case (such as `invalid_cursor`).","uniqueKey":"error.details","typeLabel":"any"}},"required":["code","message","requestId"],"additionalProperties":true,"description":"What went wrong: the code to branch on, a message and the request id.","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"additionalProperties":true,"description":"The body of every error response.","uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"unsupported_media_type","message":"Unsupported Media Type","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"unsupported_media_type","message":"Unsupported Media Type","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"}}}},"exampleType":"examples"}},"exampleType":"examples"},"7c6cbb36-2643-45d0-9c50-7dcb22b29707":{"description":"The request cannot be used as sent. Branch on `error.code`; quote `error.requestId` to support.\n\nThe codes a public operation answers with it:\n\n- `validation_error`: The request does not match the operation’s schema, a field names something that does not exist, or a value cannot be used, such as an id that is not a UUID, a date outside the years 0001–9999 in a filter, or an edited cursor. See `details`. Fix the request.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","x-extensible-enum":["malformed_json","invalid_sort","unauthenticated","insufficient_scope","permission_denied","beta_access_required","not_a_member","not_found","method_not_allowed","conflict","stale_version","idempotency_key_reused","request_in_flight","company_twin_research_already_running","company_twin_own_domain_conflict","concurrent_run_limit","gone","payload_too_large","unsupported_media_type","validation_error","rate_limited","internal_error","response_contract_violation","service_unavailable"],"description":"A stable, machine-readable code such as `not_found`. Branch on this, not on `message`. The known values are every code a public operation answers; more may be added, so handle an unknown one by its HTTP status.","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"A human-readable explanation. It may change; do not parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","description":"The id of the request that failed. Quote it when you contact support.","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"},"details":{"description":"Structured detail for some codes. For `validation_error` it is usually an array with one entry per problem: `path` (the field, dotted), `message` and, where the case has a name, `code` (such as `related_record_not_found`). Other codes that cover several cases carry an object whose `code` names the case (such as `invalid_cursor`).","uniqueKey":"error.details","typeLabel":"any"}},"required":["code","message","requestId"],"additionalProperties":true,"description":"What went wrong: the code to branch on, a message and the request id.","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"additionalProperties":true,"description":"The body of every error response.","uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"validation_error","message":"Unprocessable Entity","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"validation_error","message":"Unprocessable Entity","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"}}}},"exampleType":"examples"}},"exampleType":"examples"},"106cbafc-9abb-4464-9a37-dfc7fbea4d3f":{"description":"Too many requests (`error.code` is `rate_limited`): the API key spent a rate-limit policy, or the network it calls from presented too many invalid keys. Wait `Retry-After` seconds before retrying; it takes priority over `RateLimit`.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. It takes priority over the `t` of every `RateLimit` item.","schema":{"type":"integer","minimum":1},"example":60},"RateLimit":{"description":"What the API key has left under each rate-limit policy that counted this request: a Structured Field list with one `\"\u003cpolicy>\";r=\u003cremaining>;t=\u003cseconds>` item per policy. Read it as a list and honour every item, not only the smallest: continued traffic must satisfy each policy. `t` is the effective window in seconds (IETF RateLimit header fields, draft 11): quota is not guaranteed to be fully restored when it ends. When the answer also carries `Retry-After`, that takes priority. This operation writes many records in one request, so two policies count it: `api-key`, every request the key makes, and `api-key-bulk`, every request to a bulk operation.","schema":{"type":"string"},"example":"\"api-key\";r=599;t=60, \"api-key-bulk\";r=29;t=60"},"RateLimit-Policy":{"description":"The rate-limit policies that counted this request: a Structured Field list with one `\"\u003cpolicy>\";q=\u003crequests>;w=\u003cwindow in seconds>` item per policy. The limits belong to the key, not to the address it calls from. This operation writes many records in one request, so two policies count it: `api-key`, every request the key makes, and `api-key-bulk`, every request to a bulk operation.","schema":{"type":"string"},"example":"\"api-key\";q=600;w=60, \"api-key-bulk\";q=30;w=60"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","x-extensible-enum":["malformed_json","invalid_sort","unauthenticated","insufficient_scope","permission_denied","beta_access_required","not_a_member","not_found","method_not_allowed","conflict","stale_version","idempotency_key_reused","request_in_flight","company_twin_research_already_running","company_twin_own_domain_conflict","concurrent_run_limit","gone","payload_too_large","unsupported_media_type","validation_error","rate_limited","internal_error","response_contract_violation","service_unavailable"],"description":"A stable, machine-readable code such as `not_found`. Branch on this, not on `message`. The known values are every code a public operation answers; more may be added, so handle an unknown one by its HTTP status.","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"A human-readable explanation. It may change; do not parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","description":"The id of the request that failed. Quote it when you contact support.","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"},"details":{"description":"Structured detail for some codes. For `validation_error` it is usually an array with one entry per problem: `path` (the field, dotted), `message` and, where the case has a name, `code` (such as `related_record_not_found`). Other codes that cover several cases carry an object whose `code` names the case (such as `invalid_cursor`).","uniqueKey":"error.details","typeLabel":"any"}},"required":["code","message","requestId"],"additionalProperties":true,"description":"What went wrong: the code to branch on, a message and the request id.","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"additionalProperties":true,"description":"The body of every error response.","uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"rate_limited","message":"Too many requests","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"rate_limited","message":"Too many requests","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"}}}},"exampleType":"examples"}},"exampleType":"examples"},"50ec1059-45e2-443d-b306-7fd5e105533f":{"description":"The request failed on the server. Branch on `error.code`; quote `error.requestId` to support.\n\nThe codes a public operation answers with it:\n\n- `internal_error`: Something failed on our side. Retry later; reuse a command’s idempotency key.\n- `response_contract_violation`: Our answer broke its own schema, so it was withheld. `details.committed` says whether a change was saved. If `committed` is true, read the state instead of resending. Quote the request id.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","x-extensible-enum":["malformed_json","invalid_sort","unauthenticated","insufficient_scope","permission_denied","beta_access_required","not_a_member","not_found","method_not_allowed","conflict","stale_version","idempotency_key_reused","request_in_flight","company_twin_research_already_running","company_twin_own_domain_conflict","concurrent_run_limit","gone","payload_too_large","unsupported_media_type","validation_error","rate_limited","internal_error","response_contract_violation","service_unavailable"],"description":"A stable, machine-readable code such as `not_found`. Branch on this, not on `message`. The known values are every code a public operation answers; more may be added, so handle an unknown one by its HTTP status.","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"A human-readable explanation. It may change; do not parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","description":"The id of the request that failed. Quote it when you contact support.","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"},"details":{"description":"Structured detail for some codes. For `validation_error` it is usually an array with one entry per problem: `path` (the field, dotted), `message` and, where the case has a name, `code` (such as `related_record_not_found`). Other codes that cover several cases carry an object whose `code` names the case (such as `invalid_cursor`).","uniqueKey":"error.details","typeLabel":"any"}},"required":["code","message","requestId"],"additionalProperties":true,"description":"What went wrong: the code to branch on, a message and the request id.","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"additionalProperties":true,"description":"The body of every error response.","uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"internal_error","message":"Internal Server Error","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"internal_error","message":"Internal Server Error","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"}}}},"exampleType":"examples"}},"exampleType":"examples"},"2c3d95fa-440c-46bf-94cd-eb510a57d6b5":{"description":"The service is briefly unavailable. Branch on `error.code`; quote `error.requestId` to support.\n\nThe codes a public operation answers with it:\n\n- `service_unavailable`: A create ran out of time, or the service is briefly unavailable. Retry later with the same idempotency key.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","x-extensible-enum":["malformed_json","invalid_sort","unauthenticated","insufficient_scope","permission_denied","beta_access_required","not_a_member","not_found","method_not_allowed","conflict","stale_version","idempotency_key_reused","request_in_flight","company_twin_research_already_running","company_twin_own_domain_conflict","concurrent_run_limit","gone","payload_too_large","unsupported_media_type","validation_error","rate_limited","internal_error","response_contract_violation","service_unavailable"],"description":"A stable, machine-readable code such as `not_found`. Branch on this, not on `message`. The known values are every code a public operation answers; more may be added, so handle an unknown one by its HTTP status.","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"A human-readable explanation. It may change; do not parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","description":"The id of the request that failed. Quote it when you contact support.","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"},"details":{"description":"Structured detail for some codes. For `validation_error` it is usually an array with one entry per problem: `path` (the field, dotted), `message` and, where the case has a name, `code` (such as `related_record_not_found`). Other codes that cover several cases carry an object whose `code` names the case (such as `invalid_cursor`).","uniqueKey":"error.details","typeLabel":"any"}},"required":["code","message","requestId"],"additionalProperties":true,"description":"What went wrong: the code to branch on, a message and the request id.","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"additionalProperties":true,"description":"The body of every error response.","uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"service_unavailable","message":"Service Unavailable","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"service_unavailable","message":"Service Unavailable","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"}}}},"exampleType":"examples"}},"exampleType":"examples"},"b4b3f01c-8318-410f-8852-5b937e2b7868":{"description":"The request failed. Branch on `error.code`; quote `error.requestId` to support.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","x-extensible-enum":["malformed_json","invalid_sort","unauthenticated","insufficient_scope","permission_denied","beta_access_required","not_a_member","not_found","method_not_allowed","conflict","stale_version","idempotency_key_reused","request_in_flight","company_twin_research_already_running","company_twin_own_domain_conflict","concurrent_run_limit","gone","payload_too_large","unsupported_media_type","validation_error","rate_limited","internal_error","response_contract_violation","service_unavailable"],"description":"A stable, machine-readable code such as `not_found`. Branch on this, not on `message`. The known values are every code a public operation answers; more may be added, so handle an unknown one by its HTTP status.","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","description":"A human-readable explanation. It may change; do not parse it.","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"},"requestId":{"type":"string","description":"The id of the request that failed. Quote it when you contact support.","isRequired":true,"uniqueKey":"error.requestId","typeLabel":"string"},"details":{"description":"Structured detail for some codes. For `validation_error` it is usually an array with one entry per problem: `path` (the field, dotted), `message` and, where the case has a name, `code` (such as `related_record_not_found`). Other codes that cover several cases carry an object whose `code` names the case (such as `invalid_cursor`).","uniqueKey":"error.details","typeLabel":"any"}},"required":["code","message","requestId"],"additionalProperties":true,"description":"What went wrong: the code to branch on, a message and the request id.","isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"additionalProperties":true,"description":"The body of every error response.","uniqueKey":"","typeLabel":"object"},"example":{"error":{"code":"not_found","message":"Not found","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"}},"examples":{"Example":{"title":"Example","value":{"error":{"code":"not_found","message":"Not found","requestId":"5b1d3c1e-8d6f-4f2a-9a57-3a9b1f2c7d10"}}}},"exampleType":"examples"}},"exampleType":"examples"}},"security":{"5b87e747-d864-452f-b4e1-e3ff064511dd":{"apiKey":{"type":"http","scheme":"bearer","description":"An Enrik API key, sent as `Authorization: Bearer \u003ckey>`. A key reaches public operations only, and only those whose scopes it holds. A few parameters need a scope beyond their operation’s, which the parameter names. The scopes:\n\n- `setup:read`: Read the workspace setup and its company profile.\n- `setup:run`: Change the setup: confirm the company profile, authorize sponsored drafting and background company research, choose what to set up and complete setup.\n- `workspace:read`: Read the workspace’s own profile: its health summary and setup state.\n- `crm:read`: Read companies with their signals, contacts and the saved views over them.\n- `crm:write`: Create, update and restore companies and contacts, and create, update and delete saved views.\n- `crm:delete`: Delete companies and contacts.\n- `twin:read`: Read the Company Twin: structured company knowledge and its signals.\n- `discovery:read`: Read ICP profiles, ICP assessments, discovery briefs, discovery jobs, candidates and the signal library.\n- `discovery:write`: Create and change ICP profiles, discovery briefs and signal-definition drafts, and review discovery candidates.\n- `discovery:run`: Create, start and cancel discovery jobs, and edit a draft one. Uses provider budget.\n- `enrichment:read`: Read the enrichment configuration and its results, including a record’s enrichment, formula and custom-API cells.\n- `enrichment:run`: Launch and cancel enrichment. Spends enrichment credits.\n- `automation:read`: Read workflows and agents with their run history, including a record’s agent cells.\n- `automation:run`: Run existing workflows and agents.\n- `exports:read`: Read export jobs and the fields an export can carry.\n- `exports:run`: Create, preview, start, cancel and archive CSV exports of companies, contacts and candidates, and download the file. Also needs `crm:read`. Delivering an export to a webhook destination stays in the app.\n- `integrations:read`: Read connections, field mappings, CRM sync jobs and webhook destinations.\n- `webhooks:read`: Read webhook subscriptions, the event types they can name and their delivery log.\n- `webhooks:write`: Subscribe a receiver URL to webhook events; edit, test, pause, resume and archive a subscription and rotate its signing secret; redeliver an event. Only workspace owners and admins can grant it.\n- `reporting:read`: Read analytics and dashboards.\n- `assistant:read`: Read the Assistant: its threads, messages and pending approvals.\n- `assistant:run`: Converse with the Assistant. Uses the workspace’s AI quota.\n- `assistant:write`: Approve or reject the changes the Assistant proposes.","scopes":["crm:write"],"schemeName":"apiKey"}}},"servers":{"d4b75ac2-20fc-4060-84ae-9370689f03ae":{"url":"https://api.enrik.ai","description":"Production"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"An Enrik API key, sent as `Authorization: Bearer \u003ckey>`. A key reaches public operations only, and only those whose scopes it holds. A few parameters need a scope beyond their operation’s, which the parameter names. The scopes:\n\n- `setup:read`: Read the workspace setup and its company profile.\n- `setup:run`: Change the setup: confirm the company profile, authorize sponsored drafting and background company research, choose what to set up and complete setup.\n- `workspace:read`: Read the workspace’s own profile: its health summary and setup state.\n- `crm:read`: Read companies with their signals, contacts and the saved views over them.\n- `crm:write`: Create, update and restore companies and contacts, and create, update and delete saved views.\n- `crm:delete`: Delete companies and contacts.\n- `twin:read`: Read the Company Twin: structured company knowledge and its signals.\n- `discovery:read`: Read ICP profiles, ICP assessments, discovery briefs, discovery jobs, candidates and the signal library.\n- `discovery:write`: Create and change ICP profiles, discovery briefs and signal-definition drafts, and review discovery candidates.\n- `discovery:run`: Create, start and cancel discovery jobs, and edit a draft one. Uses provider budget.\n- `enrichment:read`: Read the enrichment configuration and its results, including a record’s enrichment, formula and custom-API cells.\n- `enrichment:run`: Launch and cancel enrichment. Spends enrichment credits.\n- `automation:read`: Read workflows and agents with their run history, including a record’s agent cells.\n- `automation:run`: Run existing workflows and agents.\n- `exports:read`: Read export jobs and the fields an export can carry.\n- `exports:run`: Create, preview, start, cancel and archive CSV exports of companies, contacts and candidates, and download the file. Also needs `crm:read`. Delivering an export to a webhook destination stays in the app.\n- `integrations:read`: Read connections, field mappings, CRM sync jobs and webhook destinations.\n- `webhooks:read`: Read webhook subscriptions, the event types they can name and their delivery log.\n- `webhooks:write`: Subscribe a receiver URL to webhook events; edit, test, pause, resume and archive a subscription and rotate its signing secret; redeliver an event. Only workspace owners and admins can grant it.\n- `reporting:read`: Read analytics and dashboards.\n- `assistant:read`: Read the Assistant: its threads, messages and pending approvals.\n- `assistant:run`: Converse with the Assistant. Uses the workspace’s AI quota.\n- `assistant:write`: Approve or reject the changes the Assistant proposes.","scopes":["crm:write"],"schemeName":"apiKey"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"An Enrik API key, sent as `Authorization: Bearer \u003ckey>`. A key reaches public operations only, and only those whose scopes it holds. A few parameters need a scope beyond their operation’s, which the parameter names. The scopes:\n\n- `setup:read`: Read the workspace setup and its company profile.\n- `setup:run`: Change the setup: confirm the company profile, authorize sponsored drafting and background company research, choose what to set up and complete setup.\n- `workspace:read`: Read the workspace’s own profile: its health summary and setup state.\n- `crm:read`: Read companies with their signals, contacts and the saved views over them.\n- `crm:write`: Create, update and restore companies and contacts, and create, update and delete saved views.\n- `crm:delete`: Delete companies and contacts.\n- `twin:read`: Read the Company Twin: structured company knowledge and its signals.\n- `discovery:read`: Read ICP profiles, ICP assessments, discovery briefs, discovery jobs, candidates and the signal library.\n- `discovery:write`: Create and change ICP profiles, discovery briefs and signal-definition drafts, and review discovery candidates.\n- `discovery:run`: Create, start and cancel discovery jobs, and edit a draft one. Uses provider budget.\n- `enrichment:read`: Read the enrichment configuration and its results, including a record’s enrichment, formula and custom-API cells.\n- `enrichment:run`: Launch and cancel enrichment. Spends enrichment credits.\n- `automation:read`: Read workflows and agents with their run history, including a record’s agent cells.\n- `automation:run`: Run existing workflows and agents.\n- `exports:read`: Read export jobs and the fields an export can carry.\n- `exports:run`: Create, preview, start, cancel and archive CSV exports of companies, contacts and candidates, and download the file. Also needs `crm:read`. Delivering an export to a webhook destination stays in the app.\n- `integrations:read`: Read connections, field mappings, CRM sync jobs and webhook destinations.\n- `webhooks:read`: Read webhook subscriptions, the event types they can name and their delivery log.\n- `webhooks:write`: Subscribe a receiver URL to webhook events; edit, test, pause, resume and archive a subscription and rotate its signing secret; redeliver an event. Only workspace owners and admins can grant it.\n- `reporting:read`: Read analytics and dashboards.\n- `assistant:read`: Read the Assistant: its threads, messages and pending approvals.\n- `assistant:run`: Converse with the Assistant. Uses the workspace’s AI quota.\n- `assistant:write`: Approve or reject the changes the Assistant proposes.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"apiKey","name":"Authorization"}],"title":"apiKey"}]},"originalFileLocation":"https://api.enrik.ai/v1/openapi.json"},"subdomain":"enrik","siteName":"Enrik","title":"Update up to 100 contacts - Enrik","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-09T15:59:55.987Z","originalFileLocation":"api-reference/contacts/update-up-to-100-contacts.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Changes up to 100 contacts, each item the body contacts.update takes plus the id of the record to change. The body is checked as a whole first: a malformed item refuses the request with 422 validation_error at its path, such as items.3.name, and nothing is written. Then the items run one after another, each in its own transaction, so one that fails leaves the others written: an id that is not a live record of the workspace fails with not_found, and an expectedUpdatedAt the record has changed since fails with stale_version, nothing written for it. The answer is 200 with one result per item, in order, and the counts: a written item has outcome updated and the record; a failed one has outcome failed and an error in the error envelope’s shape, with the code and details contacts.update would have answered. Like contacts.update, it takes no Idempotency-Key: sending the same body again is harmless, though an item sent with expectedUpdatedAt then fails with stale_version when the first request changed the record. A request counts against the api-key-bulk rate-limit policy as well as api-key.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Enrik\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/svg+xml\" sizes=\"180x180\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/enrik/favicon.svg\">\u003clink data-mint-head rel=\"icon\" type=\"image/svg+xml\" sizes=\"32x32\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/enrik/favicon.svg\">\u003clink data-mint-head rel=\"icon\" type=\"image/svg+xml\" sizes=\"16x16\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/enrik/favicon.svg\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/svg+xml\" href=\"https://mintlify.s3.us-west-1.amazonaws.com/enrik/favicon.svg\">\u003cmeta data-mint-head property=\"og:title\" content=\"Update up to 100 contacts - Enrik\">\u003cmeta data-mint-head property=\"og:description\" content=\"Changes up to 100 contacts, each item the body contacts.update takes plus the id of the record to change. The body is checked as a whole first: a malformed item refuses the request with 422 validation_error at its path, such as items.3.name, and nothing is written. Then the items run one after another, each in its own transaction, so one that fails leaves the others written: an id that is not a live record of the workspace fails with not_found, and an expectedUpdatedAt the record has changed since fails with stale_version, nothing written for it. The answer is 200 with one result per item, in order, and the counts: a written item has outcome updated and the record; a failed one has outcome failed and an error in the error envelope’s shape, with the code and details contacts.update would have answered. Like contacts.update, it takes no Idempotency-Key: sending the same body again is harmless, though an item sent with expectedUpdatedAt then fails with stale_version when the first request changed the record. A request counts against the api-key-bulk rate-limit policy as well as api-key.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Enrik\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.enrik.ai/api-reference/contacts/update-up-to-100-contacts\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://enrik.mintlify.site/_mintlify/api/og/v2?division=contacts\u0026amp;title=Update+up+to+100+contacts\u0026amp;description=Changes+up+to+100+contacts%2C+each+item+the+body+%60contacts.update%60+takes+plus+the+%60id%60+of+the+record+to+change.+The+body+is+checked+as+a+whole+first%3A+a+malformed+\u0026amp;theme=1a1b5b8bdbe71a79282f5f36\u0026amp;signature=59f7d9a97dfd5b160f4ca6771321376394f036c3421c8bcdb2c7dd8fa89ea95d\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Update up to 100 contacts - Enrik\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Changes up to 100 contacts, each item the body contacts.update takes plus the id of the record to change. The body is checked as a whole first: a malformed item refuses the request with 422 validation_error at its path, such as items.3.name, and nothing is written. Then the items run one after another, each in its own transaction, so one that fails leaves the others written: an id that is not a live record of the workspace fails with not_found, and an expectedUpdatedAt the record has changed since fails with stale_version, nothing written for it. The answer is 200 with one result per item, in order, and the counts: a written item has outcome updated and the record; a failed one has outcome failed and an error in the error envelope’s shape, with the code and details contacts.update would have answered. Like contacts.update, it takes no Idempotency-Key: sending the same body again is harmless, though an item sent with expectedUpdatedAt then fails with stale_version when the first request changed the record. A request counts against the api-key-bulk rate-limit policy as well as api-key.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://enrik.mintlify.site/_mintlify/api/og/v2?division=contacts\u0026amp;title=Update+up+to+100+contacts\u0026amp;description=Changes+up+to+100+contacts%2C+each+item+the+body+%60contacts.update%60+takes+plus+the+%60id%60+of+the+record+to+change.+The+body+is+checked+as+a+whole+first%3A+a+malformed+\u0026amp;theme=1a1b5b8bdbe71a79282f5f36\u0026amp;signature=59f7d9a97dfd5b160f4ca6771321376394f036c3421c8bcdb2c7dd8fa89ea95d\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"https://mintlify.s3.us-west-1.amazonaws.com/enrik/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Enrik\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#4f46e5\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.enrik.ai/api-reference/contacts/update-up-to-100-contacts\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/contacts/update-up-to-100-contacts.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.enrik.ai/#organization\",\"name\":\"Enrik\",\"url\":\"https://docs.enrik.ai\"},{\"@type\":\"WebSite\",\"@id\":\"https://docs.enrik.ai#website\",\"name\":\"Enrik\",\"url\":\"https://docs.enrik.ai\",\"publisher\":{\"@id\":\"https://docs.enrik.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.enrik.ai/api-reference/contacts/update-up-to-100-contacts#webpage\",\"url\":\"https://docs.enrik.ai/api-reference/contacts/update-up-to-100-contacts\",\"name\":\"Update up to 100 contacts\",\"description\":\"Changes up to 100 contacts, each item the body contacts.update takes plus the id of the record to change. The body is checked as a whole first: a malformed item refuses the request with 422 validation_error at its path, such as items.3.name, and nothing is written. Then the items run one after another, each in its own transaction, so one that fails leaves the others written: an id that is not a live record of the workspace fails with not_found, and an expectedUpdatedAt the record has changed since fails with stale_version, nothing written for it. The answer is 200 with one result per item, in order, and the counts: a written item has outcome updated and the record; a failed one has outcome failed and an error in the error envelope’s shape, with the code and details contacts.update would have answered. Like contacts.update, it takes no Idempotency-Key: sending the same body again is harmless, though an item sent with expectedUpdatedAt then fails with stale_version when the first request changed the record. A request counts against the api-key-bulk rate-limit policy as well as api-key.\",\"dateModified\":\"2026-10-09T15:59:55.987Z\",\"isPartOf\":{\"@id\":\"https://docs.enrik.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.enrik.ai/api-reference/contacts/update-up-to-100-contacts#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.enrik.ai/api-reference/contacts/update-up-to-100-contacts#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"API reference\",\"item\":\"https://docs.enrik.ai/api-reference/introduction\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Endpoints\",\"item\":\"https://docs.enrik.ai/api-reference/companies/list-companies\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"contacts\",\"item\":\"https://docs.enrik.ai/api-reference/contacts/list-contacts\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Update up to 100 contacts\",\"item\":\"https://docs.enrik.ai/api-reference/contacts/update-up-to-100-contacts\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.enrik.ai/api-reference/contacts/update-up-to-100-contacts#apireference\",\"headline\":\"Update up to 100 contacts\",\"name\":\"Update up to 100 contacts\",\"description\":\"Changes up to 100 contacts, each item the body contacts.update takes plus the id of the record to change. The body is checked as a whole first: a malformed item refuses the request with 422 validation_error at its path, such as items.3.name, and nothing is written. Then the items run one after another, each in its own transaction, so one that fails leaves the others written: an id that is not a live record of the workspace fails with not_found, and an expectedUpdatedAt the record has changed since fails with stale_version, nothing written for it. The answer is 200 with one result per item, in order, and the counts: a written item has outcome updated and the record; a failed one has outcome failed and an error in the error envelope’s shape, with the code and details contacts.update would have answered. Like contacts.update, it takes no Idempotency-Key: sending the same body again is harmless, though an item sent with expectedUpdatedAt then fails with stale_version when the first request changed the record. A request counts against the api-key-bulk rate-limit policy as well as api-key.\",\"url\":\"https://docs.enrik.ai/api-reference/contacts/update-up-to-100-contacts\",\"mainEntityOfPage\":{\"@id\":\"https://docs.enrik.ai/api-reference/contacts/update-up-to-100-contacts#webpage\"},\"dateModified\":\"2026-10-09T15:59:55.987Z\",\"publisher\":{\"@id\":\"https://docs.enrik.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.enrik.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Enrik\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Enrik","nav":{"global":null,"groups":[{"group":"Get started","pages":[{"title":"Getting started","href":"/index"},{"title":"Create your workspace","href":"/create-your-workspace"}]},{"group":"Find and qualify companies","pages":[{"title":"Define your ICP","href":"/define-your-icp"},{"title":"Create a source","href":"/create-a-source"},{"title":"Review candidates","href":"/review-candidates"},{"title":"Promote companies","href":"/promote-companies"}]},{"group":"Enrich and act","pages":[{"title":"Run enrichment","href":"/run-enrichment"},{"title":"Use signals","href":"/use-signals"},{"title":"Create activation assets","href":"/create-activation-assets"},{"title":"Export data","href":"/export-data"},{"title":"Sync to HubSpot","href":"/sync-hubspot"}]},{"group":"Power features","pages":[{"title":"Use the Assistant","href":"/use-copilot"},{"title":"Formula columns","href":"/formula-columns"},{"title":"Custom API columns","href":"/custom-api-columns"},{"title":"Workflows","href":"/workflows"},{"title":"AI agents","href":"/ai-agents"}]},{"group":"Account and trust","pages":[{"title":"Billing \u0026 the free trial","href":"/billing-and-trial"},{"title":"Security \u0026 data handling","href":"/security-and-data-handling"},{"title":"FAQ","href":"/faq"}]},{"group":"API reference","pages":[{"title":"Authentication and quick start","href":"/api-reference/introduction"},{"title":"Set up Enrik with an agent","href":"/api-reference/agent-setup"},{"title":"Send feedback about the API","href":"/api-reference/feedback"},{"title":"Versioning and deprecation","href":"/api-reference/versioning"},{"title":"Changelog","href":"/api-reference/changelog"},{"group":"Endpoints","pages":[{"group":"companies","pages":[{"title":"List companies","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/companies","href":"/api-reference/companies/list-companies"},{"title":"Create a company","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/companies","href":"/api-reference/companies/create-a-company"},{"title":"Create up to 100 companies","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/companies/bulk-create","href":"/api-reference/companies/create-up-to-100-companies"},{"title":"Update up to 100 companies","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/companies/bulk-update","href":"/api-reference/companies/update-up-to-100-companies"},{"title":"Create or update up to 100 companies by domain","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/companies/bulk-upsert","href":"/api-reference/companies/create-or-update-up-to-100-companies-by-domain"},{"title":"List deleted companies","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/companies/trash","href":"/api-reference/companies/list-deleted-companies"},{"title":"Create or update a company by domain","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/companies/upsert","href":"/api-reference/companies/create-or-update-a-company-by-domain"},{"title":"Get a company","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/companies/{companyId}","href":"/api-reference/companies/get-a-company"},{"title":"Delete a company","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json delete /v1/companies/{companyId}","href":"/api-reference/companies/delete-a-company"},{"title":"Update a company","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json patch /v1/companies/{companyId}","href":"/api-reference/companies/update-a-company"},{"title":"List a company’s contacts","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/companies/{companyId}/contacts","href":"/api-reference/companies/list-a-company’s-contacts"},{"title":"Get where a company’s fields came from","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/companies/{companyId}/provenance","href":"/api-reference/companies/get-where-a-company’s-fields-came-from"},{"title":"Restore a deleted company","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/companies/{companyId}/restore","href":"/api-reference/companies/restore-a-deleted-company"},{"title":"Get a company’s signal summary","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/companies/{companyId}/signal-summary","href":"/api-reference/companies/get-a-company’s-signal-summary"},{"title":"List a company’s signals","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/companies/{companyId}/signals","href":"/api-reference/companies/list-a-company’s-signals"},{"title":"List a company’s timeline","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/companies/{companyId}/timeline","href":"/api-reference/companies/list-a-company’s-timeline"},{"title":"A company was created","version":null,"deprecated":null,"openapi":"https://api.enrik.ai/v1/openapi.json webhook company.created","href":"/api-reference/companies/a-company-was-created"},{"title":"A company was deleted","version":null,"deprecated":null,"openapi":"https://api.enrik.ai/v1/openapi.json webhook company.deleted","href":"/api-reference/companies/a-company-was-deleted"},{"title":"A company was restored","version":null,"deprecated":null,"openapi":"https://api.enrik.ai/v1/openapi.json webhook company.restored","href":"/api-reference/companies/a-company-was-restored"},{"title":"A company changed","version":null,"deprecated":null,"openapi":"https://api.enrik.ai/v1/openapi.json webhook company.updated","href":"/api-reference/companies/a-company-changed"}]},{"group":"icpAssessments","pages":[{"title":"Get a company’s ICP assessment","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/companies/{companyId}/icp-assessment","href":"/api-reference/icpassessments/get-a-company’s-icp-assessment"}]},{"group":"companyCandidates","pages":[{"title":"List candidates","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/company-candidates","href":"/api-reference/companycandidates/list-candidates"},{"title":"Accept candidates","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/company-candidates/bulk-accept","href":"/api-reference/companycandidates/accept-candidates"},{"title":"Archive candidates","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/company-candidates/bulk-archive","href":"/api-reference/companycandidates/archive-candidates"},{"title":"Promote candidates","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/company-candidates/bulk-promote","href":"/api-reference/companycandidates/promote-candidates"},{"title":"Reject candidates","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/company-candidates/bulk-reject","href":"/api-reference/companycandidates/reject-candidates"},{"title":"Get a candidate","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/company-candidates/{candidateId}","href":"/api-reference/companycandidates/get-a-candidate"},{"title":"Accept a candidate","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/company-candidates/{candidateId}/accept","href":"/api-reference/companycandidates/accept-a-candidate"},{"title":"Archive a candidate","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/company-candidates/{candidateId}/archive","href":"/api-reference/companycandidates/archive-a-candidate"},{"title":"Promote a candidate","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/company-candidates/{candidateId}/promote","href":"/api-reference/companycandidates/promote-a-candidate"},{"title":"Reject a candidate","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/company-candidates/{candidateId}/reject","href":"/api-reference/companycandidates/reject-a-candidate"}]},{"group":"companyDiscoveryJobs","pages":[{"title":"List discovery jobs","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/company-discovery-jobs","href":"/api-reference/companydiscoveryjobs/list-discovery-jobs"},{"title":"Create a discovery job","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/company-discovery-jobs","href":"/api-reference/companydiscoveryjobs/create-a-discovery-job"},{"title":"Get a discovery job","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/company-discovery-jobs/{jobId}","href":"/api-reference/companydiscoveryjobs/get-a-discovery-job"},{"title":"Update a draft discovery job","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json patch /v1/company-discovery-jobs/{jobId}","href":"/api-reference/companydiscoveryjobs/update-a-draft-discovery-job"},{"title":"Archive a discovery job","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/company-discovery-jobs/{jobId}/archive","href":"/api-reference/companydiscoveryjobs/archive-a-discovery-job"},{"title":"Cancel a discovery job","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/company-discovery-jobs/{jobId}/cancel","href":"/api-reference/companydiscoveryjobs/cancel-a-discovery-job"},{"title":"List a discovery job’s candidates","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/company-discovery-jobs/{jobId}/candidates","href":"/api-reference/companydiscoveryjobs/list-a-discovery-job’s-candidates"},{"title":"Get a discovery job’s quality summary","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/company-discovery-jobs/{jobId}/quality-summary","href":"/api-reference/companydiscoveryjobs/get-a-discovery-job’s-quality-summary"},{"title":"Start a discovery job","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/company-discovery-jobs/{jobId}/start","href":"/api-reference/companydiscoveryjobs/start-a-discovery-job"},{"title":"A discovery job reached its outcome","version":null,"deprecated":null,"openapi":"https://api.enrik.ai/v1/openapi.json webhook company-discovery-job.terminal","href":"/api-reference/companydiscoveryjobs/a-discovery-job-reached-its-outcome"}]},{"group":"companySignals","pages":[{"title":"Get a company signal","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/company-signals/{id}","href":"/api-reference/companysignals/get-a-company-signal"},{"title":"A signal was applied to a company","version":null,"deprecated":null,"openapi":"https://api.enrik.ai/v1/openapi.json webhook company-signal.created","href":"/api-reference/companysignals/a-signal-was-applied-to-a-company"}]},{"group":"contacts","pages":[{"title":"List contacts","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/contacts","href":"/api-reference/contacts/list-contacts"},{"title":"Create a contact","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/contacts","href":"/api-reference/contacts/create-a-contact"},{"title":"Create up to 100 contacts","description":"Creates up to 100 contacts, each from the body `contacts.create` takes. Send an `Idempotency-Key` for the whole request: a retry with the same key and body returns the first answer, item for item, instead of creating again, and the same key with another body is refused with 409 `idempotency_key_reused`. Returning that answer to a retry also needs `crm:read`; without it the retry is refused with 403 `permission_denied`. The body is checked as a whole first: a malformed item refuses the request with 422 `validation_error` at its path, such as `items.3.name`, and nothing is written. Then the items are created one after another, and one that fails, such as an e-mail address another live contact has (`conflict`, `details.code` `duplicate_email`), is left out while the others are created. The answer is 200 with one result per item, in order, and the counts: a written item has `outcome` `created` and the record; a failed one has `outcome` `failed` and an `error` in the error envelope’s shape, with the code and details `contacts.create` would have answered. A request counts against the `api-key-bulk` rate-limit policy as well as `api-key`.","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/contacts/bulk-create","href":"/api-reference/contacts/create-up-to-100-contacts"},{"title":"Update up to 100 contacts","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/contacts/bulk-update","href":"/api-reference/contacts/update-up-to-100-contacts"},{"title":"Create or update up to 100 contacts by e-mail","description":"Creates or updates up to 100 contacts, each found by its `email` as `contacts.upsert` finds it, comparing the address ignoring case; a `companyId` or `ownerUserId` the workspace does not have fails the item with `validation_error` (`related_record_not_found`). The body is checked as a whole first: a malformed item refuses the request with 422 `validation_error` at its path, such as `items.3.name`, and nothing is written. Then the items run one after another, each in its own transaction, so one that fails leaves the others written. The answer is 200 with one result per item, in order, and the counts: a written item has `outcome` `created` or `updated` and the record; a failed one has `outcome` `failed` and an `error` in the error envelope’s shape, with the code and details the single upsert would have answered. Every item is keyed by its natural key, so sending the same body again is harmless: no `Idempotency-Key` is taken, and a failed request or failed items can simply be sent again. A request counts against the `api-key-bulk` rate-limit policy as well as `api-key`.","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/contacts/bulk-upsert","href":"/api-reference/contacts/create-or-update-up-to-100-contacts-by-e-mail"},{"title":"List deleted contacts","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/contacts/trash","href":"/api-reference/contacts/list-deleted-contacts"},{"title":"Create or update a contact by e-mail","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/contacts/upsert","href":"/api-reference/contacts/create-or-update-a-contact-by-e-mail"},{"title":"Get a contact","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/contacts/{contactId}","href":"/api-reference/contacts/get-a-contact"},{"title":"Delete a contact","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json delete /v1/contacts/{contactId}","href":"/api-reference/contacts/delete-a-contact"},{"title":"Update a contact","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json patch /v1/contacts/{contactId}","href":"/api-reference/contacts/update-a-contact"},{"title":"Restore a deleted contact","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/contacts/{contactId}/restore","href":"/api-reference/contacts/restore-a-deleted-contact"},{"title":"List a contact’s timeline","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/contacts/{contactId}/timeline","href":"/api-reference/contacts/list-a-contact’s-timeline"},{"title":"A contact was created","version":null,"deprecated":null,"openapi":"https://api.enrik.ai/v1/openapi.json webhook contact.created","href":"/api-reference/contacts/a-contact-was-created"},{"title":"A contact was deleted","version":null,"deprecated":null,"openapi":"https://api.enrik.ai/v1/openapi.json webhook contact.deleted","href":"/api-reference/contacts/a-contact-was-deleted"},{"title":"A contact was restored","version":null,"deprecated":null,"openapi":"https://api.enrik.ai/v1/openapi.json webhook contact.restored","href":"/api-reference/contacts/a-contact-was-restored"},{"title":"A contact changed","version":null,"deprecated":null,"openapi":"https://api.enrik.ai/v1/openapi.json webhook contact.updated","href":"/api-reference/contacts/a-contact-changed"}]},{"group":"customFieldDefinitions","pages":[{"title":"List custom fields","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/custom-field-definitions","href":"/api-reference/customfielddefinitions/list-custom-fields"}]},{"group":"discoveryBriefs","pages":[{"title":"List discovery briefs","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/discovery-briefs","href":"/api-reference/discoverybriefs/list-discovery-briefs"},{"title":"Create a discovery brief","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/discovery-briefs","href":"/api-reference/discoverybriefs/create-a-discovery-brief"},{"title":"Get a discovery brief","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/discovery-briefs/{discoveryBriefId}","href":"/api-reference/discoverybriefs/get-a-discovery-brief"},{"title":"Update a discovery brief","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json patch /v1/discovery-briefs/{discoveryBriefId}","href":"/api-reference/discoverybriefs/update-a-discovery-brief"},{"title":"Archive a discovery brief","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/discovery-briefs/{discoveryBriefId}/archive","href":"/api-reference/discoverybriefs/archive-a-discovery-brief"},{"title":"List a discovery brief’s versions","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/discovery-briefs/{discoveryBriefId}/versions","href":"/api-reference/discoverybriefs/list-a-discovery-brief’s-versions"},{"title":"Add a discovery brief version","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/discovery-briefs/{discoveryBriefId}/versions","href":"/api-reference/discoverybriefs/add-a-discovery-brief-version"},{"title":"Get a discovery brief version","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/discovery-briefs/{discoveryBriefId}/versions/{versionId}","href":"/api-reference/discoverybriefs/get-a-discovery-brief-version"}]},{"group":"exportFields","pages":[{"title":"Get the export field catalogue","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/export-fields","href":"/api-reference/exportfields/get-the-export-field-catalogue"}]},{"group":"exportJobs","pages":[{"title":"List export jobs","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/export-jobs","href":"/api-reference/exportjobs/list-export-jobs"},{"title":"Create a draft export","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/export-jobs","href":"/api-reference/exportjobs/create-a-draft-export"},{"title":"Preview an export","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/export-jobs/preview","href":"/api-reference/exportjobs/preview-an-export"},{"title":"Get an export job","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/export-jobs/{id}","href":"/api-reference/exportjobs/get-an-export-job"},{"title":"Archive an export","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/export-jobs/{id}/archive","href":"/api-reference/exportjobs/archive-an-export"},{"title":"Cancel an export","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/export-jobs/{id}/cancel","href":"/api-reference/exportjobs/cancel-an-export"},{"title":"Download an export’s CSV file","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/export-jobs/{id}/download","href":"/api-reference/exportjobs/download-an-export’s-csv-file"},{"title":"Start an export","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/export-jobs/{id}/start","href":"/api-reference/exportjobs/start-an-export"}]},{"group":"feedback","pages":[{"title":"Send anonymous feedback","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/feedback","href":"/api-reference/feedback/send-anonymous-feedback"}]},{"group":"health","pages":[{"title":"Check that the API is up","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/health","href":"/api-reference/health/check-that-the-api-is-up"}]},{"group":"icpProfiles","pages":[{"title":"List ICP profiles","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/icp-profiles","href":"/api-reference/icpprofiles/list-icp-profiles"},{"title":"Create an ICP profile","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/icp-profiles","href":"/api-reference/icpprofiles/create-an-icp-profile"},{"title":"Get an ICP profile","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/icp-profiles/{icpProfileId}","href":"/api-reference/icpprofiles/get-an-icp-profile"},{"title":"Update an ICP profile","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json patch /v1/icp-profiles/{icpProfileId}","href":"/api-reference/icpprofiles/update-an-icp-profile"},{"title":"Archive an ICP profile","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/icp-profiles/{icpProfileId}/archive","href":"/api-reference/icpprofiles/archive-an-icp-profile"},{"title":"Restore an ICP profile","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/icp-profiles/{icpProfileId}/restore","href":"/api-reference/icpprofiles/restore-an-icp-profile"},{"title":"List an ICP profile’s versions","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/icp-profiles/{icpProfileId}/versions","href":"/api-reference/icpprofiles/list-an-icp-profile’s-versions"},{"title":"Add an ICP profile version","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/icp-profiles/{icpProfileId}/versions","href":"/api-reference/icpprofiles/add-an-icp-profile-version"},{"title":"Get an ICP profile version","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/icp-profiles/{icpProfileId}/versions/{versionId}","href":"/api-reference/icpprofiles/get-an-icp-profile-version"}]},{"group":"apiKeys","pages":[{"title":"Describe the calling API key","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/me","href":"/api-reference/apikeys/describe-the-calling-api-key"},{"title":"Revoke the calling API key","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/me/revoke","href":"/api-reference/apikeys/revoke-the-calling-api-key"},{"title":"Rotate the calling API key","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/me/rotate","href":"/api-reference/apikeys/rotate-the-calling-api-key"}]},{"group":"websiteOnboarding","pages":[{"title":"Read workspace company setup","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/onboarding/setup","href":"/api-reference/websiteonboarding/read-workspace-company-setup"},{"title":"Read workspace setup access","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/onboarding/setup/access","href":"/api-reference/websiteonboarding/read-workspace-setup-access"},{"title":"Confirm workspace company profile","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/onboarding/setup/company-profile/confirm","href":"/api-reference/websiteonboarding/confirm-workspace-company-profile"},{"title":"Draft workspace company profile from website or description","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/onboarding/setup/company-profile/draft","href":"/api-reference/websiteonboarding/draft-workspace-company-profile-from-website-or-description"},{"title":"Complete workspace setup","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/onboarding/setup/complete","href":"/api-reference/websiteonboarding/complete-workspace-setup"},{"title":"Read workspace setup completion","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/onboarding/setup/completion","href":"/api-reference/websiteonboarding/read-workspace-setup-completion"},{"title":"Reset workspace company setup","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/onboarding/setup/reset","href":"/api-reference/websiteonboarding/reset-workspace-company-setup"},{"title":"Choose workspace setups","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/onboarding/setup/setups","href":"/api-reference/websiteonboarding/choose-workspace-setups"},{"title":"Start workspace company setup","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/onboarding/setup/start","href":"/api-reference/websiteonboarding/start-workspace-company-setup"}]},{"group":"savedViews","pages":[{"title":"List saved views","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/saved-views","href":"/api-reference/savedviews/list-saved-views"},{"title":"Create a saved view","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/saved-views","href":"/api-reference/savedviews/create-a-saved-view"},{"title":"Get a saved view","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/saved-views/{savedViewId}","href":"/api-reference/savedviews/get-a-saved-view"},{"title":"Delete a saved view","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json delete /v1/saved-views/{savedViewId}","href":"/api-reference/savedviews/delete-a-saved-view"},{"title":"Update a saved view","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json patch /v1/saved-views/{savedViewId}","href":"/api-reference/savedviews/update-a-saved-view"}]},{"group":"signalDefinitions","pages":[{"title":"List signal definitions","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/signal-definitions","href":"/api-reference/signaldefinitions/list-signal-definitions"},{"title":"Create a signal definition","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/signal-definitions","href":"/api-reference/signaldefinitions/create-a-signal-definition"},{"title":"Get a signal definition","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/signal-definitions/{signalDefinitionId}","href":"/api-reference/signaldefinitions/get-a-signal-definition"},{"title":"Update a signal definition","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json patch /v1/signal-definitions/{signalDefinitionId}","href":"/api-reference/signaldefinitions/update-a-signal-definition"},{"title":"Archive a signal definition","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/signal-definitions/{signalDefinitionId}/archive","href":"/api-reference/signaldefinitions/archive-a-signal-definition"},{"title":"Restore a signal definition","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/signal-definitions/{signalDefinitionId}/restore","href":"/api-reference/signaldefinitions/restore-a-signal-definition"},{"title":"List a signal definition’s versions","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/signal-definitions/{signalDefinitionId}/versions","href":"/api-reference/signaldefinitions/list-a-signal-definition’s-versions"},{"title":"Add a signal definition version","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/signal-definitions/{signalDefinitionId}/versions","href":"/api-reference/signaldefinitions/add-a-signal-definition-version"},{"title":"Get a signal definition version","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/signal-definitions/{signalDefinitionId}/versions/{versionId}","href":"/api-reference/signaldefinitions/get-a-signal-definition-version"}]},{"group":"signalDetectors","pages":[{"title":"Get the signal detector catalogue","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/signal-detectors","href":"/api-reference/signaldetectors/get-the-signal-detector-catalogue"}]},{"group":"webhookEventDeliveries","pages":[{"title":"List event deliveries of a subscription","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/webhook-event-deliveries","href":"/api-reference/webhookeventdeliveries/list-event-deliveries-of-a-subscription"},{"title":"Get an event delivery","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/webhook-event-deliveries/{id}","href":"/api-reference/webhookeventdeliveries/get-an-event-delivery"},{"title":"Redeliver an event","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/webhook-event-deliveries/{id}/redeliver","href":"/api-reference/webhookeventdeliveries/redeliver-an-event"}]},{"group":"webhookEventTypes","pages":[{"title":"List event types","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/webhook-event-types","href":"/api-reference/webhookeventtypes/list-event-types"}]},{"group":"webhookSubscriptions","pages":[{"title":"List event subscriptions","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/webhook-subscriptions","href":"/api-reference/webhooksubscriptions/list-event-subscriptions"},{"title":"Create an event subscription","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/webhook-subscriptions","href":"/api-reference/webhooksubscriptions/create-an-event-subscription"},{"title":"Get an event subscription","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/webhook-subscriptions/{id}","href":"/api-reference/webhooksubscriptions/get-an-event-subscription"},{"title":"Update an event subscription","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json patch /v1/webhook-subscriptions/{id}","href":"/api-reference/webhooksubscriptions/update-an-event-subscription"},{"title":"Archive an event subscription","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/webhook-subscriptions/{id}/archive","href":"/api-reference/webhooksubscriptions/archive-an-event-subscription"},{"title":"Disable an event subscription","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/webhook-subscriptions/{id}/disable","href":"/api-reference/webhooksubscriptions/disable-an-event-subscription"},{"title":"Enable an event subscription","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/webhook-subscriptions/{id}/enable","href":"/api-reference/webhooksubscriptions/enable-an-event-subscription"},{"title":"Rotate the signing secret","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/webhook-subscriptions/{id}/rotate-secret","href":"/api-reference/webhooksubscriptions/rotate-the-signing-secret"},{"title":"Test an event subscription","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json post /v1/webhook-subscriptions/{id}/test","href":"/api-reference/webhooksubscriptions/test-an-event-subscription"},{"title":"A subscription was tested","version":null,"deprecated":null,"openapi":"https://api.enrik.ai/v1/openapi.json webhook webhook.ping","href":"/api-reference/webhooksubscriptions/a-subscription-was-tested"}]},{"group":"workspaceMembers","pages":[{"title":"List workspace members","deprecated":null,"version":null,"openapi":"https://api.enrik.ai/v1/openapi.json get /v1/workspace-members","href":"/api-reference/workspacemembers/list-workspace-members"}]}]}]}]},"basePath":"","title":"Update up to 100 contacts - Enrik","buildId":"dpl_BLQvU86QFwq3AhPofSTw6q8dGWKm","deploymentId":"dpl_BLQvU86QFwq3AhPofSTw6q8dGWKm","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-Myd8dsju.js","utils-C2HkQgW0.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-8rSppmTv.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-B6MjiCFm.js","snippetPresets-DwrSAONL.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-1-a5UQKQ.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-C541m7wZ.js","shallow-CWELCZ77.js","getApiPlaygroundDisplay-CTo5Zn03.js","CodeSnippet-D--dzvnl.js","CodeSnippets-DM3cXEDh.js","Page-CxAy5y67.js","getPastedJson-C-VECgcL.js","icon-BPq2-Mg3.js","MethodPill-D9J5cUHd.js","DuplicateIcon-BqHaxUnD.js","createIcon-CIbcZHp9.js","DynamicMarkdown-BKiHAm_d.js","SectionHeading-DstQXt3H.js","axios-vUo_bRtp.js","Markdown-CpxgzsKA.js","clsx-C5EfhVm0.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-CJ9Oly2E.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-Mk6P3qvh.js"]}