{"openapi":"3.0.0","info":{"title":"Dex Public API","version":"1.0.0","description":"The Dex API lets you programmatically manage your contacts, notes, and reminders. Authenticate using an API key generated from Settings > API in the Dex app.\n\n## Rate Limits\nEvery response carries rate-limit state in two header families, so you can use whichever your HTTP client understands:\n\n- **IETF standard** (`draft-ietf-httpapi-ratelimit-headers`): `RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset`, plus the structured-field `RateLimit` and `RateLimit-Policy` headers.\n- **Legacy** (still emitted, and not going away): `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset`.\n\nBoth families report the same numbers. `*-Reset` is **seconds remaining in the current window**, not a Unix timestamp. On `429 Too Many Requests`, respect the `Retry-After` header (seconds) before retrying.\n\n## API key access and workspace\nEach API key is either **Read & write** (the default) or **Read-only**, and works in one place: your Personal Dex, or one workspace. You choose both in Settings > Dex API & MCP; the access can change later, the workspace cannot. A key bound to a workspace where you can only read (a viewer, or a workspace being deleted) is read-only and cannot be given write access. Being made a viewer, or the workspace being scheduled for deletion, turns such keys read-only; giving them write access again afterwards is up to you.\n\n- A read-only key answers `403` with `error.code` `api_key_read_only` on calls that change data within its scope. A viewer must first ask a workspace owner or admin to change their role, then set the key to Read & write; a workspace being deleted permits no changes until an owner or admin cancels deletion. `GET` endpoints, `POST /v2/contacts/search`, `POST /v2/contacts/filter`, `POST /v1/contacts/filter` and `POST /v1/contacts/by-emails` (without `createFromOAuthInteractions`) read, as does `POST /v2/contacts/{contactId}/research` without `run`.\n- A Personal key works only in your Personal Dex: a request that names a workspace in `X-Dex-Workspace` answers `403` `api_key_personal_only`, never your Personal data.\n- A workspace-bound key works only in its workspace, with or without the `X-Dex-Workspace` header, and only through `/v2`. A header naming another workspace answers `403` `api_key_workspace_only`, as does any Personal-only endpoint and all of `/v1` called without the header (with it, an endpoint that takes no workspace answers `400` `workspace_context_unsupported` first). Scope refusals take precedence over `api_key_read_only` for every key; operations closed to API keys answer 403 `forbidden` first, whatever the key's access. `GET /v2/workspaces` lists only its workspace. Every response to a bound key carries an `X-Dex-Api-Key-Workspace` header with its workspace id.\n- `GET /v2/users/me` is the one Personal endpoint a workspace-bound key may call, so a client can identify the account behind it. For a read-only or workspace-bound key it leaves out the account's stored credentials (`email_key`, `zapier_key` and the saved LinkedIn, Instagram and Facebook sync sessions). A read-only key's `include` creates no settings row the account never set up; a workspace-bound key's `include` is ignored, so its response carries no related records.\n\n## Dex for Teams workspaces\nTo work in a Dex for Teams workspace, create a key for that workspace in Settings > Dex API & MCP; its requests act there with or without the `X-Dex-Workspace` header. A Personal key never reaches a workspace. `GET /v2/workspaces` lists the workspaces you belong to, your role in each, and whether API & MCP access is turned on.\n\n- A workspace is reachable by API key **only after a workspace owner or admin turns on \"Allow API & MCP access\"** in its settings. Until then a request naming it answers `403` with `error.code` `workspace_api_access_disabled`.\n- Your role applies: viewers can read, members can read and write. Destructive operations are never available to an API key, whatever your role: deleting or merging contacts, deleting, batch-deleting or merging groups and tags, bulk contact updates (which can archive), and managing the workspace. They answer `403`.\n- Only the contacts, groups, tags, notes and contact sub-resource endpoints act in a workspace. Any other endpoint answers `400` `workspace_context_unsupported` to the header rather than serving your Personal data.\n- A request that names a workspace never falls back to Personal: a refused request changes nothing.\n\n## Error Format\nAll non-2xx responses return JSON with the shape `{ error: { code, message, hint?, details? } }`. Pattern-match on `error.code` rather than `error.message`. Every documented 4xx/5xx response in this spec references the shared `Error` schema.\n\n## Versioning & Deprecation Policy\nDex uses **URL-path major versioning**: every endpoint is namespaced under a major version (`/v1`, `/v2`). The version is part of the path, never a header or query parameter, so a URL always pins the contract it was written against.\n\n**What can change inside a major version (no notice, treat as routine):**\n\n- New endpoints and new optional request fields.\n- New fields added to existing response objects.\n- New values in non-exhaustive enums, and new `error.code` values.\n\nWrite clients that **tolerate unknown response fields** and that pattern-match on `error.code` with a default branch. Additive changes will not be treated as breaking.\n\n**What never changes inside a major version:** removing or renaming a field or endpoint, changing a field type, tightening validation, or changing the meaning of an existing `error.code`. Changes like these ship as a **new major version path** (for example `/v2`) while the previous version keeps working.\n\n**Current status:** `/v1` is the stable, supported public API surface. It is **not deprecated and has no sunset date**. `/v2` is the newer canonical surface and is additive — adopting it is optional.\n\n**How a deprecation would be announced.** If Dex ever deprecates a version or an individual endpoint, all of the following happen before anything is removed:\n\n1. **At least 12 months of notice** before the endpoint stops responding, announced by email to every API-key owner and published in the API changelog.\n2. The affected operations are marked `deprecated: true` in this OpenAPI document, with the replacement named in the operation description.\n3. Affected responses carry the `Deprecation` and `Sunset` response headers ([RFC 8594](https://www.rfc-editor.org/rfc/rfc8594.html)) for the entire notice window, so automated clients can detect the change without reading release notes.\n4. A migration guide is published alongside the announcement.\n\nThe absence of `deprecated: true` on an operation and of `Deprecation`/`Sunset` headers on its responses means that endpoint is fully supported. No Dex API endpoint carries them today.","contact":{"name":"Dex Support","email":"contact@getdex.com","url":"https://getdex.com"},"license":{"name":"Dex Terms of Service","url":"https://getdex.com/termsofservice"},"termsOfService":"https://getdex.com/termsofservice"},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Use your Dex API key (e.g. dex_abc123...) as the Bearer token."}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Stable machine-readable slug. Pattern-match on this, not `message`.","example":"rate_limited"},"message":{"type":"string","description":"Human-readable description of the error."},"hint":{"type":"string","description":"Optional resolution guidance (e.g. \"Respect the Retry-After header before retrying.\")."},"details":{"type":"object","additionalProperties":true,"description":"Optional structured context. For validation errors, typically `{ fields: { <field>: <reason> } }`."}}}}}},"headers":{"RateLimit-Limit":{"description":"Max requests in the current window. IETF-standard spelling of `X-RateLimit-Limit`.","schema":{"type":"integer","minimum":0},"example":600},"RateLimit-Remaining":{"description":"Requests remaining in the current window. IETF-standard spelling of `X-RateLimit-Remaining`.","schema":{"type":"integer","minimum":0},"example":599},"RateLimit-Reset":{"description":"Seconds until the current window resets (not a Unix epoch). IETF-standard spelling of `X-RateLimit-Reset`.","schema":{"type":"integer","minimum":0},"example":58},"RateLimit":{"description":"Structured-field form of the current quota state: `\"default\";r=<remaining>;t=<seconds until reset>`.","schema":{"type":"string"},"example":"\"default\";r=599;t=58"},"RateLimit-Policy":{"description":"Structured-field description of the quota policy in force: `\"default\";q=<limit>;w=60`.","schema":{"type":"string"},"example":"\"default\";q=600;w=60"},"X-RateLimit-Limit":{"description":"Max requests in the current window.","schema":{"type":"integer","minimum":0},"example":600},"X-RateLimit-Remaining":{"description":"Requests remaining in the current window.","schema":{"type":"integer","minimum":0},"example":599},"X-RateLimit-Reset":{"description":"Seconds until the current rate-limit window resets (not a Unix epoch). Matches @fastify/rate-limit's default semantics.","schema":{"type":"integer","minimum":0},"example":58},"Retry-After":{"description":"Seconds to wait before retrying. Sent on 429; may be sent on 503.","schema":{"type":"integer","minimum":0},"example":30}}},"paths":{"/v1":{"get":{"responses":{"200":{"description":"The API is reachable. Returns a plain-text greeting; use it as an unauthenticated liveness probe for the v1 surface.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"text/plain":{"schema":{"type":"string","example":"Welcome to Dex Lightning API!"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiRootV1","summary":"API root (v1)","description":"Unauthenticated liveness check for the v1 surface. Takes no parameters and returns a plain-text greeting with a 200 status. Use it to confirm connectivity and DNS before authenticating; it does not validate your API key.","security":[]}},"/v1/contacts/{contactId}":{"get":{"tags":["contacts"],"parameters":[{"schema":{"type":"object","properties":{"linkedin_data":{"type":"boolean"},"web_search_summary":{"type":"boolean"},"groups_count":{"type":"boolean"},"coordinates":{"type":"boolean"},"last_note":{"type":"boolean"},"contact_emails":{"type":"boolean"},"contact_phone_numbers":{"type":"boolean"},"contact_birthdays":{"type":"boolean"},"contact_locations":{"type":"boolean"},"contacts_custom_fields":{"type":"boolean"},"legacy_contact_addresses":{"type":"boolean"},"groups_contacts":{"type":"boolean"},"tags_contacts":{"type":"boolean"},"timeline_items_contacts":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"feed_items":{"type":"boolean"},"keep_in_touch_reminders":{"type":"boolean"},"contact_relations_contact_relations_sourceTocontacts":{"type":"boolean"},"contact_relations_contact_relations_destinationTocontacts":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["linkedin_data","web_search_summary","groups_count","coordinates","last_note","contact_emails","contact_phone_numbers","contact_birthdays","contact_locations","contacts_custom_fields","legacy_contact_addresses","groups_contacts","tags_contacts","timeline_items_contacts","reminders_contacts","feed_items","keep_in_touch_reminders","contact_relations_contact_relations_sourceTocontacts","contact_relations_contact_relations_destinationTocontacts"]}},"in":"query","name":"include","required":false},{"schema":{"type":"object","properties":{"linkedin_data":{"type":"boolean"},"web_search_summary":{"type":"boolean"},"groups_count":{"type":"boolean"},"coordinates":{"type":"boolean"},"last_note":{"type":"boolean"},"id":{"type":"boolean"},"user_id":{"type":"boolean"},"first_name":{"type":"boolean"},"last_name":{"type":"boolean"},"description":{"type":"boolean"},"birthday":{"type":"boolean"},"legacy_location":{"type":"boolean"},"education":{"type":"boolean"},"job_title":{"type":"boolean"},"company":{"type":"boolean"},"image_source":{"type":"boolean"},"image_url":{"type":"boolean"},"starred":{"type":"boolean"},"last_seen_at":{"type":"boolean"},"last_reminder_at":{"type":"boolean"},"first_met_at":{"type":"boolean"},"first_interaction_at":{"type":"boolean"},"facebook":{"type":"boolean"},"linkedin":{"type":"boolean"},"twitter":{"type":"boolean"},"instagram":{"type":"boolean"},"created_at":{"type":"boolean"},"updated_at":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"telegram":{"type":"boolean"},"website":{"type":"boolean"},"next_reminder_at":{"type":"boolean"},"source":{"type":"boolean"},"is_archived":{"type":"boolean"},"birthday_year":{"type":"boolean"},"linkedin_enhance_date":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"geocode_attempts":{"type":"boolean"},"geocode_failed_at":{"type":"boolean"},"full_name":{"type":"boolean"},"business_card_url":{"type":"boolean"},"linkedin_companies":{"type":"boolean"},"linkedin_education":{"type":"boolean"},"linkedin_last_message_at":{"type":"boolean"},"linkedin_last_message_snippet":{"type":"boolean"},"linkedin_message_link":{"type":"boolean"},"linkedin_urn":{"type":"boolean"},"linkedin_headline":{"type":"boolean"},"whatsapp_message_link":{"type":"boolean"},"whatsapp_message_snippet":{"type":"boolean"},"whatsapp_last_message_at":{"type":"boolean"},"frequency_text":{"type":"boolean"},"imessage_message_link":{"type":"boolean"},"imessage_message_snippet":{"type":"boolean"},"imessage_last_message_at":{"type":"boolean"},"instagram_message_link":{"type":"boolean"},"instagram_message_snippet":{"type":"boolean"},"instagram_last_message_at":{"type":"boolean"},"gmail_last_interaction_at":{"type":"boolean"},"gcal_last_interaction_at":{"type":"boolean"},"gmail_last_interaction_provider_id":{"type":"boolean"},"gcal_last_interaction_provider_id":{"type":"boolean"},"gmail_last_interaction_subject":{"type":"boolean"},"gcal_last_interaction_title":{"type":"boolean"},"phone_call_interaction_snippet":{"type":"boolean"},"phone_call_last_interaction_at":{"type":"boolean"},"tiktok":{"type":"boolean"},"youtube":{"type":"boolean"},"gmail_last_interaction_provider":{"type":"boolean"},"gcal_last_interaction_provider":{"type":"boolean"},"priority_tier":{"type":"boolean"},"workspace_id":{"type":"boolean"},"contact_emails":{"type":"boolean"},"contact_phone_numbers":{"type":"boolean"},"contact_birthdays":{"type":"boolean"},"contact_locations":{"type":"boolean"},"contacts_custom_fields":{"type":"boolean"},"legacy_contact_addresses":{"type":"boolean"},"groups_contacts":{"type":"boolean"},"tags_contacts":{"type":"boolean"},"timeline_items_contacts":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"feed_items":{"type":"boolean"},"keep_in_touch_reminders":{"type":"boolean"},"contact_relations_contact_relations_sourceTocontacts":{"type":"boolean"},"contact_relations_contact_relations_destinationTocontacts":{"type":"boolean"},"frequency":{"type":"boolean"},"frequency_interval":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["linkedin_data","web_search_summary","groups_count","coordinates","last_note","id","user_id","first_name","last_name","description","birthday","legacy_location","education","job_title","company","image_source","image_url","starred","last_seen_at","last_reminder_at","first_met_at","first_interaction_at","facebook","linkedin","twitter","instagram","created_at","updated_at","never_keep_in_touch","telegram","website","next_reminder_at","source","is_archived","birthday_year","linkedin_enhance_date","ignore_merge","geocode_attempts","geocode_failed_at","full_name","business_card_url","linkedin_companies","linkedin_education","linkedin_last_message_at","linkedin_last_message_snippet","linkedin_message_link","linkedin_urn","linkedin_headline","whatsapp_message_link","whatsapp_message_snippet","whatsapp_last_message_at","frequency_text","imessage_message_link","imessage_message_snippet","imessage_last_message_at","instagram_message_link","instagram_message_snippet","instagram_last_message_at","gmail_last_interaction_at","gcal_last_interaction_at","gmail_last_interaction_provider_id","gcal_last_interaction_provider_id","gmail_last_interaction_subject","gcal_last_interaction_title","phone_call_interaction_snippet","phone_call_last_interaction_at","tiktok","youtube","gmail_last_interaction_provider","gcal_last_interaction_provider","priority_tier","workspace_id","contact_emails","contact_phone_numbers","contact_birthdays","contact_locations","contacts_custom_fields","legacy_contact_addresses","groups_contacts","tags_contacts","timeline_items_contacts","reminders_contacts","feed_items","keep_in_touch_reminders","contact_relations_contact_relations_sourceTocontacts","contact_relations_contact_relations_destinationTocontacts","frequency","frequency_interval"]}},"in":"query","name":"select","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"full_name":{"nullable":true,"type":"string"},"description":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"},"company":{"nullable":true,"type":"string"},"education":{"nullable":true,"type":"string"},"legacy_location":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"business_card_url":{"nullable":true,"type":"string"},"website":{"nullable":true,"type":"string"},"image_source":{"nullable":true,"type":"string"},"birthday":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"birthday_year":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"linkedin":{"nullable":true,"type":"string"},"twitter":{"nullable":true,"type":"string"},"facebook":{"nullable":true,"type":"string"},"instagram":{"nullable":true,"type":"string"},"telegram":{"nullable":true,"type":"string"},"tiktok":{"nullable":true,"type":"string"},"youtube":{"nullable":true,"type":"string"},"starred":{"type":"boolean"},"is_archived":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"source":{"type":"string"},"priority_tier":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"frequency":{"nullable":true,"type":"string"},"frequency_text":{"nullable":true,"type":"string"},"last_seen_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"last_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_met_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_companies":{"nullable":true,"type":"string"},"linkedin_education":{"nullable":true,"type":"string"},"linkedin_enhance_date":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_snippet":{"nullable":true,"type":"string"},"linkedin_message_link":{"nullable":true,"type":"string"},"linkedin_urn":{"nullable":true,"type":"string"},"linkedin_headline":{"nullable":true,"type":"string"},"whatsapp_message_link":{"nullable":true,"type":"string"},"whatsapp_message_snippet":{"nullable":true,"type":"string"},"whatsapp_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"imessage_message_link":{"nullable":true,"type":"string"},"imessage_message_snippet":{"nullable":true,"type":"string"},"imessage_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"instagram_message_link":{"nullable":true,"type":"string"},"instagram_message_snippet":{"nullable":true,"type":"string"},"instagram_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gmail_last_interaction_provider_id":{"nullable":true,"type":"string"},"gmail_last_interaction_subject":{"nullable":true,"type":"string"},"gcal_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gcal_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gcal_last_interaction_provider_id":{"nullable":true,"type":"string"},"gcal_last_interaction_title":{"nullable":true,"type":"string"},"phone_call_interaction_snippet":{"nullable":true,"type":"string"},"phone_call_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"web_search_summary":{"nullable":true},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"geocode_attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"geocode_failed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false},"frequency_interval":{},"linkedin_data":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"latitude":{"nullable":true,"type":"number"},"longitude":{"nullable":true,"type":"number"},"last_note":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"preview":{"type":"string"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"}},"required":["id","preview","event_time","emoji","meeting_type"],"additionalProperties":false},"team_keep_in_touch":{"nullable":true,"type":"object","properties":{"cadence_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["cadence_id","frequency_id","days","next_due_at","snoozed_until"],"additionalProperties":false},"contact_emails":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_birthdays":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contact_locations":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contacts_custom_fields":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"tags_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_sourceTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_destinationTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"feed_items":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"keep_in_touch_reminders":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getContactV1","summary":"Get a contact","description":"Retrieve a single contact by its unique ID. Returns the full contact record including name, company, job title, emails, phone numbers, and all associated metadata.","x-mint":{"content":"## Use cases\n\n- Display a contact detail page in your application\n- Fetch the latest data for a specific contact before updating it\n- Verify a contact exists before performing operations on it\n\n<Note>The contact must belong to the authenticated user. Requesting a contact that does not exist or belongs to another user returns a 404 error.</Note>"}},"put":{"tags":["contacts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"full_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"job_title":{"anyOf":[{"type":"string"},{"type":"null"}]},"legacy_location":{"anyOf":[{"type":"string"},{"type":"null"}]},"company":{"anyOf":[{"type":"string"},{"type":"null"}]},"education":{"anyOf":[{"type":"string"},{"type":"null"}]},"starred":{"type":"boolean"},"source":{"type":"string","enum":["linkedin_sync","facebook_import","cal_ingest","email_ingest","web_import","csv_import","whatsapp_sync","imessage_sync","phone_calls_sync","mobile","mobile_import","instagram_sync","oauth_interaction","granola_sync"]},"coordinates":{"type":"object","properties":{"operation":{"type":"string","enum":["set","delete"]},"data":{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180}},"additionalProperties":false}},"required":["operation"],"additionalProperties":false},"priority_tier":{"anyOf":[{"type":"integer","minimum":1,"maximum":32767},{"type":"null"}]},"image_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"image_source":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"business_card_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"website":{"anyOf":[{},{"type":"null"}]},"birthday":{"anyOf":[{"type":"string","format":"date","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])))$"},{"type":"null"}]},"birthday_year":{"anyOf":[{"type":"number","minimum":1900,"maximum":2100},{"type":"null"}]},"frequency":{"anyOf":[{"type":"string"},{"type":"null"}]},"last_seen_at":{"anyOf":[{},{"type":"null"}]},"first_met_at":{"anyOf":[{},{"type":"null"}]},"never_keep_in_touch":{"type":"boolean"},"next_reminder_at":{},"linkedin":{"anyOf":[{"type":"string"},{"type":"null"}]},"twitter":{"anyOf":[{"type":"string"},{"type":"null"}]},"facebook":{"anyOf":[{"type":"string"},{"type":"null"}]},"instagram":{"anyOf":[{"type":"string"},{"type":"null"}]},"telegram":{"anyOf":[{"type":"string"},{"type":"null"}]},"tiktok":{"anyOf":[{"type":"string"},{"type":"null"}]},"youtube":{"anyOf":[{"type":"string"},{"type":"null"}]},"whatsapp_message_link":{"type":"string"},"whatsapp_message_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"whatsapp_last_message_at":{"anyOf":[{},{"type":"null"}]},"imessage_message_link":{"type":"string"},"imessage_message_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"imessage_last_message_at":{"anyOf":[{},{"type":"null"}]},"linkedin_message_link":{"type":"string","maxLength":600},"linkedin_last_message_snippet":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"linkedin_last_message_at":{"anyOf":[{},{"type":"null"}]},"linkedin_data":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"instagram_message_link":{"type":"string"},"instagram_message_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"instagram_last_message_at":{"anyOf":[{},{"type":"null"}]},"gmail_last_interaction_at":{"anyOf":[{},{"type":"null"}]},"gmail_last_interaction_provider_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"gmail_last_interaction_subject":{"anyOf":[{"type":"string"},{"type":"null"}]},"gmail_last_interaction_provider":{"anyOf":[{"type":"string","enum":["GOOGLE","OFFICE365"]},{"type":"null"}]},"gcal_last_interaction_at":{"anyOf":[{},{"type":"null"}]},"gcal_last_interaction_provider_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"gcal_last_interaction_title":{"anyOf":[{"type":"string"},{"type":"null"}]},"gcal_last_interaction_provider":{"anyOf":[{"type":"string","enum":["GOOGLE","OFFICE365"]},{"type":"null"}]},"phone_call_last_interaction_at":{"anyOf":[{},{"type":"null"}]},"phone_call_interaction_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"web_search_summary":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{"formatted":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false}},"contact_emails":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","maxLength":320},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"ranking":{"type":"number"}},"required":["email"],"additionalProperties":false}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{"phone_number":{"type":"string","maxLength":50},"country_code":{"anyOf":[{"type":"string","maxLength":4},{"type":"null"}]},"phone_number_sanitized":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}]},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"ranking":{"type":"number"}},"required":["phone_number"],"additionalProperties":false}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{"group_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["group_id"],"additionalProperties":false}},"tags_contacts":{"anyOf":[{"type":"object","properties":{"append":{"type":"array","items":{"type":"object","properties":{"tag_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["tag_id"],"additionalProperties":false}},"remove":{"type":"array","items":{"type":"object","properties":{"tag_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["tag_id","contact_id"],"additionalProperties":false}},"replace":{}},"additionalProperties":false},{"type":"object","properties":{"append":{},"remove":{},"replace":{"type":"array","items":{"type":"object","properties":{"tag_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["tag_id"],"additionalProperties":false}}},"additionalProperties":false}]},"custom_fields":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["input"]},"text_value":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"custom_field":{}},"required":["id","type","text_value"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["autocomplete"]},"text_value":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"custom_field":{}},"required":["id","type","text_value"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["datepicker"]},"text_value":{"anyOf":[{"type":"string"},{"type":"null"}]},"date_value":{"anyOf":[{},{"type":"null"}]},"custom_field":{}},"required":["id","type"],"additionalProperties":false}]}},"contact_birthdays":{"type":"object","properties":{"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"last_dismissal_year":{"type":"number","minimum":1900,"maximum":2100}},"additionalProperties":false},"is_archived":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"related_contacts":{"anyOf":[{"type":"object","properties":{"append":{"type":"array","items":{"type":"object","properties":{"destination":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"source_contact":{},"destination_contact":{}},"required":["destination"],"additionalProperties":false}},"remove":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"source":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"destination":{}},"required":["source","destination"],"additionalProperties":false},{"type":"object","properties":{"source":{},"destination":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["source","destination"],"additionalProperties":false}]}},"replace":{}},"additionalProperties":false},{"type":"object","properties":{"append":{},"remove":{},"replace":{"type":"array","items":{"type":"object","properties":{"destination":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"source_contact":{},"destination_contact":{}},"required":["destination"],"additionalProperties":false}}},"additionalProperties":false}]}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"contact":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"full_name":{"nullable":true,"type":"string"},"description":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"},"company":{"nullable":true,"type":"string"},"education":{"nullable":true,"type":"string"},"legacy_location":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"business_card_url":{"nullable":true,"type":"string"},"website":{"nullable":true,"type":"string"},"image_source":{"nullable":true,"type":"string"},"birthday":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"birthday_year":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"linkedin":{"nullable":true,"type":"string"},"twitter":{"nullable":true,"type":"string"},"facebook":{"nullable":true,"type":"string"},"instagram":{"nullable":true,"type":"string"},"telegram":{"nullable":true,"type":"string"},"tiktok":{"nullable":true,"type":"string"},"youtube":{"nullable":true,"type":"string"},"starred":{"type":"boolean"},"is_archived":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"source":{"type":"string"},"priority_tier":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"frequency":{"nullable":true,"type":"string"},"frequency_text":{"nullable":true,"type":"string"},"last_seen_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"last_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_met_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_companies":{"nullable":true,"type":"string"},"linkedin_education":{"nullable":true,"type":"string"},"linkedin_enhance_date":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_snippet":{"nullable":true,"type":"string"},"linkedin_message_link":{"nullable":true,"type":"string"},"linkedin_urn":{"nullable":true,"type":"string"},"linkedin_headline":{"nullable":true,"type":"string"},"whatsapp_message_link":{"nullable":true,"type":"string"},"whatsapp_message_snippet":{"nullable":true,"type":"string"},"whatsapp_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"imessage_message_link":{"nullable":true,"type":"string"},"imessage_message_snippet":{"nullable":true,"type":"string"},"imessage_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"instagram_message_link":{"nullable":true,"type":"string"},"instagram_message_snippet":{"nullable":true,"type":"string"},"instagram_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gmail_last_interaction_provider_id":{"nullable":true,"type":"string"},"gmail_last_interaction_subject":{"nullable":true,"type":"string"},"gcal_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gcal_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gcal_last_interaction_provider_id":{"nullable":true,"type":"string"},"gcal_last_interaction_title":{"nullable":true,"type":"string"},"phone_call_interaction_snippet":{"nullable":true,"type":"string"},"phone_call_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"web_search_summary":{"nullable":true},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"geocode_attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"geocode_failed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false},"frequency_interval":{},"linkedin_data":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"latitude":{"nullable":true,"type":"number"},"longitude":{"nullable":true,"type":"number"},"last_note":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"preview":{"type":"string"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"}},"required":["id","preview","event_time","emoji","meeting_type"],"additionalProperties":false},"team_keep_in_touch":{"nullable":true,"type":"object","properties":{"cadence_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["cadence_id","frequency_id","days","next_due_at","snoozed_until"],"additionalProperties":false},"contact_emails":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_birthdays":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contact_locations":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contacts_custom_fields":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"tags_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_sourceTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_destinationTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"feed_items":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"keep_in_touch_reminders":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"required":["contact"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"updateContactV1","summary":"Update a contact","description":"Update a single contact by its ID. Only the fields included in the request body are modified; omitted fields remain unchanged.","x-mint":{"content":"## Use cases\n\n- Update a contact's job title or company after a career change\n- Star or archive a contact\n- Add or change a contact's email address or phone number\n\n<Note>This performs a partial update. Only send the fields you want to change — any field you omit will keep its current value.</Note>"}},"delete":{"tags":["contacts"],"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"message":{"type":"string"}},"required":["error","message"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteContactV1","summary":"Delete a contact","description":"Permanently delete a single contact by its ID. This removes the contact and all associated data including notes, reminders, and tag associations.","x-mint":{"content":"## Use cases\n\n- Remove a contact that was created by mistake\n- Delete a contact after they have been merged with another\n- Clean up a single outdated contact record\n\n<Warning>This action is permanent and cannot be undone. Consider archiving the contact instead if you may need the data later.</Warning>"}}},"/v1/contacts/":{"get":{"tags":["contacts"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"take","required":false},{"schema":{"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"skip","required":false},{"schema":{"type":"string","minLength":1,"maxLength":2048},"in":"query","name":"cursor","required":false,"description":"Opaque pagination cursor: the `nextCursor` of the previous page, passed back unchanged."},{"schema":{"type":"object","properties":{"in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Match contacts whose id is in this set (single id or array)."},"not_in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Exclude contacts whose id is in this set (single id or array)."},"ignore_merge":{"type":"boolean","description":"Filter by the `ignore_merge` flag (excluded from merge suggestions)."},"is_starred":{"type":"boolean","description":"Match starred (true) or non-starred (false) contacts."},"is_team_overdue":{"type":"boolean","description":"Workspace only. true: the Team cadence is overdue; false: the Team cadence exists and is not overdue. Contacts with no Team cadence match neither."},"is_my_overdue":{"type":"boolean","description":"Workspace only. true: the caller's cadence is overdue; false: the caller's cadence exists and is not overdue. Contacts the caller has no cadence on match neither."},"is_archived":{"type":"boolean","description":"Match archived (true) or active (false) contacts. Defaults to false when omitted."},"has_priority_tier":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"type":"array","items":{"type":"integer","minimum":1,"maximum":9007199254740991}},{"type":"boolean"}],"description":"Relationship priority tier: a tier number, an array of tiers (OR), or a boolean (true = any tier set, false = none)."},"has_linkedin":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"LinkedIn slug: an exact slug string, or a boolean for presence/absence of a LinkedIn handle."},"has_instagram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Instagram slug: an exact slug string, or a boolean for presence/absence of an Instagram handle."},"has_twitter":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Twitter/X slug: an exact slug string, or a boolean for presence/absence of a Twitter handle."},"has_facebook":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Facebook slug: an exact slug string, or a boolean for presence/absence of a Facebook profile."},"has_telegram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Telegram slug: an exact slug string, or a boolean for presence/absence of a Telegram handle."},"has_tiktok":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"TikTok slug: an exact slug string, or a boolean for presence/absence of a TikTok handle."},"has_youtube":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"YouTube slug: an exact slug string, or a boolean for presence/absence of a YouTube channel."},"has_source":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Contact source: a single source string or an array of sources (OR)."},"has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Full name: a bare string (fuzzy contains), an array of exact names, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_groups":{"anyOf":[{"type":"object","properties":{"not":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["not"],"additionalProperties":false},{"type":"boolean"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string"}}],"description":"Group membership: a group id, an array of group ids (OR), a boolean for any/no group, or `{ not }` to exclude group id(s)."},"has_user_created_groups":{"type":"boolean","description":"Non-system group membership: true for at least one user-created group; false for no user-created groups, including contacts with zero memberships or only Dex system-group memberships."},"has_grouping_signal":{"type":"boolean","description":"Internal organize prefilter: title, company, location, or LinkedIn summary is non-null and non-empty. Whitespace-only values are removed by the organize serializer.","enum":[true]},"has_groups_all":{"description":"Array of group-id rows: AND across rows, OR within each row (contact must be in at least one group from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_groups_only":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Exclusive group membership: the contact is in at least one of these group ids and in no group outside them. Contacts with no group never match."},"has_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Keep-in-touch cadence: a frequency string, or a boolean for presence/absence of a cadence."},"has_my_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Workspace only. The caller's own keep-in-touch cadence: a workspace frequency id, or a boolean for presence/absence of the caller's cadence."},"known_by":{"type":"string","minLength":1,"maxLength":128,"description":"Workspace only. An active member's user id: contacts that member has a known email, calendar or shared-note interaction with. For the caller's own id, their private notes count too."},"has_location":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Location: a string (fuzzy, accent-insensitive match), or a boolean for presence/absence of a location."},"has_location_exact":{"type":"string","description":"Location: exact string match (not fuzzy)."},"has_job_title":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Job title: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_never_keep_in_touch":{"type":"boolean","description":"Filter by the `never_keep_in_touch` flag."},"has_created_at":{"description":"Creation-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_updated_at":{"description":"Last-updated-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_next_due":{"description":"Workspace only. Team keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts with no Team cadence never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_my_next_due":{"description":"Workspace only. The caller's own keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts the caller has no cadence on never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_last_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Workspace only. The team's last interaction date, the one the \"Last team interaction\" sort orders by (the latest email, calendar event or shared note any member has with the contact): a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range (at least one bound, at most microsecond precision). Contacts with no team interaction never match a range."},"has_birthday":{"anyOf":[{"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))$"},{},{"type":"boolean"}],"description":"Birthday: a specific date (matches on day + month), or true for any birthday set."},"has_tag":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Match contacts carrying this single tag id."},"has_tags":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"type":"object","properties":{"not":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}]}},"required":["not"],"additionalProperties":false}],"description":"Tags: an array of tag ids (OR), or `{ not }` to exclude tag id(s)."},"has_tags_all":{"description":"Array of tag-id rows: AND across rows, OR within each row (contact must carry at least one tag from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_company":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Company: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Education: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_description":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Description/notes: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn companies text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn education text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_email":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one email."},"has_phone_number":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one phone number."},"not_has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose full name fuzzily matches this string / any of these strings."},"not_has_company":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose company fuzzily matches this string / any of these strings."},"not_has_job_title":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose job title fuzzily matches this string / any of these strings."},"not_has_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose education fuzzily matches this string / any of these strings."},"not_has_description":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose description fuzzily matches this string / any of these strings."},"not_has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn companies text fuzzily matches this string / any of these strings."},"not_has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn education text fuzzily matches this string / any of these strings."},"has_linkedin_last_message_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"LinkedIn last-message time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_last_seen_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Last-seen (last interaction) time — alias for has_interaction: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_distance":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"},"meters":{"type":"number"},"label":{"type":"string"}},"required":["lat","lon","meters"],"additionalProperties":false,"description":"Geo radius filter: contacts within `meters` of `{ lat, lon }` (PostGIS ST_DWithin on geocoded coordinates). `label` is an optional display name for the point."},"has_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Interaction (last-seen) time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_next_reminder":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Next-reminder time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"custom_fields":{"minItems":1,"type":"array","items":{"type":"object","properties":{"field_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"operator":{"type":"string","enum":["contains","eq","in","not_in","present","absent","gte","lte"]},"value":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["field_id","operator"],"additionalProperties":false},"description":"User-defined custom-field filters. Each clause is `{ field_id, operator, value? }`; multiple clauses AND together. Operators: contains, eq, in, not_in, present, absent, gte, lte."},"_or":{"description":"Compound-OR escape hatch: an array of filter branches combined with OR, each ANDed with the top-level keys. One level deep — branches cannot themselves contain `_or`.","minItems":1,"type":"array","items":{"type":"object","properties":{"in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Match contacts whose id is in this set (single id or array)."},"not_in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Exclude contacts whose id is in this set (single id or array)."},"ignore_merge":{"type":"boolean","description":"Filter by the `ignore_merge` flag (excluded from merge suggestions)."},"is_starred":{"type":"boolean","description":"Match starred (true) or non-starred (false) contacts."},"is_team_overdue":{"type":"boolean","description":"Workspace only. true: the Team cadence is overdue; false: the Team cadence exists and is not overdue. Contacts with no Team cadence match neither."},"is_my_overdue":{"type":"boolean","description":"Workspace only. true: the caller's cadence is overdue; false: the caller's cadence exists and is not overdue. Contacts the caller has no cadence on match neither."},"is_archived":{"type":"boolean","description":"Match archived (true) or active (false) contacts. Defaults to false when omitted."},"has_priority_tier":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"type":"array","items":{"type":"integer","minimum":1,"maximum":9007199254740991}},{"type":"boolean"}],"description":"Relationship priority tier: a tier number, an array of tiers (OR), or a boolean (true = any tier set, false = none)."},"has_linkedin":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"LinkedIn slug: an exact slug string, or a boolean for presence/absence of a LinkedIn handle."},"has_instagram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Instagram slug: an exact slug string, or a boolean for presence/absence of an Instagram handle."},"has_twitter":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Twitter/X slug: an exact slug string, or a boolean for presence/absence of a Twitter handle."},"has_facebook":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Facebook slug: an exact slug string, or a boolean for presence/absence of a Facebook profile."},"has_telegram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Telegram slug: an exact slug string, or a boolean for presence/absence of a Telegram handle."},"has_tiktok":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"TikTok slug: an exact slug string, or a boolean for presence/absence of a TikTok handle."},"has_youtube":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"YouTube slug: an exact slug string, or a boolean for presence/absence of a YouTube channel."},"has_source":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Contact source: a single source string or an array of sources (OR)."},"has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Full name: a bare string (fuzzy contains), an array of exact names, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_groups":{"anyOf":[{"type":"object","properties":{"not":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["not"],"additionalProperties":false},{"type":"boolean"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string"}}],"description":"Group membership: a group id, an array of group ids (OR), a boolean for any/no group, or `{ not }` to exclude group id(s)."},"has_user_created_groups":{"type":"boolean","description":"Non-system group membership: true for at least one user-created group; false for no user-created groups, including contacts with zero memberships or only Dex system-group memberships."},"has_grouping_signal":{"type":"boolean","description":"Internal organize prefilter: title, company, location, or LinkedIn summary is non-null and non-empty. Whitespace-only values are removed by the organize serializer.","enum":[true]},"has_groups_all":{"description":"Array of group-id rows: AND across rows, OR within each row (contact must be in at least one group from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_groups_only":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Exclusive group membership: the contact is in at least one of these group ids and in no group outside them. Contacts with no group never match."},"has_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Keep-in-touch cadence: a frequency string, or a boolean for presence/absence of a cadence."},"has_my_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Workspace only. The caller's own keep-in-touch cadence: a workspace frequency id, or a boolean for presence/absence of the caller's cadence."},"known_by":{"type":"string","minLength":1,"maxLength":128,"description":"Workspace only. An active member's user id: contacts that member has a known email, calendar or shared-note interaction with. For the caller's own id, their private notes count too."},"has_location":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Location: a string (fuzzy, accent-insensitive match), or a boolean for presence/absence of a location."},"has_location_exact":{"type":"string","description":"Location: exact string match (not fuzzy)."},"has_job_title":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Job title: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_never_keep_in_touch":{"type":"boolean","description":"Filter by the `never_keep_in_touch` flag."},"has_created_at":{"description":"Creation-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_updated_at":{"description":"Last-updated-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_next_due":{"description":"Workspace only. Team keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts with no Team cadence never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_my_next_due":{"description":"Workspace only. The caller's own keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts the caller has no cadence on never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_last_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Workspace only. The team's last interaction date, the one the \"Last team interaction\" sort orders by (the latest email, calendar event or shared note any member has with the contact): a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range (at least one bound, at most microsecond precision). Contacts with no team interaction never match a range."},"has_birthday":{"anyOf":[{"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))$"},{},{"type":"boolean"}],"description":"Birthday: a specific date (matches on day + month), or true for any birthday set."},"has_tag":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Match contacts carrying this single tag id."},"has_tags":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"type":"object","properties":{"not":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}]}},"required":["not"],"additionalProperties":false}],"description":"Tags: an array of tag ids (OR), or `{ not }` to exclude tag id(s)."},"has_tags_all":{"description":"Array of tag-id rows: AND across rows, OR within each row (contact must carry at least one tag from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_company":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Company: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Education: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_description":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Description/notes: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn companies text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn education text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_email":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one email."},"has_phone_number":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one phone number."},"not_has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose full name fuzzily matches this string / any of these strings."},"not_has_company":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose company fuzzily matches this string / any of these strings."},"not_has_job_title":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose job title fuzzily matches this string / any of these strings."},"not_has_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose education fuzzily matches this string / any of these strings."},"not_has_description":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose description fuzzily matches this string / any of these strings."},"not_has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn companies text fuzzily matches this string / any of these strings."},"not_has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn education text fuzzily matches this string / any of these strings."},"has_linkedin_last_message_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"LinkedIn last-message time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_last_seen_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Last-seen (last interaction) time — alias for has_interaction: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_distance":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"},"meters":{"type":"number"},"label":{"type":"string"}},"required":["lat","lon","meters"],"additionalProperties":false,"description":"Geo radius filter: contacts within `meters` of `{ lat, lon }` (PostGIS ST_DWithin on geocoded coordinates). `label` is an optional display name for the point."},"has_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Interaction (last-seen) time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_next_reminder":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Next-reminder time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"custom_fields":{"minItems":1,"type":"array","items":{"type":"object","properties":{"field_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"operator":{"type":"string","enum":["contains","eq","in","not_in","present","absent","gte","lte"]},"value":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["field_id","operator"],"additionalProperties":false},"description":"User-defined custom-field filters. Each clause is `{ field_id, operator, value? }`; multiple clauses AND together. Operators: contains, eq, in, not_in, present, absent, gte, lte."}},"additionalProperties":false}}},"additionalProperties":false},"in":"query","name":"where","required":false},{"schema":{},"in":"query","name":"orderBy","required":false},{"schema":{"type":"object","properties":{"linkedin_data":{"type":"boolean"},"web_search_summary":{"type":"boolean"},"groups_count":{"type":"boolean"},"coordinates":{"type":"boolean"},"last_note":{"type":"boolean"},"contact_emails":{"type":"boolean"},"contact_phone_numbers":{"type":"boolean"},"contact_birthdays":{"type":"boolean"},"contact_locations":{"type":"boolean"},"contacts_custom_fields":{"type":"boolean"},"legacy_contact_addresses":{"type":"boolean"},"groups_contacts":{"type":"boolean"},"tags_contacts":{"type":"boolean"},"timeline_items_contacts":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"feed_items":{"type":"boolean"},"keep_in_touch_reminders":{"type":"boolean"},"contact_relations_contact_relations_sourceTocontacts":{"type":"boolean"},"contact_relations_contact_relations_destinationTocontacts":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["linkedin_data","web_search_summary","groups_count","coordinates","last_note","contact_emails","contact_phone_numbers","contact_birthdays","contact_locations","contacts_custom_fields","legacy_contact_addresses","groups_contacts","tags_contacts","timeline_items_contacts","reminders_contacts","feed_items","keep_in_touch_reminders","contact_relations_contact_relations_sourceTocontacts","contact_relations_contact_relations_destinationTocontacts"]}},"in":"query","name":"include","required":false},{"schema":{"type":"object","properties":{"linkedin_data":{"type":"boolean"},"web_search_summary":{"type":"boolean"},"groups_count":{"type":"boolean"},"coordinates":{"type":"boolean"},"last_note":{"type":"boolean"},"id":{"type":"boolean"},"user_id":{"type":"boolean"},"first_name":{"type":"boolean"},"last_name":{"type":"boolean"},"description":{"type":"boolean"},"birthday":{"type":"boolean"},"legacy_location":{"type":"boolean"},"education":{"type":"boolean"},"job_title":{"type":"boolean"},"company":{"type":"boolean"},"image_source":{"type":"boolean"},"image_url":{"type":"boolean"},"starred":{"type":"boolean"},"last_seen_at":{"type":"boolean"},"last_reminder_at":{"type":"boolean"},"first_met_at":{"type":"boolean"},"first_interaction_at":{"type":"boolean"},"facebook":{"type":"boolean"},"linkedin":{"type":"boolean"},"twitter":{"type":"boolean"},"instagram":{"type":"boolean"},"created_at":{"type":"boolean"},"updated_at":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"telegram":{"type":"boolean"},"website":{"type":"boolean"},"next_reminder_at":{"type":"boolean"},"source":{"type":"boolean"},"is_archived":{"type":"boolean"},"birthday_year":{"type":"boolean"},"linkedin_enhance_date":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"geocode_attempts":{"type":"boolean"},"geocode_failed_at":{"type":"boolean"},"full_name":{"type":"boolean"},"business_card_url":{"type":"boolean"},"linkedin_companies":{"type":"boolean"},"linkedin_education":{"type":"boolean"},"linkedin_last_message_at":{"type":"boolean"},"linkedin_last_message_snippet":{"type":"boolean"},"linkedin_message_link":{"type":"boolean"},"linkedin_urn":{"type":"boolean"},"linkedin_headline":{"type":"boolean"},"whatsapp_message_link":{"type":"boolean"},"whatsapp_message_snippet":{"type":"boolean"},"whatsapp_last_message_at":{"type":"boolean"},"frequency_text":{"type":"boolean"},"imessage_message_link":{"type":"boolean"},"imessage_message_snippet":{"type":"boolean"},"imessage_last_message_at":{"type":"boolean"},"instagram_message_link":{"type":"boolean"},"instagram_message_snippet":{"type":"boolean"},"instagram_last_message_at":{"type":"boolean"},"gmail_last_interaction_at":{"type":"boolean"},"gcal_last_interaction_at":{"type":"boolean"},"gmail_last_interaction_provider_id":{"type":"boolean"},"gcal_last_interaction_provider_id":{"type":"boolean"},"gmail_last_interaction_subject":{"type":"boolean"},"gcal_last_interaction_title":{"type":"boolean"},"phone_call_interaction_snippet":{"type":"boolean"},"phone_call_last_interaction_at":{"type":"boolean"},"tiktok":{"type":"boolean"},"youtube":{"type":"boolean"},"gmail_last_interaction_provider":{"type":"boolean"},"gcal_last_interaction_provider":{"type":"boolean"},"priority_tier":{"type":"boolean"},"workspace_id":{"type":"boolean"},"contact_emails":{"type":"boolean"},"contact_phone_numbers":{"type":"boolean"},"contact_birthdays":{"type":"boolean"},"contact_locations":{"type":"boolean"},"contacts_custom_fields":{"type":"boolean"},"legacy_contact_addresses":{"type":"boolean"},"groups_contacts":{"type":"boolean"},"tags_contacts":{"type":"boolean"},"timeline_items_contacts":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"feed_items":{"type":"boolean"},"keep_in_touch_reminders":{"type":"boolean"},"contact_relations_contact_relations_sourceTocontacts":{"type":"boolean"},"contact_relations_contact_relations_destinationTocontacts":{"type":"boolean"},"frequency":{"type":"boolean"},"frequency_interval":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["linkedin_data","web_search_summary","groups_count","coordinates","last_note","id","user_id","first_name","last_name","description","birthday","legacy_location","education","job_title","company","image_source","image_url","starred","last_seen_at","last_reminder_at","first_met_at","first_interaction_at","facebook","linkedin","twitter","instagram","created_at","updated_at","never_keep_in_touch","telegram","website","next_reminder_at","source","is_archived","birthday_year","linkedin_enhance_date","ignore_merge","geocode_attempts","geocode_failed_at","full_name","business_card_url","linkedin_companies","linkedin_education","linkedin_last_message_at","linkedin_last_message_snippet","linkedin_message_link","linkedin_urn","linkedin_headline","whatsapp_message_link","whatsapp_message_snippet","whatsapp_last_message_at","frequency_text","imessage_message_link","imessage_message_snippet","imessage_last_message_at","instagram_message_link","instagram_message_snippet","instagram_last_message_at","gmail_last_interaction_at","gcal_last_interaction_at","gmail_last_interaction_provider_id","gcal_last_interaction_provider_id","gmail_last_interaction_subject","gcal_last_interaction_title","phone_call_interaction_snippet","phone_call_last_interaction_at","tiktok","youtube","gmail_last_interaction_provider","gcal_last_interaction_provider","priority_tier","workspace_id","contact_emails","contact_phone_numbers","contact_birthdays","contact_locations","contacts_custom_fields","legacy_contact_addresses","groups_contacts","tags_contacts","timeline_items_contacts","reminders_contacts","feed_items","keep_in_touch_reminders","contact_relations_contact_relations_sourceTocontacts","contact_relations_contact_relations_destinationTocontacts","frequency","frequency_interval"]}},"in":"query","name":"select","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"full_name":{"nullable":true,"type":"string"},"description":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"},"company":{"nullable":true,"type":"string"},"education":{"nullable":true,"type":"string"},"legacy_location":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"business_card_url":{"nullable":true,"type":"string"},"website":{"nullable":true,"type":"string"},"image_source":{"nullable":true,"type":"string"},"birthday":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"birthday_year":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"linkedin":{"nullable":true,"type":"string"},"twitter":{"nullable":true,"type":"string"},"facebook":{"nullable":true,"type":"string"},"instagram":{"nullable":true,"type":"string"},"telegram":{"nullable":true,"type":"string"},"tiktok":{"nullable":true,"type":"string"},"youtube":{"nullable":true,"type":"string"},"starred":{"type":"boolean"},"is_archived":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"source":{"type":"string"},"priority_tier":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"frequency":{"nullable":true,"type":"string"},"frequency_text":{"nullable":true,"type":"string"},"last_seen_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"last_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_met_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_companies":{"nullable":true,"type":"string"},"linkedin_education":{"nullable":true,"type":"string"},"linkedin_enhance_date":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_snippet":{"nullable":true,"type":"string"},"linkedin_message_link":{"nullable":true,"type":"string"},"linkedin_urn":{"nullable":true,"type":"string"},"linkedin_headline":{"nullable":true,"type":"string"},"whatsapp_message_link":{"nullable":true,"type":"string"},"whatsapp_message_snippet":{"nullable":true,"type":"string"},"whatsapp_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"imessage_message_link":{"nullable":true,"type":"string"},"imessage_message_snippet":{"nullable":true,"type":"string"},"imessage_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"instagram_message_link":{"nullable":true,"type":"string"},"instagram_message_snippet":{"nullable":true,"type":"string"},"instagram_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gmail_last_interaction_provider_id":{"nullable":true,"type":"string"},"gmail_last_interaction_subject":{"nullable":true,"type":"string"},"gcal_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gcal_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gcal_last_interaction_provider_id":{"nullable":true,"type":"string"},"gcal_last_interaction_title":{"nullable":true,"type":"string"},"phone_call_interaction_snippet":{"nullable":true,"type":"string"},"phone_call_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"web_search_summary":{"nullable":true},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"geocode_attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"geocode_failed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false},"frequency_interval":{},"linkedin_data":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"latitude":{"nullable":true,"type":"number"},"longitude":{"nullable":true,"type":"number"},"last_note":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"preview":{"type":"string"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"}},"required":["id","preview","event_time","emoji","meeting_type"],"additionalProperties":false},"team_keep_in_touch":{"nullable":true,"type":"object","properties":{"cadence_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["cadence_id","frequency_id","days","next_due_at","snoozed_until"],"additionalProperties":false},"contact_emails":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_birthdays":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contact_locations":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contacts_custom_fields":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"tags_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_sourceTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_destinationTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"feed_items":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"keep_in_touch_reminders":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["items","count"],"additionalProperties":{}}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listContactsV1","summary":"List contacts","description":"Retrieve a paginated list of contacts for the authenticated user. Supports cursor-based pagination, sorting, and filtering by archived status.","x-mint":{"content":"## Use cases\n\n- Sync your Dex contacts to an external system\n- Build a contact list view with infinite scroll\n- Export all contacts for backup or migration\n\n<Note>Results are paginated. Use the `nextCursor` value from the response to fetch the next page. When `nextCursor` is null, you have reached the end of the list.</Note>\n\n<Note>The cursor is opaque: pass `nextCursor` back unchanged, with the same `orderBy`, and never parse or build one. A cursor reused after the sort changes is refused with `400 validation_error`: start again from the first page. A contact id sent as the cursor, which is what `nextCursor` used to be, is still accepted.</Note>"}},"post":{"tags":["contacts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contacts":{"maxItems":500,"type":"array","items":{"type":"object","properties":{"full_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"job_title":{"anyOf":[{"type":"string"},{"type":"null"}]},"legacy_location":{"anyOf":[{"type":"string"},{"type":"null"}]},"company":{"anyOf":[{"type":"string"},{"type":"null"}]},"education":{"anyOf":[{"type":"string"},{"type":"null"}]},"starred":{"type":"boolean"},"source":{"type":"string","enum":["linkedin_sync","facebook_import","cal_ingest","email_ingest","web_import","csv_import","whatsapp_sync","imessage_sync","phone_calls_sync","mobile","mobile_import","instagram_sync","oauth_interaction","granola_sync"]},"coordinates":{"type":"object","properties":{"operation":{"type":"string","enum":["set","delete"]},"data":{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180}},"additionalProperties":false}},"required":["operation"],"additionalProperties":false},"priority_tier":{"anyOf":[{"type":"integer","minimum":1,"maximum":32767},{"type":"null"}]},"image_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"image_source":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"business_card_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"website":{"anyOf":[{},{"type":"null"}]},"birthday":{"anyOf":[{"type":"string","format":"date","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])))$"},{"type":"null"}]},"birthday_year":{"anyOf":[{"type":"number","minimum":1900,"maximum":2100},{"type":"null"}]},"frequency":{"anyOf":[{"type":"string"},{"type":"null"}]},"last_seen_at":{"anyOf":[{},{"type":"null"}]},"first_met_at":{"anyOf":[{},{"type":"null"}]},"never_keep_in_touch":{"type":"boolean"},"next_reminder_at":{},"linkedin":{"anyOf":[{"type":"string"},{"type":"null"}]},"twitter":{"anyOf":[{"type":"string"},{"type":"null"}]},"facebook":{"anyOf":[{"type":"string"},{"type":"null"}]},"instagram":{"anyOf":[{"type":"string"},{"type":"null"}]},"telegram":{"anyOf":[{"type":"string"},{"type":"null"}]},"tiktok":{"anyOf":[{"type":"string"},{"type":"null"}]},"youtube":{"anyOf":[{"type":"string"},{"type":"null"}]},"whatsapp_message_link":{"type":"string"},"whatsapp_message_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"whatsapp_last_message_at":{"anyOf":[{},{"type":"null"}]},"imessage_message_link":{"type":"string"},"imessage_message_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"imessage_last_message_at":{"anyOf":[{},{"type":"null"}]},"linkedin_message_link":{"type":"string","maxLength":600},"linkedin_last_message_snippet":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"linkedin_last_message_at":{"anyOf":[{},{"type":"null"}]},"linkedin_data":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"instagram_message_link":{"type":"string"},"instagram_message_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"instagram_last_message_at":{"anyOf":[{},{"type":"null"}]},"gmail_last_interaction_at":{"anyOf":[{},{"type":"null"}]},"gmail_last_interaction_provider_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"gmail_last_interaction_subject":{"anyOf":[{"type":"string"},{"type":"null"}]},"gmail_last_interaction_provider":{"anyOf":[{"type":"string","enum":["GOOGLE","OFFICE365"]},{"type":"null"}]},"gcal_last_interaction_at":{"anyOf":[{},{"type":"null"}]},"gcal_last_interaction_provider_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"gcal_last_interaction_title":{"anyOf":[{"type":"string"},{"type":"null"}]},"gcal_last_interaction_provider":{"anyOf":[{"type":"string","enum":["GOOGLE","OFFICE365"]},{"type":"null"}]},"phone_call_last_interaction_at":{"anyOf":[{},{"type":"null"}]},"phone_call_interaction_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"web_search_summary":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{"formatted":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false}},"contact_emails":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","maxLength":320},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"ranking":{"type":"number"}},"required":["email"],"additionalProperties":false}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{"phone_number":{"type":"string","maxLength":50},"country_code":{"anyOf":[{"type":"string","maxLength":4},{"type":"null"}]},"phone_number_sanitized":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}]},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"ranking":{"type":"number"}},"required":["phone_number"],"additionalProperties":false}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{"group_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["group_id"],"additionalProperties":false}},"tags_contacts":{"type":"array","items":{"type":"object","properties":{"tag_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["tag_id"],"additionalProperties":false}},"custom_fields":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["input"]},"text_value":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"custom_field":{}},"required":["id","type","text_value"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["autocomplete"]},"text_value":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"custom_field":{}},"required":["id","type","text_value"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["datepicker"]},"text_value":{"anyOf":[{"type":"string"},{"type":"null"}]},"date_value":{"anyOf":[{},{"type":"null"}]},"custom_field":{}},"required":["id","type"],"additionalProperties":false}]}},"contact_birthdays":{"type":"object","properties":{"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"last_dismissal_year":{"type":"number","minimum":1900,"maximum":2100}},"additionalProperties":false},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","not":{"enum":["00000000-0000-0000-0000-000000000000"]}},"related_contacts":{"type":"array","items":{"type":"object","properties":{"destination":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"source_contact":{},"destination_contact":{}},"required":["destination"],"additionalProperties":false}}},"additionalProperties":false}},"continueOnError":{"type":"boolean"},"socialLookup":{"type":"boolean"}},"required":["contacts"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"contacts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"full_name":{"nullable":true,"type":"string"},"description":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"},"company":{"nullable":true,"type":"string"},"education":{"nullable":true,"type":"string"},"legacy_location":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"business_card_url":{"nullable":true,"type":"string"},"website":{"nullable":true,"type":"string"},"image_source":{"nullable":true,"type":"string"},"birthday":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"birthday_year":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"linkedin":{"nullable":true,"type":"string"},"twitter":{"nullable":true,"type":"string"},"facebook":{"nullable":true,"type":"string"},"instagram":{"nullable":true,"type":"string"},"telegram":{"nullable":true,"type":"string"},"tiktok":{"nullable":true,"type":"string"},"youtube":{"nullable":true,"type":"string"},"starred":{"type":"boolean"},"is_archived":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"source":{"type":"string"},"priority_tier":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"frequency":{"nullable":true,"type":"string"},"frequency_text":{"nullable":true,"type":"string"},"last_seen_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"last_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_met_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_companies":{"nullable":true,"type":"string"},"linkedin_education":{"nullable":true,"type":"string"},"linkedin_enhance_date":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_snippet":{"nullable":true,"type":"string"},"linkedin_message_link":{"nullable":true,"type":"string"},"linkedin_urn":{"nullable":true,"type":"string"},"linkedin_headline":{"nullable":true,"type":"string"},"whatsapp_message_link":{"nullable":true,"type":"string"},"whatsapp_message_snippet":{"nullable":true,"type":"string"},"whatsapp_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"imessage_message_link":{"nullable":true,"type":"string"},"imessage_message_snippet":{"nullable":true,"type":"string"},"imessage_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"instagram_message_link":{"nullable":true,"type":"string"},"instagram_message_snippet":{"nullable":true,"type":"string"},"instagram_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gmail_last_interaction_provider_id":{"nullable":true,"type":"string"},"gmail_last_interaction_subject":{"nullable":true,"type":"string"},"gcal_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gcal_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gcal_last_interaction_provider_id":{"nullable":true,"type":"string"},"gcal_last_interaction_title":{"nullable":true,"type":"string"},"phone_call_interaction_snippet":{"nullable":true,"type":"string"},"phone_call_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"web_search_summary":{"nullable":true},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"geocode_attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"geocode_failed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false},"frequency_interval":{},"linkedin_data":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"latitude":{"nullable":true,"type":"number"},"longitude":{"nullable":true,"type":"number"},"last_note":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"preview":{"type":"string"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"}},"required":["id","preview","event_time","emoji","meeting_type"],"additionalProperties":false},"team_keep_in_touch":{"nullable":true,"type":"object","properties":{"cadence_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["cadence_id","frequency_id","days","next_due_at","snoozed_until"],"additionalProperties":false},"contact_emails":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_birthdays":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contact_locations":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contacts_custom_fields":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"tags_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_sourceTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_destinationTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"feed_items":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"keep_in_touch_reminders":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}}},"required":["contacts"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createContactsV1","summary":"Create contacts","description":"Create one or more new contacts for the authenticated user. Accepts an array of contact objects with fields like name, email, phone, company, and job title.","x-mint":{"content":"## Use cases\n\n- Import contacts from a CSV file or external CRM\n- Create a new contact when someone fills out a form\n- Sync contacts from another system into Dex\n\n<Note>You can create multiple contacts in a single request by passing an array. Each contact must have at least a first name or last name.</Note>"}},"put":{"tags":["contacts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"maxItems":500,"type":"array","items":{"type":"object","properties":{"contactId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"data":{"type":"object","properties":{"full_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"job_title":{"anyOf":[{"type":"string"},{"type":"null"}]},"legacy_location":{"anyOf":[{"type":"string"},{"type":"null"}]},"company":{"anyOf":[{"type":"string"},{"type":"null"}]},"education":{"anyOf":[{"type":"string"},{"type":"null"}]},"starred":{"type":"boolean"},"source":{"type":"string","enum":["linkedin_sync","facebook_import","cal_ingest","email_ingest","web_import","csv_import","whatsapp_sync","imessage_sync","phone_calls_sync","mobile","mobile_import","instagram_sync","oauth_interaction","granola_sync"]},"coordinates":{"type":"object","properties":{"operation":{"type":"string","enum":["set","delete"]},"data":{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180}},"additionalProperties":false}},"required":["operation"],"additionalProperties":false},"priority_tier":{"anyOf":[{"type":"integer","minimum":1,"maximum":32767},{"type":"null"}]},"image_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"image_source":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"business_card_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"website":{"anyOf":[{},{"type":"null"}]},"birthday":{"anyOf":[{"type":"string","format":"date","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])))$"},{"type":"null"}]},"birthday_year":{"anyOf":[{"type":"number","minimum":1900,"maximum":2100},{"type":"null"}]},"frequency":{"anyOf":[{"type":"string"},{"type":"null"}]},"last_seen_at":{"anyOf":[{},{"type":"null"}]},"first_met_at":{"anyOf":[{},{"type":"null"}]},"never_keep_in_touch":{"type":"boolean"},"next_reminder_at":{},"linkedin":{"anyOf":[{"type":"string"},{"type":"null"}]},"twitter":{"anyOf":[{"type":"string"},{"type":"null"}]},"facebook":{"anyOf":[{"type":"string"},{"type":"null"}]},"instagram":{"anyOf":[{"type":"string"},{"type":"null"}]},"telegram":{"anyOf":[{"type":"string"},{"type":"null"}]},"tiktok":{"anyOf":[{"type":"string"},{"type":"null"}]},"youtube":{"anyOf":[{"type":"string"},{"type":"null"}]},"whatsapp_message_link":{"type":"string"},"whatsapp_message_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"whatsapp_last_message_at":{"anyOf":[{},{"type":"null"}]},"imessage_message_link":{"type":"string"},"imessage_message_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"imessage_last_message_at":{"anyOf":[{},{"type":"null"}]},"linkedin_message_link":{"type":"string","maxLength":600},"linkedin_last_message_snippet":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"linkedin_last_message_at":{"anyOf":[{},{"type":"null"}]},"linkedin_data":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"instagram_message_link":{"type":"string"},"instagram_message_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"instagram_last_message_at":{"anyOf":[{},{"type":"null"}]},"gmail_last_interaction_at":{"anyOf":[{},{"type":"null"}]},"gmail_last_interaction_provider_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"gmail_last_interaction_subject":{"anyOf":[{"type":"string"},{"type":"null"}]},"gmail_last_interaction_provider":{"anyOf":[{"type":"string","enum":["GOOGLE","OFFICE365"]},{"type":"null"}]},"gcal_last_interaction_at":{"anyOf":[{},{"type":"null"}]},"gcal_last_interaction_provider_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"gcal_last_interaction_title":{"anyOf":[{"type":"string"},{"type":"null"}]},"gcal_last_interaction_provider":{"anyOf":[{"type":"string","enum":["GOOGLE","OFFICE365"]},{"type":"null"}]},"phone_call_last_interaction_at":{"anyOf":[{},{"type":"null"}]},"phone_call_interaction_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"web_search_summary":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{"formatted":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false}},"contact_emails":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","maxLength":320},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"ranking":{"type":"number"}},"required":["email"],"additionalProperties":false}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{"phone_number":{"type":"string","maxLength":50},"country_code":{"anyOf":[{"type":"string","maxLength":4},{"type":"null"}]},"phone_number_sanitized":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}]},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"ranking":{"type":"number"}},"required":["phone_number"],"additionalProperties":false}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{"group_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["group_id"],"additionalProperties":false}},"tags_contacts":{"anyOf":[{"type":"object","properties":{"append":{"type":"array","items":{"type":"object","properties":{"tag_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["tag_id"],"additionalProperties":false}},"remove":{"type":"array","items":{"type":"object","properties":{"tag_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["tag_id","contact_id"],"additionalProperties":false}},"replace":{}},"additionalProperties":false},{"type":"object","properties":{"append":{},"remove":{},"replace":{"type":"array","items":{"type":"object","properties":{"tag_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["tag_id"],"additionalProperties":false}}},"additionalProperties":false}]},"custom_fields":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["input"]},"text_value":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"custom_field":{}},"required":["id","type","text_value"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["autocomplete"]},"text_value":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"custom_field":{}},"required":["id","type","text_value"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["datepicker"]},"text_value":{"anyOf":[{"type":"string"},{"type":"null"}]},"date_value":{"anyOf":[{},{"type":"null"}]},"custom_field":{}},"required":["id","type"],"additionalProperties":false}]}},"contact_birthdays":{"type":"object","properties":{"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"last_dismissal_year":{"type":"number","minimum":1900,"maximum":2100}},"additionalProperties":false},"is_archived":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"related_contacts":{"anyOf":[{"type":"object","properties":{"append":{"type":"array","items":{"type":"object","properties":{"destination":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"source_contact":{},"destination_contact":{}},"required":["destination"],"additionalProperties":false}},"remove":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"source":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"destination":{}},"required":["source","destination"],"additionalProperties":false},{"type":"object","properties":{"source":{},"destination":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["source","destination"],"additionalProperties":false}]}},"replace":{}},"additionalProperties":false},{"type":"object","properties":{"append":{},"remove":{},"replace":{"type":"array","items":{"type":"object","properties":{"destination":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"source_contact":{},"destination_contact":{}},"required":["destination"],"additionalProperties":false}}},"additionalProperties":false}]}},"additionalProperties":false}},"required":["contactId","data"],"additionalProperties":false}}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["count"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"updateContactsV1","summary":"Update multiple contacts","description":"Update multiple contacts in a single request. Each contact in the request body must include its ID along with the fields to update.","x-mint":{"content":"## Use cases\n\n- Bulk-update a field across many contacts (e.g., set company name after a merger)\n- Archive or star multiple contacts at once\n- Sync batch changes from an external system\n\n<Note>Only the fields you include in each contact object will be updated. Omitted fields remain unchanged.</Note>"}},"delete":{"tags":["contacts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contactIds":{"minItems":1,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["contactIds"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"contact_ids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["count","contact_ids"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteContactsV1","summary":"Delete multiple contacts","description":"Delete multiple contacts in a single request by providing an array of contact IDs. This permanently removes the contacts and their associated data.","x-mint":{"content":"## Use cases\n\n- Clean up duplicate or outdated contacts in bulk\n- Remove imported contacts that are no longer needed\n- Perform bulk housekeeping on your contact database\n\n<Warning>This action is permanent and cannot be undone. All notes, reminders, and tag associations for the deleted contacts will also be removed.</Warning>"}}},"/v1/contacts/by-emails":{"post":{"tags":["contacts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"emails":{"type":"array","items":{"type":"string"}},"createFromOAuthInteractions":{"type":"boolean"}},"required":["emails"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"object","properties":{"linkedin_data":{"type":"boolean"},"web_search_summary":{"type":"boolean"},"groups_count":{"type":"boolean"},"coordinates":{"type":"boolean"},"last_note":{"type":"boolean"},"contact_emails":{"type":"boolean"},"contact_phone_numbers":{"type":"boolean"},"contact_birthdays":{"type":"boolean"},"contact_locations":{"type":"boolean"},"contacts_custom_fields":{"type":"boolean"},"legacy_contact_addresses":{"type":"boolean"},"groups_contacts":{"type":"boolean"},"tags_contacts":{"type":"boolean"},"timeline_items_contacts":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"feed_items":{"type":"boolean"},"keep_in_touch_reminders":{"type":"boolean"},"contact_relations_contact_relations_sourceTocontacts":{"type":"boolean"},"contact_relations_contact_relations_destinationTocontacts":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["linkedin_data","web_search_summary","groups_count","coordinates","last_note","contact_emails","contact_phone_numbers","contact_birthdays","contact_locations","contacts_custom_fields","legacy_contact_addresses","groups_contacts","tags_contacts","timeline_items_contacts","reminders_contacts","feed_items","keep_in_touch_reminders","contact_relations_contact_relations_sourceTocontacts","contact_relations_contact_relations_destinationTocontacts"]}},"in":"query","name":"include","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"full_name":{"nullable":true,"type":"string"},"description":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"},"company":{"nullable":true,"type":"string"},"education":{"nullable":true,"type":"string"},"legacy_location":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"business_card_url":{"nullable":true,"type":"string"},"website":{"nullable":true,"type":"string"},"image_source":{"nullable":true,"type":"string"},"birthday":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"birthday_year":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"linkedin":{"nullable":true,"type":"string"},"twitter":{"nullable":true,"type":"string"},"facebook":{"nullable":true,"type":"string"},"instagram":{"nullable":true,"type":"string"},"telegram":{"nullable":true,"type":"string"},"tiktok":{"nullable":true,"type":"string"},"youtube":{"nullable":true,"type":"string"},"starred":{"type":"boolean"},"is_archived":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"source":{"type":"string"},"priority_tier":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"frequency":{"nullable":true,"type":"string"},"frequency_text":{"nullable":true,"type":"string"},"last_seen_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"last_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_met_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_companies":{"nullable":true,"type":"string"},"linkedin_education":{"nullable":true,"type":"string"},"linkedin_enhance_date":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_snippet":{"nullable":true,"type":"string"},"linkedin_message_link":{"nullable":true,"type":"string"},"linkedin_urn":{"nullable":true,"type":"string"},"linkedin_headline":{"nullable":true,"type":"string"},"whatsapp_message_link":{"nullable":true,"type":"string"},"whatsapp_message_snippet":{"nullable":true,"type":"string"},"whatsapp_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"imessage_message_link":{"nullable":true,"type":"string"},"imessage_message_snippet":{"nullable":true,"type":"string"},"imessage_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"instagram_message_link":{"nullable":true,"type":"string"},"instagram_message_snippet":{"nullable":true,"type":"string"},"instagram_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gmail_last_interaction_provider_id":{"nullable":true,"type":"string"},"gmail_last_interaction_subject":{"nullable":true,"type":"string"},"gcal_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gcal_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gcal_last_interaction_provider_id":{"nullable":true,"type":"string"},"gcal_last_interaction_title":{"nullable":true,"type":"string"},"phone_call_interaction_snippet":{"nullable":true,"type":"string"},"phone_call_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"web_search_summary":{"nullable":true},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"geocode_attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"geocode_failed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false},"frequency_interval":{},"linkedin_data":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"latitude":{"nullable":true,"type":"number"},"longitude":{"nullable":true,"type":"number"},"last_note":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"preview":{"type":"string"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"}},"required":["id","preview","event_time","emoji","meeting_type"],"additionalProperties":false},"team_keep_in_touch":{"nullable":true,"type":"object","properties":{"cadence_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["cadence_id","frequency_id","days","next_due_at","snoozed_until"],"additionalProperties":false},"contact_emails":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_birthdays":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contact_locations":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contacts_custom_fields":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"tags_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_sourceTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_destinationTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"feed_items":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"keep_in_touch_reminders":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getContactsByEmailsV1","summary":"Find contacts by email","description":"Look up contacts by one or more email addresses. Returns matching contacts for each email provided, useful for resolving email addresses to contact records.","x-mint":{"content":"## Use cases\n\n- Resolve email senders to existing Dex contacts\n- Check if contacts already exist before importing\n- Enrich email threads with contact information from Dex\n\n<Note>Pass an array of email addresses in the request body. The response maps each email to its matching contact, if one exists.</Note>"}}},"/v1/contacts/count":{"get":{"tags":["contacts"],"parameters":[{"schema":{"type":"object","properties":{"in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Match contacts whose id is in this set (single id or array)."},"not_in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Exclude contacts whose id is in this set (single id or array)."},"ignore_merge":{"type":"boolean","description":"Filter by the `ignore_merge` flag (excluded from merge suggestions)."},"is_starred":{"type":"boolean","description":"Match starred (true) or non-starred (false) contacts."},"is_team_overdue":{"type":"boolean","description":"Workspace only. true: the Team cadence is overdue; false: the Team cadence exists and is not overdue. Contacts with no Team cadence match neither."},"is_my_overdue":{"type":"boolean","description":"Workspace only. true: the caller's cadence is overdue; false: the caller's cadence exists and is not overdue. Contacts the caller has no cadence on match neither."},"is_archived":{"type":"boolean","description":"Match archived (true) or active (false) contacts. Defaults to false when omitted."},"has_priority_tier":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"type":"array","items":{"type":"integer","minimum":1,"maximum":9007199254740991}},{"type":"boolean"}],"description":"Relationship priority tier: a tier number, an array of tiers (OR), or a boolean (true = any tier set, false = none)."},"has_linkedin":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"LinkedIn slug: an exact slug string, or a boolean for presence/absence of a LinkedIn handle."},"has_instagram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Instagram slug: an exact slug string, or a boolean for presence/absence of an Instagram handle."},"has_twitter":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Twitter/X slug: an exact slug string, or a boolean for presence/absence of a Twitter handle."},"has_facebook":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Facebook slug: an exact slug string, or a boolean for presence/absence of a Facebook profile."},"has_telegram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Telegram slug: an exact slug string, or a boolean for presence/absence of a Telegram handle."},"has_tiktok":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"TikTok slug: an exact slug string, or a boolean for presence/absence of a TikTok handle."},"has_youtube":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"YouTube slug: an exact slug string, or a boolean for presence/absence of a YouTube channel."},"has_source":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Contact source: a single source string or an array of sources (OR)."},"has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Full name: a bare string (fuzzy contains), an array of exact names, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_groups":{"anyOf":[{"type":"object","properties":{"not":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["not"],"additionalProperties":false},{"type":"boolean"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string"}}],"description":"Group membership: a group id, an array of group ids (OR), a boolean for any/no group, or `{ not }` to exclude group id(s)."},"has_user_created_groups":{"type":"boolean","description":"Non-system group membership: true for at least one user-created group; false for no user-created groups, including contacts with zero memberships or only Dex system-group memberships."},"has_grouping_signal":{"type":"boolean","description":"Internal organize prefilter: title, company, location, or LinkedIn summary is non-null and non-empty. Whitespace-only values are removed by the organize serializer.","enum":[true]},"has_groups_all":{"description":"Array of group-id rows: AND across rows, OR within each row (contact must be in at least one group from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_groups_only":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Exclusive group membership: the contact is in at least one of these group ids and in no group outside them. Contacts with no group never match."},"has_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Keep-in-touch cadence: a frequency string, or a boolean for presence/absence of a cadence."},"has_my_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Workspace only. The caller's own keep-in-touch cadence: a workspace frequency id, or a boolean for presence/absence of the caller's cadence."},"known_by":{"type":"string","minLength":1,"maxLength":128,"description":"Workspace only. An active member's user id: contacts that member has a known email, calendar or shared-note interaction with. For the caller's own id, their private notes count too."},"has_location":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Location: a string (fuzzy, accent-insensitive match), or a boolean for presence/absence of a location."},"has_location_exact":{"type":"string","description":"Location: exact string match (not fuzzy)."},"has_job_title":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Job title: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_never_keep_in_touch":{"type":"boolean","description":"Filter by the `never_keep_in_touch` flag."},"has_created_at":{"description":"Creation-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_updated_at":{"description":"Last-updated-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_next_due":{"description":"Workspace only. Team keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts with no Team cadence never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_my_next_due":{"description":"Workspace only. The caller's own keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts the caller has no cadence on never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_last_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Workspace only. The team's last interaction date, the one the \"Last team interaction\" sort orders by (the latest email, calendar event or shared note any member has with the contact): a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range (at least one bound, at most microsecond precision). Contacts with no team interaction never match a range."},"has_birthday":{"anyOf":[{"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))$"},{},{"type":"boolean"}],"description":"Birthday: a specific date (matches on day + month), or true for any birthday set."},"has_tag":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Match contacts carrying this single tag id."},"has_tags":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"type":"object","properties":{"not":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}]}},"required":["not"],"additionalProperties":false}],"description":"Tags: an array of tag ids (OR), or `{ not }` to exclude tag id(s)."},"has_tags_all":{"description":"Array of tag-id rows: AND across rows, OR within each row (contact must carry at least one tag from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_company":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Company: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Education: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_description":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Description/notes: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn companies text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn education text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_email":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one email."},"has_phone_number":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one phone number."},"not_has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose full name fuzzily matches this string / any of these strings."},"not_has_company":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose company fuzzily matches this string / any of these strings."},"not_has_job_title":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose job title fuzzily matches this string / any of these strings."},"not_has_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose education fuzzily matches this string / any of these strings."},"not_has_description":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose description fuzzily matches this string / any of these strings."},"not_has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn companies text fuzzily matches this string / any of these strings."},"not_has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn education text fuzzily matches this string / any of these strings."},"has_linkedin_last_message_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"LinkedIn last-message time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_last_seen_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Last-seen (last interaction) time — alias for has_interaction: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_distance":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"},"meters":{"type":"number"},"label":{"type":"string"}},"required":["lat","lon","meters"],"additionalProperties":false,"description":"Geo radius filter: contacts within `meters` of `{ lat, lon }` (PostGIS ST_DWithin on geocoded coordinates). `label` is an optional display name for the point."},"has_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Interaction (last-seen) time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_next_reminder":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Next-reminder time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"custom_fields":{"minItems":1,"type":"array","items":{"type":"object","properties":{"field_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"operator":{"type":"string","enum":["contains","eq","in","not_in","present","absent","gte","lte"]},"value":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["field_id","operator"],"additionalProperties":false},"description":"User-defined custom-field filters. Each clause is `{ field_id, operator, value? }`; multiple clauses AND together. Operators: contains, eq, in, not_in, present, absent, gte, lte."},"_or":{"description":"Compound-OR escape hatch: an array of filter branches combined with OR, each ANDed with the top-level keys. One level deep — branches cannot themselves contain `_or`.","minItems":1,"type":"array","items":{"type":"object","properties":{"in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Match contacts whose id is in this set (single id or array)."},"not_in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Exclude contacts whose id is in this set (single id or array)."},"ignore_merge":{"type":"boolean","description":"Filter by the `ignore_merge` flag (excluded from merge suggestions)."},"is_starred":{"type":"boolean","description":"Match starred (true) or non-starred (false) contacts."},"is_team_overdue":{"type":"boolean","description":"Workspace only. true: the Team cadence is overdue; false: the Team cadence exists and is not overdue. Contacts with no Team cadence match neither."},"is_my_overdue":{"type":"boolean","description":"Workspace only. true: the caller's cadence is overdue; false: the caller's cadence exists and is not overdue. Contacts the caller has no cadence on match neither."},"is_archived":{"type":"boolean","description":"Match archived (true) or active (false) contacts. Defaults to false when omitted."},"has_priority_tier":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"type":"array","items":{"type":"integer","minimum":1,"maximum":9007199254740991}},{"type":"boolean"}],"description":"Relationship priority tier: a tier number, an array of tiers (OR), or a boolean (true = any tier set, false = none)."},"has_linkedin":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"LinkedIn slug: an exact slug string, or a boolean for presence/absence of a LinkedIn handle."},"has_instagram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Instagram slug: an exact slug string, or a boolean for presence/absence of an Instagram handle."},"has_twitter":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Twitter/X slug: an exact slug string, or a boolean for presence/absence of a Twitter handle."},"has_facebook":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Facebook slug: an exact slug string, or a boolean for presence/absence of a Facebook profile."},"has_telegram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Telegram slug: an exact slug string, or a boolean for presence/absence of a Telegram handle."},"has_tiktok":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"TikTok slug: an exact slug string, or a boolean for presence/absence of a TikTok handle."},"has_youtube":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"YouTube slug: an exact slug string, or a boolean for presence/absence of a YouTube channel."},"has_source":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Contact source: a single source string or an array of sources (OR)."},"has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Full name: a bare string (fuzzy contains), an array of exact names, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_groups":{"anyOf":[{"type":"object","properties":{"not":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["not"],"additionalProperties":false},{"type":"boolean"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string"}}],"description":"Group membership: a group id, an array of group ids (OR), a boolean for any/no group, or `{ not }` to exclude group id(s)."},"has_user_created_groups":{"type":"boolean","description":"Non-system group membership: true for at least one user-created group; false for no user-created groups, including contacts with zero memberships or only Dex system-group memberships."},"has_grouping_signal":{"type":"boolean","description":"Internal organize prefilter: title, company, location, or LinkedIn summary is non-null and non-empty. Whitespace-only values are removed by the organize serializer.","enum":[true]},"has_groups_all":{"description":"Array of group-id rows: AND across rows, OR within each row (contact must be in at least one group from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_groups_only":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Exclusive group membership: the contact is in at least one of these group ids and in no group outside them. Contacts with no group never match."},"has_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Keep-in-touch cadence: a frequency string, or a boolean for presence/absence of a cadence."},"has_my_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Workspace only. The caller's own keep-in-touch cadence: a workspace frequency id, or a boolean for presence/absence of the caller's cadence."},"known_by":{"type":"string","minLength":1,"maxLength":128,"description":"Workspace only. An active member's user id: contacts that member has a known email, calendar or shared-note interaction with. For the caller's own id, their private notes count too."},"has_location":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Location: a string (fuzzy, accent-insensitive match), or a boolean for presence/absence of a location."},"has_location_exact":{"type":"string","description":"Location: exact string match (not fuzzy)."},"has_job_title":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Job title: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_never_keep_in_touch":{"type":"boolean","description":"Filter by the `never_keep_in_touch` flag."},"has_created_at":{"description":"Creation-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_updated_at":{"description":"Last-updated-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_next_due":{"description":"Workspace only. Team keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts with no Team cadence never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_my_next_due":{"description":"Workspace only. The caller's own keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts the caller has no cadence on never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_last_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Workspace only. The team's last interaction date, the one the \"Last team interaction\" sort orders by (the latest email, calendar event or shared note any member has with the contact): a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range (at least one bound, at most microsecond precision). Contacts with no team interaction never match a range."},"has_birthday":{"anyOf":[{"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))$"},{},{"type":"boolean"}],"description":"Birthday: a specific date (matches on day + month), or true for any birthday set."},"has_tag":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Match contacts carrying this single tag id."},"has_tags":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"type":"object","properties":{"not":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}]}},"required":["not"],"additionalProperties":false}],"description":"Tags: an array of tag ids (OR), or `{ not }` to exclude tag id(s)."},"has_tags_all":{"description":"Array of tag-id rows: AND across rows, OR within each row (contact must carry at least one tag from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_company":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Company: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Education: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_description":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Description/notes: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn companies text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn education text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_email":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one email."},"has_phone_number":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one phone number."},"not_has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose full name fuzzily matches this string / any of these strings."},"not_has_company":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose company fuzzily matches this string / any of these strings."},"not_has_job_title":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose job title fuzzily matches this string / any of these strings."},"not_has_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose education fuzzily matches this string / any of these strings."},"not_has_description":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose description fuzzily matches this string / any of these strings."},"not_has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn companies text fuzzily matches this string / any of these strings."},"not_has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn education text fuzzily matches this string / any of these strings."},"has_linkedin_last_message_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"LinkedIn last-message time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_last_seen_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Last-seen (last interaction) time — alias for has_interaction: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_distance":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"},"meters":{"type":"number"},"label":{"type":"string"}},"required":["lat","lon","meters"],"additionalProperties":false,"description":"Geo radius filter: contacts within `meters` of `{ lat, lon }` (PostGIS ST_DWithin on geocoded coordinates). `label` is an optional display name for the point."},"has_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Interaction (last-seen) time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_next_reminder":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Next-reminder time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"custom_fields":{"minItems":1,"type":"array","items":{"type":"object","properties":{"field_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"operator":{"type":"string","enum":["contains","eq","in","not_in","present","absent","gte","lte"]},"value":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["field_id","operator"],"additionalProperties":false},"description":"User-defined custom-field filters. Each clause is `{ field_id, operator, value? }`; multiple clauses AND together. Operators: contains, eq, in, not_in, present, absent, gte, lte."}},"additionalProperties":false}}},"additionalProperties":false},"in":"query","name":"where","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["count"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"countContactsV1","summary":"Count contacts","description":"Return the total number of contacts for the authenticated user. Useful for displaying counts in dashboards without fetching full contact records.","x-mint":{"content":"## Use cases\n\n- Display a contact count on a dashboard or summary view\n- Check usage metrics before performing bulk operations\n- Monitor contact database growth over time"}}},"/v1/contacts/filter":{"post":{"tags":["contacts"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"take","required":false},{"schema":{"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"skip","required":false},{"schema":{"type":"string","minLength":1,"maxLength":2048},"in":"query","name":"cursor","required":false,"description":"Opaque pagination cursor: the `nextCursor` of the previous page, passed back unchanged."},{"schema":{"type":"object","properties":{"in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Match contacts whose id is in this set (single id or array)."},"not_in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Exclude contacts whose id is in this set (single id or array)."},"ignore_merge":{"type":"boolean","description":"Filter by the `ignore_merge` flag (excluded from merge suggestions)."},"is_starred":{"type":"boolean","description":"Match starred (true) or non-starred (false) contacts."},"is_team_overdue":{"type":"boolean","description":"Workspace only. true: the Team cadence is overdue; false: the Team cadence exists and is not overdue. Contacts with no Team cadence match neither."},"is_my_overdue":{"type":"boolean","description":"Workspace only. true: the caller's cadence is overdue; false: the caller's cadence exists and is not overdue. Contacts the caller has no cadence on match neither."},"is_archived":{"type":"boolean","description":"Match archived (true) or active (false) contacts. Defaults to false when omitted."},"has_priority_tier":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"type":"array","items":{"type":"integer","minimum":1,"maximum":9007199254740991}},{"type":"boolean"}],"description":"Relationship priority tier: a tier number, an array of tiers (OR), or a boolean (true = any tier set, false = none)."},"has_linkedin":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"LinkedIn slug: an exact slug string, or a boolean for presence/absence of a LinkedIn handle."},"has_instagram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Instagram slug: an exact slug string, or a boolean for presence/absence of an Instagram handle."},"has_twitter":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Twitter/X slug: an exact slug string, or a boolean for presence/absence of a Twitter handle."},"has_facebook":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Facebook slug: an exact slug string, or a boolean for presence/absence of a Facebook profile."},"has_telegram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Telegram slug: an exact slug string, or a boolean for presence/absence of a Telegram handle."},"has_tiktok":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"TikTok slug: an exact slug string, or a boolean for presence/absence of a TikTok handle."},"has_youtube":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"YouTube slug: an exact slug string, or a boolean for presence/absence of a YouTube channel."},"has_source":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Contact source: a single source string or an array of sources (OR)."},"has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Full name: a bare string (fuzzy contains), an array of exact names, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_groups":{"anyOf":[{"type":"object","properties":{"not":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["not"],"additionalProperties":false},{"type":"boolean"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string"}}],"description":"Group membership: a group id, an array of group ids (OR), a boolean for any/no group, or `{ not }` to exclude group id(s)."},"has_user_created_groups":{"type":"boolean","description":"Non-system group membership: true for at least one user-created group; false for no user-created groups, including contacts with zero memberships or only Dex system-group memberships."},"has_grouping_signal":{"type":"boolean","description":"Internal organize prefilter: title, company, location, or LinkedIn summary is non-null and non-empty. Whitespace-only values are removed by the organize serializer.","enum":[true]},"has_groups_all":{"description":"Array of group-id rows: AND across rows, OR within each row (contact must be in at least one group from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_groups_only":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Exclusive group membership: the contact is in at least one of these group ids and in no group outside them. Contacts with no group never match."},"has_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Keep-in-touch cadence: a frequency string, or a boolean for presence/absence of a cadence."},"has_my_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Workspace only. The caller's own keep-in-touch cadence: a workspace frequency id, or a boolean for presence/absence of the caller's cadence."},"known_by":{"type":"string","minLength":1,"maxLength":128,"description":"Workspace only. An active member's user id: contacts that member has a known email, calendar or shared-note interaction with. For the caller's own id, their private notes count too."},"has_location":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Location: a string (fuzzy, accent-insensitive match), or a boolean for presence/absence of a location."},"has_location_exact":{"type":"string","description":"Location: exact string match (not fuzzy)."},"has_job_title":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Job title: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_never_keep_in_touch":{"type":"boolean","description":"Filter by the `never_keep_in_touch` flag."},"has_created_at":{"description":"Creation-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_updated_at":{"description":"Last-updated-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_next_due":{"description":"Workspace only. Team keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts with no Team cadence never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_my_next_due":{"description":"Workspace only. The caller's own keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts the caller has no cadence on never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_last_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Workspace only. The team's last interaction date, the one the \"Last team interaction\" sort orders by (the latest email, calendar event or shared note any member has with the contact): a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range (at least one bound, at most microsecond precision). Contacts with no team interaction never match a range."},"has_birthday":{"anyOf":[{"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))$"},{},{"type":"boolean"}],"description":"Birthday: a specific date (matches on day + month), or true for any birthday set."},"has_tag":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Match contacts carrying this single tag id."},"has_tags":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"type":"object","properties":{"not":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}]}},"required":["not"],"additionalProperties":false}],"description":"Tags: an array of tag ids (OR), or `{ not }` to exclude tag id(s)."},"has_tags_all":{"description":"Array of tag-id rows: AND across rows, OR within each row (contact must carry at least one tag from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_company":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Company: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Education: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_description":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Description/notes: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn companies text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn education text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_email":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one email."},"has_phone_number":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one phone number."},"not_has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose full name fuzzily matches this string / any of these strings."},"not_has_company":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose company fuzzily matches this string / any of these strings."},"not_has_job_title":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose job title fuzzily matches this string / any of these strings."},"not_has_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose education fuzzily matches this string / any of these strings."},"not_has_description":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose description fuzzily matches this string / any of these strings."},"not_has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn companies text fuzzily matches this string / any of these strings."},"not_has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn education text fuzzily matches this string / any of these strings."},"has_linkedin_last_message_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"LinkedIn last-message time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_last_seen_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Last-seen (last interaction) time — alias for has_interaction: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_distance":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"},"meters":{"type":"number"},"label":{"type":"string"}},"required":["lat","lon","meters"],"additionalProperties":false,"description":"Geo radius filter: contacts within `meters` of `{ lat, lon }` (PostGIS ST_DWithin on geocoded coordinates). `label` is an optional display name for the point."},"has_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Interaction (last-seen) time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_next_reminder":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Next-reminder time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"custom_fields":{"minItems":1,"type":"array","items":{"type":"object","properties":{"field_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"operator":{"type":"string","enum":["contains","eq","in","not_in","present","absent","gte","lte"]},"value":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["field_id","operator"],"additionalProperties":false},"description":"User-defined custom-field filters. Each clause is `{ field_id, operator, value? }`; multiple clauses AND together. Operators: contains, eq, in, not_in, present, absent, gte, lte."},"_or":{"description":"Compound-OR escape hatch: an array of filter branches combined with OR, each ANDed with the top-level keys. One level deep — branches cannot themselves contain `_or`.","minItems":1,"type":"array","items":{"type":"object","properties":{"in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Match contacts whose id is in this set (single id or array)."},"not_in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Exclude contacts whose id is in this set (single id or array)."},"ignore_merge":{"type":"boolean","description":"Filter by the `ignore_merge` flag (excluded from merge suggestions)."},"is_starred":{"type":"boolean","description":"Match starred (true) or non-starred (false) contacts."},"is_team_overdue":{"type":"boolean","description":"Workspace only. true: the Team cadence is overdue; false: the Team cadence exists and is not overdue. Contacts with no Team cadence match neither."},"is_my_overdue":{"type":"boolean","description":"Workspace only. true: the caller's cadence is overdue; false: the caller's cadence exists and is not overdue. Contacts the caller has no cadence on match neither."},"is_archived":{"type":"boolean","description":"Match archived (true) or active (false) contacts. Defaults to false when omitted."},"has_priority_tier":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"type":"array","items":{"type":"integer","minimum":1,"maximum":9007199254740991}},{"type":"boolean"}],"description":"Relationship priority tier: a tier number, an array of tiers (OR), or a boolean (true = any tier set, false = none)."},"has_linkedin":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"LinkedIn slug: an exact slug string, or a boolean for presence/absence of a LinkedIn handle."},"has_instagram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Instagram slug: an exact slug string, or a boolean for presence/absence of an Instagram handle."},"has_twitter":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Twitter/X slug: an exact slug string, or a boolean for presence/absence of a Twitter handle."},"has_facebook":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Facebook slug: an exact slug string, or a boolean for presence/absence of a Facebook profile."},"has_telegram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Telegram slug: an exact slug string, or a boolean for presence/absence of a Telegram handle."},"has_tiktok":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"TikTok slug: an exact slug string, or a boolean for presence/absence of a TikTok handle."},"has_youtube":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"YouTube slug: an exact slug string, or a boolean for presence/absence of a YouTube channel."},"has_source":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Contact source: a single source string or an array of sources (OR)."},"has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Full name: a bare string (fuzzy contains), an array of exact names, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_groups":{"anyOf":[{"type":"object","properties":{"not":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["not"],"additionalProperties":false},{"type":"boolean"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string"}}],"description":"Group membership: a group id, an array of group ids (OR), a boolean for any/no group, or `{ not }` to exclude group id(s)."},"has_user_created_groups":{"type":"boolean","description":"Non-system group membership: true for at least one user-created group; false for no user-created groups, including contacts with zero memberships or only Dex system-group memberships."},"has_grouping_signal":{"type":"boolean","description":"Internal organize prefilter: title, company, location, or LinkedIn summary is non-null and non-empty. Whitespace-only values are removed by the organize serializer.","enum":[true]},"has_groups_all":{"description":"Array of group-id rows: AND across rows, OR within each row (contact must be in at least one group from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_groups_only":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Exclusive group membership: the contact is in at least one of these group ids and in no group outside them. Contacts with no group never match."},"has_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Keep-in-touch cadence: a frequency string, or a boolean for presence/absence of a cadence."},"has_my_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Workspace only. The caller's own keep-in-touch cadence: a workspace frequency id, or a boolean for presence/absence of the caller's cadence."},"known_by":{"type":"string","minLength":1,"maxLength":128,"description":"Workspace only. An active member's user id: contacts that member has a known email, calendar or shared-note interaction with. For the caller's own id, their private notes count too."},"has_location":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Location: a string (fuzzy, accent-insensitive match), or a boolean for presence/absence of a location."},"has_location_exact":{"type":"string","description":"Location: exact string match (not fuzzy)."},"has_job_title":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Job title: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_never_keep_in_touch":{"type":"boolean","description":"Filter by the `never_keep_in_touch` flag."},"has_created_at":{"description":"Creation-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_updated_at":{"description":"Last-updated-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_next_due":{"description":"Workspace only. Team keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts with no Team cadence never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_my_next_due":{"description":"Workspace only. The caller's own keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts the caller has no cadence on never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_last_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Workspace only. The team's last interaction date, the one the \"Last team interaction\" sort orders by (the latest email, calendar event or shared note any member has with the contact): a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range (at least one bound, at most microsecond precision). Contacts with no team interaction never match a range."},"has_birthday":{"anyOf":[{"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))$"},{},{"type":"boolean"}],"description":"Birthday: a specific date (matches on day + month), or true for any birthday set."},"has_tag":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Match contacts carrying this single tag id."},"has_tags":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"type":"object","properties":{"not":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}]}},"required":["not"],"additionalProperties":false}],"description":"Tags: an array of tag ids (OR), or `{ not }` to exclude tag id(s)."},"has_tags_all":{"description":"Array of tag-id rows: AND across rows, OR within each row (contact must carry at least one tag from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_company":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Company: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Education: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_description":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Description/notes: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn companies text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn education text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_email":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one email."},"has_phone_number":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one phone number."},"not_has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose full name fuzzily matches this string / any of these strings."},"not_has_company":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose company fuzzily matches this string / any of these strings."},"not_has_job_title":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose job title fuzzily matches this string / any of these strings."},"not_has_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose education fuzzily matches this string / any of these strings."},"not_has_description":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose description fuzzily matches this string / any of these strings."},"not_has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn companies text fuzzily matches this string / any of these strings."},"not_has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn education text fuzzily matches this string / any of these strings."},"has_linkedin_last_message_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"LinkedIn last-message time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_last_seen_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Last-seen (last interaction) time — alias for has_interaction: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_distance":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"},"meters":{"type":"number"},"label":{"type":"string"}},"required":["lat","lon","meters"],"additionalProperties":false,"description":"Geo radius filter: contacts within `meters` of `{ lat, lon }` (PostGIS ST_DWithin on geocoded coordinates). `label` is an optional display name for the point."},"has_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Interaction (last-seen) time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_next_reminder":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Next-reminder time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"custom_fields":{"minItems":1,"type":"array","items":{"type":"object","properties":{"field_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"operator":{"type":"string","enum":["contains","eq","in","not_in","present","absent","gte","lte"]},"value":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["field_id","operator"],"additionalProperties":false},"description":"User-defined custom-field filters. Each clause is `{ field_id, operator, value? }`; multiple clauses AND together. Operators: contains, eq, in, not_in, present, absent, gte, lte."}},"additionalProperties":false}}},"additionalProperties":false},"in":"query","name":"where","required":false},{"schema":{},"in":"query","name":"orderBy","required":false},{"schema":{"type":"object","properties":{"linkedin_data":{"type":"boolean"},"web_search_summary":{"type":"boolean"},"groups_count":{"type":"boolean"},"coordinates":{"type":"boolean"},"last_note":{"type":"boolean"},"contact_emails":{"type":"boolean"},"contact_phone_numbers":{"type":"boolean"},"contact_birthdays":{"type":"boolean"},"contact_locations":{"type":"boolean"},"contacts_custom_fields":{"type":"boolean"},"legacy_contact_addresses":{"type":"boolean"},"groups_contacts":{"type":"boolean"},"tags_contacts":{"type":"boolean"},"timeline_items_contacts":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"feed_items":{"type":"boolean"},"keep_in_touch_reminders":{"type":"boolean"},"contact_relations_contact_relations_sourceTocontacts":{"type":"boolean"},"contact_relations_contact_relations_destinationTocontacts":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["linkedin_data","web_search_summary","groups_count","coordinates","last_note","contact_emails","contact_phone_numbers","contact_birthdays","contact_locations","contacts_custom_fields","legacy_contact_addresses","groups_contacts","tags_contacts","timeline_items_contacts","reminders_contacts","feed_items","keep_in_touch_reminders","contact_relations_contact_relations_sourceTocontacts","contact_relations_contact_relations_destinationTocontacts"]}},"in":"query","name":"include","required":false},{"schema":{"type":"object","properties":{"linkedin_data":{"type":"boolean"},"web_search_summary":{"type":"boolean"},"groups_count":{"type":"boolean"},"coordinates":{"type":"boolean"},"last_note":{"type":"boolean"},"id":{"type":"boolean"},"user_id":{"type":"boolean"},"first_name":{"type":"boolean"},"last_name":{"type":"boolean"},"description":{"type":"boolean"},"birthday":{"type":"boolean"},"legacy_location":{"type":"boolean"},"education":{"type":"boolean"},"job_title":{"type":"boolean"},"company":{"type":"boolean"},"image_source":{"type":"boolean"},"image_url":{"type":"boolean"},"starred":{"type":"boolean"},"last_seen_at":{"type":"boolean"},"last_reminder_at":{"type":"boolean"},"first_met_at":{"type":"boolean"},"first_interaction_at":{"type":"boolean"},"facebook":{"type":"boolean"},"linkedin":{"type":"boolean"},"twitter":{"type":"boolean"},"instagram":{"type":"boolean"},"created_at":{"type":"boolean"},"updated_at":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"telegram":{"type":"boolean"},"website":{"type":"boolean"},"next_reminder_at":{"type":"boolean"},"source":{"type":"boolean"},"is_archived":{"type":"boolean"},"birthday_year":{"type":"boolean"},"linkedin_enhance_date":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"geocode_attempts":{"type":"boolean"},"geocode_failed_at":{"type":"boolean"},"full_name":{"type":"boolean"},"business_card_url":{"type":"boolean"},"linkedin_companies":{"type":"boolean"},"linkedin_education":{"type":"boolean"},"linkedin_last_message_at":{"type":"boolean"},"linkedin_last_message_snippet":{"type":"boolean"},"linkedin_message_link":{"type":"boolean"},"linkedin_urn":{"type":"boolean"},"linkedin_headline":{"type":"boolean"},"whatsapp_message_link":{"type":"boolean"},"whatsapp_message_snippet":{"type":"boolean"},"whatsapp_last_message_at":{"type":"boolean"},"frequency_text":{"type":"boolean"},"imessage_message_link":{"type":"boolean"},"imessage_message_snippet":{"type":"boolean"},"imessage_last_message_at":{"type":"boolean"},"instagram_message_link":{"type":"boolean"},"instagram_message_snippet":{"type":"boolean"},"instagram_last_message_at":{"type":"boolean"},"gmail_last_interaction_at":{"type":"boolean"},"gcal_last_interaction_at":{"type":"boolean"},"gmail_last_interaction_provider_id":{"type":"boolean"},"gcal_last_interaction_provider_id":{"type":"boolean"},"gmail_last_interaction_subject":{"type":"boolean"},"gcal_last_interaction_title":{"type":"boolean"},"phone_call_interaction_snippet":{"type":"boolean"},"phone_call_last_interaction_at":{"type":"boolean"},"tiktok":{"type":"boolean"},"youtube":{"type":"boolean"},"gmail_last_interaction_provider":{"type":"boolean"},"gcal_last_interaction_provider":{"type":"boolean"},"priority_tier":{"type":"boolean"},"workspace_id":{"type":"boolean"},"contact_emails":{"type":"boolean"},"contact_phone_numbers":{"type":"boolean"},"contact_birthdays":{"type":"boolean"},"contact_locations":{"type":"boolean"},"contacts_custom_fields":{"type":"boolean"},"legacy_contact_addresses":{"type":"boolean"},"groups_contacts":{"type":"boolean"},"tags_contacts":{"type":"boolean"},"timeline_items_contacts":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"feed_items":{"type":"boolean"},"keep_in_touch_reminders":{"type":"boolean"},"contact_relations_contact_relations_sourceTocontacts":{"type":"boolean"},"contact_relations_contact_relations_destinationTocontacts":{"type":"boolean"},"frequency":{"type":"boolean"},"frequency_interval":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["linkedin_data","web_search_summary","groups_count","coordinates","last_note","id","user_id","first_name","last_name","description","birthday","legacy_location","education","job_title","company","image_source","image_url","starred","last_seen_at","last_reminder_at","first_met_at","first_interaction_at","facebook","linkedin","twitter","instagram","created_at","updated_at","never_keep_in_touch","telegram","website","next_reminder_at","source","is_archived","birthday_year","linkedin_enhance_date","ignore_merge","geocode_attempts","geocode_failed_at","full_name","business_card_url","linkedin_companies","linkedin_education","linkedin_last_message_at","linkedin_last_message_snippet","linkedin_message_link","linkedin_urn","linkedin_headline","whatsapp_message_link","whatsapp_message_snippet","whatsapp_last_message_at","frequency_text","imessage_message_link","imessage_message_snippet","imessage_last_message_at","instagram_message_link","instagram_message_snippet","instagram_last_message_at","gmail_last_interaction_at","gcal_last_interaction_at","gmail_last_interaction_provider_id","gcal_last_interaction_provider_id","gmail_last_interaction_subject","gcal_last_interaction_title","phone_call_interaction_snippet","phone_call_last_interaction_at","tiktok","youtube","gmail_last_interaction_provider","gcal_last_interaction_provider","priority_tier","workspace_id","contact_emails","contact_phone_numbers","contact_birthdays","contact_locations","contacts_custom_fields","legacy_contact_addresses","groups_contacts","tags_contacts","timeline_items_contacts","reminders_contacts","feed_items","keep_in_touch_reminders","contact_relations_contact_relations_sourceTocontacts","contact_relations_contact_relations_destinationTocontacts","frequency","frequency_interval"]}},"in":"query","name":"select","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"full_name":{"nullable":true,"type":"string"},"description":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"},"company":{"nullable":true,"type":"string"},"education":{"nullable":true,"type":"string"},"legacy_location":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"business_card_url":{"nullable":true,"type":"string"},"website":{"nullable":true,"type":"string"},"image_source":{"nullable":true,"type":"string"},"birthday":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"birthday_year":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"linkedin":{"nullable":true,"type":"string"},"twitter":{"nullable":true,"type":"string"},"facebook":{"nullable":true,"type":"string"},"instagram":{"nullable":true,"type":"string"},"telegram":{"nullable":true,"type":"string"},"tiktok":{"nullable":true,"type":"string"},"youtube":{"nullable":true,"type":"string"},"starred":{"type":"boolean"},"is_archived":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"source":{"type":"string"},"priority_tier":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"frequency":{"nullable":true,"type":"string"},"frequency_text":{"nullable":true,"type":"string"},"last_seen_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"last_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_met_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_companies":{"nullable":true,"type":"string"},"linkedin_education":{"nullable":true,"type":"string"},"linkedin_enhance_date":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_snippet":{"nullable":true,"type":"string"},"linkedin_message_link":{"nullable":true,"type":"string"},"linkedin_urn":{"nullable":true,"type":"string"},"linkedin_headline":{"nullable":true,"type":"string"},"whatsapp_message_link":{"nullable":true,"type":"string"},"whatsapp_message_snippet":{"nullable":true,"type":"string"},"whatsapp_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"imessage_message_link":{"nullable":true,"type":"string"},"imessage_message_snippet":{"nullable":true,"type":"string"},"imessage_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"instagram_message_link":{"nullable":true,"type":"string"},"instagram_message_snippet":{"nullable":true,"type":"string"},"instagram_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gmail_last_interaction_provider_id":{"nullable":true,"type":"string"},"gmail_last_interaction_subject":{"nullable":true,"type":"string"},"gcal_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gcal_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gcal_last_interaction_provider_id":{"nullable":true,"type":"string"},"gcal_last_interaction_title":{"nullable":true,"type":"string"},"phone_call_interaction_snippet":{"nullable":true,"type":"string"},"phone_call_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"web_search_summary":{"nullable":true},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"geocode_attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"geocode_failed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false},"frequency_interval":{},"linkedin_data":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"latitude":{"nullable":true,"type":"number"},"longitude":{"nullable":true,"type":"number"},"last_note":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"preview":{"type":"string"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"}},"required":["id","preview","event_time","emoji","meeting_type"],"additionalProperties":false},"team_keep_in_touch":{"nullable":true,"type":"object","properties":{"cadence_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["cadence_id","frequency_id","days","next_due_at","snoozed_until"],"additionalProperties":false},"contact_emails":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_birthdays":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contact_locations":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contacts_custom_fields":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"tags_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_sourceTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_destinationTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"feed_items":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"keep_in_touch_reminders":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["items","count"],"additionalProperties":{}}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"filterContactsV1","summary":"Filter contacts","description":"Retrieve contacts matching advanced filter criteria. Accepts filter conditions in the request body, supporting the same pagination as the list endpoint.","x-mint":{"content":"## Use cases\n\n- Build a dynamic contact list with user-defined filters\n- Find contacts matching specific criteria (e.g., by company, location, or tags)\n- Power saved views or segments in your application\n\n<Note>This endpoint uses POST because filter criteria can be complex and may exceed URL length limits. The response format is identical to the List contacts endpoint.</Note>\n\n<Note>The cursor is opaque: pass `nextCursor` back unchanged, with the same `orderBy`, and never parse or build one. A cursor reused after the sort changes is refused with `400 validation_error`: start again from the first page. A contact id sent as the cursor, which is what `nextCursor` used to be, is still accepted.</Note>"}}},"/v1/contacts/search":{"get":{"tags":["contacts"],"parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"fullName","required":true},{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"take","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"query","name":"cursor","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"contacts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"full_name":{"nullable":true,"type":"string"},"description":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"},"company":{"nullable":true,"type":"string"},"education":{"nullable":true,"type":"string"},"legacy_location":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"business_card_url":{"nullable":true,"type":"string"},"website":{"nullable":true,"type":"string"},"image_source":{"nullable":true,"type":"string"},"birthday":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"birthday_year":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"linkedin":{"nullable":true,"type":"string"},"twitter":{"nullable":true,"type":"string"},"facebook":{"nullable":true,"type":"string"},"instagram":{"nullable":true,"type":"string"},"telegram":{"nullable":true,"type":"string"},"tiktok":{"nullable":true,"type":"string"},"youtube":{"nullable":true,"type":"string"},"starred":{"type":"boolean"},"is_archived":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"source":{"type":"string"},"priority_tier":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"frequency":{"nullable":true,"type":"string"},"frequency_text":{"nullable":true,"type":"string"},"last_seen_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"last_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_met_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_companies":{"nullable":true,"type":"string"},"linkedin_education":{"nullable":true,"type":"string"},"linkedin_enhance_date":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_snippet":{"nullable":true,"type":"string"},"linkedin_message_link":{"nullable":true,"type":"string"},"linkedin_urn":{"nullable":true,"type":"string"},"linkedin_headline":{"nullable":true,"type":"string"},"whatsapp_message_link":{"nullable":true,"type":"string"},"whatsapp_message_snippet":{"nullable":true,"type":"string"},"whatsapp_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"imessage_message_link":{"nullable":true,"type":"string"},"imessage_message_snippet":{"nullable":true,"type":"string"},"imessage_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"instagram_message_link":{"nullable":true,"type":"string"},"instagram_message_snippet":{"nullable":true,"type":"string"},"instagram_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gmail_last_interaction_provider_id":{"nullable":true,"type":"string"},"gmail_last_interaction_subject":{"nullable":true,"type":"string"},"gcal_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gcal_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gcal_last_interaction_provider_id":{"nullable":true,"type":"string"},"gcal_last_interaction_title":{"nullable":true,"type":"string"},"phone_call_interaction_snippet":{"nullable":true,"type":"string"},"phone_call_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"web_search_summary":{"nullable":true},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"geocode_attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"geocode_failed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false},"frequency_interval":{},"linkedin_data":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"latitude":{"nullable":true,"type":"number"},"longitude":{"nullable":true,"type":"number"},"last_note":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"preview":{"type":"string"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"}},"required":["id","preview","event_time","emoji","meeting_type"],"additionalProperties":false},"team_keep_in_touch":{"nullable":true,"type":"object","properties":{"cadence_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["cadence_id","frequency_id","days","next_due_at","snoozed_until"],"additionalProperties":false},"contact_emails":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_birthdays":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contact_locations":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contacts_custom_fields":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"tags_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_sourceTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_destinationTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"feed_items":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"keep_in_touch_reminders":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}}},"required":["contacts"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"searchContactsTypeaheadV1","summary":"Search contacts","description":"Search contacts by name, email, company, or other text fields. Returns contacts matching the search query, ranked by relevance.","x-mint":{"content":"## Use cases\n\n- Power a real-time search bar in your contact list\n- Find contacts by partial name or email match\n- Look up contacts by company name\n\n<Note>This performs a basic text search across common contact fields. For more advanced filtering with structured criteria, use the Filter contacts endpoint instead.</Note>"}}},"/v1/contacts/merge":{"post":{"tags":["contacts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contactIds":{"minItems":1,"type":"array","items":{"anyOf":[{"minItems":2,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"type":"object","properties":{"contact_ids":{"minItems":2,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"primary_contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["contact_ids"],"additionalProperties":false}]}}},"required":["contactIds"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"mergedContactIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["mergedContactIds"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"mergeContactsV1","summary":"Merge contacts","description":"Merge two or more duplicate contacts into a single contact record. The primary contact is kept and enriched with data from the secondary contacts, which are then deleted.","x-mint":{"content":"## Use cases\n\n- Deduplicate contacts that were imported from multiple sources\n- Combine a manually-created contact with one synced from email\n- Clean up after a bulk import that created duplicates\n\n<Warning>The secondary contacts will be permanently deleted after the merge. Their notes, tags, and group memberships are transferred to the primary contact.</Warning>"}}},"/v1/custom-fields/":{"get":{"tags":["custom-fields"],"parameters":[{"schema":{"type":"object","properties":{"id":{"type":"boolean"},"user_id":{"type":"boolean"},"name":{"type":"boolean"},"field_type":{"type":"boolean"},"categories":{"type":"boolean"},"ranking":{"type":"boolean"},"workspace_id":{"type":"boolean"},"contacts_custom_fields":{"type":"boolean"},"custom_field_types":{"type":"boolean"},"views":{"type":"boolean"},"_count":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["id","user_id","name","field_type","categories","ranking","workspace_id","contacts_custom_fields","custom_field_types","views","_count"]}},"in":"query","name":"select","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"custom_fields":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"name":{"type":"string"},"field_type":{"type":"string"},"categories":{"type":"array","items":{"type":"string"}},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["id"],"additionalProperties":false}}},"required":["custom_fields"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listCustomFieldsV1","summary":"List custom fields","description":"Retrieve all custom field definitions for the authenticated user. Custom fields allow you to add structured data to contacts beyond the built-in fields.","x-mint":{"content":"## Use cases\n\n- Display available custom fields on a contact form\n- Sync custom field definitions to an external system\n- List all custom fields on a settings or configuration page"}},"post":{"tags":["custom-fields"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"custom_field":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"field_type":{"type":"string","enum":["input","autocomplete","datepicker","teammate"]},"categories":{"type":"array","items":{"type":"object","properties":{"category":{"type":"string","minLength":1,"maxLength":100}},"required":["category"],"additionalProperties":false}}},"required":["name","field_type"],"additionalProperties":false}},"required":["custom_field"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"custom_field":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"name":{"type":"string"},"field_type":{"type":"string"},"categories":{"type":"array","items":{"type":"string"}},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["id"],"additionalProperties":false}},"required":["custom_field"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createCustomFieldV1","summary":"Create a custom field","description":"Create a new custom field definition. Once created, the field can be set on any contact to store additional structured data.","x-mint":{"content":"## Use cases\n\n- Add a new field type for tracking custom data (e.g., \"LinkedIn URL\", \"Birthday\", \"Lead Source\")\n- Set up custom fields during onboarding or data import\n- Extend the contact schema to match your specific workflow"}}},"/v1/custom-fields/reorder":{"put":{"tags":["custom-fields"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"updates":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"customFieldId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"ranking":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["customFieldId","ranking"],"additionalProperties":false}}},"required":["updates"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"custom_fields":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"name":{"type":"string"},"field_type":{"type":"string"},"categories":{"type":"array","items":{"type":"string"}},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["id"],"additionalProperties":false}}},"required":["custom_fields"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"reorderCustomFieldsV1","summary":"Reorder custom fields","description":"Update the display order of custom fields by providing new ranking values. The order is reflected everywhere custom fields are displayed.","x-mint":{"content":"## Use cases\n\n- Let users drag-and-drop custom fields to set their preferred display order\n- Ensure custom fields appear in a consistent order across web, mobile, and API responses\n- Persist field ordering preferences across sessions\n\n<Note>Pass an array of `{ customFieldId, ranking }` objects. All custom fields should be included to avoid gaps in the ordering.</Note>"}}},"/v1/custom-fields/{customFieldId}":{"put":{"tags":["custom-fields"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"custom_field":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"field_type":{"type":"string","enum":["input","autocomplete","datepicker","teammate"]},"categories":{"type":"array","items":{"type":"object","properties":{"category":{"type":"string","minLength":1,"maxLength":100}},"required":["category"],"additionalProperties":false}}},"additionalProperties":false}},"required":["custom_field"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"customFieldId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"custom_field":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"name":{"type":"string"},"field_type":{"type":"string"},"categories":{"type":"array","items":{"type":"string"}},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["id"],"additionalProperties":false}},"required":["custom_field"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"updateCustomFieldV1","summary":"Update a custom field","description":"Update a custom field definition by its ID. You can modify the field name or other properties.","x-mint":{"content":"## Use cases\n\n- Rename a custom field to better reflect its purpose\n- Update field configuration or validation rules\n- Correct a typo in a custom field name"}},"delete":{"tags":["custom-fields"],"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"customFieldId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"message":{"type":"string"}},"required":["error","message"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteCustomFieldV1","summary":"Delete a custom field","description":"Permanently delete a custom field definition and remove its values from all contacts.","x-mint":{"content":"## Use cases\n\n- Remove a custom field that is no longer needed\n- Clean up unused fields from the contact schema\n- Delete a field as part of a data model reorganization\n\n<Warning>Deleting a custom field permanently removes its values from all contacts. This action cannot be undone.</Warning>"}}},"/v1/custom-fields/batch-update-contacts":{"post":{"tags":["custom-fields"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"custom_fields":{"minItems":1,"type":"array","items":{"type":"object","properties":{"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"custom_field_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"text_value":{"type":"string"},"date_value":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"array_value":{"type":"array","items":{"type":"string"}},"member_user_id":{"anyOf":[{"type":"string","minLength":1,"maxLength":128},{"type":"null"}]},"mode":{"type":"string","enum":["replace","prepend","append"]},"separator":{"type":"string","maxLength":20}},"required":["contact_id","custom_field_id"],"additionalProperties":false}}},"required":["custom_fields"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["count"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"batchUpdateContactCustomFieldsV1","summary":"Batch update custom field values","description":"Set or update custom field values for multiple contacts in a single request. Useful for bulk-populating custom fields across your contact database.","x-mint":{"content":"## Use cases\n\n- Bulk-set a custom field value across many contacts (e.g., set \"Lead Source\" for all imported contacts)\n- Populate custom fields during a data migration\n- Update custom field values in batch after syncing data from an external system"}}},"/v1/groups/":{"get":{"tags":["groups"],"parameters":[{"schema":{"type":"object","properties":{"name":{},"number_of_contacts":{}},"additionalProperties":false},"in":"query","name":"orderBy","required":false},{"schema":{"type":"object","properties":{"has_subgroups":{"type":"boolean"},"has_parent":{"type":"boolean"},"has_name":{"type":"string","minLength":1,"maxLength":100},"not_in":{"type":"array","items":{"type":"string"}},"archived":{"type":"boolean"}},"additionalProperties":false},"in":"query","name":"where","required":false},{"schema":{"type":"object","properties":{"parent_group":{"type":"boolean"},"sub_groups":{"type":"boolean"},"sub_groups_name_order":{},"contacts_count":{"type":"boolean"},"sub_groups_count":{"type":"boolean"},"is_favorite":{"type":"boolean"}},"additionalProperties":false},"in":"query","name":"include","required":false},{"schema":{"type":"object","properties":{"parent_group":{"type":"boolean"},"sub_groups":{"type":"boolean"},"sub_groups_name_order":{},"contacts_count":{"type":"boolean"},"sub_groups_count":{"type":"boolean"},"is_favorite":{"type":"boolean"},"id":{"type":"boolean"},"user_id":{"type":"boolean"},"name":{"type":"boolean"},"emoji":{"type":"boolean"},"description":{"type":"boolean"},"created_at":{"type":"boolean"},"parent_id":{"type":"boolean"},"ranking":{"type":"boolean"},"workspace_id":{"type":"boolean"},"archived_at":{"type":"boolean"},"parent_groups":{"type":"boolean"},"groups_contacts":{"type":"boolean"},"views":{"type":"boolean"},"favorites":{"type":"boolean"},"share_links":{"type":"boolean"},"_count":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["parent_group","sub_groups","sub_groups_name_order","contacts_count","sub_groups_count","is_favorite","id","user_id","name","emoji","description","created_at","parent_id","ranking","workspace_id","archived_at","parent_groups","groups_contacts","views","favorites","share_links","_count"]}},"in":"query","name":"select","required":false},{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"take","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"query","name":"cursor","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/definitions/__schema0"}}},"required":["groups"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false,"definitions":{"__schema0":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"emoji":{"type":"string"},"description":{"nullable":true,"type":"string"},"parent_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"archived_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"is_favorite":{"type":"boolean"},"sub_groups":{"type":"array","items":{"$ref":"#/definitions/__schema0"}},"parent_groups":{"nullable":true,"allOf":[{"$ref":"#/definitions/__schema0"}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sub_groups":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}}}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listGroupsV1","summary":"List groups","description":"Retrieve all groups for the authenticated user. Groups are collections of contacts used to organize your network (e.g., \"Coworkers\", \"College Friends\").","x-mint":{"content":"## Use cases\n\n- Display a sidebar or navigation menu of contact groups\n- Sync group structure to an external system\n- List all groups to let users pick which group to add a contact to"}},"post":{"tags":["groups"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"group":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"emoji":{"type":"string"},"description":{"type":"string"},"parent_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"parent":{},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","not":{"enum":["00000000-0000-0000-0000-000000000000"]}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contact":{}},"required":["contact_id"],"additionalProperties":false}}},"required":["name"],"additionalProperties":false}},"required":["group"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"group":{"$ref":"#/definitions/__schema0"}},"required":["group"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false,"definitions":{"__schema0":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"emoji":{"type":"string"},"description":{"nullable":true,"type":"string"},"parent_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"archived_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"is_favorite":{"type":"boolean"},"sub_groups":{"type":"array","items":{"$ref":"#/definitions/__schema0"}},"parent_groups":{"nullable":true,"allOf":[{"$ref":"#/definitions/__schema0"}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sub_groups":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}}}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createGroupV1","summary":"Create a group","description":"Create a new group for organizing contacts. Provide a name and optional metadata for the group.","x-mint":{"content":"## Use cases\n\n- Let users create custom groups to organize their contacts\n- Programmatically create groups when importing data from another CRM\n- Set up default groups for new users during onboarding"}}},"/v1/groups/count":{"get":{"tags":["groups"],"parameters":[{"schema":{"type":"object","properties":{"has_subgroups":{"type":"boolean"},"has_parent":{"type":"boolean"},"has_name":{"type":"string","minLength":1,"maxLength":100},"not_in":{"type":"array","items":{"type":"string"}},"archived":{"type":"boolean"}},"additionalProperties":false},"in":"query","name":"where","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["count"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"countGroupsV1","summary":"Count groups","description":"Return the total number of groups for the authenticated user.","x-mint":{"content":"## Use cases\n\n- Display a group count on a dashboard\n- Check how many groups a user has for plan limit enforcement\n- Monitor group usage over time"}}},"/v1/groups/{groupId}":{"get":{"tags":["groups"],"parameters":[{"schema":{"type":"object","properties":{"parent_group":{"type":"boolean"},"sub_groups":{"type":"boolean"},"sub_groups_name_order":{},"contacts_count":{"type":"boolean"},"sub_groups_count":{"type":"boolean"},"is_favorite":{"type":"boolean"}},"additionalProperties":false},"in":"query","name":"include","required":false},{"schema":{"type":"object","properties":{"parent_group":{"type":"boolean"},"sub_groups":{"type":"boolean"},"sub_groups_name_order":{},"contacts_count":{"type":"boolean"},"sub_groups_count":{"type":"boolean"},"is_favorite":{"type":"boolean"},"id":{"type":"boolean"},"user_id":{"type":"boolean"},"name":{"type":"boolean"},"emoji":{"type":"boolean"},"description":{"type":"boolean"},"created_at":{"type":"boolean"},"parent_id":{"type":"boolean"},"ranking":{"type":"boolean"},"workspace_id":{"type":"boolean"},"archived_at":{"type":"boolean"},"parent_groups":{"type":"boolean"},"groups_contacts":{"type":"boolean"},"views":{"type":"boolean"},"favorites":{"type":"boolean"},"share_links":{"type":"boolean"},"_count":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["parent_group","sub_groups","sub_groups_name_order","contacts_count","sub_groups_count","is_favorite","id","user_id","name","emoji","description","created_at","parent_id","ranking","workspace_id","archived_at","parent_groups","groups_contacts","views","favorites","share_links","_count"]}},"in":"query","name":"select","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"groupId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"group":{"$ref":"#/definitions/__schema0"}},"required":["group"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false,"definitions":{"__schema0":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"emoji":{"type":"string"},"description":{"nullable":true,"type":"string"},"parent_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"archived_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"is_favorite":{"type":"boolean"},"sub_groups":{"type":"array","items":{"$ref":"#/definitions/__schema0"}},"parent_groups":{"nullable":true,"allOf":[{"$ref":"#/definitions/__schema0"}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sub_groups":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}}}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getGroupV1","summary":"Get a group","description":"Retrieve a single group by its unique ID, including its name and metadata.","x-mint":{"content":"## Use cases\n\n- Display group details on a group page\n- Fetch group metadata before editing it\n- Verify a group exists before adding contacts to it"}},"put":{"tags":["groups"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"group":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"emoji":{"type":"string"},"description":{"type":"string"},"parent_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"parent":{}},"additionalProperties":false}},"required":["group"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"groupId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"group":{"$ref":"#/definitions/__schema0"}},"required":["group"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false,"definitions":{"__schema0":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"emoji":{"type":"string"},"description":{"nullable":true,"type":"string"},"parent_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"archived_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"is_favorite":{"type":"boolean"},"sub_groups":{"type":"array","items":{"$ref":"#/definitions/__schema0"}},"parent_groups":{"nullable":true,"allOf":[{"$ref":"#/definitions/__schema0"}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sub_groups":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}}}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"updateGroupV1","summary":"Update a group","description":"Update a group's name or other properties by its ID. Only the fields included in the request body are modified.","x-mint":{"content":"## Use cases\n\n- Rename a group\n- Update group metadata or settings\n- Modify group properties as part of a bulk reorganization"}},"delete":{"tags":["groups"],"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"groupId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"message":{"type":"string"}},"required":["error","message"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteGroupV1","summary":"Delete a group","description":"Permanently delete a group by its ID. The contacts in the group are not deleted — only their association with this group is removed.","x-mint":{"content":"## Use cases\n\n- Remove a group that is no longer needed\n- Clean up empty or unused groups\n- Delete a group as part of a reorganization\n\n<Note>Deleting a group does not delete the contacts in it. The contacts remain in your account and can still be found in other groups or the main contact list.</Note>"}}},"/v1/groups/contact-counts":{"get":{"tags":["groups"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"groupIds","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"counts":{"type":"object","additionalProperties":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}}},"required":["counts"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getGroupContactCountsV1","summary":"Get contact counts per group","description":"Retrieve the number of contacts in each group. Returns a map of group IDs to their respective contact counts.","x-mint":{"content":"## Use cases\n\n- Display contact counts next to group names in a sidebar\n- Identify empty or low-membership groups for cleanup\n- Build analytics on group sizes"}}},"/v1/groups/{groupId}/contacts":{"get":{"tags":["groups"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"take","required":false},{"schema":{"type":"string","minLength":1,"maxLength":2048},"in":"query","name":"cursor","required":false,"description":"Opaque pagination cursor: the `nextCursor` of the previous page, passed back unchanged."},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"groupId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"full_name":{"nullable":true,"type":"string"},"description":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"},"company":{"nullable":true,"type":"string"},"education":{"nullable":true,"type":"string"},"legacy_location":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"business_card_url":{"nullable":true,"type":"string"},"website":{"nullable":true,"type":"string"},"image_source":{"nullable":true,"type":"string"},"birthday":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"birthday_year":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"linkedin":{"nullable":true,"type":"string"},"twitter":{"nullable":true,"type":"string"},"facebook":{"nullable":true,"type":"string"},"instagram":{"nullable":true,"type":"string"},"telegram":{"nullable":true,"type":"string"},"tiktok":{"nullable":true,"type":"string"},"youtube":{"nullable":true,"type":"string"},"starred":{"type":"boolean"},"is_archived":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"source":{"type":"string"},"priority_tier":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"frequency":{"nullable":true,"type":"string"},"frequency_text":{"nullable":true,"type":"string"},"last_seen_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"last_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_met_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_companies":{"nullable":true,"type":"string"},"linkedin_education":{"nullable":true,"type":"string"},"linkedin_enhance_date":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_snippet":{"nullable":true,"type":"string"},"linkedin_message_link":{"nullable":true,"type":"string"},"linkedin_urn":{"nullable":true,"type":"string"},"linkedin_headline":{"nullable":true,"type":"string"},"whatsapp_message_link":{"nullable":true,"type":"string"},"whatsapp_message_snippet":{"nullable":true,"type":"string"},"whatsapp_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"imessage_message_link":{"nullable":true,"type":"string"},"imessage_message_snippet":{"nullable":true,"type":"string"},"imessage_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"instagram_message_link":{"nullable":true,"type":"string"},"instagram_message_snippet":{"nullable":true,"type":"string"},"instagram_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gmail_last_interaction_provider_id":{"nullable":true,"type":"string"},"gmail_last_interaction_subject":{"nullable":true,"type":"string"},"gcal_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gcal_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gcal_last_interaction_provider_id":{"nullable":true,"type":"string"},"gcal_last_interaction_title":{"nullable":true,"type":"string"},"phone_call_interaction_snippet":{"nullable":true,"type":"string"},"phone_call_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"web_search_summary":{"nullable":true},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"geocode_attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"geocode_failed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false},"frequency_interval":{},"linkedin_data":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"latitude":{"nullable":true,"type":"number"},"longitude":{"nullable":true,"type":"number"},"last_note":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"preview":{"type":"string"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"}},"required":["id","preview","event_time","emoji","meeting_type"],"additionalProperties":false},"team_keep_in_touch":{"nullable":true,"type":"object","properties":{"cadence_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["cadence_id","frequency_id","days","next_due_at","snoozed_until"],"additionalProperties":false},"contact_emails":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_birthdays":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contact_locations":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contacts_custom_fields":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"tags_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_sourceTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_destinationTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"feed_items":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"keep_in_touch_reminders":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["items","count"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listGroupContactsV1","summary":"List contacts in a group","description":"Retrieve all contacts that belong to a specific group. Supports pagination for groups with many contacts.","x-mint":{"content":"## Use cases\n\n- Display the contact list for a selected group\n- Export contacts from a specific group\n- Sync group membership to an external system\n\n<Note>The cursor is opaque: pass `nextCursor` back unchanged, with the same `orderBy`, and never parse or build one. A cursor reused after the sort changes is refused with `400 validation_error`: start again from the first page. A contact id sent as the cursor, which is what `nextCursor` used to be, is still accepted.</Note>"}},"put":{"tags":["groups"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contactIds":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"allowPartial":{"type":"boolean"}},"required":["contactIds"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"groupId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"result":{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"remaining":{"type":"array","items":{"type":"string"}}},"required":["count"],"additionalProperties":false}},"required":["result"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"addContactsToGroupV1","summary":"Add contacts to a group","description":"Add one or more contacts to a group by providing an array of contact IDs. Contacts that are already in the group are ignored.","x-mint":{"content":"## Use cases\n\n- Let users drag-and-drop contacts into a group\n- Bulk-add contacts to a group after filtering or searching\n- Automatically organize imported contacts into groups\n\n<Note>If a contact is already a member of the group, it will be silently skipped — no error is returned.</Note>"}},"post":{"tags":["groups"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contactIds":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"allowPartial":{"type":"boolean"}},"required":["contactIds"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"groupId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"message":{"type":"string"},"data":{"type":"object","properties":{"result":{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"remaining":{"type":"array","items":{"type":"string"}}},"required":["count"],"additionalProperties":false}},"required":["result"],"additionalProperties":false}},"required":["error","message"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"removeContactsFromGroupV1","summary":"Remove contacts from a group","description":"Remove one or more contacts from a group. The contacts themselves are not deleted — only their group membership is removed.","x-mint":{"content":"## Use cases\n\n- Let users remove contacts from a group via the UI\n- Clean up group membership after a reorganization\n- Unassign contacts that no longer belong to a group\n\n<Note>Removing a contact from a group does not delete the contact. It only removes the association between the contact and this group.</Note>"}}},"/v1/reminders/{reminderId}":{"get":{"tags":["reminders"],"parameters":[{"schema":{"type":"object","properties":{"recurrence":{"type":"boolean"},"contacts":{"type":"boolean"},"tags":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"reminders_tags":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["recurrence","contacts","tags","reminders_contacts","reminders_tags"]}},"in":"query","name":"include","required":false},{"schema":{"type":"object","properties":{"recurrence":{"type":"boolean"},"contacts":{"type":"boolean"},"tags":{"type":"boolean"},"id":{"type":"boolean"},"user_id":{"type":"boolean"},"text":{"type":"boolean"},"due_at_date":{"type":"boolean"},"due_at_time":{"type":"boolean"},"is_complete":{"type":"boolean"},"email_sent":{"type":"boolean"},"push_notification_sent":{"type":"boolean"},"created_at":{"type":"boolean"},"last_completed_at":{"type":"boolean"},"next_occurrence_at":{"type":"boolean"},"workspace_id":{"type":"boolean"},"assignee_id":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"reminders_tags":{"type":"boolean"},"is_overdue":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["recurrence","contacts","tags","id","user_id","text","due_at_date","due_at_time","is_complete","email_sent","push_notification_sent","created_at","last_completed_at","next_occurrence_at","workspace_id","assignee_id","reminders_contacts","reminders_tags","is_overdue"]}},"in":"query","name":"select","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"reminderId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"assignee_id":{"nullable":true,"type":"string"},"text":{"nullable":true,"type":"string"},"due_at_date":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"due_at_time":{"nullable":true,"anyOf":[{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},{"type":"string"}]},"is_complete":{"type":"boolean"},"email_sent":{"type":"boolean"},"push_notification_sent":{"type":"boolean"},"recurrence":{"nullable":true,"type":"string"},"last_completed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_occurrence_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"is_overdue":{"type":"boolean"},"next_cursor":{"type":"string"},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_tags":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"users":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getReminderV1","summary":"Get a reminder","description":"Retrieve a single reminder by its unique ID, including its title, due date, associated contact, and recurrence settings.","x-mint":{"content":"## Use cases\n\n- Display reminder details on a detail or edit page\n- Fetch the latest reminder state before updating it\n- Verify a reminder exists before performing operations on it"}},"put":{"tags":["reminders"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reminder":{"type":"object","properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}]},"due_at_date":{},"due_at_time":{"anyOf":[{},{"type":"null"}]},"is_complete":{"type":"boolean"},"recurrence":{"anyOf":[{"type":"string","enum":["7 days","14 days","1 mon","3 mons","6 mons","1 year"]},{"type":"null"}]},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contacts":{}},"required":["contact_id"],"additionalProperties":false}},"assignee_id":{"anyOf":[{"enum":[null]},{"type":"string","maxLength":128}]},"tag_ids":{"maxItems":100,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"last_completed_at":{"anyOf":[{"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))$"},{"type":"null"}]},"next_occurrence_at":{"anyOf":[{"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))$"},{"type":"null"}]},"email_sent":{"type":"boolean"},"push_notification_sent":{"type":"boolean"}},"additionalProperties":false}},"required":["reminder"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"reminderId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"reminder":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"assignee_id":{"nullable":true,"type":"string"},"text":{"nullable":true,"type":"string"},"due_at_date":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"due_at_time":{"nullable":true,"anyOf":[{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},{"type":"string"}]},"is_complete":{"type":"boolean"},"email_sent":{"type":"boolean"},"push_notification_sent":{"type":"boolean"},"recurrence":{"nullable":true,"type":"string"},"last_completed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_occurrence_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"is_overdue":{"type":"boolean"},"next_cursor":{"type":"string"},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_tags":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"users":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"required":["reminder"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"updateReminderV1","summary":"Update a reminder","description":"Update a reminder by its ID. You can modify the title, due date, associated contact, recurrence, or completion status.","x-mint":{"content":"## Use cases\n\n- Reschedule a reminder to a different date\n- Mark a reminder as completed\n- Change the recurrence frequency of a keep-in-touch reminder\n- Reassign a reminder to a different contact"}},"delete":{"tags":["reminders"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"reminderId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"message":{"type":"string"}},"required":["error","message"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteReminderV1","summary":"Delete a reminder","description":"Permanently delete a reminder by its ID. For recurring reminders, this stops all future occurrences.","x-mint":{"content":"## Use cases\n\n- Remove a reminder that is no longer relevant\n- Cancel a recurring keep-in-touch cadence\n- Clean up completed or outdated reminders\n\n<Note>Deleting a recurring reminder cancels all future occurrences. This action cannot be undone.</Note>"}}},"/v1/reminders/":{"get":{"tags":["reminders"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"take","required":false},{"schema":{"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"skip","required":false},{"schema":{"type":"string","minLength":1,"maxLength":16384},"in":"query","name":"cursor","required":false},{"schema":{"type":"object","properties":{"in":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"not_in":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"is_complete":{"type":"boolean"},"text":{"type":"string","minLength":1,"maxLength":500},"is_overdue":{"type":"boolean"},"assignee_id":{"anyOf":[{"type":"string","enum":["me"]},{"type":"string","enum":["none"]},{"type":"string","minLength":1,"maxLength":128}]},"has_contacts":{"anyOf":[{"type":"object","properties":{"not":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}]}},"required":["not"],"additionalProperties":false},{"type":"boolean"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}]},"has_tag":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Match reminders carrying this single tag id."},"has_due_at_date":{"type":"object","properties":{"gte":{"type":"string","format":"date","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])))$"},"lte":{"type":"string","format":"date","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])))$"}},"additionalProperties":false},"has_created_at":{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}},"additionalProperties":false},"in":"query","name":"where","required":false},{"schema":{},"in":"query","name":"orderBy","required":false},{"schema":{"type":"object","properties":{"recurrence":{"type":"boolean"},"contacts":{"type":"boolean"},"tags":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"reminders_tags":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["recurrence","contacts","tags","reminders_contacts","reminders_tags"]}},"in":"query","name":"include","required":false},{"schema":{"type":"object","properties":{"recurrence":{"type":"boolean"},"contacts":{"type":"boolean"},"tags":{"type":"boolean"},"id":{"type":"boolean"},"user_id":{"type":"boolean"},"text":{"type":"boolean"},"due_at_date":{"type":"boolean"},"due_at_time":{"type":"boolean"},"is_complete":{"type":"boolean"},"email_sent":{"type":"boolean"},"push_notification_sent":{"type":"boolean"},"created_at":{"type":"boolean"},"last_completed_at":{"type":"boolean"},"next_occurrence_at":{"type":"boolean"},"workspace_id":{"type":"boolean"},"assignee_id":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"reminders_tags":{"type":"boolean"},"is_overdue":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["recurrence","contacts","tags","id","user_id","text","due_at_date","due_at_time","is_complete","email_sent","push_notification_sent","created_at","last_completed_at","next_occurrence_at","workspace_id","assignee_id","reminders_contacts","reminders_tags","is_overdue"]}},"in":"query","name":"select","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"assignee_id":{"nullable":true,"type":"string"},"text":{"nullable":true,"type":"string"},"due_at_date":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"due_at_time":{"nullable":true,"anyOf":[{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},{"type":"string"}]},"is_complete":{"type":"boolean"},"email_sent":{"type":"boolean"},"push_notification_sent":{"type":"boolean"},"recurrence":{"nullable":true,"type":"string"},"last_completed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_occurrence_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"is_overdue":{"type":"boolean"},"next_cursor":{"type":"string"},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_tags":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"users":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"nextCursor":{"nullable":true,"type":"string"}},"required":["items"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listRemindersV1","summary":"List reminders","description":"Retrieve all reminders for the authenticated user. Supports filtering by contact, date range, and completion status.","x-mint":{"content":"## Use cases\n\n- Display a list of upcoming reminders in a dashboard\n- Show all reminders associated with a specific contact\n- Sync reminders to an external calendar or task management system"}},"post":{"tags":["reminders"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reminder":{"type":"object","properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}]},"due_at_date":{},"due_at_time":{"anyOf":[{},{"type":"null"}]},"is_complete":{"type":"boolean"},"recurrence":{"anyOf":[{"type":"string","enum":["7 days","14 days","1 mon","3 mons","6 mons","1 year"]},{"type":"null"}]},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contacts":{}},"required":["contact_id"],"additionalProperties":false}},"assignee_id":{"anyOf":[{"enum":[null]},{"type":"string","maxLength":128}]},"tag_ids":{"maxItems":100,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["due_at_date"],"additionalProperties":false}},"required":["reminder"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"reminder":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"assignee_id":{"nullable":true,"type":"string"},"text":{"nullable":true,"type":"string"},"due_at_date":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"due_at_time":{"nullable":true,"anyOf":[{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},{"type":"string"}]},"is_complete":{"type":"boolean"},"email_sent":{"type":"boolean"},"push_notification_sent":{"type":"boolean"},"recurrence":{"nullable":true,"type":"string"},"last_completed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_occurrence_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"is_overdue":{"type":"boolean"},"next_cursor":{"type":"string"},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_tags":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"users":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"required":["reminder"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createReminderV1","summary":"Create a reminder","description":"Create a new reminder for the authenticated user. A reminder can be linked to a contact and optionally set to recur on a schedule.","x-mint":{"content":"## Use cases\n\n- Set a follow-up reminder after a meeting or call\n- Create a keep-in-touch cadence for an important contact\n- Schedule a reminder to reach out before a birthday or event\n\n<Note>To create a recurring reminder, include the recurrence fields in the request. One-time reminders only need a due date.</Note>"}}},"/v1/reminders/recurring":{"get":{"tags":["reminders"],"parameters":[{"schema":{"type":"object","properties":{"recurrence":{"type":"boolean"},"contacts":{"type":"boolean"},"tags":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"reminders_tags":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["recurrence","contacts","tags","reminders_contacts","reminders_tags"]}},"in":"query","name":"include","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"assignee_id":{"nullable":true,"type":"string"},"text":{"nullable":true,"type":"string"},"due_at_date":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"due_at_time":{"nullable":true,"anyOf":[{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},{"type":"string"}]},"is_complete":{"type":"boolean"},"email_sent":{"type":"boolean"},"push_notification_sent":{"type":"boolean"},"recurrence":{"nullable":true,"type":"string"},"last_completed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_occurrence_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"is_overdue":{"type":"boolean"},"next_cursor":{"type":"string"},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_tags":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"users":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}}},"required":["items"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listRecurringRemindersV1","summary":"List recurring reminders","description":"Retrieve all recurring (keep-in-touch) reminders for the authenticated user. These are repeating reminders set to maintain contact with specific people.","x-mint":{"content":"## Use cases\n\n- Display a keep-in-touch dashboard showing recurring outreach commitments\n- Review and manage all recurring reminder schedules\n- Identify contacts with active keep-in-touch cadences"}}},"/v1/search/contacts":{"get":{"tags":["search"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"searchQuery","required":false},{"schema":{"type":"boolean"},"in":"query","name":"archived","required":false},{"schema":{"type":"boolean"},"in":"query","name":"minimal","required":false},{"schema":{"type":"boolean"},"in":"query","name":"exactMatch","required":false},{"schema":{"type":"boolean"},"in":"query","name":"enhanced","required":false},{"schema":{"type":"string"},"in":"query","name":"near","required":false},{"schema":{"type":"number","exclusiveMinimum":0},"in":"query","name":"radiusKm","required":false},{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"take","required":false},{"schema":{"type":"boolean"},"in":"query","name":"fallbackNameToEmail","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false},{"schema":{"anyOf":[{"type":"object","properties":{"not":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}]}},"required":["not"],"additionalProperties":false},{"type":"boolean"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}]},"in":"query","name":"has_groups","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"full_name":{"nullable":true,"type":"string"},"description":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"},"company":{"nullable":true,"type":"string"},"education":{"nullable":true,"type":"string"},"legacy_location":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"business_card_url":{"nullable":true,"type":"string"},"website":{"nullable":true,"type":"string"},"image_source":{"nullable":true,"type":"string"},"birthday":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"birthday_year":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"linkedin":{"nullable":true,"type":"string"},"twitter":{"nullable":true,"type":"string"},"facebook":{"nullable":true,"type":"string"},"instagram":{"nullable":true,"type":"string"},"telegram":{"nullable":true,"type":"string"},"tiktok":{"nullable":true,"type":"string"},"youtube":{"nullable":true,"type":"string"},"starred":{"type":"boolean"},"is_archived":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"source":{"type":"string"},"priority_tier":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"frequency":{"nullable":true,"type":"string"},"frequency_text":{"nullable":true,"type":"string"},"last_seen_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"last_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_met_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_companies":{"nullable":true,"type":"string"},"linkedin_education":{"nullable":true,"type":"string"},"linkedin_enhance_date":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_snippet":{"nullable":true,"type":"string"},"linkedin_message_link":{"nullable":true,"type":"string"},"linkedin_urn":{"nullable":true,"type":"string"},"linkedin_headline":{"nullable":true,"type":"string"},"whatsapp_message_link":{"nullable":true,"type":"string"},"whatsapp_message_snippet":{"nullable":true,"type":"string"},"whatsapp_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"imessage_message_link":{"nullable":true,"type":"string"},"imessage_message_snippet":{"nullable":true,"type":"string"},"imessage_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"instagram_message_link":{"nullable":true,"type":"string"},"instagram_message_snippet":{"nullable":true,"type":"string"},"instagram_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gmail_last_interaction_provider_id":{"nullable":true,"type":"string"},"gmail_last_interaction_subject":{"nullable":true,"type":"string"},"gcal_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gcal_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gcal_last_interaction_provider_id":{"nullable":true,"type":"string"},"gcal_last_interaction_title":{"nullable":true,"type":"string"},"phone_call_interaction_snippet":{"nullable":true,"type":"string"},"phone_call_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"web_search_summary":{"nullable":true},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"geocode_attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"geocode_failed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false},"frequency_interval":{},"linkedin_data":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"latitude":{"nullable":true,"type":"number"},"longitude":{"nullable":true,"type":"number"},"last_note":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"preview":{"type":"string"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"}},"required":["id","preview","event_time","emoji","meeting_type"],"additionalProperties":false},"team_keep_in_touch":{"nullable":true,"type":"object","properties":{"cadence_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["cadence_id","frequency_id","days","next_due_at","snoozed_until"],"additionalProperties":false},"contact_emails":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_birthdays":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contact_locations":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contacts_custom_fields":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"tags_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_sourceTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_destinationTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"feed_items":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"keep_in_touch_reminders":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"searchContactsV1","summary":"Search contacts (global)","description":"Full-text search across all contacts. Part of the global search API that searches across multiple entity types.","x-mint":{"content":"## Use cases\n\n- Power a global search bar that searches across contacts\n- Find contacts matching a keyword across all fields\n- Build a unified search experience alongside other entity types"}}},"/v1/search/timeline":{"get":{"tags":["search"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"searchQuery","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"query","name":"contactId","required":false},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false},{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"take","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false},{"schema":{"type":"boolean"},"in":"query","name":"includeContactDetails","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"audience":{"type":"string","enum":["private","shared"]},"note":{"nullable":true,"type":"string"},"custom_emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"},"meeting_type_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"google_calendar_event_id_v3":{"nullable":true,"type":"string"},"oauth_credential_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"calendar_account_email":{"nullable":true,"type":"string"},"calendar_account_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"reminder_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"channels":{"type":"array","items":{"type":"string","enum":["whatsapp","imessage","linkedin","instagram"]}},"next_cursor":{"type":"string"},"meeting_types":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"attachments":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["id","channels","meeting_types"],"additionalProperties":false}},"nextCursor":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["items","nextCursor","count"],"additionalProperties":{}}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"searchNotesV1","summary":"Search notes","description":"Full-text search across all notes and timeline entries. Part of the global search API.","x-mint":{"content":"## Use cases\n\n- Search for notes containing specific keywords or topics\n- Find past interactions or meeting notes\n- Power a global search bar that includes note results"}}},"/v1/search/groups":{"get":{"tags":["search"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"searchQuery","required":false},{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"take","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/definitions/__schema0"}},"nextCursor":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["items","nextCursor","count"],"additionalProperties":{}}},"required":["error","data"],"additionalProperties":false,"definitions":{"__schema0":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"emoji":{"type":"string"},"description":{"nullable":true,"type":"string"},"parent_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"archived_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"is_favorite":{"type":"boolean"},"sub_groups":{"type":"array","items":{"$ref":"#/definitions/__schema0"}},"parent_groups":{"nullable":true,"allOf":[{"$ref":"#/definitions/__schema0"}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sub_groups":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}}}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"searchGroupsV1","summary":"Search groups","description":"Search groups by name. Part of the global search API that searches across multiple entity types.","x-mint":{"content":"## Use cases\n\n- Power a global search bar that includes group results\n- Find groups matching a keyword\n- Build a search experience for quickly navigating to a group"}}},"/v1/search/tags":{"get":{"tags":["search"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"searchQuery","required":false},{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"take","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"_count":{"type":"object","properties":{"tags_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["tags_contacts"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"searchTagsV1","summary":"Search tags","description":"Search tags by name. Part of the global search API that searches across multiple entity types.","x-mint":{"content":"## Use cases\n\n- Power a global search bar that includes tag results\n- Find tags matching a keyword for quick navigation\n- Build a tag autocomplete with search functionality"}}},"/v1/search/views":{"get":{"tags":["search"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"searchQuery","required":false},{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"take","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"nullable":true,"type":"string"},"emoji":{"nullable":true,"type":"string"},"filters":{},"description":{"nullable":true,"type":"string"},"created_at":{"type":"string"},"updated_at":{"type":"string"},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":{}}}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"searchViewsV1","summary":"Search views","description":"Search saved views by name. Part of the global search API that searches across multiple entity types.","x-mint":{"content":"## Use cases\n\n- Power a global search bar that includes saved view results\n- Find views matching a keyword for quick navigation\n- Help users discover existing saved views"}}},"/v1/search/reminders":{"get":{"tags":["search"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"searchQuery","required":false},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false},{"schema":{"type":"boolean"},"in":"query","name":"isComplete","required":false},{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"take","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"assignee_id":{"nullable":true,"type":"string"},"text":{"nullable":true,"type":"string"},"due_at_date":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"due_at_time":{"nullable":true,"anyOf":[{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},{"type":"string"}]},"is_complete":{"type":"boolean"},"email_sent":{"type":"boolean"},"push_notification_sent":{"type":"boolean"},"recurrence":{"nullable":true,"type":"string"},"last_completed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_occurrence_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"is_overdue":{"type":"boolean"},"next_cursor":{"type":"string"},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_tags":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"users":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"nextCursor":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["items","nextCursor","count"],"additionalProperties":{}}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"searchRemindersV1","summary":"Search reminders","description":"Search reminders by title or content. Part of the global search API that searches across multiple entity types.","x-mint":{"content":"## Use cases\n\n- Power a global search bar that includes reminder results\n- Find reminders matching a keyword\n- Help users quickly locate a specific reminder"}}},"/v1/tags/":{"get":{"tags":["tags"],"parameters":[{"schema":{"type":"object","properties":{"contacts_count":{"type":"boolean"}},"additionalProperties":false},"in":"query","name":"include","required":false},{"schema":{"type":"object","properties":{"contacts_count":{"type":"boolean"},"id":{"type":"boolean"},"user_id":{"type":"boolean"},"name":{"type":"boolean"},"workspace_id":{"type":"boolean"},"tags_contacts":{"type":"boolean"},"_count":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["contacts_count","id","user_id","name","workspace_id","tags_contacts","_count"]}},"in":"query","name":"select","required":false},{"schema":{"type":"object","properties":{"name":{"type":"string","enum":["asc","desc"]},"contacts_count":{"type":"string","enum":["asc","desc"]}},"additionalProperties":false},"in":"query","name":"orderBy","required":false},{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"take","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"query","name":"cursor","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"_count":{"type":"object","properties":{"tags_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["tags_contacts"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}},"nextCursor":{"nullable":true,"type":"string"}},"required":["items"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listTagsV1","summary":"List tags","description":"Retrieve all tags for the authenticated user. Tags are labels that can be attached to contacts for flexible categorization (e.g., \"VIP\", \"Investor\", \"Met at conference\").","x-mint":{"content":"## Use cases\n\n- Populate a tag picker or autocomplete dropdown\n- Sync tags to an external system\n- Display all available tags in a settings or management page"}},"post":{"tags":["tags"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"tag":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":99}},"required":["name"],"additionalProperties":false}},"required":["tag"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"object","properties":{"contacts_count":{"type":"boolean"}},"additionalProperties":false},"in":"query","name":"include","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"tag":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"_count":{"type":"object","properties":{"tags_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["tags_contacts"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}},"required":["tag"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createTagV1","summary":"Create a tag","description":"Create a new tag with a name and optional color. Tags can then be assigned to contacts for categorization.","x-mint":{"content":"## Use cases\n\n- Let users create custom tags from a tag management page\n- Programmatically create tags during a data import\n- Set up default tags for new users during onboarding"}}},"/v1/tags/count":{"get":{"tags":["tags"],"parameters":[{"schema":{"type":"object","properties":{"name":{"type":"string","enum":["asc","desc"]},"contacts_count":{"type":"string","enum":["asc","desc"]}},"additionalProperties":false},"in":"query","name":"orderBy","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["count"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"countTagsV1","summary":"Count tags","description":"Return the total number of tags for the authenticated user.","x-mint":{"content":"## Use cases\n\n- Display a tag count on a dashboard or settings page\n- Monitor tag usage for plan limit enforcement\n- Track categorization coverage over time"}}},"/v1/tags/{tagId}":{"get":{"tags":["tags"],"parameters":[{"schema":{"type":"object","properties":{"contacts_count":{"type":"boolean"}},"additionalProperties":false},"in":"query","name":"include","required":false},{"schema":{"type":"object","properties":{"contacts_count":{"type":"boolean"},"id":{"type":"boolean"},"user_id":{"type":"boolean"},"name":{"type":"boolean"},"workspace_id":{"type":"boolean"},"tags_contacts":{"type":"boolean"},"_count":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["contacts_count","id","user_id","name","workspace_id","tags_contacts","_count"]}},"in":"query","name":"select","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"tagId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"tag":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"_count":{"type":"object","properties":{"tags_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["tags_contacts"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}},"required":["tag"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getTagV1","summary":"Get a tag","description":"Retrieve a single tag by its unique ID, including its name and color.","x-mint":{"content":"## Use cases\n\n- Display tag details on a tag management page\n- Fetch tag metadata before editing it\n- Resolve a tag ID to its name for display purposes"}},"put":{"tags":["tags"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"tag":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":99}},"additionalProperties":false}},"required":["tag"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"tagId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"tag":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"_count":{"type":"object","properties":{"tags_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["tags_contacts"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}},"required":["tag"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"updateTagV1","summary":"Update a tag","description":"Update a tag's name or color by its ID. Only the fields included in the request body are modified.","x-mint":{"content":"## Use cases\n\n- Rename a tag to better reflect its purpose\n- Change a tag's color for visual organization\n- Correct a typo in a tag name"}},"delete":{"tags":["tags"],"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"tagId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"}},"required":["error"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteTagV1","summary":"Delete a tag","description":"Permanently delete a tag by its ID. The tag is removed from all contacts it was assigned to.","x-mint":{"content":"## Use cases\n\n- Remove a tag that is no longer relevant\n- Clean up unused or duplicate tags\n- Delete a tag as part of a tag taxonomy reorganization\n\n<Note>Deleting a tag automatically removes it from all contacts. The contacts themselves are not affected.</Note>"}}},"/v1/tags/contact-counts":{"get":{"tags":["tags"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"tagIds","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"counts":{"type":"object","additionalProperties":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}}},"required":["counts"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getTagContactCountsV1","summary":"Get contact counts per tag","description":"Retrieve the number of contacts associated with each tag. Returns a map of tag IDs to their respective contact counts.","x-mint":{"content":"## Use cases\n\n- Display contact counts next to tag names in a sidebar or list\n- Identify unused tags with zero contacts for cleanup\n- Build analytics on how contacts are categorized"}}},"/v1/tags/bulk-create":{"post":{"tags":["tags"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"minItems":1,"type":"array","items":{"type":"string","minLength":1,"maxLength":99}}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"_count":{"type":"object","properties":{"tags_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["tags_contacts"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}},"failed":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["name","error"],"additionalProperties":false}}},"required":["tags"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"bulkCreateTagsV1","summary":"Bulk create tags","description":"Create multiple tags in a single request. Useful for importing a set of tags or setting up tag structures programmatically.","x-mint":{"content":"## Use cases\n\n- Import tags from another CRM or system\n- Set up a predefined tag taxonomy for a new account\n- Create multiple tags at once during onboarding\n\n<Note>Tags with duplicate names will return an error. Ensure all tag names in the request are unique.</Note>"}}},"/v1/tags/batch-delete":{"post":{"tags":["tags"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"tagIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"deleteAll":{"type":"boolean"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"tag_ids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["count","tag_ids"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"batchDeleteTagsV1","summary":"Batch delete tags","description":"Delete multiple tags in a single request by providing an array of tag IDs.","x-mint":{"content":"## Use cases\n\n- Bulk clean up unused or duplicate tags\n- Remove a set of tags as part of a reorganization\n- Delete imported tags that are no longer needed\n\n<Warning>This permanently deletes the specified tags and removes them from all associated contacts.</Warning>"}}},"/v1/tags/contacts/add":{"post":{"tags":["tags"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contactIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"tagIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["contactIds","tagIds"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"message":{"type":"string"},"data":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"object","properties":{"user_id":{"type":"string"},"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"tag_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["user_id","contact_id","tag_id"],"additionalProperties":false}}},"required":["tags"],"additionalProperties":false}},"required":["error","message","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"addTagsToContactsV1","summary":"Add tags to contacts","description":"Assign one or more tags to one or more contacts. Accepts arrays of tag IDs and contact IDs to create the associations.","x-mint":{"content":"## Use cases\n\n- Tag contacts in bulk after filtering or searching\n- Apply a tag to multiple contacts selected in a list view\n- Automatically tag contacts during an import based on source data\n\n<Note>Existing tag-contact associations are silently skipped — no error is returned for duplicate assignments.</Note>"}}},"/v1/tags/contacts/remove":{"post":{"tags":["tags"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contactIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"tagIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["contactIds","tagIds"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"message":{"type":"string"},"data":{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["count"],"additionalProperties":false}},"required":["error","message","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"removeTagsFromContactsV1","summary":"Remove tags from contacts","description":"Remove one or more tag assignments from one or more contacts. The tags and contacts themselves are not deleted.","x-mint":{"content":"## Use cases\n\n- Remove a tag from multiple contacts after a reclassification\n- Clean up tag assignments in bulk\n- Untag contacts that no longer match a category\n\n<Note>This only removes the association between tags and contacts. Neither the tags nor the contacts are deleted.</Note>"}}},"/v1/tags/contacts/{contactId}/create-assign":{"post":{"tags":["tags"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"tagNames":{"type":"array","items":{"type":"string","minLength":1,"maxLength":99}}},"required":["tagNames"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"message":{"type":"string"},"data":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"_count":{"type":"object","properties":{"tags_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["tags_contacts"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}}},"required":["tags"],"additionalProperties":false}},"required":["error","message","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createAndAssignTagsV1","summary":"Create and assign tags to a contact","description":"Create new tags and immediately assign them to a specific contact in a single operation. Tags that already exist with the same name are reused.","x-mint":{"content":"## Use cases\n\n- Let users type new tags directly on a contact detail page\n- Quickly categorize a contact with new labels without a separate tag creation step\n- Import contacts with tags where the tags may not exist yet\n\n<Note>If a tag with the same name already exists, it will be reused rather than creating a duplicate.</Note>"}}},"/v1/timeline/":{"get":{"tags":["timeline"],"parameters":[{"schema":{},"in":"query","name":"orderBy","required":false},{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"take","required":false},{"schema":{"type":"object","properties":{"timeline_items_contacts":{"type":"boolean"},"attachments":{"type":"boolean"}},"additionalProperties":false},"in":"query","name":"include","required":false},{"schema":{"type":"object","properties":{"id":{"type":"boolean"},"user_id":{"type":"boolean"},"note":{"type":"boolean"},"meeting_type":{"type":"boolean"},"custom_emoji":{"type":"boolean"},"event_time":{"type":"boolean"},"created_at":{"type":"boolean"},"meeting_type_id":{"type":"boolean"},"google_calendar_event_id_v3":{"type":"boolean"},"oauth_credential_id":{"type":"boolean"},"calendar_account_email":{"type":"boolean"},"calendar_account_provider":{"type":"boolean"},"reminder_id":{"type":"boolean"},"channels":{"type":"boolean"},"workspace_id":{"type":"boolean"},"audience":{"type":"boolean"},"meeting_types":{"type":"boolean"},"timeline_items_contacts":{"type":"boolean"},"attachments":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["id","user_id","note","meeting_type","custom_emoji","event_time","created_at","meeting_type_id","google_calendar_event_id_v3","oauth_credential_id","calendar_account_email","calendar_account_provider","reminder_id","channels","workspace_id","audience","meeting_types","timeline_items_contacts","attachments"]}},"in":"query","name":"select","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"query","name":"cursor","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"query","name":"contactId","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"audience":{"type":"string","enum":["private","shared"]},"note":{"nullable":true,"type":"string"},"custom_emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"},"meeting_type_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"google_calendar_event_id_v3":{"nullable":true,"type":"string"},"oauth_credential_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"calendar_account_email":{"nullable":true,"type":"string"},"calendar_account_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"reminder_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"channels":{"type":"array","items":{"type":"string","enum":["whatsapp","imessage","linkedin","instagram"]}},"next_cursor":{"type":"string"},"meeting_types":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"attachments":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["id","channels","meeting_types"],"additionalProperties":false}},"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["items","count"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listNotesV1","summary":"List notes","description":"Retrieve notes for the authenticated user. Supports filtering by contact, note type, and date range, with cursor-based pagination.","x-mint":{"content":"## Use cases\n\n- Display a timeline of interactions for a specific contact\n- Show a global activity feed across all contacts\n- Export interaction history for reporting or backup\n\n<Note>Results are paginated. Use the `nextCursor` value from the response to fetch the next page.</Note>"}},"post":{"tags":["timeline"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"note":{"type":"object","properties":{"note":{"type":"string","maxLength":50000},"custom_emoji":{"type":"string"},"event_time":{},"meeting_type":{"anyOf":[{"type":"string","enum":["call","coffee","email","meal","meeting","networking","note","other","party","text"]},{"type":"null"}]},"meeting_type_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"attachments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"url":{"type":"string","format":"uri"},"file_name":{"type":"string"},"file_size":{"type":"number"}},"required":["url","file_name"],"additionalProperties":false}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"is_origin":{"description":"Marks the contact whose page the note was written on. Create only; at most one link may set it. Ignored on update.","type":"boolean"},"contacts":{}},"required":["contact_id"],"additionalProperties":false}},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"google_calendar_event_id_v3":{"type":"string"},"oauth_credential_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"reminder_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["event_time"],"additionalProperties":false}},"required":["note"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"note":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"audience":{"type":"string","enum":["private","shared"]},"note":{"nullable":true,"type":"string"},"custom_emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"},"meeting_type_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"google_calendar_event_id_v3":{"nullable":true,"type":"string"},"oauth_credential_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"calendar_account_email":{"nullable":true,"type":"string"},"calendar_account_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"reminder_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"channels":{"type":"array","items":{"type":"string","enum":["whatsapp","imessage","linkedin","instagram"]}},"next_cursor":{"type":"string"},"meeting_types":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"attachments":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["id","channels","meeting_types"],"additionalProperties":false}},"required":["note"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createNoteV1","summary":"Create a note","description":"Create a new note or timeline entry. A note can be associated with one or more contacts and includes a type (e.g., meeting, call, email) and rich text content.","x-mint":{"content":"## Use cases\n\n- Log a meeting note or call summary after an interaction\n- Record an email exchange or important conversation\n- Add a personal note or observation about a contact\n\n<Note>Notes support rich text content. Use the `note_type` field to categorize the interaction (e.g., \"meeting\", \"call\", \"email\").</Note>"}}},"/v1/timeline/count":{"get":{"tags":["timeline"],"parameters":[{"schema":{"type":"object","properties":{"has_contacts":{"anyOf":[{"type":"object","properties":{"not":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["not"],"additionalProperties":false},{"type":"boolean"},{"type":"string"},{"type":"array","items":{"type":"string"}}]},"created_at":{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"required":["gte","lte"],"additionalProperties":false},"has_calendar_event":{"anyOf":[{"type":"boolean"},{"type":"string"}]}},"additionalProperties":false},"in":"query","name":"where","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["count"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"countNotesV1","summary":"Count notes","description":"Return the total number of notes matching the given filters. Useful for displaying counts without fetching full note records.","x-mint":{"content":"## Use cases\n\n- Display a note count on a contact profile or dashboard\n- Show interaction frequency metrics\n- Monitor note-taking activity over time"}}},"/v1/timeline/{noteId}":{"get":{"tags":["timeline"],"parameters":[{"schema":{"type":"object","properties":{"timeline_items_contacts":{"type":"boolean"},"attachments":{"type":"boolean"}},"additionalProperties":false},"in":"query","name":"include","required":false},{"schema":{"type":"object","properties":{"id":{"type":"boolean"},"user_id":{"type":"boolean"},"note":{"type":"boolean"},"meeting_type":{"type":"boolean"},"custom_emoji":{"type":"boolean"},"event_time":{"type":"boolean"},"created_at":{"type":"boolean"},"meeting_type_id":{"type":"boolean"},"google_calendar_event_id_v3":{"type":"boolean"},"oauth_credential_id":{"type":"boolean"},"calendar_account_email":{"type":"boolean"},"calendar_account_provider":{"type":"boolean"},"reminder_id":{"type":"boolean"},"channels":{"type":"boolean"},"workspace_id":{"type":"boolean"},"audience":{"type":"boolean"},"meeting_types":{"type":"boolean"},"timeline_items_contacts":{"type":"boolean"},"attachments":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["id","user_id","note","meeting_type","custom_emoji","event_time","created_at","meeting_type_id","google_calendar_event_id_v3","oauth_credential_id","calendar_account_email","calendar_account_provider","reminder_id","channels","workspace_id","audience","meeting_types","timeline_items_contacts","attachments"]}},"in":"query","name":"select","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"noteId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"note":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"audience":{"type":"string","enum":["private","shared"]},"note":{"nullable":true,"type":"string"},"custom_emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"},"meeting_type_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"google_calendar_event_id_v3":{"nullable":true,"type":"string"},"oauth_credential_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"calendar_account_email":{"nullable":true,"type":"string"},"calendar_account_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"reminder_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"channels":{"type":"array","items":{"type":"string","enum":["whatsapp","imessage","linkedin","instagram"]}},"next_cursor":{"type":"string"},"meeting_types":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"attachments":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["id","channels","meeting_types"],"additionalProperties":false}},"required":["note"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getNoteV1","summary":"Get a note","description":"Retrieve a single note by its unique ID. Notes are timeline entries that record interactions, meeting notes, and other activities related to contacts.","x-mint":{"content":"## Use cases\n\n- Display a note detail or edit view\n- Fetch the latest note content before updating it\n- Retrieve a specific interaction record for display in your application"}},"put":{"tags":["timeline"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"note":{"type":"object","properties":{"note":{"type":"string","maxLength":50000},"custom_emoji":{"type":"string"},"event_time":{},"meeting_type":{"anyOf":[{"type":"string","enum":["call","coffee","email","meal","meeting","networking","note","other","party","text"]},{"type":"null"}]},"meeting_type_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"attachments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"url":{"type":"string","format":"uri"},"file_name":{"type":"string"},"file_size":{"type":"number"}},"required":["url","file_name"],"additionalProperties":false}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"is_origin":{"description":"Marks the contact whose page the note was written on. Create only; at most one link may set it. Ignored on update.","type":"boolean"},"contacts":{}},"required":["contact_id"],"additionalProperties":false}},"oauth_credential_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"reminder_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"additionalProperties":false}},"required":["note"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"noteId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"note":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"audience":{"type":"string","enum":["private","shared"]},"note":{"nullable":true,"type":"string"},"custom_emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"},"meeting_type_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"google_calendar_event_id_v3":{"nullable":true,"type":"string"},"oauth_credential_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"calendar_account_email":{"nullable":true,"type":"string"},"calendar_account_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"reminder_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"channels":{"type":"array","items":{"type":"string","enum":["whatsapp","imessage","linkedin","instagram"]}},"next_cursor":{"type":"string"},"meeting_types":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"attachments":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["id","channels","meeting_types"],"additionalProperties":false}},"required":["note"],"additionalProperties":false}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"updateNoteV1","summary":"Update a note","description":"Update a note by its ID. You can modify the content, associated contacts, note type, or date.","x-mint":{"content":"## Use cases\n\n- Edit a note to add details after an interaction\n- Change the associated contacts or note type\n- Fix a typo or update the date of a note"}},"delete":{"tags":["timeline"],"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"noteId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"message":{"type":"string"}},"required":["error","message"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteNoteV1","summary":"Delete a note","description":"Permanently delete a note by its ID. This removes the timeline entry from all associated contacts.","x-mint":{"content":"## Use cases\n\n- Remove a note that was created by mistake\n- Delete an outdated or irrelevant timeline entry\n- Clean up imported notes that are no longer needed\n\n<Warning>This action is permanent and cannot be undone.</Warning>"}}},"/v1/timeline/note-types":{"get":{"tags":["timeline"],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"nullable":true,"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"emoji":{"nullable":true,"type":"string"},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["id","name","created_at"],"additionalProperties":false}}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listNoteTypesV1","summary":"List note types","description":"Retrieve all available note types (e.g., meeting, call, email, note). Use these types when creating or filtering notes.","x-mint":{"content":"## Use cases\n\n- Populate a note type selector when creating a new note\n- Filter timeline entries by interaction type\n- Display note type labels in a timeline view"}}},"/v1/unified-timeline/":{"get":{"tags":["unified-timeline"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"sources","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"query","name":"contactId","required":false},{"schema":{"type":"integer","minimum":1,"maximum":500},"in":"query","name":"take","required":false},{"schema":{"type":"string","maxLength":4096},"in":"query","name":"cursor","required":false},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false},{"schema":{"type":"boolean"},"in":"query","name":"upcoming","required":false},{"schema":{"type":"string"},"in":"query","name":"searchQuery","required":false},{"schema":{"type":"boolean"},"in":"query","name":"includeContactDetails","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"items":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["NOTE"]},"date":{"type":"string"},"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"audience":{"type":"string","enum":["private","shared"]},"note":{"nullable":true,"type":"string"},"custom_emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"},"meeting_type_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"google_calendar_event_id_v3":{"nullable":true,"type":"string"},"oauth_credential_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"calendar_account_email":{"nullable":true,"type":"string"},"calendar_account_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"reminder_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"channels":{"type":"array","items":{"type":"string","enum":["whatsapp","imessage","linkedin","instagram"]}},"next_cursor":{"type":"string"},"meeting_types":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"attachments":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["id","channels","meeting_types"],"additionalProperties":false}},"required":["type","date","data"],"additionalProperties":{}},{"type":"object","properties":{"type":{"type":"string","enum":["REMINDER"]},"date":{"type":"string"},"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"assignee_id":{"nullable":true,"type":"string"},"text":{"nullable":true,"type":"string"},"due_at_date":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"due_at_time":{"nullable":true,"anyOf":[{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},{"type":"string"}]},"is_complete":{"type":"boolean"},"email_sent":{"type":"boolean"},"push_notification_sent":{"type":"boolean"},"recurrence":{"nullable":true,"type":"string"},"last_completed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_occurrence_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"is_overdue":{"type":"boolean"},"next_cursor":{"type":"string"},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_tags":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"users":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"required":["type","date","data"],"additionalProperties":{}},{"type":"object","properties":{"type":{"type":"string","enum":["EMAIL"]},"date":{"type":"string"},"data":{"type":"object","properties":{"providerId":{"type":"string"},"threadId":{"nullable":true,"type":"string"},"subjectOrTitle":{"type":"string"},"snippet":{"nullable":true,"type":"string"},"dateTime":{"type":"string"},"endDateTime":{"nullable":true,"type":"string"},"isAllDay":{"type":"boolean"},"participants":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string"},"name":{"nullable":true,"type":"string"},"role":{"type":"string","enum":["from","to","cc","bcc"]}},"required":["email"],"additionalProperties":false}},"providerLink":{"nullable":true,"type":"string"},"email":{"type":"string"},"iCalUID":{"nullable":true,"type":"string"},"isRecurring":{"type":"boolean"},"provider":{"type":"string"}},"additionalProperties":{}}},"required":["type","date","data"],"additionalProperties":{}},{"type":"object","properties":{"type":{"type":"string","enum":["CALENDAR"]},"date":{"type":"string"},"data":{"type":"object","properties":{"providerId":{"type":"string"},"threadId":{"nullable":true,"type":"string"},"subjectOrTitle":{"type":"string"},"snippet":{"nullable":true,"type":"string"},"dateTime":{"type":"string"},"endDateTime":{"nullable":true,"type":"string"},"isAllDay":{"type":"boolean"},"participants":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string"},"name":{"nullable":true,"type":"string"},"role":{"type":"string","enum":["from","to","cc","bcc"]}},"required":["email"],"additionalProperties":false}},"providerLink":{"nullable":true,"type":"string"},"email":{"type":"string"},"iCalUID":{"nullable":true,"type":"string"},"isRecurring":{"type":"boolean"},"provider":{"type":"string"}},"additionalProperties":{}}},"required":["type","date","data"],"additionalProperties":{}},{"type":"object","properties":{"type":{"type":"string","enum":["FEED"]},"date":{"type":"string"},"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"contact_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"feed_type":{"type":"string"},"body":{"type":"object","properties":{"name":{"type":"string"},"title_before":{"nullable":true,"type":"string"},"title_after":{"type":"string"},"linkedin_url":{"type":"string"}},"required":["name","title_before","title_after","linkedin_url"],"additionalProperties":{}},"created_at":{"type":"string"}},"required":["id","user_id","feed_type","body","created_at"],"additionalProperties":{}}},"required":["type","date","data"],"additionalProperties":{}}]}},"nextCursor":{"nullable":true,"type":"string"},"hasMore":{"type":"boolean"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"timedOutSources":{"type":"array","items":{"type":"string","enum":["notes","reminders","emails","calendar","feed"]}}},"required":["items","nextCursor","hasMore","count","timedOutSources"],"additionalProperties":{}}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listTimelineItemsV1","summary":"Get unified timeline","description":"Retrieve a unified, paginated timeline combining notes, reminders, emails, and calendar events. Supports filtering by source type, contact, date range, and text search.","x-mint":{"content":"## Use cases\n\n- Display a unified activity feed on the timeline page\n- Show all interactions with a specific contact in one timeline\n- Search across notes and reminders with a single API call\n- Filter timeline to specific source types (e.g., only emails and calendar events)"}}},"/v1/users/me":{"get":{"tags":["users"],"parameters":[{"schema":{"type":"array","items":{"type":"string"}},"in":"query","name":"include","required":false,"description":"Related records to include (e.g. mobile_settings, workflow_settings)"},{"schema":{"type":"boolean"},"in":"query","name":"fresh","required":false,"description":"Skip the cache and fetch the latest data from the database"}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"boolean"},"data":{"type":"object","properties":{"id":{"type":"string","description":"Unique user identifier (Firebase UID)"},"first_name":{"nullable":true,"description":"User's first name","type":"string"},"last_name":{"nullable":true,"description":"User's last name","type":"string"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"User's email address"},"image_url":{"nullable":true,"description":"Profile image URL","type":"string"},"time_zone":{"type":"string","description":"User's time zone (IANA format)"},"pricing_plan":{"type":"string","description":"Current subscription plan"},"onboarded_web":{"type":"boolean","description":"Whether the user has completed web onboarding"},"onboarded_mobile":{"type":"boolean","description":"Whether the user has completed mobile onboarding"},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}],"description":"Account creation timestamp"},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}],"description":"Last profile update timestamp"},"linkedin_server_syncable":{"description":"Whether the server holds LinkedIn credentials it can sync with. Internal; may change without notice.","type":"boolean"},"sync_schedule":{"description":"Advisory client scheduling hint (seconds until the next background sync check). Internal; may change without notice.","type":"object","properties":{"imessage":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":9007199254740991},"phone_calls":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":9007199254740991},"linkedin_connections":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":9007199254740991},"linkedin_messages":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":9007199254740991}},"required":["imessage","phone_calls","linkedin_connections","linkedin_messages"],"additionalProperties":false}},"additionalProperties":{}}},"required":["error","data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getCurrentUserV1","summary":"Get current user","description":"Retrieve the profile of the currently authenticated user. Returns account details including name, email, time zone, subscription plan, and onboarding status.","x-mint":{"content":"## Use cases\n\n- Display the current user's profile in your application\n- Check the user's subscription plan before accessing plan-gated features\n- Verify the authenticated user's identity and account status\n\n<Note>This endpoint returns the user associated with the API key or access token used in the request. No user ID parameter is needed.</Note>"}}},"/v2":{"get":{"responses":{"200":{"description":"The API is reachable. Returns a plain-text greeting; use it as an unauthenticated liveness probe for the v2 surface.","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"text/plain":{"schema":{"type":"string","example":"Welcome to Dex Lightning API!"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getApiRootV2","summary":"API root (v2)","description":"Unauthenticated liveness check for the v2 surface. Takes no parameters and returns a plain-text greeting with a 200 status. Use it to confirm connectivity and DNS before authenticating; it does not validate your API key.","security":[]}},"/v2/reminders/{reminderId}":{"get":{"tags":["reminders"],"parameters":[{"schema":{"type":"object","properties":{"recurrence":{"type":"boolean"},"contacts":{"type":"boolean"},"tags":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"reminders_tags":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["recurrence","contacts","tags","reminders_contacts","reminders_tags"]}},"in":"query","name":"include","required":false},{"schema":{"type":"object","properties":{"recurrence":{"type":"boolean"},"contacts":{"type":"boolean"},"tags":{"type":"boolean"},"id":{"type":"boolean"},"user_id":{"type":"boolean"},"text":{"type":"boolean"},"due_at_date":{"type":"boolean"},"due_at_time":{"type":"boolean"},"is_complete":{"type":"boolean"},"email_sent":{"type":"boolean"},"push_notification_sent":{"type":"boolean"},"created_at":{"type":"boolean"},"last_completed_at":{"type":"boolean"},"next_occurrence_at":{"type":"boolean"},"workspace_id":{"type":"boolean"},"assignee_id":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"reminders_tags":{"type":"boolean"},"is_overdue":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["recurrence","contacts","tags","id","user_id","text","due_at_date","due_at_time","is_complete","email_sent","push_notification_sent","created_at","last_completed_at","next_occurrence_at","workspace_id","assignee_id","reminders_contacts","reminders_tags","is_overdue"]}},"in":"query","name":"select","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"reminderId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"reminder":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"assignee_id":{"nullable":true,"type":"string"},"text":{"nullable":true,"type":"string"},"due_at_date":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"due_at_time":{"nullable":true,"anyOf":[{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},{"type":"string"}]},"is_complete":{"type":"boolean"},"email_sent":{"type":"boolean"},"push_notification_sent":{"type":"boolean"},"recurrence":{"nullable":true,"type":"string"},"last_completed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_occurrence_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"is_overdue":{"type":"boolean"},"next_cursor":{"type":"string"},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_tags":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"users":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"required":["reminder"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getReminderV2","summary":"Get a reminder (v2)","description":"Retrieve a single reminder by its unique ID. Returns the canonical /v2 envelope `{ data: { reminder } }` — see Migration notes below. With `X-Dex-Workspace`, `include[tags]` or `include[reminders_tags]` (or the same keys in `select`) adds `reminders_tags`: the reminder's workspace tags as `{ tag_id, tags: { id, name } }`, by name. Reminder tags are workspace-only: a Personal request asking for them gets `reminders_tags: []`.","x-mint":{"content":"## Use cases\n\n- Display reminder details on a detail or edit page\n- Fetch the latest reminder state before updating it\n\n## Migration from /v1\n\nThe /v1 endpoint returns `{ error: false, data: { ...reminder } }` (reminder spread directly into `data`). The /v2 endpoint returns `{ data: { reminder: {...} } }` — namespaced under `data.reminder`, and no `error` field on success (HTTP status is the source of truth)."}},"patch":{"tags":["reminders"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reminder":{"type":"object","properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}]},"due_at_date":{},"due_at_time":{"anyOf":[{},{"type":"null"}]},"is_complete":{"type":"boolean"},"recurrence":{"anyOf":[{"type":"string","enum":["7 days","14 days","1 mon","3 mons","6 mons","1 year"]},{"type":"null"}]},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contacts":{}},"required":["contact_id"],"additionalProperties":false}},"assignee_id":{"anyOf":[{"enum":[null]},{"type":"string","maxLength":128}]},"tag_ids":{"maxItems":100,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"last_completed_at":{"anyOf":[{"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))$"},{"type":"null"}]},"next_occurrence_at":{"anyOf":[{"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))$"},{"type":"null"}]},"email_sent":{"type":"boolean"},"push_notification_sent":{"type":"boolean"}},"additionalProperties":false}},"required":["reminder"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"reminderId","required":true},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"reminder":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"assignee_id":{"nullable":true,"type":"string"},"text":{"nullable":true,"type":"string"},"due_at_date":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"due_at_time":{"nullable":true,"anyOf":[{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},{"type":"string"}]},"is_complete":{"type":"boolean"},"email_sent":{"type":"boolean"},"push_notification_sent":{"type":"boolean"},"recurrence":{"nullable":true,"type":"string"},"last_completed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_occurrence_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"is_overdue":{"type":"boolean"},"next_cursor":{"type":"string"},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_tags":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"users":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"required":["reminder"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"updateReminderV2","summary":"Update a reminder (v2)","description":"Partially update a reminder by its ID. With `X-Dex-Workspace`, `tag_ids` replaces the reminder's tags (`[]` clears them, omitted leaves them), under the same rule as every workspace edit: only the creator or the current assignee. A tag outside the workspace is 400 `invalid_reference` and changes nothing. Reminder tags are workspace-only: a Personal request with `tag_ids` is 400 `workspace_context_required`. **Requires an `Idempotency-Key` header**. Returns `{ data: { reminder: {...} } }` with the post-update row.","x-mint":{"content":"## Use cases\n\n- Reschedule a reminder to a different date\n- Mark a reminder as completed\n- Reassign a reminder to a different contact\n\n## Migration from /v1\n\n/v1 used `PUT /v1/reminders/:id`. /v2 uses `PATCH` because the body is a partial update (PUT semantically means \"replace the resource entirely\").\n\n## Idempotency\n\nSee the create endpoint for the full idempotency contract."}},"delete":{"tags":["reminders"],"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"reminderId","required":true},{"in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Optional. Accepted to dedupe retries on this endpoint. See `apps/rest-api/src/shared/idempotency.ts`."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteReminderV2","summary":"Delete a reminder (v2)","description":"Permanently delete a reminder by its ID. `Idempotency-Key` is optional on DELETE (the operation is HTTP-idempotent by semantics). Returns `{ data: { affected: 1, ids: [reminderId] } }`.","x-mint":{"content":"## Use cases\n\n- Remove a reminder that is no longer relevant\n- Cancel a recurring keep-in-touch cadence\n\n<Note>Deleting a recurring reminder cancels all future occurrences. This action cannot be undone.</Note>"}}},"/v2/reminders/":{"get":{"tags":["reminders"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"take","required":false},{"schema":{"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"skip","required":false},{"schema":{"type":"string","minLength":1,"maxLength":16384},"in":"query","name":"cursor","required":false},{"schema":{"type":"object","properties":{"in":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"not_in":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"is_complete":{"type":"boolean"},"text":{"type":"string","minLength":1,"maxLength":500},"is_overdue":{"type":"boolean"},"assignee_id":{"anyOf":[{"type":"string","enum":["me"]},{"type":"string","enum":["none"]},{"type":"string","minLength":1,"maxLength":128}]},"has_contacts":{"anyOf":[{"type":"object","properties":{"not":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}]}},"required":["not"],"additionalProperties":false},{"type":"boolean"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}]},"has_tag":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Match reminders carrying this single tag id."},"has_due_at_date":{"type":"object","properties":{"gte":{"type":"string","format":"date","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])))$"},"lte":{"type":"string","format":"date","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])))$"}},"additionalProperties":false},"has_created_at":{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}},"additionalProperties":false},"in":"query","name":"where","required":false},{"schema":{},"in":"query","name":"orderBy","required":false},{"schema":{"type":"object","properties":{"recurrence":{"type":"boolean"},"contacts":{"type":"boolean"},"tags":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"reminders_tags":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["recurrence","contacts","tags","reminders_contacts","reminders_tags"]}},"in":"query","name":"include","required":false},{"schema":{"type":"object","properties":{"recurrence":{"type":"boolean"},"contacts":{"type":"boolean"},"tags":{"type":"boolean"},"id":{"type":"boolean"},"user_id":{"type":"boolean"},"text":{"type":"boolean"},"due_at_date":{"type":"boolean"},"due_at_time":{"type":"boolean"},"is_complete":{"type":"boolean"},"email_sent":{"type":"boolean"},"push_notification_sent":{"type":"boolean"},"created_at":{"type":"boolean"},"last_completed_at":{"type":"boolean"},"next_occurrence_at":{"type":"boolean"},"workspace_id":{"type":"boolean"},"assignee_id":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"reminders_tags":{"type":"boolean"},"is_overdue":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["recurrence","contacts","tags","id","user_id","text","due_at_date","due_at_time","is_complete","email_sent","push_notification_sent","created_at","last_completed_at","next_occurrence_at","workspace_id","assignee_id","reminders_contacts","reminders_tags","is_overdue"]}},"in":"query","name":"select","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"reminders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"assignee_id":{"nullable":true,"type":"string"},"text":{"nullable":true,"type":"string"},"due_at_date":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"due_at_time":{"nullable":true,"anyOf":[{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},{"type":"string"}]},"is_complete":{"type":"boolean"},"email_sent":{"type":"boolean"},"push_notification_sent":{"type":"boolean"},"recurrence":{"nullable":true,"type":"string"},"last_completed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_occurrence_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"is_overdue":{"type":"boolean"},"next_cursor":{"type":"string"},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_tags":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"users":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["reminders"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listRemindersV2","summary":"List reminders (v2)","description":"Retrieve all reminders for the authenticated user. Supports filtering, sorting, and cursor pagination. With `X-Dex-Workspace`, `where[has_tag]` keeps the reminders carrying that workspace tag (another scope's tag matches nothing), and `include[tags]` or `include[reminders_tags]` (or the same keys in `select`) adds each reminder's `reminders_tags` as `{ tag_id, tags: { id, name } }`, by name. Reminder tags are workspace-only: a Personal request with `where[has_tag]` is 400 `workspace_context_required`, and a Personal tag projection gets `reminders_tags: []`. Returns `{ data: { reminders: [...], pagination?: { nextCursor, count } } }`.","x-mint":{"content":"## Use cases\n\n- Display an upcoming-reminders dashboard with infinite scroll\n- Show all reminders associated with a specific contact\n- Sync reminders to an external calendar\n\n## Migration from /v1\n\nThe /v1 list returns `{ data: { items: [...], nextCursor } }`. The /v2 list returns `{ data: { reminders: [...], pagination: { nextCursor } } }` — entity plural at the top level, pagination namespaced."}},"post":{"tags":["reminders"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reminder":{"type":"object","properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}]},"due_at_date":{},"due_at_time":{"anyOf":[{},{"type":"null"}]},"is_complete":{"type":"boolean"},"recurrence":{"anyOf":[{"type":"string","enum":["7 days","14 days","1 mon","3 mons","6 mons","1 year"]},{"type":"null"}]},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contacts":{}},"required":["contact_id"],"additionalProperties":false}},"assignee_id":{"anyOf":[{"enum":[null]},{"type":"string","maxLength":128}]},"tag_ids":{"maxItems":100,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["due_at_date"],"additionalProperties":false}},"required":["reminder"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"reminder":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"assignee_id":{"nullable":true,"type":"string"},"text":{"nullable":true,"type":"string"},"due_at_date":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"due_at_time":{"nullable":true,"anyOf":[{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},{"type":"string"}]},"is_complete":{"type":"boolean"},"email_sent":{"type":"boolean"},"push_notification_sent":{"type":"boolean"},"recurrence":{"nullable":true,"type":"string"},"last_completed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_occurrence_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"is_overdue":{"type":"boolean"},"next_cursor":{"type":"string"},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_tags":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"users":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"required":["reminder"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createReminderV2","summary":"Create a reminder (v2)","description":"Create a new reminder for the authenticated user. With `X-Dex-Workspace`, `tag_ids` (up to 100 workspace tag ids; duplicates are dropped) tags the reminder; a tag outside the workspace is 400 `invalid_reference` and creates nothing. Reminder tags are workspace-only: a Personal request with `tag_ids` is 400 `workspace_context_required`. **Requires an `Idempotency-Key` header** — see Idempotency below. Returns `{ data: { reminder: {...} } }` with status 201.","x-mint":{"content":"## Use cases\n\n- Set a follow-up reminder after a meeting or call\n- Create a keep-in-touch cadence for an important contact\n\n## Idempotency\n\nEvery write on /v2 requires an `Idempotency-Key` header containing a UUID. Generate it client-side per LOGICAL operation and reuse the same key on every retry — that lets the server replay the original response instead of executing the write twice. TanStack DB collections pass `mutationId` directly; ad-hoc callers use `crypto.randomUUID()`.\n\n<Note>The SDK throws if you call `sdk.v2.reminders.create()` without an `idempotencyKey` option.</Note>"},"parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}]}},"/v2/reminders/recurring":{"get":{"tags":["reminders"],"parameters":[{"schema":{"type":"object","properties":{"recurrence":{"type":"boolean"},"contacts":{"type":"boolean"},"tags":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"reminders_tags":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["recurrence","contacts","tags","reminders_contacts","reminders_tags"]}},"in":"query","name":"include","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"reminders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"assignee_id":{"nullable":true,"type":"string"},"text":{"nullable":true,"type":"string"},"due_at_date":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"due_at_time":{"nullable":true,"anyOf":[{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},{"type":"string"}]},"is_complete":{"type":"boolean"},"email_sent":{"type":"boolean"},"push_notification_sent":{"type":"boolean"},"recurrence":{"nullable":true,"type":"string"},"last_completed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_occurrence_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"is_overdue":{"type":"boolean"},"next_cursor":{"type":"string"},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_tags":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"users":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["reminders"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listRecurringRemindersV2","summary":"List recurring reminders (v2)","description":"Retrieve all recurring (keep-in-touch) reminders for the authenticated user. Non-paginated — returns `{ data: { reminders: [...] } }` without a pagination object. Personal only, so `include[tags]` or `include[reminders_tags]` gets `reminders_tags: []` on every reminder.","x-mint":{"content":"## Use cases\n\n- Display a keep-in-touch dashboard showing recurring outreach commitments\n- Review and manage all recurring reminder schedules"}}},"/v2/reminders/batch-create":{"post":{"tags":["reminders"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reminder":{"type":"object","properties":{"text":{"anyOf":[{"type":"string"},{"type":"null"}]},"due_at_date":{},"due_at_time":{"anyOf":[{},{"type":"null"}]},"assignee_id":{"anyOf":[{"enum":[null]},{"type":"string","maxLength":128}]}},"required":["due_at_date"],"additionalProperties":false},"contact_ids":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["reminder","contact_ids"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"reminders":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"assignee_id":{"nullable":true,"type":"string"},"text":{"nullable":true,"type":"string"},"due_at_date":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"due_at_time":{"nullable":true,"anyOf":[{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},{"type":"string"}]},"is_complete":{"type":"boolean"},"email_sent":{"type":"boolean"},"push_notification_sent":{"type":"boolean"},"recurrence":{"nullable":true,"type":"string"},"last_completed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_occurrence_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"is_overdue":{"type":"boolean"},"next_cursor":{"type":"string"},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_tags":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"users":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}}},"required":["reminders"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"batchCreateRemindersV2","summary":"Add a reminder to many contacts (v2)","description":"Create one reminder per contact for up to 500 contacts (`contact_ids`; duplicates are dropped), each linked to its one contact and sharing `reminder`'s `text`, `due_at_date`, `due_at_time` and `assignee_id` (omitted = the caller, `null` = unassigned, otherwise an active workspace member), so completing one leaves the others open. All or nothing: a contact outside the workspace or an invalid assignee is a 400 `invalid_reference` and creates no reminder. The assignee is notified once for the whole batch. Viewers are refused. Workspace-only: send the `X-Dex-Workspace` header (400 `workspace_context_required` without it). **Requires an `Idempotency-Key` header**. Returns `{ data: { reminders: [...] } }` in `contact_ids` order with status 201."}},"/v2/agenda/calendar/events":{"get":{"tags":["agenda"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"limit","required":false},{"schema":{"type":"string","minLength":1,"maxLength":500},"in":"query","name":"searchQuery","required":false},{"schema":{"type":"object","properties":{"start":{"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))$"},"end":{"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))$"}},"additionalProperties":false},"in":"query","name":"dateRange","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"calendar_events":{"type":"array","items":{"type":"object","properties":{"providerId":{"type":"string"},"type":{"type":"string","enum":["EMAIL","CALENDAR"]},"subjectOrTitle":{"type":"string"},"dateTime":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"endDateTime":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"isAllDay":{"nullable":true,"type":"boolean"},"participants":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string"},"name":{"nullable":true,"type":"string"}},"required":["email"],"additionalProperties":false}},"providerLink":{"nullable":true,"type":"string"},"email":{"type":"string"},"iCalUID":{"nullable":true,"type":"string"},"summaryOfEvent":{"nullable":true,"type":"string"},"descriptionOfEvent":{"nullable":true,"type":"string"},"conferenceData":{"nullable":true,"type":"object","properties":{"conferenceId":{"nullable":true,"type":"string"},"entryPoints":{"nullable":true,"type":"array","items":{"type":"object","properties":{"uri":{"nullable":true,"type":"string"},"label":{"nullable":true,"type":"string"},"accessCode":{"nullable":true,"type":"string"}},"additionalProperties":false}}},"additionalProperties":false},"isRecurring":{"nullable":true,"type":"boolean"},"provider":{"nullable":true,"type":"string"}},"required":["providerId","type","subjectOrTitle","dateTime","participants","email"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false},"warnings":{"description":"Incomplete results: some connected calendars could not be read.","type":"array","items":{"type":"string"}}},"required":["calendar_events"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listCalendarEventsV2","summary":"List calendar events (v2)","description":"External calendar events fetched live from the authenticated user's connected Google / Office365 credentials via the sync-engine — there's no DB table. Optional `limit` and `dateRange.{start,end}` (ISO datetimes) scope the window; optional `searchQuery` free-text-filters by title, description, location, and attendees. Returns `{ data: { calendar_events, pagination } }`; an empty list when no calendar is connected."},"post":{"tags":["agenda"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"summary":{"type":"string","minLength":1},"description":{"type":"string"},"location":{"type":"string"},"attendees":{"maxItems":100,"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"display_name":{"type":"string"}},"required":["email"],"additionalProperties":false}},"account_email":{"type":"string"},"account_provider":{"type":"string","enum":["GOOGLE","OFFICE365"]},"start_datetime":{"description":"Event start, ISO 8601 with offset (timed events)","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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"end_datetime":{"description":"Event end, ISO 8601 with offset (timed events)","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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"timezone":{"description":"IANA timezone for the event (e.g. \"America/New_York\")","type":"string","minLength":1},"start_date":{"description":"Event start date, YYYY-MM-DD (all-day events)","type":"string","format":"date","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])))$"},"end_date":{"description":"Event end date, YYYY-MM-DD, EXCLUSIVE (all-day events; a one-day event on the 10th ends on the 11th)","type":"string","format":"date","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])))$"}},"required":["summary"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"calendar_event":{"type":"object","properties":{"providerId":{"type":"string"},"type":{"type":"string","enum":["EMAIL","CALENDAR"]},"subjectOrTitle":{"type":"string"},"dateTime":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"endDateTime":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"isAllDay":{"nullable":true,"type":"boolean"},"participants":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string"},"name":{"nullable":true,"type":"string"}},"required":["email"],"additionalProperties":false}},"providerLink":{"nullable":true,"type":"string"},"email":{"type":"string"},"iCalUID":{"nullable":true,"type":"string"},"summaryOfEvent":{"nullable":true,"type":"string"},"descriptionOfEvent":{"nullable":true,"type":"string"},"conferenceData":{"nullable":true,"type":"object","properties":{"conferenceId":{"nullable":true,"type":"string"},"entryPoints":{"nullable":true,"type":"array","items":{"type":"object","properties":{"uri":{"nullable":true,"type":"string"},"label":{"nullable":true,"type":"string"},"accessCode":{"nullable":true,"type":"string"}},"additionalProperties":false}}},"additionalProperties":false},"isRecurring":{"nullable":true,"type":"boolean"},"provider":{"nullable":true,"type":"string"}},"required":["providerId","type","subjectOrTitle","dateTime","participants","email"],"additionalProperties":false}},"required":["calendar_event"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createCalendarEventV2","summary":"Create a calendar event (v2)","description":"Create an event on the connected calendar (primary account by default). Set start_datetime/end_datetime for a timed event, or start_date/end_date for an all-day event (end date exclusive). **Requires an `Idempotency-Key` header.** Returns `{ data: { calendar_event } }`.","x-mint":{"content":"## Use cases\n\n- Schedule a meeting with contacts as attendees\n- Block out an all-day engagement\n\n## Idempotency\n\nEvery write on /v2 requires an `Idempotency-Key` header (a UUID generated per logical operation, reused on retry).\n\n## Account selection\n\nOmit `account_email` and the write targets the primary connected calendar, falling back to the oldest — in both cases preferring an account that actually holds the write scope. Name `account_email` to target a specific calendar; a named account is never silently retargeted.\n\n<Warning>Requires the connected account to have calendar write permission. An account connected before Dex began requesting write scopes holds read-only access and must re-grant it (Settings → Sync & Integrations → Grant calendar access) before writes succeed.</Warning>"}}},"/v2/agenda/email/messages":{"get":{"tags":["agenda"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"limit","required":false},{"schema":{"type":"string","minLength":1,"maxLength":500},"in":"query","name":"searchQuery","required":false},{"schema":{"type":"string","enum":["inbox","all"]},"in":"query","name":"folder","required":false},{"schema":{"type":"string","minLength":1},"in":"query","name":"cursor","required":false},{"schema":{"type":"object","properties":{"start":{"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))$"},"end":{"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))$"}},"additionalProperties":false},"in":"query","name":"dateRange","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"email_messages":{"type":"array","items":{"type":"object","properties":{"providerId":{"type":"string"},"threadId":{"nullable":true,"type":"string"},"type":{"type":"string","enum":["EMAIL","CALENDAR"]},"subjectOrTitle":{"type":"string"},"snippet":{"nullable":true,"type":"string"},"dateTime":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"from":{"nullable":true,"type":"object","properties":{"email":{"type":"string"},"name":{"nullable":true,"type":"string"}},"required":["email"],"additionalProperties":false},"participants":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string"},"name":{"nullable":true,"type":"string"}},"required":["email"],"additionalProperties":false}},"providerLink":{"nullable":true,"type":"string"},"email":{"type":"string"},"provider":{"nullable":true,"type":"string"}},"required":["providerId","type","subjectOrTitle","dateTime","participants","email"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["email_messages"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listEmailMessagesV2","summary":"Search or list emails (v2)","description":"Email search and listing across ALL of the authenticated user's connected mail accounts, fetched live from the providers (Google / Microsoft) — Dex stores no message content. Omit `searchQuery` to list newest-first; pass it to match subject, body, and participants as plain text (provider search operators are neutralized). `folder=inbox` restricts to received mail (the default spans the whole mailbox, including sent). Optional `limit` (default 25) and `dateRange.{start,end}` scope the window, defaulting to roughly the last 6 months; `cursor` (the previous response's `pagination.nextCursor`) continues a listing. Returns `{ data: { email_messages, pagination } }` with sender, participants, subject, snippet, and a provider deep link per message.","x-mint":{"content":"## Use cases\n\n- List the most recent inbox emails across every connected account (`folder=inbox`, no `searchQuery`)\n- Find correspondence with a person, company, or email domain (e.g. everyone you have emailed at an organization)\n- Locate a specific email by topic before logging a note or creating a contact\n\n## Pagination & date ranges\n\nWhen listing, follow `pagination.nextCursor` (as `cursor`) to page backward through the mailbox rather than widening `dateRange`. Only listings paginate: search results are a single relevance-ranked page (`cursor` with `searchQuery` returns a 400) — narrow a search with `dateRange` or better keywords instead.\n\n<Note>Requires a connected Google or Microsoft account with mail access — returns a 400 with an actionable message when none is connected. Results are message metadata (subject, snippet, participants), not full bodies; use the `providerLink` to open the message in the provider UI.</Note>"}}},"/v2/agenda/calendar/events/{eventId}":{"get":{"tags":["agenda"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"account_email","required":false},{"schema":{"type":"string","enum":["GOOGLE","OFFICE365"]},"in":"query","name":"account_provider","required":false},{"schema":{"type":"boolean"},"in":"query","name":"refresh_links","required":false},{"schema":{"type":"string","minLength":1},"in":"path","name":"eventId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"calendar_event":{"type":"object","properties":{"providerId":{"type":"string"},"type":{"type":"string","enum":["EMAIL","CALENDAR"]},"subjectOrTitle":{"type":"string"},"dateTime":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"endDateTime":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"isAllDay":{"nullable":true,"type":"boolean"},"participants":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string"},"name":{"nullable":true,"type":"string"}},"required":["email"],"additionalProperties":false}},"providerLink":{"nullable":true,"type":"string"},"email":{"type":"string"},"iCalUID":{"nullable":true,"type":"string"},"summaryOfEvent":{"nullable":true,"type":"string"},"descriptionOfEvent":{"nullable":true,"type":"string"},"conferenceData":{"nullable":true,"type":"object","properties":{"conferenceId":{"nullable":true,"type":"string"},"entryPoints":{"nullable":true,"type":"array","items":{"type":"object","properties":{"uri":{"nullable":true,"type":"string"},"label":{"nullable":true,"type":"string"},"accessCode":{"nullable":true,"type":"string"}},"additionalProperties":false}}},"additionalProperties":false},"isRecurring":{"nullable":true,"type":"boolean"},"provider":{"nullable":true,"type":"string"}},"required":["providerId","type","subjectOrTitle","dateTime","participants","email"],"additionalProperties":false}},"required":["calendar_event"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getCalendarEventV2","summary":"Get a calendar event (v2)","description":"Retrieve a single calendar event by its provider event ID, including attendees, conferencing links, and recurrence flags. Reads from the primary connected calendar unless `account_email` selects another connected account; when no `account_email` is given and the primary account does not have the event, every connected calendar account is searched for it. Returns `{ data: { calendar_event } }`.","x-mint":{"content":"## Use cases\n\n- Inspect attendees and conferencing details for a meeting\n- Fetch the latest event state before updating it\n\n<Note>Events are fetched live from the provider (Google / Microsoft) — nothing is stored in Dex. The `email` field on a listed event tells you which connected account to pass as `account_email`.</Note>"}},"patch":{"tags":["agenda"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"summary":{"type":"string","minLength":1},"description":{"type":"string"},"location":{"type":"string"},"attendees":{"maxItems":100,"type":"array","items":{"type":"object","properties":{"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"display_name":{"type":"string"}},"required":["email"],"additionalProperties":false}},"account_email":{"type":"string"},"account_provider":{"type":"string","enum":["GOOGLE","OFFICE365"]},"start_datetime":{"description":"Event start, ISO 8601 with offset (timed events)","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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"end_datetime":{"description":"Event end, ISO 8601 with offset (timed events)","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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"timezone":{"description":"IANA timezone for the event (e.g. \"America/New_York\")","type":"string","minLength":1},"start_date":{"description":"Event start date, YYYY-MM-DD (all-day events)","type":"string","format":"date","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])))$"},"end_date":{"description":"Event end date, YYYY-MM-DD, EXCLUSIVE (all-day events; a one-day event on the 10th ends on the 11th)","type":"string","format":"date","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])))$"}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"eventId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"calendar_event":{"type":"object","properties":{"providerId":{"type":"string"},"type":{"type":"string","enum":["EMAIL","CALENDAR"]},"subjectOrTitle":{"type":"string"},"dateTime":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"endDateTime":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"isAllDay":{"nullable":true,"type":"boolean"},"participants":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string"},"name":{"nullable":true,"type":"string"}},"required":["email"],"additionalProperties":false}},"providerLink":{"nullable":true,"type":"string"},"email":{"type":"string"},"iCalUID":{"nullable":true,"type":"string"},"summaryOfEvent":{"nullable":true,"type":"string"},"descriptionOfEvent":{"nullable":true,"type":"string"},"conferenceData":{"nullable":true,"type":"object","properties":{"conferenceId":{"nullable":true,"type":"string"},"entryPoints":{"nullable":true,"type":"array","items":{"type":"object","properties":{"uri":{"nullable":true,"type":"string"},"label":{"nullable":true,"type":"string"},"accessCode":{"nullable":true,"type":"string"}},"additionalProperties":false}}},"additionalProperties":false},"isRecurring":{"nullable":true,"type":"boolean"},"provider":{"nullable":true,"type":"string"}},"required":["providerId","type","subjectOrTitle","dateTime","participants","email"],"additionalProperties":false}},"required":["calendar_event"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"updateCalendarEventV2","summary":"Update a calendar event (v2)","description":"Partially update an event by its provider event ID. Only provided fields change; sending new times can switch an event between timed and all-day. **Requires an `Idempotency-Key` header.** Returns `{ data: { calendar_event } }`.","x-mint":{"content":"## Use cases\n\n- Reschedule a meeting\n- Rename an event or update its description, location, or attendee list\n\n## Migration from /v1\n\nThere was no /v1 calendar update endpoint — this is a new /v2 surface. It uses `PATCH` (partial update) and requires an `Idempotency-Key` header."}},"delete":{"tags":["agenda"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"account_email","required":false},{"schema":{"type":"string","enum":["GOOGLE","OFFICE365"]},"in":"query","name":"account_provider","required":false},{"schema":{"type":"string","minLength":1},"in":"path","name":"eventId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteCalendarEventV2","summary":"Delete a calendar event (v2)","description":"Delete an event from the connected calendar by its provider event ID. Deleting an event you organize cancels it for all attendees. Returns `{ data: { affected, ids } }`. `Idempotency-Key` is optional.","x-mint":{"content":"## Use cases\n\n- Cancel a meeting\n- Remove an obsolete event\n\n<Warning>This is irreversible and, for events with attendees, cancels the meeting for everyone.</Warning>"}}},"/v2/contacts/{contactId}":{"get":{"tags":["contacts"],"parameters":[{"schema":{"type":"object","properties":{"linkedin_data":{"type":"boolean"},"web_search_summary":{"type":"boolean"},"groups_count":{"type":"boolean"},"coordinates":{"type":"boolean"},"last_note":{"type":"boolean"},"contact_emails":{"type":"boolean"},"contact_phone_numbers":{"type":"boolean"},"contact_birthdays":{"type":"boolean"},"contact_locations":{"type":"boolean"},"contacts_custom_fields":{"type":"boolean"},"legacy_contact_addresses":{"type":"boolean"},"groups_contacts":{"type":"boolean"},"tags_contacts":{"type":"boolean"},"timeline_items_contacts":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"feed_items":{"type":"boolean"},"keep_in_touch_reminders":{"type":"boolean"},"contact_relations_contact_relations_sourceTocontacts":{"type":"boolean"},"contact_relations_contact_relations_destinationTocontacts":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["linkedin_data","web_search_summary","groups_count","coordinates","last_note","contact_emails","contact_phone_numbers","contact_birthdays","contact_locations","contacts_custom_fields","legacy_contact_addresses","groups_contacts","tags_contacts","timeline_items_contacts","reminders_contacts","feed_items","keep_in_touch_reminders","contact_relations_contact_relations_sourceTocontacts","contact_relations_contact_relations_destinationTocontacts"]}},"in":"query","name":"include","required":false},{"schema":{"type":"object","properties":{"linkedin_data":{"type":"boolean"},"web_search_summary":{"type":"boolean"},"groups_count":{"type":"boolean"},"coordinates":{"type":"boolean"},"last_note":{"type":"boolean"},"id":{"type":"boolean"},"user_id":{"type":"boolean"},"first_name":{"type":"boolean"},"last_name":{"type":"boolean"},"description":{"type":"boolean"},"birthday":{"type":"boolean"},"legacy_location":{"type":"boolean"},"education":{"type":"boolean"},"job_title":{"type":"boolean"},"company":{"type":"boolean"},"image_source":{"type":"boolean"},"image_url":{"type":"boolean"},"starred":{"type":"boolean"},"last_seen_at":{"type":"boolean"},"last_reminder_at":{"type":"boolean"},"first_met_at":{"type":"boolean"},"first_interaction_at":{"type":"boolean"},"facebook":{"type":"boolean"},"linkedin":{"type":"boolean"},"twitter":{"type":"boolean"},"instagram":{"type":"boolean"},"created_at":{"type":"boolean"},"updated_at":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"telegram":{"type":"boolean"},"website":{"type":"boolean"},"next_reminder_at":{"type":"boolean"},"source":{"type":"boolean"},"is_archived":{"type":"boolean"},"birthday_year":{"type":"boolean"},"linkedin_enhance_date":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"geocode_attempts":{"type":"boolean"},"geocode_failed_at":{"type":"boolean"},"full_name":{"type":"boolean"},"business_card_url":{"type":"boolean"},"linkedin_companies":{"type":"boolean"},"linkedin_education":{"type":"boolean"},"linkedin_last_message_at":{"type":"boolean"},"linkedin_last_message_snippet":{"type":"boolean"},"linkedin_message_link":{"type":"boolean"},"linkedin_urn":{"type":"boolean"},"linkedin_headline":{"type":"boolean"},"whatsapp_message_link":{"type":"boolean"},"whatsapp_message_snippet":{"type":"boolean"},"whatsapp_last_message_at":{"type":"boolean"},"frequency_text":{"type":"boolean"},"imessage_message_link":{"type":"boolean"},"imessage_message_snippet":{"type":"boolean"},"imessage_last_message_at":{"type":"boolean"},"instagram_message_link":{"type":"boolean"},"instagram_message_snippet":{"type":"boolean"},"instagram_last_message_at":{"type":"boolean"},"gmail_last_interaction_at":{"type":"boolean"},"gcal_last_interaction_at":{"type":"boolean"},"gmail_last_interaction_provider_id":{"type":"boolean"},"gcal_last_interaction_provider_id":{"type":"boolean"},"gmail_last_interaction_subject":{"type":"boolean"},"gcal_last_interaction_title":{"type":"boolean"},"phone_call_interaction_snippet":{"type":"boolean"},"phone_call_last_interaction_at":{"type":"boolean"},"tiktok":{"type":"boolean"},"youtube":{"type":"boolean"},"gmail_last_interaction_provider":{"type":"boolean"},"gcal_last_interaction_provider":{"type":"boolean"},"priority_tier":{"type":"boolean"},"workspace_id":{"type":"boolean"},"contact_emails":{"type":"boolean"},"contact_phone_numbers":{"type":"boolean"},"contact_birthdays":{"type":"boolean"},"contact_locations":{"type":"boolean"},"contacts_custom_fields":{"type":"boolean"},"legacy_contact_addresses":{"type":"boolean"},"groups_contacts":{"type":"boolean"},"tags_contacts":{"type":"boolean"},"timeline_items_contacts":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"feed_items":{"type":"boolean"},"keep_in_touch_reminders":{"type":"boolean"},"contact_relations_contact_relations_sourceTocontacts":{"type":"boolean"},"contact_relations_contact_relations_destinationTocontacts":{"type":"boolean"},"frequency":{"type":"boolean"},"frequency_interval":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["linkedin_data","web_search_summary","groups_count","coordinates","last_note","id","user_id","first_name","last_name","description","birthday","legacy_location","education","job_title","company","image_source","image_url","starred","last_seen_at","last_reminder_at","first_met_at","first_interaction_at","facebook","linkedin","twitter","instagram","created_at","updated_at","never_keep_in_touch","telegram","website","next_reminder_at","source","is_archived","birthday_year","linkedin_enhance_date","ignore_merge","geocode_attempts","geocode_failed_at","full_name","business_card_url","linkedin_companies","linkedin_education","linkedin_last_message_at","linkedin_last_message_snippet","linkedin_message_link","linkedin_urn","linkedin_headline","whatsapp_message_link","whatsapp_message_snippet","whatsapp_last_message_at","frequency_text","imessage_message_link","imessage_message_snippet","imessage_last_message_at","instagram_message_link","instagram_message_snippet","instagram_last_message_at","gmail_last_interaction_at","gcal_last_interaction_at","gmail_last_interaction_provider_id","gcal_last_interaction_provider_id","gmail_last_interaction_subject","gcal_last_interaction_title","phone_call_interaction_snippet","phone_call_last_interaction_at","tiktok","youtube","gmail_last_interaction_provider","gcal_last_interaction_provider","priority_tier","workspace_id","contact_emails","contact_phone_numbers","contact_birthdays","contact_locations","contacts_custom_fields","legacy_contact_addresses","groups_contacts","tags_contacts","timeline_items_contacts","reminders_contacts","feed_items","keep_in_touch_reminders","contact_relations_contact_relations_sourceTocontacts","contact_relations_contact_relations_destinationTocontacts","frequency","frequency_interval"]}},"in":"query","name":"select","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"contact":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"full_name":{"nullable":true,"type":"string"},"description":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"},"company":{"nullable":true,"type":"string"},"education":{"nullable":true,"type":"string"},"legacy_location":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"business_card_url":{"nullable":true,"type":"string"},"website":{"nullable":true,"type":"string"},"image_source":{"nullable":true,"type":"string"},"birthday":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"birthday_year":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"linkedin":{"nullable":true,"type":"string"},"twitter":{"nullable":true,"type":"string"},"facebook":{"nullable":true,"type":"string"},"instagram":{"nullable":true,"type":"string"},"telegram":{"nullable":true,"type":"string"},"tiktok":{"nullable":true,"type":"string"},"youtube":{"nullable":true,"type":"string"},"starred":{"type":"boolean"},"is_archived":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"source":{"type":"string"},"priority_tier":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"frequency":{"nullable":true,"type":"string"},"frequency_text":{"nullable":true,"type":"string"},"last_seen_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"last_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_met_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_companies":{"nullable":true,"type":"string"},"linkedin_education":{"nullable":true,"type":"string"},"linkedin_enhance_date":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_snippet":{"nullable":true,"type":"string"},"linkedin_message_link":{"nullable":true,"type":"string"},"linkedin_urn":{"nullable":true,"type":"string"},"linkedin_headline":{"nullable":true,"type":"string"},"whatsapp_message_link":{"nullable":true,"type":"string"},"whatsapp_message_snippet":{"nullable":true,"type":"string"},"whatsapp_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"imessage_message_link":{"nullable":true,"type":"string"},"imessage_message_snippet":{"nullable":true,"type":"string"},"imessage_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"instagram_message_link":{"nullable":true,"type":"string"},"instagram_message_snippet":{"nullable":true,"type":"string"},"instagram_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gmail_last_interaction_provider_id":{"nullable":true,"type":"string"},"gmail_last_interaction_subject":{"nullable":true,"type":"string"},"gcal_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gcal_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gcal_last_interaction_provider_id":{"nullable":true,"type":"string"},"gcal_last_interaction_title":{"nullable":true,"type":"string"},"phone_call_interaction_snippet":{"nullable":true,"type":"string"},"phone_call_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"web_search_summary":{"nullable":true},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"geocode_attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"geocode_failed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false},"frequency_interval":{},"linkedin_data":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"latitude":{"nullable":true,"type":"number"},"longitude":{"nullable":true,"type":"number"},"last_note":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"preview":{"type":"string"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"}},"required":["id","preview","event_time","emoji","meeting_type"],"additionalProperties":false},"team_keep_in_touch":{"nullable":true,"type":"object","properties":{"cadence_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["cadence_id","frequency_id","days","next_due_at","snoozed_until"],"additionalProperties":false},"contact_emails":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_birthdays":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contact_locations":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contacts_custom_fields":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"tags_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_sourceTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_destinationTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"feed_items":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"keep_in_touch_reminders":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"required":["contact"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getContactV2","summary":"Get a contact (v2)","description":"Retrieve a contact by ID. Email and phone relations are omitted by default; request them with `?include[contact_emails]=true` or `?include[contact_phone_numbers]=true`.","x-mint":{"content":"## Use cases\n\n- Display contact detail pages\n- Fetch the latest state before an update\n\n## Related data\n\nRelations are omitted unless requested. Add `?include[contact_emails]=true` for email addresses or `?include[contact_phone_numbers]=true` for phone numbers. Use `select` instead when you want a narrow projection; `include` and `select` cannot be combined.\n\n## Migration from /v1\n\n/v1: `{ error: false, data: { ...contact } }` (contact fields spread onto `data`).\n/v2: `{ data: { contact: {...} } }` — namespaced under `data.contact`, no `error` field on success."}},"patch":{"tags":["contacts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"full_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"job_title":{"anyOf":[{"type":"string"},{"type":"null"}]},"legacy_location":{"anyOf":[{"type":"string"},{"type":"null"}]},"company":{"anyOf":[{"type":"string"},{"type":"null"}]},"education":{"anyOf":[{"type":"string"},{"type":"null"}]},"starred":{"type":"boolean"},"source":{"type":"string","enum":["linkedin_sync","facebook_import","cal_ingest","email_ingest","web_import","csv_import","whatsapp_sync","imessage_sync","phone_calls_sync","mobile","mobile_import","instagram_sync","oauth_interaction","granola_sync"]},"coordinates":{"type":"object","properties":{"operation":{"type":"string","enum":["set","delete"]},"data":{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180}},"additionalProperties":false}},"required":["operation"],"additionalProperties":false},"priority_tier":{"anyOf":[{"type":"integer","minimum":1,"maximum":32767},{"type":"null"}]},"image_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"image_source":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"business_card_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"website":{"anyOf":[{},{"type":"null"}]},"birthday":{"anyOf":[{"type":"string","format":"date","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])))$"},{"type":"null"}]},"birthday_year":{"anyOf":[{"type":"number","minimum":1900,"maximum":2100},{"type":"null"}]},"frequency":{"anyOf":[{"type":"string"},{"type":"null"}]},"last_seen_at":{"anyOf":[{},{"type":"null"}]},"first_met_at":{"anyOf":[{},{"type":"null"}]},"never_keep_in_touch":{"type":"boolean"},"next_reminder_at":{},"linkedin":{"anyOf":[{"type":"string"},{"type":"null"}]},"twitter":{"anyOf":[{"type":"string"},{"type":"null"}]},"facebook":{"anyOf":[{"type":"string"},{"type":"null"}]},"instagram":{"anyOf":[{"type":"string"},{"type":"null"}]},"telegram":{"anyOf":[{"type":"string"},{"type":"null"}]},"tiktok":{"anyOf":[{"type":"string"},{"type":"null"}]},"youtube":{"anyOf":[{"type":"string"},{"type":"null"}]},"whatsapp_message_link":{"type":"string"},"whatsapp_message_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"whatsapp_last_message_at":{"anyOf":[{},{"type":"null"}]},"imessage_message_link":{"type":"string"},"imessage_message_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"imessage_last_message_at":{"anyOf":[{},{"type":"null"}]},"linkedin_message_link":{"type":"string","maxLength":600},"linkedin_last_message_snippet":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"linkedin_last_message_at":{"anyOf":[{},{"type":"null"}]},"linkedin_data":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"instagram_message_link":{"type":"string"},"instagram_message_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"instagram_last_message_at":{"anyOf":[{},{"type":"null"}]},"gmail_last_interaction_at":{"anyOf":[{},{"type":"null"}]},"gmail_last_interaction_provider_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"gmail_last_interaction_subject":{"anyOf":[{"type":"string"},{"type":"null"}]},"gmail_last_interaction_provider":{"anyOf":[{"type":"string","enum":["GOOGLE","OFFICE365"]},{"type":"null"}]},"gcal_last_interaction_at":{"anyOf":[{},{"type":"null"}]},"gcal_last_interaction_provider_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"gcal_last_interaction_title":{"anyOf":[{"type":"string"},{"type":"null"}]},"gcal_last_interaction_provider":{"anyOf":[{"type":"string","enum":["GOOGLE","OFFICE365"]},{"type":"null"}]},"phone_call_last_interaction_at":{"anyOf":[{},{"type":"null"}]},"phone_call_interaction_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"web_search_summary":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{"formatted":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false}},"contact_emails":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","maxLength":320},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"ranking":{"type":"number"}},"required":["email"],"additionalProperties":false}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{"phone_number":{"type":"string","maxLength":50},"country_code":{"anyOf":[{"type":"string","maxLength":4},{"type":"null"}]},"phone_number_sanitized":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}]},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"ranking":{"type":"number"}},"required":["phone_number"],"additionalProperties":false}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{"group_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["group_id"],"additionalProperties":false}},"tags_contacts":{"anyOf":[{"type":"object","properties":{"append":{"type":"array","items":{"type":"object","properties":{"tag_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["tag_id"],"additionalProperties":false}},"remove":{"type":"array","items":{"type":"object","properties":{"tag_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["tag_id","contact_id"],"additionalProperties":false}},"replace":{}},"additionalProperties":false},{"type":"object","properties":{"append":{},"remove":{},"replace":{"type":"array","items":{"type":"object","properties":{"tag_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["tag_id"],"additionalProperties":false}}},"additionalProperties":false}]},"custom_fields":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["input"]},"text_value":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"custom_field":{}},"required":["id","type","text_value"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["autocomplete"]},"text_value":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"custom_field":{}},"required":["id","type","text_value"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["datepicker"]},"text_value":{"anyOf":[{"type":"string"},{"type":"null"}]},"date_value":{"anyOf":[{},{"type":"null"}]},"custom_field":{}},"required":["id","type"],"additionalProperties":false}]}},"contact_birthdays":{"type":"object","properties":{"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"last_dismissal_year":{"type":"number","minimum":1900,"maximum":2100}},"additionalProperties":false},"is_archived":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"related_contacts":{"anyOf":[{"type":"object","properties":{"append":{"type":"array","items":{"type":"object","properties":{"destination":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"source_contact":{},"destination_contact":{}},"required":["destination"],"additionalProperties":false}},"remove":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"source":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"destination":{}},"required":["source","destination"],"additionalProperties":false},{"type":"object","properties":{"source":{},"destination":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["source","destination"],"additionalProperties":false}]}},"replace":{}},"additionalProperties":false},{"type":"object","properties":{"append":{},"remove":{},"replace":{"type":"array","items":{"type":"object","properties":{"destination":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"source_contact":{},"destination_contact":{}},"required":["destination"],"additionalProperties":false}}},"additionalProperties":false}]},"last_seen_now":{"type":"boolean","enum":[true]},"snooze_days":{"type":"integer","minimum":1,"maximum":3650},"add_emails":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","maxLength":320},"label":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["email"],"additionalProperties":false}},"remove_emails":{"type":"array","items":{"type":"string"}},"add_phones":{"type":"array","items":{"type":"object","properties":{"phone_number":{"type":"string","maxLength":50},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"country_code":{"anyOf":[{"type":"string","maxLength":4},{"type":"null"}]}},"required":["phone_number"],"additionalProperties":false}},"remove_phones":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"contact":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"full_name":{"nullable":true,"type":"string"},"description":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"},"company":{"nullable":true,"type":"string"},"education":{"nullable":true,"type":"string"},"legacy_location":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"business_card_url":{"nullable":true,"type":"string"},"website":{"nullable":true,"type":"string"},"image_source":{"nullable":true,"type":"string"},"birthday":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"birthday_year":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"linkedin":{"nullable":true,"type":"string"},"twitter":{"nullable":true,"type":"string"},"facebook":{"nullable":true,"type":"string"},"instagram":{"nullable":true,"type":"string"},"telegram":{"nullable":true,"type":"string"},"tiktok":{"nullable":true,"type":"string"},"youtube":{"nullable":true,"type":"string"},"starred":{"type":"boolean"},"is_archived":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"source":{"type":"string"},"priority_tier":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"frequency":{"nullable":true,"type":"string"},"frequency_text":{"nullable":true,"type":"string"},"last_seen_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"last_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_met_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_companies":{"nullable":true,"type":"string"},"linkedin_education":{"nullable":true,"type":"string"},"linkedin_enhance_date":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_snippet":{"nullable":true,"type":"string"},"linkedin_message_link":{"nullable":true,"type":"string"},"linkedin_urn":{"nullable":true,"type":"string"},"linkedin_headline":{"nullable":true,"type":"string"},"whatsapp_message_link":{"nullable":true,"type":"string"},"whatsapp_message_snippet":{"nullable":true,"type":"string"},"whatsapp_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"imessage_message_link":{"nullable":true,"type":"string"},"imessage_message_snippet":{"nullable":true,"type":"string"},"imessage_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"instagram_message_link":{"nullable":true,"type":"string"},"instagram_message_snippet":{"nullable":true,"type":"string"},"instagram_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gmail_last_interaction_provider_id":{"nullable":true,"type":"string"},"gmail_last_interaction_subject":{"nullable":true,"type":"string"},"gcal_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gcal_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gcal_last_interaction_provider_id":{"nullable":true,"type":"string"},"gcal_last_interaction_title":{"nullable":true,"type":"string"},"phone_call_interaction_snippet":{"nullable":true,"type":"string"},"phone_call_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"web_search_summary":{"nullable":true},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"geocode_attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"geocode_failed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false},"frequency_interval":{},"linkedin_data":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"latitude":{"nullable":true,"type":"number"},"longitude":{"nullable":true,"type":"number"},"last_note":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"preview":{"type":"string"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"}},"required":["id","preview","event_time","emoji","meeting_type"],"additionalProperties":false},"team_keep_in_touch":{"nullable":true,"type":"object","properties":{"cadence_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["cadence_id","frequency_id","days","next_due_at","snoozed_until"],"additionalProperties":false},"contact_emails":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_birthdays":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contact_locations":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contacts_custom_fields":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"tags_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_sourceTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_destinationTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"feed_items":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"keep_in_touch_reminders":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"required":["contact"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"updateContactV2","summary":"Update a contact (v2)","description":"Partially update a contact by its ID. **Requires `Idempotency-Key`.** Returns `{ data: { contact: {...} } }` with the post-update row. Also fires a Pub/Sub message to auto-add the contact to social groups when LinkedIn / Twitter / Instagram / etc. fields are set.","x-mint":{"content":"## Use cases\n\n- Edit contact details from a profile page\n- Mark a contact as starred or archived\n- Patch fields after enrichment (LinkedIn, social lookup)\n\n## Migration from /v1\n\n/v1 used `PUT /v1/contacts/:id`. /v2 uses `PATCH` because the body is a partial update (PUT semantically means \"replace the resource entirely\").\n\n## Idempotency\n\nUpdates aren't HTTP-idempotent in our partial-update model: two concurrent retries could race with another update from a different client. The key serializes retries to one applied update. A retry must resend the SAME body: a different body under a used key is answered with `409 idempotency_key_reused`. So prefer the server-resolved fields below over values you compute yourself.\n\n## Server-resolved fields\n\n- `last_seen_now: true` sets `last_seen_at` to the server's current time (records a touch; the keep-in-touch schedule follows from it).\n- `snooze_days` (1–3650) sets `next_reminder_at` to the server's current time plus that many days.\n- `add_emails` / `remove_emails` and `add_phones` / `remove_phones` change individual addresses and numbers without replacing the rest. Emails match case-insensitively; phone numbers match on their digits, in national or international form. Removals apply before additions, and an addition that is already on the contact is skipped.\n\nEach is mutually exclusive with the field it stands in for (`last_seen_at`, `next_reminder_at`, `contact_emails`, `contact_phone_numbers`); sending both is a `400`. Only this endpoint accepts them — not the batch update."}},"delete":{"tags":["contacts"],"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true},{"in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Optional. Accepted to dedupe retries on this endpoint. See `apps/rest-api/src/shared/idempotency.ts`."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteContactV2","summary":"Delete a contact (v2)","description":"Permanently delete a contact by its ID. Returns the canonical bulk envelope: `{ data: { affected: 1, ids: [contactId] } }`. `Idempotency-Key` is optional.","x-mint":{"content":"## Use cases\n\n- Remove a contact added by mistake\n- GDPR / data-removal requests\n\n## Single vs. bulk envelope\n\nThe response uses the same shape as the bulk delete endpoint (`{ affected, ids }`) so the client-side cache-invalidation logic can be uniform across single and bulk deletes. There is no `{ message }` field on /v2 deletes (v1 returned `{ message: \"Contact deleted\" }` which was useless to clients)."}}},"/v2/contacts/":{"get":{"tags":["contacts"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"take","required":false},{"schema":{"type":"integer","minimum":0,"maximum":9007199254740991},"in":"query","name":"skip","required":false},{"schema":{"type":"string","minLength":1,"maxLength":2048},"in":"query","name":"cursor","required":false,"description":"Opaque pagination cursor: the `nextCursor` of the previous page, passed back unchanged."},{"schema":{"type":"object","properties":{"in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Match contacts whose id is in this set (single id or array)."},"not_in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Exclude contacts whose id is in this set (single id or array)."},"ignore_merge":{"type":"boolean","description":"Filter by the `ignore_merge` flag (excluded from merge suggestions)."},"is_starred":{"type":"boolean","description":"Match starred (true) or non-starred (false) contacts."},"is_team_overdue":{"type":"boolean","description":"Workspace only. true: the Team cadence is overdue; false: the Team cadence exists and is not overdue. Contacts with no Team cadence match neither."},"is_my_overdue":{"type":"boolean","description":"Workspace only. true: the caller's cadence is overdue; false: the caller's cadence exists and is not overdue. Contacts the caller has no cadence on match neither."},"is_archived":{"type":"boolean","description":"Match archived (true) or active (false) contacts. Defaults to false when omitted."},"has_priority_tier":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"type":"array","items":{"type":"integer","minimum":1,"maximum":9007199254740991}},{"type":"boolean"}],"description":"Relationship priority tier: a tier number, an array of tiers (OR), or a boolean (true = any tier set, false = none)."},"has_linkedin":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"LinkedIn slug: an exact slug string, or a boolean for presence/absence of a LinkedIn handle."},"has_instagram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Instagram slug: an exact slug string, or a boolean for presence/absence of an Instagram handle."},"has_twitter":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Twitter/X slug: an exact slug string, or a boolean for presence/absence of a Twitter handle."},"has_facebook":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Facebook slug: an exact slug string, or a boolean for presence/absence of a Facebook profile."},"has_telegram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Telegram slug: an exact slug string, or a boolean for presence/absence of a Telegram handle."},"has_tiktok":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"TikTok slug: an exact slug string, or a boolean for presence/absence of a TikTok handle."},"has_youtube":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"YouTube slug: an exact slug string, or a boolean for presence/absence of a YouTube channel."},"has_source":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Contact source: a single source string or an array of sources (OR)."},"has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Full name: a bare string (fuzzy contains), an array of exact names, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_groups":{"anyOf":[{"type":"object","properties":{"not":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["not"],"additionalProperties":false},{"type":"boolean"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string"}}],"description":"Group membership: a group id, an array of group ids (OR), a boolean for any/no group, or `{ not }` to exclude group id(s)."},"has_user_created_groups":{"type":"boolean","description":"Non-system group membership: true for at least one user-created group; false for no user-created groups, including contacts with zero memberships or only Dex system-group memberships."},"has_grouping_signal":{"type":"boolean","description":"Internal organize prefilter: title, company, location, or LinkedIn summary is non-null and non-empty. Whitespace-only values are removed by the organize serializer.","enum":[true]},"has_groups_all":{"description":"Array of group-id rows: AND across rows, OR within each row (contact must be in at least one group from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_groups_only":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Exclusive group membership: the contact is in at least one of these group ids and in no group outside them. Contacts with no group never match."},"has_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Keep-in-touch cadence: a frequency string, or a boolean for presence/absence of a cadence."},"has_my_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Workspace only. The caller's own keep-in-touch cadence: a workspace frequency id, or a boolean for presence/absence of the caller's cadence."},"known_by":{"type":"string","minLength":1,"maxLength":128,"description":"Workspace only. An active member's user id: contacts that member has a known email, calendar or shared-note interaction with. For the caller's own id, their private notes count too."},"has_location":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Location: a string (fuzzy, accent-insensitive match), or a boolean for presence/absence of a location."},"has_location_exact":{"type":"string","description":"Location: exact string match (not fuzzy)."},"has_job_title":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Job title: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_never_keep_in_touch":{"type":"boolean","description":"Filter by the `never_keep_in_touch` flag."},"has_created_at":{"description":"Creation-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_updated_at":{"description":"Last-updated-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_next_due":{"description":"Workspace only. Team keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts with no Team cadence never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_my_next_due":{"description":"Workspace only. The caller's own keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts the caller has no cadence on never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_last_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Workspace only. The team's last interaction date, the one the \"Last team interaction\" sort orders by (the latest email, calendar event or shared note any member has with the contact): a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range (at least one bound, at most microsecond precision). Contacts with no team interaction never match a range."},"has_birthday":{"anyOf":[{"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))$"},{},{"type":"boolean"}],"description":"Birthday: a specific date (matches on day + month), or true for any birthday set."},"has_tag":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Match contacts carrying this single tag id."},"has_tags":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"type":"object","properties":{"not":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}]}},"required":["not"],"additionalProperties":false}],"description":"Tags: an array of tag ids (OR), or `{ not }` to exclude tag id(s)."},"has_tags_all":{"description":"Array of tag-id rows: AND across rows, OR within each row (contact must carry at least one tag from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_company":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Company: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Education: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_description":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Description/notes: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn companies text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn education text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_email":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one email."},"has_phone_number":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one phone number."},"not_has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose full name fuzzily matches this string / any of these strings."},"not_has_company":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose company fuzzily matches this string / any of these strings."},"not_has_job_title":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose job title fuzzily matches this string / any of these strings."},"not_has_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose education fuzzily matches this string / any of these strings."},"not_has_description":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose description fuzzily matches this string / any of these strings."},"not_has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn companies text fuzzily matches this string / any of these strings."},"not_has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn education text fuzzily matches this string / any of these strings."},"has_linkedin_last_message_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"LinkedIn last-message time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_last_seen_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Last-seen (last interaction) time — alias for has_interaction: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_distance":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"},"meters":{"type":"number"},"label":{"type":"string"}},"required":["lat","lon","meters"],"additionalProperties":false,"description":"Geo radius filter: contacts within `meters` of `{ lat, lon }` (PostGIS ST_DWithin on geocoded coordinates). `label` is an optional display name for the point."},"has_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Interaction (last-seen) time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_next_reminder":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Next-reminder time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"custom_fields":{"minItems":1,"type":"array","items":{"type":"object","properties":{"field_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"operator":{"type":"string","enum":["contains","eq","in","not_in","present","absent","gte","lte"]},"value":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["field_id","operator"],"additionalProperties":false},"description":"User-defined custom-field filters. Each clause is `{ field_id, operator, value? }`; multiple clauses AND together. Operators: contains, eq, in, not_in, present, absent, gte, lte."},"_or":{"description":"Compound-OR escape hatch: an array of filter branches combined with OR, each ANDed with the top-level keys. One level deep — branches cannot themselves contain `_or`.","minItems":1,"type":"array","items":{"type":"object","properties":{"in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Match contacts whose id is in this set (single id or array)."},"not_in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Exclude contacts whose id is in this set (single id or array)."},"ignore_merge":{"type":"boolean","description":"Filter by the `ignore_merge` flag (excluded from merge suggestions)."},"is_starred":{"type":"boolean","description":"Match starred (true) or non-starred (false) contacts."},"is_team_overdue":{"type":"boolean","description":"Workspace only. true: the Team cadence is overdue; false: the Team cadence exists and is not overdue. Contacts with no Team cadence match neither."},"is_my_overdue":{"type":"boolean","description":"Workspace only. true: the caller's cadence is overdue; false: the caller's cadence exists and is not overdue. Contacts the caller has no cadence on match neither."},"is_archived":{"type":"boolean","description":"Match archived (true) or active (false) contacts. Defaults to false when omitted."},"has_priority_tier":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"type":"array","items":{"type":"integer","minimum":1,"maximum":9007199254740991}},{"type":"boolean"}],"description":"Relationship priority tier: a tier number, an array of tiers (OR), or a boolean (true = any tier set, false = none)."},"has_linkedin":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"LinkedIn slug: an exact slug string, or a boolean for presence/absence of a LinkedIn handle."},"has_instagram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Instagram slug: an exact slug string, or a boolean for presence/absence of an Instagram handle."},"has_twitter":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Twitter/X slug: an exact slug string, or a boolean for presence/absence of a Twitter handle."},"has_facebook":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Facebook slug: an exact slug string, or a boolean for presence/absence of a Facebook profile."},"has_telegram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Telegram slug: an exact slug string, or a boolean for presence/absence of a Telegram handle."},"has_tiktok":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"TikTok slug: an exact slug string, or a boolean for presence/absence of a TikTok handle."},"has_youtube":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"YouTube slug: an exact slug string, or a boolean for presence/absence of a YouTube channel."},"has_source":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Contact source: a single source string or an array of sources (OR)."},"has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Full name: a bare string (fuzzy contains), an array of exact names, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_groups":{"anyOf":[{"type":"object","properties":{"not":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["not"],"additionalProperties":false},{"type":"boolean"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string"}}],"description":"Group membership: a group id, an array of group ids (OR), a boolean for any/no group, or `{ not }` to exclude group id(s)."},"has_user_created_groups":{"type":"boolean","description":"Non-system group membership: true for at least one user-created group; false for no user-created groups, including contacts with zero memberships or only Dex system-group memberships."},"has_grouping_signal":{"type":"boolean","description":"Internal organize prefilter: title, company, location, or LinkedIn summary is non-null and non-empty. Whitespace-only values are removed by the organize serializer.","enum":[true]},"has_groups_all":{"description":"Array of group-id rows: AND across rows, OR within each row (contact must be in at least one group from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_groups_only":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Exclusive group membership: the contact is in at least one of these group ids and in no group outside them. Contacts with no group never match."},"has_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Keep-in-touch cadence: a frequency string, or a boolean for presence/absence of a cadence."},"has_my_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Workspace only. The caller's own keep-in-touch cadence: a workspace frequency id, or a boolean for presence/absence of the caller's cadence."},"known_by":{"type":"string","minLength":1,"maxLength":128,"description":"Workspace only. An active member's user id: contacts that member has a known email, calendar or shared-note interaction with. For the caller's own id, their private notes count too."},"has_location":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Location: a string (fuzzy, accent-insensitive match), or a boolean for presence/absence of a location."},"has_location_exact":{"type":"string","description":"Location: exact string match (not fuzzy)."},"has_job_title":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Job title: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_never_keep_in_touch":{"type":"boolean","description":"Filter by the `never_keep_in_touch` flag."},"has_created_at":{"description":"Creation-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_updated_at":{"description":"Last-updated-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_next_due":{"description":"Workspace only. Team keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts with no Team cadence never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_my_next_due":{"description":"Workspace only. The caller's own keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts the caller has no cadence on never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_last_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Workspace only. The team's last interaction date, the one the \"Last team interaction\" sort orders by (the latest email, calendar event or shared note any member has with the contact): a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range (at least one bound, at most microsecond precision). Contacts with no team interaction never match a range."},"has_birthday":{"anyOf":[{"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))$"},{},{"type":"boolean"}],"description":"Birthday: a specific date (matches on day + month), or true for any birthday set."},"has_tag":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Match contacts carrying this single tag id."},"has_tags":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"type":"object","properties":{"not":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}]}},"required":["not"],"additionalProperties":false}],"description":"Tags: an array of tag ids (OR), or `{ not }` to exclude tag id(s)."},"has_tags_all":{"description":"Array of tag-id rows: AND across rows, OR within each row (contact must carry at least one tag from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_company":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Company: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Education: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_description":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Description/notes: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn companies text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn education text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_email":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one email."},"has_phone_number":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one phone number."},"not_has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose full name fuzzily matches this string / any of these strings."},"not_has_company":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose company fuzzily matches this string / any of these strings."},"not_has_job_title":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose job title fuzzily matches this string / any of these strings."},"not_has_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose education fuzzily matches this string / any of these strings."},"not_has_description":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose description fuzzily matches this string / any of these strings."},"not_has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn companies text fuzzily matches this string / any of these strings."},"not_has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn education text fuzzily matches this string / any of these strings."},"has_linkedin_last_message_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"LinkedIn last-message time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_last_seen_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Last-seen (last interaction) time — alias for has_interaction: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_distance":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"},"meters":{"type":"number"},"label":{"type":"string"}},"required":["lat","lon","meters"],"additionalProperties":false,"description":"Geo radius filter: contacts within `meters` of `{ lat, lon }` (PostGIS ST_DWithin on geocoded coordinates). `label` is an optional display name for the point."},"has_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Interaction (last-seen) time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_next_reminder":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Next-reminder time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"custom_fields":{"minItems":1,"type":"array","items":{"type":"object","properties":{"field_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"operator":{"type":"string","enum":["contains","eq","in","not_in","present","absent","gte","lte"]},"value":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["field_id","operator"],"additionalProperties":false},"description":"User-defined custom-field filters. Each clause is `{ field_id, operator, value? }`; multiple clauses AND together. Operators: contains, eq, in, not_in, present, absent, gte, lte."}},"additionalProperties":false}}},"additionalProperties":false},"in":"query","name":"where","required":false},{"schema":{},"in":"query","name":"orderBy","required":false},{"schema":{"type":"object","properties":{"linkedin_data":{"type":"boolean"},"web_search_summary":{"type":"boolean"},"groups_count":{"type":"boolean"},"coordinates":{"type":"boolean"},"last_note":{"type":"boolean"},"contact_emails":{"type":"boolean"},"contact_phone_numbers":{"type":"boolean"},"contact_birthdays":{"type":"boolean"},"contact_locations":{"type":"boolean"},"contacts_custom_fields":{"type":"boolean"},"legacy_contact_addresses":{"type":"boolean"},"groups_contacts":{"type":"boolean"},"tags_contacts":{"type":"boolean"},"timeline_items_contacts":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"feed_items":{"type":"boolean"},"keep_in_touch_reminders":{"type":"boolean"},"contact_relations_contact_relations_sourceTocontacts":{"type":"boolean"},"contact_relations_contact_relations_destinationTocontacts":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["linkedin_data","web_search_summary","groups_count","coordinates","last_note","contact_emails","contact_phone_numbers","contact_birthdays","contact_locations","contacts_custom_fields","legacy_contact_addresses","groups_contacts","tags_contacts","timeline_items_contacts","reminders_contacts","feed_items","keep_in_touch_reminders","contact_relations_contact_relations_sourceTocontacts","contact_relations_contact_relations_destinationTocontacts"]}},"in":"query","name":"include","required":false},{"schema":{"type":"object","properties":{"linkedin_data":{"type":"boolean"},"web_search_summary":{"type":"boolean"},"groups_count":{"type":"boolean"},"coordinates":{"type":"boolean"},"last_note":{"type":"boolean"},"id":{"type":"boolean"},"user_id":{"type":"boolean"},"first_name":{"type":"boolean"},"last_name":{"type":"boolean"},"description":{"type":"boolean"},"birthday":{"type":"boolean"},"legacy_location":{"type":"boolean"},"education":{"type":"boolean"},"job_title":{"type":"boolean"},"company":{"type":"boolean"},"image_source":{"type":"boolean"},"image_url":{"type":"boolean"},"starred":{"type":"boolean"},"last_seen_at":{"type":"boolean"},"last_reminder_at":{"type":"boolean"},"first_met_at":{"type":"boolean"},"first_interaction_at":{"type":"boolean"},"facebook":{"type":"boolean"},"linkedin":{"type":"boolean"},"twitter":{"type":"boolean"},"instagram":{"type":"boolean"},"created_at":{"type":"boolean"},"updated_at":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"telegram":{"type":"boolean"},"website":{"type":"boolean"},"next_reminder_at":{"type":"boolean"},"source":{"type":"boolean"},"is_archived":{"type":"boolean"},"birthday_year":{"type":"boolean"},"linkedin_enhance_date":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"geocode_attempts":{"type":"boolean"},"geocode_failed_at":{"type":"boolean"},"full_name":{"type":"boolean"},"business_card_url":{"type":"boolean"},"linkedin_companies":{"type":"boolean"},"linkedin_education":{"type":"boolean"},"linkedin_last_message_at":{"type":"boolean"},"linkedin_last_message_snippet":{"type":"boolean"},"linkedin_message_link":{"type":"boolean"},"linkedin_urn":{"type":"boolean"},"linkedin_headline":{"type":"boolean"},"whatsapp_message_link":{"type":"boolean"},"whatsapp_message_snippet":{"type":"boolean"},"whatsapp_last_message_at":{"type":"boolean"},"frequency_text":{"type":"boolean"},"imessage_message_link":{"type":"boolean"},"imessage_message_snippet":{"type":"boolean"},"imessage_last_message_at":{"type":"boolean"},"instagram_message_link":{"type":"boolean"},"instagram_message_snippet":{"type":"boolean"},"instagram_last_message_at":{"type":"boolean"},"gmail_last_interaction_at":{"type":"boolean"},"gcal_last_interaction_at":{"type":"boolean"},"gmail_last_interaction_provider_id":{"type":"boolean"},"gcal_last_interaction_provider_id":{"type":"boolean"},"gmail_last_interaction_subject":{"type":"boolean"},"gcal_last_interaction_title":{"type":"boolean"},"phone_call_interaction_snippet":{"type":"boolean"},"phone_call_last_interaction_at":{"type":"boolean"},"tiktok":{"type":"boolean"},"youtube":{"type":"boolean"},"gmail_last_interaction_provider":{"type":"boolean"},"gcal_last_interaction_provider":{"type":"boolean"},"priority_tier":{"type":"boolean"},"workspace_id":{"type":"boolean"},"contact_emails":{"type":"boolean"},"contact_phone_numbers":{"type":"boolean"},"contact_birthdays":{"type":"boolean"},"contact_locations":{"type":"boolean"},"contacts_custom_fields":{"type":"boolean"},"legacy_contact_addresses":{"type":"boolean"},"groups_contacts":{"type":"boolean"},"tags_contacts":{"type":"boolean"},"timeline_items_contacts":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"feed_items":{"type":"boolean"},"keep_in_touch_reminders":{"type":"boolean"},"contact_relations_contact_relations_sourceTocontacts":{"type":"boolean"},"contact_relations_contact_relations_destinationTocontacts":{"type":"boolean"},"frequency":{"type":"boolean"},"frequency_interval":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["linkedin_data","web_search_summary","groups_count","coordinates","last_note","id","user_id","first_name","last_name","description","birthday","legacy_location","education","job_title","company","image_source","image_url","starred","last_seen_at","last_reminder_at","first_met_at","first_interaction_at","facebook","linkedin","twitter","instagram","created_at","updated_at","never_keep_in_touch","telegram","website","next_reminder_at","source","is_archived","birthday_year","linkedin_enhance_date","ignore_merge","geocode_attempts","geocode_failed_at","full_name","business_card_url","linkedin_companies","linkedin_education","linkedin_last_message_at","linkedin_last_message_snippet","linkedin_message_link","linkedin_urn","linkedin_headline","whatsapp_message_link","whatsapp_message_snippet","whatsapp_last_message_at","frequency_text","imessage_message_link","imessage_message_snippet","imessage_last_message_at","instagram_message_link","instagram_message_snippet","instagram_last_message_at","gmail_last_interaction_at","gcal_last_interaction_at","gmail_last_interaction_provider_id","gcal_last_interaction_provider_id","gmail_last_interaction_subject","gcal_last_interaction_title","phone_call_interaction_snippet","phone_call_last_interaction_at","tiktok","youtube","gmail_last_interaction_provider","gcal_last_interaction_provider","priority_tier","workspace_id","contact_emails","contact_phone_numbers","contact_birthdays","contact_locations","contacts_custom_fields","legacy_contact_addresses","groups_contacts","tags_contacts","timeline_items_contacts","reminders_contacts","feed_items","keep_in_touch_reminders","contact_relations_contact_relations_sourceTocontacts","contact_relations_contact_relations_destinationTocontacts","frequency","frequency_interval"]}},"in":"query","name":"select","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"contacts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"full_name":{"nullable":true,"type":"string"},"description":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"},"company":{"nullable":true,"type":"string"},"education":{"nullable":true,"type":"string"},"legacy_location":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"business_card_url":{"nullable":true,"type":"string"},"website":{"nullable":true,"type":"string"},"image_source":{"nullable":true,"type":"string"},"birthday":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"birthday_year":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"linkedin":{"nullable":true,"type":"string"},"twitter":{"nullable":true,"type":"string"},"facebook":{"nullable":true,"type":"string"},"instagram":{"nullable":true,"type":"string"},"telegram":{"nullable":true,"type":"string"},"tiktok":{"nullable":true,"type":"string"},"youtube":{"nullable":true,"type":"string"},"starred":{"type":"boolean"},"is_archived":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"source":{"type":"string"},"priority_tier":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"frequency":{"nullable":true,"type":"string"},"frequency_text":{"nullable":true,"type":"string"},"last_seen_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"last_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_met_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_companies":{"nullable":true,"type":"string"},"linkedin_education":{"nullable":true,"type":"string"},"linkedin_enhance_date":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_snippet":{"nullable":true,"type":"string"},"linkedin_message_link":{"nullable":true,"type":"string"},"linkedin_urn":{"nullable":true,"type":"string"},"linkedin_headline":{"nullable":true,"type":"string"},"whatsapp_message_link":{"nullable":true,"type":"string"},"whatsapp_message_snippet":{"nullable":true,"type":"string"},"whatsapp_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"imessage_message_link":{"nullable":true,"type":"string"},"imessage_message_snippet":{"nullable":true,"type":"string"},"imessage_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"instagram_message_link":{"nullable":true,"type":"string"},"instagram_message_snippet":{"nullable":true,"type":"string"},"instagram_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gmail_last_interaction_provider_id":{"nullable":true,"type":"string"},"gmail_last_interaction_subject":{"nullable":true,"type":"string"},"gcal_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gcal_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gcal_last_interaction_provider_id":{"nullable":true,"type":"string"},"gcal_last_interaction_title":{"nullable":true,"type":"string"},"phone_call_interaction_snippet":{"nullable":true,"type":"string"},"phone_call_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"web_search_summary":{"nullable":true},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"geocode_attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"geocode_failed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false},"frequency_interval":{},"linkedin_data":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"latitude":{"nullable":true,"type":"number"},"longitude":{"nullable":true,"type":"number"},"last_note":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"preview":{"type":"string"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"}},"required":["id","preview","event_time","emoji","meeting_type"],"additionalProperties":false},"team_keep_in_touch":{"nullable":true,"type":"object","properties":{"cadence_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["cadence_id","frequency_id","days","next_due_at","snoozed_until"],"additionalProperties":false},"contact_emails":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_birthdays":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contact_locations":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contacts_custom_fields":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"tags_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_sourceTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_destinationTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"feed_items":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"keep_in_touch_reminders":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["contacts"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listContactsV2","summary":"List contacts (v2)","description":"Retrieve contacts for the authenticated user with cursor pagination, filtering (`where`), sorting (`orderBy`), and field selection (`include` / `select`). Returns `{ data: { contacts: [...], pagination: { nextCursor, count } } }`.","x-mint":{"content":"## Use cases\n\n- Render the main contacts list with infinite scroll\n- Power filtered views (recent, favorites, by tag, by group)\n- Hydrate a TanStack DB collection on initial load\n\n## Migration from /v1\n\n/v1 list response: `{ data: { items: [...], nextCursor, count } }`.\n/v2 list response: `{ data: { contacts: [...], pagination: { nextCursor, count } } }` — entity plural at the top level, pagination namespaced.\n\n<Note>For very large `where` payloads that exceed URL length limits, use `POST /v2/contacts/filter` instead. Same response shape.</Note>\n\n<Note>The cursor is opaque: pass `nextCursor` back unchanged, with the same `orderBy`, and never parse or build one. A cursor reused after the sort changes is refused with `400 invalid_cursor`: start again from the first page. A contact id sent as the cursor, which is what `nextCursor` used to be, is still accepted.</Note>"}},"post":{"tags":["contacts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"full_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"job_title":{"anyOf":[{"type":"string"},{"type":"null"}]},"legacy_location":{"anyOf":[{"type":"string"},{"type":"null"}]},"company":{"anyOf":[{"type":"string"},{"type":"null"}]},"education":{"anyOf":[{"type":"string"},{"type":"null"}]},"starred":{"type":"boolean"},"source":{"type":"string","enum":["linkedin_sync","facebook_import","cal_ingest","email_ingest","web_import","csv_import","whatsapp_sync","imessage_sync","phone_calls_sync","mobile","mobile_import","instagram_sync","oauth_interaction","granola_sync"]},"coordinates":{"type":"object","properties":{"operation":{"type":"string","enum":["set","delete"]},"data":{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180}},"additionalProperties":false}},"required":["operation"],"additionalProperties":false},"priority_tier":{"anyOf":[{"type":"integer","minimum":1,"maximum":32767},{"type":"null"}]},"image_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"image_source":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"business_card_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"website":{"anyOf":[{},{"type":"null"}]},"birthday":{"anyOf":[{"type":"string","format":"date","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])))$"},{"type":"null"}]},"birthday_year":{"anyOf":[{"type":"number","minimum":1900,"maximum":2100},{"type":"null"}]},"frequency":{"anyOf":[{"type":"string"},{"type":"null"}]},"last_seen_at":{"anyOf":[{},{"type":"null"}]},"first_met_at":{"anyOf":[{},{"type":"null"}]},"never_keep_in_touch":{"type":"boolean"},"next_reminder_at":{},"linkedin":{"anyOf":[{"type":"string"},{"type":"null"}]},"twitter":{"anyOf":[{"type":"string"},{"type":"null"}]},"facebook":{"anyOf":[{"type":"string"},{"type":"null"}]},"instagram":{"anyOf":[{"type":"string"},{"type":"null"}]},"telegram":{"anyOf":[{"type":"string"},{"type":"null"}]},"tiktok":{"anyOf":[{"type":"string"},{"type":"null"}]},"youtube":{"anyOf":[{"type":"string"},{"type":"null"}]},"whatsapp_message_link":{"type":"string"},"whatsapp_message_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"whatsapp_last_message_at":{"anyOf":[{},{"type":"null"}]},"imessage_message_link":{"type":"string"},"imessage_message_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"imessage_last_message_at":{"anyOf":[{},{"type":"null"}]},"linkedin_message_link":{"type":"string","maxLength":600},"linkedin_last_message_snippet":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"linkedin_last_message_at":{"anyOf":[{},{"type":"null"}]},"linkedin_data":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"instagram_message_link":{"type":"string"},"instagram_message_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"instagram_last_message_at":{"anyOf":[{},{"type":"null"}]},"gmail_last_interaction_at":{"anyOf":[{},{"type":"null"}]},"gmail_last_interaction_provider_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"gmail_last_interaction_subject":{"anyOf":[{"type":"string"},{"type":"null"}]},"gmail_last_interaction_provider":{"anyOf":[{"type":"string","enum":["GOOGLE","OFFICE365"]},{"type":"null"}]},"gcal_last_interaction_at":{"anyOf":[{},{"type":"null"}]},"gcal_last_interaction_provider_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"gcal_last_interaction_title":{"anyOf":[{"type":"string"},{"type":"null"}]},"gcal_last_interaction_provider":{"anyOf":[{"type":"string","enum":["GOOGLE","OFFICE365"]},{"type":"null"}]},"phone_call_last_interaction_at":{"anyOf":[{},{"type":"null"}]},"phone_call_interaction_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"web_search_summary":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{"formatted":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false}},"contact_emails":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","maxLength":320},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"ranking":{"type":"number"}},"required":["email"],"additionalProperties":false}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{"phone_number":{"type":"string","maxLength":50},"country_code":{"anyOf":[{"type":"string","maxLength":4},{"type":"null"}]},"phone_number_sanitized":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}]},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"ranking":{"type":"number"}},"required":["phone_number"],"additionalProperties":false}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{"group_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["group_id"],"additionalProperties":false}},"tags_contacts":{"type":"array","items":{"type":"object","properties":{"tag_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["tag_id"],"additionalProperties":false}},"custom_fields":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["input"]},"text_value":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"custom_field":{}},"required":["id","type","text_value"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["autocomplete"]},"text_value":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"custom_field":{}},"required":["id","type","text_value"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["datepicker"]},"text_value":{"anyOf":[{"type":"string"},{"type":"null"}]},"date_value":{"anyOf":[{},{"type":"null"}]},"custom_field":{}},"required":["id","type"],"additionalProperties":false}]}},"contact_birthdays":{"type":"object","properties":{"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"last_dismissal_year":{"type":"number","minimum":1900,"maximum":2100}},"additionalProperties":false},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","not":{"enum":["00000000-0000-0000-0000-000000000000"]}},"related_contacts":{"type":"array","items":{"type":"object","properties":{"destination":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"source_contact":{},"destination_contact":{}},"required":["destination"],"additionalProperties":false}}},"additionalProperties":false}}}},"responses":{"201":{"description":"Created","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"contact":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"full_name":{"nullable":true,"type":"string"},"description":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"},"company":{"nullable":true,"type":"string"},"education":{"nullable":true,"type":"string"},"legacy_location":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"business_card_url":{"nullable":true,"type":"string"},"website":{"nullable":true,"type":"string"},"image_source":{"nullable":true,"type":"string"},"birthday":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"birthday_year":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"linkedin":{"nullable":true,"type":"string"},"twitter":{"nullable":true,"type":"string"},"facebook":{"nullable":true,"type":"string"},"instagram":{"nullable":true,"type":"string"},"telegram":{"nullable":true,"type":"string"},"tiktok":{"nullable":true,"type":"string"},"youtube":{"nullable":true,"type":"string"},"starred":{"type":"boolean"},"is_archived":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"source":{"type":"string"},"priority_tier":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"frequency":{"nullable":true,"type":"string"},"frequency_text":{"nullable":true,"type":"string"},"last_seen_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"last_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_met_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_companies":{"nullable":true,"type":"string"},"linkedin_education":{"nullable":true,"type":"string"},"linkedin_enhance_date":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_snippet":{"nullable":true,"type":"string"},"linkedin_message_link":{"nullable":true,"type":"string"},"linkedin_urn":{"nullable":true,"type":"string"},"linkedin_headline":{"nullable":true,"type":"string"},"whatsapp_message_link":{"nullable":true,"type":"string"},"whatsapp_message_snippet":{"nullable":true,"type":"string"},"whatsapp_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"imessage_message_link":{"nullable":true,"type":"string"},"imessage_message_snippet":{"nullable":true,"type":"string"},"imessage_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"instagram_message_link":{"nullable":true,"type":"string"},"instagram_message_snippet":{"nullable":true,"type":"string"},"instagram_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gmail_last_interaction_provider_id":{"nullable":true,"type":"string"},"gmail_last_interaction_subject":{"nullable":true,"type":"string"},"gcal_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gcal_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gcal_last_interaction_provider_id":{"nullable":true,"type":"string"},"gcal_last_interaction_title":{"nullable":true,"type":"string"},"phone_call_interaction_snippet":{"nullable":true,"type":"string"},"phone_call_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"web_search_summary":{"nullable":true},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"geocode_attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"geocode_failed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false},"frequency_interval":{},"linkedin_data":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"latitude":{"nullable":true,"type":"number"},"longitude":{"nullable":true,"type":"number"},"last_note":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"preview":{"type":"string"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"}},"required":["id","preview","event_time","emoji","meeting_type"],"additionalProperties":false},"team_keep_in_touch":{"nullable":true,"type":"object","properties":{"cadence_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["cadence_id","frequency_id","days","next_due_at","snoozed_until"],"additionalProperties":false},"contact_emails":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_birthdays":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contact_locations":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contacts_custom_fields":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"tags_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_sourceTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_destinationTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"feed_items":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"keep_in_touch_reminders":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"required":["contact"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createContactV2","summary":"Create a contact (v2)","description":"Create ONE contact. The common case — TanStack DB optimistic mutations, mobile add-contact, MCP tools. **Requires `Idempotency-Key`.** Returns `{ data: { contact: {...} } }` with status 201. For bulk create, use `POST /v2/contacts/batch`.","x-mint":{"content":"## Use cases\n\n- Add a contact from a profile page\n- Create from social lookup or LinkedIn enrichment\n- MCP `create_contact` tool\n\n## Migration from /v1\n\n/v1 only had `POST /v1/contacts/` which always took an array of contacts. /v2 splits this: `POST /v2/contacts` for ONE contact (the common case), `POST /v2/contacts/batch` for many. Less awkward call sites for the single-contact create path.\n\n## Idempotency\n\nGenerate one UUID per logical create operation and reuse it on every retry. TanStack DB collections pass `mutationId` directly."},"parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}]}},"/v2/contacts/count":{"get":{"tags":["contacts"],"parameters":[{"schema":{"type":"object","properties":{"in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Match contacts whose id is in this set (single id or array)."},"not_in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Exclude contacts whose id is in this set (single id or array)."},"ignore_merge":{"type":"boolean","description":"Filter by the `ignore_merge` flag (excluded from merge suggestions)."},"is_starred":{"type":"boolean","description":"Match starred (true) or non-starred (false) contacts."},"is_team_overdue":{"type":"boolean","description":"Workspace only. true: the Team cadence is overdue; false: the Team cadence exists and is not overdue. Contacts with no Team cadence match neither."},"is_my_overdue":{"type":"boolean","description":"Workspace only. true: the caller's cadence is overdue; false: the caller's cadence exists and is not overdue. Contacts the caller has no cadence on match neither."},"is_archived":{"type":"boolean","description":"Match archived (true) or active (false) contacts. Defaults to false when omitted."},"has_priority_tier":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"type":"array","items":{"type":"integer","minimum":1,"maximum":9007199254740991}},{"type":"boolean"}],"description":"Relationship priority tier: a tier number, an array of tiers (OR), or a boolean (true = any tier set, false = none)."},"has_linkedin":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"LinkedIn slug: an exact slug string, or a boolean for presence/absence of a LinkedIn handle."},"has_instagram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Instagram slug: an exact slug string, or a boolean for presence/absence of an Instagram handle."},"has_twitter":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Twitter/X slug: an exact slug string, or a boolean for presence/absence of a Twitter handle."},"has_facebook":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Facebook slug: an exact slug string, or a boolean for presence/absence of a Facebook profile."},"has_telegram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Telegram slug: an exact slug string, or a boolean for presence/absence of a Telegram handle."},"has_tiktok":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"TikTok slug: an exact slug string, or a boolean for presence/absence of a TikTok handle."},"has_youtube":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"YouTube slug: an exact slug string, or a boolean for presence/absence of a YouTube channel."},"has_source":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Contact source: a single source string or an array of sources (OR)."},"has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Full name: a bare string (fuzzy contains), an array of exact names, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_groups":{"anyOf":[{"type":"object","properties":{"not":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["not"],"additionalProperties":false},{"type":"boolean"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string"}}],"description":"Group membership: a group id, an array of group ids (OR), a boolean for any/no group, or `{ not }` to exclude group id(s)."},"has_user_created_groups":{"type":"boolean","description":"Non-system group membership: true for at least one user-created group; false for no user-created groups, including contacts with zero memberships or only Dex system-group memberships."},"has_grouping_signal":{"type":"boolean","description":"Internal organize prefilter: title, company, location, or LinkedIn summary is non-null and non-empty. Whitespace-only values are removed by the organize serializer.","enum":[true]},"has_groups_all":{"description":"Array of group-id rows: AND across rows, OR within each row (contact must be in at least one group from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_groups_only":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Exclusive group membership: the contact is in at least one of these group ids and in no group outside them. Contacts with no group never match."},"has_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Keep-in-touch cadence: a frequency string, or a boolean for presence/absence of a cadence."},"has_my_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Workspace only. The caller's own keep-in-touch cadence: a workspace frequency id, or a boolean for presence/absence of the caller's cadence."},"known_by":{"type":"string","minLength":1,"maxLength":128,"description":"Workspace only. An active member's user id: contacts that member has a known email, calendar or shared-note interaction with. For the caller's own id, their private notes count too."},"has_location":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Location: a string (fuzzy, accent-insensitive match), or a boolean for presence/absence of a location."},"has_location_exact":{"type":"string","description":"Location: exact string match (not fuzzy)."},"has_job_title":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Job title: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_never_keep_in_touch":{"type":"boolean","description":"Filter by the `never_keep_in_touch` flag."},"has_created_at":{"description":"Creation-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_updated_at":{"description":"Last-updated-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_next_due":{"description":"Workspace only. Team keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts with no Team cadence never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_my_next_due":{"description":"Workspace only. The caller's own keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts the caller has no cadence on never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_last_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Workspace only. The team's last interaction date, the one the \"Last team interaction\" sort orders by (the latest email, calendar event or shared note any member has with the contact): a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range (at least one bound, at most microsecond precision). Contacts with no team interaction never match a range."},"has_birthday":{"anyOf":[{"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))$"},{},{"type":"boolean"}],"description":"Birthday: a specific date (matches on day + month), or true for any birthday set."},"has_tag":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Match contacts carrying this single tag id."},"has_tags":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"type":"object","properties":{"not":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}]}},"required":["not"],"additionalProperties":false}],"description":"Tags: an array of tag ids (OR), or `{ not }` to exclude tag id(s)."},"has_tags_all":{"description":"Array of tag-id rows: AND across rows, OR within each row (contact must carry at least one tag from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_company":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Company: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Education: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_description":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Description/notes: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn companies text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn education text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_email":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one email."},"has_phone_number":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one phone number."},"not_has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose full name fuzzily matches this string / any of these strings."},"not_has_company":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose company fuzzily matches this string / any of these strings."},"not_has_job_title":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose job title fuzzily matches this string / any of these strings."},"not_has_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose education fuzzily matches this string / any of these strings."},"not_has_description":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose description fuzzily matches this string / any of these strings."},"not_has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn companies text fuzzily matches this string / any of these strings."},"not_has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn education text fuzzily matches this string / any of these strings."},"has_linkedin_last_message_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"LinkedIn last-message time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_last_seen_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Last-seen (last interaction) time — alias for has_interaction: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_distance":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"},"meters":{"type":"number"},"label":{"type":"string"}},"required":["lat","lon","meters"],"additionalProperties":false,"description":"Geo radius filter: contacts within `meters` of `{ lat, lon }` (PostGIS ST_DWithin on geocoded coordinates). `label` is an optional display name for the point."},"has_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Interaction (last-seen) time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_next_reminder":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Next-reminder time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"custom_fields":{"minItems":1,"type":"array","items":{"type":"object","properties":{"field_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"operator":{"type":"string","enum":["contains","eq","in","not_in","present","absent","gte","lte"]},"value":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["field_id","operator"],"additionalProperties":false},"description":"User-defined custom-field filters. Each clause is `{ field_id, operator, value? }`; multiple clauses AND together. Operators: contains, eq, in, not_in, present, absent, gte, lte."},"_or":{"description":"Compound-OR escape hatch: an array of filter branches combined with OR, each ANDed with the top-level keys. One level deep — branches cannot themselves contain `_or`.","minItems":1,"type":"array","items":{"type":"object","properties":{"in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Match contacts whose id is in this set (single id or array)."},"not_in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Exclude contacts whose id is in this set (single id or array)."},"ignore_merge":{"type":"boolean","description":"Filter by the `ignore_merge` flag (excluded from merge suggestions)."},"is_starred":{"type":"boolean","description":"Match starred (true) or non-starred (false) contacts."},"is_team_overdue":{"type":"boolean","description":"Workspace only. true: the Team cadence is overdue; false: the Team cadence exists and is not overdue. Contacts with no Team cadence match neither."},"is_my_overdue":{"type":"boolean","description":"Workspace only. true: the caller's cadence is overdue; false: the caller's cadence exists and is not overdue. Contacts the caller has no cadence on match neither."},"is_archived":{"type":"boolean","description":"Match archived (true) or active (false) contacts. Defaults to false when omitted."},"has_priority_tier":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"type":"array","items":{"type":"integer","minimum":1,"maximum":9007199254740991}},{"type":"boolean"}],"description":"Relationship priority tier: a tier number, an array of tiers (OR), or a boolean (true = any tier set, false = none)."},"has_linkedin":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"LinkedIn slug: an exact slug string, or a boolean for presence/absence of a LinkedIn handle."},"has_instagram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Instagram slug: an exact slug string, or a boolean for presence/absence of an Instagram handle."},"has_twitter":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Twitter/X slug: an exact slug string, or a boolean for presence/absence of a Twitter handle."},"has_facebook":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Facebook slug: an exact slug string, or a boolean for presence/absence of a Facebook profile."},"has_telegram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Telegram slug: an exact slug string, or a boolean for presence/absence of a Telegram handle."},"has_tiktok":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"TikTok slug: an exact slug string, or a boolean for presence/absence of a TikTok handle."},"has_youtube":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"YouTube slug: an exact slug string, or a boolean for presence/absence of a YouTube channel."},"has_source":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Contact source: a single source string or an array of sources (OR)."},"has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Full name: a bare string (fuzzy contains), an array of exact names, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_groups":{"anyOf":[{"type":"object","properties":{"not":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["not"],"additionalProperties":false},{"type":"boolean"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string"}}],"description":"Group membership: a group id, an array of group ids (OR), a boolean for any/no group, or `{ not }` to exclude group id(s)."},"has_user_created_groups":{"type":"boolean","description":"Non-system group membership: true for at least one user-created group; false for no user-created groups, including contacts with zero memberships or only Dex system-group memberships."},"has_grouping_signal":{"type":"boolean","description":"Internal organize prefilter: title, company, location, or LinkedIn summary is non-null and non-empty. Whitespace-only values are removed by the organize serializer.","enum":[true]},"has_groups_all":{"description":"Array of group-id rows: AND across rows, OR within each row (contact must be in at least one group from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_groups_only":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Exclusive group membership: the contact is in at least one of these group ids and in no group outside them. Contacts with no group never match."},"has_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Keep-in-touch cadence: a frequency string, or a boolean for presence/absence of a cadence."},"has_my_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Workspace only. The caller's own keep-in-touch cadence: a workspace frequency id, or a boolean for presence/absence of the caller's cadence."},"known_by":{"type":"string","minLength":1,"maxLength":128,"description":"Workspace only. An active member's user id: contacts that member has a known email, calendar or shared-note interaction with. For the caller's own id, their private notes count too."},"has_location":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Location: a string (fuzzy, accent-insensitive match), or a boolean for presence/absence of a location."},"has_location_exact":{"type":"string","description":"Location: exact string match (not fuzzy)."},"has_job_title":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Job title: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_never_keep_in_touch":{"type":"boolean","description":"Filter by the `never_keep_in_touch` flag."},"has_created_at":{"description":"Creation-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_updated_at":{"description":"Last-updated-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_next_due":{"description":"Workspace only. Team keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts with no Team cadence never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_my_next_due":{"description":"Workspace only. The caller's own keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts the caller has no cadence on never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_last_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Workspace only. The team's last interaction date, the one the \"Last team interaction\" sort orders by (the latest email, calendar event or shared note any member has with the contact): a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range (at least one bound, at most microsecond precision). Contacts with no team interaction never match a range."},"has_birthday":{"anyOf":[{"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))$"},{},{"type":"boolean"}],"description":"Birthday: a specific date (matches on day + month), or true for any birthday set."},"has_tag":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Match contacts carrying this single tag id."},"has_tags":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"type":"object","properties":{"not":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}]}},"required":["not"],"additionalProperties":false}],"description":"Tags: an array of tag ids (OR), or `{ not }` to exclude tag id(s)."},"has_tags_all":{"description":"Array of tag-id rows: AND across rows, OR within each row (contact must carry at least one tag from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_company":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Company: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Education: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_description":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Description/notes: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn companies text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn education text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_email":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one email."},"has_phone_number":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one phone number."},"not_has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose full name fuzzily matches this string / any of these strings."},"not_has_company":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose company fuzzily matches this string / any of these strings."},"not_has_job_title":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose job title fuzzily matches this string / any of these strings."},"not_has_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose education fuzzily matches this string / any of these strings."},"not_has_description":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose description fuzzily matches this string / any of these strings."},"not_has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn companies text fuzzily matches this string / any of these strings."},"not_has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn education text fuzzily matches this string / any of these strings."},"has_linkedin_last_message_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"LinkedIn last-message time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_last_seen_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Last-seen (last interaction) time — alias for has_interaction: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_distance":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"},"meters":{"type":"number"},"label":{"type":"string"}},"required":["lat","lon","meters"],"additionalProperties":false,"description":"Geo radius filter: contacts within `meters` of `{ lat, lon }` (PostGIS ST_DWithin on geocoded coordinates). `label` is an optional display name for the point."},"has_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Interaction (last-seen) time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_next_reminder":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Next-reminder time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"custom_fields":{"minItems":1,"type":"array","items":{"type":"object","properties":{"field_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"operator":{"type":"string","enum":["contains","eq","in","not_in","present","absent","gte","lte"]},"value":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["field_id","operator"],"additionalProperties":false},"description":"User-defined custom-field filters. Each clause is `{ field_id, operator, value? }`; multiple clauses AND together. Operators: contains, eq, in, not_in, present, absent, gte, lte."}},"additionalProperties":false}}},"additionalProperties":false},"in":"query","name":"where","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["count"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"countContactsV2","summary":"Count contacts (v2)","description":"Return the count of contacts matching the optional `where` filter. Returns `{ data: { count } }`.","x-mint":{"content":"## Use cases\n\n- Display total contact count in the UI\n- Power \"X contacts\" labels on filtered views\n- Show filter-result counts before fetching the list"}}},"/v2/contacts/filter":{"post":{"tags":["contacts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"take":{"type":"integer","minimum":1,"maximum":9007199254740991},"skip":{"type":"integer","minimum":0,"maximum":9007199254740991},"cursor":{"type":"string","minLength":1,"maxLength":2048,"description":"Opaque pagination cursor: the `nextCursor` of the previous page, passed back unchanged."},"where":{"type":"object","properties":{"in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Match contacts whose id is in this set (single id or array)."},"not_in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Exclude contacts whose id is in this set (single id or array)."},"ignore_merge":{"type":"boolean","description":"Filter by the `ignore_merge` flag (excluded from merge suggestions)."},"is_starred":{"type":"boolean","description":"Match starred (true) or non-starred (false) contacts."},"is_team_overdue":{"type":"boolean","description":"Workspace only. true: the Team cadence is overdue; false: the Team cadence exists and is not overdue. Contacts with no Team cadence match neither."},"is_my_overdue":{"type":"boolean","description":"Workspace only. true: the caller's cadence is overdue; false: the caller's cadence exists and is not overdue. Contacts the caller has no cadence on match neither."},"is_archived":{"type":"boolean","description":"Match archived (true) or active (false) contacts. Defaults to false when omitted."},"has_priority_tier":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"type":"array","items":{"type":"integer","minimum":1,"maximum":9007199254740991}},{"type":"boolean"}],"description":"Relationship priority tier: a tier number, an array of tiers (OR), or a boolean (true = any tier set, false = none)."},"has_linkedin":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"LinkedIn slug: an exact slug string, or a boolean for presence/absence of a LinkedIn handle."},"has_instagram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Instagram slug: an exact slug string, or a boolean for presence/absence of an Instagram handle."},"has_twitter":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Twitter/X slug: an exact slug string, or a boolean for presence/absence of a Twitter handle."},"has_facebook":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Facebook slug: an exact slug string, or a boolean for presence/absence of a Facebook profile."},"has_telegram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Telegram slug: an exact slug string, or a boolean for presence/absence of a Telegram handle."},"has_tiktok":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"TikTok slug: an exact slug string, or a boolean for presence/absence of a TikTok handle."},"has_youtube":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"YouTube slug: an exact slug string, or a boolean for presence/absence of a YouTube channel."},"has_source":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Contact source: a single source string or an array of sources (OR)."},"has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Full name: a bare string (fuzzy contains), an array of exact names, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_groups":{"anyOf":[{"type":"object","properties":{"not":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["not"],"additionalProperties":false},{"type":"boolean"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string"}}],"description":"Group membership: a group id, an array of group ids (OR), a boolean for any/no group, or `{ not }` to exclude group id(s)."},"has_user_created_groups":{"type":"boolean","description":"Non-system group membership: true for at least one user-created group; false for no user-created groups, including contacts with zero memberships or only Dex system-group memberships."},"has_grouping_signal":{"type":"boolean","description":"Internal organize prefilter: title, company, location, or LinkedIn summary is non-null and non-empty. Whitespace-only values are removed by the organize serializer.","enum":[true]},"has_groups_all":{"description":"Array of group-id rows: AND across rows, OR within each row (contact must be in at least one group from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_groups_only":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Exclusive group membership: the contact is in at least one of these group ids and in no group outside them. Contacts with no group never match."},"has_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Keep-in-touch cadence: a frequency string, or a boolean for presence/absence of a cadence."},"has_my_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Workspace only. The caller's own keep-in-touch cadence: a workspace frequency id, or a boolean for presence/absence of the caller's cadence."},"known_by":{"type":"string","minLength":1,"maxLength":128,"description":"Workspace only. An active member's user id: contacts that member has a known email, calendar or shared-note interaction with. For the caller's own id, their private notes count too."},"has_location":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Location: a string (fuzzy, accent-insensitive match), or a boolean for presence/absence of a location."},"has_location_exact":{"type":"string","description":"Location: exact string match (not fuzzy)."},"has_job_title":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Job title: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_never_keep_in_touch":{"type":"boolean","description":"Filter by the `never_keep_in_touch` flag."},"has_created_at":{"description":"Creation-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_updated_at":{"description":"Last-updated-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_next_due":{"description":"Workspace only. Team keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts with no Team cadence never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_my_next_due":{"description":"Workspace only. The caller's own keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts the caller has no cadence on never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_last_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Workspace only. The team's last interaction date, the one the \"Last team interaction\" sort orders by (the latest email, calendar event or shared note any member has with the contact): a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range (at least one bound, at most microsecond precision). Contacts with no team interaction never match a range."},"has_birthday":{"anyOf":[{"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))$"},{},{"type":"boolean"}],"description":"Birthday: a specific date (matches on day + month), or true for any birthday set."},"has_tag":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Match contacts carrying this single tag id."},"has_tags":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"type":"object","properties":{"not":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}]}},"required":["not"],"additionalProperties":false}],"description":"Tags: an array of tag ids (OR), or `{ not }` to exclude tag id(s)."},"has_tags_all":{"description":"Array of tag-id rows: AND across rows, OR within each row (contact must carry at least one tag from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_company":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Company: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Education: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_description":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Description/notes: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn companies text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn education text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_email":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one email."},"has_phone_number":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one phone number."},"not_has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose full name fuzzily matches this string / any of these strings."},"not_has_company":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose company fuzzily matches this string / any of these strings."},"not_has_job_title":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose job title fuzzily matches this string / any of these strings."},"not_has_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose education fuzzily matches this string / any of these strings."},"not_has_description":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose description fuzzily matches this string / any of these strings."},"not_has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn companies text fuzzily matches this string / any of these strings."},"not_has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn education text fuzzily matches this string / any of these strings."},"has_linkedin_last_message_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"LinkedIn last-message time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_last_seen_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Last-seen (last interaction) time — alias for has_interaction: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_distance":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"},"meters":{"type":"number"},"label":{"type":"string"}},"required":["lat","lon","meters"],"additionalProperties":false,"description":"Geo radius filter: contacts within `meters` of `{ lat, lon }` (PostGIS ST_DWithin on geocoded coordinates). `label` is an optional display name for the point."},"has_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Interaction (last-seen) time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_next_reminder":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Next-reminder time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"custom_fields":{"minItems":1,"type":"array","items":{"type":"object","properties":{"field_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"operator":{"type":"string","enum":["contains","eq","in","not_in","present","absent","gte","lte"]},"value":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["field_id","operator"],"additionalProperties":false},"description":"User-defined custom-field filters. Each clause is `{ field_id, operator, value? }`; multiple clauses AND together. Operators: contains, eq, in, not_in, present, absent, gte, lte."},"_or":{"description":"Compound-OR escape hatch: an array of filter branches combined with OR, each ANDed with the top-level keys. One level deep — branches cannot themselves contain `_or`.","minItems":1,"type":"array","items":{"type":"object","properties":{"in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Match contacts whose id is in this set (single id or array)."},"not_in":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}],"description":"Exclude contacts whose id is in this set (single id or array)."},"ignore_merge":{"type":"boolean","description":"Filter by the `ignore_merge` flag (excluded from merge suggestions)."},"is_starred":{"type":"boolean","description":"Match starred (true) or non-starred (false) contacts."},"is_team_overdue":{"type":"boolean","description":"Workspace only. true: the Team cadence is overdue; false: the Team cadence exists and is not overdue. Contacts with no Team cadence match neither."},"is_my_overdue":{"type":"boolean","description":"Workspace only. true: the caller's cadence is overdue; false: the caller's cadence exists and is not overdue. Contacts the caller has no cadence on match neither."},"is_archived":{"type":"boolean","description":"Match archived (true) or active (false) contacts. Defaults to false when omitted."},"has_priority_tier":{"anyOf":[{"type":"integer","minimum":1,"maximum":9007199254740991},{"type":"array","items":{"type":"integer","minimum":1,"maximum":9007199254740991}},{"type":"boolean"}],"description":"Relationship priority tier: a tier number, an array of tiers (OR), or a boolean (true = any tier set, false = none)."},"has_linkedin":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"LinkedIn slug: an exact slug string, or a boolean for presence/absence of a LinkedIn handle."},"has_instagram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Instagram slug: an exact slug string, or a boolean for presence/absence of an Instagram handle."},"has_twitter":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Twitter/X slug: an exact slug string, or a boolean for presence/absence of a Twitter handle."},"has_facebook":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Facebook slug: an exact slug string, or a boolean for presence/absence of a Facebook profile."},"has_telegram":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Telegram slug: an exact slug string, or a boolean for presence/absence of a Telegram handle."},"has_tiktok":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"TikTok slug: an exact slug string, or a boolean for presence/absence of a TikTok handle."},"has_youtube":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"YouTube slug: an exact slug string, or a boolean for presence/absence of a YouTube channel."},"has_source":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Contact source: a single source string or an array of sources (OR)."},"has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Full name: a bare string (fuzzy contains), an array of exact names, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_groups":{"anyOf":[{"type":"object","properties":{"not":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["not"],"additionalProperties":false},{"type":"boolean"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string"}}],"description":"Group membership: a group id, an array of group ids (OR), a boolean for any/no group, or `{ not }` to exclude group id(s)."},"has_user_created_groups":{"type":"boolean","description":"Non-system group membership: true for at least one user-created group; false for no user-created groups, including contacts with zero memberships or only Dex system-group memberships."},"has_grouping_signal":{"type":"boolean","description":"Internal organize prefilter: title, company, location, or LinkedIn summary is non-null and non-empty. Whitespace-only values are removed by the organize serializer.","enum":[true]},"has_groups_all":{"description":"Array of group-id rows: AND across rows, OR within each row (contact must be in at least one group from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_groups_only":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"description":"Exclusive group membership: the contact is in at least one of these group ids and in no group outside them. Contacts with no group never match."},"has_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Keep-in-touch cadence: a frequency string, or a boolean for presence/absence of a cadence."},"has_my_frequency":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Workspace only. The caller's own keep-in-touch cadence: a workspace frequency id, or a boolean for presence/absence of the caller's cadence."},"known_by":{"type":"string","minLength":1,"maxLength":128,"description":"Workspace only. An active member's user id: contacts that member has a known email, calendar or shared-note interaction with. For the caller's own id, their private notes count too."},"has_location":{"anyOf":[{"type":"string"},{"type":"boolean"}],"description":"Location: a string (fuzzy, accent-insensitive match), or a boolean for presence/absence of a location."},"has_location_exact":{"type":"string","description":"Location: exact string match (not fuzzy)."},"has_job_title":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Job title: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_never_keep_in_touch":{"type":"boolean","description":"Filter by the `never_keep_in_touch` flag."},"has_created_at":{"description":"Creation-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_updated_at":{"description":"Last-updated-date range: `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required).","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_next_due":{"description":"Workspace only. Team keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts with no Team cadence never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_my_next_due":{"description":"Workspace only. The caller's own keep-in-touch next-due range (a snooze counts as the due date): `{ gte?, lte? }` ISO 8601 datetimes (at least one bound required). Contacts the caller has no cadence on never match.","type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false},"has_team_last_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Workspace only. The team's last interaction date, the one the \"Last team interaction\" sort orders by (the latest email, calendar event or shared note any member has with the contact): a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range (at least one bound, at most microsecond precision). Contacts with no team interaction never match a range."},"has_birthday":{"anyOf":[{"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))$"},{},{"type":"boolean"}],"description":"Birthday: a specific date (matches on day + month), or true for any birthday set."},"has_tag":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Match contacts carrying this single tag id."},"has_tags":{"anyOf":[{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"type":"object","properties":{"not":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}]}},"required":["not"],"additionalProperties":false}],"description":"Tags: an array of tag ids (OR), or `{ not }` to exclude tag id(s)."},"has_tags_all":{"description":"Array of tag-id rows: AND across rows, OR within each row (contact must carry at least one tag from every row).","type":"array","items":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"has_company":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Company: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }` for explicit fuzzy vs exact match."},"has_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Education: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_description":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"Description/notes: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn companies text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"boolean"},{"anyOf":[{"type":"object","properties":{"contains":{"type":"string","minLength":1}},"required":["contains"],"additionalProperties":false},{"type":"object","properties":{"eq":{"type":"string"}},"required":["eq"],"additionalProperties":false}]}],"description":"LinkedIn education text: a bare string (fuzzy contains), a boolean for presence/absence, or `{ contains }` / `{ eq }`."},"has_email":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one email."},"has_phone_number":{"type":"boolean","description":"Match contacts that have (true) or lack (false) at least one phone number."},"not_has_name":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose full name fuzzily matches this string / any of these strings."},"not_has_company":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose company fuzzily matches this string / any of these strings."},"not_has_job_title":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose job title fuzzily matches this string / any of these strings."},"not_has_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose education fuzzily matches this string / any of these strings."},"not_has_description":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose description fuzzily matches this string / any of these strings."},"not_has_linkedin_companies":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn companies text fuzzily matches this string / any of these strings."},"not_has_linkedin_education":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"Exclude contacts whose LinkedIn education text fuzzily matches this string / any of these strings."},"has_linkedin_last_message_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"LinkedIn last-message time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_last_seen_at":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Last-seen (last interaction) time — alias for has_interaction: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_distance":{"type":"object","properties":{"lat":{"type":"number"},"lon":{"type":"number"},"meters":{"type":"number"},"label":{"type":"string"}},"required":["lat","lon","meters"],"additionalProperties":false,"description":"Geo radius filter: contacts within `meters` of `{ lat, lon }` (PostGIS ST_DWithin on geocoded coordinates). `label` is an optional display name for the point."},"has_interaction":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Interaction (last-seen) time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"has_next_reminder":{"anyOf":[{"type":"boolean"},{"type":"object","properties":{"gte":{"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))$"},"lte":{"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))$"}},"additionalProperties":false}],"description":"Next-reminder time: a boolean for presence/absence, or a `{ gte?, lte? }` ISO 8601 range."},"custom_fields":{"minItems":1,"type":"array","items":{"type":"object","properties":{"field_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"operator":{"type":"string","enum":["contains","eq","in","not_in","present","absent","gte","lte"]},"value":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"required":["field_id","operator"],"additionalProperties":false},"description":"User-defined custom-field filters. Each clause is `{ field_id, operator, value? }`; multiple clauses AND together. Operators: contains, eq, in, not_in, present, absent, gte, lte."}},"additionalProperties":false}}},"additionalProperties":false},"orderBy":{},"include":{"type":"object","properties":{"linkedin_data":{"type":"boolean"},"web_search_summary":{"type":"boolean"},"groups_count":{"type":"boolean"},"coordinates":{"type":"boolean"},"last_note":{"type":"boolean"},"contact_emails":{"type":"boolean"},"contact_phone_numbers":{"type":"boolean"},"contact_birthdays":{"type":"boolean"},"contact_locations":{"type":"boolean"},"contacts_custom_fields":{"type":"boolean"},"legacy_contact_addresses":{"type":"boolean"},"groups_contacts":{"type":"boolean"},"tags_contacts":{"type":"boolean"},"timeline_items_contacts":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"feed_items":{"type":"boolean"},"keep_in_touch_reminders":{"type":"boolean"},"contact_relations_contact_relations_sourceTocontacts":{"type":"boolean"},"contact_relations_contact_relations_destinationTocontacts":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["linkedin_data","web_search_summary","groups_count","coordinates","last_note","contact_emails","contact_phone_numbers","contact_birthdays","contact_locations","contacts_custom_fields","legacy_contact_addresses","groups_contacts","tags_contacts","timeline_items_contacts","reminders_contacts","feed_items","keep_in_touch_reminders","contact_relations_contact_relations_sourceTocontacts","contact_relations_contact_relations_destinationTocontacts"]}},"select":{"type":"object","properties":{"linkedin_data":{"type":"boolean"},"web_search_summary":{"type":"boolean"},"groups_count":{"type":"boolean"},"coordinates":{"type":"boolean"},"last_note":{"type":"boolean"},"id":{"type":"boolean"},"user_id":{"type":"boolean"},"first_name":{"type":"boolean"},"last_name":{"type":"boolean"},"description":{"type":"boolean"},"birthday":{"type":"boolean"},"legacy_location":{"type":"boolean"},"education":{"type":"boolean"},"job_title":{"type":"boolean"},"company":{"type":"boolean"},"image_source":{"type":"boolean"},"image_url":{"type":"boolean"},"starred":{"type":"boolean"},"last_seen_at":{"type":"boolean"},"last_reminder_at":{"type":"boolean"},"first_met_at":{"type":"boolean"},"first_interaction_at":{"type":"boolean"},"facebook":{"type":"boolean"},"linkedin":{"type":"boolean"},"twitter":{"type":"boolean"},"instagram":{"type":"boolean"},"created_at":{"type":"boolean"},"updated_at":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"telegram":{"type":"boolean"},"website":{"type":"boolean"},"next_reminder_at":{"type":"boolean"},"source":{"type":"boolean"},"is_archived":{"type":"boolean"},"birthday_year":{"type":"boolean"},"linkedin_enhance_date":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"geocode_attempts":{"type":"boolean"},"geocode_failed_at":{"type":"boolean"},"full_name":{"type":"boolean"},"business_card_url":{"type":"boolean"},"linkedin_companies":{"type":"boolean"},"linkedin_education":{"type":"boolean"},"linkedin_last_message_at":{"type":"boolean"},"linkedin_last_message_snippet":{"type":"boolean"},"linkedin_message_link":{"type":"boolean"},"linkedin_urn":{"type":"boolean"},"linkedin_headline":{"type":"boolean"},"whatsapp_message_link":{"type":"boolean"},"whatsapp_message_snippet":{"type":"boolean"},"whatsapp_last_message_at":{"type":"boolean"},"frequency_text":{"type":"boolean"},"imessage_message_link":{"type":"boolean"},"imessage_message_snippet":{"type":"boolean"},"imessage_last_message_at":{"type":"boolean"},"instagram_message_link":{"type":"boolean"},"instagram_message_snippet":{"type":"boolean"},"instagram_last_message_at":{"type":"boolean"},"gmail_last_interaction_at":{"type":"boolean"},"gcal_last_interaction_at":{"type":"boolean"},"gmail_last_interaction_provider_id":{"type":"boolean"},"gcal_last_interaction_provider_id":{"type":"boolean"},"gmail_last_interaction_subject":{"type":"boolean"},"gcal_last_interaction_title":{"type":"boolean"},"phone_call_interaction_snippet":{"type":"boolean"},"phone_call_last_interaction_at":{"type":"boolean"},"tiktok":{"type":"boolean"},"youtube":{"type":"boolean"},"gmail_last_interaction_provider":{"type":"boolean"},"gcal_last_interaction_provider":{"type":"boolean"},"priority_tier":{"type":"boolean"},"workspace_id":{"type":"boolean"},"contact_emails":{"type":"boolean"},"contact_phone_numbers":{"type":"boolean"},"contact_birthdays":{"type":"boolean"},"contact_locations":{"type":"boolean"},"contacts_custom_fields":{"type":"boolean"},"legacy_contact_addresses":{"type":"boolean"},"groups_contacts":{"type":"boolean"},"tags_contacts":{"type":"boolean"},"timeline_items_contacts":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"feed_items":{"type":"boolean"},"keep_in_touch_reminders":{"type":"boolean"},"contact_relations_contact_relations_sourceTocontacts":{"type":"boolean"},"contact_relations_contact_relations_destinationTocontacts":{"type":"boolean"},"frequency":{"type":"boolean"},"frequency_interval":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["linkedin_data","web_search_summary","groups_count","coordinates","last_note","id","user_id","first_name","last_name","description","birthday","legacy_location","education","job_title","company","image_source","image_url","starred","last_seen_at","last_reminder_at","first_met_at","first_interaction_at","facebook","linkedin","twitter","instagram","created_at","updated_at","never_keep_in_touch","telegram","website","next_reminder_at","source","is_archived","birthday_year","linkedin_enhance_date","ignore_merge","geocode_attempts","geocode_failed_at","full_name","business_card_url","linkedin_companies","linkedin_education","linkedin_last_message_at","linkedin_last_message_snippet","linkedin_message_link","linkedin_urn","linkedin_headline","whatsapp_message_link","whatsapp_message_snippet","whatsapp_last_message_at","frequency_text","imessage_message_link","imessage_message_snippet","imessage_last_message_at","instagram_message_link","instagram_message_snippet","instagram_last_message_at","gmail_last_interaction_at","gcal_last_interaction_at","gmail_last_interaction_provider_id","gcal_last_interaction_provider_id","gmail_last_interaction_subject","gcal_last_interaction_title","phone_call_interaction_snippet","phone_call_last_interaction_at","tiktok","youtube","gmail_last_interaction_provider","gcal_last_interaction_provider","priority_tier","workspace_id","contact_emails","contact_phone_numbers","contact_birthdays","contact_locations","contacts_custom_fields","legacy_contact_addresses","groups_contacts","tags_contacts","timeline_items_contacts","reminders_contacts","feed_items","keep_in_touch_reminders","contact_relations_contact_relations_sourceTocontacts","contact_relations_contact_relations_destinationTocontacts","frequency","frequency_interval"]}},"near":{"type":"string","minLength":1},"radiusKm":{"type":"number","exclusiveMinimum":0,"maximum":20037}},"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"contacts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"full_name":{"nullable":true,"type":"string"},"description":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"},"company":{"nullable":true,"type":"string"},"education":{"nullable":true,"type":"string"},"legacy_location":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"business_card_url":{"nullable":true,"type":"string"},"website":{"nullable":true,"type":"string"},"image_source":{"nullable":true,"type":"string"},"birthday":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"birthday_year":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"linkedin":{"nullable":true,"type":"string"},"twitter":{"nullable":true,"type":"string"},"facebook":{"nullable":true,"type":"string"},"instagram":{"nullable":true,"type":"string"},"telegram":{"nullable":true,"type":"string"},"tiktok":{"nullable":true,"type":"string"},"youtube":{"nullable":true,"type":"string"},"starred":{"type":"boolean"},"is_archived":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"source":{"type":"string"},"priority_tier":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"frequency":{"nullable":true,"type":"string"},"frequency_text":{"nullable":true,"type":"string"},"last_seen_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"last_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_met_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_companies":{"nullable":true,"type":"string"},"linkedin_education":{"nullable":true,"type":"string"},"linkedin_enhance_date":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_snippet":{"nullable":true,"type":"string"},"linkedin_message_link":{"nullable":true,"type":"string"},"linkedin_urn":{"nullable":true,"type":"string"},"linkedin_headline":{"nullable":true,"type":"string"},"whatsapp_message_link":{"nullable":true,"type":"string"},"whatsapp_message_snippet":{"nullable":true,"type":"string"},"whatsapp_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"imessage_message_link":{"nullable":true,"type":"string"},"imessage_message_snippet":{"nullable":true,"type":"string"},"imessage_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"instagram_message_link":{"nullable":true,"type":"string"},"instagram_message_snippet":{"nullable":true,"type":"string"},"instagram_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gmail_last_interaction_provider_id":{"nullable":true,"type":"string"},"gmail_last_interaction_subject":{"nullable":true,"type":"string"},"gcal_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gcal_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gcal_last_interaction_provider_id":{"nullable":true,"type":"string"},"gcal_last_interaction_title":{"nullable":true,"type":"string"},"phone_call_interaction_snippet":{"nullable":true,"type":"string"},"phone_call_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"web_search_summary":{"nullable":true},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"geocode_attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"geocode_failed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false},"frequency_interval":{},"linkedin_data":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"latitude":{"nullable":true,"type":"number"},"longitude":{"nullable":true,"type":"number"},"last_note":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"preview":{"type":"string"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"}},"required":["id","preview","event_time","emoji","meeting_type"],"additionalProperties":false},"team_keep_in_touch":{"nullable":true,"type":"object","properties":{"cadence_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["cadence_id","frequency_id","days","next_due_at","snoozed_until"],"additionalProperties":false},"contact_emails":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_birthdays":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contact_locations":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contacts_custom_fields":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"tags_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_sourceTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_destinationTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"feed_items":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"keep_in_touch_reminders":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false},"filterHash":{"type":"string"},"nearUnresolved":{"type":"boolean","enum":[true]}},"required":["contacts","filterHash"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"filterContactsV2","summary":"Filter contacts (v2)","description":"List contacts with filters sent in the request body. Accepts a Prisma-shaped `where` clause, an optional geographic `near` radius, and pagination. Returns the same shape as `GET /v2/contacts/` with an extra `filterHash` — a 16-char canonical fingerprint of the filter that actually ran. Clients use it as a stable cache key.","x-mint":{"content":"## Use cases\n\n- Power complex filtered views (multi-tag, multi-group, geo-distance) without URL length limits\n- Backend-to-backend integrations that build the `where` programmatically\n- Drive per-view membership caches keyed by `filterHash` (equal filters across clients → equal hash → shared cache entry)\n\n## `where` shape\n\nFlat key/value object (`has_name`, `has_groups`, `has_interaction`, etc.) — see the `ContactFilters` Zod schema in `@dex/zod-helpers/rest-api-schemas/contact`. AND across keys; reach for `_or` only when you need compound OR.\n\n## Geographic proximity\n\n`near` and `radiusKm` are siblings of `where`, NOT keys inside it. `near` is a free-text place (\"Bay Area\", \"Sydney\") geocoded server-side and folded into `where.has_distance`, so callers never need coordinates or a geocoding key. It ANDs with the rest of `where`. `radiusKm` defaults to 50 and requires `near`.\n\n`where.has_distance` remains available in Personal and workspace scope for callers that already hold coordinates. In a workspace, `near` is refused with `400 workspace_context_unsupported`; use `where.has_distance` instead. `near` and `where.has_distance` are **mutually exclusive** — sending both is a `400 validation_error`, as is `radiusKm` without `near`.\n\n<Warning>If the place cannot be geocoded, the response is an empty page — never an unconstrained contact dump. It carries `nearUnresolved: true`, and the non-hex sentinel `filterHash: \"geo-unresolved\"` so the empty page can never share a cache key with the unfiltered list. The flag means the place itself was not found, not that nobody is near it.</Warning>\n\n## `filterHash`\n\nThe response carries `data.filterHash`, a 16-char hex sha256 prefix of the canonicalized `where`. It fingerprints the **effective** filter — i.e. after `near` has been resolved into `has_distance` — so two different places never collide onto one cache key. Canonicalization is structural: identical filters expressed with different key orders, equivalent text-matcher shapes, or shuffled `_or` arms all produce the same hash. Use it as the cache key for the returned page.\n\n## Extension keys\n\n`custom_fields` and `_or` are fully honored by the server's query translator: `custom_fields` filters by user-defined fields (operators `contains`, `eq`, `in`, `not_in`, `present`, `absent`, `gte`, `lte`), and `_or` combines one level of filter branches with OR. Unknown top-level `where` keys are rejected with a `400 validation_error`. Note that `near` and `radiusKm` are siblings of `where`, not members of it — putting them inside `where` trips that same rejection.\n\n<Note>The cursor is opaque: pass `nextCursor` back unchanged, with the same `orderBy`, and never parse or build one. A cursor reused after the sort changes is refused with `400 invalid_cursor`: start again from the first page. A contact id sent as the cursor, which is what `nextCursor` used to be, is still accepted.</Note>"}}},"/v2/contacts/search":{"get":{"tags":["contacts"],"parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"query","required":true},{"schema":{"type":"integer","minimum":1,"maximum":50},"in":"query","name":"take","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"contacts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"full_name":{"nullable":true,"type":"string"},"description":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"},"company":{"nullable":true,"type":"string"},"education":{"nullable":true,"type":"string"},"legacy_location":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"business_card_url":{"nullable":true,"type":"string"},"website":{"nullable":true,"type":"string"},"image_source":{"nullable":true,"type":"string"},"birthday":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"birthday_year":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"linkedin":{"nullable":true,"type":"string"},"twitter":{"nullable":true,"type":"string"},"facebook":{"nullable":true,"type":"string"},"instagram":{"nullable":true,"type":"string"},"telegram":{"nullable":true,"type":"string"},"tiktok":{"nullable":true,"type":"string"},"youtube":{"nullable":true,"type":"string"},"starred":{"type":"boolean"},"is_archived":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"source":{"type":"string"},"priority_tier":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"frequency":{"nullable":true,"type":"string"},"frequency_text":{"nullable":true,"type":"string"},"last_seen_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"last_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_met_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_companies":{"nullable":true,"type":"string"},"linkedin_education":{"nullable":true,"type":"string"},"linkedin_enhance_date":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_snippet":{"nullable":true,"type":"string"},"linkedin_message_link":{"nullable":true,"type":"string"},"linkedin_urn":{"nullable":true,"type":"string"},"linkedin_headline":{"nullable":true,"type":"string"},"whatsapp_message_link":{"nullable":true,"type":"string"},"whatsapp_message_snippet":{"nullable":true,"type":"string"},"whatsapp_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"imessage_message_link":{"nullable":true,"type":"string"},"imessage_message_snippet":{"nullable":true,"type":"string"},"imessage_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"instagram_message_link":{"nullable":true,"type":"string"},"instagram_message_snippet":{"nullable":true,"type":"string"},"instagram_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gmail_last_interaction_provider_id":{"nullable":true,"type":"string"},"gmail_last_interaction_subject":{"nullable":true,"type":"string"},"gcal_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gcal_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gcal_last_interaction_provider_id":{"nullable":true,"type":"string"},"gcal_last_interaction_title":{"nullable":true,"type":"string"},"phone_call_interaction_snippet":{"nullable":true,"type":"string"},"phone_call_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"web_search_summary":{"nullable":true},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"geocode_attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"geocode_failed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false},"frequency_interval":{},"linkedin_data":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"latitude":{"nullable":true,"type":"number"},"longitude":{"nullable":true,"type":"number"},"last_note":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"preview":{"type":"string"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"}},"required":["id","preview","event_time","emoji","meeting_type"],"additionalProperties":false},"team_keep_in_touch":{"nullable":true,"type":"object","properties":{"cadence_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["cadence_id","frequency_id","days","next_due_at","snoozed_until"],"additionalProperties":false},"contact_emails":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_birthdays":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contact_locations":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contacts_custom_fields":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"tags_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_sourceTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_destinationTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"feed_items":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"keep_in_touch_reminders":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["contacts"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"searchContactsTypeaheadV2","summary":"Search contacts by name (v2)","description":"Name-only typeahead. Matches the contact's full name accent-insensitively (`f_unaccent`) and returns full contact rows in the list envelope `{ data: { contacts: [...] } }`. `query` is required — send `POST /v2/contacts/search` if you need an empty-query listing, a wider field fan-out, or geographic search.","x-mint":{"content":"## Use cases\n\n- Power a real-time search-as-you-type box\n- Resolve a contact from a partially typed name (`@`-mentions, pickers)\n\n## Scope\n\nThis endpoint matches **full name only**. It does not search email, company, job title, location or notes — a query that looks like a company name returns no results here. Rows come back complete, so they are safe to write straight into a client-side contacts store.\n\n## Choosing between the search endpoints\n\n| You need | Use |\n| --- | --- |\n| Type-ahead on a name, full rows back | **`GET /v2/contacts/search`** (this endpoint) |\n| Free text across name, email, job title, company, education, location, notes | `POST /v2/contacts/search` |\n| Geographic proximity (`near` / `radiusKm`) | `POST /v2/contacts/search` or `POST /v2/contacts/filter` |\n| List by most recent interaction (empty query) | `POST /v2/contacts/search` |\n| Structured attributes — tags, groups, custom fields, date ranges | `POST /v2/contacts/filter` |\n\n<Note>The POST route returns a narrow projection rather than full rows, so its results are not safe to upsert into a contacts store. Fetch `GET /v2/contacts/{contactId}` for the full record.</Note>\n\n## Migration from /v1\n\n/v1 returned `{ error: false, data: { items: [...] } }`. /v2 returns `{ data: { contacts: [...] } }` — entity plural at the top level, no `error` field on success."}},"post":{"tags":["contacts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"searchQuery":{"type":"string"},"archived":{"type":"boolean"},"minimal":{"type":"boolean"},"exactMatch":{"type":"boolean"},"enhanced":{"type":"boolean"},"near":{"type":"string","minLength":1},"radiusKm":{"type":"number","exclusiveMinimum":0,"maximum":20037},"take":{"type":"integer","minimum":1,"maximum":200},"fallbackNameToEmail":{"type":"boolean"},"has_groups":{"anyOf":[{"type":"object","properties":{"not":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}]}},"required":["not"],"additionalProperties":false},{"type":"boolean"},{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}]}},"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"contacts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"full_name":{"nullable":true,"type":"string"},"description":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"},"company":{"nullable":true,"type":"string"},"education":{"nullable":true,"type":"string"},"legacy_location":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"business_card_url":{"nullable":true,"type":"string"},"website":{"nullable":true,"type":"string"},"image_source":{"nullable":true,"type":"string"},"birthday":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"birthday_year":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"linkedin":{"nullable":true,"type":"string"},"twitter":{"nullable":true,"type":"string"},"facebook":{"nullable":true,"type":"string"},"instagram":{"nullable":true,"type":"string"},"telegram":{"nullable":true,"type":"string"},"tiktok":{"nullable":true,"type":"string"},"youtube":{"nullable":true,"type":"string"},"starred":{"type":"boolean"},"is_archived":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"source":{"type":"string"},"priority_tier":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"frequency":{"nullable":true,"type":"string"},"frequency_text":{"nullable":true,"type":"string"},"last_seen_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"last_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_met_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_companies":{"nullable":true,"type":"string"},"linkedin_education":{"nullable":true,"type":"string"},"linkedin_enhance_date":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_snippet":{"nullable":true,"type":"string"},"linkedin_message_link":{"nullable":true,"type":"string"},"linkedin_urn":{"nullable":true,"type":"string"},"linkedin_headline":{"nullable":true,"type":"string"},"whatsapp_message_link":{"nullable":true,"type":"string"},"whatsapp_message_snippet":{"nullable":true,"type":"string"},"whatsapp_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"imessage_message_link":{"nullable":true,"type":"string"},"imessage_message_snippet":{"nullable":true,"type":"string"},"imessage_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"instagram_message_link":{"nullable":true,"type":"string"},"instagram_message_snippet":{"nullable":true,"type":"string"},"instagram_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gmail_last_interaction_provider_id":{"nullable":true,"type":"string"},"gmail_last_interaction_subject":{"nullable":true,"type":"string"},"gcal_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gcal_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gcal_last_interaction_provider_id":{"nullable":true,"type":"string"},"gcal_last_interaction_title":{"nullable":true,"type":"string"},"phone_call_interaction_snippet":{"nullable":true,"type":"string"},"phone_call_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"web_search_summary":{"nullable":true},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"geocode_attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"geocode_failed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false},"frequency_interval":{},"linkedin_data":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"latitude":{"nullable":true,"type":"number"},"longitude":{"nullable":true,"type":"number"},"last_note":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"preview":{"type":"string"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"}},"required":["id","preview","event_time","emoji","meeting_type"],"additionalProperties":false},"team_keep_in_touch":{"nullable":true,"type":"object","properties":{"cadence_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["cadence_id","frequency_id","days","next_due_at","snoozed_until"],"additionalProperties":false},"contact_emails":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_birthdays":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contact_locations":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contacts_custom_fields":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"tags_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_sourceTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_destinationTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"feed_items":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"keep_in_touch_reminders":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false},"nearUnresolved":{"type":"boolean","enum":[true]}},"required":["contacts"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"searchContactsV2","summary":"Search contacts, full (v2)","description":"Full-capability contact search: free-text across seven fields with accent folding and similarity ranking, phone-number lookup on digits (a query that is only a phone number searches stored numbers instead of the text fields), an optional geographic `near` radius, group/archive filters, and an empty-query mode that lists contacts by most recent interaction. Returns the contact list envelope `{ data: { contacts: [...] } }`.","x-mint":{"content":"## Use cases\n\n- Answer natural-language contact lookups (\"engineers in the Bay Area\")\n- List contacts by most recent interaction (send an empty or omitted `searchQuery`)\n- Search across job title, company, education, location, and description — not just name\n\n## Search modes\n\n| Body | Behaviour |\n| --- | --- |\n| `searchQuery` omitted or `\"\"` | Personal lists contacts ordered by starred, then most recent `last_seen_at`. A workspace lists them by most recently updated (`updated_at`, then `id`) — workspace contacts have neither `starred` nor `last_seen_at`. |\n| `searchQuery` set (default) | Fans out across full name, email, job title, company, education, location, and description. Accent-insensitive (`f_unaccent`), ranked by trigram similarity, starred matches first. |\n| `searchQuery` is a phone number | Searches stored phone numbers **instead of** the text fields (see below). |\n| `minimal: true` | Full-name match only — the cheapest mode. Pair with `exactMatch: true` for a prefix-anchored name match. Never runs the phone search, even for a phone-number query. |\n| `enhanced: true` | Every field except description, without the starred pre-pass. Mutually exclusive with `minimal`. |\n\n## Phone numbers\n\nA `searchQuery` is treated as a phone number when, after removing spaces, dashes, dots, parentheses and one leading `+` or `00`, it is nothing but digits and has at least 6 of them (`+420 604 354 254`, `(555) 555-5555`, `604354254`). Letters anywhere, or fewer than 6 digits, make it an ordinary text query.\n\nMatching compares digits only: formatting and the country code are ignored, and the digits of the stored number (E.164 when known, otherwise dial code + national number, otherwise the raw number) must **end with** the digits of the query — a suffix match, never substring-anywhere. `+420 604 354 254`, `420604354254` and `604354254` therefore all find the contact storing `+420604354254`, while `604354254` alone also matches a number in another country that ends the same way. Exact digit matches rank first, then most recent `last_seen_at`. A phone-number query runs **only** the phone search — text fields are not consulted — and `minimal: true` never runs it.\n\n## Geographic proximity\n\n`near` is a free-text place (\"Bay Area\", \"Sydney\") geocoded server-side and matched against each contact's own coordinates, so it finds people whose stored location differs from the query. `radiusKm` defaults to 50. `near` and `searchQuery` combine with AND.\n\n<Warning>If the place cannot be geocoded, the response is an empty list carrying `nearUnresolved: true` — never an unconstrained contact dump. Without the flag, an empty list means no contact is within the radius; with it, the place itself was not found, so say so rather than reporting that nobody is there.</Warning>\n\n## Migration from /v1\n\nReplaces `GET /v1/search/contacts`. The query parameters move into the request body unchanged (including `has_groups`), and the response envelope changes from `{ error: false, data: [...] }` to `{ data: { contacts: [...], pagination: { count } } }`.\n\n<Note>Contacts are returned as a narrow projection (id, names, job title, company, avatar, location, description, starred). Call `GET /v2/contacts/{contactId}` for the full record. In a workspace, `has_groups` takes every form `POST /v2/contacts/filter` takes and answers the same contacts (an empty list or `{ not: [] }` is no filter), and `near` is refused with `400 workspace_context_unsupported`.</Note>\n\n## Choosing between the search endpoints\n\n`GET /v2/contacts/search` is a lightweight name-only typeahead that returns full contact rows. Use this POST route when you need the wider field fan-out, geographic search, or the empty-query listing mode. For structured attribute filtering (tags, custom fields, dates), use `POST /v2/contacts/filter`."}}},"/v2/contacts/birthdays":{"get":{"tags":["contacts"],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"birthdays":{"type":"array","items":{"type":"object","properties":{"contact_id":{"type":"string"},"full_name":{"nullable":true,"type":"string"},"first_name":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"},"company":{"nullable":true,"type":"string"},"birthday_month":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"birthday_day":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"birthday_year":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"last_dismissal_year":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"linkedin":{"nullable":true,"type":"string"},"twitter":{"nullable":true,"type":"string"},"facebook":{"nullable":true,"type":"string"},"instagram":{"nullable":true,"type":"string"},"telegram":{"nullable":true,"type":"string"},"tiktok":{"nullable":true,"type":"string"},"youtube":{"nullable":true,"type":"string"},"contact_emails":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"}},"required":["id","email"],"additionalProperties":false}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"phone_number":{"type":"string"},"phone_number_sanitized":{"nullable":true,"type":"string"}},"required":["id","phone_number","phone_number_sanitized"],"additionalProperties":false}}},"required":["contact_id","full_name","first_name","image_url","job_title","company","birthday_month","birthday_day","birthday_year","last_dismissal_year","linkedin","twitter","facebook","instagram","telegram","tiktok","youtube","contact_emails","contact_phone_numbers"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["birthdays"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listBirthdaysV2","summary":"List birthdays (v2)","description":"Return every contact that has a stored birthday, as a light card projection: `{ data: { birthdays: [{ contact_id, full_name, image_url, job_title, company, birthday_month, birthday_day, birthday_year, ...socials, contact_emails, contact_phone_numbers }] } }`. Ordered by month then day. Powers the Birthdays page (today / upcoming / by-month groupings are computed client-side).","x-mint":{"content":"## Use cases\n\n- Render the Birthdays page (group by today, next 7 days, and month)\n- Surface upcoming birthdays in a reconnect prompt\n\n## Migration from /v1\n\nReplaces `GET /v1/agenda/birthdays/all`. /v1 returned `{ error: false, data: { birthdays: [...] } }`; /v2 drops the `error` field and namespaces the list under the canonical envelope. The row shape is unchanged.\n\n<Note>This is a read — no `Idempotency-Key` required.</Note>"}}},"/v2/contacts/batch":{"post":{"tags":["contacts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contacts":{"maxItems":500,"type":"array","items":{"type":"object","properties":{"full_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"job_title":{"anyOf":[{"type":"string"},{"type":"null"}]},"legacy_location":{"anyOf":[{"type":"string"},{"type":"null"}]},"company":{"anyOf":[{"type":"string"},{"type":"null"}]},"education":{"anyOf":[{"type":"string"},{"type":"null"}]},"starred":{"type":"boolean"},"source":{"type":"string","enum":["linkedin_sync","facebook_import","cal_ingest","email_ingest","web_import","csv_import","whatsapp_sync","imessage_sync","phone_calls_sync","mobile","mobile_import","instagram_sync","oauth_interaction","granola_sync"]},"coordinates":{"type":"object","properties":{"operation":{"type":"string","enum":["set","delete"]},"data":{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180}},"additionalProperties":false}},"required":["operation"],"additionalProperties":false},"priority_tier":{"anyOf":[{"type":"integer","minimum":1,"maximum":32767},{"type":"null"}]},"image_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"image_source":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"business_card_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"website":{"anyOf":[{},{"type":"null"}]},"birthday":{"anyOf":[{"type":"string","format":"date","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])))$"},{"type":"null"}]},"birthday_year":{"anyOf":[{"type":"number","minimum":1900,"maximum":2100},{"type":"null"}]},"frequency":{"anyOf":[{"type":"string"},{"type":"null"}]},"last_seen_at":{"anyOf":[{},{"type":"null"}]},"first_met_at":{"anyOf":[{},{"type":"null"}]},"never_keep_in_touch":{"type":"boolean"},"next_reminder_at":{},"linkedin":{"anyOf":[{"type":"string"},{"type":"null"}]},"twitter":{"anyOf":[{"type":"string"},{"type":"null"}]},"facebook":{"anyOf":[{"type":"string"},{"type":"null"}]},"instagram":{"anyOf":[{"type":"string"},{"type":"null"}]},"telegram":{"anyOf":[{"type":"string"},{"type":"null"}]},"tiktok":{"anyOf":[{"type":"string"},{"type":"null"}]},"youtube":{"anyOf":[{"type":"string"},{"type":"null"}]},"whatsapp_message_link":{"type":"string"},"whatsapp_message_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"whatsapp_last_message_at":{"anyOf":[{},{"type":"null"}]},"imessage_message_link":{"type":"string"},"imessage_message_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"imessage_last_message_at":{"anyOf":[{},{"type":"null"}]},"linkedin_message_link":{"type":"string","maxLength":600},"linkedin_last_message_snippet":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"linkedin_last_message_at":{"anyOf":[{},{"type":"null"}]},"linkedin_data":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"instagram_message_link":{"type":"string"},"instagram_message_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"instagram_last_message_at":{"anyOf":[{},{"type":"null"}]},"gmail_last_interaction_at":{"anyOf":[{},{"type":"null"}]},"gmail_last_interaction_provider_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"gmail_last_interaction_subject":{"anyOf":[{"type":"string"},{"type":"null"}]},"gmail_last_interaction_provider":{"anyOf":[{"type":"string","enum":["GOOGLE","OFFICE365"]},{"type":"null"}]},"gcal_last_interaction_at":{"anyOf":[{},{"type":"null"}]},"gcal_last_interaction_provider_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"gcal_last_interaction_title":{"anyOf":[{"type":"string"},{"type":"null"}]},"gcal_last_interaction_provider":{"anyOf":[{"type":"string","enum":["GOOGLE","OFFICE365"]},{"type":"null"}]},"phone_call_last_interaction_at":{"anyOf":[{},{"type":"null"}]},"phone_call_interaction_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"web_search_summary":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{"formatted":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false}},"contact_emails":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","maxLength":320},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"ranking":{"type":"number"}},"required":["email"],"additionalProperties":false}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{"phone_number":{"type":"string","maxLength":50},"country_code":{"anyOf":[{"type":"string","maxLength":4},{"type":"null"}]},"phone_number_sanitized":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}]},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"ranking":{"type":"number"}},"required":["phone_number"],"additionalProperties":false}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{"group_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["group_id"],"additionalProperties":false}},"tags_contacts":{"type":"array","items":{"type":"object","properties":{"tag_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["tag_id"],"additionalProperties":false}},"custom_fields":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["input"]},"text_value":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"custom_field":{}},"required":["id","type","text_value"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["autocomplete"]},"text_value":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"custom_field":{}},"required":["id","type","text_value"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["datepicker"]},"text_value":{"anyOf":[{"type":"string"},{"type":"null"}]},"date_value":{"anyOf":[{},{"type":"null"}]},"custom_field":{}},"required":["id","type"],"additionalProperties":false}]}},"contact_birthdays":{"type":"object","properties":{"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"last_dismissal_year":{"type":"number","minimum":1900,"maximum":2100}},"additionalProperties":false},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","not":{"enum":["00000000-0000-0000-0000-000000000000"]}},"related_contacts":{"type":"array","items":{"type":"object","properties":{"destination":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"source_contact":{},"destination_contact":{}},"required":["destination"],"additionalProperties":false}}},"additionalProperties":false}},"continueOnError":{"type":"boolean"}},"required":["contacts"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"contacts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"full_name":{"nullable":true,"type":"string"},"description":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"},"company":{"nullable":true,"type":"string"},"education":{"nullable":true,"type":"string"},"legacy_location":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"business_card_url":{"nullable":true,"type":"string"},"website":{"nullable":true,"type":"string"},"image_source":{"nullable":true,"type":"string"},"birthday":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"birthday_year":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"linkedin":{"nullable":true,"type":"string"},"twitter":{"nullable":true,"type":"string"},"facebook":{"nullable":true,"type":"string"},"instagram":{"nullable":true,"type":"string"},"telegram":{"nullable":true,"type":"string"},"tiktok":{"nullable":true,"type":"string"},"youtube":{"nullable":true,"type":"string"},"starred":{"type":"boolean"},"is_archived":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"source":{"type":"string"},"priority_tier":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"frequency":{"nullable":true,"type":"string"},"frequency_text":{"nullable":true,"type":"string"},"last_seen_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"last_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_met_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_companies":{"nullable":true,"type":"string"},"linkedin_education":{"nullable":true,"type":"string"},"linkedin_enhance_date":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_snippet":{"nullable":true,"type":"string"},"linkedin_message_link":{"nullable":true,"type":"string"},"linkedin_urn":{"nullable":true,"type":"string"},"linkedin_headline":{"nullable":true,"type":"string"},"whatsapp_message_link":{"nullable":true,"type":"string"},"whatsapp_message_snippet":{"nullable":true,"type":"string"},"whatsapp_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"imessage_message_link":{"nullable":true,"type":"string"},"imessage_message_snippet":{"nullable":true,"type":"string"},"imessage_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"instagram_message_link":{"nullable":true,"type":"string"},"instagram_message_snippet":{"nullable":true,"type":"string"},"instagram_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gmail_last_interaction_provider_id":{"nullable":true,"type":"string"},"gmail_last_interaction_subject":{"nullable":true,"type":"string"},"gcal_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gcal_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gcal_last_interaction_provider_id":{"nullable":true,"type":"string"},"gcal_last_interaction_title":{"nullable":true,"type":"string"},"phone_call_interaction_snippet":{"nullable":true,"type":"string"},"phone_call_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"web_search_summary":{"nullable":true},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"geocode_attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"geocode_failed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false},"frequency_interval":{},"linkedin_data":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"latitude":{"nullable":true,"type":"number"},"longitude":{"nullable":true,"type":"number"},"last_note":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"preview":{"type":"string"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"}},"required":["id","preview","event_time","emoji","meeting_type"],"additionalProperties":false},"team_keep_in_touch":{"nullable":true,"type":"object","properties":{"cadence_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["cadence_id","frequency_id","days","next_due_at","snoozed_until"],"additionalProperties":false},"contact_emails":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_birthdays":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contact_locations":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contacts_custom_fields":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"tags_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_sourceTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_destinationTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"feed_items":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"keep_in_touch_reminders":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false},"batch":{"type":"object","properties":{"requested":{"type":"integer","minimum":0,"maximum":9007199254740991},"committed":{"type":"integer","minimum":0,"maximum":9007199254740991},"committedThrough":{"type":"integer","minimum":0,"maximum":9007199254740991},"chunkSize":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":9007199254740991},"chunks":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer","minimum":0,"maximum":9007199254740991},"offset":{"type":"integer","minimum":0,"maximum":9007199254740991},"count":{"type":"integer","minimum":0,"maximum":9007199254740991},"status":{"type":"string","enum":["committed","failed"]},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["index","offset","count","status"],"additionalProperties":false}},"failedRows":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer","minimum":0,"maximum":9007199254740991},"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["index","error"],"additionalProperties":false}}},"required":["requested","committed","committedThrough","chunkSize","chunks"],"additionalProperties":false}},"required":["contacts","batch"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"batchCreateContactsV2","summary":"Bulk-create contacts (v2)","description":"Create multiple contacts in a single request. **Requires `Idempotency-Key`.** Returns the created contacts as `{ data: { contacts: [...] }, ... }` with status 201, alongside a `data.batch` partial-success report.","x-mint":{"content":"## Use cases\n\n- CSV imports\n- Migrate from another CRM\n- Sync contacts from a third-party source\n\n## Idempotency\n\nGenerate one UUID per logical import operation and reuse it on every retry. Without this, a network failure that successfully created contacts but lost the response would cause duplicate rows on retry.\n\nSupply your own `id` (a UUID) on each contact. It becomes the row's primary key and the insert is `ON CONFLICT DO NOTHING`, so re-sending a row you already sent is a no-op. This is what makes a resume safe at row granularity, where `Idempotency-Key` — which is per-request and only caches successful responses — cannot help.\n\n## Partial success\n\nThe request is processed as several independent transactions, so a failure can leave part of it committed. Every 201 carries a `data.batch` report:\n\n```json\n{ \"requested\": 500, \"committed\": 397, \"committedThrough\": 300, \"chunkSize\": 100,\n  \"chunks\": [ { \"index\": 3, \"offset\": 300, \"count\": 100, \"status\": \"failed\", \"error\": { \"code\": \"unknown_error\", \"message\": \"...\" } } ],\n  \"failedRows\": [ { \"index\": 12, \"id\": \"…\", \"error\": { \"code\": \"validation_error\", \"message\": \"...\" } } ] }\n```\n\nResume from `chunks`: re-send the rows of every entry whose `status` is `\"failed\"` — `[offset, offset + count)` — with the same row ids. `committedThrough` is an **index** into the maximal LEADING run of committed chunks: re-sending `contacts.slice(committedThrough)` is complete and idempotent, but chunks run concurrently, so a failed chunk sitting before a committed one makes that index under-report what is already present. In the example above the leading run stops at 300 while 397 rows are in — a prefix resume re-sends 100 rows the server already has. Every overlap is a no-op, so this costs bandwidth, not correctness. `committed` is a **count** of rows now present. `data.contacts` holds only the rows this call actually inserted (a re-sent row that already existed is absent), so never use its length as progress.\n\nBy default a chunk failure still fails the whole request, as it always has. Send `\"continueOnError\": true` to get the 201-with-report behaviour instead; use a fresh `Idempotency-Key` for the resume request, since its body differs.\n\n<Note>The endpoint accepts `{ contacts: [] }` for an empty bulk-create and returns `{ data: { contacts: [] } }` — useful as a no-op confirmation that the request reached the server.</Note>"},"parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}]}},"/v2/contacts/batch-update":{"post":{"tags":["contacts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"updates":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"object","properties":{"contactId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"data":{"type":"object","properties":{"full_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"job_title":{"anyOf":[{"type":"string"},{"type":"null"}]},"legacy_location":{"anyOf":[{"type":"string"},{"type":"null"}]},"company":{"anyOf":[{"type":"string"},{"type":"null"}]},"education":{"anyOf":[{"type":"string"},{"type":"null"}]},"starred":{"type":"boolean"},"source":{"type":"string","enum":["linkedin_sync","facebook_import","cal_ingest","email_ingest","web_import","csv_import","whatsapp_sync","imessage_sync","phone_calls_sync","mobile","mobile_import","instagram_sync","oauth_interaction","granola_sync"]},"coordinates":{"type":"object","properties":{"operation":{"type":"string","enum":["set","delete"]},"data":{"type":"object","properties":{"latitude":{"type":"number","minimum":-90,"maximum":90},"longitude":{"type":"number","minimum":-180,"maximum":180}},"additionalProperties":false}},"required":["operation"],"additionalProperties":false},"priority_tier":{"anyOf":[{"type":"integer","minimum":1,"maximum":32767},{"type":"null"}]},"image_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"image_source":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"business_card_url":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"website":{"anyOf":[{},{"type":"null"}]},"birthday":{"anyOf":[{"type":"string","format":"date","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])))$"},{"type":"null"}]},"birthday_year":{"anyOf":[{"type":"number","minimum":1900,"maximum":2100},{"type":"null"}]},"frequency":{"anyOf":[{"type":"string"},{"type":"null"}]},"last_seen_at":{"anyOf":[{},{"type":"null"}]},"first_met_at":{"anyOf":[{},{"type":"null"}]},"never_keep_in_touch":{"type":"boolean"},"next_reminder_at":{},"linkedin":{"anyOf":[{"type":"string"},{"type":"null"}]},"twitter":{"anyOf":[{"type":"string"},{"type":"null"}]},"facebook":{"anyOf":[{"type":"string"},{"type":"null"}]},"instagram":{"anyOf":[{"type":"string"},{"type":"null"}]},"telegram":{"anyOf":[{"type":"string"},{"type":"null"}]},"tiktok":{"anyOf":[{"type":"string"},{"type":"null"}]},"youtube":{"anyOf":[{"type":"string"},{"type":"null"}]},"whatsapp_message_link":{"type":"string"},"whatsapp_message_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"whatsapp_last_message_at":{"anyOf":[{},{"type":"null"}]},"imessage_message_link":{"type":"string"},"imessage_message_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"imessage_last_message_at":{"anyOf":[{},{"type":"null"}]},"linkedin_message_link":{"type":"string","maxLength":600},"linkedin_last_message_snippet":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"linkedin_last_message_at":{"anyOf":[{},{"type":"null"}]},"linkedin_data":{"anyOf":[{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},{"type":"null"}]},"instagram_message_link":{"type":"string"},"instagram_message_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"instagram_last_message_at":{"anyOf":[{},{"type":"null"}]},"gmail_last_interaction_at":{"anyOf":[{},{"type":"null"}]},"gmail_last_interaction_provider_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"gmail_last_interaction_subject":{"anyOf":[{"type":"string"},{"type":"null"}]},"gmail_last_interaction_provider":{"anyOf":[{"type":"string","enum":["GOOGLE","OFFICE365"]},{"type":"null"}]},"gcal_last_interaction_at":{"anyOf":[{},{"type":"null"}]},"gcal_last_interaction_provider_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"gcal_last_interaction_title":{"anyOf":[{"type":"string"},{"type":"null"}]},"gcal_last_interaction_provider":{"anyOf":[{"type":"string","enum":["GOOGLE","OFFICE365"]},{"type":"null"}]},"phone_call_last_interaction_at":{"anyOf":[{},{"type":"null"}]},"phone_call_interaction_snippet":{"anyOf":[{"type":"string"},{"type":"null"}]},"web_search_summary":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{"formatted":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false}},"contact_emails":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string","maxLength":320},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"ranking":{"type":"number"}},"required":["email"],"additionalProperties":false}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{"phone_number":{"type":"string","maxLength":50},"country_code":{"anyOf":[{"type":"string","maxLength":4},{"type":"null"}]},"phone_number_sanitized":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}]},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"ranking":{"type":"number"}},"required":["phone_number"],"additionalProperties":false}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{"group_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["group_id"],"additionalProperties":false}},"tags_contacts":{"anyOf":[{"type":"object","properties":{"append":{"type":"array","items":{"type":"object","properties":{"tag_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["tag_id"],"additionalProperties":false}},"remove":{"type":"array","items":{"type":"object","properties":{"tag_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["tag_id","contact_id"],"additionalProperties":false}},"replace":{}},"additionalProperties":false},{"type":"object","properties":{"append":{},"remove":{},"replace":{"type":"array","items":{"type":"object","properties":{"tag_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["tag_id"],"additionalProperties":false}}},"additionalProperties":false}]},"custom_fields":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["input"]},"text_value":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"custom_field":{}},"required":["id","type","text_value"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["autocomplete"]},"text_value":{"anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"custom_field":{}},"required":["id","type","text_value"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"type":"string","enum":["datepicker"]},"text_value":{"anyOf":[{"type":"string"},{"type":"null"}]},"date_value":{"anyOf":[{},{"type":"null"}]},"custom_field":{}},"required":["id","type"],"additionalProperties":false}]}},"contact_birthdays":{"type":"object","properties":{"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"last_dismissal_year":{"type":"number","minimum":1900,"maximum":2100}},"additionalProperties":false},"is_archived":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"related_contacts":{"anyOf":[{"type":"object","properties":{"append":{"type":"array","items":{"type":"object","properties":{"destination":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"source_contact":{},"destination_contact":{}},"required":["destination"],"additionalProperties":false}},"remove":{"type":"array","items":{"anyOf":[{"type":"object","properties":{"source":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"destination":{}},"required":["source","destination"],"additionalProperties":false},{"type":"object","properties":{"source":{},"destination":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["source","destination"],"additionalProperties":false}]}},"replace":{}},"additionalProperties":false},{"type":"object","properties":{"append":{},"remove":{},"replace":{"type":"array","items":{"type":"object","properties":{"destination":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"source_contact":{},"destination_contact":{}},"required":["destination"],"additionalProperties":false}}},"additionalProperties":false}]}},"additionalProperties":false}},"required":["contactId","data"],"additionalProperties":false}}},"required":["updates"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"batchUpdateContactsV2","summary":"Bulk-update contacts (v2)","description":"Update multiple contacts in a single request. Per-row results are settled (some can succeed, others fail). **Requires `Idempotency-Key`.** Returns `{ data: { affected, ids } }` where `ids` lists the contact IDs that were successfully updated.","x-mint":{"content":"## Use cases\n\n- Bulk-edit selections from the contact list\n- Apply field defaults across a tag-filtered group\n- Backfill enrichment data across many contacts at once\n\n## Migration from /v1\n\n/v1 used `PUT /v1/contacts/` with an array body and returned `{ data: { count } }`. /v2 uses `POST /v2/contacts/batch-update` (PUT-on-collection is ambiguous in REST semantics) and surfaces the list of successfully-updated IDs in `data.ids` so cache writers can invalidate just those rows without an extra read."},"parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}]}},"/v2/contacts/batch-delete":{"post":{"tags":["contacts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contactIds":{"minItems":1,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["contactIds"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"batchDeleteContactsV2","summary":"Bulk-delete contacts (v2)","description":"Permanently delete multiple contacts in a single request. Returns `{ data: { affected, ids } }` where `ids` is the array of deleted contact IDs (echoed from the request body). `Idempotency-Key` is optional.","x-mint":{"content":"## Use cases\n\n- Remove a multi-selection of contacts at once\n- Bulk-cleanup of duplicates after a merge audit\n- Tag-driven bulk removal\n\n## Migration from /v1\n\n/v1 used `DELETE /v1/contacts/` with a body. HTTP spec discourages bodies on DELETE and some proxies strip them silently. /v2 uses `POST /v2/contacts/batch-delete` to keep the body intact in transit.\n\n<Note>This is a destructive operation. Deleted contacts cannot be recovered.</Note>"},"parameters":[{"in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Optional. Accepted to dedupe retries on this endpoint. See `apps/rest-api/src/shared/idempotency.ts`."}]}},"/v2/contacts/merge":{"post":{"tags":["contacts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contactIds":{"minItems":1,"type":"array","items":{"anyOf":[{"minItems":2,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"type":"object","properties":{"contact_ids":{"minItems":2,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"primary_contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["contact_ids"],"additionalProperties":false}]}}},"required":["contactIds"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"merged":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"full_name":{"nullable":true,"type":"string"},"description":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"},"company":{"nullable":true,"type":"string"},"education":{"nullable":true,"type":"string"},"legacy_location":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"business_card_url":{"nullable":true,"type":"string"},"website":{"nullable":true,"type":"string"},"image_source":{"nullable":true,"type":"string"},"birthday":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"birthday_year":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"linkedin":{"nullable":true,"type":"string"},"twitter":{"nullable":true,"type":"string"},"facebook":{"nullable":true,"type":"string"},"instagram":{"nullable":true,"type":"string"},"telegram":{"nullable":true,"type":"string"},"tiktok":{"nullable":true,"type":"string"},"youtube":{"nullable":true,"type":"string"},"starred":{"type":"boolean"},"is_archived":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"source":{"type":"string"},"priority_tier":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"frequency":{"nullable":true,"type":"string"},"frequency_text":{"nullable":true,"type":"string"},"last_seen_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"last_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_met_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_companies":{"nullable":true,"type":"string"},"linkedin_education":{"nullable":true,"type":"string"},"linkedin_enhance_date":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_snippet":{"nullable":true,"type":"string"},"linkedin_message_link":{"nullable":true,"type":"string"},"linkedin_urn":{"nullable":true,"type":"string"},"linkedin_headline":{"nullable":true,"type":"string"},"whatsapp_message_link":{"nullable":true,"type":"string"},"whatsapp_message_snippet":{"nullable":true,"type":"string"},"whatsapp_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"imessage_message_link":{"nullable":true,"type":"string"},"imessage_message_snippet":{"nullable":true,"type":"string"},"imessage_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"instagram_message_link":{"nullable":true,"type":"string"},"instagram_message_snippet":{"nullable":true,"type":"string"},"instagram_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gmail_last_interaction_provider_id":{"nullable":true,"type":"string"},"gmail_last_interaction_subject":{"nullable":true,"type":"string"},"gcal_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gcal_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gcal_last_interaction_provider_id":{"nullable":true,"type":"string"},"gcal_last_interaction_title":{"nullable":true,"type":"string"},"phone_call_interaction_snippet":{"nullable":true,"type":"string"},"phone_call_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"web_search_summary":{"nullable":true},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"geocode_attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"geocode_failed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false},"frequency_interval":{},"linkedin_data":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"latitude":{"nullable":true,"type":"number"},"longitude":{"nullable":true,"type":"number"},"last_note":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"preview":{"type":"string"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"}},"required":["id","preview","event_time","emoji","meeting_type"],"additionalProperties":false},"team_keep_in_touch":{"nullable":true,"type":"object","properties":{"cadence_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["cadence_id","frequency_id","days","next_due_at","snoozed_until"],"additionalProperties":false},"contact_emails":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_birthdays":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contact_locations":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contacts_custom_fields":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"tags_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_sourceTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_destinationTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"feed_items":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"keep_in_touch_reminders":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"failed":{"type":"array","items":{"type":"object","properties":{"contactIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["contactIds","error"],"additionalProperties":false}}},"required":["merged","failed"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"mergeContactsV2","summary":"Merge duplicate contacts (v2)","description":"Merge one or more groups of duplicate contacts. The request body is `{ contactIds: Group[] }` where each group is either a plain array of ≥2 contact IDs (the OLDEST record survives) or `{ contact_ids: string[], primary_contact_id?: string }` to choose which record survives. Returns `{ data: { merged: Contact[], failed: [...] } }`: `merged` holds the surviving contacts, `failed` lists any groups that could not be merged — each with `error.code`, e.g. `merge_contact_not_found` when a group names a contact that does not exist or is not yours (the group is reported, never silently skipped). Archived contacts can be merged; the survivor is active when any member of its group was active and stays archived only when every member was archived. `Idempotency-Key` is REQUIRED.","x-mint":{"content":"## Use cases\n\n- Resolve duplicates from the \"Merge and Fix\" page (one group or all at once)\n- Merge from an automation that knows which record should survive (`primary_contact_id`)\n\n## Choosing the survivor\n\nBy default the oldest record (earliest `created_at`) in each group is kept and the others are absorbed into it. Pass a group as `{ contact_ids, primary_contact_id }` to keep a specific record instead; `primary_contact_id` must be one of `contact_ids` and must belong to you, otherwise the whole request is rejected with a 400 (it never silently falls back to the oldest record).\n\n## Migration from /v1\n\n/v1 `POST /v1/contacts/merge` returned only `{ mergedContactIds }` and was not idempotent. /v2 returns the full surviving contact entities (so clients can update their cache without a refetch) plus a per-group `failed[]` list, and REQUIRES an `Idempotency-Key` so a retried merge replays the original response instead of re-merging.\n\n<Warning>Merging is destructive: source contacts are absorbed into the survivor and deleted.</Warning>"},"parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}]}},"/v2/contacts/{contactId}/research":{"post":{"tags":["contacts"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"run":{"type":"boolean"},"force":{"type":"boolean"}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true},{"in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Optional. Accepted to dedupe retries on this endpoint. See `apps/rest-api/src/shared/idempotency.ts`."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"research":{"nullable":true,"type":"object","properties":{"run_id":{"nullable":true,"type":"string"},"status":{"type":"string","enum":["success","no_data_found"]},"reason":{"nullable":true,"type":"string","enum":["missing_name","fetch_failed","insufficient_info","wrong_person_suspected"]},"researched_at":{"type":"string"},"one_line_summary":{"type":"string"},"sections":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","enum":["current_focus","background","interests"]},"title":{"type":"string"},"bullets":{"type":"array","items":{"type":"string"}}},"required":["key","title","bullets"],"additionalProperties":false}},"sources":{"type":"object","additionalProperties":{"type":"object","properties":{"url":{"type":"string"},"title":{"type":"string"}},"required":["url","title"],"additionalProperties":false}},"identity_confidence":{"nullable":true,"type":"string","enum":["high","medium","low"]},"fields":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","enum":["linkedin","website","email","phone"]},"value":{"type":"string"},"display":{"type":"string"},"citations":{"type":"array","items":{"type":"number"}},"confidence":{"type":"string","enum":["high","medium","low"]},"evidence":{"type":"string"},"status":{"type":"string","enum":["pending","auto_applied","applied","already_present"]}},"required":["field","value","display","citations","confidence","evidence","status"],"additionalProperties":false}}},"required":["run_id","status","reason","researched_at","one_line_summary","sections","sources","identity_confidence","fields"],"additionalProperties":false},"applied":{"nullable":true,"type":"object","properties":{"linkedin":{"type":"boolean"},"website":{"type":"boolean"}},"required":["linkedin","website"],"additionalProperties":false},"in_progress":{"type":"boolean"},"stage":{"nullable":true,"type":"string","enum":["queued","searching","selecting","reading","writing","done","failed"]},"run_id":{"nullable":true,"type":"string"},"failure":{"nullable":true,"type":"string","enum":["unavailable","error"]}},"required":["research","applied","in_progress","stage","run_id","failure"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"researchContactV2","summary":"Read or run Dex Research on a contact (v2)","description":"Dex Research: a cited web research note about one contact (who they are, current focus, background, interests) plus structured findings (LinkedIn, website, email, phone) with per-finding confidence and evidence. The default body (`{}`) only READS the stored research and never generates — `research` is null when nothing has been researched yet — and reports where the contact's current or latest run is (`in_progress`, `stage`, `run_id`, `failure`). `{ run: true }` starts the pipeline (web search + page extraction + LLM summary); a run whose stored result is under 30 days old returns the cached note at once unless `force: true`. Otherwise the run executes in the background and the call answers immediately with `in_progress: true` and the run's `run_id` — poll the default body every few seconds until `in_progress` is false: the run finished when `research.run_id` equals that `run_id`, and failed when `failure` is set (`unavailable`: a research provider is down, retry later). Runs usually take 20–60 seconds and occasionally over two minutes. `in_progress: true` on a run request can also mean another request's run is already in flight — poll it the same way instead of starting another. A run auto-fills the contact's EMPTY `linkedin` / `website` fields when a high-confidence finding exists (those findings come back `auto_applied`); email and phone findings stay `pending` for the user to apply. A run request that would start a paid run is refused with 429 `research_limit_reached` once the user has used up a fair-use window — 100 runs per UTC calendar month and 50 per UTC day, counting forced re-runs and runs that later fail but never cache hits or a run already in flight — with `error.details` `{ window: \"month\" | \"day\", limit, resets_at }` and `Retry-After` set to the seconds until `resets_at`. Unlike the per-minute `rate_limited` 429 it will not clear on a retry: do not retry before `resets_at`. The default-body read is never limited this way. 404 when the contact does not belong to the authenticated user.","x-mint":{"content":"## Use cases\n\n- Prep for a meeting: `{ \"run\": true }`, poll `{}` until `in_progress` is false, then summarize `one_line_summary` and `sections`\n- Read the stored note on a contact detail page with the default body\n- Re-run past the 30-day cache with `{ \"run\": true, \"force\": true }`\n\n## Response\n\n`research.status` is `success` or `no_data_found` (with `reason`: `missing_name`, `fetch_failed`, `insufficient_info`, `wrong_person_suspected`). Bullets and the one-line summary carry `[[n]]` citation markers that index into `sources`.\n\n## Fair-use limit\n\nPaid runs are capped per user at 100 per UTC calendar month and 50 per UTC day. Past either, `{ \"run\": true }` answers 429 with `error.code` `research_limit_reached`, `error.details` `{ window, limit, resets_at }` and `Retry-After`. Tell it apart from the per-minute `rate_limited` 429 by the code: back off and retry `rate_limited`, but not `research_limit_reached`, which holds until `resets_at`.\n\n## Idempotency\n\nOptional — the 30-day cache and the per-contact run lock already prevent double spend; a key additionally earns a retried run the cached replay."}}},"/v2/favorites/{favoriteId}":{"get":{"tags":["favorites"],"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"favoriteId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"favorite":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"group_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"view_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contact_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"groups":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"views":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contacts":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id","created_at","updated_at"],"additionalProperties":false}},"required":["favorite"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getFavoriteV2","summary":"Get a favorite (v2)","description":"Retrieve a single favorite by its unique ID. Returns `{ data: { favorite: {...} } }`. The polymorphic target — exactly one of `group_id`, `view_id`, or `contact_id` — is on the favorite body; relations (`groups`, `views`, `contacts`) are inflated for the matching target only.","x-mint":{"content":"## Use cases\n\n- Hydrate a favorite detail / settings drawer on direct navigation\n- Refetch after a ranking change to display server state\n\n## Migration from /v1\n\n/v1 had no `GET /v1/favorites/:id` endpoint — single-row reads required going through the full list. /v2 adds it so cache writers can refetch one row after an optimistic mutation."}},"patch":{"tags":["favorites"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ranking":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"favoriteId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"favorite":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"group_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"view_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contact_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"groups":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"views":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contacts":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id","created_at","updated_at"],"additionalProperties":false}},"required":["favorite"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"updateFavoriteV2","summary":"Update a favorite (v2)","description":"Partial update of a favorite. Only `ranking` is mutable — the polymorphic target (group / view / contact) is fixed once the row is created. **Requires `Idempotency-Key`.** Returns `{ data: { favorite: {...} } }`.","x-mint":{"content":"## Use cases\n\n- Reorder a single favorite\n- Clear the ranking on a favorite (pass `null`)\n\n## Migration from /v1\n\n/v1 used `PUT /v1/favorites/:id`. /v2 uses `PATCH` because the body is a partial update."}},"delete":{"tags":["favorites"],"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"favoriteId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteFavoriteV2","summary":"Delete a favorite (v2)","description":"Unstar a group, view, or contact by deleting the favorite row. Returns the canonical bulk envelope: `{ data: { affected: 1, ids: [favoriteId] } }`. `Idempotency-Key` is optional.","x-mint":{"content":"## Use cases\n\n- Unstar a view from the view tab menu\n- Remove a stale favorite pointing at a deleted contact\n\n## Migration from /v1\n\n/v1 returned `{ error: false, message: \"Favorite deleted successfully\" }` and supported the item-keyed convenience routes `DELETE /v1/favorites/group/:groupId` and `DELETE /v1/favorites/view/:viewId`. /v2 standardizes on the canonical bulk envelope; the convenience routes are no longer needed because the favorites collection on the client knows which favorite row a target maps to.\n\n## Single vs. bulk envelope\n\nResponse uses the same shape as the bulk delete endpoint so cache-invalidation logic can be uniform across single and bulk deletes."}}},"/v2/favorites/":{"get":{"tags":["favorites"],"parameters":[{"schema":{"type":"string","enum":["group","view","contact"]},"in":"query","name":"type","required":false},{"schema":{"type":"object","properties":{"ranking":{}},"additionalProperties":false},"in":"query","name":"orderBy","required":false},{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"take","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"query","name":"cursor","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"favorites":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"group_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"view_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contact_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"groups":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"views":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contacts":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id","created_at","updated_at"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["favorites"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listFavoritesV2","summary":"List favorites (v2)","description":"List all of the authenticated user's favorites across groups, views, and contacts. Returns `{ data: { favorites: [...], pagination: { nextCursor, count } } }`. Supports `?take=`, `?cursor=`, and `?orderBy[ranking]=asc|desc`.","x-mint":{"content":"## Use cases\n\n- Populate the favorites strip in the sidebar\n- Hydrate a TanStack DB collection on initial load\n- Render the \"starred\" pseudo-tab\n\n## Migration from /v1\n\n/v1 returned `{ error: false, data: { items: [...], nextCursor } }`. /v2 uses the canonical envelope: `{ data: { favorites: [...], pagination: { nextCursor, count } } }` — entity plural at the top level, pagination namespaced."}},"post":{"tags":["favorites"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"group_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"view_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"ranking":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"additionalProperties":false}}}},"responses":{"201":{"description":"Created","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"favorite":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"group_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"view_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contact_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"groups":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"views":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contacts":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id","created_at","updated_at"],"additionalProperties":false}},"required":["favorite"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createFavoriteV2","summary":"Create a favorite (v2)","description":"Star a group, view, or contact. Body must include **exactly one** of `group_id`, `view_id`, or `contact_id`. `ranking` is optional. **Requires `Idempotency-Key`.** Returns `{ data: { favorite: {...} } }` with status 201.","x-mint":{"content":"## Use cases\n\n- Star a view from the view tab menu\n- Star a contact from the profile page\n- Pin a group to the sidebar\n\n## Migration from /v1\n\n/v1 used `POST /v1/favorites/` with the same body. /v2 wraps the response in the canonical envelope and requires an `Idempotency-Key` so optimistic mutations from TanStack DB can safely retry.\n\n## Idempotency\n\nGenerate one UUID per logical create operation and reuse it on every retry. TanStack DB collections pass `mutationId` directly."}}},"/v2/favorites/count":{"get":{"tags":["favorites"],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["count"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"countFavoritesV2","summary":"Count favorites (v2)","description":"Return the count of the authenticated user's favorites. Cheap path for a sidebar badge / quota check without loading the full list.","x-mint":{"content":"## Use cases\n\n- Sidebar badge counts\n- Quota enforcement before showing a \"create favorite\" CTA"}}},"/v2/favorites/batch":{"post":{"tags":["favorites"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"favorites":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"group_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"view_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"ranking":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"additionalProperties":false}}},"required":["favorites"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"favorites":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"group_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"view_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contact_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"groups":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"views":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contacts":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id","created_at","updated_at"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["favorites"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"batchCreateFavoritesV2","summary":"Bulk-create favorites (v2)","description":"Create multiple favorites in a single request. Each entry must include exactly one of `group_id`, `view_id`, or `contact_id`. Returns `{ data: { favorites: [...] } }` with status 201. **Requires `Idempotency-Key`.**","x-mint":{"content":"## Use cases\n\n- Migration tooling that recreates a user's favorites set\n- Template-driven provisioning\n\n## Idempotency\n\nGenerate one UUID per logical batch operation and reuse it on every retry. Retrying with the same key replays the original response."}}},"/v2/favorites/batch-update":{"post":{"tags":["favorites"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"updates":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"favoriteId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"data":{"type":"object","properties":{"ranking":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"additionalProperties":false}},"required":["favoriteId","data"],"additionalProperties":false}}},"required":["updates"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"batchUpdateFavoritesV2","summary":"Bulk-update favorites (v2)","description":"Apply per-row partial updates (typically `ranking` reorderings) to multiple favorites in a single request. Uses `Promise.allSettled` semantics: a 200 response can carry per-row failures in `data.failed[]`. **Requires `Idempotency-Key`.**","x-mint":{"content":"## Use cases\n\n- Drag-to-reorder favorites in the sidebar — rewrite every `ranking` to its new index in one batched roundtrip\n\n## Migration from /v1\n\n/v1 used `POST /v1/favorites/batch-update` with a flat `{ favoriteId, ranking }` body and returned `{ data: { favorites: [...] } }`. /v2 uses `{ favoriteId, data: { ranking } }` (mirroring contacts/views) and the canonical bulk envelope — surfaces successful IDs and per-row failures."}}},"/v2/favorites/batch-delete":{"post":{"tags":["favorites"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"favoriteIds":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["favoriteIds"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"batchDeleteFavoritesV2","summary":"Bulk-delete favorites (v2)","description":"Permanently delete multiple favorites in a single request. Returns `{ data: { affected, ids } }`. `Idempotency-Key` is optional.","x-mint":{"content":"## Use cases\n\n- Bulk-unstar a multi-selection of favorites\n- Cleanup tooling\n\n## Migration from /v1\n\n/v1 had no bulk-delete endpoint — callers had to call `DELETE /v1/favorites/:id` per row. /v2 adds one in line with contacts/views for consistency."}}},"/v2/groups/{groupId}":{"get":{"tags":["groups"],"parameters":[{"schema":{"type":"object","properties":{"parent_group":{"type":"boolean"},"sub_groups":{"type":"boolean"},"sub_groups_name_order":{},"contacts_count":{"type":"boolean"},"sub_groups_count":{"type":"boolean"},"is_favorite":{"type":"boolean"}},"additionalProperties":false},"in":"query","name":"include","required":false},{"schema":{"type":"object","properties":{"parent_group":{"type":"boolean"},"sub_groups":{"type":"boolean"},"sub_groups_name_order":{},"contacts_count":{"type":"boolean"},"sub_groups_count":{"type":"boolean"},"is_favorite":{"type":"boolean"},"id":{"type":"boolean"},"user_id":{"type":"boolean"},"name":{"type":"boolean"},"emoji":{"type":"boolean"},"description":{"type":"boolean"},"created_at":{"type":"boolean"},"parent_id":{"type":"boolean"},"ranking":{"type":"boolean"},"workspace_id":{"type":"boolean"},"archived_at":{"type":"boolean"},"parent_groups":{"type":"boolean"},"groups_contacts":{"type":"boolean"},"views":{"type":"boolean"},"favorites":{"type":"boolean"},"share_links":{"type":"boolean"},"_count":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["parent_group","sub_groups","sub_groups_name_order","contacts_count","sub_groups_count","is_favorite","id","user_id","name","emoji","description","created_at","parent_id","ranking","workspace_id","archived_at","parent_groups","groups_contacts","views","favorites","share_links","_count"]}},"in":"query","name":"select","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"groupId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"group":{"$ref":"#/definitions/__schema0"}},"required":["group"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"definitions":{"__schema0":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"emoji":{"type":"string"},"description":{"nullable":true,"type":"string"},"parent_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"archived_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"is_favorite":{"type":"boolean"},"sub_groups":{"type":"array","items":{"$ref":"#/definitions/__schema0"}},"parent_groups":{"nullable":true,"allOf":[{"$ref":"#/definitions/__schema0"}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sub_groups":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}}}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getGroupV2","summary":"Get a group (v2)","description":"Retrieve a single group by its unique ID. Returns the canonical envelope: `{ data: { group: {...} } }`. Pass `?include[is_favorite]=true` to inflate the response with a computed `is_favorite` boolean, or `?include[parent_group]=true` / `?include[sub_groups]=true` to hydrate the parent / children relations.","x-mint":{"content":"## Use cases\n\n- Hydrate a group detail page on direct navigation\n- Refetch after a mutation to display server state\n\n## Migration from /v1\n\n/v1 returned `{ error: false, data: { group: {...} } }`. /v2 drops the `error` field (HTTP status is the source of truth) and uses `{ data: { group: {...} } }`."}},"patch":{"tags":["groups"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"group":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"emoji":{"type":"string"},"description":{"type":"string"},"parent_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"parent":{}},"additionalProperties":false}},"required":["group"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"groupId","required":true},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"group":{"$ref":"#/definitions/__schema0"}},"required":["group"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"definitions":{"__schema0":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"emoji":{"type":"string"},"description":{"nullable":true,"type":"string"},"parent_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"archived_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"is_favorite":{"type":"boolean"},"sub_groups":{"type":"array","items":{"$ref":"#/definitions/__schema0"}},"parent_groups":{"nullable":true,"allOf":[{"$ref":"#/definitions/__schema0"}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sub_groups":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}}}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"updateGroupV2","summary":"Update a group (v2)","description":"Partial update of a group. Send only the fields that change (`name`, `emoji`, `description`, `parent_id`). **Requires `Idempotency-Key`.** Returns `{ data: { group: {...} } }`.","x-mint":{"content":"## Use cases\n\n- Rename a group\n- Re-parent a group (set or clear `parent_id`)\n- Change a group emoji or description\n\n## Migration from /v1\n\n/v1 used `PUT /v1/groups/:groupId`. /v2 uses `PATCH` because the body is a partial update, not a full resource replacement."}},"delete":{"tags":["groups"],"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"groupId","required":true},{"in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Optional. Accepted to dedupe retries on this endpoint. See `apps/rest-api/src/shared/idempotency.ts`."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteGroupV2","summary":"Delete a group (v2)","description":"Permanently delete a group. The contacts in the group are NOT deleted — only their `groups_contacts` membership rows and the group itself are removed. Returns the canonical bulk envelope: `{ data: { affected: 1, ids: [groupId] } }`. A very large group whose membership cascade cannot finish inside the request budget returns `202` with the same body: the deletion is accepted and completes in the background within minutes. `Idempotency-Key` is optional.","x-mint":{"content":"## Use cases\n\n- Remove a group that is no longer needed\n- Clean up empty or unused groups\n\n## Single vs. bulk envelope\n\nResponse uses the same shape as the bulk delete endpoint so cache-invalidation logic can be uniform across single and bulk deletes.\n\n<Note>Deleting a group does not delete the contacts in it. The contacts remain in your account and can still be found in other groups or the main contact list.</Note>"}}},"/v2/groups/":{"get":{"tags":["groups"],"parameters":[{"schema":{"type":"object","properties":{"name":{},"number_of_contacts":{}},"additionalProperties":false},"in":"query","name":"orderBy","required":false},{"schema":{"type":"object","properties":{"has_subgroups":{"type":"boolean"},"has_parent":{"type":"boolean"},"has_name":{"type":"string","minLength":1,"maxLength":100},"not_in":{"type":"array","items":{"type":"string"}},"archived":{"type":"boolean"}},"additionalProperties":false},"in":"query","name":"where","required":false},{"schema":{"type":"object","properties":{"parent_group":{"type":"boolean"},"sub_groups":{"type":"boolean"},"sub_groups_name_order":{},"contacts_count":{"type":"boolean"},"sub_groups_count":{"type":"boolean"},"is_favorite":{"type":"boolean"}},"additionalProperties":false},"in":"query","name":"include","required":false},{"schema":{"type":"object","properties":{"parent_group":{"type":"boolean"},"sub_groups":{"type":"boolean"},"sub_groups_name_order":{},"contacts_count":{"type":"boolean"},"sub_groups_count":{"type":"boolean"},"is_favorite":{"type":"boolean"},"id":{"type":"boolean"},"user_id":{"type":"boolean"},"name":{"type":"boolean"},"emoji":{"type":"boolean"},"description":{"type":"boolean"},"created_at":{"type":"boolean"},"parent_id":{"type":"boolean"},"ranking":{"type":"boolean"},"workspace_id":{"type":"boolean"},"archived_at":{"type":"boolean"},"parent_groups":{"type":"boolean"},"groups_contacts":{"type":"boolean"},"views":{"type":"boolean"},"favorites":{"type":"boolean"},"share_links":{"type":"boolean"},"_count":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["parent_group","sub_groups","sub_groups_name_order","contacts_count","sub_groups_count","is_favorite","id","user_id","name","emoji","description","created_at","parent_id","ranking","workspace_id","archived_at","parent_groups","groups_contacts","views","favorites","share_links","_count"]}},"in":"query","name":"select","required":false},{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"take","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"query","name":"cursor","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/definitions/__schema0"}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["groups"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"definitions":{"__schema0":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"emoji":{"type":"string"},"description":{"nullable":true,"type":"string"},"parent_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"archived_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"is_favorite":{"type":"boolean"},"sub_groups":{"type":"array","items":{"$ref":"#/definitions/__schema0"}},"parent_groups":{"nullable":true,"allOf":[{"$ref":"#/definitions/__schema0"}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sub_groups":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}}}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listGroupsV2","summary":"List groups (v2)","description":"List all of the authenticated user's groups. Returns the canonical list envelope: `{ data: { groups: [...] } }`. Supports `?orderBy[name]=asc|desc` and `?orderBy[number_of_contacts]=asc|desc`, plus `?where[has_parent]=true` / `?where[has_subgroups]=true` for sidebar tree navigation.","x-mint":{"content":"## Use cases\n\n- Populate the sidebar list of groups\n- Hydrate a TanStack DB collection on initial load\n\n## Migration from /v1\n\n/v1 returned `{ error: false, data: { groups: [...] } }`. /v2 uses `{ data: { groups: [...] } }`. Pagination is not surfaced — the sidebar consumer fetches the full set; large group counts are uncommon for the personal-CRM use case."}},"post":{"tags":["groups"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"group":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"emoji":{"type":"string"},"description":{"type":"string"},"parent_id":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"parent":{},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","not":{"enum":["00000000-0000-0000-0000-000000000000"]}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contact":{}},"required":["contact_id"],"additionalProperties":false}}},"required":["name"],"additionalProperties":false}},"required":["group"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"group":{"$ref":"#/definitions/__schema0"}},"required":["group"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"definitions":{"__schema0":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"emoji":{"type":"string"},"description":{"nullable":true,"type":"string"},"parent_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"archived_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"is_favorite":{"type":"boolean"},"sub_groups":{"type":"array","items":{"$ref":"#/definitions/__schema0"}},"parent_groups":{"nullable":true,"allOf":[{"$ref":"#/definitions/__schema0"}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sub_groups":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}}}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createGroupV2","summary":"Create a group (v2)","description":"Create ONE group. Accepts `name`, `emoji`, `description`, `parent_id` (for nested groups), and an optional `groups_contacts` array to add starter members. **Requires `Idempotency-Key`.** Returns `{ data: { group: {...} } }` with status 201.","x-mint":{"content":"## Use cases\n\n- Let users create custom groups to organize their contacts\n- Programmatically create groups during data import\n- Set up default groups for new users during onboarding\n\n## Migration from /v1\n\n/v1 used `POST /v1/groups/` with the same `{ group }` body. /v2 adds required idempotency: retries (network blip, mobile-app suspend/resume) now dedupe server-side instead of creating duplicate groups when the unique-constraint race is lost.\n\n## Idempotency\n\nGenerate one UUID per logical create operation and reuse it on every retry. TanStack DB collections pass `mutationId` directly."},"parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}]}},"/v2/groups/count":{"get":{"tags":["groups"],"parameters":[{"schema":{"type":"object","properties":{"has_subgroups":{"type":"boolean"},"has_parent":{"type":"boolean"},"has_name":{"type":"string","minLength":1,"maxLength":100},"not_in":{"type":"array","items":{"type":"string"}},"archived":{"type":"boolean"}},"additionalProperties":false},"in":"query","name":"where","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["count"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"countGroupsV2","summary":"Count groups (v2)","description":"Return the count of the authenticated user's groups. Cheap path for a sidebar badge / quota check without loading the full list.","x-mint":{"content":"## Use cases\n\n- Sidebar badge counts\n- Quota enforcement before showing a \"create group\" CTA"}}},"/v2/groups/contact-counts":{"get":{"tags":["groups"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"groupIds","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"counts":{"type":"object","additionalProperties":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}}},"required":["counts"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getGroupContactCountsV2","summary":"Get contact counts per group (v2)","description":"Return the contact count for each group in one round-trip. Pass `?groupIds=a,b,c` to scope the query to specific groups; omit it to fetch counts for every group the user owns. Returns `{ data: { counts: { [groupId]: number } } }`.","x-mint":{"content":"## Use cases\n\n- Display contact counts next to group names in the sidebar\n- Detect empty groups for cleanup tooling\n\n## Why a domain-specific envelope\n\nThe payload is a `Record<groupId, number>` map rather than an entity body, so it does not fit the canonical entity envelope. The shape is documented as a one-off — every group endpoint that returns groups uses `{ data: { group(s): ... } }`."}}},"/v2/groups/{groupId}/contacts":{"get":{"tags":["groups"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"take","required":false},{"schema":{"type":"string","minLength":1,"maxLength":2048},"in":"query","name":"cursor","required":false,"description":"Opaque pagination cursor: the `nextCursor` of the previous page, passed back unchanged."},{"schema":{"type":"object","properties":{"linkedin_data":{"type":"boolean"},"web_search_summary":{"type":"boolean"},"groups_count":{"type":"boolean"},"coordinates":{"type":"boolean"},"last_note":{"type":"boolean"},"contact_emails":{"type":"boolean"},"contact_phone_numbers":{"type":"boolean"},"contact_birthdays":{"type":"boolean"},"contact_locations":{"type":"boolean"},"contacts_custom_fields":{"type":"boolean"},"legacy_contact_addresses":{"type":"boolean"},"groups_contacts":{"type":"boolean"},"tags_contacts":{"type":"boolean"},"timeline_items_contacts":{"type":"boolean"},"reminders_contacts":{"type":"boolean"},"feed_items":{"type":"boolean"},"keep_in_touch_reminders":{"type":"boolean"},"contact_relations_contact_relations_sourceTocontacts":{"type":"boolean"},"contact_relations_contact_relations_destinationTocontacts":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["linkedin_data","web_search_summary","groups_count","coordinates","last_note","contact_emails","contact_phone_numbers","contact_birthdays","contact_locations","contacts_custom_fields","legacy_contact_addresses","groups_contacts","tags_contacts","timeline_items_contacts","reminders_contacts","feed_items","keep_in_touch_reminders","contact_relations_contact_relations_sourceTocontacts","contact_relations_contact_relations_destinationTocontacts"]}},"in":"query","name":"include","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"groupId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"contacts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"full_name":{"nullable":true,"type":"string"},"description":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"},"company":{"nullable":true,"type":"string"},"education":{"nullable":true,"type":"string"},"legacy_location":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"business_card_url":{"nullable":true,"type":"string"},"website":{"nullable":true,"type":"string"},"image_source":{"nullable":true,"type":"string"},"birthday":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"birthday_year":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"linkedin":{"nullable":true,"type":"string"},"twitter":{"nullable":true,"type":"string"},"facebook":{"nullable":true,"type":"string"},"instagram":{"nullable":true,"type":"string"},"telegram":{"nullable":true,"type":"string"},"tiktok":{"nullable":true,"type":"string"},"youtube":{"nullable":true,"type":"string"},"starred":{"type":"boolean"},"is_archived":{"type":"boolean"},"ignore_merge":{"type":"boolean"},"never_keep_in_touch":{"type":"boolean"},"source":{"type":"string"},"priority_tier":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"frequency":{"nullable":true,"type":"string"},"frequency_text":{"nullable":true,"type":"string"},"last_seen_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"last_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"next_reminder_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_met_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_companies":{"nullable":true,"type":"string"},"linkedin_education":{"nullable":true,"type":"string"},"linkedin_enhance_date":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_last_message_snippet":{"nullable":true,"type":"string"},"linkedin_message_link":{"nullable":true,"type":"string"},"linkedin_urn":{"nullable":true,"type":"string"},"linkedin_headline":{"nullable":true,"type":"string"},"whatsapp_message_link":{"nullable":true,"type":"string"},"whatsapp_message_snippet":{"nullable":true,"type":"string"},"whatsapp_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"imessage_message_link":{"nullable":true,"type":"string"},"imessage_message_snippet":{"nullable":true,"type":"string"},"imessage_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"instagram_message_link":{"nullable":true,"type":"string"},"instagram_message_snippet":{"nullable":true,"type":"string"},"instagram_last_message_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gmail_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gmail_last_interaction_provider_id":{"nullable":true,"type":"string"},"gmail_last_interaction_subject":{"nullable":true,"type":"string"},"gcal_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"gcal_last_interaction_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"gcal_last_interaction_provider_id":{"nullable":true,"type":"string"},"gcal_last_interaction_title":{"nullable":true,"type":"string"},"phone_call_interaction_snippet":{"nullable":true,"type":"string"},"phone_call_last_interaction_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"web_search_summary":{"nullable":true},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"geocode_attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"geocode_failed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false},"frequency_interval":{},"linkedin_data":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"latitude":{"nullable":true,"type":"number"},"longitude":{"nullable":true,"type":"number"},"last_note":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"preview":{"type":"string"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"}},"required":["id","preview","event_time","emoji","meeting_type"],"additionalProperties":false},"team_keep_in_touch":{"nullable":true,"type":"object","properties":{"cadence_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["cadence_id","frequency_id","days","next_due_at","snoozed_until"],"additionalProperties":false},"contact_emails":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_phone_numbers":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_birthdays":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"contact_locations":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contacts_custom_fields":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"legacy_contact_addresses":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"groups_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"tags_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"reminders_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_sourceTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"contact_relations_contact_relations_destinationTocontacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"feed_items":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"keep_in_touch_reminders":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}}},"required":["id"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["contacts"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listGroupContactsV2","summary":"List contacts in a group (v2)","description":"Retrieve contacts in a group. Email and phone relations are omitted by default; request them with `?include[contact_emails]=true` or `?include[contact_phone_numbers]=true`.","x-mint":{"content":"## Use cases\n\n- Display the contact list for a selected group\n- Export contacts from a specific group\n\n## Related data\n\nRelations are omitted unless requested. Add `?include[contact_emails]=true` for email addresses or `?include[contact_phone_numbers]=true` for phone numbers. Both can be requested together.\n\n## Envelope choice\n\nResponse uses `ContactEnvelopes.list` (NOT the group envelope) so callers reuse one TanStack DB collection schema for \"contacts in a group\" and \"all contacts\".\n\n<Note>The cursor is opaque: pass `nextCursor` back unchanged, with the same `orderBy`, and never parse or build one. A cursor reused after the sort changes is refused with `400 invalid_cursor`: start again from the first page. A contact id sent as the cursor, which is what `nextCursor` used to be, is still accepted.</Note>"}},"post":{"tags":["groups"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contactIds":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"allowPartial":{"type":"boolean"}},"required":["contactIds"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"groupId","required":true},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}},"remaining":{"type":"array","items":{"type":"string"}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"addContactsToGroupV2","summary":"Add contacts to a group (v2)","description":"Add one or more contacts to a group by providing an array of contact IDs. Contacts that are already members are silently skipped server-side. **Requires `Idempotency-Key`.** Returns `{ data: { affected, ids, remaining? } }` where `affected` is the count of NEW memberships created, `ids` echoes the input contact IDs that were applied. Send `allowPartial: true` to accept a partial success: `remaining` then lists input IDs the server could not apply inside its request budget — nothing about them was committed, so resubmit exactly those under a new `Idempotency-Key`. Without `allowPartial`, a write that cannot finish returns a retryable `500` `timeout`; retrying the same list is safe.","x-mint":{"content":"## Use cases\n\n- Let users drag-and-drop contacts into a group\n- Bulk-add contacts after filtering or searching\n- Automatically organize imported contacts into groups\n\n## Migration from /v1\n\n/v1 used `PUT /v1/groups/:groupId/contacts` for add (and `POST` on the same URL for remove — confusing). /v2 separates the two ops: `POST /:groupId/contacts` adds, `POST /:groupId/contacts/batch-remove` removes.\n\n## Idempotency\n\nRetries without an idempotency key would re-execute `createMany skipDuplicates: true` — safe semantically but wasteful. Required key dedupes the whole op."}}},"/v2/groups/{groupId}/merge":{"post":{"tags":["groups"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sourceGroupIds":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"finalName":{"type":"string","minLength":1,"maxLength":100},"finalEmoji":{"type":"string","minLength":1}},"required":["sourceGroupIds","finalName","finalEmoji"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"groupId","required":true},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"group":{"$ref":"#/definitions/__schema0"},"mergedGroupIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"reparentedGroupIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"contactIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"movedViewIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"deletedFavoriteIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"deletedShareLinkIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["group","mergedGroupIds","reparentedGroupIds","contactIds","movedViewIds","deletedFavoriteIds","deletedShareLinkIds"],"additionalProperties":false}},"required":["data"],"additionalProperties":false,"definitions":{"__schema0":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"emoji":{"type":"string"},"description":{"nullable":true,"type":"string"},"parent_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"archived_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"is_favorite":{"type":"boolean"},"sub_groups":{"type":"array","items":{"$ref":"#/definitions/__schema0"}},"parent_groups":{"nullable":true,"allOf":[{"$ref":"#/definitions/__schema0"}]},"_count":{"type":"object","properties":{"groups_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"sub_groups":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["groups_contacts"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}}}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"mergeGroupsV2","summary":"Merge groups (v2)","description":"Merge one or more source groups into the group identified by `groupId`. The destination keeps its ID, receives the final name, emoji, and de-duplicated union of contact memberships, while selected source groups are deleted. Direct subgroups are reparented under the destination and source-linked saved views are retargeted. **Requires `Idempotency-Key`.** A merge whose combined source memberships exceed the synchronous limit is refused up front with a `400` naming the limit; split it into smaller merges. A `500` `timeout` means nothing was committed and the same request is safe to retry, while a `500` `merge_committed_read_failed` means the merge DID commit and only its response could not be built — refetch instead of retrying.","x-mint":{"content":"## Use cases\n\n- Consolidate overlapping groups without duplicating contacts\n- Preserve stable group pointers while reorganizing hierarchy\n- Rename and re-emoji the surviving group in the same atomic operation\n\n## Transaction semantics\n\nThe entire merge is atomic: contact memberships are copied with duplicate skipping, hierarchy and saved-view pointers are updated, source groups are deleted, and the destination identity is updated. A failure rolls back every step. Contacts themselves are never deleted.\n\nThe merge runs inside one bounded transaction, so it is refused up front when the combined source memberships are larger than that transaction can finish. Oversized merges get a `400` naming the limit rather than a timeout part-way through.\n\n## Response\n\nReturns the surviving `group` plus `mergedGroupIds`, `reparentedGroupIds`, `contactIds`, `movedViewIds`, `deletedFavoriteIds`, and `deletedShareLinkIds` so normalized clients can reconcile every affected collection without a full refetch. `contactIds` is the destination's COMPLETE membership after the merge and is always present on a success — never partial, never omitted.\n\n## Failure modes\n\n<Warning>Two `500`s on this route mean opposite things, and clients must tell them apart.\n\n`timeout` — the transaction was rolled back. Nothing changed; the same request is safe to retry.\n\n`merge_committed_read_failed` — the merge COMMITTED, but the read that builds `contactIds` failed afterwards, so no success envelope could be returned. The source groups are already gone, so retrying returns `404`. Refetch the groups and contacts instead, and tell the user the merge succeeded.</Warning>"}}},"/v2/groups/batch-delete":{"post":{"tags":["groups"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"groupIds":{"minItems":1,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["groupIds"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"batchDeleteGroupsV2","summary":"Bulk-delete groups (v2)","description":"Permanently delete multiple groups in a single request. Uses `Promise.allSettled` semantics: a 200 response can carry per-row failures in `data.failed[]` so cache writers can invalidate just the rows that succeeded. `Idempotency-Key` is optional. Returns `{ data: { affected, ids, failed? } }`.","x-mint":{"content":"## Use cases\n\n- Remove a multi-selection of groups\n- Cleanup tooling\n\n## Partial failure\n\nEach group delete is a batched cascade (`groups_contacts` rows → `favorites` rows → the group row). A failure on one group does not block the others — the response surfaces successes in `ids[]` and failures in `failed[]` with the offending groupId and a structured `{ code, message }`.\n\n<Note>This is a destructive operation. Deleted groups cannot be recovered.</Note>"},"parameters":[{"in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Optional. Accepted to dedupe retries on this endpoint. See `apps/rest-api/src/shared/idempotency.ts`."}]}},"/v2/groups/{groupId}/contacts/batch-remove":{"post":{"tags":["groups"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contactIds":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"allowPartial":{"type":"boolean"}},"required":["contactIds"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"groupId","required":true},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}},"remaining":{"type":"array","items":{"type":"string"}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"removeContactsFromGroupV2","summary":"Remove contacts from a group (v2)","description":"Remove one or more contacts from a group. The contacts themselves are NOT deleted — only their `groups_contacts` membership rows are removed. **Requires `Idempotency-Key`.** Returns `{ data: { affected, ids, remaining? } }` where `affected` is the count of rows actually deleted, `ids` echoes the input contact IDs that were applied. Send `allowPartial: true` to accept a partial success: `remaining` then lists input IDs the server could not apply inside its request budget — resubmit exactly those under a new `Idempotency-Key`. Without `allowPartial`, a write that cannot finish returns a retryable `500` `timeout`; retrying the same list is safe.","x-mint":{"content":"## Use cases\n\n- Let users remove contacts from a group via the UI\n- Clean up group membership after a reorganization\n\n## Migration from /v1\n\n/v1 overloaded `POST /v1/groups/:groupId/contacts` for remove (same URL as add, different verb). /v2 uses an explicit verb-suffix URL: `/contacts/batch-remove`. POST-with-body (not DELETE-with-body) because DELETE bodies are HTTP-spec-discouraged and some proxies strip them.\n\n<Note>Removing a contact from a group does not delete the contact. It only removes the association between the contact and this group.</Note>"}}},"/v2/timeline/notes":{"post":{"tags":["timeline"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"note":{"type":"object","properties":{"note":{"type":"string","maxLength":50000},"custom_emoji":{"type":"string"},"event_time":{},"meeting_type":{"anyOf":[{"type":"string","enum":["call","coffee","email","meal","meeting","networking","note","other","party","text"]},{"type":"null"}]},"meeting_type_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"attachments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"url":{"type":"string","format":"uri"},"file_name":{"type":"string"},"file_size":{"type":"number"}},"required":["url","file_name"],"additionalProperties":false}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"is_origin":{"description":"Marks the contact whose page the note was written on. Create only; at most one link may set it. Ignored on update.","type":"boolean"},"contacts":{}},"required":["contact_id"],"additionalProperties":false}},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"google_calendar_event_id_v3":{"type":"string"},"oauth_credential_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"reminder_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"audience":{"description":"Workspace notes only: \"shared\" (every member, the default) or \"private\" (only the author). Only the author may change it. Ignored for Personal notes, which are always private.","type":"string","enum":["private","shared"]}},"required":["event_time"],"additionalProperties":false}},"required":["note"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"object","properties":{"timeline_items_contacts":{"type":"boolean"},"attachments":{"type":"boolean"}},"additionalProperties":false},"in":"query","name":"include","required":false},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}],"responses":{"201":{"description":"Created","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"note":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"audience":{"type":"string","enum":["private","shared"]},"note":{"nullable":true,"type":"string"},"custom_emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"},"meeting_type_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"google_calendar_event_id_v3":{"nullable":true,"type":"string"},"oauth_credential_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"calendar_account_email":{"nullable":true,"type":"string"},"calendar_account_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"reminder_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"channels":{"type":"array","items":{"type":"string","enum":["whatsapp","imessage","linkedin","instagram"]}},"next_cursor":{"type":"string"},"meeting_types":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"attachments":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["id","channels","meeting_types"],"additionalProperties":false}},"required":["note"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createNoteV2","summary":"Create a note (v2)","description":"Create a note (a `timeline_items` row) optionally linked to contacts. Returns the created note in the canonical single-entity envelope.","x-mint":{"content":"## Use cases\n\n- Capture a note from the dex-webapp timeline composer\n- Log a meeting or interaction against one or more contacts\n\n## Migration from /v1\n\nThe /v1 surface was `POST /v1/timeline` with response `{ error: false, data: { note } }`. /v2 nests note CRUD under `/v2/timeline/notes` and uses the canonical envelope `{ data: { note } }` (no `error: false`).\n\n## Idempotency\n\n`idempotent: required` — pass an `Idempotency-Key` header (UUID per logical operation, reused on retry) so a retried create doesn't duplicate the note."}},"get":{"tags":["timeline"],"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"query","name":"contact_id","required":true},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"query","name":"cursor","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100},"in":"query","name":"take","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"notes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"audience":{"type":"string","enum":["private","shared"]},"note":{"nullable":true,"type":"string"},"custom_emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"},"meeting_type_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"google_calendar_event_id_v3":{"nullable":true,"type":"string"},"oauth_credential_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"calendar_account_email":{"nullable":true,"type":"string"},"calendar_account_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"reminder_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"channels":{"type":"array","items":{"type":"string","enum":["whatsapp","imessage","linkedin","instagram"]}},"next_cursor":{"type":"string"},"meeting_types":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"attachments":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["id","channels","meeting_types"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["notes"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listContactNotesV2","summary":"List a contact's notes (v2)","description":"List one contact's notes, newest first, in the canonical notes list envelope, cursor-paginated. Also served in a workspace (`X-Dex-Workspace`), where it returns the workspace's shared notes on that contact plus your own private ones.","x-mint":{"content":"## Use cases\n\n- Show the notes on a contact's timeline\n- Read a workspace contact's notes (the note search is Personal-only)\n\n## Pagination\n\nCursor-based. Pass the returned `pagination.nextCursor` back verbatim as `cursor` to fetch the next page; it's opaque (server-emitted) — never parse or construct one client-side. `take` caps the page size (max 100).\n\n## Workspace scope\n\nSend `X-Dex-Workspace` to read a workspace contact's notes. An API key needs the workspace's API access enabled (otherwise 403 `workspace_api_access_disabled`)."}}},"/v2/timeline/notes/batch":{"post":{"tags":["timeline"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"notes":{"maxItems":500,"type":"array","items":{"type":"object","properties":{"note":{"type":"string","maxLength":50000},"custom_emoji":{"type":"string"},"event_time":{},"meeting_type":{"anyOf":[{"type":"string","enum":["call","coffee","email","meal","meeting","networking","note","other","party","text"]},{"type":"null"}]},"meeting_type_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"attachments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"url":{"type":"string","format":"uri"},"file_name":{"type":"string"},"file_size":{"type":"number"}},"required":["url","file_name"],"additionalProperties":false}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"is_origin":{"description":"Marks the contact whose page the note was written on. Create only; at most one link may set it. Ignored on update.","type":"boolean"},"contacts":{}},"required":["contact_id"],"additionalProperties":false}},"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"google_calendar_event_id_v3":{"type":"string"},"oauth_credential_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"reminder_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["event_time"],"additionalProperties":false}}},"required":["notes"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"object","properties":{"timeline_items_contacts":{"type":"boolean"},"attachments":{"type":"boolean"}},"additionalProperties":false},"in":"query","name":"include","required":false},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}],"responses":{"201":{"description":"Created","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"notes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"audience":{"type":"string","enum":["private","shared"]},"note":{"nullable":true,"type":"string"},"custom_emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"},"meeting_type_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"google_calendar_event_id_v3":{"nullable":true,"type":"string"},"oauth_credential_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"calendar_account_email":{"nullable":true,"type":"string"},"calendar_account_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"reminder_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"channels":{"type":"array","items":{"type":"string","enum":["whatsapp","imessage","linkedin","instagram"]}},"next_cursor":{"type":"string"},"meeting_types":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"attachments":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["id","channels","meeting_types"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["notes"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"batchCreateNotesV2","summary":"Create many notes (v2)","description":"Bulk-create up to 500 notes in one request. Returns the created notes in the canonical list envelope.","x-mint":{"content":"## Use cases\n\n- Import notes from a CSV file\n- Migrate notes from another system\n\n## Idempotency\n\n`idempotent: required` — pass an `Idempotency-Key` header (UUID per logical batch, reused on retry) so a retried import doesn't duplicate every note in the batch."}}},"/v2/timeline/notes/search":{"get":{"tags":["timeline"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"searchQuery","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"query","name":"contactId","required":false},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false},{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"take","required":false},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false},{"schema":{"type":"boolean"},"in":"query","name":"includeContactDetails","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"query","name":"groupId","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"query","name":"excludeMeetingTypeId","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"query","name":"includeMeetingTypeId","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"notes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"audience":{"type":"string","enum":["private","shared"]},"note":{"nullable":true,"type":"string"},"custom_emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"},"meeting_type_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"google_calendar_event_id_v3":{"nullable":true,"type":"string"},"oauth_credential_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"calendar_account_email":{"nullable":true,"type":"string"},"calendar_account_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"reminder_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"channels":{"type":"array","items":{"type":"string","enum":["whatsapp","imessage","linkedin","instagram"]}},"next_cursor":{"type":"string"},"meeting_types":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"attachments":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["id","channels","meeting_types"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["notes"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"searchNotesV2","summary":"Search notes (v2)","description":"Full-text search over the notes you own. Matches on the note body and on the names of contacts each note is linked to. Returns the canonical notes list envelope, cursor-paginated.","x-mint":{"content":"## Use cases\n\n- Power a global search across your notes\n- Find every note mentioning a person or topic\n\n## Matching\n\nMatches case-insensitively on the note body (`note`) and on the first/last name of any contact the note is linked to. Results are ordered most-recent-first by event time.\n\n## Pagination\n\nCursor-based. Pass the returned `pagination.nextCursor` back verbatim as `cursor` to fetch the next page; it's opaque (server-emitted) — never parse or construct one client-side. `take` caps the page size.\n\n## Migration from /v1\n\nThe /v1 surface was `GET /v1/search/timeline` returning `{ data, nextCursor }`. /v2 uses the canonical envelope `{ data: { notes, pagination: { nextCursor, count } } }` (no `error: false`)."}}},"/v2/timeline/notes/{noteId}":{"get":{"tags":["timeline"],"parameters":[{"schema":{"type":"object","properties":{"timeline_items_contacts":{"type":"boolean"},"attachments":{"type":"boolean"}},"additionalProperties":false},"in":"query","name":"include","required":false},{"schema":{"type":"object","properties":{"id":{"type":"boolean"},"user_id":{"type":"boolean"},"note":{"type":"boolean"},"meeting_type":{"type":"boolean"},"custom_emoji":{"type":"boolean"},"event_time":{"type":"boolean"},"created_at":{"type":"boolean"},"meeting_type_id":{"type":"boolean"},"google_calendar_event_id_v3":{"type":"boolean"},"oauth_credential_id":{"type":"boolean"},"calendar_account_email":{"type":"boolean"},"calendar_account_provider":{"type":"boolean"},"reminder_id":{"type":"boolean"},"channels":{"type":"boolean"},"workspace_id":{"type":"boolean"},"audience":{"type":"boolean"},"meeting_types":{"type":"boolean"},"timeline_items_contacts":{"type":"boolean"},"attachments":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["id","user_id","note","meeting_type","custom_emoji","event_time","created_at","meeting_type_id","google_calendar_event_id_v3","oauth_credential_id","calendar_account_email","calendar_account_provider","reminder_id","channels","workspace_id","audience","meeting_types","timeline_items_contacts","attachments"]}},"in":"query","name":"select","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"noteId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"note":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"audience":{"type":"string","enum":["private","shared"]},"note":{"nullable":true,"type":"string"},"custom_emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"},"meeting_type_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"google_calendar_event_id_v3":{"nullable":true,"type":"string"},"oauth_credential_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"calendar_account_email":{"nullable":true,"type":"string"},"calendar_account_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"reminder_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"channels":{"type":"array","items":{"type":"string","enum":["whatsapp","imessage","linkedin","instagram"]}},"next_cursor":{"type":"string"},"meeting_types":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"attachments":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["id","channels","meeting_types"],"additionalProperties":false}},"required":["note"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getNoteV2","summary":"Get a note (v2)","description":"Retrieve a single note by id in the canonical single-entity envelope.","x-mint":{"content":"## Use cases\n\n- Load a note for editing\n- Fetch the latest server state before applying an update"}},"patch":{"tags":["timeline"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"note":{"type":"object","properties":{"note":{"type":"string","maxLength":50000},"custom_emoji":{"type":"string"},"event_time":{},"meeting_type":{"anyOf":[{"type":"string","enum":["call","coffee","email","meal","meeting","networking","note","other","party","text"]},{"type":"null"}]},"meeting_type_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"attachments":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"url":{"type":"string","format":"uri"},"file_name":{"type":"string"},"file_size":{"type":"number"}},"required":["url","file_name"],"additionalProperties":false}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"is_origin":{"description":"Marks the contact whose page the note was written on. Create only; at most one link may set it. Ignored on update.","type":"boolean"},"contacts":{}},"required":["contact_id"],"additionalProperties":false}},"oauth_credential_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"reminder_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"audience":{"description":"Workspace notes only: \"shared\" (every member, the default) or \"private\" (only the author). Only the author may change it. Ignored for Personal notes, which are always private.","type":"string","enum":["private","shared"]}},"additionalProperties":false}},"required":["note"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"object","properties":{"timeline_items_contacts":{"type":"boolean"},"attachments":{"type":"boolean"}},"additionalProperties":false},"in":"query","name":"include","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"noteId","required":true},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"note":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"audience":{"type":"string","enum":["private","shared"]},"note":{"nullable":true,"type":"string"},"custom_emoji":{"nullable":true,"type":"string"},"meeting_type":{"nullable":true,"type":"string"},"meeting_type_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"event_time":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"google_calendar_event_id_v3":{"nullable":true,"type":"string"},"oauth_credential_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"calendar_account_email":{"nullable":true,"type":"string"},"calendar_account_provider":{"nullable":true,"type":"string","enum":["GOOGLE","OFFICE365"]},"reminder_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"channels":{"type":"array","items":{"type":"string","enum":["whatsapp","imessage","linkedin","instagram"]}},"next_cursor":{"type":"string"},"meeting_types":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"timeline_items_contacts":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"attachments":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}}},"required":["id","channels","meeting_types"],"additionalProperties":false}},"required":["note"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"updateNoteV2","summary":"Update a note (v2)","description":"Partially update a note. PATCH semantics — only the supplied fields change. Returns the updated note.","x-mint":{"content":"## Use cases\n\n- Edit note text, emoji, meeting type, or event time\n\n## Migration from /v1\n\nThe /v1 surface was `PUT /v1/timeline/{noteId}`. /v2 uses `PATCH /v2/timeline/notes/{noteId}` (partial update) with the canonical envelope.\n\n## Idempotency\n\n`idempotent: required` — pass an `Idempotency-Key` header so a retried partial update is replayed rather than re-applied."}},"delete":{"tags":["timeline"],"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"noteId","required":true},{"in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Optional. Accepted to dedupe retries on this endpoint. See `apps/rest-api/src/shared/idempotency.ts`."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteNoteV2","summary":"Delete a note (v2)","description":"Delete a note by id. Returns the bulk-ack envelope (`affected`, `ids`).","x-mint":{"content":"## Migration from /v1\n\nThe /v1 surface was `DELETE /v1/timeline/{noteId}` returning `{ error: false, message }`. /v2 returns the canonical bulk-ack `{ data: { affected, ids } }`.\n\n## Idempotency\n\n`idempotent: optional` — passing a key replays the same `affected: 1` on retry instead of `affected: 0`."}}},"/v2/users/me":{"get":{"tags":["users"],"parameters":[{"schema":{"type":"array","items":{"type":"string"}},"in":"query","name":"include","required":false,"description":"Related records to include (e.g. mobile_settings, workflow_settings)"},{"schema":{"type":"boolean"},"in":"query","name":"fresh","required":false,"description":"Skip the cache and fetch the latest data from the database"}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"},"email_key":{"type":"string"},"zapier_key":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"email_verified":{"type":"boolean"},"image_url":{"nullable":true,"type":"string"},"time_zone":{"type":"string"},"usecase":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"},"school":{"nullable":true,"type":"string"},"about_me":{"nullable":true,"type":"string"},"onboarded_web":{"type":"boolean"},"onboarded_mobile":{"type":"boolean"},"pricing_plan":{"type":"string"},"credits":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"account_visible":{"type":"boolean"},"is_deleted":{"type":"boolean"},"neutered_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"neuter_attempted_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"deletion_requested_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"cleanup_completed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"retained_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"utm_tags":{"nullable":true},"registration_data":{"nullable":true},"linkedin_profile_id":{"nullable":true,"type":"string"},"linkedin_session_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"linkedin_sync_status":{"nullable":true,"type":"string"},"linkedin_profile_data":{"nullable":true},"linkedin_last_sync":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_sync_disabled":{"type":"boolean"},"linkedin_collection_update_requested_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_sync_cookies":{"nullable":true},"linkedin_user_agent":{"nullable":true,"type":"string"},"linkedin_message_sync_enabled":{"nullable":true,"type":"boolean"},"linkedin_message_last_sync":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_message_sync_status":{"nullable":true,"type":"string","enum":["needs_auth","initial_sync_in_progress","sync_in_progress","sync_complete","sync_failed"]},"linkedin_message_sync_covered_from":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"linkedin_device_sync_enrolled_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"whatsapp_session_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"whatsapp_last_sync":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"whatsapp_sync_enabled":{"nullable":true,"type":"boolean"},"whatsapp_sync_status":{"nullable":true,"type":"string","enum":["needs_auth","sync_in_progress","sync_complete","sync_failed","initial_sync_in_progress"]},"imessage_last_sync":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"imessage_sync_enabled":{"nullable":true,"type":"boolean"},"imessage_sync_status":{"nullable":true,"type":"string","enum":["needs_auth","sync_in_progress","sync_complete","sync_failed"]},"instagram_last_sync":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"instagram_sync_enabled":{"nullable":true,"type":"boolean"},"instagram_sync_status":{"nullable":true,"type":"string","enum":["needs_auth","sync_in_progress","sync_complete","sync_failed"]},"instagram_user_agent":{"nullable":true,"type":"string"},"instagram_sync_cookies":{"nullable":true},"instagram_sync_attempt_token":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"instagram_sync_attempt_started_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"instagram_sync_retry_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"facebook_last_sync":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"facebook_sync_enabled":{"nullable":true,"type":"boolean"},"facebook_sync_status":{"nullable":true,"type":"string","enum":["needs_auth","sync_in_progress","sync_complete","sync_failed"]},"facebook_user_agent":{"nullable":true,"type":"string"},"facebook_sync_cookies":{"nullable":true},"facebook_sync_attempt_token":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"facebook_sync_attempt_started_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"phone_calls_last_sync":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"phone_calls_sync_enabled":{"nullable":true,"type":"boolean"},"phone_calls_sync_status":{"nullable":true,"type":"string","enum":["needs_auth","sync_in_progress","sync_complete","sync_failed"]},"sms_assistant_phone_number":{"nullable":true,"type":"string"},"sms_assistant_enabled":{"nullable":true,"type":"boolean"},"sms_assistant_verification_code":{"nullable":true,"type":"string"},"sms_assistant_verification_expires_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"sms_assistant_registered_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"priority_field_label":{"type":"string"},"plan_research_credits":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"purchased_research_credits":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"plan_research_credits_refreshed_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"research_settings":{"nullable":true},"last_auto_merge_and_fix_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"mobile_settings":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"notification_preferences":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"subscription_details":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"workflow_settings":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"sms_settings":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"gamification_achievements":{"nullable":true,"type":"object","properties":{},"additionalProperties":{}},"relationship_priority_tiers":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":{}}},"early_access":{"type":"array","items":{"type":"string"}},"linkedin_server_syncable":{"type":"boolean"}},"required":["id","email"],"additionalProperties":false}},"required":["user"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getCurrentUserV2","summary":"Get the current user (v2)","description":"Retrieve the authenticated user. Supports `include` (related records like `mobile_settings`, `workflow_settings`) and `fresh` (skip cache). Returns the canonical /v2 envelope `{ data: { user } }`. With a read-only or workspace-bound API key the response leaves out the account's stored credentials, and a workspace-bound key's `include` is ignored: its response carries no related records.","x-mint":{"content":"## Use cases\n\n- Bootstrap the app shell with the current user profile\n- Fetch the latest profile state before editing\n\n## Migration from /v1\n\nThe /v1 endpoint returns `{ error: false, data: { ...user } }` (user spread directly into `data`). The /v2 endpoint returns `{ data: { user: {...} } }` — namespaced under `data.user`, and no `error` field on success (HTTP status is the source of truth). A missing user now returns 404 instead of `{ data: null }`."}}},"/v2/tags/":{"get":{"tags":["tags"],"parameters":[{"schema":{"type":"object","properties":{"contacts_count":{"type":"boolean"}},"additionalProperties":false},"in":"query","name":"include","required":false},{"schema":{"type":"object","properties":{"contacts_count":{"type":"boolean"},"id":{"type":"boolean"},"user_id":{"type":"boolean"},"name":{"type":"boolean"},"workspace_id":{"type":"boolean"},"tags_contacts":{"type":"boolean"},"_count":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["contacts_count","id","user_id","name","workspace_id","tags_contacts","_count"]}},"in":"query","name":"select","required":false},{"schema":{"type":"object","properties":{"name":{"type":"string","enum":["asc","desc"]},"contacts_count":{"type":"string","enum":["asc","desc"]}},"additionalProperties":false},"in":"query","name":"orderBy","required":false},{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"take","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"query","name":"cursor","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"_count":{"type":"object","properties":{"tags_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["tags_contacts"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["tags"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listTagsV2","summary":"List tags (v2)","description":"List the authenticated user's tags with cursor pagination (`?take=` / `?cursor=`). Pass `?include[contacts_count]=true` to attach `_count.tags_contacts` per tag; sort with `?orderBy[name]=asc|desc` or `?orderBy[contacts_count]=asc|desc`. Returns `{ data: { tags: [...], pagination: { nextCursor } } }`.","x-mint":{"content":"## Use cases\n\n- Populate the tags settings page (sorted by name or contact count, 100 per page)\n- Hydrate a TanStack DB tags collection\n\n## Migration from /v1\n\n/v1 returned `{ error: false, data: { items: [...], nextCursor } }`. /v2 returns `{ data: { tags: [...], pagination: { nextCursor } } }` — entity plural at the top level, pagination namespaced, no `error` field on success."}},"post":{"tags":["tags"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"tag":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":99}},"required":["name"],"additionalProperties":false}},"required":["tag"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"object","properties":{"contacts_count":{"type":"boolean"}},"additionalProperties":false},"in":"query","name":"include","required":false},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}],"responses":{"201":{"description":"Created","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"tag":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"_count":{"type":"object","properties":{"tags_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["tags_contacts"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}},"required":["tag"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createTagV2","summary":"Create a tag (v2)","description":"Create ONE tag. Find-or-create semantics: if a tag with the same name already exists, the existing row is returned instead of a duplicate (tags are unique per user+name). **Requires `Idempotency-Key`.** Returns `{ data: { tag: {...} } }` with status 201.","x-mint":{"content":"## Use cases\n\n- Add a tag from the settings page\n- Create a tag inline from a contact editor\n\n## Migration from /v1\n\nSame `{ tag: { name } }` body as /v1. /v2 adds required idempotency — retries dedupe server-side instead of racing the user+name unique constraint.\n\n## Idempotency\n\nGenerate one UUID per logical create and reuse it on every retry. TanStack DB collections pass `mutationId` directly."}}},"/v2/tags/count":{"get":{"tags":["tags"],"parameters":[{"schema":{"type":"object","properties":{"name":{"type":"string","enum":["asc","desc"]},"contacts_count":{"type":"string","enum":["asc","desc"]}},"additionalProperties":false},"in":"query","name":"orderBy","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["count"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"countTagsV2","summary":"Count tags (v2)","description":"Return the total count of the authenticated user's tags. Cheap path for the settings header / pagination math without loading the list.","x-mint":{"content":"## Use cases\n\n- Show \"N tags\" in the settings header\n- Compute page counts for the paginated tag list"}}},"/v2/tags/{tagId}":{"get":{"tags":["tags"],"parameters":[{"schema":{"type":"object","properties":{"contacts_count":{"type":"boolean"}},"additionalProperties":false},"in":"query","name":"include","required":false},{"schema":{"type":"object","properties":{"contacts_count":{"type":"boolean"},"id":{"type":"boolean"},"user_id":{"type":"boolean"},"name":{"type":"boolean"},"workspace_id":{"type":"boolean"},"tags_contacts":{"type":"boolean"},"_count":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["contacts_count","id","user_id","name","workspace_id","tags_contacts","_count"]}},"in":"query","name":"select","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"tagId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"tag":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"_count":{"type":"object","properties":{"tags_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["tags_contacts"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}},"required":["tag"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getTagV2","summary":"Get a tag (v2)","description":"Retrieve a single tag by its ID. Pass `?include[contacts_count]=true` to attach `_count.tags_contacts`. Returns `{ data: { tag: {...} } }`, or 404 if the tag doesn't exist or belongs to another user.","x-mint":{"content":"## Use cases\n\n- Resolve a tag by id before assigning it to contacts\n- Re-fetch a single tag after an update without reloading the list\n\n## Migration from /v1\n\n/v1 returned `{ error: false, data: {...} }` with the tag at the top of `data`. /v2 nests it under the entity key: `{ data: { tag: {...} } }`.\n\n<Note>Lookups are scoped to the authenticated user, so another user's tag returns 404 rather than 403.</Note>"}},"patch":{"tags":["tags"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"tag":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":99}},"additionalProperties":false}},"required":["tag"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"tagId","required":true},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"tag":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"_count":{"type":"object","properties":{"tags_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["tags_contacts"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}},"required":["tag"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"updateTagV2","summary":"Update a tag (v2)","description":"Partial update (rename) of a tag. **Requires `Idempotency-Key`.** Returns `{ data: { tag: {...} } }`. Renaming to an existing tag name returns 400 (tags are unique per user+name).","x-mint":{"content":"## Use cases\n\n- Rename a tag from the settings page\n\n## Migration from /v1\n\n/v1 used `PUT /v1/tags/:tagId`. /v2 uses `PATCH` because the body is a partial update (PUT semantically means \"replace the resource entirely\"). Same `{ tag: { name } }` body."}},"delete":{"tags":["tags"],"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"tagId","required":true},{"in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Optional. Accepted to dedupe retries on this endpoint. See `apps/rest-api/src/shared/idempotency.ts`."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteTagV2","summary":"Delete a tag (v2)","description":"Permanently delete a tag (its contact assignments cascade). Returns the canonical bulk envelope: `{ data: { affected: 1, ids: [tagId] } }`. `Idempotency-Key` is optional.","x-mint":{"content":"## Use cases\n\n- Remove an unused tag from settings\n\n<Note>Deleting a tag removes it from every contact it was assigned to. This cannot be undone.</Note>"}}},"/v2/tags/batch":{"post":{"tags":["tags"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"names":{"minItems":1,"type":"array","items":{"type":"string","minLength":1,"maxLength":99}}},"required":["names"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"_count":{"type":"object","properties":{"tags_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["tags_contacts"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false},"failed":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["name","error"],"additionalProperties":false}}},"required":["tags"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"batchCreateTagsV2","summary":"Bulk-create tags (v2)","description":"Create multiple tags from a `{ names: [...] }` array. Names are deduplicated; existing tags with the same name are returned rather than duplicated. Skipped names are reported in `data.failed`. **Requires `Idempotency-Key`.** Returns `{ data: { tags: [...], failed?: [...] } }` with status 201.","x-mint":{"content":"## Use cases\n\n- Import a tag list during onboarding or CSV import\n- \"Add several tags\" flows\n\n## Migration from /v1\n\n/v1 (`POST /v1/tags/bulk-create`) took a bare JSON array body. /v2 wraps it: `{ names: [\"vip\", \"investor\"] }` — the envelope leaves room for per-batch metadata without a breaking change."},"parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}]}},"/v2/tags/batch-delete":{"post":{"tags":["tags"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"tagIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"deleteAll":{"type":"boolean"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"batchDeleteTagsV2","summary":"Bulk-delete tags (v2)","description":"Delete multiple tags in one request: `{ tagIds: [...] }`, or `{ deleteAll: true }` to wipe every tag the user owns. **Requires `Idempotency-Key`** (the `deleteAll` arm is never safe to blindly re-execute). Returns `{ data: { affected, ids? } }` — `ids` is omitted on `deleteAll`.","x-mint":{"content":"## Use cases\n\n- Remove a multi-selection of tags from settings\n- \"Delete all tags\" cleanup tooling\n\n<Note>This is a destructive operation. Contact assignments cascade and cannot be recovered.</Note>"},"parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}]}},"/v2/tags/contacts/add":{"post":{"tags":["tags"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contactIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"tagIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["contactIds","tagIds"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"addTagsToContactsV2","summary":"Assign tags to contacts (v2)","description":"Assign a set of existing tags to a set of contacts (the cartesian product). Body: `{ contactIds: [...], tagIds: [...] }`. **Requires `Idempotency-Key`.** Returns the bulk envelope `{ data: { affected } }` where `affected` is the number of tag↔contact relations created.","x-mint":{"content":"## Use cases\n\n- Tag a multi-selection of contacts from the contacts table\n\n## Migration from /v1\n\nReplaces `POST /v1/tags/add-to-contacts`, which returned the relation rows under `{ error: false, data: { tags } }`. /v2 returns the canonical bulk envelope (relation count).\n\n## Idempotency\n\nRequired — the underlying per-pair upsert re-executes on a blind retry."},"parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}]}},"/v2/tags/contacts/remove":{"post":{"tags":["tags"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contactIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"tagIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["contactIds","tagIds"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"removeTagsFromContactsV2","summary":"Remove tags from contacts (v2)","description":"Remove a set of tags from a set of contacts. Body: `{ contactIds: [...], tagIds: [...] }`. **Requires `Idempotency-Key`.** Returns `{ data: { affected } }` where `affected` is the number of tag↔contact relations removed.","x-mint":{"content":"## Use cases\n\n- Untag a multi-selection of contacts from the contacts table\n\n## Migration from /v1\n\nReplaces `POST /v1/tags/remove-from-contacts`, which returned `{ error: false, data: { count } }`. /v2 returns the canonical bulk envelope (relation count under `affected`).\n\n## Idempotency\n\nRequired — the underlying deleteMany re-executes on a blind retry."},"parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}]}},"/v2/tags/contacts/{contactId}/create-assign":{"post":{"tags":["tags"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"tagNames":{"type":"array","items":{"type":"string","minLength":1,"maxLength":99}}},"required":["tagNames"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"tags":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"_count":{"type":"object","properties":{"tags_contacts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["tags_contacts"],"additionalProperties":false}},"required":["id"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["tags"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createAndAssignTagsV2","summary":"Create + assign tags to a contact (v2)","description":"Find-or-create tags by name and assign them to one contact. Body: `{ tagNames: [...] }`. **Requires `Idempotency-Key`.** Returns the resulting tag list: `{ data: { tags: [...] } }` so the client can write the post-state in one pass. 404 if the contact does not belong to the user.","x-mint":{"content":"## Use cases\n\n- Add tags inline from a contact editor, creating any that don't exist yet\n\n## Migration from /v1\n\nReplaces `POST /v1/tags/create-and-assign/:contactId`, which returned `{ error: false, data: { tags } }`. /v2 returns the canonical list envelope.\n\n## Idempotency\n\nRequired — the find-or-create + assign re-executes on a blind retry."}}},"/v2/custom-fields/":{"get":{"tags":["custom-fields"],"parameters":[{"schema":{"type":"object","properties":{"id":{"type":"boolean"},"user_id":{"type":"boolean"},"name":{"type":"boolean"},"field_type":{"type":"boolean"},"categories":{"type":"boolean"},"ranking":{"type":"boolean"},"workspace_id":{"type":"boolean"},"contacts_custom_fields":{"type":"boolean"},"custom_field_types":{"type":"boolean"},"views":{"type":"boolean"},"_count":{"type":"boolean"}},"additionalProperties":false,"propertyNames":{"enum":["id","user_id","name","field_type","categories","ranking","workspace_id","contacts_custom_fields","custom_field_types","views","_count"]}},"in":"query","name":"select","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"custom_fields":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"name":{"type":"string"},"field_type":{"type":"string"},"categories":{"type":"array","items":{"type":"string"}},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["id"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["custom_fields"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listCustomFieldsV2","summary":"List custom fields (v2)","description":"List all of the authenticated user's custom field definitions (name, field_type, categories, ranking), ordered by ranking then name. Returns `{ data: { custom_fields: [...] } }` — no pagination (users have a handful of fields).","x-mint":{"content":"## Use cases\n\n- Populate the custom-fields settings page\n- Build the contact-editor field list\n\n## Migration from /v1\n\n/v1 returned `{ error: false, data: { custom_fields: [...] } }`. /v2 drops the `error` field (HTTP status is the source of truth)."}},"post":{"tags":["custom-fields"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"custom_field":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"field_type":{"type":"string","enum":["input","autocomplete","datepicker","teammate"]},"categories":{"type":"array","items":{"type":"object","properties":{"category":{"type":"string","minLength":1,"maxLength":100}},"required":["category"],"additionalProperties":false}}},"required":["name","field_type"],"additionalProperties":false}},"required":["custom_field"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"custom_field":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"name":{"type":"string"},"field_type":{"type":"string"},"categories":{"type":"array","items":{"type":"string"}},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["id"],"additionalProperties":false}},"required":["custom_field"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createCustomFieldV2","summary":"Create a custom field (v2)","description":"Create ONE custom field definition. Accepts `name`, `field_type` (`input` | `autocomplete` | `datepicker`), and `categories` (autocomplete only, as `[{ category }]`). Ranking is assigned automatically (appended last). In a workspace (`X-Dex-Workspace`), only owners and admins may create one, with an API key too. **Requires `Idempotency-Key`.** Returns `{ data: { custom_field: {...} } }` with status 201.","x-mint":{"content":"## Use cases\n\n- Add a custom field from settings\n\n## Idempotency\n\nGenerate one UUID per logical create and reuse it on every retry — without it, a retried create would mint duplicate field definitions."},"parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}]}},"/v2/custom-fields/{customFieldId}":{"patch":{"tags":["custom-fields"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"custom_field":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":100},"field_type":{"type":"string","enum":["input","autocomplete","datepicker","teammate"]},"categories":{"type":"array","items":{"type":"object","properties":{"category":{"type":"string","minLength":1,"maxLength":100}},"required":["category"],"additionalProperties":false}}},"additionalProperties":false}},"required":["custom_field"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"customFieldId","required":true},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"custom_field":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"name":{"type":"string"},"field_type":{"type":"string"},"categories":{"type":"array","items":{"type":"string"}},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["id"],"additionalProperties":false}},"required":["custom_field"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"updateCustomFieldV2","summary":"Update a custom field (v2)","description":"Partial update of a custom field definition (`name`, `field_type`, `categories`). In a workspace (`X-Dex-Workspace`), only owners and admins may edit one, with an API key too. **Requires `Idempotency-Key`.** Returns `{ data: { custom_field: {...} } }`.","x-mint":{"content":"## Use cases\n\n- Rename a field or edit autocomplete categories from settings\n\n## Migration from /v1\n\n/v1 used `PUT /v1/custom-fields/:customFieldId`. /v2 uses `PATCH` because the body is a partial update. Same `{ custom_field: {...} }` body."}},"delete":{"tags":["custom-fields"],"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"customFieldId","required":true},{"in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Optional. Accepted to dedupe retries on this endpoint. See `apps/rest-api/src/shared/idempotency.ts`."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteCustomFieldV2","summary":"Delete a custom field (v2)","description":"Permanently delete a custom field definition (per-contact values cascade). Returns `{ data: { affected: 1, ids: [customFieldId] } }`. `Idempotency-Key` is optional. Deleting a missing field returns 404 (v1 silently answered 200). In a workspace, an API key is refused with 403 `forbidden`: delete workspace fields in the Dex app.","x-mint":{"content":"## Use cases\n\n- Remove an unused field from settings\n\n<Note>Per-contact values for this field cascade and cannot be recovered.</Note>"}}},"/v2/custom-fields/reorder":{"post":{"tags":["custom-fields"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"updates":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"customFieldId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"ranking":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["customFieldId","ranking"],"additionalProperties":false}}},"required":["updates"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"custom_fields":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"name":{"type":"string"},"field_type":{"type":"string"},"categories":{"type":"array","items":{"type":"string"}},"ranking":{"nullable":true,"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["id"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["custom_fields"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"reorderCustomFieldsV2","summary":"Reorder custom fields (v2)","description":"Batch ranking update (`{ updates: [{ customFieldId, ranking }] }`, max 100). Stale IDs are silently skipped. **Requires `Idempotency-Key`.** Returns the full re-ranked list: `{ data: { custom_fields: [...] } }`.","x-mint":{"content":"## Use cases\n\n- Drag-and-drop reordering on the settings page\n\n## Migration from /v1\n\n/v1 used `PUT /v1/custom-fields/reorder`. /v2 uses `POST` per the verb-suffix batch convention. The response returns the full post-state list so collection caches can upsert in one pass."},"parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}]}},"/v2/custom-fields/contacts/values":{"post":{"tags":["custom-fields"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"custom_fields":{"minItems":1,"type":"array","items":{"type":"object","properties":{"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"custom_field_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"text_value":{"type":"string"},"date_value":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"array_value":{"type":"array","items":{"type":"string"}},"member_user_id":{"anyOf":[{"type":"string","minLength":1,"maxLength":128},{"type":"null"}]},"mode":{"type":"string","enum":["replace","prepend","append"]},"separator":{"type":"string","maxLength":20}},"required":["contact_id","custom_field_id"],"additionalProperties":false}}},"required":["custom_fields"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"setContactCustomFieldValuesV2","summary":"Set custom-field values on contacts (v2)","description":"Batch-set per-contact custom-field VALUES (the `contacts_custom_fields` rows, not the field definitions). Body: `{ custom_fields: [{ contact_id, custom_field_id, text_value?, array_value?, date_value?, mode?, separator? }] }`. `mode` is `replace` (default, overwrites), `prepend` or `append` — the latter two keep the stored value and add the new one before/after it atomically on the server (text joined by `separator`, default newline; arrays concatenated and de-duplicated; `date_value` only supports `replace`). Unknown contact or field IDs and IDs belonging to another user reject the batch identically with 404 `record_not_found`; archived owned contacts and same-creator contacts outside the resolved scope remain 400 `validation_error`. **Requires `Idempotency-Key`.** Returns `{ data: { affected } }` (count of successful updates; per-row failures are skipped and logged).","x-mint":{"content":"## Use cases\n\n- Set custom-field values across a multi-selection of contacts\n- Inline-edit a custom-field value from the contacts table\n- Append a note-like sentence to a text field from an unattended automation without reading the current value first (`mode: \"append\"`)\n\n## Migration from /v1\n\nReplaces `POST /v1/custom-fields/batch-update-contacts`, which returned `{ error: false, data: { count } }`. /v2 returns the canonical bulk envelope (`affected`).\n\n## Write modes\n\nEach row may carry `mode: \"replace\" | \"prepend\" | \"append\"` (default `replace`) and `separator` (max 20 chars, default `\"\\n\"`). `prepend`/`append` are applied inside a single `INSERT … ON CONFLICT DO UPDATE`, so concurrent writers never lose each other's text; an empty stored value takes the new text without a leading separator. `array_value` prepend/append concatenates and de-duplicates; `date_value` only supports `replace` (400 otherwise).\n\n## Idempotency\n\nRequired — the per-row upserts re-execute on a blind retry."},"parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}]}},"/v2/meeting-types/":{"get":{"tags":["meeting-types"],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"meeting_types":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"nullable":true,"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"emoji":{"nullable":true,"type":"string"},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["id","name","created_at"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["meeting_types"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listMeetingTypesV2","summary":"List meeting types (v2)","description":"List all of the authenticated user's note/meeting types (`id`, `name`, `emoji`, `created_at`), or, with `X-Dex-Workspace`, the workspace's own list (any member). Returns `{ data: { meeting_types: [...] } }` — no pagination.","x-mint":{"content":"## Use cases\n\n- Populate the note-type picker in the timeline editor\n- Populate the note-types settings page\n\n## Migration from /v1\n\nThe list lived at `GET /v1/timeline/note-types` and returned a bare `{ error, data: [...] }` array. /v2 moves it onto the domain URL with the canonical list envelope."}},"post":{"tags":["meeting-types"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"emoji":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["name"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"meeting_type":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"nullable":true,"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"emoji":{"nullable":true,"type":"string"},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["id","name","created_at"],"additionalProperties":false}},"required":["meeting_type"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createMeetingTypeV2","summary":"Create a meeting type (v2)","description":"Create ONE meeting type from `{ name, emoji? }`. Names are unique per user, or per workspace with `X-Dex-Workspace` (owners and admins only) — a duplicate returns 400. **Requires `Idempotency-Key`.** Returns `{ data: { meeting_type: {...} } }` with status 201.","x-mint":{"content":"## Use cases\n\n- Add a custom note type (e.g., \"☕ Coffee chat\") from settings\n\n## Idempotency\n\nGenerate one UUID per logical create and reuse it on every retry — a blind retry would otherwise race the per-user (or per-workspace) name unique constraint."},"parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}]}},"/v2/meeting-types/{meetingTypeId}":{"patch":{"tags":["meeting-types"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"emoji":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"meetingTypeId","required":true},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"meeting_type":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"nullable":true,"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"emoji":{"nullable":true,"type":"string"},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["id","name","created_at"],"additionalProperties":false}},"required":["meeting_type"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"updateMeetingTypeV2","summary":"Update a meeting type (v2)","description":"Partial update (`name`, `emoji`). **Requires `Idempotency-Key`.** Returns the updated entity: `{ data: { meeting_type: {...} } }`.","x-mint":{"content":"## Use cases\n\n- Rename a note type or change its emoji from settings\n\n## Migration from /v1\n\n/v1 used `PUT /v1/meeting-types/:meetingTypeId` and returned `{ affected_rows }`, forcing a refetch. /v2 uses `PATCH` and returns the post-state entity."}},"delete":{"tags":["meeting-types"],"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"query","name":"reassign_to","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"meetingTypeId","required":true},{"in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Optional. Accepted to dedupe retries on this endpoint. See `apps/rest-api/src/shared/idempotency.ts`."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteMeetingTypeV2","summary":"Delete a meeting type (v2)","description":"Permanently delete a meeting type. Pass `?reassign_to=<meetingTypeId>` to move the type's existing notes onto another type; omit it and they fall back to the plain 'note' type. Both happen in one transaction. Returns `{ data: { affected: 1, ids: [meetingTypeId] } }`. `Idempotency-Key` is optional.","x-mint":{"content":"## Use cases\n\n- Remove an unused note type from settings, optionally migrating its notes\n\n## Migration from /v1\n\n/v1 took `reassignTo` in the DELETE body. /v2 moves it to the `?reassign_to=` query param — DELETE bodies are HTTP-spec-discouraged and some proxies strip them silently.\n\n<Note>`reassign_to` must differ from the meeting type being deleted (400 otherwise).</Note>"}}},"/v2/title-changes/":{"get":{"tags":["title-changes"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":9007199254740991},"in":"query","name":"take","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"query","name":"cursor","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"title_changes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"contact_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"feed_type":{"type":"string"},"body":{"type":"object","properties":{"name":{"nullable":true,"type":"string"},"title_before":{"nullable":true,"type":"string"},"title_after":{"nullable":true,"type":"string"},"linkedin_url":{"nullable":true,"type":"string"}},"additionalProperties":false},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"is_major":{"type":"boolean"},"contact":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"full_name":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"linkedin":{"nullable":true,"type":"string"},"contact_emails":{"type":"array","items":{"type":"object","properties":{"email":{"type":"string"}},"required":["email"],"additionalProperties":false}}},"required":["id","contact_emails"],"additionalProperties":false}},"required":["id","user_id","feed_type","body","created_at","is_major","contact"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["title_changes"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listTitleChangesV2","summary":"List title changes (v2)","description":"Cursor-paginated list of LinkedIn title-change feed items for the authenticated user's contacts, newest first (or, with the `X-Dex-Workspace` header, for that workspace's contacts, readable by any member), each joined with its contact (id, full name, image, LinkedIn URL, emails). Returns `{ data: { title_changes, pagination } }`."}},"/v2/contact-emails/{contactId}":{"post":{"tags":["contact-emails"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","maxLength":320,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"label":{"type":"string"},"ranking":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["email"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true}],"responses":{"201":{"description":"Created","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"email":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"email":{"type":"string"},"label":{"nullable":true,"type":"string"},"ranking":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["id","contact_id","email","ranking","created_at","updated_at"],"additionalProperties":false}},"required":["email"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createContactEmailV2","summary":"Create a contact email (v2)","description":"Add an email address to a contact, optionally with a label (e.g. \"Work\"). **Requires `Idempotency-Key`.** Returns the created row: `{ data: { contact_email: {...} } }`, status 201.","x-mint":{"content":"## Use cases\n\n- Add a newly discovered email to an existing contact\n- Import additional addresses during a sync\n\n## Migration from /v1\n\n/v1 returned `{ error: false, data: {...} }`. /v2 drops `error` and namespaces the entity under `data.contact_email`."}}},"/v2/contact-emails/{contactId}/reorder":{"post":{"tags":["contact-emails"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"order":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"ranking":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["id","ranking"],"additionalProperties":false}}},"required":["order"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"reorderContactEmailsV2","summary":"Reorder contact emails (v2)","description":"Set the display order of a contact's emails. Body is id-based: `{ order: [{ id, ranking }] }` (row ids survive, unlike v1's positional payload). **Requires `Idempotency-Key`.** Returns the bulk envelope `{ data: { affected } }`.","x-mint":{"content":"## Use cases\n\n- Promote a preferred/primary email to the top\n- Persist a drag-and-drop reorder\n\n## Migration from /v1\n\n/v1 used `PUT /:contactId/rankings` with a positional list. /v2 uses `POST /:contactId/reorder` with `{ order: [{ id, ranking }] }`."}}},"/v2/contact-emails/{contactId}/{emailId}":{"patch":{"tags":["contact-emails"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","maxLength":320,"format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"ranking":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"emailId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"updateContactEmailV2","summary":"Update a contact email (v2)","description":"Partially update one email on a contact (value and/or label). **Requires `Idempotency-Key`.** Returns the bulk envelope `{ data: { affected } }`.","x-mint":{"content":"## Use cases\n\n- Fix a typo in an address\n- Relabel an email (e.g. \"Work\" → \"Personal\")\n\n## Migration from /v1\n\n/v1 used `PUT` (full replace); /v2 uses `PATCH` (partial update)."}},"delete":{"tags":["contact-emails"],"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"emailId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteContactEmailV2","summary":"Delete a contact email (v2)","description":"Remove an email from a contact. Idempotency-Key is optional (delete is idempotent; a key replays the same `affected` on retry). Returns `{ data: { affected } }`.","x-mint":{"content":"## Use cases\n\n- Remove an outdated or invalid address\n- Clean up duplicates\n\n<Warning>This permanently deletes the email association.</Warning>"}}},"/v2/contact-phone-numbers/{contactId}":{"post":{"tags":["contact-phone-numbers"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"phone_number":{"type":"string","minLength":1,"maxLength":50},"label":{"type":"string"},"ranking":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"country_code":{"type":"string","maxLength":4},"phone_number_sanitized":{"type":"string","maxLength":50}},"required":["phone_number"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true}],"responses":{"201":{"description":"Created","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"phoneNumber":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"phone_number":{"type":"string"},"label":{"nullable":true,"type":"string"},"ranking":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"country_code":{"nullable":true,"type":"string"},"phone_number_sanitized":{"nullable":true,"type":"string"},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["id","contact_id","phone_number","ranking","created_at","updated_at"],"additionalProperties":false}},"required":["phoneNumber"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createContactPhoneNumberV2","summary":"Create a contact phone number (v2)","description":"Add a phone number to a contact, optionally with a label. **Requires `Idempotency-Key`.** Returns the created row: `{ data: { contact_phone_number: {...} } }`, status 201.","x-mint":{"content":"## Use cases\n\n- Add a newly discovered number to a contact\n- Import additional numbers during a sync\n\n## Migration from /v1\n\n/v1 returned `{ error: false, data: {...} }`. /v2 drops `error` and namespaces the entity under `data.contact_phone_number`."}}},"/v2/contact-phone-numbers/{contactId}/reorder":{"post":{"tags":["contact-phone-numbers"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"order":{"minItems":1,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"ranking":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["id","ranking"],"additionalProperties":false}}},"required":["order"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"reorderContactPhoneNumbersV2","summary":"Reorder contact phone numbers (v2)","description":"Set the display order of a contact's phone numbers. Body is id-based: `{ order: [{ id, ranking }] }`. **Requires `Idempotency-Key`.** Returns `{ data: { affected } }`.","x-mint":{"content":"## Use cases\n\n- Promote a primary number to the top\n- Persist a drag-and-drop reorder\n\n## Migration from /v1\n\n/v1 used `PUT /:contactId/rankings`; /v2 uses `POST /:contactId/reorder` with `{ order: [{ id, ranking }] }`."}}},"/v2/contact-phone-numbers/{contactId}/{phoneNumberId}":{"patch":{"tags":["contact-phone-numbers"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"phone_number":{"type":"string","minLength":1,"maxLength":50},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"ranking":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"country_code":{"anyOf":[{"type":"string","maxLength":4},{"type":"null"}]},"phone_number_sanitized":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}]}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"phoneNumberId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"updateContactPhoneNumberV2","summary":"Update a contact phone number (v2)","description":"Partially update one phone number on a contact (value and/or label). **Requires `Idempotency-Key`.** Returns `{ data: { affected } }`.","x-mint":{"content":"## Use cases\n\n- Fix a typo in a number\n- Relabel a number (e.g. \"Mobile\" → \"Work\")\n\n## Migration from /v1\n\n/v1 used `PUT` (full replace); /v2 uses `PATCH` (partial update)."}},"delete":{"tags":["contact-phone-numbers"],"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"phoneNumberId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteContactPhoneNumberV2","summary":"Delete a contact phone number (v2)","description":"Remove a phone number from a contact. Idempotency-Key is optional. Returns `{ data: { affected } }`.","x-mint":{"content":"## Use cases\n\n- Remove an outdated number\n- Clean up duplicates\n\n<Warning>This permanently deletes the phone number.</Warning>"}}},"/v2/contact-legacy-addresses/{contactId}":{"post":{"tags":["contact-legacy-addresses"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"formatted":{"anyOf":[{"type":"string"},{"type":"null"}]},"street":{"anyOf":[{"type":"string"},{"type":"null"}]},"city":{"anyOf":[{"type":"string"},{"type":"null"}]},"region":{"anyOf":[{"type":"string"},{"type":"null"}]},"country":{"anyOf":[{"type":"string"},{"type":"null"}]},"postal_code":{"anyOf":[{"type":"string"},{"type":"null"}]},"address_type":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true}],"responses":{"201":{"description":"Created","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"address":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"workspace_id":{"nullable":true,"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"formatted":{"nullable":true,"type":"string"},"street":{"nullable":true,"type":"string"},"city":{"nullable":true,"type":"string"},"region":{"nullable":true,"type":"string"},"country":{"nullable":true,"type":"string"},"postal_code":{"nullable":true,"type":"string"},"address_type":{"nullable":true,"type":"string"},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["id","contact_id","created_at","updated_at"],"additionalProperties":false}},"required":["address"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createContactAddressV2","summary":"Create a contact address (v2)","description":"Add a postal address to a contact. **Requires `Idempotency-Key`.** Returns the created row: `{ data: { contact_legacy_address: {...} } }`, status 201. Addresses are not ranked (no reorder).","x-mint":{"content":"## Use cases\n\n- Store a mailing or office address on a contact\n- Import addresses during a data migration\n\n## Migration from /v1\n\n/v1 returned `{ error: false, data: {...} }`. /v2 drops `error` and namespaces the entity under `data.contact_legacy_address`."}}},"/v2/contact-legacy-addresses/{contactId}/{addressId}":{"patch":{"tags":["contact-legacy-addresses"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"formatted":{"anyOf":[{"type":"string"},{"type":"null"}]},"street":{"anyOf":[{"type":"string"},{"type":"null"}]},"city":{"anyOf":[{"type":"string"},{"type":"null"}]},"region":{"anyOf":[{"type":"string"},{"type":"null"}]},"country":{"anyOf":[{"type":"string"},{"type":"null"}]},"postal_code":{"anyOf":[{"type":"string"},{"type":"null"}]},"address_type":{"anyOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"addressId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"updateContactAddressV2","summary":"Update a contact address (v2)","description":"Partially update one address on a contact. **Requires `Idempotency-Key`.** Returns `{ data: { affected } }`.","x-mint":{"content":"## Use cases\n\n- Correct an address after a contact moves\n- Update an incomplete address\n\n## Migration from /v1\n\n/v1 used `PUT` (full replace); /v2 uses `PATCH` (partial update)."}},"delete":{"tags":["contact-legacy-addresses"],"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"addressId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteContactAddressV2","summary":"Delete a contact address (v2)","description":"Remove an address from a contact. Idempotency-Key is optional. Returns `{ data: { affected } }`.","x-mint":{"content":"## Use cases\n\n- Remove an outdated address\n- Clean up duplicates\n\n<Warning>This permanently deletes the address.</Warning>"}}},"/v2/contact-relations/{contactId}":{"get":{"tags":["contact-relations"],"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"related_contacts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"full_name":{"nullable":true,"type":"string"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"}},"required":["id"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["related_contacts"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listRelatedContactsV2","summary":"List related contacts (v2)","description":"Get the contacts related to a contact. Relations are an undirected, untyped graph — the server normalizes edge direction, so the same list comes back whichever side of a pair you ask from. Returns `{ data: { related_contacts: [...] } }` where each row is a narrow projection (id, names, image_url), not the full contact.","x-mint":{"content":"## Use cases\n\n- Show \"related contacts\" chips on a contact detail page\n- Traverse a personal network (who do I know through this person?)\n\n## Shape\n\nThe rows are a chip projection — `id`, `full_name`, `first_name`, `last_name`, `image_url`. Fetch the full record via `GET /v2/contacts/{id}`."}}},"/v2/contact-relations/{contactId}/add":{"post":{"tags":["contact-relations"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contactIds":{"minItems":1,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["contactIds"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"addRelatedContactsV2","summary":"Add related contacts (v2)","description":"Link one or more contacts to `{contactId}` as related contacts. Relations are symmetric — linking A to B also links B to A — and carry no relationship label. Already-linked pairs and self-links are silently skipped. **Requires `Idempotency-Key`.** Returns `{ data: { affected, ids } }` where `affected` counts NEW links created.","x-mint":{"content":"## Use cases\n\n- Record family members, colleagues, or intro paths between contacts\n\n## Semantics\n\nThe graph is undirected and untyped: there is no \"spouse\"/\"colleague\" label — record the nature of a relationship in a note instead. Every id in the body must belong to the caller, or the whole request fails."}}},"/v2/contact-relations/{contactId}/remove":{"post":{"tags":["contact-relations"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contactIds":{"minItems":1,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["contactIds"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"removeRelatedContactsV2","summary":"Remove related contacts (v2)","description":"Unlink one or more related contacts from `{contactId}`. The contacts themselves are NOT deleted — only the relation rows are removed (both stored directions, so legacy double-stored pairs are fully cleared). **Requires `Idempotency-Key`.** Returns `{ data: { affected, ids } }`.","x-mint":{"content":"## Use cases\n\n- Remove a stale or mistaken relationship\n\n<Note>Removing a relation does not delete either contact — it only clears the link between them.</Note>"}}},"/v2/keep-in-touch/cadences":{"get":{"tags":["keep-in-touch"],"parameters":[{"schema":{"type":"string","enum":["all","my","team"]},"in":"query","name":"kind","required":false,"description":"'all' (default) is the Team cadences plus the caller's own My cadences; never another member's."},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"query","name":"contact_id","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"query","name":"frequency_id","required":false},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"query","name":"group_id","required":false,"description":"Only cadences whose contact is a direct member of this workspace group (subgroups excluded)."},{"schema":{"type":"string","enum":["overdue","upcoming"]},"in":"query","name":"status","required":false,"description":"'overdue': due before now; 'upcoming': due now or later."},{"schema":{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"in":"query","name":"due_before","required":false,"description":"Exclusive upper bound on next_due_at, for a day window."},{"schema":{"type":"boolean"},"in":"query","name":"include_snoozed","required":false,"description":"Default false: cadences snoozed past now are left out."},{"schema":{"type":"boolean"},"in":"query","name":"my_contacts","required":false,"description":"Default false. True: only the caller's My Contacts — their own My cadences, and cadences of contacts the caller has a known email, calendar or note interaction with (their own private notes included)."},{"schema":{"type":"integer","minimum":1,"maximum":200},"in":"query","name":"limit","required":false},{"schema":{"type":"string","minLength":1,"maxLength":256},"in":"query","name":"cursor","required":false}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"cadences":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"kind":{"type":"string","enum":["team","my"]},"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"contact":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"}},"required":["id","first_name","last_name","image_url"],"additionalProperties":false}},"required":["id","kind","contact_id","frequency_id","days","next_due_at","snoozed_until","created_at","updated_at","contact"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["cadences"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listKeepInTouchCadencesV2","summary":"List keep-in-touch cadences (v2)","description":"List the workspace's keep-in-touch cadences the caller can see, by `next_due_at` then id: the Team cadences plus the caller's own My cadences, never another member's. Filters: `kind` (`all` default, `team`, `my`), `contact_id`, `frequency_id`, `status` (`overdue` or `upcoming`), `due_before` (exclusive ISO date-time), `include_snoozed` (default false), `my_contacts` (default false; true keeps only the caller's My Contacts: their own My cadences plus cadences of contacts they have a known interaction with), `limit` (default 50, max 200) and `cursor` (from `pagination.nextCursor`). Workspace-only: send the `X-Dex-Workspace` header (400 `workspace_context_required` without it). Returns `{ data: { cadences: [...], pagination: { nextCursor } } }`."},"post":{"tags":["keep-in-touch"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"kind":{"type":"string","enum":["team","my"]},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["contact_id","kind","frequency_id"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"cadence":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"kind":{"type":"string","enum":["team","my"]},"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"contact":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"}},"required":["id","first_name","last_name","image_url"],"additionalProperties":false}},"required":["id","kind","contact_id","frequency_id","days","next_due_at","snoozed_until","created_at","updated_at","contact"],"additionalProperties":false}},"required":["cadence"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createKeepInTouchCadencesV2","summary":"Create a keep-in-touch cadence (v2)","description":"Add a contact's Team cadence (`kind: 'team'`; owners, admins and standard members) or the caller's own My cadence (`kind: 'my'`; every member, viewers included) on one of the workspace's frequencies. The due date is computed by the server. 404 `contact_not_found`, 400 `frequency_not_found`, 409 `cadence_exists` when the contact already has one of that kind. Workspace-only: send the `X-Dex-Workspace` header (400 `workspace_context_required` without it). **Requires an `Idempotency-Key` header**. Returns `{ data: { cadence: {...} } }` with status 201.","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}]}},"/v2/keep-in-touch/cadences/batch-create":{"post":{"tags":["keep-in-touch"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["team","my"]},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contact_ids":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["kind","frequency_id","contact_ids"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"cadences":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"kind":{"type":"string","enum":["team","my"]},"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"contact":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"}},"required":["id","first_name","last_name","image_url"],"additionalProperties":false}},"required":["id","kind","contact_id","frequency_id","days","next_due_at","snoozed_until","created_at","updated_at","contact"],"additionalProperties":false}},"skipped_existing_contact_ids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"not_found_contact_ids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["cadences","skipped_existing_contact_ids","not_found_contact_ids"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"batchCreateKeepInTouchCadencesV2","summary":"Add keep-in-touch cadences in bulk (v2)","description":"Add the Team cadence (`kind: 'team'`; owners, admins and standard members) or the caller's own My cadence (`kind: 'my'`; every member, viewers included) on one frequency to up to 1000 contacts (`contact_ids`). A contact that already has a cadence of that kind is skipped and keeps it unchanged (`skipped_existing_contact_ids`); a missing, archived or other-workspace contact is skipped too (`not_found_contact_ids`). Due dates are computed by the server. 400 `frequency_not_found`; a viewer's Team batch is refused like the single create. The contacts are written in pages that commit independently, so a failed request may have added some cadences: retrying the same body is safe. Workspace-only: send the `X-Dex-Workspace` header (400 `workspace_context_required` without it). **Requires an `Idempotency-Key` header**. Returns `{ data: { cadences: [...], skipped_existing_contact_ids, not_found_contact_ids } }` with status 201.","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}]}},"/v2/keep-in-touch/cadences/batch-delete":{"post":{"tags":["keep-in-touch"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["team","my"]},"contact_ids":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["kind","contact_ids"],"additionalProperties":false}}}},"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"contact_ids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"not_found_contact_ids":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"required":["affected","ids","contact_ids","not_found_contact_ids"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"batchDeleteKeepInTouchCadencesV2","summary":"Delete keep-in-touch cadences in bulk (v2)","description":"Delete the Team cadence (owners, admins, standard members) or the caller's own My cadence (`kind`) of up to 1000 contacts (`contact_ids`). Another member's My cadence is never touched; a contact with no cadence of that kind the caller can see is reported in `not_found_contact_ids`. The contacts are written in pages that commit independently, so a failed request may have deleted some: retrying the same body is safe. Closed to API keys. Workspace-only: send the `X-Dex-Workspace` header (400 `workspace_context_required` without it). **Requires an `Idempotency-Key` header**. Returns `{ data: { affected, ids: [cadenceId], contact_ids, not_found_contact_ids } }`.","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}]}},"/v2/keep-in-touch/cadences/{cadenceId}":{"patch":{"tags":["keep-in-touch"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["frequency_id"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"cadenceId","required":true},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"cadence":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"kind":{"type":"string","enum":["team","my"]},"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"contact":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"}},"required":["id","first_name","last_name","image_url"],"additionalProperties":false}},"required":["id","kind","contact_id","frequency_id","days","next_due_at","snoozed_until","created_at","updated_at","contact"],"additionalProperties":false}},"required":["cadence"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"updateKeepInTouchCadenceV2","summary":"Change a cadence frequency (v2)","description":"Move a cadence to another frequency of the workspace; its due date is recomputed. A Team cadence needs owner, admin or standard; a My cadence must be the caller's own (another member's is a 404). 400 `frequency_not_found`. Workspace-only: send the `X-Dex-Workspace` header (400 `workspace_context_required` without it). **Requires an `Idempotency-Key` header**. Returns `{ data: { cadence: {...} } }`."},"delete":{"tags":["keep-in-touch"],"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"cadenceId","required":true},{"in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Optional. Accepted to dedupe retries on this endpoint. See `apps/rest-api/src/shared/idempotency.ts`."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"affected":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"ids":{"type":"array","items":{"type":"string"}},"failed":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"required":["id","error"],"additionalProperties":false}}},"required":["affected"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteKeepInTouchCadenceV2","summary":"Delete a keep-in-touch cadence (v2)","description":"Stop keeping in touch: delete a Team cadence (owners, admins, standard members) or the caller's own My cadence. Workspace-only: send the `X-Dex-Workspace` header (400 `workspace_context_required` without it). `Idempotency-Key` is optional. Returns `{ data: { affected: 1, ids: [cadenceId] } }`."}},"/v2/keep-in-touch/cadences/{cadenceId}/met":{"post":{"tags":["keep-in-touch"],"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"cadenceId","required":true},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"cadence":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"kind":{"type":"string","enum":["team","my"]},"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"contact":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"}},"required":["id","first_name","last_name","image_url"],"additionalProperties":false}},"required":["id","kind","contact_id","frequency_id","days","next_due_at","snoozed_until","created_at","updated_at","contact"],"additionalProperties":false},"note":{"nullable":true,"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["id"],"additionalProperties":false}},"required":["cadence","note"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createKeepInTouchCadenceMetV2","summary":"Mark a cadence met (v2)","description":"Record that the caller met the contact: the due date moves on by the frequency, the snooze clears and a note is written on the contact, shared for a Team cadence and private for a My cadence. A viewer marking their own My cadence met gets no note. Workspace-only: send the `X-Dex-Workspace` header (400 `workspace_context_required` without it). **Requires an `Idempotency-Key` header**. Returns `{ data: { cadence: {...}, note: { id } | null } }`."}},"/v2/keep-in-touch/cadences/{cadenceId}/snooze":{"post":{"tags":["keep-in-touch"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"snooze_days":{"type":"integer","minimum":1,"maximum":3650},"snoozed_until":{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"cadenceId","required":true},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"cadence":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"kind":{"type":"string","enum":["team","my"]},"contact_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"next_due_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"snoozed_until":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"contact":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"job_title":{"nullable":true,"type":"string"}},"required":["id","first_name","last_name","image_url"],"additionalProperties":false}},"required":["id","kind","contact_id","frequency_id","days","next_due_at","snoozed_until","created_at","updated_at","contact"],"additionalProperties":false}},"required":["cadence"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createKeepInTouchCadenceSnoozeV2","summary":"Snooze a keep-in-touch cadence (v2)","description":"Hide a cadence from the due lists without moving its due date. Send `snooze_days` (1 to 3650) **or** `snoozed_until` (an ISO 8601 datetime with offset, after now and within 3650 days); exactly one, else 400 `snooze_out_of_range`. Clients that show a local date should send `snoozed_until` so a DST change cannot move it. Workspace-only: send the `X-Dex-Workspace` header (400 `workspace_context_required` without it). **Requires an `Idempotency-Key` header**. Returns `{ data: { cadence: {...} } }`."}},"/v2/keep-in-touch/frequencies":{"get":{"tags":["keep-in-touch"],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"frequencies":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"cadence_count":{"type":"integer","minimum":0,"maximum":9007199254740991},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["id","days","cadence_count","created_at","updated_at"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["frequencies"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listKeepInTouchFrequenciesV2","summary":"List keep-in-touch frequencies (v2)","description":"List the workspace's keep-in-touch frequencies, fewest days first, each with `cadence_count`: every cadence on it, Team and every member's My. Workspace-only: send the `X-Dex-Workspace` header (400 `workspace_context_required` without it). Returns `{ data: { frequencies: [...] } }`."},"post":{"tags":["keep-in-touch"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"days":{"type":"integer","minimum":1,"maximum":3650,"description":"Days between keep-in-touch reminders."}},"required":["days"],"additionalProperties":false}}}},"responses":{"201":{"description":"Created","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"frequency":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"cadence_count":{"type":"integer","minimum":0,"maximum":9007199254740991},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["id","days","cadence_count","created_at","updated_at"],"additionalProperties":false}},"required":["frequency"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"createKeepInTouchFrequenciesV2","summary":"Create a keep-in-touch frequency (v2)","description":"Add a frequency of `days` (1 to 3650) to the workspace. Owners and admins only. 409 `frequency_exists` when one of those days exists. Workspace-only: send the `X-Dex-Workspace` header (400 `workspace_context_required` without it). **Requires an `Idempotency-Key` header**. Returns `{ data: { frequency: {...} } }` with status 201.","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}]}},"/v2/keep-in-touch/frequencies/{frequencyId}":{"patch":{"tags":["keep-in-touch"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"days":{"type":"integer","minimum":1,"maximum":3650,"description":"Days between keep-in-touch reminders."}},"required":["days"],"additionalProperties":false}}}},"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"frequencyId","required":true},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Required. UUID per logical operation, reused on every retry. See `apps/rest-api/src/shared/idempotency.ts` for the full contract. Missing → 400 BadRequest; same key + different body → 409 Conflict."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"frequency":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"days":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"cadence_count":{"type":"integer","minimum":0,"maximum":9007199254740991},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]}},"required":["id","days","cadence_count","created_at","updated_at"],"additionalProperties":false}},"required":["frequency"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"updateKeepInTouchFrequencyV2","summary":"Change a keep-in-touch frequency (v2)","description":"Change a frequency's `days` and recompute the due date of every cadence on it. Owners and admins only. 404 `frequency_not_found`, 409 `frequency_exists`. Workspace-only: send the `X-Dex-Workspace` header (400 `workspace_context_required` without it). **Requires an `Idempotency-Key` header**. Returns `{ data: { frequency: {...} } }`."},"delete":{"tags":["keep-in-touch"],"parameters":[{"schema":{"type":"string","enum":["move","delete"]},"in":"query","name":"cadences","required":false,"description":"What happens to the cadences on this frequency: 'move' them to move_to, or 'delete' them. Required when any exist."},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"query","name":"move_to","required":false,"description":"The frequency to move the cadences to; with cadences=move."},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"frequencyId","required":true},{"in":"header","name":"Idempotency-Key","required":false,"schema":{"type":"string","minLength":8,"maxLength":255,"pattern":"^[\\w\\-:.]+$","example":"01HV8N6X7K3P9Q5R2T4Y6W8Z0A"},"description":"Optional. Accepted to dedupe retries on this endpoint. See `apps/rest-api/src/shared/idempotency.ts`."}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"frequency_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"cadences_moved":{"type":"integer","minimum":0,"maximum":9007199254740991},"cadences_deleted":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["frequency_id","cadences_moved","cadences_deleted"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"deleteKeepInTouchFrequencyV2","summary":"Delete a keep-in-touch frequency (v2)","description":"Delete a frequency. When cadences use it, say what happens to them: `?cadences=move&move_to=<frequencyId>` moves them to another frequency (400 `invalid_move_target` otherwise) and `?cadences=delete` deletes them; with neither, 409 `frequency_in_use` with `details.cadence_count`. Owners and admins only. Workspace-only: send the `X-Dex-Workspace` header (400 `workspace_context_required` without it). `Idempotency-Key` is optional. Returns `{ data: { frequency_id, cadences_moved, cadences_deleted } }`."}},"/v2/workspaces/":{"get":{"tags":["workspaces"],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"workspaces":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string"},"slug":{"type":"string"},"image_url":{"nullable":true,"type":"string"},"creator_user_id":{"type":"string"},"state":{"type":"string","enum":["active","pending_deletion"]},"deletion_scheduled_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"deletion_due_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"deletion_scheduled_by":{"nullable":true,"type":"string"},"lifecycle_revision":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"share_emails":{"type":"boolean"},"share_social_profiles":{"type":"boolean"},"share_phone_numbers":{"type":"boolean"},"share_addresses":{"type":"boolean"},"share_notes":{"type":"boolean"},"api_access_enabled":{"type":"boolean"},"auto_add_contacts":{"type":"boolean"},"visible_social_networks":{"type":"array","items":{"type":"string"}},"created_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"updated_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"role":{"type":"string","enum":["owner","admin","standard","viewer"]}},"required":["id","name","slug","image_url","creator_user_id","state","deletion_scheduled_at","deletion_due_at","deletion_scheduled_by","lifecycle_revision","share_emails","share_social_profiles","share_phone_numbers","share_addresses","share_notes","api_access_enabled","auto_add_contacts","visible_social_networks","created_at","updated_at","role"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["workspaces"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listWorkspacesV2","summary":"List your workspaces (v2)","description":"List the Dex for Teams workspaces you are an active member of, with your `role` in each and `api_access_enabled`, whether its owners and admins have opened it to members' API keys and MCP connections. Send a workspace `id` as the `X-Dex-Workspace` header to read and write that workspace with your key. Returns `{ data: { workspaces: [...] } }`; workspace content is never included.","x-mint":{"content":"## Use cases\n\n- Find the workspace id to send as `X-Dex-Workspace`\n- Tell a user which workspace a manager still needs to open to API access\n\n<Note>A request naming a workspace whose `api_access_enabled` is `false` answers `403` `workspace_api_access_disabled`. API keys never reach operations that need an owner or admin, whatever your role, except creating and editing custom-field definitions, which an owner or admin may do with a key.</Note>"}}},"/v2/workspaces/{workspaceId}/members":{"get":{"tags":["workspaces"],"parameters":[{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"workspaceId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"members":{"type":"array","items":{"type":"object","properties":{"workspace_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"user_id":{"type":"string"},"role":{"type":"string","enum":["owner","admin","standard","viewer"]},"status":{"type":"string","enum":["pending","active","deactivated"]},"joined_at":{"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"deactivated_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"departure":{"nullable":true,"type":"string","enum":["left","deactivated"]},"user":{"type":"object","properties":{"first_name":{"nullable":true,"type":"string"},"last_name":{"nullable":true,"type":"string"},"email":{"nullable":true,"type":"string"},"image_url":{"nullable":true,"type":"string"},"is_deleted":{"type":"boolean"}},"required":["first_name","last_name","email","image_url","is_deleted"],"additionalProperties":false}},"required":["workspace_id","user_id","role","status","joined_at","deactivated_at","departure","user"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["members"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listWorkspaceMembersV2","summary":"List workspace members (v2)","description":"List the members of the workspace your API key was created for, with each member's `user_id`, `role`, `status` and name and email. Use a member's `user_id` as a workspace reminder's `assignee_id`; only `active` members can be assigned. Needs a key created for this workspace, and the workspace must be opened to API access: a Personal key answers `403` `api_key_personal_only`, and a workspace id other than the key's answers `400` `invalid_workspace_context`. Pending and deactivated members are listed too, with their `status`. Returns `{ data: { members: [...] } }`.","x-mint":{"content":"## Use cases\n\n- Find the member id to send as a workspace reminder's `assignee_id`\n- Tell an agent who it can assign work to in the workspace\n\n<Note>Viewers can read reminders but cannot edit or complete them, so assign reminders to owners, admins or standard members.</Note>"}}},"/v2/workspaces/{workspaceId}/contacts/{contactId}/interactions":{"get":{"tags":["workspaces"],"parameters":[{"schema":{"type":"boolean"},"in":"query","name":"include_counts","required":false,"description":"Default false: counts stay null and no Personal aggregate is read. Set true to include authorized live counts."},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"workspaceId","required":true},{"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"in":"path","name":"contactId","required":true}],"responses":{"200":{"description":"Successful response","headers":{"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"},"Cache-Control":{"schema":{"type":"string","default":"private, no-store"},"description":"Personal-CRM data — never cached in shared proxies/CDNs. Browsers may keep it in the page session memory but should not persist it."}},"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"interactions":{"type":"array","items":{"type":"object","properties":{"member_user_id":{"type":"string"},"first_email_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"last_email_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"first_calendar_event_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"last_calendar_event_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"last_note_at":{"nullable":true,"anyOf":[{"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|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{}]},"email_count":{"nullable":true,"description":"Null unless include_counts=true and an active member has a live shared credential syncing email; null also means unknown.","type":"integer","minimum":0,"maximum":9007199254740991},"meeting_count":{"nullable":true,"description":"Null unless include_counts=true and an active member has a live shared credential syncing calendar; null also means unknown.","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["member_user_id","first_email_at","last_email_at","first_calendar_event_at","last_calendar_event_at","last_note_at","email_count","meeting_count"],"additionalProperties":false}},"pagination":{"type":"object","properties":{"nextCursor":{"nullable":true,"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"additionalProperties":false}},"required":["interactions"],"additionalProperties":false}},"required":["data"],"additionalProperties":false}}}},"400":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Valid key, insufficient permission.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Resource does not exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Request conflicts with the current state of the resource.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded.","headers":{"Retry-After":{"$ref":"#/components/headers/Retry-After"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimit-Limit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimit-Remaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimit-Reset"},"RateLimit":{"$ref":"#/components/headers/RateLimit"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimit-Policy"},"X-RateLimit-Limit":{"$ref":"#/components/headers/X-RateLimit-Limit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/X-RateLimit-Remaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/X-RateLimit-Reset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"listWorkspaceContactInteractionsV2","summary":"List workspace contact interactions (v2)","description":"Per-member retained email, meeting and shared-note dates, plus live email and meeting counts summed across the member’s connected accounts and all contact emails. Counts are opt-in with `include_counts=true`; otherwise both counts are null and no Personal aggregate is read. Requested counts require active membership and a live, non-DISABLED shared credential still syncing that channel; null means unknown. Former members retain dates only. Requires Teams access and workspace membership.","x-mint":{"content":"Use these dates and counts to identify who knows a workspace contact. Counts cover all connected accounts, not just the account shared with this workspace. Private-note-only history is never returned."}}}},"servers":[{"url":"https://api.prod.getdex.com","description":"Production"}],"security":[{"bearerAuth":[]}],"externalDocs":{"description":"Dex API Reference","url":"https://getdex.com/docs/api-reference/authentication"}}