SendFox
MARKETING · MARKETING
Contacts, lists, campaigns, automations, and their email activity in 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.
sendfox_delete_automation_emails_by_idWRITERemove an email from an automation via DELETE /automation-emails/{id}
sendfox_delete_automations_by_idWRITEDelete an automation -- Soft-deletes the automation and cancels all scheduled deliverables via DELETE /automations/{id}
sendfox_delete_campaigns_by_idWRITEDelete a draft campaign -- Only draft campaigns (not yet sent) can be deleted. Uses soft delete. via DELETE /campaigns/{id}
sendfox_delete_contact_fields_by_idWRITEDelete a contact field -- Permanently deletes the contact field via DELETE /contact-fields/{id}
sendfox_delete_contact_tags_by_idWRITEDelete a contact tag -- Deletes the tag. Tagged contacts are kept — only the tag and its attachments (including campaign audience use) are removed. via DELETE /contact-tags/{id}
sendfox_delete_contacts_by_contact_id_tags_by_tag_idWRITERemove a tag from a contact via DELETE /contacts/{contact_id}/tags/{tag_id}
sendfox_delete_contacts_by_idWRITEDelete a contact -- Soft-deletes a contact and cancels any scheduled deliverables via DELETE /contacts/{id}
sendfox_delete_domains_by_idWRITEDelete a sender domain -- Removes the domain from SendGrid and soft-deletes locally via DELETE /domains/{id}
sendfox_delete_forms_by_idWRITEDelete a form -- Soft-deletes the form via DELETE /forms/{id}
sendfox_delete_lists_by_idWRITEDelete a contact list -- Soft-deletes a list. Returns 409 if the list is used by forms, landing pages, or automations. via DELETE /lists/{id}
sendfox_delete_lists_by_list_id_contacts_by_contact_idWRITERemove a contact from a list via DELETE /lists/{list_id}/contacts/{contact_id}
sendfox_get_automationsREADList automations via GET /automations
sendfox_get_automations_by_idREADGet a specific automation -- Returns automation with triggers, items, and campaign stats via GET /automations/{id}
sendfox_get_campaign_sectionsREADList saved campaign sections -- Returns only content owned by the authenticated account, including saved HTML. Shared gallery content is not included. This endpoint does not publish, modify or send content. Results are ordered by descending ID, 20 per page. via GET /campaign-sections
sendfox_get_campaign_sections_by_idREADGet a saved campaign section -- Returns only content owned by the authenticated account, including saved HTML. Shared gallery content is not included. This endpoint does not publish, modify or send content. via GET /campaign-sections/{id}
sendfox_get_campaign_templatesREADList saved campaign templates -- Returns only content owned by the authenticated account, including saved HTML. Shared gallery content is not included. This endpoint does not publish, modify or send content. Results are ordered by descending ID, 20 per page. via GET /campaign-templates
sendfox_get_campaign_templates_by_idREADGet a saved campaign template -- Returns only content owned by the authenticated account, including saved HTML. Shared gallery content is not included. This endpoint does not publish, modify or send content. via GET /campaign-templates/{id}
sendfox_get_campaignsREADList campaigns -- Returns a paginated list of campaigns (100 per page) via GET /campaigns
sendfox_get_campaigns_by_idREADGet a specific campaign via GET /campaigns/{id}
sendfox_get_campaigns_by_id_engagementREADList the contacts behind a campaign's engagement -- Returns the contacts in one of a sent campaign's engagement groups. non_openers covers contacts the campaign actually sent to who did not open it — queued and cancelled deliverables are excluded, since they never had the chance. via GET /campaigns/{id}/engagement
sendfox_get_campaigns_by_id_statsREADGet campaign performance statistics -- Returns sent count and open/click/bounce/unsubscribe/spam counts and rates, all read from stored counters. Pass `include_link_stats=true` to also get `link_stats` — the campaign's links ranked by click count. That part is opt-in because it counts rows in `email_link_clicks` once per link rather than reading a counter, so leaving it off keeps this endpoint as cheap as it has always been. via GET /campaigns/{id}/stats
sendfox_get_campaigns_statsREADGet statistics for multiple campaigns -- Returns stored counts and rates for one to 100 distinct owned campaigns in request order. The entire request fails with the same validation error for missing, deleted or foreign IDs. Does not return link stats or query individual delivery events. via GET /campaigns/stats
sendfox_get_contact_fieldsREADList user contact fields -- Returns custom contact fields defined by the user (20 per page) via GET /contact-fields
sendfox_get_contact_fields_by_idREADGet a specific contact field via GET /contact-fields/{id}
sendfox_get_contact_tagsREADList contact tags -- Lists the account's tags, newest first, each with its contact count. Distinct from the legacy /tags endpoints, which operate on lists. via GET /contact-tags
sendfox_get_contact_tags_by_idREADGet a contact tag via GET /contact-tags/{id}
sendfox_get_contactsREADList contacts -- Returns a paginated list of contacts (100 per page by default, up to 1000 via `per_page`). Supports engagement filtering through `filter[...]` query parameters, so you can answer questions like "who last opened over a year ago" without paging the whole account. All filter conditions are AND-ed. Pass `count_only=true` to get just the number of matches — the cheapest way to size an audience before acting on it. via GET /contacts
sendfox_get_contacts_bulk_actions_by_idREADCheck the progress of a bulk contact action -- For a dry run, matched_count is the answer and nothing was modified. A run whose match set exceeds the per-request ceiling fails without applying anything. via GET /contacts/bulk-actions/{id}
sendfox_get_contacts_by_contact_id_tagsREADList a contact's tags via GET /contacts/{contact_id}/tags
sendfox_get_contacts_by_idREADGet a specific contact via GET /contacts/{id}
sendfox_get_contacts_by_id_activityREADGet email activity for a contact -- Returns paginated email deliverables and contact-level engagement summary via GET /contacts/{id}/activity
sendfox_get_contacts_unsubscribedREADList unsubscribed contacts via GET /contacts/unsubscribed
sendfox_get_domainsREADList sender domains -- Returns a paginated list of the user's whitelabel/sender domains via GET /domains
sendfox_get_domains_by_idREADGet domain with DNS records -- Returns domain details including DNS records needed for verification via GET /domains/{id}
sendfox_get_formsREADList forms via GET /forms
sendfox_get_forms_by_idREADGet a specific form via GET /forms/{id}
sendfox_get_listsREADList contact lists via GET /lists
sendfox_get_lists_by_idREADGet a specific contact list -- Returns list details including average open and click rates via GET /lists/{id}
sendfox_get_lists_by_list_id_contactsREADGet contacts in a list via GET /lists/{list_id}/contacts
sendfox_get_meREADGet current user information via GET /me
sendfox_patch_automation_emails_by_idWRITEUpdate an automation email via PATCH /automation-emails/{id}
sendfox_patch_automations_by_idWRITEUpdate an automation -- Update title, trigger, or active status. Activating reschedules stale deliverables. via PATCH /automations/{id}
sendfox_patch_campaigns_by_idWRITEUpdate a draft campaign -- Only draft campaigns (not yet sent) can be updated. All fields are optional. via PATCH /campaigns/{id}
sendfox_patch_contact_fields_by_idWRITEUpdate a contact field label -- Updates the label and auto-regenerates the name slug. Note: `contact_field_type_id` is immutable and cannot be changed after creation. via PATCH /contact-fields/{id}
sendfox_patch_contact_tags_by_idWRITEUpdate a contact tag via PATCH /contact-tags/{id}
sendfox_patch_contacts_by_idWRITEUpdate a contact -- Update contact details including name, list memberships, and custom fields via PATCH /contacts/{id}
sendfox_patch_forms_by_idWRITEUpdate a form via PATCH /forms/{id}
sendfox_patch_lists_by_idWRITEUpdate a contact list via PATCH /lists/{id}
sendfox_patch_unsubscribeWRITEUnsubscribe a contact by email via PATCH /unsubscribe
sendfox_post_automationsWRITECreate an automation via POST /automations
sendfox_post_automations_by_id_emailsWRITEAdd an email to an automation via POST /automations/{id}/emails
sendfox_post_campaignsWRITECreate a new campaign -- Creates a campaign as a draft. To send it, use the send endpoint or provide scheduled_at. Subject lines cannot start with "RE:" or "FWD:". At least one list is required if scheduled_at is provided. via POST /campaigns
sendfox_post_campaigns_by_id_resendWRITEClone a sent campaign at part of its original audience -- Creates a new draft with the original's content, sender, and exclusions, aimed at the chosen slice of the original audience. Omit scheduled_at to leave it as a draft. The source campaign's lists are deliberately not carried over — the engagement segment is the audience. via POST /campaigns/{id}/resend
sendfox_post_campaigns_by_id_sendWRITESend a campaign immediately -- Schedules a draft campaign for immediate sending. The campaign must: - Not already be sent or scheduled - Have at least one list assigned - Not be a confirmation (double opt-in) email — those are delivered to each contact as they subscribe, never as a broadcast - The user must not be in a warmup/throttle period All existing abuse prevention applies automatically: content approval workflow, sending throttles, spam detection, and bounce rate monitoring. via POST /campaigns/{id}/send
sendfox_post_contact_fieldsWRITECreate a custom contact field -- Creates a custom field for contacts. The `name` is auto-generated from the `label` as a slug. Provide `type` (`text`, `number`, or `date`) or the existing `contact_field_type_id` UUID. If both are provided, they must identify the same type. UUIDs are the same for every account: | Type | `contact_field_type_id` | | ------ | -------------------------------------- | | text | `0abe5601-7738-43c8-858f-81911ecf89ee` | | number | `e43c6471-b3ff-4541-80c5-964c62decd15` | | date | `fe7dd76c-5113-4159-bc7c-0dbf0ed8d404` | The value is immutable after creation and is not returned by any endpoint - responses carry the human-readable `type` (`text`, `number`, `date`) instead. via POST /contact-fields
sendfox_post_contact_tagsWRITECreate a contact tag -- Creates a tag. A brand color is auto-assigned when none is provided. Tag names are unique per account. via POST /contact-tags
sendfox_post_contactsWRITECreate a new contact via POST /contacts
sendfox_post_contacts_batchWRITEBatch import contacts -- Import up to 1,000 contacts in a single request. Creates new contacts or updates existing ones. via POST /contacts/batch
sendfox_post_contacts_bulk_actionsWRITEApply a tag or list change to every contact matching a filter -- Queues one action against every contact the filter matches, applied in chunks in the background. Returns immediately with an id to poll. **Run with `dry_run: true` first.** A dry run reports how many contacts match and changes nothing — it is the only way to catch a filter that matches more than intended, and a bulk write is not undoable. An empty filter (which would match the whole account) is rejected unless it is a dry run. Per-campaign conditions (`opened_campaign_id`, `not_opened_campaign_id`, `clicked_campaign_id`) are available here but not on `GET /contacts`, because they are resolved in the background rather than inside a request. Bulk delete and bulk unsubscribe are deliberately not offered. via POST /contacts/bulk-actions
sendfox_post_contacts_by_contact_id_tags_by_tag_idWRITEAttach a tag to a contact -- Idempotent. Returns the contact's tags after the change. via POST /contacts/{contact_id}/tags/{tag_id}
sendfox_post_domainsWRITEAdd a sender domain -- Adds a new sender domain and creates the corresponding SendGrid whitelabel domain. Requires an active subscription and SendGrid subuser. via POST /domains
sendfox_post_domains_by_id_validateWRITEValidate domain DNS records -- Triggers DNS validation for the domain via SendGrid. Returns whether validation passed and any errors for specific DNS records. via POST /domains/{id}/validate
sendfox_post_formsWRITECreate a new form -- Creates a subscription form linked to one or more lists. Free users are limited to 1 form. via POST /forms
sendfox_post_listsWRITECreate a new contact list via POST /lists
sendfox_post_lists_by_list_id_contactsWRITEAdd a contact to a list -- Adds an existing contact to a list. If the contact is already in the list, no duplicate is created. via POST /lists/{list_id}/contacts
Often connected alongside
Put SendFox behind one governed endpoint.
Same permissions, same audit trail, whatever else you connect next.