All integrations

Benchmark Email

MARKETING · EMAIL

Contacts, lists, campaigns, and reports from the account 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.

benchmarkemail_delete_api_contact_by_contactidWRITE

Delete a contact by id via DELETE /api/contact/{contactId} Answers 200 with the deleted contact object.

no provider scope
benchmarkemail_delete_api_contact_structure_by_contactstructureid_listsWRITE

Delete multiple lists via DELETE /api/contact-structure/{contactStructureId}/lists Deletes SEVERAL lists named in the request body, and answers 204. The single-list delete is a different route.

no provider scope
benchmarkemail_delete_api_contact_structure_by_contactstructureid_lists_by_listidWRITE

Delete a list by id via DELETE /api/contact-structure/{contactStructureId}/lists/{listId}

no provider scope
benchmarkemail_delete_api_email_campaign_by_campaignidWRITE

Delete campaign by id via DELETE /api/email/campaign/{campaignId} Answers 204 with no body.

no provider scope
benchmarkemail_get_api_contactREAD

Get all contacts via GET /api/contact Returns every contact in one response -- this endpoint does not paginate. Use Search for contacts on a large database.

no provider scope
benchmarkemail_get_api_contact_by_contactidREAD

Get a contact by id via GET /api/contact/{contactId}

no provider scope
benchmarkemail_get_api_contact_by_contactid_eventsREAD

Get contact events via GET /api/contact/{contactId}/events

no provider scope
benchmarkemail_get_api_contact_eventsREAD

Get account contact events via GET /api/contact/events pastDays defaults to 30 and is capped at 90, so this reads a rolling window rather than the full history.

no provider scope
benchmarkemail_get_api_contact_structureREAD

Get all contact structures via GET /api/contact-structure

no provider scope
benchmarkemail_get_api_contact_structure_by_contactstructureidREAD

Get a contact structure by id via GET /api/contact-structure/{contactStructureId}

no provider scope
benchmarkemail_get_api_contact_structure_by_contactstructureid_listsREAD

Get paginated lists via GET /api/contact-structure/{contactStructureId}/lists Page through with page and size; sort takes 'field:direction' over name, createdAt or updatedAt.

no provider scope
benchmarkemail_get_api_contact_structure_by_contactstructureid_lists_allREAD

Get all lists via GET /api/contact-structure/{contactStructureId}/lists/all The unpaginated companion to Get paginated lists: every list in the structure, id and name only.

no provider scope
benchmarkemail_get_api_contact_structure_by_contactstructureid_lists_by_listidREAD

Get a list by id via GET /api/contact-structure/{contactStructureId}/lists/{listId}

no provider scope
benchmarkemail_get_api_email_campaignREAD

Get all campaigns via GET /api/email/campaign

no provider scope
benchmarkemail_get_api_email_campaign_by_campaignidREAD

Get campaign by id via GET /api/email/campaign/{campaignId}

no provider scope
benchmarkemail_get_api_email_domainREAD

Get all domains via GET /api/email/domain

no provider scope
benchmarkemail_get_api_email_domain_by_domainidREAD

Get a domain by id via GET /api/email/domain/{domainId}

no provider scope
benchmarkemail_get_api_email_domain_grey_labelREAD

Get the grey label domain for the account via GET /api/email/domain/grey-label The account's shared sending domain, used when no authenticated domain of the customer's own is verified.

no provider scope
benchmarkemail_get_api_email_templateREAD

Get email templates via GET /api/email/template lang is REQUIRED -- the template library is per-language and the call 400s without it.

no provider scope
benchmarkemail_get_api_email_template_by_idREAD

Get email template by ID via GET /api/email/template/{id} lang is REQUIRED.

no provider scope
benchmarkemail_get_api_email_template_categoriesREAD

Get email template categories via GET /api/email/template/categories lang is REQUIRED.

no provider scope
benchmarkemail_get_api_reports_dashboardREAD

Get dashboard snapshot reports via GET /api/reports/dashboard pastDays is REQUIRED (1-90).

