All integrations

Affinity

BUSINESS · CRM & SUPPORT

Companies, people, opportunities, and lists in the CRM they connected.

Acts as the person, not as itself

Each user connects their own account. Every call carries both identities — the agent and the person it is acting for — so the agent can never reach past what that individual can already do.

Credentials never touch the agent

Tokens live in the vault and attach server-side at call time. The agent holds a session, not a secret, and revoking access does not mean rotating a key.

Every call on the record

Who asked, which agent acted, which action ran, and the verdict that let it through — one audit trail across every integration, not one per vendor.

What an agent can do

Each action is granted on its own. An agent allowed to read is not thereby allowed to write, and the scope beside each row is what the acting user must have connected for it to run at all.

affinity_delete_v2_lists_by_listid_fields_by_fieldid_dropdown_options_by_dropdownoptionidWRITE

Delete a dropdown option for a List Field via DELETE /v2/lists/{listId}/fields/{fieldId}/dropdown-options/{dropdownOptionId}. Delete a dropdown option for a List Field. **Warning:** This permanently removes the option and clears every field value currently set to it across all List Entries. The cleared values cannot be recovered. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_delete_v2_notes_by_noteidWRITE

Delete a single Note via DELETE /v2/notes/{noteId}. Delete a note. You can only delete notes you created. Deleting a root note also deletes its replies (both user replies and AI Notetaker replies); deleting a reply removes only that reply. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_delete_v2_persons_by_personidWRITE

Delete a Person via DELETE /v2/persons/{personId}. This endpoint is currently in BETA. Deletes a Person. Returns a 403 error if the Person is internal or inferred internal, since those Persons cannot be deleted. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_delete_v2_reminders_by_reminderidWRITE

Delete a Reminder via DELETE /v2/reminders/{reminderId}. | ⚠️ This endpoint is currently in BETA | |--| Deletes a Reminder. Only the reminder's creator or owner may delete it. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_delete_v2_webhooks_by_webhookidWRITE

Delete a Webhook via DELETE /v2/webhooks/{webhookId}. | ⚠️ This endpoint is currently in BETA | |--| Deletes a Webhook. Only the webhook's creator, or a user allowed to manage all webhooks, may delete it. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_get_v2_auth_whoamiREAD

Get current user via GET /v2/auth/whoami. Returns information about the authenticated user, their current organization, and API key permissions. Use this endpoint to verify your authentication and understand your available API access levels. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_callsREAD

Get metadata on all Calls via GET /v2/calls. Paginate through all calls in Affinity. Returns basic information about the call interaction and its participants. Will only return calls that the current authenticated user has permission to see. You can filter calls using the `filter` query parameter. The filter parameter is a string that you can specify conditions based on the following properties. | **Property Name** | **Type** | **Allowed Operators** | **Examples** | |---|---|---|---| | `id` | `int64` | `=` | `id=1\|id=2\|id=3` | | `startTime` | `datetime` | `>`, `<`, `>=`, `<=` | `sentAt>2025-01-01T01:00:00Z` | | `createdAt` | `datetime` | `>`, `<`, `>=`, `<=` | `createdAt<2025-01-01T01:00:00Z` | | `updatedAt` | `datetime` | `>`, `<`, `>=`, `<=` | `updatedAt>=2025-01-01T01:00:00Z` | Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_chat_messagesREAD

Get metadata on all Chat Messages via GET /v2/chat-messages. Paginate through all chat messages in Affinity. Returns basic information about the chat message interaction and its participants. Will only return chat messages that the current authenticated user has permission to see. You can filter chat messages using the `filter` query parameter. The filter parameter is a string that you can specify conditions based on the following properties. | **Property Name** | **Type** | **Allowed Operators** | **Examples** | |---|---|---|---| | `id` | `int64` | `=` | `id=1\|id=2\|id=3` | | `sentAt` | `datetime` | `>`, `<`, `>=`, `<=` | `sentAt>2025-01-01T01:00:00Z` | | `createdAt` | `datetime` | `>`, `<`, `>=`, `<=` | `createdAt<2025-01-01T01:00:00Z` | | `updatedAt` | `datetime` | `>`, `<`, `>=`, `<=` | `updatedAt>=2025-01-01T01:00:00Z` | Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_companiesREAD

Get all Companies via GET /v2/companies. Paginate through Companies in Affinity. Returns basic information and non-list-specific field data on each Company. To retrieve field data, you must use either the `fieldIds` or the `fieldTypes` parameter to specify the Fields for which you want data returned. These Field IDs and Types can be found using the GET `/v2/companies/fields` endpoint. When no `fieldIds` or `fieldTypes` are provided, Companies will be returned without any field data attached. To supply multiple `fieldIds` or `fieldTypes` parameters, generate a query string that looks like this: `?fieldIds=field-1234&fieldIds=affinity-data-location` or `?fieldTypes=enriched&fieldTypes=global`. Requires the "Export All Organizations directory" [permission](/pages/external-api-v2/permissions). Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_companies_by_companyidREAD

Get a single Company via GET /v2/companies/{companyId}. Returns basic information and non-list-specific field data on the requested Company. To retrieve field data, you must use either the `fieldIds` or the `fieldTypes` parameter to specify the Fields for which you want data returned. These Field IDs and Types can be found using the GET `/v2/companies/fields` endpoint. When no `fieldIds` or `fieldTypes` are provided, Companies will be returned without any field data attached. To supply multiple `fieldIds` or `fieldTypes` parameters, generate a query string that looks like this: `?fieldIds=field-1234&fieldIds=affinity-data-location` or `?fieldTypes=enriched&fieldTypes=global`. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_companies_by_companyid_fieldsREAD

Get field values on a single Company via GET /v2/companies/{companyId}/fields. | ⚠️ This endpoint is currently in BETA | |--| Paginate through field values on a single company. Enriched, global, and relationship-intelligence fields will be included by default. The `ids` and `types` parameters can be used to filter the collection. These parameters are mutually exclusive. List fields are not returned by this endpoint. To retrieve or update list field values, use the [list entry fields](/api-reference/lists/get-field-values-on-a-single-list-entry) endpoints. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_companies_by_companyid_fields_by_fieldidREAD

Get a single field value on a Company via GET /v2/companies/{companyId}/fields/{fieldId}. | ⚠️ This endpoint is currently in BETA | |--| Retrieve a single field on a company. Returns basic information and the field value. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_companies_by_companyid_fields_by_fieldid_valuesREAD

Get values for a single field on a Company via GET /v2/companies/{companyId}/fields/{fieldId}/values. | ⚠️ This endpoint is currently in BETA | |--| Paginate through all values for a field on a company. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_companies_by_companyid_list_entriesREAD

Get a Company's List Entries via GET /v2/companies/{companyId}/list-entries. Paginate through the List Entries (AKA rows) for the given Company across all Lists. Each List Entry includes field data for the Company, including list-specific field data. Each List Entry also includes metadata about its creation, i.e., when it was added to the List and by whom. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_companies_by_companyid_listsREAD

Get a Company's Lists via GET /v2/companies/{companyId}/lists. Paginate through all Lists where the given Company appears as an entry and that you have access to view. Returns basic List information for each List that contains this Company. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_companies_by_companyid_notesREAD

Get Notes for a Company via GET /v2/companies/{companyId}/notes. Returns relevant notes for a given company which includes directly attached notes and notes attached to persons on this company. You can filter notes using the `filter` query parameter. The filter parameter is a string that you can specify conditions based on the following properties. | **Property Name** | **Type** | **Allowed Operators** | **Examples** | |---|---|---|---| | `creator.id` | `int32` | `=` | `creator.id=1` | | `createdAt` | `datetime` | `>`, `<`, `>=`, `<=` | `createdAt<2025-02-04T10:48:24Z` | | `updatedAt` | `datetime` | `>`, `<`, `>=`, `<=` | `updatedAt>=2025-02-03T10:48:24Z` | Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_companies_by_companyid_relationshipsREAD

