Mailsoftly
MARKETING · MARKETING
Contacts, lists, and email and SMS campaigns 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.
mailsoftly_get_api_v3_email_statusREADCheck email draft status. GET /api/v3/email_status. Returns the current status of an email draft and whether it's ready to send. Status values: `Draft`: draft is being prepared `Sent`: email has been sent `sending`: email is currently being sent (in queue) `ready_to_send: true` means the draft can be sent via `POST /send_email` Polling guidance. When a draft is created via `POST /create_emails` with `recipients` or `attaches`, a background job upserts the contacts, attaches the files, and only then flips `ready_to_send` to `true`.
mailsoftly_get_api_v3_get_accountREADGet account info. GET /api/v3/get_account. Returns your account/company profile information (name, domain, plan).
mailsoftly_get_api_v3_get_automationREADGet a single automation. GET /api/v3/get_automation. Returns details of a single automation including its sequence and trigger configuration.
mailsoftly_get_api_v3_get_automationsREADList automations. GET /api/v3/get_automations. Returns all email automations and drip campaigns (id, name, trigger type, active status).
mailsoftly_get_api_v3_get_brand_kitREADGet the brand kit. GET /api/v3/get_brand_kit. Returns the account brand kit: the logo, the favicon, the colors, the palette, the site title and description and the social links, all of which campaigns and pages can reuse so they look like the company. When the account has no kit yet the answer is present: false with a short note saying how one is made. Nothing here is a credential.
mailsoftly_get_api_v3_get_campaignREADGet one campaign in full. GET /api/v3/get_campaign. Returns everything about a single campaign that list_campaigns leaves out: preheader, from address, reply-to, email type, segment, contact list name, A/B subject experiment, public sharing state, file attachments and whether a per-recipient PDF is attached. Pass the campaign id from list_campaigns; pass include_body=true to get the HTML body as well, which is left out by default because it is large.
mailsoftly_get_api_v3_get_campaign_linksREADGet per link clicks for a campaign. GET /api/v3/get_campaign_links. The click table behind a sent campaign: every address that was clicked, how many clicks and how many distinct recipients it drew, and its share of all clicks, busiest first. Addresses that differ only by campaign tagging are counted as one link, and the unsubscribe, preference and view in browser links plus our own footer badge are left out. Only human clicks are counted, so these numbers can be lower than a raw click count.
mailsoftly_get_api_v3_get_campaign_recipientsREADList the recipients of a campaign. GET /api/v3/get_campaign_recipients. Who a sent campaign reached and what each of them did with it: address, contact id, when it was sent, when it was opened and clicked, and whether the address has since bounced or unsubscribed. Newest send first, paginated. The engagement filter narrows the result to the openers, the clickers, the people who did not open, the bounces or the unsubscribes, for a follow up send or a clean up.
mailsoftly_get_api_v3_get_campaign_reportREADGet a full campaign report. GET /api/v3/get_campaign_report. The whole performance picture for one sent campaign: headline counts and rates, the same rates averaged over every sent campaign in the account for comparison, the engagement split by recipient mailbox provider and by recipient domain, and cumulative open and click curves by hour since the send. Pass the campaign id from list_campaigns. A campaign that has not been sent, and an account with open and click tracking turned off, come back with available false and a note saying why.
mailsoftly_get_api_v3_get_campaign_statsREADGet campaign performance. GET /api/v3/get_campaign_stats. Delivery and engagement statistics for a sent campaign: sent, delivered, opened, clicked, bounced, unsubscribed, complained, with open, click, bounce and unsubscribe rates. Unsent drafts return the campaign summary and a note. get_campaign_report carries the provider and domain breakdown and the comparison with the account average.
mailsoftly_get_api_v3_get_compliance_summaryREADGet the compliance summary for a region. GET /api/v3/get_compliance_summary. Where this account stands against the email rules of one sending region, in a single call. Returns the region in play and the frameworks it maps to (CAN-SPAM and CPRA in the United States, CASL and PIPEDA in Canada, GDPR and PECR in the EU and the UK, İYS and KVKK in Türkiye), how many contacts are contactable, how many have opted out, whether a postal address is on file for your email footer, when the consent evidence and opt-out reports were last produced, the points that region asks of a sender, and what Mailsoftly already handles on every send.
mailsoftly_get_api_v3_get_consent_evidenceREADList consent evidence. GET /api/v3/get_consent_evidence. The paper trail every regime asks a sender to keep: who consented, when, through which source, and where each address stands today. Under GDPR, CASL and KVKK the burden of proof sits with you, and CAN-SPAM and CPRA ask you to answer access requests, so this is the same report in all four markets. One row per contact, drawn from the contact's own audit trail: the first created or subscribed event, its source and the label captured at the time. Records older than the audit trail fall back to the date the contact was created and the source stored on it.
mailsoftly_get_api_v3_get_contactREADGet a single contact. GET /api/v3/get_contact. Returns a single contact by ID. By default returns a summary (id, first_name, last_name, email). Pass `type=detailed` to get all contact fields including custom fields, address, and metadata.
mailsoftly_get_api_v3_get_contact_activityREADGet one contact's activity timeline. GET /api/v3/get_contact_activity. Everything the account knows about what happened with one contact, merged into a single newest first timeline: subscription and list events with the source they came from, the campaign mail this contact was sent with its opens and clicks, and the notes teammates wrote on the record. Pass the contact id from get_contacts or search_contacts. The response also carries a compact contact header with the address, name, sending status and last engagement.
mailsoftly_get_api_v3_get_contact_fieldsREADList available contact fields. GET /api/v3/get_contact_fields. Returns the list of all available contact fields and their database types. Internal fields (firm_id, user_id, etc.) are excluded. Use this to discover which fields you can set when creating or updating contacts.
mailsoftly_get_api_v3_get_contact_listREADGet a single contact list. GET /api/v3/get_contact_list. Returns details of a single contact list including its contact count. Note on field naming. This endpoint returns the count as `contacts_count` (plural), while `GET /get_contact_lists` (the list endpoint) returns the same value as `contact_count` (singular). Both mean the same thing.
mailsoftly_get_api_v3_get_contact_list_contactsREADList contacts in a contact list. GET /api/v3/get_contact_list_contacts. Returns the contacts belonging to a specific contact list. Pass `page`/`per_page` (up to 500) for a paginated envelope `{contacts, page, per_page, total, has_more}`; without them the legacy bare array is returned, capped at 10,000 rows with `X-Total-Count` and, past the cap, `X-Truncated: true` plus a `Link` rel="next" header.
mailsoftly_get_api_v3_get_contact_listsREADList all contact lists. GET /api/v3/get_contact_lists. Returns all contact lists in your account with their contact counts. Only "general" type lists are returned (internal system lists are excluded). Note on field naming. This endpoint returns `contact_count` (singular). `GET /get_contact_list` (singular, for a single list) returns the same value under `contacts_count` (plural) for historical reasons. Both refer to the number of contacts in the list.
mailsoftly_get_api_v3_get_contact_subscriptionsREADGet what one contact is subscribed to. GET /api/v3/get_contact_subscriptions. Reads the full subscription picture for one contact: the account-wide sending status, whether the address is globally unsubscribed or suppressed, and one row per email type saying whether the contact accepts it, who opted them out and when. Pass contact_id from get_contacts or search_contacts.
mailsoftly_get_api_v3_get_contactsREADList all contacts. GET /api/v3/get_contacts. Returns all contacts belonging to your account. Each contact includes basic fields: `id`, `first_name`, `last_name`, and `email`. Detailed contact information including custom fields comes from `GET /get_contact` with `type=detailed`. Pass `page`/`per_page` for a paginated envelope `{contacts, page, per_page, total, has_more}`; without them the legacy bare array is returned, capped at 10,000 rows with `X-Total-Count` and, past the cap, `X-Truncated: true` plus a `Link` rel="next" header.
mailsoftly_get_api_v3_get_custom_blockREADGet one content block. GET /api/v3/get_custom_block. Returns one saved block with its full HTML, so it can be pasted into a campaign body or edited and written back with update_custom_block. Pass custom_block_id from list_custom_blocks. A block that belongs to another account answers 404.
mailsoftly_get_api_v3_get_custom_fieldsREADList all custom fields. GET /api/v3/get_custom_fields. Returns all custom fields defined for contacts in your account. Custom fields are key-value pairs where the key is the field name and the value is the field type (currently always "string").
mailsoftly_get_api_v3_get_email_sendersREADList verified email senders. GET /api/v3/get_email_senders. Returns all verified sender email addresses (from, reply_to, status).
mailsoftly_get_api_v3_get_email_templateREADGet a single email template. GET /api/v3/get_email_template. Returns details of a single email template by ID.
mailsoftly_get_api_v3_get_email_templatesREADList email templates. GET /api/v3/get_email_templates. Returns all email templates in your account (id, name, subject, editor type, privacy setting).
mailsoftly_get_api_v3_get_email_typesREADList email types. GET /api/v3/get_email_types. Lists the subscription categories (email types) contacts choose on the preference page, with the list each one feeds.
mailsoftly_get_api_v3_get_endpointsREADList webhook endpoints. GET /api/v3/get_endpoints. Returns all user-created webhook endpoints for receiving external data.
mailsoftly_get_api_v3_get_formREADGet a single form. GET /api/v3/get_form. Returns details of a form including submission count and embed token.
mailsoftly_get_api_v3_get_form_responsesREADList form submissions. GET /api/v3/get_form_responses. Returns all submissions for a specific form.
mailsoftly_get_api_v3_get_formsREADList forms. GET /api/v3/get_forms. Returns all signup and subscription forms (id, name, token, status).
mailsoftly_get_api_v3_get_importREADGet one import and its progress. GET /api/v3/get_import. Reads one contact import in this account by id: its status, how many rows it carries, how many have been processed, the success and failure counts and the first lines of any error report. It follows an import started with import_contacts.
mailsoftly_get_api_v3_get_integrationsREADList active integrations. GET /api/v3/get_integrations. Returns all active third-party integrations (Shopify, Zapier, etc.).
mailsoftly_get_api_v3_get_iys_summaryREADGet the registry filing status. GET /api/v3/get_iys_summary. The filing figures for a national consent registry: how many contacts count as consent rows, how many opt-out rows exist, how many of those opt-outs have not been filed yet, how many contacts are marked as businesses, and when the consent and opt-out files were last produced. Türkiye is the region this serves: İYS, the commercial message registry, where consents are ONAY rows and opt-outs are RET rows. Read only: it files nothing and produces no file.
mailsoftly_get_api_v3_get_opt_outsREADList opt-out records. GET /api/v3/get_opt_outs. Every address that opted out of this account's mail, with the date it happened and how far the opt-out reaches. CAN-SPAM gives you ten business days to honor one, CASL the same, GDPR asks for it right away, and İYS wants the opt-out filed within three business days, so this is the list to mirror into a CRM, a helpdesk or another sending tool. Pass since to pull just what changed and keep the other system in step without walking the whole list.
mailsoftly_get_api_v3_get_pageREADGet a single landing page. GET /api/v3/get_page. Returns details of a landing page including its public URL and stats.
mailsoftly_get_api_v3_get_pagesREADList landing pages. GET /api/v3/get_pages. Returns all landing pages (id, name, token, status, publish date).
mailsoftly_get_api_v3_get_segmentsREADList saved segments. GET /api/v3/get_segments. Returns all saved contact segments/filters for targeted sends.
mailsoftly_get_api_v3_get_signaturesREADList email signatures. GET /api/v3/get_signatures. Returns all email signatures for the account.
mailsoftly_get_api_v3_get_sms_campaignREADGet a single SMS campaign. GET /api/v3/get_sms_campaign. Returns details of an SMS campaign including delivery stats.
mailsoftly_get_api_v3_get_sms_campaignsREADList SMS campaigns. GET /api/v3/get_sms_campaigns. Returns all SMS campaigns (id, name, message, status, sent count).
mailsoftly_get_api_v3_get_suppressionsREADList suppressed emails. GET /api/v3/get_suppressions. Returns all bounced and complained email addresses in the suppression list.
mailsoftly_get_api_v3_get_tagsREADList all tags. GET /api/v3/get_tags. Returns all contact tags in your account. Tags are used to categorize and segment contacts. Each tag has a `name` and `color` (in RGB format). Only contact-type tags are returned (not internal tags used for other resources).
mailsoftly_get_api_v3_get_team_membersREADList team members. GET /api/v3/get_team_members. Returns all team members/users in your account (name, email, role).
mailsoftly_get_api_v3_list_api_keysREADList the account's API keys. GET /api/v3/list_api_keys. Lists the API keys issued for this account, showing which integrations still hold one and which are about to lapse. Takes no parameters and returns the name, the first characters of the key, the permissions it carries, when it was created and last used, when it expires and whether it already has. The key value itself is not returned by the API.
mailsoftly_get_api_v3_list_audit_eventsREADList the account's audit trail. GET /api/v3/list_audit_events. Returns the append-only record of who changed what about this workspace: invitations sent, accepted and revoked, role changes, ownership transfers, people removed or deactivated, domain settings changed and contact imports and exports. Newest first, paged, and filterable to one action. Rows carry the actor, what was touched and a small metadata object; they carry no addresses and no credentials.
mailsoftly_get_api_v3_list_campaignsREADList campaigns. GET /api/v3/list_campaigns. Page through the account's campaigns, newest first: id, name, subject, status (draft, review, sending, sent,...), recipients, send_date and headline counters. Filter with status and search with q.
mailsoftly_get_api_v3_list_connected_appsREADList connected apps. GET /api/v3/list_connected_apps. Lists the third-party apps that currently hold access to this account, the way the Connected apps screen shows them. Takes no parameters and returns one row per app with the permissions it was granted, who approved it and when. Connections are cut in the app under Settings > Connected apps.
mailsoftly_get_api_v3_list_custom_blocksREADList saved content blocks. GET /api/v3/list_custom_blocks. Lists the reusable HTML blocks saved in this account, most recently updated first. Each row carries the name, who saved it, whether it is shared with other accounts and a short plain text preview of its HTML. Fetch the full HTML of one block with get_custom_block.
mailsoftly_get_api_v3_list_domain_health_checksREADList saved domain health checks. GET /api/v3/list_domain_health_checks. Lists the domains this account has checked, newest check first. Takes no parameters and returns the SPF and DMARC readings, whether the domain shows up on public blocklists, when the check ran and who ran it. Each row is the stored result of the last run, not a live reading; run_domain_health_check refreshes one.
mailsoftly_get_api_v3_list_domainsREADList sending domains. GET /api/v3/list_domains. Lists the account's sending domains with a public verification_status (pending_records, checking, verified, failed), the DNS records to add as {type, host, value}, and the setup page url. A verified domain unlocks senders on its addresses.
mailsoftly_get_api_v3_list_filesREADList hosted files. GET /api/v3/list_files. Lists the files this account has uploaded to its File Gallery, newest first. A campaign does not carry the file itself: it is hosted once and the campaign links to it, so every row carries the public_url an email links to plus a public_view_url for the branded viewer page. Filter with q (matches the stored filename and the title), folder_id and kind, and read the folder list and the storage total from the same response.
mailsoftly_get_api_v3_list_imagesREADList the image library. GET /api/v3/list_images. Lists the images this account has uploaded for its email and page editors, newest first, with the public URL campaign HTML uses as an image src. Each row carries the original filename, the title and the alt text, plus the folder it is filed in when it has one. Filter with folder_id, or with q to match a filename.
mailsoftly_get_api_v3_list_importsREADList contact imports. GET /api/v3/list_imports. Lists the contact imports in this account, newest first, with the same progress fields get_import returns. Filter to one list with contact_list_id. It carries the import id of a recent import when that id is not at hand.
mailsoftly_get_api_v3_list_pending_invitationsREADList pending invitations. GET /api/v3/list_pending_invitations. Lists the people who have been invited to this workspace but have not accepted yet. Takes no parameters and returns one row per invitation with the id, address, role, when it was sent and who sent it. It shows whether somebody has an invitation open already, and carries the user_id revoke_invitation needs.
mailsoftly_get_api_v3_list_reply_to_addressesREADList reply-to addresses. GET /api/v3/list_reply_to_addresses. Lists the reply-to addresses registered on the account and whether each is verified.
mailsoftly_get_api_v3_list_sendersREADList available senders. GET /api/v3/list_senders. Returns every from address the account can send a campaign from, in the order the in-app sender picker shows them, plus the sender the account falls back to. Every entry carries `usable_as`, naming the `POST /create_emails` parameter that selects it. Pass exactly one of `sender_id` or `email_sender_id` there; both together is rejected. Entry kinds: `user`: a teammate whose email sits on a domain this account has authenticated. Selected with `sender_id`. `gmail_mailbox` / `outlook_mailbox`: a connected Gmail or Microsoft mailbox, selected with `email_sender_id`.
mailsoftly_get_api_v3_preview_campaign_audienceREADPreview who a campaign would go to. GET /api/v3/preview_campaign_audience. Who a campaign would actually reach if it went out now: which list or segment it targets, how many contacts that holds, how many of them are eligible recipients once suppressed, unsubscribed and opted out addresses are removed, the difference between the two, and up to five example recipients. Pass the campaign id from list_campaigns. A campaign with no list or segment attached comes back with source 'none' and a note.
mailsoftly_get_api_v3_search_contactsREADSearch contacts. GET /api/v3/search_contacts. Search for contacts by exact match on `email`, `first_name`, or `last_name`. All search parameters use exact matching (not partial/fuzzy). Returns matching contacts with basic fields (id, first_name, last_name, email, source). Pass `page`/`per_page` (up to 500) to add `page`, `per_page`, `total` and `has_more` to the response; without them matches are capped at 10,000 rows with an `X-Total-Count` header.
mailsoftly_post_api_v3_add_campaign_attachmentWRITEAttach a file to a draft campaign. POST /api/v3/add_campaign_attachment. Attaches one file to a campaign that is still a draft. The file is sent inline as base64 in content_base64, so this is best for small files; filename must end in one of pdf, doc, docx, xls, xlsx, ppt, pptx, csv, txt, png, jpg, jpeg, gif, zip or ics. The account must have attachments enabled, and everything attached to one campaign has to stay inside the account's total attachment size. Returns the new attachment and the campaign's full attachment list.
mailsoftly_post_api_v3_add_contact_noteWRITEWrite a note on a contact. POST /api/v3/add_contact_note. Records a plain text note on one contact, the same note the account's team sees on the contact page and the same note get_contact_activity returns. Needs the contact id and the text, up to 5000 characters; an optional ISO8601 date backdates the note to when the conversation actually happened. The note is attributed to the connected teammate.
mailsoftly_post_api_v3_add_contact_to_contact_listWRITEAdd a single contact to a list. POST /api/v3/add_contact_to_contact_list. Adds an existing contact to an existing contact list. If the contact is already in the list, returns an info message (not an error).
mailsoftly_post_api_v3_add_contacts_to_contact_listWRITEAdd multiple contacts to a list. POST /api/v3/add_contacts_to_contact_list. Adds multiple contacts to a contact list at once. Contacts are matched by email. If a contact with the given email doesn't exist, it will be created. Contacts without an email address are skipped and reported in the `errors` array. A bare email string is accepted in place of an object.
mailsoftly_post_api_v3_add_custom_field_to_contactWRITEAdd a custom field to a contact. POST /api/v3/add_custom_field_to_contact. Sets a custom field value on a contact. If the custom field doesn't exist at the account level, it will be created automatically. Custom fields are stored as JSONB on the contact record.
mailsoftly_post_api_v3_add_domainWRITEAdd a sending domain. POST /api/v3/add_domain. Starts domain authentication for a domain the account owns. Returns the DNS records (type, host, value) to add at the DNS host, then verify_domain checks them. Idempotent for an existing domain.
mailsoftly_post_api_v3_add_global_email_unsubscriberWRITEGlobally unsubscribe an email. POST /api/v3/add_global_email_unsubscriber. Globally unsubscribes an email address from all email communications. If a contact with this email doesn't exist, one will be created. This sets: Contact's `email_sending_status` to `unsubscribed` All email preferences to opt-out (campaign, newsletter, unsubscribe_all)
mailsoftly_post_api_v3_add_global_sms_unsubscriberWRITEUnsubscribe from SMS. POST /api/v3/add_global_sms_unsubscriber. Globally unsubscribes a contact from all SMS communications. Both `email` and `phone` are required. Phone must be in E.164 format (e.g., `+1234567890`). If a contact with this email doesn't exist, one will be created.
mailsoftly_post_api_v3_assign_tag_to_contactWRITEAssign a tag to a contact. POST /api/v3/assign_tag_to_contact. Assigns a single tag to a contact. You can either: Pass `tag_id` to assign an existing tag, or Pass `tag_name` to find or create a tag by name (optionally with `tag_color`). Tag colors can be in hex format (`#FF0000`) or RGB format (`rgb(255,0,0)`). If no color is provided, the default blue is used.
mailsoftly_post_api_v3_assign_tags_to_contactWRITEAssign multiple tags to a contact. POST /api/v3/assign_tags_to_contact. Assigns multiple tags to a contact at once. Tags that do not exist are created. Tags already assigned to the contact are skipped, not duplicated.
mailsoftly_post_api_v3_authenticationWRITEVerify API credentials. POST /api/v3/authentication. Validates your API access token and returns basic account information. Use this endpoint to verify that your token is valid before making other API calls.
mailsoftly_post_api_v3_create_automationWRITECreate an automation. POST /api/v3/create_automation. Creates an automation as a draft with the same vocabulary as the in-app builder: one trigger, optional extra start events, an optional entry filter, and an ordered list of steps that can branch. Nothing runs until the automation is activated with `POST /update_automation_status`. Trigger `trigger.event` picks the start event. Some events need a target field.
mailsoftly_post_api_v3_create_contactWRITECreate a new contact. POST /api/v3/create_contact. Creates a new contact in your account. The `email` field is required and must be unique within your account. All other fields are optional. Returns the full contact object on success (excluding internal fields).
mailsoftly_post_api_v3_create_contact_listWRITECreate a new contact list. POST /api/v3/create_contact_list. Creates a new empty contact list. The add contact endpoints populate it.
mailsoftly_post_api_v3_create_custom_blockWRITESave a content block. POST /api/v3/create_custom_block. Saves a reusable HTML block (a footer, a header, a promo panel) under a name, so later campaigns can drop it in without rewriting it. Send name and html; is_public defaults to false, which keeps the block inside this account, and true shares it with the wider block gallery other accounts can browse.
mailsoftly_post_api_v3_create_custom_fieldWRITEDefine a custom contact field. POST /api/v3/create_custom_field. Defines a custom contact field (name, type text|number|date|select|multi_select, options for selects). Idempotent for an existing name. Values are then set with add_custom_field_to_contact.
mailsoftly_post_api_v3_create_email_templateWRITECreate an email template. POST /api/v3/create_email_template. Saves a reusable template from complete HTML: name, subject and html. Usable in draft_campaign (template_id) and in automation send_email steps.
mailsoftly_post_api_v3_create_email_typeWRITECreate an email type. POST /api/v3/create_email_type. Creates a subscription category shown on the preference page; optionally linked to a contact list.
mailsoftly_post_api_v3_create_emailsWRITECreate email drafts. POST /api/v3/create_emails. Creates one or more email drafts: a single draft, or several at once through the `mailLists` array. Recipients: exactly one of the following is required: `contact_list_id`: an existing list, OR `recipients`: an array of recipient objects (`{ email, first_name?, last_name? }`). A new contact list named `"List (created via API at YYYY-MM-DD HH:MM:SS)"` is created automatically and its ID is returned in the response as `contact_list_id`. ⚠️ Important: asynchronous list population. With `recipients`, the response returns immediately with an empty auto-created list.
mailsoftly_post_api_v3_create_endpointWRITECreate a webhook endpoint. POST /api/v3/create_endpoint. Creates an inbound webhook endpoint and returns its POST url. Any automation with a webhook trigger can start from it.
mailsoftly_post_api_v3_create_formWRITECreate a signup or lead form. POST /api/v3/create_form. Creates a signup or lead form from a simple field list. Email is always included and required. | field | values | |---|---| | `name` | field name, letters, digits and underscore | | `label` | shown to the visitor (defaults to the name) | | `type` | text, email, textarea, checkbox, select, number, phone | | `required` | true or false | | `options` | for select: the choices | Optional `contact_list_id` adds every submitter to that list; optional `tag_id` tags them. The response carries the fields, the embed token and the short code.
mailsoftly_post_api_v3_create_landing_pageWRITECreate a landing page. POST /api/v3/create_landing_page. Creates a landing page as an unpublished draft from complete HTML in the request. `meta_title` and `meta_description` set the page head; `contact_list_id` turns on lead capture into that list; `goal` (optional) applies the builder's defaults for that goal. The response carries the page's future public URL. Publishing is a separate call, `POST /publish_landing_page`, and needs a verified account. Free accounts that have not verified a sending channel may keep a small number of pages (a `gate` with `level: "plan"` says so).
mailsoftly_post_api_v3_create_or_update_contactWRITECreate or update a contact. POST /api/v3/create_or_update_contact. Creates a new contact or updates an existing one. Important behavior: If `contact_id` is provided, the existing contact with that ID is updated. If `contact_id` is omitted, a new contact is created. This endpoint does NOT upsert by email. Updating an existing contact requires the `contact_id`; without it a new contact is created, which fails if the email already exists. `GET /search_contacts` looks up the ID from an email address, which is then passed here.
mailsoftly_post_api_v3_create_reply_to_addressWRITEAdd a reply-to address. POST /api/v3/create_reply_to_address. Registers a reply-to address and emails it a one-click verification link. Idempotent; an unverified existing address gets the email again.
mailsoftly_post_api_v3_create_segmentWRITECreate a segment. POST /api/v3/create_segment. Creates a saved segment from contact-field conditions: {groups: [{join: and|or, conditions: [{field, operator, value}]}]} with the same fields and operators as automation entry filters. The member count is calculated in the background.
mailsoftly_post_api_v3_create_senderWRITECreate a sender address. POST /api/v3/create_sender. Creates a from address on a verified domain (from, optional reply_to and display_name). Without a verified domain the response carries the sending gate with the ways to unlock.
mailsoftly_post_api_v3_create_signatureWRITECreate an email signature. POST /api/v3/create_signature. Saves an HTML signature for the connected user.
mailsoftly_post_api_v3_create_sms_campaignWRITECreate an SMS campaign. POST /api/v3/create_sms_campaign. Creates an SMS campaign draft to a list from a verified sender number, with the estimated credits. Sending is a separate call and goes through review.
mailsoftly_post_api_v3_create_tagWRITECreate a tag. POST /api/v3/create_tag. Creates a contact tag, or returns the existing one with that name.
mailsoftly_post_api_v3_delete_automationWRITEDelete an automation. POST /api/v3/delete_automation. Deletes an inactive automation and its steps. Deactivate first.
mailsoftly_post_api_v3_delete_campaignWRITEDelete an unsent campaign permanently. POST /api/v3/delete_campaign. Permanent, unlike trash_campaign. Only a campaign that has not been sent can be deleted; a sent campaign keeps its reports and can only be trashed. Use it to release a list that delete_contact_list refuses because a draft campaign still targets it.
mailsoftly_post_api_v3_delete_contactWRITEDelete a contact. POST /api/v3/delete_contact. Permanently deletes one contact with its list memberships, tags and activity. Irreversible. To stop mail without losing the record, add a global unsubscribe instead.
mailsoftly_post_api_v3_delete_contact_listWRITEDelete a contact list. POST /api/v3/delete_contact_list. Deletes a list. Its contacts remain in the account. Refused (422) while an automation starts from the list or while any campaign, sent, draft or trashed, still has the list as its audience; the response names those campaigns in `blocking_campaign_ids`.
mailsoftly_post_api_v3_delete_custom_blockWRITEDelete a content block. POST /api/v3/delete_custom_block. Deletes a saved block for good. Campaigns that already used the block keep the HTML they were built with, since the block is a starting point rather than a live include. Pass custom_block_id from list_custom_blocks.
mailsoftly_post_api_v3_delete_email_templateWRITEDelete an email template. POST /api/v3/delete_email_template. Deletes a template. Refused while an automation step sends it.
mailsoftly_post_api_v3_delete_endpointWRITEDelete a webhook endpoint. POST /api/v3/delete_endpoint. Deletes an endpoint; its url stops accepting requests. Refused while an automation starts from it.
mailsoftly_post_api_v3_delete_fileWRITERemove a file from the gallery. POST /api/v3/delete_file. Takes a file out of the File Gallery and off the storage total. Links that were already sent keep resolving on purpose, so a delivered campaign does not turn into a dead link; the file simply stops appearing in the gallery and in list_files. Pass file_id from list_files.
mailsoftly_post_api_v3_delete_formWRITEDelete a form. POST /api/v3/delete_form. Deletes a form, its embed and its stored submissions. Contacts it created remain. Refused while an automation starts from it.
mailsoftly_post_api_v3_delete_segmentWRITEDelete a segment. POST /api/v3/delete_segment. Deletes a custom segment. Contacts are untouched. System segments cannot be deleted.
mailsoftly_post_api_v3_delete_senderWRITERemove a sender address. POST /api/v3/delete_sender. Deletes a never-used sender, or archives one that campaigns already used (history kept, address reserved). Connected mailboxes are managed in Settings.
mailsoftly_post_api_v3_delete_signatureWRITEDelete an email signature. POST /api/v3/delete_signature. Deletes a signature belonging to a team member of the account.
mailsoftly_post_api_v3_delete_tagWRITEDelete a tag. POST /api/v3/delete_tag. Deletes a tag and removes it from every contact. Refused while an automation starts from it.
mailsoftly_post_api_v3_duplicate_campaignWRITECopy a campaign into a new draft. POST /api/v3/duplicate_campaign. Copies a campaign, including its subject, body, design, list, from address and file attachments, into a brand new draft. The copy starts clean: no send date, no statistics, no schedule and no A/B subject experiment, so it can be edited and sent on its own. Pass name to title the copy, otherwise it is called Copy_ plus the original name.
mailsoftly_post_api_v3_import_contactsWRITEImport contacts from a CSV. POST /api/v3/import_contacts. Imports contacts from a CSV passed as a string in the request body, into an existing list (contact_list_id) or a new one (contact_list_name). Columns are mapped automatically from the header row (email, first name, phone, zip, company and the usual spellings of those), or exactly, by passing `columns` with one entry per CSV column. The CSV must be UTF-8, 5 MB or smaller, and must map exactly one column to email. The import is queued and runs in the background: this returns the import id and the mapping it used, and progress is read back with get_import.
mailsoftly_post_api_v3_invite_team_memberWRITEInvite a teammate. POST /api/v3/invite_team_member. Sends an invitation email so a colleague can join this Mailsoftly workspace. Needs the email address and the role to give them, and optionally a first and last name. Only an admin or the workspace owner may invite, the role has to be one this account is allowed to hand out, and the plan seat limit applies: when every seat is in use the call answers 403 with a gate object carrying the message and the upgrade path. Returns the invited person with status 'invited'; they hold no seat until they accept.
mailsoftly_post_api_v3_publish_landing_pageWRITEPublish or unpublish a landing page. POST /api/v3/publish_landing_page. status published puts the page on the web (needs a verified account); unpublished takes it down.
mailsoftly_post_api_v3_record_consentWRITERecord a consent. POST /api/v3/record_consent. Writes a dated consent row onto a contact's audit trail, for consent you collected somewhere else: your own signup form, a checkbox in your product, a sign-up sheet at an event. CASL and GDPR ask who consented, when and how, and a contact imported from a spreadsheet arrives without any of that, so this is how the real date and source get onto the record. Pass consented_at to keep the date the consent was actually given; leave it off and the row is dated now. The row appears in get_consent_evidence and on the contact's activity timeline, and it leaves an existing opt-out standing.
mailsoftly_post_api_v3_refresh_segmentWRITERecalculate a segment. POST /api/v3/refresh_segment. Recalculates a segment's member count in the background.
mailsoftly_post_api_v3_remove_campaign_attachmentWRITERemove a file from a draft campaign. POST /api/v3/remove_campaign_attachment. Permanently removes one attached file from a campaign that is still a draft. Pass the attachment id from get_campaign or from add_campaign_attachment. The file is deleted, not archived, and the campaign's remaining attachments come back in the response.
mailsoftly_post_api_v3_remove_contact_from_contact_listWRITERemove a contact from a list. POST /api/v3/remove_contact_from_contact_list. Takes one contact off one list. The contact record is untouched.
mailsoftly_post_api_v3_remove_domainWRITEArchive a sending domain. POST /api/v3/remove_domain. Archives a domain. Refused while active senders still use it.
mailsoftly_post_api_v3_remove_global_email_unsubscriberWRITEResubscribe an email. POST /api/v3/remove_global_email_unsubscriber. Resubscribes a previously unsubscribed email address. The contact must already exist. This sets: Contact's `email_sending_status` to `subscribed` All email preferences back to opt-in
mailsoftly_post_api_v3_remove_global_sms_unsubscriberWRITEResubscribe to SMS. POST /api/v3/remove_global_sms_unsubscriber. Resubscribes a contact to SMS communications. The contact must already exist. Both `email` and `phone` are required. Phone must be in E.164 format.
mailsoftly_post_api_v3_remove_tags_from_contactWRITERemove tags from a contact. POST /api/v3/remove_tags_from_contact. Removes one or more tags from a contact by tag_ids or tag_names. The tags themselves stay defined.
mailsoftly_post_api_v3_restore_campaignWRITERestore a campaign from the trash. POST /api/v3/restore_campaign. Brings a trashed campaign back into the campaign list with its content, audience and results intact.
mailsoftly_post_api_v3_revoke_invitationWRITERevoke a pending invitation. POST /api/v3/revoke_invitation. Cancels an invitation that has not been accepted, so its link stops working. Takes the user_id from list_pending_invitations. Only an admin or the workspace owner may do it, and only while the invitation is still open: somebody who already accepted holds a seat and is removed on the Team screen instead. This cannot be undone; invite the person again to send a fresh link.
mailsoftly_post_api_v3_run_domain_health_checkWRITERun a domain health check. POST /api/v3/run_domain_health_check. Checks a domain the customer owns against public DNS and public blocklists, then saves the result on the account so list_domain_health_checks can show it. Takes the domain as a hostname such as example.com; a pasted URL is trimmed down to the hostname. Returns the SPF, DMARC and blocklist readings plus the detail lines behind each one. The lookups can take a few seconds; when they cannot finish the call answers 503 and nothing is saved.
mailsoftly_post_api_v3_schedule_emailWRITESchedule a campaign. POST /api/v3/schedule_email. Schedule a ready draft for a moment at least 15 minutes ahead (send_at as ISO 8601, time_zone optional, defaults to the account time zone). The sending gate applies exactly as for send_email; the first campaigns of every account pass a content review at send time. Campaigns that send from a connected Google or Microsoft mailbox cannot be scheduled at all: they answer `422` with `gate.reason: "oauth_mailbox_unsupported"`, and `POST /update_email` moves them onto a sending domain or the shared address. Responses carry a `sender` object with the lane, the from address and `authorized`.
mailsoftly_post_api_v3_send_emailWRITESend an email draft. POST /api/v3/send_email. NOTE: Mailsoftly answers a success status here even when it did NOT carry the request out, naming the state in a `gate` object; Agentic Fabriq raises that as an error with the reason rather than reporting a send that did not happen. Sends an existing email draft. The draft must be in a ready state, which `GET /email_status` reports. Important: This endpoint only works with draft IDs created via `POST /create_emails`. There is currently no endpoint for sending a one-off transactional email directly (without first creating a draft). This is a known product gap. The send is asynchronous. The email is queued for delivery and processed in the background. When `422 EmailDraft is not ready for sending yet` comes back, the background job that populates recipients/attachments has not finished.
mailsoftly_post_api_v3_send_sms_campaignWRITESubmit an SMS campaign for sending. POST /api/v3/send_sms_campaign. NOTE: Mailsoftly answers a success status here even when it did NOT carry the request out, naming the state in a `gate` object; Agentic Fabriq raises that as an error with the reason rather than reporting a send that did not happen. Checks SMS credits and submits the campaign for the review every SMS campaign passes before it goes out. Insufficient credits return a gate with the purchase path.
mailsoftly_post_api_v3_send_test_emailWRITESend a test copy of a campaign. POST /api/v3/send_test_email. NOTE: Mailsoftly answers a success status here even when it did NOT carry the request out, naming the state in a `gate` object; Agentic Fabriq raises that as an error with the reason rather than reporting a send that did not happen. Sends the campaign to 1 to 5 addresses as a test, exactly as the campaign page does: nothing is recorded against the campaign statistics and no contact list is touched. An optional note is shown as a banner above the body so reviewers know what to look at. The first test sends from a new account go into a short human review instead of going out; the response then carries in_review with a gate object explaining that.
mailsoftly_post_api_v3_start_ab_testWRITEStart an A/B subject test. POST /api/v3/start_ab_test. NOTE: Mailsoftly answers a success status here even when it did NOT carry the request out, naming the state in a `gate` object; Agentic Fabriq raises that as an error with the reason rather than reporting a send that did not happen. Starts an A/B subject-line test on a draft. A test slice of the audience (`test_percentage`: 10, 20 or 30) is split between subject A and subject B; after `wait_hours` (2, 4 or 24) the subject with more opens goes to everyone else. Requirements: a paid plan (otherwise a `gate` with `level: "plan"`), at least 20 deliverable recipients, and the same sending checks as `POST /send_email`. An account in send review parks the test until approval and says so in `gate`.
mailsoftly_post_api_v3_trash_campaignWRITEMove a campaign to the trash. POST /api/v3/trash_campaign. Reversible: the campaign leaves the list and can be restored with restore_campaign. Refused while it is sending.
mailsoftly_post_api_v3_trash_landing_pageWRITEMove a landing page to the trash. POST /api/v3/trash_landing_page. Unpublishes the page and moves it to the trash (reversible in the app).
mailsoftly_post_api_v3_trigger_automationWRITETrigger an automation for a contact. POST /api/v3/trigger_automation. Triggers an automation for a specific contact, starting the drip sequence.
mailsoftly_post_api_v3_unschedule_emailWRITECancel a scheduled send. POST /api/v3/unschedule_email. Cancels the scheduled send of a campaign; the draft stays and can be sent or rescheduled later.
mailsoftly_post_api_v3_update_automationWRITEUpdate an automation. POST /api/v3/update_automation. Edits an automation that is not active: `name`, `trigger`, `extra_triggers`, `entry_filter` or `steps`. Uses exactly the vocabulary of `POST /create_automation` (trigger table, step kinds, branching). `steps` replaces the whole step tree, so it carries the full list. An active automation is refused until `POST /update_automation_status` deactivates it.
mailsoftly_post_api_v3_update_automation_statusWRITEActivate or deactivate an automation. POST /api/v3/update_automation_status. Set status to active or inactive. Activating starts real sends, so it needs a verified account (gate level account otherwise) and every step and trigger field complete (422 lists what is missing). Deactivating has no such requirement.
mailsoftly_post_api_v3_update_brand_kitWRITEUpdate the brand kit. POST /api/v3/update_brand_kit. Sets brand fields by hand: logo_url, primary_color, secondary_color, accent_color, palette, site_title, site_description and social_links. Colors are six digit hex values such as #1A73E8 and URLs must be http or https; anything else answers 422 and nothing is written. The kit is created when the account has none, and every field set here is remembered as hand edited so a later refresh from the website leaves it alone. The answer is the same shape get_brand_kit returns.
mailsoftly_post_api_v3_update_campaign_sharingWRITEChange how a campaign is shared on the web. POST /api/v3/update_campaign_sharing. Controls the public side of a campaign: whether it has a web page at all (web_version on, off, or default to follow the account setting), whether it is listed in the account's public archive, and whether its public link is retired and replaced. Works on sent campaigns too, which is the main reason to use it: taking a delivered campaign off the web. Returns the same sharing object get_campaign reports.
mailsoftly_post_api_v3_update_contactWRITEUpdate an existing contact. POST /api/v3/update_contact. Updates an existing contact's fields. Only the fields present in the request body are updated. All other fields remain unchanged.
mailsoftly_post_api_v3_update_contact_listWRITERename a contact list. POST /api/v3/update_contact_list. Changes a contact list's name. Memberships, automations and campaigns that use the list are unaffected.
mailsoftly_post_api_v3_update_contact_subscriptionsWRITEChange what one contact is subscribed to. POST /api/v3/update_contact_subscriptions. Subscribes or unsubscribes one contact from email types, by id. Unsubscribing records a consent change the account made on the contact's behalf. Subscribing only lifts opt-outs the account itself made: an opt-out the recipient chose stays in place and is reported back with a note. Returns the full subscription state plus a per type list of what changed.
mailsoftly_post_api_v3_update_custom_blockWRITEUpdate a content block. POST /api/v3/update_custom_block. Changes the name, the HTML or the sharing of a saved block. Takes custom_block_id plus only the fields that change; anything left out keeps its current value. A block from another account answers 404.
mailsoftly_post_api_v3_update_emailWRITEUpdate a campaign draft. POST /api/v3/update_email. Edit an unsent draft in place: subject, body, name, reply_to, contact_list_id, or restart it from a saved template. Body rules are the same as create_emails (body_format `content` or `html`). Sent campaigns cannot be edited. The from address is editable the same way create_emails sets it: exactly one of `sender_id` or `email_sender_id`, both taken from `GET /list_senders`. That is the way off a mailbox this credential cannot send from, and off a domain that has not finished DNS authentication.
mailsoftly_post_api_v3_update_email_templateWRITEUpdate an email template. POST /api/v3/update_email_template. Changes a template's name, subject or html.
mailsoftly_post_api_v3_update_formWRITEUpdate a form. POST /api/v3/update_form. Changes a form's name, fields or linked list.
mailsoftly_post_api_v3_update_landing_pageWRITEUpdate a landing page. POST /api/v3/update_landing_page. Changes a page's name, html, meta title, meta description or linked list.
mailsoftly_post_api_v3_update_segmentWRITEUpdate a segment. POST /api/v3/update_segment. Changes a custom segment's name, description or conditions (conditions replaces the whole rule set). System segments cannot be edited.
mailsoftly_post_api_v3_update_signatureWRITEUpdate an email signature. POST /api/v3/update_signature. Changes a signature's name, html or active flag.
mailsoftly_post_api_v3_update_sms_campaignWRITEUpdate an SMS campaign. POST /api/v3/update_sms_campaign. Changes a draft SMS campaign's name, message or list.
mailsoftly_post_api_v3_update_tagWRITERename or recolor a tag. POST /api/v3/update_tag. Changes a tag's name or color; every contact carrying it follows.
mailsoftly_post_api_v3_update_team_member_roleWRITEChange a teammate's role. POST /api/v3/update_team_member_role. Changes the role of somebody who already belongs to this workspace. Takes user_id (from get_team_members) and the new role, which has to be one this account may assign. The workspace owner cannot be re-roled here, because that seat only moves through the ownership transfer in the app, and nobody may change their own role. Returns the teammate with their new role.
mailsoftly_post_api_v3_upload_fileWRITEUpload a file to the gallery. POST /api/v3/upload_file. Uploads one file to the File Gallery from base64 content and returns its public link, so a campaign can point at it. Send filename, content_base64 and content_type; the extension and the content type must both be on the accepted list, and the decoded size must stay under 25 MB. Because the bytes travel inside the request, this suits small files such as a price list or a one page PDF rather than long video.
mailsoftly_post_api_v3_upload_imageWRITEUpload an image. POST /api/v3/upload_image. Adds a PNG, JPG or GIF to the account image library from base64 content and returns a public URL ready to use as an image src. PNG and JPG are resized and recompressed for email before they are stored, so a large export is welcome up to 10 MB; a GIF is stored as sent and must stay under 2 MB. Because the bytes travel inside the request, this suits small images rather than very large ones.
mailsoftly_post_api_v3_verify_domainWRITECheck a domain's DNS records. POST /api/v3/verify_domain. Asks Mailsoftly to check the DNS records of a domain. Verification can take time after DNS changes; list_domains shows the result later.
Often connected alongside
Put Mailsoftly behind one governed endpoint.
Same permissions, same audit trail, whatever else you connect next.