no provider scope
benchmarkemail_get_api_reports_email_by_idREAD

Get individual email campaign reports via GET /api/reports/email/{id}

no provider scope
benchmarkemail_get_api_reports_email_by_id_engagementREAD

Get individual email campaign engagement reports via GET /api/reports/email/{id}/engagement

no provider scope
benchmarkemail_get_api_reports_email_overallREAD

Get overall email reports via GET /api/reports/email/overall pastDays is REQUIRED (1-90).

no provider scope
benchmarkemail_get_api_reports_email_overall_histogramREAD

Get overall email histogram by event type via GET /api/reports/email/overall/histogram pastDays and eventType are both REQUIRED.

no provider scope
benchmarkemail_patch_api_contact_by_contactidWRITE

Partial update a contact by id via PATCH /api/contact/{contactId} Accepts the status field only -- every other change goes through Update a contact by id. Status values are case-sensitive, and moving a contact to Inactive requires both primary and secondary. Once Inactive a contact cannot be reactivated through the API.

no provider scope
benchmarkemail_patch_api_contact_structure_by_contactstructureid_lists_by_listidWRITE

Update a list by id via PATCH /api/contact-structure/{contactStructureId}/lists/{listId}

no provider scope
benchmarkemail_patch_api_email_campaign_by_campaignidWRITE

Update campaign by id via PATCH /api/email/campaign/{campaignId}

no provider scope
benchmarkemail_post_api_contactWRITE

Create a new contact via POST /api/contact key is the contact's email address and contactStructureId decides which custom fields exist; fields entries reference a field's _id from the contact structure. A duplicate email in the same structure is a 400 DuplicateFieldError, not a second contact.

no provider scope
benchmarkemail_post_api_contact_exportWRITE

Export contacts via POST /api/contact/export Answers text/csv rather than JSON; the connector returns the CSV under a raw key when the body does not parse as JSON.

no provider scope
benchmarkemail_post_api_contact_searchWRITE

Search for contacts via POST /api/contact/search A read expressed as a POST because the filter travels in the body. It needs contacts:read, not contacts:write.

no provider scope
benchmarkemail_post_api_contact_structureWRITE

Create a new contact structure via POST /api/contact-structure

no provider scope
benchmarkemail_post_api_contact_structure_by_contactstructureid_listsWRITE

Create a new list via POST /api/contact-structure/{contactStructureId}/lists

no provider scope
benchmarkemail_post_api_contact_structure_by_contactstructureid_lists_by_listid_duplicateWRITE

Duplicate a list via POST /api/contact-structure/{contactStructureId}/lists/{listId}/duplicate

no provider scope
benchmarkemail_post_api_contact_structure_by_contactstructureid_lists_mergeWRITE

Merge lists into a new list via POST /api/contact-structure/{contactStructureId}/lists/merge Creates a NEW list from the named sources; the sources themselves are not consumed.

no provider scope
benchmarkemail_post_api_email_campaignWRITE

Add a campaign via POST /api/email/campaign

no provider scope
benchmarkemail_post_api_email_campaign_by_campaignid_duplicateWRITE

Duplicate an existing campaign via POST /api/email/campaign/{campaignId}/duplicate The copy is created as a draft; duplicating never sends.

no provider scope
benchmarkemail_put_api_contact_by_contactidWRITE

Update a contact by id via PUT /api/contact/{contactId} A REPLACE: any field omitted from the body is removed from the stored contact. __v is required and must come from a fresh Get a contact by id; a stale value is refused with 400 ConcurrencyError. Cannot move an Inactive contact back to Active.

no provider scope
benchmarkemail_put_api_contact_structure_by_contactstructureidWRITE

Update a contact structure by id via PUT /api/contact-structure/{contactStructureId} Removing a field that a sign-up form still references is refused with 400 ContactFieldInUseError, whose debug.affectedForms names each form.

no provider scope

Put Benchmark Email behind one governed endpoint.

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