API coverage¶
Every Affinity API operation and how the SDK supports it. Generated from
tools/api_coverage.json by python tools/api_coverage.py --markdown; CI checks it
against the pinned API specs and checks that each supported call requests its operation.
V2 API¶
108 supported, 6 planned
| Operation | Status | SDK | Notes |
|---|---|---|---|
GET /v2/auth/whoami |
supported | auth.whoami() |
|
GET /v2/calls |
supported | interactions.list_calls() |
|
GET /v2/chat-messages |
supported | interactions.list_chat_messages() |
|
GET /v2/companies |
supported | companies.list() |
|
GET /v2/companies/fields |
supported | companies.get_fields() |
|
GET /v2/companies/fields/{fieldId}/dropdown-options |
supported | companies.get_field_dropdown_options(FieldId(1)) |
|
POST /v2/companies/search |
supported | companies.find() |
beta |
GET /v2/companies/{companyId} |
supported | companies.get(CompanyId(1)) |
|
GET /v2/companies/{companyId}/fields |
supported | companies.get_field_values(CompanyId(1)) |
beta |
PATCH /v2/companies/{companyId}/fields |
supported | companies.batch_update_fields(CompanyId(1), {"field-1": "x"}) |
|
GET /v2/companies/{companyId}/fields/{fieldId} |
supported | companies.get_field_value(CompanyId(1), "field-1") |
beta |
POST /v2/companies/{companyId}/fields/{fieldId} |
supported | companies.update_field_value(CompanyId(1), "field-1", "x") |
|
GET /v2/companies/{companyId}/fields/{fieldId}/values |
supported | companies.list_field_value_items(CompanyId(1), "field-1") |
beta; API 2026-09-17+ |
GET /v2/companies/{companyId}/list-entries |
supported | companies.get_list_entries(CompanyId(1)) |
|
GET /v2/companies/{companyId}/lists |
supported | companies.get_lists(CompanyId(1)) |
|
GET /v2/companies/{companyId}/notes |
supported | companies.list_notes(CompanyId(1)) |
|
GET /v2/companies/{companyId}/relationships |
supported | companies.list_relationships(CompanyId(1)) |
|
GET /v2/company-merges |
supported | companies.list_merges() |
|
POST /v2/company-merges |
supported | companies.merge(CompanyId(1), CompanyId(2)) |
|
GET /v2/company-merges/{mergeId} |
supported | companies.get_merge_state(1) |
|
GET /v2/duplicates/company-suggestions |
supported | companies.list_duplicate_suggestions() |
beta; API 2026-07-15+ |
GET /v2/duplicates/person-suggestions |
supported | persons.list_duplicate_suggestions() |
beta; API 2026-07-15+ |
GET /v2/emails |
supported | interactions.list_emails() |
|
POST /v2/feedback |
supported | feedback.send("api", "s", "b") |
|
GET /v2/field-value-changes |
supported | field_value_changes.list_global(field_id=FieldId(1)) |
|
GET /v2/files |
supported | files.feed() |
beta; API 2026-09-17+ |
POST /v2/files/search |
supported | files.search("prompt text") |
|
GET /v2/files/{fileId} |
supported | files.get_download_url(FileId(1)) |
beta; API 2026-09-17+ |
GET /v2/inferred-connections/coworkers |
supported | companies.list_coworker_connections(CompanyId(1)) |
beta |
GET /v2/inferred-connections/investor-executive-connections |
supported | companies.list_investor_executive_connections(CompanyId(1)) |
beta |
GET /v2/lists |
supported | lists.list() |
|
POST /v2/lists |
supported | lists.create(ListCreate(name="x", type=ListType.PERSON, is_public=False)) |
|
GET /v2/lists/{listId} |
supported | lists.get(ListId(1)) |
|
GET /v2/lists/{listId}/fields |
supported | lists.get_fields(ListId(1)) |
|
GET /v2/lists/{listId}/fields/{fieldId}/dropdown-options |
supported | lists.get_field_dropdown_options(ListId(1), FieldId(1)) |
|
POST /v2/lists/{listId}/fields/{fieldId}/dropdown-options |
supported | lists.create_field_dropdown_option(ListId(1), FieldId(1), option_type="dropdown", text="x") |
|
DELETE /v2/lists/{listId}/fields/{fieldId}/dropdown-options/{dropdownOptionId} |
supported | lists.delete_field_dropdown_option(ListId(1), FieldId(1), 1) |
|
GET /v2/lists/{listId}/fields/{fieldId}/dropdown-options/{dropdownOptionId} |
supported | lists.get_field_dropdown_option(ListId(1), FieldId(1), 1) |
|
POST /v2/lists/{listId}/fields/{fieldId}/dropdown-options/{dropdownOptionId} |
supported | lists.update_field_dropdown_option(ListId(1), FieldId(1), 1, text="x") |
|
GET /v2/lists/{listId}/list-entries |
supported | lists.entries(ListId(1)).list() |
|
POST /v2/lists/{listId}/list-entries |
planned | beta; API 2026-09-17+; phase when-live | |
POST /v2/lists/{listId}/list-entries/search |
supported | lists.entries(ListId(1)).find() |
beta |
GET /v2/lists/{listId}/list-entries/{listEntryId} |
supported | lists.entries(ListId(1)).get(ListEntryId(1)) |
|
GET /v2/lists/{listId}/list-entries/{listEntryId}/field-value-changes |
supported | lists.entries(ListId(1)).list_field_changes(ListEntryId(1)) |
|
GET /v2/lists/{listId}/list-entries/{listEntryId}/fields |
supported | lists.entries(ListId(1)).get_field_values(ListEntryId(1)) |
|
PATCH /v2/lists/{listId}/list-entries/{listEntryId}/fields |
supported | lists.entries(ListId(1)).batch_update_fields(ListEntryId(1), {"field-1": "x"}) |
|
GET /v2/lists/{listId}/list-entries/{listEntryId}/fields/{fieldId} |
supported | lists.entries(ListId(1)).get_field_value(ListEntryId(1), FieldId(1)) |
|
POST /v2/lists/{listId}/list-entries/{listEntryId}/fields/{fieldId} |
supported | lists.entries(ListId(1)).update_field_value(ListEntryId(1), FieldId(1), "x") |
|
GET /v2/lists/{listId}/list-entries/{listEntryId}/fields/{fieldId}/values |
supported | lists.entries(ListId(1)).list_field_value_items(ListEntryId(1), "field-1") |
beta; API 2026-09-17+ |
GET /v2/lists/{listId}/saved-views |
supported | lists.get_saved_views(ListId(1)) |
|
GET /v2/lists/{listId}/saved-views/{viewId} |
supported | lists.get_saved_view(ListId(1), SavedViewId(1)) |
|
GET /v2/lists/{listId}/saved-views/{viewId}/list-entries |
supported | lists.entries(ListId(1)).from_saved_view(SavedViewId(1)) |
|
GET /v2/meetings |
supported | interactions.list_meetings() |
|
GET /v2/meetings/{meetingId} |
supported | interactions.get_meeting(1) |
beta; API 2026-07-15+ |
GET /v2/notes |
supported | notes.feed() |
|
POST /v2/notes |
supported | notes.create(NoteCreate(content="x", person_ids=[PersonId(1)])) |
|
POST /v2/notes/search |
supported | notes.search("prompt text") |
|
DELETE /v2/notes/{noteId} |
supported | notes.delete(NoteId(1)) |
|
GET /v2/notes/{noteId} |
supported | notes.get(NoteId(1)) |
|
POST /v2/notes/{noteId} |
supported | notes.update(NoteId(1), NoteUpdate(content="x")) |
|
GET /v2/notes/{noteId}/attached-companies |
supported | notes.list_attached_companies(NoteId(1)) |
|
GET /v2/notes/{noteId}/attached-opportunities |
supported | notes.list_attached_opportunities(NoteId(1)) |
|
GET /v2/notes/{noteId}/attached-persons |
supported | notes.list_attached_persons(NoteId(1)) |
|
GET /v2/notes/{noteId}/replies |
supported | notes.list_replies(NoteId(1)) |
|
GET /v2/opportunities |
supported | opportunities.list() |
|
DELETE /v2/opportunities/{opportunityId} |
planned | beta; API 2026-09-17+; phase when-live | |
GET /v2/opportunities/{opportunityId} |
supported | opportunities.get(OpportunityId(1)) |
|
POST /v2/opportunities/{opportunityId} |
planned | beta; API 2026-09-17+; phase when-live | |
GET /v2/opportunities/{opportunityId}/notes |
supported | opportunities.list_notes(OpportunityId(1)) |
|
GET /v2/person-merges |
supported | persons.list_merges() |
|
POST /v2/person-merges |
supported | persons.merge(PersonId(1), PersonId(2)) |
|
GET /v2/person-merges/{mergeId} |
supported | persons.get_merge_state(1) |
|
GET /v2/persons |
supported | persons.list() |
|
POST /v2/persons |
planned | beta; API 2026-07-15+; phase when-live | |
GET /v2/persons/fields |
supported | persons.get_fields() |
|
GET /v2/persons/fields/{fieldId}/dropdown-options |
supported | persons.get_field_dropdown_options(FieldId(1)) |
|
POST /v2/persons/search |
supported | persons.find() |
beta |
DELETE /v2/persons/{personId} |
planned | beta; API 2026-07-15+; phase when-live | |
GET /v2/persons/{personId} |
supported | persons.get(PersonId(1)) |
|
GET /v2/persons/{personId}/fields |
supported | persons.get_field_values(PersonId(1)) |
beta |
PATCH /v2/persons/{personId}/fields |
supported | persons.batch_update_fields(PersonId(1), {"field-1": "x"}) |
|
GET /v2/persons/{personId}/fields/{fieldId} |
supported | persons.get_field_value(PersonId(1), "field-1") |
beta |
POST /v2/persons/{personId}/fields/{fieldId} |
supported | persons.update_field_value(PersonId(1), "field-1", "x") |
|
GET /v2/persons/{personId}/fields/{fieldId}/values |
supported | persons.list_field_value_items(PersonId(1), "field-1") |
beta; API 2026-09-17+ |
GET /v2/persons/{personId}/list-entries |
supported | persons.get_list_entries(PersonId(1)) |
|
GET /v2/persons/{personId}/lists |
supported | persons.get_lists(PersonId(1)) |
|
GET /v2/persons/{personId}/notes |
supported | persons.list_notes(PersonId(1)) |
|
GET /v2/persons/{personId}/relationships |
supported | persons.list_relationships(PersonId(1)) |
|
GET /v2/rate-limit |
supported | rate_limits.refresh() |
beta; API 2026-07-15+ |
GET /v2/reminders |
supported | reminders.list() |
|
POST /v2/reminders |
supported | reminders.create(ReminderCreate(owner_id=UserId(1), type=ReminderType.ONE_TIME, due_date=datetime(2026, 1, 1, tzinfo=timezone.utc), person_id=PersonId(1))) |
|
DELETE /v2/reminders/{reminderId} |
supported | reminders.delete(ReminderIdType(1)) |
beta; API 2026-07-15+ |
GET /v2/reminders/{reminderId} |
supported | reminders.get(ReminderIdType(1)) |
beta; API 2026-07-15+ |
POST /v2/reminders/{reminderId} |
supported | reminders.update(ReminderIdType(1), ReminderUpdate(content="x")) |
beta; API 2026-09-17+ |
POST /v2/semantic-search |
supported | companies.semantic_search("prompt text") |
|
GET /v2/tasks/company-merges |
supported | tasks.list_merge_tasks("company") |
|
GET /v2/tasks/company-merges/{taskId} |
supported | companies.get_merge_status("t1") |
|
GET /v2/tasks/person-merges |
supported | tasks.list_merge_tasks("person") |
|
GET /v2/tasks/person-merges/{taskId} |
supported | persons.get_merge_status("t1") |
|
GET /v2/teams |
supported | teams.list() |
beta; API 2026-09-17+ |
GET /v2/teams/{teamId} |
supported | teams.get(1) |
beta; API 2026-09-17+ |
GET /v2/teams/{teamId}/accessible-lists |
supported | teams.list_accessible_lists(1) |
beta; API 2026-09-17+ |
GET /v2/teams/{teamId}/members |
supported | teams.list_members(1) |
beta; API 2026-09-17+ |
GET /v2/transcripts |
supported | transcripts.list() |
|
DELETE /v2/transcripts/{transcriptId} |
planned | beta; API 2026-09-17+; phase when-live | |
GET /v2/transcripts/{transcriptId} |
supported | transcripts.get(1) |
|
GET /v2/transcripts/{transcriptId}/fragments |
supported | transcripts.fragments(1) |
|
GET /v2/users |
supported | users.list() |
beta |
GET /v2/users/{userId} |
supported | users.get(UserId(1)) |
beta |
GET /v2/webhooks |
supported | webhooks.list() |
beta; API 2026-07-15+ |
POST /v2/webhooks |
supported | webhooks.create(WebhookCreate(url="https://example.com/h", subscriptions=[])) |
beta; API 2026-07-15+ |
DELETE /v2/webhooks/{webhookId} |
supported | webhooks.delete(WebhookId(1)) |
beta; API 2026-07-15+ |
GET /v2/webhooks/{webhookId} |
supported | webhooks.get(WebhookId(1)) |
beta; API 2026-07-15+ |
POST /v2/webhooks/{webhookId} |
supported | webhooks.update(WebhookId(1), WebhookUpdate(status="disabled")) |
beta; API 2026-07-15+ |
V1 API¶
40 supported, 19 equivalent
| Operation | Status | SDK | Notes |
|---|---|---|---|
GET /auth/whoami |
equivalent | via v2 GET /v2/auth/whoami | |
GET /entity-files |
supported | files.list(company_id=CompanyId(1)) |
one person's, company's or opportunity's files (V2 lists only org-wide: files.feed) |
POST /entity-files |
supported | files.upload_bytes(b"x", "a.txt", company_id=CompanyId(1)) |
|
GET /entity-files/download/{} |
supported | files.download(FileId(1)) |
|
GET /entity-files/{} |
supported | files.get(FileId(1)) |
the file's record, with its person/company/opportunity, under any API version pin; get_download_url uses V2 when it can |
GET /field-value-changes |
supported | field_value_changes.list(FieldId(1), company_id=CompanyId(1)) |
|
GET /field-values |
supported | field_values.list(company_id=CompanyId(1)) |
|
POST /field-values |
supported | field_values.create(FieldValueCreate(field_id=FieldId(1), entity_id=1, value="x")) |
|
DELETE /field-values/{} |
supported | field_values.delete(FieldValueId(1)) |
|
PUT /field-values/{} |
supported | field_values.update(FieldValueId(1), "x") |
|
GET /fields |
supported | fields.list() |
|
POST /fields |
supported | fields.create(FieldCreate(name="x", entity_type=EntityType.PERSON, value_type=FieldValueType.TEXT)) |
|
DELETE /fields/{} |
supported | fields.delete(FieldId(1)) |
|
GET /interactions |
supported | interactions.list(type=InteractionType.MEETING, person_id=PersonId(1), start_time=datetime(2024, 1, 1, tzinfo=timezone.utc), end_time=datetime(2024, 1, 2, tzinfo=timezone.utc)) |
|
POST /interactions |
supported | interactions.create(InteractionCreate(type=InteractionType.MEETING, person_ids=[PersonId(1)], content="x", date="2024-01-01T00:00:00Z")) |
|
DELETE /interactions/{} |
supported | interactions.delete(InteractionId(1), InteractionType.MEETING) |
|
GET /interactions/{} |
supported | interactions.get(InteractionId(1), InteractionType.MEETING) |
|
PUT /interactions/{} |
supported | interactions.update(InteractionId(1), InteractionType.MEETING, InteractionUpdate(content="x")) |
|
GET /lists |
equivalent | via v2 GET /v2/lists | |
POST /lists |
supported | lists.create(ListCreate(name="x", type=ListType.PERSON, is_public=False, owner_id=UserId(1))) |
only for a list created with an owner or extra permissions (V2 can't set them) |
GET /lists/{} |
supported | lists.get_size(ListId(1), force=True) |
for the list size only (V2 has none); the list itself is read from V2 |
GET /lists/{}/list-entries |
equivalent | via v2 GET /v2/lists/{listId}/list-entries | |
POST /lists/{}/list-entries |
supported | lists.entries(ListId(1)).add_person(PersonId(1)) |
|
DELETE /lists/{}/list-entries/{} |
supported | lists.entries(ListId(1)).delete(ListEntryId(1)) |
|
GET /lists/{}/list-entries/{} |
equivalent | via v2 GET /v2/lists/{listId}/list-entries/{listEntryId} | |
GET /notes |
supported | notes.list() |
|
POST /notes |
equivalent | via v2 POST /v2/notes | |
DELETE /notes/{} |
equivalent | via v2 DELETE /v2/notes/{noteId} | |
GET /notes/{} |
equivalent | via v2 GET /v2/notes/{noteId} | |
PUT /notes/{} |
equivalent | via v2 POST /v2/notes/{noteId} | |
GET /opportunities |
supported | opportunities.search("x") |
|
POST /opportunities |
supported | opportunities.create(OpportunityCreate(name="x", list_id=ListId(1))) |
|
DELETE /opportunities/{} |
supported | opportunities.delete(OpportunityId(1)) |
|
GET /opportunities/{} |
supported | opportunities.get_details(OpportunityId(1)) |
|
PUT /opportunities/{} |
supported | opportunities.update(OpportunityId(1), OpportunityUpdate(name="x")) |
|
GET /organizations |
supported | companies.search("x") |
|
POST /organizations |
supported | companies.create(CompanyCreate(name="x"), if_not_exists=False) |
|
GET /organizations/fields |
equivalent | via v2 GET /v2/companies/fields | |
DELETE /organizations/{} |
supported | companies.delete(CompanyId(1)) |
|
GET /organizations/{} |
supported | companies.get_associated_person_ids(CompanyId(1)) |
|
PUT /organizations/{} |
supported | companies.update(CompanyId(1), CompanyUpdate(name="x")) |
|
GET /persons |
supported | persons.search("x") |
|
POST /persons |
supported | persons.create(PersonCreate(first_name="a", last_name="b"), if_not_exists=False) |
|
GET /persons/fields |
equivalent | via v2 GET /v2/persons/fields | |
DELETE /persons/{} |
supported | persons.delete(PersonId(1)) |
|
GET /persons/{} |
supported | persons.get_associated_company_ids(PersonId(1)) |
|
PUT /persons/{} |
supported | persons.update(PersonId(1), PersonUpdate(first_name="a")) |
|
GET /rate-limit |
equivalent | via v2 GET /v2/rate-limit | |
GET /relationships-strengths |
supported | relationships.get(PersonId(1)) |
|
GET /reminders |
equivalent | via v2 GET /v2/reminders | |
POST /reminders |
equivalent | via v2 POST /v2/reminders | |
DELETE /reminders/{} |
supported | reminders.delete(ReminderIdType(1)) |
only as the retry when V2 refuses (V2: creator or owner only) |
GET /reminders/{} |
equivalent | via v2 GET /v2/reminders/{reminderId} | |
PUT /reminders/{} |
supported | reminders.update(ReminderIdType(1), ReminderUpdate(type=ReminderType.RECURRING, reset_type=ReminderResetType.EMAIL, reminder_days=30)) |
to change a reminder's type (V2 can't), and as the retry when V2 refuses an update (V2: creator or owner only) |
GET /webhook |
equivalent | via v2 GET /v2/webhooks | |
POST /webhook/subscribe |
equivalent | via v2 POST /v2/webhooks | |
DELETE /webhook/{} |
equivalent | via v2 DELETE /v2/webhooks/{webhookId} | |
GET /webhook/{} |
equivalent | via v2 GET /v2/webhooks/{webhookId} | |
PUT /webhook/{} |
equivalent | via v2 POST /v2/webhooks/{webhookId} |