Get Relationships for a Company via GET /v2/companies/{companyId}/relationships. Returns the relationships for a given company, including the interaction score that measures the strength of each relationship based on communication patterns such as emails, meetings, and other interactions. Each relationship includes two persons (person1 and person2) who have a connection related to this company. ## Interaction score The `interactionScore` is a value between `0.0` and `1.0` that reflects how frequently the two persons interact across email, calendar events, and chat messages. The more interactions, the higher the score. Recent interactions are weighted slightly higher than older ones. As rough guidance, scores at or above `0.7` typically indicate two persons that communicate regularly, scores between `0.4` and `0.7` indicate occasional communication, and scores below `0.4` indicate only sporadic communication. ## LinkedIn connections The collection also includes relationships based on a LinkedIn connection between an internal team member and a person related to this company. Whenever a LinkedIn connection exists between the two persons in a relationship, `linkedIn` is populated with the date the connection was made. `linkedIn` is `null` when no LinkedIn connection between the two persons is known by Affinity. Note that LinkedIn-based relationships which do not have any interaction data will have an `interactionScore` of `0`. ## Filters You can filter relationships using the `filter` query parameter. The filter parameter is a string that you can specify conditions based on the following properties. | **Property Name** | **Type** | **Description** | **Allowed Operators** | **Examples** | |---|---|---|---|---| | `interactionScore` | `double` | Strength of the relationship, between `0.0` and `1.0`. Higher means stronger. | `>`, `<`, `>=`, `<=` | `interactionScore>=0.5` | ## Sorting You can sort relationships using the `orderBy` query parameter. `interactionScore` is the only sortable property. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_companies_fieldsREAD

Get metadata on Company Fields via GET /v2/companies/fields. Returns metadata on non-list-specific Company Fields. Use the returned Field IDs to request field data from the GET `/v2/companies` and GET `/v2/companies/{id}` endpoints. You can filter Fields using the `filter` query parameter. The filter parameter is a string that you can specify conditions based on the following properties. | **Property Name** | **Type** | **Allowed Operators** | **Examples** | |---|---|---|---| | `name` | `text` | `=`, `=~` | `name="Location"`, `name=~loc` | Use the `includes` query parameter to add optional metadata to each Field in the response. Pass `includes` more than once to request multiple values. | **Value** | **Adds to each Field** | |---|---| | `filterability` | How the field can be used in filter expressions on GET `/v2/companies` and POST `/v2/companies/search` | | `sortability` | How the field can be used in sort expressions on those endpoints | Example: `GET /v2/companies/fields?includes=filterability&includes=sortability` Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_companies_fields_by_fieldid_dropdown_optionsREAD

Get dropdown options for a Company Field via GET /v2/companies/fields/{fieldId}/dropdown-options. Returns the dropdown options for a specific dropdown or ranked-dropdown field on a Company. Use the returned dropdown option IDs when writing dropdown field values via the field update endpoints. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_company_mergesREAD

Get All Company Merges via GET /v2/company-merges. Retrieve paginated company merges for the organization. Returns all company merges initiated by users in your organization, including their current status, the companies involved, and merge details. You can filter company merges using the `filter` query parameter. The filter parameter is a string that you can specify conditions based on the following properties: | **Property Name** | **Type** | **Allowed Operators** | **Examples** | |---|---|---|---| | `status` | `enum` | `=` | `status=in-progress`, `status=success`, `status=failed` | | `taskId` | `text` | `=` | `taskId=789e0123-e45b-67c8-d901-234567890123` | Company merges are returned in reverse chronological order (most recent first). Requires the "Manage duplicates" [permission](/pages/external-api-v2/permissions) and organization admin role. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_company_merges_by_mergeidREAD

Get Company Merge via GET /v2/company-merges/{mergeId}. Retrieve the status and details of a specific company merge. Returns information about the company merge including its current status, the companies involved, timestamps, and any error information if the merge failed. The `mergeId` can be obtained from the response of the [Get All Company Merges](/api-reference/company-merges/get-all-company-merges) endpoint, or by filtering company merges by task ID using `/v2/company-merges?filter=taskId={taskId}` after initiating a merge. Requires the "Manage duplicates" [permission](/pages/external-api-v2/permissions) and organization admin role. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_duplicates_company_suggestionsREAD

Get All Company Duplicate Suggestions via GET /v2/duplicates/company-suggestions. | ⚠️ This endpoint is currently in BETA | |--| Retrieves company duplicate suggestions detected for your organization. Each suggestion contains a recommended `primaryProfile` and a `duplicateProfiles` array containing the single company profile Affinity has identified as a likely duplicate, along with the `matchCriteria` that produced the suggestion. The full company payload is returned for both sides so that an automated agent can evaluate the suggestion without additional lookups. Only actionable suggestions are returned: pairs that have no feedback recorded yet (not merged, not marked as not-duplicates, and not skipped) and whose underlying company profiles are still active and eligible to be merged. Suggestions that have already been acted on are omitted. You can narrow the results using the `filter` query parameter, which accepts the Affinity Filtering Language. The filterable properties are: | **Property Name** | **Type** | **Allowed Operators** | **Examples** | |---|---|---|---| | `matchCriteria` | `enum` | `=` | `matchCriteria=name`, `matchCriteria=domain-redirect`, `matchCriteria=domain-match` | To act on a suggestion, call `POST /v2/company-merges` with the `id` of the `primaryProfile` and the `id` of the entry in `duplicateProfiles`. Once the merge is applied, the suggestion stops being returned by this endpoint immediately. Marking the pair as not duplicates has the same permanent effect. There is currently no way to retrieve a suggestion after either action. Skipping a suggestion is not permanent and works differently. It hides a `name` match suggestion from the user who skipped it for two weeks, after which the suggestion is returned again. It does not change what other users see, and it does not apply to the other match criteria. Requires the "Manage duplicates" [permission](/pages/external-api-v2/permissions), which is granted to organization admins. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_duplicates_person_suggestionsREAD

Get All Person Duplicate Suggestions via GET /v2/duplicates/person-suggestions. | ⚠️ This endpoint is currently in BETA | |--| Retrieves person duplicate suggestions detected for your organization. Each suggestion contains a recommended `primaryProfile` and a `duplicateProfiles` array containing the single person profile Affinity has identified as a likely duplicate, along with the `matchCriteria` that produced the suggestion. The full person payload is returned for both sides so that an automated agent can evaluate the suggestion without additional lookups. Only actionable suggestions are returned: pairs that have no feedback recorded yet (not merged, not marked as not-duplicates, and not skipped) and whose underlying person profiles are still active and eligible to be merged. Suggestions that have already been acted on are omitted. You can narrow the results using the `filter` query parameter, which accepts the Affinity Filtering Language. The filterable properties are: | **Property Name** | **Type** | **Allowed Operators** | **Examples** | |---|---|---|---| | `matchCriteria` | `enum` | `=` | `matchCriteria=name`, `matchCriteria=intelligent` | To act on a suggestion, call `POST /v2/person-merges` with the `id` of the `primaryProfile` and the `id` of the entry in `duplicateProfiles`. Once the merge is applied, the suggestion stops being returned by this endpoint immediately. Marking the pair as not duplicates has the same permanent effect. There is currently no way to retrieve a suggestion after either action. Skipping a suggestion is not permanent and works differently. It hides a `name` match suggestion from the user who skipped it for two weeks, after which the suggestion is returned again. It does not change what other users see, and it does not apply to the other match criteria. Requires the "Manage duplicates" [permission](/pages/external-api-v2/permissions), which is granted to organization admins. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_emailsREAD

Get metadata on all Emails via GET /v2/emails. Paginate through all emails in Affinity. Returns basic information about the email interaction and its participants. Will only return emails or subject lines that the current authenticated user has permission to see. Email bodies (the message content) are not available through the API. Only metadata such as the subject, participants, and timestamps is returned. If the authenticated user does not have permission to see an email's subject, the `subject` field is obfuscated and returned as `********` rather than the actual subject line. You can filter emails using the `filter` query parameter. The filter parameter is a string that you can specify conditions based on the following properties. | **Property Name** | **Type** | **Allowed Operators** | **Examples** | |---|---|---|---| | `id` | `int64` | `=` | `id=1\|id=2\|id=3` | | `sentAt` | `datetime` | `>`, `<`, `>=`, `<=` | `sentAt>2025-01-01T01:00:00Z` | | `createdAt` | `datetime` | `>`, `<`, `>=`, `<=` | `createdAt<2025-01-01T01:00:00Z` | | `updatedAt` | `datetime` | `>`, `<`, `>=`, `<=` | `updatedAt>=2025-01-01T01:00:00Z` | Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_field_value_changesREAD

