For each entry: if email or linkedin_url matches an existing
tenant-visible person, that person is returned (status MATCHED) without a
write; otherwise a new tenant-source record is created (status CREATED).
Set update_matched to write a matched row’s remaining fields onto the
person it matched (status UPDATED) — without it, fields like job_title
on a row for someone already in the tenant are silently discarded.
This mirrors the matching of GET /v1/persons/lookup, but is broader than
the dedupe on POST /v1/persons, which matches on email only — a
linkedin_url-only match against an existing person returns MATCHED here,
but would create a duplicate via a single POST /v1/persons call with no
email set. Items are processed independently — a single failing row
comes back as status ERROR without sinking the rest of the batch. Results
are returned in input order.
Duplicate identifiers within the same batch resolve to one record: a
later row sharing an email/linkedin_url with an earlier row comes back
MATCHED against the first row’s UUID rather than creating a second person
(an earlier create isn’t yet visible to the matcher mid-batch).
This is the bulk primitive for an import flow: look people up first
(POST /v1/persons/lookup/batch), then create the unmatched remainder
here, then attach notes (POST /v1/notes/batch).
POST
/
v1
/
persons
/
batch
Match-or-create multiple persons in a single request (up to 50).
When true, a row matching an existing person also writes that row's other fields onto them (status UPDATED) instead of being returned untouched. Off by default: matching is a lookup, so a plain import cannot silently rewrite records it did not intend to. Turn it on when the submitted rows are authoritative -- e.g. importing job titles for people already in the tenant. email is never overwritten either way; a new address goes to the person's next free email slot.
Response
200 - application/json
Batch create response, ordered to match the input persons.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Rings AI","description":"Relationship intelligence for businesses that win on their networks. Build on Rings with the REST API or connect AI agents via MCP.","colors":{"primary":"#6366F1","light":"#818CF8","dark":"#4F46E5"},"logo":{"light":"https://mintcdn.com/rings-ai/EVsJFZndjLtW_7WK/images/Group5.svg?fit=max\u0026auto=format\u0026n=EVsJFZndjLtW_7WK\u0026q=85\u0026s=bbbf7303b09ab9978ffaee9e90f250ec","dark":"https://mintcdn.com/rings-ai/EVsJFZndjLtW_7WK/images/Group5.svg?fit=max\u0026auto=format\u0026n=EVsJFZndjLtW_7WK\u0026q=85\u0026s=bbbf7303b09ab9978ffaee9e90f250ec"},"favicon":{"light":"https://mintcdn.com/rings-ai/EVsJFZndjLtW_7WK/images/icon-original.png?fit=max\u0026auto=format\u0026n=EVsJFZndjLtW_7WK\u0026q=85\u0026s=968ab65ef5c4793a38135dd4d6868876","dark":"https://mintcdn.com/rings-ai/EVsJFZndjLtW_7WK/images/icon-original.png?fit=max\u0026auto=format\u0026n=EVsJFZndjLtW_7WK\u0026q=85\u0026s=968ab65ef5c4793a38135dd4d6868876"},"api":{"openapi":"https://production-api.joinrings.com/openapi.json"},"appearance":{"default":"dark"},"background":{"decoration":"gradient"},"navbar":{"links":[{"href":"https://www.rings.ai","label":"Website"}],"primary":{"type":"button","label":"Get Started","href":"https://joinrings.com"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"markdown":{"schema":true},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"rings-ai","hasAudioNarration":false,"actualSubdomain":"rings-ai","customDomains":["docs.rings.ai"],"gitSource":{"type":"github","owner":"rings-ai","repo":"rcp-data-pipeline","deployBranch":"main","contentDirectory":"mintlify_docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"collectionId":"f2baa2ef-5f3c-4fb9-b645-454aa43e6c38","liveDeploymentHistoryId":"6ae3521290bdcff7cbc3b51f","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae3521290bdcff7cbc3b51f"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ae3521290bdcff7cbc3b51f","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"default","tag":"API Reference","count":77},{"language":"default","tag":"Guides","count":14},{"language":"default","tag":"Opportunity","count":11},{"language":"default","tag":"MCP Guide","count":11},{"language":"default","tag":"Add the connector","count":10},{"language":"default","tag":"Note","count":9},{"language":"default","tag":"Person","count":9},{"language":"default","tag":"Activity","count":8},{"language":"default","tag":"Company","count":7},{"language":"default","tag":"Task","count":7}]},"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":"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":"per-site-search-delta","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":"editor-private-page-search","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":"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":"byok-sep-25","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":"billing-updated-9-15","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":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/person/batch-create","slug":"/api-reference/person/batch-create","pageMetadata":{"title":"Batch create persons","openapi":"POST /v1/persons/batch","description":"\nFor each entry: if `email` or `linkedin_url` matches an existing\ntenant-visible person, that person is returned (status MATCHED) without a\nwrite; otherwise a new tenant-source record is created (status CREATED).\nSet `update_matched` to write a matched row's remaining fields onto the\nperson it matched (status UPDATED) -- without it, fields like `job_title`\non a row for someone already in the tenant are silently discarded.\nThis mirrors the matching of `GET /v1/persons/lookup`, but is broader than\nthe dedupe on `POST /v1/persons`, which matches on `email` only — a\n`linkedin_url`-only match against an existing person returns MATCHED here,\nbut would create a duplicate via a single `POST /v1/persons` call with no\n`email` set. Items are processed independently — a single failing row\ncomes back as status ERROR without sinking the rest of the batch. Results\nare returned in input order.\n\nDuplicate identifiers within the same batch resolve to one record: a\nlater row sharing an email/linkedin_url with an earlier row comes back\nMATCHED against the first row's UUID rather than creating a second person\n(an earlier create isn't yet visible to the matcher mid-batch).\n\nThis is the bulk primitive for an import flow: look people up first\n(`POST /v1/persons/lookup/batch`), then create the unmatched remainder\nhere, then attach notes (`POST /v1/notes/batch`).","href":"/api-reference/person/batch-create"},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, 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(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"For each entry: if \", _jsx(_components.code, {\n children: \"email\"\n }), \" or \", _jsx(_components.code, {\n children: \"linkedin_url\"\n }), \" matches an existing\\ntenant-visible person, that person is returned (status MATCHED) without a\\nwrite; otherwise a new tenant-source record is created (status CREATED).\\nSet \", _jsx(_components.code, {\n children: \"update_matched\"\n }), \" to write a matched row’s remaining fields onto the\\nperson it matched (status UPDATED) — without it, fields like \", _jsx(_components.code, {\n children: \"job_title\"\n }), \"\\non a row for someone already in the tenant are silently discarded.\\nThis mirrors the matching of \", _jsx(_components.code, {\n children: \"GET /v1/persons/lookup\"\n }), \", but is broader than\\nthe dedupe on \", _jsx(_components.code, {\n children: \"POST /v1/persons\"\n }), \", which matches on \", _jsx(_components.code, {\n children: \"email\"\n }), \" only — a\\n\", _jsx(_components.code, {\n children: \"linkedin_url\"\n }), \"-only match against an existing person returns MATCHED here,\\nbut would create a duplicate via a single \", _jsx(_components.code, {\n children: \"POST /v1/persons\"\n }), \" call with no\\n\", _jsx(_components.code, {\n children: \"email\"\n }), \" set. Items are processed independently — a single failing row\\ncomes back as status ERROR without sinking the rest of the batch. Results\\nare returned in input order.\"]\n }), \"\\n\", _jsx(_components.p, {\n children: \"Duplicate identifiers within the same batch resolve to one record: a\\nlater row sharing an email/linkedin_url with an earlier row comes back\\nMATCHED against the first row’s UUID rather than creating a second person\\n(an earlier create isn’t yet visible to the matcher mid-batch).\"\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"This is the bulk primitive for an import flow: look people up first\\n(\", _jsx(_components.code, {\n children: \"POST /v1/persons/lookup/batch\"\n }), \"), then create the unmatched remainder\\nhere, then attach notes (\", _jsx(_components.code, {\n children: \"POST /v1/notes/batch\"\n }), \").\"]\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":"Batch create persons","openapi":"POST /v1/persons/batch","description":"\nFor each entry: if `email` or `linkedin_url` matches an existing\ntenant-visible person, that person is returned (status MATCHED) without a\nwrite; otherwise a new tenant-source record is created (status CREATED).\nSet `update_matched` to write a matched row's remaining fields onto the\nperson it matched (status UPDATED) -- without it, fields like `job_title`\non a row for someone already in the tenant are silently discarded.\nThis mirrors the matching of `GET /v1/persons/lookup`, but is broader than\nthe dedupe on `POST /v1/persons`, which matches on `email` only — a\n`linkedin_url`-only match against an existing person returns MATCHED here,\nbut would create a duplicate via a single `POST /v1/persons` call with no\n`email` set. Items are processed independently — a single failing row\ncomes back as status ERROR without sinking the rest of the batch. Results\nare returned in input order.\n\nDuplicate identifiers within the same batch resolve to one record: a\nlater row sharing an email/linkedin_url with an earlier row comes back\nMATCHED against the first row's UUID rather than creating a second person\n(an earlier create isn't yet visible to the matcher mid-batch).\n\nThis is the bulk primitive for an import flow: look people up first\n(`POST /v1/persons/lookup/batch`), then create the unmatched remainder\nhere, then attach notes (`POST /v1/notes/batch`).","href":"/api-reference/person/batch-create"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"description":"\nFor each entry: if `email` or `linkedin_url` matches an existing\ntenant-visible person, that person is returned (status MATCHED) without a\nwrite; otherwise a new tenant-source record is created (status CREATED).\nSet `update_matched` to write a matched row's remaining fields onto the\nperson it matched (status UPDATED) -- without it, fields like `job_title`\non a row for someone already in the tenant are silently discarded.\nThis mirrors the matching of `GET /v1/persons/lookup`, but is broader than\nthe dedupe on `POST /v1/persons`, which matches on `email` only — a\n`linkedin_url`-only match against an existing person returns MATCHED here,\nbut would create a duplicate via a single `POST /v1/persons` call with no\n`email` set. Items are processed independently — a single failing row\ncomes back as status ERROR without sinking the rest of the batch. Results\nare returned in input order.\n\nDuplicate identifiers within the same batch resolve to one record: a\nlater row sharing an email/linkedin_url with an earlier row comes back\nMATCHED against the first row's UUID rather than creating a second person\n(an earlier create isn't yet visible to the matcher mid-batch).\n\nThis is the bulk primitive for an import flow: look people up first\n(`POST /v1/persons/lookup/batch`), then create the unmatched remainder\nhere, then attach notes (`POST /v1/notes/batch`).","operationId":"post_create_persons_batch","parameters":[],"requestBody":"374cc11c-873f-450b-8dfb-e2c5575bee31","responses":{"200":"3a09bf29-6d2a-429a-b63c-85129ed1dedb"},"summary":"Match-or-create multiple persons in a single request (up to 50).","tags":["Person"],"method":"post","type":"path","servers":["ac0c72ea-24cd-42c5-bf7e-af9869eeb624"],"security":["d3e1b4d8-8e73-42d2-8242-48f05e417bca"],"path":"/v1/persons/batch","baseUrlOptions":["https://production-api.joinrings.com"],"title":"Match-or-create multiple persons in a single request (up to 50).","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"content":{"application/json":{"schema":{"properties":{"persons":{"items":{"properties":{"city":{"oneOf":[{"type":"string","title":"City","description":"City name, e.g. 'Los Angeles'.","uniqueKey":"persons.items.[INDEX].city.oneOf.0","typeLabel":"string"},{"type":"null","title":"City","description":"City name, e.g. 'Los Angeles'.","uniqueKey":"persons.items.[INDEX].city.oneOf.1","typeLabel":"null"}],"uniqueKey":"persons.items.[INDEX].city","typeLabel":"string | null"},"country_code":{"oneOf":[{"type":"string","title":"Country Code","description":"ISO 3166-1 alpha-2 country code, e.g. 'US'. Not a country name.","uniqueKey":"persons.items.[INDEX].country_code.oneOf.0","typeLabel":"string"},{"type":"null","title":"Country Code","description":"ISO 3166-1 alpha-2 country code, e.g. 'US'. Not a country name.","uniqueKey":"persons.items.[INDEX].country_code.oneOf.1","typeLabel":"null"}],"uniqueKey":"persons.items.[INDEX].country_code","typeLabel":"string | null"},"custom_fields":{"oneOf":[{"type":"object","title":"Custom Fields","description":"Person custom field values keyed by field `id` from GET /v1/persons/custom-fields; `null` clears a field. Only the fields present are written. Values use the shapes described on the person response; an invalid value fails the request with 400 naming the field, before anything is written.","additionalProperties":true,"uniqueKey":"persons.items.[INDEX].custom_fields.oneOf.0","typeLabel":"Custom Fields · object"},{"type":"null","title":"Custom Fields","description":"Person custom field values keyed by field `id` from GET /v1/persons/custom-fields; `null` clears a field. Only the fields present are written. Values use the shapes described on the person response; an invalid value fails the request with 400 naming the field, before anything is written.","uniqueKey":"persons.items.[INDEX].custom_fields.oneOf.1","typeLabel":"null"}],"uniqueKey":"persons.items.[INDEX].custom_fields","typeLabel":"Custom Fields · object | null"},"description":{"oneOf":[{"type":"string","title":"Description","uniqueKey":"persons.items.[INDEX].description.oneOf.0","typeLabel":"string"},{"type":"null","title":"Description","uniqueKey":"persons.items.[INDEX].description.oneOf.1","typeLabel":"null"}],"uniqueKey":"persons.items.[INDEX].description","typeLabel":"string | null"},"email":{"oneOf":[{"type":"string","title":"Email","uniqueKey":"persons.items.[INDEX].email.oneOf.0","typeLabel":"string"},{"type":"null","title":"Email","uniqueKey":"persons.items.[INDEX].email.oneOf.1","typeLabel":"null"}],"uniqueKey":"persons.items.[INDEX].email","typeLabel":"string | null"},"email_3":{"oneOf":[{"type":"string","title":"Email 3","uniqueKey":"persons.items.[INDEX].email_3.oneOf.0","typeLabel":"string"},{"type":"null","title":"Email 3","uniqueKey":"persons.items.[INDEX].email_3.oneOf.1","typeLabel":"null"}],"uniqueKey":"persons.items.[INDEX].email_3","typeLabel":"string | null"},"email_4":{"oneOf":[{"type":"string","title":"Email 4","uniqueKey":"persons.items.[INDEX].email_4.oneOf.0","typeLabel":"string"},{"type":"null","title":"Email 4","uniqueKey":"persons.items.[INDEX].email_4.oneOf.1","typeLabel":"null"}],"uniqueKey":"persons.items.[INDEX].email_4","typeLabel":"string | null"},"email_5":{"oneOf":[{"type":"string","title":"Email 5","uniqueKey":"persons.items.[INDEX].email_5.oneOf.0","typeLabel":"string"},{"type":"null","title":"Email 5","uniqueKey":"persons.items.[INDEX].email_5.oneOf.1","typeLabel":"null"}],"uniqueKey":"persons.items.[INDEX].email_5","typeLabel":"string | null"},"facebook_url":{"oneOf":[{"type":"string","title":"Facebook Url","uniqueKey":"persons.items.[INDEX].facebook_url.oneOf.0","typeLabel":"string"},{"type":"null","title":"Facebook Url","uniqueKey":"persons.items.[INDEX].facebook_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"persons.items.[INDEX].facebook_url","typeLabel":"string | null"},"first_name":{"oneOf":[{"type":"string","title":"First Name","uniqueKey":"persons.items.[INDEX].first_name.oneOf.0","typeLabel":"string"},{"type":"null","title":"First Name","uniqueKey":"persons.items.[INDEX].first_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"persons.items.[INDEX].first_name","typeLabel":"string | null"},"job_title":{"oneOf":[{"type":"string","title":"Job Title","uniqueKey":"persons.items.[INDEX].job_title.oneOf.0","typeLabel":"string"},{"type":"null","title":"Job Title","uniqueKey":"persons.items.[INDEX].job_title.oneOf.1","typeLabel":"null"}],"uniqueKey":"persons.items.[INDEX].job_title","typeLabel":"string | null"},"last_name":{"oneOf":[{"type":"string","title":"Last Name","uniqueKey":"persons.items.[INDEX].last_name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Last Name","uniqueKey":"persons.items.[INDEX].last_name.oneOf.1","typeLabel":"null"}],"uniqueKey":"persons.items.[INDEX].last_name","typeLabel":"string | null"},"linkedin_url":{"oneOf":[{"type":"string","title":"Linkedin Url","uniqueKey":"persons.items.[INDEX].linkedin_url.oneOf.0","typeLabel":"string"},{"type":"null","title":"Linkedin Url","uniqueKey":"persons.items.[INDEX].linkedin_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"persons.items.[INDEX].linkedin_url","typeLabel":"string | null"},"logo_url":{"oneOf":[{"type":"string","title":"Logo Url","uniqueKey":"persons.items.[INDEX].logo_url.oneOf.0","typeLabel":"string"},{"type":"null","title":"Logo Url","uniqueKey":"persons.items.[INDEX].logo_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"persons.items.[INDEX].logo_url","typeLabel":"string | null"},"mobile_phone":{"oneOf":[{"type":"string","title":"Mobile Phone","uniqueKey":"persons.items.[INDEX].mobile_phone.oneOf.0","typeLabel":"string"},{"type":"null","title":"Mobile Phone","uniqueKey":"persons.items.[INDEX].mobile_phone.oneOf.1","typeLabel":"null"}],"uniqueKey":"persons.items.[INDEX].mobile_phone","typeLabel":"string | null"},"name":{"oneOf":[{"type":"string","title":"Name","uniqueKey":"persons.items.[INDEX].name.oneOf.0","typeLabel":"string"},{"type":"null","title":"Name","uniqueKey":"persons.items.[INDEX].name.oneOf.1","typeLabel":"null"}],"uniqueKey":"persons.items.[INDEX].name","typeLabel":"string | null"},"phone":{"oneOf":[{"type":"string","title":"Phone","uniqueKey":"persons.items.[INDEX].phone.oneOf.0","typeLabel":"string"},{"type":"null","title":"Phone","uniqueKey":"persons.items.[INDEX].phone.oneOf.1","typeLabel":"null"}],"uniqueKey":"persons.items.[INDEX].phone","typeLabel":"string | null"},"phone_3":{"oneOf":[{"type":"string","title":"Phone 3","uniqueKey":"persons.items.[INDEX].phone_3.oneOf.0","typeLabel":"string"},{"type":"null","title":"Phone 3","uniqueKey":"persons.items.[INDEX].phone_3.oneOf.1","typeLabel":"null"}],"uniqueKey":"persons.items.[INDEX].phone_3","typeLabel":"string | null"},"secondary_email":{"oneOf":[{"type":"string","title":"Secondary Email","uniqueKey":"persons.items.[INDEX].secondary_email.oneOf.0","typeLabel":"string"},{"type":"null","title":"Secondary Email","uniqueKey":"persons.items.[INDEX].secondary_email.oneOf.1","typeLabel":"null"}],"uniqueKey":"persons.items.[INDEX].secondary_email","typeLabel":"string | null"},"secondary_phone":{"oneOf":[{"type":"string","title":"Secondary Phone","uniqueKey":"persons.items.[INDEX].secondary_phone.oneOf.0","typeLabel":"string"},{"type":"null","title":"Secondary Phone","uniqueKey":"persons.items.[INDEX].secondary_phone.oneOf.1","typeLabel":"null"}],"uniqueKey":"persons.items.[INDEX].secondary_phone","typeLabel":"string | null"},"state_code":{"oneOf":[{"type":"string","title":"State Code","description":"Full ISO 3166-2 subdivision code including the country prefix — 'US-CA', not 'CA' and not 'California'. This is a different vocabulary from the `state` filter on GET /v1/persons, which takes a name or a country-scoped code. A value that is not a valid code is stored as given but will not resolve to a state on read.","uniqueKey":"persons.items.[INDEX].state_code.oneOf.0","typeLabel":"string"},{"type":"null","title":"State Code","description":"Full ISO 3166-2 subdivision code including the country prefix — 'US-CA', not 'CA' and not 'California'. This is a different vocabulary from the `state` filter on GET /v1/persons, which takes a name or a country-scoped code. A value that is not a valid code is stored as given but will not resolve to a state on read.","uniqueKey":"persons.items.[INDEX].state_code.oneOf.1","typeLabel":"null"}],"uniqueKey":"persons.items.[INDEX].state_code","typeLabel":"string | null"},"twitter_url":{"oneOf":[{"type":"string","title":"Twitter Url","uniqueKey":"persons.items.[INDEX].twitter_url.oneOf.0","typeLabel":"string"},{"type":"null","title":"Twitter Url","uniqueKey":"persons.items.[INDEX].twitter_url.oneOf.1","typeLabel":"null"}],"uniqueKey":"persons.items.[INDEX].twitter_url","typeLabel":"string | null"},"website":{"oneOf":[{"type":"string","title":"Website","uniqueKey":"persons.items.[INDEX].website.oneOf.0","typeLabel":"string"},{"type":"null","title":"Website","uniqueKey":"persons.items.[INDEX].website.oneOf.1","typeLabel":"null"}],"uniqueKey":"persons.items.[INDEX].website","typeLabel":"string | null"}},"title":"PersonCreateRequest","type":"object","uniqueKey":"persons.items.[INDEX]","typeLabel":"PersonCreateRequest · object"},"title":"Persons","type":"array","isRequired":true,"uniqueKey":"persons","typeLabel":"PersonCreateRequest · object[]"},"update_matched":{"default":false,"description":"When true, a row matching an existing person also writes that row's other fields onto them (status UPDATED) instead of being returned untouched. Off by default: matching is a lookup, so a plain import cannot silently rewrite records it did not intend to. Turn it on when the submitted rows are authoritative -- e.g. importing job titles for people already in the tenant. `email` is never overwritten either way; a new address goes to the person's next free email slot.","title":"Update Matched","type":"boolean","uniqueKey":"update_matched","typeLabel":"boolean"}},"required":["persons"],"title":"PersonBatchCreateRequest","type":"object","uniqueKey":"","typeLabel":"PersonBatchCreateRequest · object"},"examples":{"Example":{"title":"Example","value":{"persons":[{"city":"\u003cstring>","country_code":"\u003cstring>","custom_fields":{},"description":"\u003cstring>","email":"\u003cstring>","email_3":"\u003cstring>","email_4":"\u003cstring>","email_5":"\u003cstring>","facebook_url":"\u003cstring>","first_name":"\u003cstring>","job_title":"\u003cstring>","last_name":"\u003cstring>","linkedin_url":"\u003cstring>","logo_url":"\u003cstring>","mobile_phone":"\u003cstring>","name":"\u003cstring>","phone":"\u003cstring>","phone_3":"\u003cstring>","secondary_email":"\u003cstring>","secondary_phone":"\u003cstring>","state_code":"\u003cstring>","twitter_url":"\u003cstring>","website":"\u003cstring>"}],"update_matched":false}}},"exampleType":"generated"}},"required":true,"exampleType":"generated"},"responses":{"3a09bf29-6d2a-429a-b63c-85129ed1dedb":{"content":{"application/json":{"schema":{"properties":{"results":{"items":{"properties":{"index":{"title":"Index","type":"integer","isRequired":true,"uniqueKey":"results.items.[INDEX].index","typeLabel":"integer"},"status":{"title":"Status","type":"string","isRequired":true,"uniqueKey":"results.items.[INDEX].status","typeLabel":"string"},"error":{"oneOf":[{"type":"string","title":"Error","uniqueKey":"results.items.[INDEX].error.oneOf.0","typeLabel":"string"},{"type":"null","title":"Error","uniqueKey":"results.items.[INDEX].error.oneOf.1","typeLabel":"null"}],"uniqueKey":"results.items.[INDEX].error","typeLabel":"string | null"},"uuid":{"oneOf":[{"type":"string","title":"Uuid","uniqueKey":"results.items.[INDEX].uuid.oneOf.0","typeLabel":"string"},{"type":"null","title":"Uuid","uniqueKey":"results.items.[INDEX].uuid.oneOf.1","typeLabel":"null"}],"uniqueKey":"results.items.[INDEX].uuid","typeLabel":"string | null"}},"required":["index","status"],"title":"PersonBatchCreateResult","type":"object","uniqueKey":"results.items.[INDEX]","typeLabel":"PersonBatchCreateResult · object"},"title":"Results","type":"array","isRequired":true,"uniqueKey":"results","typeLabel":"PersonBatchCreateResult · object[]"}},"required":["results"],"title":"PersonBatchCreateResponse","type":"object","uniqueKey":"","typeLabel":"PersonBatchCreateResponse · object"},"examples":{"Example":{"title":"Example","value":{"results":[{"index":123,"status":"\u003cstring>","error":"\u003cstring>","uuid":"\u003cstring>"}]}}},"exampleType":"generated"}},"description":"Batch create response, ordered to match the input `persons`.","exampleType":"generated"}},"security":{"d3e1b4d8-8e73-42d2-8242-48f05e417bca":{"ApiKeyAuth":{"in":"header","name":"x-api-key","type":"apiKey","scopes":[],"schemeName":"ApiKeyAuth"}}},"servers":{"ac0c72ea-24cd-42c5-bf7e-af9869eeb624":{"description":"API server","url":"https://production-api.joinrings.com"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"in":"header","name":"x-api-key","type":"apiKey","scopes":[],"schemeName":"ApiKeyAuth"},"schema":{"title":"x-api-key","type":"string","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"ApiKeyAuth","name":"x-api-key"}],"title":"ApiKeyAuth"}]},"originalFileLocation":"https://production-api.joinrings.com/openapi.json"},"subdomain":"rings-ai","siteName":"Rings AI","title":"Batch create persons - Rings AI","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-10T07:57:56.045Z","originalFileLocation":"api-reference/person/batch-create.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=\"dark\"}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=\"For each entry: if email or linkedin_url matches an existing tenant-visible person, that person is returned (status MATCHED) without a write; otherwise a new tenant-source record is created (status CREATED). Set update_matched to write a matched row\u0026#x27;s remaining fields onto the person it matched (status UPDATED) -- without it, fields like job_title on a row for someone already in the tenant are silently discarded. This mirrors the matching of GET /v1/persons/lookup, but is broader than the dedupe on POST /v1/persons, which matches on email only — a linkedin_url-only match against an existing person returns MATCHED here, but would create a duplicate via a single POST /v1/persons call with no email set. Items are processed independently — a single failing row comes back as status ERROR without sinking the rest of the batch. Results are returned in input order. Duplicate identifiers within the same batch resolve to one record: a later row sharing an email/linkedin_url with an earlier row comes back MATCHED against the first row\u0026#x27;s UUID rather than creating a second person (an earlier create isn\u0026#x27;t yet visible to the matcher mid-batch). This is the bulk primitive for an import flow: look people up first (POST /v1/persons/lookup/batch), then create the unmatched remainder here, then attach notes (POST /v1/notes/batch).\">\u003cmeta data-mint-head name=\"application-name\" content=\"Rings AI\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/rings-ai/_zk5vOoQ8ix_XOCm/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/rings-ai/_zk5vOoQ8ix_XOCm/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/rings-ai/_zk5vOoQ8ix_XOCm/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/rings-ai/_zk5vOoQ8ix_XOCm/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/rings-ai/_zk5vOoQ8ix_XOCm/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/rings-ai/_zk5vOoQ8ix_XOCm/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/rings-ai/_zk5vOoQ8ix_XOCm/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/rings-ai/_zk5vOoQ8ix_XOCm/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/rings-ai/_zk5vOoQ8ix_XOCm/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Batch create persons - Rings AI\">\u003cmeta data-mint-head property=\"og:description\" content=\"For each entry: if email or linkedin_url matches an existing tenant-visible person, that person is returned (status MATCHED) without a write; otherwise a new tenant-source record is created (status CREATED). Set update_matched to write a matched row\u0026#x27;s remaining fields onto the person it matched (status UPDATED) -- without it, fields like job_title on a row for someone already in the tenant are silently discarded. This mirrors the matching of GET /v1/persons/lookup, but is broader than the dedupe on POST /v1/persons, which matches on email only — a linkedin_url-only match against an existing person returns MATCHED here, but would create a duplicate via a single POST /v1/persons call with no email set. Items are processed independently — a single failing row comes back as status ERROR without sinking the rest of the batch. Results are returned in input order. Duplicate identifiers within the same batch resolve to one record: a later row sharing an email/linkedin_url with an earlier row comes back MATCHED against the first row\u0026#x27;s UUID rather than creating a second person (an earlier create isn\u0026#x27;t yet visible to the matcher mid-batch). This is the bulk primitive for an import flow: look people up first (POST /v1/persons/lookup/batch), then create the unmatched remainder here, then attach notes (POST /v1/notes/batch).\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Rings AI\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.rings.ai/api-reference/person/batch-create\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://rings-ai.mintlify.app/_mintlify/api/og/v2?division=Person\u0026amp;title=Batch+create+persons\u0026amp;description=%0AFor+each+entry%3A+if+%60email%60+or+%60linkedin_url%60+matches+an+existing%0Atenant-visible+person%2C+that+person+is+returned+%28status+MATCHED%29+without+a%0Awrite%3B+otherwise+a+n\u0026amp;theme=2e1657476a2935937e03de5f\u0026amp;signature=8eeebb367b514ac85d98a65026da3078f57d8ede60a6890e9bcfc6e004b94994\">\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=\"Batch create persons - Rings AI\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"For each entry: if email or linkedin_url matches an existing tenant-visible person, that person is returned (status MATCHED) without a write; otherwise a new tenant-source record is created (status CREATED). Set update_matched to write a matched row\u0026#x27;s remaining fields onto the person it matched (status UPDATED) -- without it, fields like job_title on a row for someone already in the tenant are silently discarded. This mirrors the matching of GET /v1/persons/lookup, but is broader than the dedupe on POST /v1/persons, which matches on email only — a linkedin_url-only match against an existing person returns MATCHED here, but would create a duplicate via a single POST /v1/persons call with no email set. Items are processed independently — a single failing row comes back as status ERROR without sinking the rest of the batch. Results are returned in input order. Duplicate identifiers within the same batch resolve to one record: a later row sharing an email/linkedin_url with an earlier row comes back MATCHED against the first row\u0026#x27;s UUID rather than creating a second person (an earlier create isn\u0026#x27;t yet visible to the matcher mid-batch). This is the bulk primitive for an import flow: look people up first (POST /v1/persons/lookup/batch), then create the unmatched remainder here, then attach notes (POST /v1/notes/batch).\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://rings-ai.mintlify.app/_mintlify/api/og/v2?division=Person\u0026amp;title=Batch+create+persons\u0026amp;description=%0AFor+each+entry%3A+if+%60email%60+or+%60linkedin_url%60+matches+an+existing%0Atenant-visible+person%2C+that+person+is+returned+%28status+MATCHED%29+without+a%0Awrite%3B+otherwise+a+n\u0026amp;theme=2e1657476a2935937e03de5f\u0026amp;signature=8eeebb367b514ac85d98a65026da3078f57d8ede60a6890e9bcfc6e004b94994\">\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=\"/mintlify-assets/_mintlify/favicons/rings-ai/_zk5vOoQ8ix_XOCm/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Rings AI\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#6366F1\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.rings.ai/api-reference/person/batch-create\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/person/batch-create.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.rings.ai/#organization\",\"name\":\"Rings AI\",\"url\":\"https://docs.rings.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/rings-ai/EVsJFZndjLtW_7WK/images/Group5.svg?fit=max\u0026auto=format\u0026n=EVsJFZndjLtW_7WK\u0026q=85\u0026s=bbbf7303b09ab9978ffaee9e90f250ec\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.rings.ai#website\",\"name\":\"Rings AI\",\"url\":\"https://docs.rings.ai\",\"publisher\":{\"@id\":\"https://docs.rings.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.rings.ai/api-reference/person/batch-create#webpage\",\"url\":\"https://docs.rings.ai/api-reference/person/batch-create\",\"name\":\"Batch create persons\",\"description\":\"For each entry: if email or linkedin_url matches an existing tenant-visible person, that person is returned (status MATCHED) without a write; otherwise a new tenant-source record is created (status CREATED). Set update_matched to write a matched row's remaining fields onto the person it matched (status UPDATED) -- without it, fields like job_title on a row for someone already in the tenant are silently discarded. This mirrors the matching of GET /v1/persons/lookup, but is broader than the dedupe on POST /v1/persons, which matches on email only — a linkedin_url-only match against an existing person returns MATCHED here, but would create a duplicate via a single POST /v1/persons call with no email set. Items are processed independently — a single failing row comes back as status ERROR without sinking the rest of the batch. Results are returned in input order. Duplicate identifiers within the same batch resolve to one record: a later row sharing an email/linkedin_url with an earlier row comes back MATCHED against the first row's UUID rather than creating a second person (an earlier create isn't yet visible to the matcher mid-batch). This is the bulk primitive for an import flow: look people up first (POST /v1/persons/lookup/batch), then create the unmatched remainder here, then attach notes (POST /v1/notes/batch).\",\"dateModified\":\"2026-09-10T07:57:56.045Z\",\"isPartOf\":{\"@id\":\"https://docs.rings.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.rings.ai/api-reference/person/batch-create#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.rings.ai/api-reference/person/batch-create#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Person\",\"item\":\"https://docs.rings.ai/api-reference/person/list-persons\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Batch create persons\",\"item\":\"https://docs.rings.ai/api-reference/person/batch-create\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.rings.ai/api-reference/person/batch-create#apireference\",\"headline\":\"Batch create persons\",\"name\":\"Batch create persons\",\"description\":\"For each entry: if email or linkedin_url matches an existing tenant-visible person, that person is returned (status MATCHED) without a write; otherwise a new tenant-source record is created (status CREATED). Set update_matched to write a matched row's remaining fields onto the person it matched (status UPDATED) -- without it, fields like job_title on a row for someone already in the tenant are silently discarded. This mirrors the matching of GET /v1/persons/lookup, but is broader than the dedupe on POST /v1/persons, which matches on email only — a linkedin_url-only match against an existing person returns MATCHED here, but would create a duplicate via a single POST /v1/persons call with no email set. Items are processed independently — a single failing row comes back as status ERROR without sinking the rest of the batch. Results are returned in input order. Duplicate identifiers within the same batch resolve to one record: a later row sharing an email/linkedin_url with an earlier row comes back MATCHED against the first row's UUID rather than creating a second person (an earlier create isn't yet visible to the matcher mid-batch). This is the bulk primitive for an import flow: look people up first (POST /v1/persons/lookup/batch), then create the unmatched remainder here, then attach notes (POST /v1/notes/batch).\",\"url\":\"https://docs.rings.ai/api-reference/person/batch-create\",\"mainEntityOfPage\":{\"@id\":\"https://docs.rings.ai/api-reference/person/batch-create#webpage\"},\"dateModified\":\"2026-09-10T07:57:56.045Z\",\"publisher\":{\"@id\":\"https://docs.rings.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.rings.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Rings AI\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Rings AI","nav":{"global":null,"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":""}]},{"tab":"API Reference","groups":[{"group":"Introduction","pages":[{"title":"Overview","href":"/api-reference/introduction"}]},{"group":"Person","pages":[{"title":"List persons","openapi":"GET /v1/persons","href":"/api-reference/person/list-persons"},{"title":"List person custom fields","openapi":"GET /v1/persons/custom-fields","href":"/api-reference/person/list-custom-fields"},{"title":"Create a person","openapi":"POST /v1/persons","description":"\nAll fields are optional. If the provided `email` matches an existing person\nin the tenant, the existing record is updated in place and its UUID is returned\n(deduplication by email). Returns the UUID and rings_updated_at timestamp on\nsuccess.\n\nAn `email` for a person who already exists is added to their next free\nemail slot rather than replacing slot 1 -- overwriting it would drop the\naddress the app shows as their primary. The response's `email_slot` says\nwhere the address landed, and is null if the person already held it or all\nfive slots were full.","href":"/api-reference/person/create-person"},{"title":"Batch create persons","openapi":"POST /v1/persons/batch","href":"/api-reference/person/batch-create"},{"title":"Lookup a person","openapi":"GET /v1/persons/lookup","description":"\nSearches across tenant-visible persons (including global records). At least\none of email, linkedin_url, domain, or name must be provided. Returns up to\n`limit` matches (default 5, max 20), ranked so tenant-specific records\nappear before global ones.\n\nParameters:\n- email: Matches any of the person's emails (case/whitespace-insensitive)\n- linkedin_url: LinkedIn profile URL (e.g. 'https://linkedin.com/in/johndoe')\n- domain: Email domain to match — e.g. 'acme.com' matches 'alice@acme.com'\n- name: Fuzzy (similarity-ranked) match on display name, e.g. for deduping\n name-only lists such as conference rosters. Unlike the other criteria this\n is not an exact key — several people can match. Results are ranked by\n `similarity_score`; use it alongside `company_name`/`job_title`/location to\n decide whether a candidate is the same person before creating a new record.\n- limit: Max results to return (default: 5, max: 20)","href":"/api-reference/person/lookup"},{"title":"Batch lookup persons","openapi":"POST /v1/persons/lookup/batch","href":"/api-reference/person/lookup-batch"},{"title":"Get a person","openapi":"GET /v1/persons/{person_uuid}","href":"/api-reference/person/get-person"},{"title":"Update a person","openapi":"PUT /v1/persons/{person_uuid}","href":"/api-reference/person/update-person"},{"title":"Merge persons","openapi":"POST /v1/persons/{person_uuid}/merge","href":"/api-reference/person/merge-person"}]},{"group":"Company","pages":[{"title":"List companies","openapi":"GET /v1/companies","href":"/api-reference/company/list-companies"},{"title":"Create a company","openapi":"POST /v1/companies","href":"/api-reference/company/create-company"},{"title":"Lookup a company","openapi":"GET /v1/companies/lookup","href":"/api-reference/company/lookup"},{"title":"Get a company","openapi":"GET /v1/companies/{company_uuid}","href":"/api-reference/company/get-company"},{"title":"List company employees","openapi":"GET /v1/companies/{company_uuid}/employees","href":"/api-reference/company/list-employees"},{"title":"Update a company","openapi":"PUT /v1/companies/{company_uuid}","href":"/api-reference/company/update-company"},{"title":"Batch lookup companies","openapi":"POST /v1/companies/lookup/batch","href":"/api-reference/company/lookup-batch"}]},{"group":"Opportunity","pages":[{"title":"List opportunities","openapi":"GET /v1/opportunities","href":"/api-reference/opportunity/list-opportunities"},{"title":"Create an opportunity","openapi":"POST /v1/opportunities","href":"/api-reference/opportunity/create-opportunity"},{"title":"Get an opportunity","openapi":"GET /v1/opportunities/{opportunity_uuid}","href":"/api-reference/opportunity/get-opportunity"},{"title":"Update an opportunity","openapi":"PUT /v1/opportunities/{opportunity_uuid}","href":"/api-reference/opportunity/update-opportunity"},{"title":"Delete opportunities","openapi":"DELETE /v1/opportunities","href":"/api-reference/opportunity/delete-opportunities"},{"title":"Add opportunity association","openapi":"POST /v1/opportunities/{opportunity_uuid}/associations","href":"/api-reference/opportunity/add-association"},{"title":"Delete opportunity association","openapi":"DELETE /v1/opportunities/{opportunity_uuid}/associations/{association_uuid}","href":"/api-reference/opportunity/delete-association"},{"title":"List opportunity types","openapi":"GET /v1/opportunity-types","href":"/api-reference/opportunity/list-types"},{"title":"List opportunity stages","openapi":"GET /v1/opportunity-types/{type_uuid}/stages","href":"/api-reference/opportunity/list-stages"},{"title":"List opportunities for a company","openapi":"GET /v1/companies/{company_uuid}/opportunities","href":"/api-reference/opportunity/list-by-company"},{"title":"List opportunities for a person","openapi":"GET /v1/persons/{person_uuid}/opportunities","href":"/api-reference/opportunity/list-by-person"}]},{"group":"Activity","pages":[{"title":"Get activity body","openapi":"GET /v1/activities/{activity_object_id}/body","href":"/api-reference/activity/get-body"},{"title":"Get activity thread","openapi":"GET /v1/activities/{activity_object_id}/thread","href":"/api-reference/activity/get-thread"},{"title":"Company activities","openapi":"GET /v1/companies/{company_uuid}/activities","href":"/api-reference/activity/company-activities"},{"title":"Company activity stats","openapi":"GET /v1/companies/{company_uuid}/activity-stats","href":"/api-reference/activity/company-activity-stats"},{"title":"Bulk company activity stats","openapi":"POST /v1/companies/activity-stats/batch","href":"/api-reference/activity/company-activity-stats-batch"},{"title":"Person activities","openapi":"GET /v1/persons/{person_uuid}/activities","href":"/api-reference/activity/person-activities"},{"title":"Person activity stats","openapi":"GET /v1/persons/{person_uuid}/activity-stats","href":"/api-reference/activity/person-activity-stats"},{"title":"Bulk person activity stats","openapi":"POST /v1/persons/activity-stats/batch","href":"/api-reference/activity/person-activity-stats-batch"}]},{"group":"Meetings","pages":[{"title":"List meetings","openapi":"GET /v1/meetings","href":"/api-reference/meetings/list-meetings"},{"title":"Get a meeting","openapi":"GET /v1/meetings/{activity_id}","href":"/api-reference/meetings/get-meeting"}]},{"group":"Note","pages":[{"title":"List notes","openapi":"GET /v1/notes","href":"/api-reference/note/list-notes"},{"title":"Create a note","openapi":"POST /v1/notes","href":"/api-reference/note/create-note"},{"title":"Batch create notes","openapi":"POST /v1/notes/batch","href":"/api-reference/note/batch-create"},{"title":"Search notes","openapi":"POST /v1/notes/search","href":"/api-reference/note/search"},{"title":"Get a note","openapi":"GET /v1/notes/{note_uuid}","href":"/api-reference/note/get-note"},{"title":"Update a note","openapi":"PUT /v1/notes/{note_uuid}","href":"/api-reference/note/update-note"},{"title":"Delete a note","openapi":"DELETE /v1/notes/{note_uuid}","href":"/api-reference/note/delete-note"},{"title":"Add note association","openapi":"POST /v1/notes/{note_uuid}/associations","href":"/api-reference/note/add-association"},{"title":"Delete note association","openapi":"DELETE /v1/notes/{note_uuid}/associations/{association_uuid}","href":"/api-reference/note/delete-association"}]},{"group":"Task","pages":[{"title":"List tasks","openapi":"GET /v1/tasks","href":"/api-reference/task/list-tasks"},{"title":"Create a task","openapi":"POST /v1/tasks","href":"/api-reference/task/create-task"},{"title":"Get a task","openapi":"GET /v1/tasks/{task_id}","href":"/api-reference/task/get-task"},{"title":"Update a task","openapi":"PUT /v1/tasks/{task_id}","href":"/api-reference/task/update-task"},{"title":"Delete a task","openapi":"DELETE /v1/tasks/{task_id}","href":"/api-reference/task/delete-task"},{"title":"Add task association","openapi":"POST /v1/tasks/{task_id}/associations","href":"/api-reference/task/add-association"},{"title":"Delete task association","openapi":"DELETE /v1/tasks/{task_id}/associations/{association_uuid}","href":"/api-reference/task/delete-association"}]},{"group":"Recommended Paths","pages":[{"title":"Recommended paths to a person","openapi":"GET /v1/persons/{person_uuid}/recommended-paths","href":"/api-reference/recommended-paths/person"},{"title":"Recommended paths to a company","openapi":"GET /v1/companies/{company_uuid}/recommended-paths","href":"/api-reference/recommended-paths/company"},{"title":"Bulk recommended paths (persons)","openapi":"POST /v1/persons/recommended-paths/batch","href":"/api-reference/recommended-paths/person-batch"},{"title":"Bulk recommended paths (companies)","openapi":"POST /v1/companies/recommended-paths/batch","href":"/api-reference/recommended-paths/company-batch"}]},{"group":"PathPower","pages":[{"title":"Bulk PathPower scores","openapi":"GET /v1/pathpower/scores","href":"/api-reference/pathpower/bulk-scores"},{"title":"PathPower for a person","openapi":"GET /v1/persons/{person_uuid}/pathpower","href":"/api-reference/pathpower/person"},{"title":"PathPower for a company","openapi":"GET /v1/companies/{company_uuid}/pathpower","href":"/api-reference/pathpower/company"}]},{"group":"Relationships","pages":[{"title":"List ring relationships","openapi":"GET /v1/relationships","href":"/api-reference/relationships/ring"},{"title":"My relationships","openapi":"GET /v1/relationships/mine","href":"/api-reference/relationships/mine"}]},{"group":"Intro","pages":[{"title":"List intros","openapi":"GET /v1/intros","href":"/api-reference/intro/list-intros"},{"title":"Log intro","openapi":"POST /v1/intros","href":"/api-reference/intro/log-intro"},{"title":"Update intro","openapi":"PUT /v1/intros/{intro_uuid}","href":"/api-reference/intro/update-intro"},{"title":"Delete intro","openapi":"DELETE /v1/intros/{intro_uuid}","href":"/api-reference/intro/delete-intro"},{"title":"List intro options","openapi":"GET /v1/intros/options","href":"/api-reference/intro/list-options"},{"title":"Get intro insights","openapi":"GET /v1/intros/insights","href":"/api-reference/intro/insights"}]},{"group":"AI Summary","pages":[{"title":"AI summary for a person","openapi":"GET /v1/persons/{person_uuid}/ai-summary","href":"/api-reference/ai-summary/person"},{"title":"AI summary for a company","openapi":"GET /v1/companies/{company_uuid}/ai-summary","href":"/api-reference/ai-summary/company"}]},{"group":"Entity Lists","pages":[{"title":"List entity lists","openapi":"GET /v1/lists","href":"/api-reference/lists/list-lists"},{"title":"List entity list members","openapi":"GET /v1/lists/{list_uuid}/entities","href":"/api-reference/lists/list-entities"},{"title":"Create an entity list","openapi":"POST /v1/lists","href":"/api-reference/lists/create-list"},{"title":"Update an entity list","openapi":"PUT /v1/lists/{list_uuid}","href":"/api-reference/lists/update-list"}]},{"group":"Users","pages":[{"title":"Get current user","openapi":"GET /v1/me","href":"/api-reference/users/me"},{"title":"List users","openapi":"GET /v1/users","href":"/api-reference/users/list-users"}]}]}]},"title":"Batch create persons - Rings AI","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-26-lDe7V.js","utils-CWQmgYtH.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-4-Aw3rSD.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-C2zjXYA5.js","snippetPresets-DFmpFA7C.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-FJpQavWq.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-D_GvPF7k.js","shallow-Bs2ZB0NO.js","getApiPlaygroundDisplay-DCcqJJk-.js","CodeSnippet-DzDxawVe.js","CodeSnippets-aUr7fU-7.js","Page-CT9uE8Ip.js","getPastedJson-Y1fKsj_I.js","icon-DI4zTsDr.js","MethodPill-C0nDlmSQ.js","DuplicateIcon-NUXbx2nQ.js","createIcon-BdTHrPAi.js","DynamicMarkdown-CtpgKJwj.js","SectionHeading-B3x35tOt.js","axios-vUo_bRtp.js","Markdown-3OmurJMP.js","clsx-DMKzROTp.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-1ms6tsT-.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-Ke9xIMFx.js"]}