Get all field value changes via GET /v2/field-value-changes. Retrieve field value changes across all entities and fields in your Affinity workspace. For an overview of field value changes, including which fields support change tracking and how the action types behave, see [Field Value Changes](/pages/data-model/working-with-field-data#field-value-changes). This endpoint is built for delta-sync. Within a single sync, follow `pagination.nextUrl` to page through results until it becomes `null`, which means you have reached the most recent change. To run the next incremental sync, record the `changedAt` of the last change you processed and, on your next sync, filter for changes newer than that timestamp (for example, `filter=changedAt>2024-06-01T12:00:00Z`). Do not persist `nextUrl` between syncs, since it is `null` once you are caught up. Changes are returned in ascending order of `changedAt`, then by internal change ID. Only fields with change tracking enabled are included. You can filter results using the `filter` query parameter. | **Property Name** | **Type** | **Description** | **Allowed Operators** | **Examples** | |---|---|---|---|---| | `field.id` | `text` | | `=` | `field.id=field-1234` | | `listEntry.id` | `int64` | | `=` | `listEntry.id=5678` | | `changer.id` | `int64` | The person who made the change. | `=` | `changer.id=9012` | | `changedAt` | `datetime` | When the change was made. | `>`, `<`, `>=`, `<=` | `changedAt>=2025-01-01T00:00:00Z` | | `actionType` | `text` | The type of change (`add`, `update`, `delete`) | `=` | `actionType=add` | Filters can be combined: - `|` (OR) to match any of multiple values: `field.id=field-1 | field.id=field-2` - `&` (AND) to require all conditions: `changedAt>=2025-01-01T00:00:00Z & changedAt<=2025-12-31T23:59:59Z` Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_inferred_connections_coworkersREAD

Get Coworker Inferred Connections via GET /v2/inferred-connections/coworkers. | ⚠️ This endpoint is currently in BETA | |--| Returns inferred connections based on shared work history, grouped by the target person, strongest first. A connection is the belief that a `source` (a person in your Affinity data, with an `id`, whom you know) might know a `target` (a person not in your Affinity data, described only, whom you want to know), because the two had overlapping employment at a shared company. The same target can be reachable through several people you know. Connections are grouped by target: each item in `data` is one target together with the `connections` to them. Within a target, connections are ordered strongest first; targets are ordered by their strongest connection, strongest first. Each `target` carries the company they work at **today** in `target.currentCompany`: the company at which they are a potential contact now, which is not necessarily the shared employer behind the connection. The `filter` parameter is required and must contain at least one filter. The only currently supported filter is `target.currentCompany.id`, which narrows the targets to a single such company. ## Filters | **Property Name** | **Type** | **Description** | **Allowed Operators** | **Examples** | |---|---|---|---|---| | `target.currentCompany.id` | `integer` | The id of the company the `target` person currently works at. Must reference a single company; filtering on more than one (e.g. `target.currentCompany.id = 1 \| target.currentCompany.id = 2`) returns a `400`. | `=` | `target.currentCompany.id = 123` | Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_inferred_connections_investor_executive_connectionsREAD

Get Investor-Executive Inferred Connections via GET /v2/inferred-connections/investor-executive-connections. | ⚠️ This endpoint is currently in BETA | |--| Returns investor-executive inferred connections, grouped by the target person, strongest first. A connection is the belief that a `source` (a person in your Affinity data, with an `id`, whom you know) might know a `target` (a person not in your Affinity data, described only, whom you want to know). In this connection type the source is an investor and the target is an executive: the source invested in a company where the target was an executive. The same target can be reachable through several people you know. Connections are grouped by target: each item in `data` is one target together with the `connections` to them. Within a target, connections are ordered strongest first; targets are ordered by their strongest connection, strongest first. Each `target` carries the company they work at **today** in `target.currentCompany`: the company at which they are a potential contact now, which is not necessarily the company involved in the investment. The `filter` parameter is required and must contain at least one filter. The only currently supported filter is `target.currentCompany.id`, which narrows the targets to a single such company. ## Filters | **Property Name** | **Type** | **Description** | **Allowed Operators** | **Examples** | |---|---|---|---|---| | `target.currentCompany.id` | `integer` | The id of the company the `target` person currently works at. Must reference a single company; filtering on more than one (e.g. `target.currentCompany.id = 1 \| target.currentCompany.id = 2`) returns a `400`. | `=` | `target.currentCompany.id = 123` | Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_listsREAD

Get metadata on all Lists via GET /v2/lists. Paginate through all Lists in your organization that you have access to view. Returns basic information about each List, including name, owner, and privacy settings. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_lists_by_listidREAD

Get metadata on a single List via GET /v2/lists/{listId}. Retrieve detailed information about a specific List you have access to view. Returns List configuration including name, owner, privacy settings, and creation details. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_lists_by_listid_fieldsREAD

Get metadata on a single List's Fields via GET /v2/lists/{listId}/fields. Returns metadata on the Fields available on a single List. Use the returned Field IDs to request field data from the GET `/v2/lists/{listId}/list-entries` endpoint. You can filter Fields using the `filter` query parameter. The filter parameter is a string that you can specify conditions based on the following properties. | **Property Name** | **Type** | **Allowed Operators** | **Examples** | |---|---|---|---| | `name` | `text` | `=`, `=~` | `name="Status"`, `name=~stat` | Use the `includes` query parameter to add optional metadata to each Field in the response. Pass `includes` more than once to request multiple values. | **Value** | **Adds to each Field** | |---|---| | `filterability` | How the field can be used in filter expressions on POST `/v2/lists/{listId}/list-entries/search` | | `sortability` | How the field can be used in sort expressions on that endpoint | The `time-in-current-status` Field is only filterable and sortable when the List has a Status column configured. On a List without one, its `filterability` and `sortability` are `null`. Example: `GET /v2/lists/{listId}/fields?includes=filterability&includes=sortability` Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_lists_by_listid_fields_by_fieldid_dropdown_optionsREAD

Get dropdown options for a List Field via GET /v2/lists/{listId}/fields/{fieldId}/dropdown-options. Returns the dropdown options for a specific dropdown, ranked-dropdown, or status-dropdown field on a List. Use the returned dropdown option IDs when writing dropdown field values via the field update endpoints. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_lists_by_listid_fields_by_fieldid_dropdown_options_by_dropdownoptionidREAD

Get a dropdown option for a List Field via GET /v2/lists/{listId}/fields/{fieldId}/dropdown-options/{dropdownOptionId}. Get a single dropdown option for a List Field. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_lists_by_listid_list_entriesREAD

Get all List Entries on a List via GET /v2/lists/{listId}/list-entries. Paginate through the List Entries (AKA rows) on a given List. Returns basic information and field data, including list-specific field data, on each Company, Person, or Opportunity on the List. List Entries also include metadata about their creation, i.e., when they were added to the List and by whom. To retrieve field data, you must use either the `fieldIds` or the `fieldTypes` parameter to specify the Fields for which you want data returned. These Field IDs and Types can be found using the GET `/v2/lists/{listId}/fields` endpoint. When no `fieldIds` or `fieldTypes` are provided, List Entries will be returned without any field data attached. To supply multiple `fieldIds` or `fieldTypes` parameters, generate a query string that looks like this: `?fieldIds=field-1234&fieldIds=affinity-data-location` or `?fieldTypes=enriched&fieldTypes=global`. Requires the "Export data from Lists" [permission](/pages/external-api-v2/permissions). Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_lists_by_listid_list_entries_by_listentryidREAD

Get a single List Entry on a List via GET /v2/lists/{listId}/list-entries/{listEntryId}. Retrieve a single list entry. Returns basic information and field data, including list-specific field data. To retrieve field data, you must use either the `fieldIds` or the `fieldTypes` parameter to specify the Fields for which you want data returned. These Field IDs and Types can be found using the GET `/v2/lists/{listId}/fields` endpoint. When no `fieldIds` or `fieldTypes` are provided, the List Entry will be returned without any field data attached. To supply multiple `fieldIds` or `fieldTypes` parameters, generate a query string that looks like this: `?fieldIds=field-1234&fieldIds=affinity-data-location` or `?fieldTypes=enriched&fieldTypes=global`. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_lists_by_listid_list_entries_by_listentryid_field_value_changesREAD

Get Field Value Changes on a List Entry via GET /v2/lists/{listId}/list-entries/{listEntryId}/field-value-changes. Paginate through the historical value changes on the fields of a List Entry. For an overview of field value changes, including which fields support change tracking and how the action types behave, see [Field Value Changes](/pages/data-model/working-with-field-data#field-value-changes). Each change includes who made the change, when it occurred, the action that was performed, and the value that was set. Changes are sorted by `changedAt` in ascending order (oldest first). You can filter field value changes using the `filter` query parameter. The filter parameter is a string that you can specify conditions based on the following properties. | **Property Name** | **Type** | **Description** | **Allowed Operators** | **Examples** | |---|---|---|---|---| | `field.id` | `text` | | `=` | `field.id=field-1234` | | `changedAt` | `datetime` | When the change was made. | `>`, `<`, `>=`, `<=` | `changedAt>2026-01-01T00:00:00Z` | | `changer.id` | `int64` | The person who made the change. | `=` | `changer.id=1234` | | `actionType` | `text` | The type of change (`add`, `update`, `delete`) | `=` | `actionType=add` | Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_lists_by_listid_list_entries_by_listentryid_fieldsREAD

Get field values on a single List Entry via GET /v2/lists/{listId}/list-entries/{listEntryId}/fields. Paginate through all field values on a single list entry. All fields will be included by default. The `ids` and `types` parameters can be used to filter the collection. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_lists_by_listid_list_entries_by_listentryid_fields_by_fieldidREAD

Get a single field value via GET /v2/lists/{listId}/list-entries/{listEntryId}/fields/{fieldId}. Returns a single field value on a list entry. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_lists_by_listid_list_entries_by_listentryid_fields_by_fieldid_valuesREAD

Get values for a single field on a List Entry via GET /v2/lists/{listId}/list-entries/{listEntryId}/fields/{fieldId}/values. | ⚠️ This endpoint is currently in BETA | |--| Paginate through all values for a field on a list entry. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_lists_by_listid_saved_viewsREAD

Get metadata on Saved Views via GET /v2/lists/{listId}/saved-views. Paginate through all Saved Views you have access to view for a specific List. Returns basic information about each Saved View, including name, type, and creation date. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_lists_by_listid_saved_views_by_viewidREAD

Get metadata on a single Saved View via GET /v2/lists/{listId}/saved-views/{viewId}. Retrieve detailed information about a specific Saved View you have access to view. Returns Saved View configuration including name, type, and creation date. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_lists_by_listid_saved_views_by_viewid_list_entriesREAD

Get all List Entries on a Saved View via GET /v2/lists/{listId}/saved-views/{viewId}/list-entries. Paginate through the List Entries (AKA rows) on a given Saved View. Use this endpoint when you need to filter entities or only want **some** field data to be returned: This endpoint respects the filters set on a Saved View via web app, and only returns field data corresponding to the columns that have been pulled into the Saved View via web app. Though this endpoint respects the Saved View's filters and column/Field selection, it does not yet preserve sort order. This endpoint also only supports **sheet-type Saved Views**, and not board- or dashboard-type Saved Views. See the [Data Model](/pages/data-model/the-basics) section for more information about Saved Views. Requires the "Export data from Lists" [permission](/pages/external-api-v2/permissions). Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_meetingsREAD

Get metadata on all Meetings via GET /v2/meetings. Paginate through all Meetings in Affinity. Returns basic information about past and future meeting interactions and its attendees. You can filter meetings using the `filter` query parameter. The filter parameter is a string that you can specify conditions based on the following properties. | **Property Name** | **Type** | **Allowed Operators** | **Examples** | |---|---|---|---| | `id` | `int64` | `=` | `id=1\|id=2\|id=3` | | `startTime` | `datetime` | `>`, `<`, `>=`, `<=` | `startTime>2025-01-01T01:00:00Z` | | `createdAt` | `datetime` | `>`, `<`, `>=`, `<=` | `createdAt<2025-01-01T01:00:00Z` | | `updatedAt` | `datetime` | `>`, `<`, `>=`, `<=` | `updatedAt>=2025-01-01T01:00:00Z` | Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_meetings_by_meetingidREAD

Get a single Meeting via GET /v2/meetings/{meetingId}. | ⚠️ This endpoint is currently in BETA | |--| Retrieve detailed information about a specific Meeting you have access to view. Returns meeting details including title, timing, organizer, creator, and attendee information. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_notesREAD

Get all Notes via GET /v2/notes. Returns all notes, with the exception of replies. You can filter notes using the `filter` query parameter. The filter parameter is a string that you can specify conditions based on the following properties. | **Property Name** | **Type** | **Allowed Operators** | **Examples** | |---|---|---|---| | `id` | `int32` | `=` | `id=1\|id=2\|id=3` | | `creator.id` | `int32` | `=` | `creator.id=1` | | `createdAt` | `datetime` | `>`, `<`, `>=`, `<=` | `createdAt<2025-02-04T10:48:24Z` | | `updatedAt` | `datetime` | `>`, `<`, `>=`, `<=` | `updatedAt>=2025-02-03T10:48:24Z` | Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_notes_by_noteidREAD

Get a single Note via GET /v2/notes/{noteId}. Get a Note with a given id Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_notes_by_noteid_attached_companiesREAD

Get Companies attached to a Note via GET /v2/notes/{noteId}/attached-companies. Returns directly attached companies for a given Note. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_notes_by_noteid_attached_opportunitiesREAD

Get Opportunities attached to a Note via GET /v2/notes/{noteId}/attached-opportunities. Returns directly attached opportunities for a given Note. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_notes_by_noteid_attached_personsREAD

Get Persons attached to a Note via GET /v2/notes/{noteId}/attached-persons. Returns directly attached persons for a given Note. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_notes_by_noteid_repliesREAD

Get replies for a Note via GET /v2/notes/{noteId}/replies. This endpoint returns reply notes for a given note id. You can filter replies using the `filter` query parameter. The filter parameter is a string that you can specify conditions based on the following properties. | **Property Name** | **Type** | **Allowed Operators** | **Examples** | |---|---|---|---| | `creator.id` | `int32` | `=` | `creator.id=1` | | `createdAt` | `datetime` | `>`, `<`, `>=`, `<=` | `createdAt<2025-02-04T10:48:24Z` | | `updatedAt` | `datetime` | `>`, `<`, `>=`, `<=` | `updatedAt>=2025-02-03T10:48:24Z` | Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_opportunitiesREAD

Get all Opportunities via GET /v2/opportunities. Paginate through Opportunities in Affinity. Returns basic information but **not** field data on each Opportunity. To access field data on Opportunities, use the `/lists/{list_id}/list-entries` or the `/v2/lists/{list_id}/saved-views/{view_id}/list-entries` GET endpoint. Requires the "Export data from Lists" [permission](/pages/external-api-v2/permissions). Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_opportunities_by_opportunityidREAD

Get a single Opportunity via GET /v2/opportunities/{opportunityId}. Returns basic information but **not** field data on the requested Opportunity. To access field data on Opportunities, use the `/lists/{list_id}/list-entries` or the `/v2/lists/{list_id}/saved-views/{view_id}/list-entries` GET endpoint. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_opportunities_by_opportunityid_notesREAD

Get Notes for an Opportunity via GET /v2/opportunities/{opportunityId}/notes. Returns Notes for a given Opportunity which includes directly attached notes and those attached to persons on this Opportunity. You can filter notes using the `filter` query parameter. The filter parameter is a string that you can specify conditions based on the following properties. | **Property Name** | **Type** | **Allowed Operators** | **Examples** | |---|---|---|---| | `creator.id` | `int32` | `=` | `creator.id=1` | | `createdAt` | `datetime` | `>`, `<`, `>=`, `<=` | `createdAt<2025-02-04T10:48:24Z` | | `updatedAt` | `datetime` | `>`, `<`, `>=`, `<=` | `updatedAt>=2025-02-03T10:48:24Z` | Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_person_mergesREAD

Get All Person Merges via GET /v2/person-merges. Retrieve paginated person merges for the organization. Returns all person merges initiated by users in your organization, including their current status, the persons involved, and merge details. You can filter person merges using the `filter` query parameter. The filter parameter is a string that you can specify conditions based on the following properties: | **Property Name** | **Type** | **Allowed Operators** | **Examples** | |---|---|---|---| | `status` | `enum` | `=` | `status=in-progress`, `status=success`, `status=failed` | | `taskId` | `text` | `=` | `taskId=789e0123-e45b-67c8-d901-234567890123` | Person merges are returned in reverse chronological order (most recent first). Requires the "Manage duplicates" [permission](/pages/external-api-v2/permissions) and organization admin role. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_person_merges_by_mergeidREAD

Get Person Merge via GET /v2/person-merges/{mergeId}. Retrieve the status and details of a specific person merge. Returns information about the person merge including its current status, the persons involved, timestamps, and any error information if the merge failed. The `mergeId` can be obtained from the response of the [Get All Person Merges](/api-reference/person-merges/get-all-person-merges) endpoint, or by filtering person merges by task ID using `/v2/person-merges?filter=taskId={taskId}` after initiating a merge. Requires the "Manage duplicates" [permission](/pages/external-api-v2/permissions) and organization admin role. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_personsREAD

Get all Persons via GET /v2/persons. Paginate through Persons in Affinity. Returns basic information and non-list-specific field data on each Person. To retrieve field data, you must use either the `fieldIds` or the `fieldTypes` parameter to specify the Fields for which you want data returned. These Field IDs and Types can be found using the GET `/v2/persons/fields` endpoint. When no `fieldIds` or `fieldTypes` are provided, Persons will be returned without any field data attached. To supply multiple `fieldIds` or `fieldTypes` parameters, generate a query string that looks like this: `?fieldIds=field-1234&fieldIds=affinity-data-location` or `?fieldTypes=enriched&fieldTypes=global`. Requires the "Export All People directory" [permission](/pages/external-api-v2/permissions). Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_persons_by_personidREAD

Get a single Person via GET /v2/persons/{personId}. Returns basic information and non-list-specific field data on the requested Person. To retrieve field data, you must use either the `fieldIds` or the `fieldTypes` parameter to specify the Fields for which you want data returned. These Field IDs and Types can be found using the GET `/v2/persons/fields` endpoint. When no `fieldIds` or `fieldTypes` are provided, Persons will be returned without any field data attached. To supply multiple `fieldIds` or `fieldTypes` parameters, generate a query string that looks like this: `?fieldIds=field-1234&fieldIds=affinity-data-location` or `?fieldTypes=enriched&fieldTypes=global`. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_persons_by_personid_fieldsREAD

Get field values on a single Person via GET /v2/persons/{personId}/fields. | ⚠️ This endpoint is currently in BETA | |--| Paginate through field values on a single person. Enriched, global, and relationship-intelligence fields will be included by default. The `ids` and `types` parameters can be used to filter the collection. These parameters are mutually exclusive. List fields are not returned by this endpoint. To retrieve or update list field values, use the [list entry fields](/api-reference/lists/get-field-values-on-a-single-list-entry) endpoints. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_persons_by_personid_fields_by_fieldidREAD

Get a single field on a Person via GET /v2/persons/{personId}/fields/{fieldId}. | ⚠️ This endpoint is currently in BETA | |--| Retrieve a single field on a person. Returns basic information and the field value. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_persons_by_personid_fields_by_fieldid_valuesREAD

Get values for a single field on a Person via GET /v2/persons/{personId}/fields/{fieldId}/values. | ⚠️ This endpoint is currently in BETA | |--| Paginate through all values for a field on a person. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_persons_by_personid_list_entriesREAD

Get a Person's List Entries via GET /v2/persons/{personId}/list-entries. Paginate through the List Entries (AKA rows) for the given Person across all Lists. Each List Entry includes field data for the Person, including list-specific field data. Each List Entry also includes metadata about its creation, i.e., when it was added to the List and by whom. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_persons_by_personid_listsREAD

Get a Person's Lists via GET /v2/persons/{personId}/lists. Paginate through all Lists where the given Person appears as an entry and that you have access to view. Returns basic List information for each List that contains this Person. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_persons_by_personid_notesREAD

Get Notes for a Person via GET /v2/persons/{personId}/notes. Returns notes for a given person id which includes directly attached notes, notes on meetings this person attended, and notes where this person is mentioned. You can filter notes using the `filter` query parameter. The filter parameter is a string that you can specify conditions based on the following properties. | **Property Name** | **Type** | **Allowed Operators** | **Examples** | |---|---|---|---| | `creator.id` | `int32` | `=` | `creator.id=1` | | `createdAt` | `datetime` | `>`, `<`, `>=`, `<=` | `createdAt<2025-02-04T10:48:24Z` | | `updatedAt` | `datetime` | `>`, `<`, `>=`, `<=` | `updatedAt>=2025-02-03T10:48:24Z` | Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_persons_by_personid_relationshipsREAD

Get Relationships for a Person via GET /v2/persons/{personId}/relationships. Returns the relationships for a given person, including the interaction score that measures the strength of each relationship based on communication patterns such as emails, meetings, and other interactions. Each relationship includes two persons (person1 and person2) who have a connection. ## Interaction score The `interactionScore` is a value between `0.0` and `1.0` that reflects how frequently the two persons interact across email, calendar events, and chat messages. The more interactions, the higher the score. Recent interactions are weighted slightly higher than older ones. As rough guidance, scores at or above `0.7` typically indicate two persons that communicate regularly, scores between `0.4` and `0.7` indicate occasional communication, and scores below `0.4` indicate only sporadic communication. ## LinkedIn connections The collection also includes relationships based on a LinkedIn connection between the given person and their internal team member counterpart. Whenever a LinkedIn connection exists between the two persons in a relationship, `linkedIn` is populated with the date the connection was made.`linkedIn` is `null` when no LinkedIn connection exists between the two persons. Note that LinkedIn-based relationships which do not have any interaction data will have an `interactionScore` of `0`. ## Filters You can filter relationships using the `filter` query parameter. The filter parameter is a string that you can specify conditions based on the following properties. | **Property Name** | **Type** | **Description** | **Allowed Operators** | **Examples** | |---|---|---|---|---| | `interactionScore` | `double` | Strength of the relationship, between `0.0` and `1.0`. Higher means stronger. | `>`, `<`, `>=`, `<=` | `interactionScore>=0.5` | ## Sorting You can sort relationships using the `orderBy` query parameter. `interactionScore` is the only sortable property. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_persons_fieldsREAD

Get metadata on Person Fields via GET /v2/persons/fields. Returns metadata on non-list-specific Person Fields. Use the returned Field IDs to request field data from the GET `/v2/persons` and GET `/v2/persons/{id}` endpoints. You can filter Fields using the `filter` query parameter. The filter parameter is a string that you can specify conditions based on the following properties. | **Property Name** | **Type** | **Allowed Operators** | **Examples** | |---|---|---|---| | `name` | `text` | `=`, `=~` | `name="Location"`, `name=~loc` | Use the `includes` query parameter to add optional metadata to each Field in the response. Pass `includes` more than once to request multiple values. | **Value** | **Adds to each Field** | |---|---| | `filterability` | How the field can be used in filter expressions on GET `/v2/persons` and POST `/v2/persons/search` | | `sortability` | How the field can be used in sort expressions on those endpoints | Example: `GET /v2/persons/fields?includes=filterability&includes=sortability` Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_persons_fields_by_fieldid_dropdown_optionsREAD

Get dropdown options for a Person Field via GET /v2/persons/fields/{fieldId}/dropdown-options. Returns the dropdown options for a specific dropdown or ranked-dropdown field on a Person. Use the returned dropdown option IDs when writing dropdown field values via the field update endpoints. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_rate_limitREAD

Get rate limit usage via GET /v2/rate-limit. | ⚠️ This endpoint is currently in BETA | |--| Returns the current rate limit usage for the authenticated caller. `orgPerMonth` is included only for callers that have a monthly quota; it is absent for callers that don't have one. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_remindersREAD

Get all Reminders via GET /v2/reminders. Returns a page of Reminders visible to the caller. You can filter reminders using the `filter` query parameter. The filter parameter is a string that you can specify conditions based on the following properties. | **Property Name** | **Type** | **Allowed Operators** | **Examples** | |---|---|---|---| | `id` | `int64` | `=` | `id=1\|id=2\|id=3` | | `type` | `enum` | `=` | `type=one-time`, `type=recurring` | | `status` | `enum` | `=` | `status=active`, `status=overdue`, `status=completed` | | `resetTrigger` | `enum` | `=` | `resetTrigger=interaction`, `resetTrigger=email`, `resetTrigger=event` | | `dueDate` | `datetime` | `>`, `<`, `>=`, `<=` | `dueDate>=2026-01-01T00:00:00Z` | | `completedAt` | `datetime` | `>`, `<`, `>=`, `<=` | `completedAt=2026-01-01T00:00:00Z` | | `createdAt` | `datetime` | `>`, `<`, `>=`, `<=` | `createdAt>=2026-01-01T00:00:00Z` | | `updatedAt` | `datetime` | `>`, `<`, `>=`, `<=` | `updatedAt>=2026-01-01T00:00:00Z` | | `owner.id` | `int64` | `=`, `!=` | `owner.id=1\|owner.id=2`, `owner.id!=3` | | `creator.id` | `int64` | `=` | `creator.id=1` | | `completer.id` | `int64` | `=` | `completer.id=1` | | `company.id` | `int64` | `=` | `company.id=42` | | `person.id` | `int64` | `=` | `person.id=42` | | `opportunity.id` | `int64` | `=` | `opportunity.id=42` | Results are ordered by `dueDate` ascending (soonest-due first). Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_reminders_by_reminderidREAD

Get a single Reminder via GET /v2/reminders/{reminderId}. | ⚠️ This endpoint is currently in BETA | |--| Returns a single Reminder. Responds with `404` when the reminder does not exist or is not visible to the caller. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_tasks_company_mergesREAD

Get All Company Merge Tasks via GET /v2/tasks/company-merges. Retrieve paginated company merge tasks for the organization. Returns all merge tasks initiated by users in your organization, including their current status, the companies involved, and task details. You can filter tasks using the `filter` query parameter. The filter parameter is a string that you can specify conditions based on the following properties: | **Property Name** | **Type** | **Allowed Operators** | **Examples** | |---|---|---|---| | `status` | `enum` | `=` | `status=in-progress`, `status=success`, `status=failed` | Tasks are returned in reverse chronological order (most recent first). Requires the "Manage duplicates" [permission](/pages/external-api-v2/permissions) and organization admin role. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_tasks_company_merges_by_taskidREAD

Get Company Merge Task via GET /v2/tasks/company-merges/{taskId}. Retrieve the status and details of a specific task for company merges. Returns information about the company merges for a specific task including its overall status, number of merges in-progress, completed, and failed. Detailed information about individual merges for this task can be found by querying: `/v2/company-merges?filter=taskId={taskId}` See [Company Merges](/api-reference/company-merges/get-all-company-merges) for more details. Task statuses: - `in-progress`: The merge task is currently being processed. - `success`: The merge task completed successfully. - `failed`: The merge task failed. Requires the "Manage duplicates" [permission](/pages/external-api-v2/permissions) and organization admin role. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_tasks_person_mergesREAD

Get All Person Merge Tasks via GET /v2/tasks/person-merges. Retrieve paginated person merge tasks for the organization. Returns all merge tasks initiated by users in your organization, including their current status, the persons involved, and task details. You can filter tasks using the `filter` query parameter. The filter parameter is a string that you can specify conditions based on the following properties: | **Property Name** | **Type** | **Allowed Operators** | **Examples** | |---|---|---|---| | `status` | `enum` | `=` | `status=in-progress`, `status=success`, `status=failed` | Tasks are returned in reverse chronological order (most recent first). Requires the "Manage duplicates" [permission](/pages/external-api-v2/permissions) and organization admin role. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_tasks_person_merges_by_taskidREAD

Get Person Merge Task via GET /v2/tasks/person-merges/{taskId}. Retrieve the status and details of a specific task for person merges. Returns information about the person merges for a specific task including its overall status, number of merges in-progress, completed, and failed. Detailed information about individual merges for this task can be found by querying: `/v2/person-merges?filter=taskId={taskId}` See [Person Merges](/api-reference/person-merges/get-all-person-merges) for more details. Task statuses: - `in-progress`: The merge task is currently being processed. - `success`: The merge task completed successfully. - `failed`: The merge task failed. Requires the "Manage duplicates" [permission](/pages/external-api-v2/permissions) and organization admin role. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_transcriptsREAD

Get all Transcripts via GET /v2/transcripts. Paginate through all transcripts and return basic metadata only. Use the single transcript endpoint to fetch the entire transcript data. Will only return transcripts that the current authenticated user has permission to see. You can filter transcripts using the `filter` query parameter. The filter parameter is a string that you can specify conditions based on the following properties. | **Property Name** | **Type** | **Allowed Operators** | **Examples** | |---|---|---|---| | `id` | `int32` | `=` | `id=1` | | `createdAt` | `datetime` | `>`, `<`, `>=`, `<=` | `createdAt<2025-02-04T10:48:24Z` | Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_transcripts_by_transcriptidREAD

Get a single Transcript via GET /v2/transcripts/{transcriptId}. Get a transcript with a given id with the first 100 fragments of the transcript. Use the /fragments endpoint to fetch all fragments of the transcript. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_transcripts_by_transcriptid_fragmentsREAD

Get fragments of a transcript via GET /v2/transcripts/{transcriptId}/fragments. Get fragments of a transcript given a transcript id. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_usersREAD

Get all Users via GET /v2/users. | ⚠️ This endpoint is currently in BETA | |--| Paginate through internal Users in your organization. Returns information about each User, including name, primary email address, all email addresses, photo URL, account status, and account role. The `emailAddresses` and `role` properties are only returned to callers with the "Manage Users" [permission](/pages/external-api-v2/permissions). Use the optional `term` parameter to filter by first name, last name, or primary email address. You can also filter users using the `filter` query parameter. The filter parameter is a string that you can specify conditions based on the following properties. | **Property Name** | **Type** | **Allowed Operators** | **Examples** | |---|---|---|---| | `id` | `int32` | `=` | `id=1\|id=2\|id=3` | | `status` | `enum` | `=` | `status=active` | Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_users_by_useridREAD

Get a single User via GET /v2/users/{userId}. | ⚠️ This endpoint is currently in BETA | |--| Returns information about a single internal User, including name, primary email address, all email addresses, photo URL, account status, and account role. The `userId` path parameter is the same identifier as the User's corresponding Person ID — every internal User has a matching Person record, and they share the same numeric ID. You can use a Person ID returned from any Persons endpoint here, and vice versa. The `emailAddresses` and `role` properties are only returned to callers with the "Manage Users" [permission](/pages/external-api-v2/permissions). Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_webhooksREAD

Get all Webhooks via GET /v2/webhooks. | ⚠️ This endpoint is currently in BETA | |--| Returns a page of the Webhooks created by the caller. Users allowed to manage all webhooks receive every Webhook in the organization. You can filter webhooks using the `filter` query parameter. The filter parameter is a string that you can specify conditions based on the following properties. | **Property Name** | **Type** | **Allowed Operators** | **Examples** | |---|---|---|---| | `id` | `int64` | `=` | `id=1\|id=2` | | `createdAt` | `datetime` | `>`, `<`, `>=`, `<=` | `createdAt>=2026-01-01T00:00:00Z` | | `updatedAt` | `datetime` | `>`, `<`, `>=`, `<=` | `updatedAt>=2026-01-01T00:00:00Z` | Results are ordered by `id` ascending. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_get_v2_webhooks_by_webhookidREAD

Get a single Webhook via GET /v2/webhooks/{webhookId}. | ⚠️ This endpoint is currently in BETA | |--| Returns a single Webhook created by the caller. Users allowed to manage all webhooks may retrieve any Webhook in the organization. Responds with `404` when the webhook does not exist or is not accessible. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api.read
affinity_patch_v2_companies_by_companyid_fieldsWRITE

Perform batch operations on a company's fields via PATCH /v2/companies/{companyId}/fields. Perform batch operations on a company's fields. Currently the only operation at the endpoint is `update-fields`, which allows you to update multiple field values with a single request. This is equivalent to calling [the single field update](/api-reference/companies/update-a-single-field-value-on-a-company) endpoint multiple times. You can update up to 100 fields per request. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_patch_v2_lists_by_listid_list_entries_by_listentryid_fieldsWRITE

Perform batch operations on a list entry's fields via PATCH /v2/lists/{listId}/list-entries/{listEntryId}/fields. Perform batch operations on a list entry's fields. Currently the only operation at the endpoint is `update-fields`, which allows you to update multiple field values with a single request. This is equivalent to calling [the single field update](/api-reference/lists/update-a-single-field-value-on-a-list-entry) endpoint multiple times. You can update up to 100 fields per request. Requires the "Export data from Lists" [permission](/pages/external-api-v2/permissions). Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_patch_v2_persons_by_personid_fieldsWRITE

Perform batch operations on a person's fields via PATCH /v2/persons/{personId}/fields. Perform batch operations on a person's fields. Currently the only operation at the endpoint is `update-fields`, which allows you to update multiple field values with a single request. This is equivalent to calling [the single field update](/api-reference/persons/update-a-single-field-value-on-a-person) endpoint multiple times. You can update up to 100 fields per request. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_post_v2_companies_by_companyid_fields_by_fieldidWRITE

Update a single field value on a Company via POST /v2/companies/{companyId}/fields/{fieldId}. Update a single field value on a company. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_post_v2_companies_searchWRITE

Search Companies via POST /v2/companies/search. | ⚠️ This endpoint is currently in BETA | |--| Search for Companies matching the given criteria. Accepts an optional combination of filters, sorts, and a search term. Omitting the body is equivalent to `GET /v2/companies` with default pagination. Requires the "Export All Organizations directory" [permission](/pages/external-api-v2/permissions). ### Field IDs Field IDs used in `filters`, `sorts`, and `search.fieldIds` follow the formats described in [Working with Field Data](/pages/data-model/working-with-field-data). Use `GET /v2/companies/fields` to discover the available fields and their `valueType`. ### `attributeId` Some fields require an `attributeId` to specify which aspect to filter or sort on. The following relationship intelligence fields all use `attributeId: "date-of-activity"`: `last-email`, `first-email`, `last-contact`, `last-event`, `first-event`, `next-event`. Use `GET /v2/companies/fields` to confirm which fields require an `attributeId`. ### Search The `search.term` is always matched against the company name and primary domain. Providing `search.fieldIds` extends the search to those additional fields; it does not restrict matching to only those fields. Fields with a `valueType` of `datetime` are not searchable and are silently ignored if included in `search.fieldIds`. ### Limits - **Items per filter group** (filters or nested groups): 50 - **Values per filter** (e.g. options in `is-any-of`): 100 - **Sort criteria**: 5 - **Search term minimum length**: 3 characters - **Results per page**: 100 ### Pagination Uses cursor-based pagination. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_post_v2_company_mergesWRITE

Initiate Company Merge via POST /v2/company-merges. Initiate a company merge to combine a duplicate company profile into a primary company profile. This is an asynchronous process that will merge all data from the duplicate company into the primary company. Once the merge is initiated, you can track its progress using the returned task URL. Requires the "Manage duplicates" [permission](/pages/external-api-v2/permissions) and organization admin role. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_post_v2_feedbackWRITE

Send Feedback via POST /v2/feedback. Send feedback to Affinity about a particular product area or feature. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_post_v2_files_searchWRITE

Search Files by Keyword via POST /v2/files/search. Search files by keyword. The scope of the search is controlled by the request body: - Provide `fileIds` to limit the search to specific files. - Provide `companyId` to limit the search to files associated with a specific company. - Omit both to search across your entire account. `fileIds` and `companyId` are mutually exclusive. Returns up to `limit` files ordered by relevance. Prompts with no strong matches may still return low-relevance results. Each result contains a matched file and a single representative excerpt (a matching passage from that file). Even if a file contains multiple matching passages, it appears exactly once in the response with one excerpt. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_post_v2_listsWRITE

Create a List via POST /v2/lists. Create a new List. The List type determines the kind of entities (Companies, Persons, or Opportunities) that can be added. The requester is recorded as the creator and the owner. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_post_v2_lists_by_listid_fields_by_fieldid_dropdown_optionsWRITE

Create a dropdown option for a List Field via POST /v2/lists/{listId}/fields/{fieldId}/dropdown-options. Create a dropdown option for a List Field. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_post_v2_lists_by_listid_fields_by_fieldid_dropdown_options_by_dropdownoptionidWRITE

Update a dropdown option for a List Field via POST /v2/lists/{listId}/fields/{fieldId}/dropdown-options/{dropdownOptionId}. Update a dropdown option for a List Field. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_post_v2_lists_by_listid_list_entries_by_listentryid_fields_by_fieldidWRITE

Update a single field value on a List Entry via POST /v2/lists/{listId}/list-entries/{listEntryId}/fields/{fieldId}. Update a single field value. Requires the "Export data from Lists" [permission](/pages/external-api-v2/permissions). Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_post_v2_lists_by_listid_list_entries_searchWRITE

Search List Entries via POST /v2/lists/{listId}/list-entries/search. | ⚠️ This endpoint is currently in BETA | |--| Search for List Entries on a List matching the given criteria. Accepts an optional combination of filters, sorts, and a search term. All fields in the request body are optional. Omitting the body entirely is equivalent to `GET /v2/lists/{listId}/list-entries` with default pagination. Requires the "Export data from Lists" [permission](/pages/external-api-v2/permissions). ### Field IDs Field IDs used in `filters`, `sorts`, and `search.fieldIds` follow the formats described in [Working with Field Data](/pages/data-model/working-with-field-data). Use `GET /v2/lists/{listId}/fields?includes=filterability` to discover which fields are filterable and what operators each supports. Use `GET /v2/lists/{listId}/fields?includes=sortability` for sortable fields. ### `attributeId` Some fields require an `attributeId` to specify which aspect to filter or sort on. The following relationship intelligence fields all use `attributeId: "date-of-activity"`: `last-email`, `first-email`, `last-contact`, `last-event`, `first-event`, `next-event`. Use `GET /v2/lists/{listId}/fields?includes=filterability` to confirm which fields require an `attributeId`. ### Search The `search.term` is always matched against the entity's name and primary identifier: company name and primary domain (company lists), person first name, last name, and primary email address (person lists), or opportunity name (opportunity lists). Providing `search.fieldIds` extends the search to those additional fields; it does not restrict matching to only those fields. Fields with a `valueType` of `datetime` are not searchable and are silently ignored if included in `search.fieldIds`. ### Limits - **Items per filter group** (filters or nested groups): 50 - **Values per filter** (e.g. options in `is-any-of`): 100 - **Sort criteria**: 5 - **Search term minimum length**: 3 characters - **Results per page**: 100 ### Pagination Uses cursor-based pagination. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_post_v2_notesWRITE

Create a Note via POST /v2/notes. Create a new note. By default it is authored by the calling user; set `creator` to attribute it to a different internal person in your organization. Notes can be attached directly to entities (`Persons`, `Companies`, `Opportunities`), anchored to an interaction (`meeting`, `call`, or `chat message`), or written as a reply to an existing note. The `type` field selects the shape of the request body. AI Notetaker note types (`ai-notetaker`, `ai-notetaker-reply`) are system-generated and cannot be created through this endpoint. | **`type`** | **Description** | **Required** | **Optional** | |------------|-----------------|--------------|--------------| | `entities` | A note attached directly to one or more entities. | `content`, and at least one of `persons` / `companies` / `opportunities`. | Any combination of `persons` / `companies` / `opportunities`. | | `interaction` | A note anchored to a meeting, call, or chat message. | `content`, `interaction.{type,id}`. | `persons` / `companies` / `opportunities`, added as direct associations on top of the interaction's own participants. | | `user-reply` | A reply to an existing root note. Replies have no entity associations or interaction attachment of their own. | `content`, `parent.id` (must reference an existing root note the caller can access). | None | By default a note is authored by the calling user. To attribute a note to a different member of your organization, set the optional `creator` field to reference that person by id. The referenced person must be an active internal person in your organization. By default a note's creation time is the time of the request. To backfill a historical note, set the optional `createdAt` field to the time the note should be recorded as created. **Body content.** `content.html` is rendered HTML that must use only the allowed tags; submitting restricted tags, attributes, URL schemes, or mention spans will cause the request to fail. See the request examples below for representative payloads. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_post_v2_notes_by_noteidWRITE

Update a single Note via POST /v2/notes/{noteId}. Make an update to an existing note's body content or its entity associations. You can only update notes you have write access to. You can update any type of note including AI Notetaker notes (`ai-notetaker`, `ai-notetaker-reply`), but a note's type itself cannot be changed. All body properties are optional: only the properties supplied are updated, and other properties are left unchanged. For each of `persons`, `companies`, and `opportunities`, you may: - omit the field to leave existing associations unchanged - send an empty array (`[]`) to clear all associations of that kind - send a non-empty array to replace the existing set with the supplied list. Reply notes (`user-reply`, `ai-notetaker-reply`) have no entity associations, so only `content` can be updated for replies. Updating `content` is subject to the same HTML restrictions as creation; submitting restricted HTML will cause the request to fail. See the request examples below. The content of notes that contain @mentions cannot be updated through this endpoint; attempting to do so returns `400 Bad Request`. Returns `204 No Content` on success, regardless of whether any properties actually changed. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_post_v2_notes_searchWRITE

Search Notes by Keyword via POST /v2/notes/search. Search notes by keyword. The scope of the search is controlled by the request body: - Provide `noteIds` to limit the search to specific notes. - Provide `companyId` to limit the search to notes associated with a specific company. - Omit both to search across your entire account. `noteIds` and `companyId` are mutually exclusive. Returns up to `limit` notes ordered by relevance. Prompts with no strong matches may still return low-relevance results. Each result contains a matched note and a single representative excerpt (a matching passage from that note). Even if a note contains multiple matching passages, it appears exactly once in the response with one excerpt. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_post_v2_person_mergesWRITE

Initiate Person Merge via POST /v2/person-merges. Initiate a person merge to combine a duplicate person profile into a primary person profile. This is an asynchronous process that will merge all data from the duplicate person into the primary person. Once the merge is initiated, you can track its progress using the returned task URL. Requires the "Manage duplicates" [permission](/pages/external-api-v2/permissions) and organization admin role. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_post_v2_personsWRITE

Create a Person via POST /v2/persons. This endpoint is currently in BETA. Creates a new Person. Setting `fields` values requires the "Edit Global Field Values" permission and returns a 403 error if the caller lacks it. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_post_v2_persons_by_personid_fields_by_fieldidWRITE

Update a single field value on a Person via POST /v2/persons/{personId}/fields/{fieldId}. Update a single field value on a person. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_post_v2_persons_searchWRITE

Search Persons via POST /v2/persons/search. | ⚠️ This endpoint is currently in BETA | |--| Search for Persons matching the given criteria. Accepts an optional combination of filters, sorts, and a search term. Omitting the body is equivalent to `GET /v2/persons` with default pagination. Requires the "Export All People directory" [permission](/pages/external-api-v2/permissions). ### Field IDs Field IDs used in `filters`, `sorts`, and `search.fieldIds` follow the formats described in [Working with Field Data](/pages/data-model/working-with-field-data). Use `GET /v2/persons/fields` to discover the available fields and their `valueType`. ### `attributeId` Some fields require an `attributeId` to specify which aspect to filter or sort on. The following relationship intelligence fields all use `attributeId: "date-of-activity"`: `last-email`, `first-email`, `last-contact`, `last-event`, `first-event`, `next-event`. Use `GET /v2/persons/fields` to confirm which fields require an `attributeId`. ### Search The `search.term` is always matched against the person's first name, last name, and primary email address. Providing `search.fieldIds` extends the search to those additional fields; it does not restrict matching to only those fields. Fields with a `valueType` of `datetime` are not searchable and are silently ignored if included in `search.fieldIds`. ### Limits - **Items per filter group** (filters or nested groups): 50 - **Values per filter** (e.g. options in `is-any-of`): 100 - **Sort criteria**: 5 - **Search term minimum length**: 3 characters - **Results per page**: 100 ### Pagination Uses cursor-based pagination. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_post_v2_remindersWRITE

Create a Reminder via POST /v2/reminders. Creates a new Reminder. Exactly one of `company`, `person`, or `opportunity` must be provided. The `creator` of the new reminder is the user associated with the API key. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_post_v2_reminders_by_reminderidWRITE

Update a Reminder via POST /v2/reminders/{reminderId}. | ⚠️ This endpoint is currently in BETA | |--| Updates a Reminder. Only provided fields are changed; omitted fields keep their current value. Setting `completedAt` marks the reminder complete (for `recurring` reminders, this advances `dueDate` by `recurrence.periodDays` and `completedAt` remains `null` on the resource). Setting `completedAt` to `null` marks the reminder incomplete and is rejected for `recurring` reminders. Only the reminder's creator or owner may update it (including completing or uncompleting it). Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_post_v2_semantic_searchWRITE

Semantic Search via POST /v2/semantic-search. Perform an AI-powered semantic search. Use the `entityType` field in the request body to specify which entity type to search. Currently only supports companies. The `prompt` field accepts natural language describing the companies to find. Supported query dimensions include: - Industry or sector - Example: `climate tech companies in our pipeline` - Descriptive technology or business concepts - Example: `biotech companies working on extracellular vesicles` - Funding information: investment stage, funding date, amount raised, and year founded - Example: `Series A companies that raised more than $10M` - Employee metrics: headcount, hiring rate, and departure rate - Example: `companies with more than 100 employees` - Interaction history - Example: `companies our firm emailed recently` - Relationship strength - Example: `companies where we have strong connections` - Relative time references - Example: `AI companies founded in the past 3 years` - Headquarters location: city, state, country, or region - Example: `fintech startups in San Francisco` - Investor name - Example: `companies backed by Sequoia Capital` These dimensions can be combined in a single prompt, for example `climate tech companies in San Francisco that raised a Series A in the past year`. Results can be sorted by including the desired sort in the prompt itself, for example `Series B companies with the most funding`. Only one sortable attribute is supported per request. Use the `listIds` field to scope results to companies on specific lists, and combine it with `prompt` to search semantically within those lists. Retrieve list IDs from `GET /v2/lists`. The phrases `I`, `we`, and `our firm` always refer to firm-wide data: interaction history and relationship strength cannot be filtered to a specific team member. The phrases `in our pipeline` and `in our network` match companies your firm has interacted with or added to Affinity in general. They do not search for membership in a list literally named "Pipeline" or similar. To search a specific named list, use `listIds`. The following are not supported: - Third-party enrichment data such as Crunchbase, PitchBook, or Dealroom. - Company valuation and revenue metrics. - Lookup by similarity to a named company, for example `companies like OpenAI`. - Notes, email body content, or file attachments. - Custom fields. - Computed or formula-based sorts, such as a ratio between two fields. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_post_v2_webhooksWRITE

Create a Webhook via POST /v2/webhooks. | ⚠️ This endpoint is currently in BETA | |--| Creates a new Webhook. The `creator` of the new webhook is the user associated with the API key. The URL is validated with a test delivery before the webhook is created. The request is rejected with a `validation` error on the `url` property when the URL is invalid or unreachable, contains embedded credentials, or already belongs to another webhook in the organization. The request is rejected with a `bad-request` error, which has no associated property, when the organization has reached its webhook limit. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api
affinity_post_v2_webhooks_by_webhookidWRITE

Update a Webhook via POST /v2/webhooks/{webhookId}. | ⚠️ This endpoint is currently in BETA | |--| Updates a Webhook. Only provided fields are changed; omitted fields keep their current value. Changing `url` on an active webhook, or setting `status` to `active` on a disabled webhook, triggers a test delivery that validates the URL before the update is applied. URLs containing embedded credentials are rejected. Only the webhook's creator, or a user allowed to manage all webhooks, may update it. Affinity allows 900 requests per user per minute and caps the account's monthly total by plan tier (Scale and Advanced 100k, Enterprise unlimited, Essentials no API access at all); v1 and v2 calls count against the same pool. A 429 is the budget, never the credential.

api

Put Affinity behind one governed endpoint.

Same permissions, same audit trail, whatever else you connect next.