UniOne
MESSAGING · MESSAGING
Transactional email sends, templates, suppressions, and sending domains on their key.
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.
unione_post_domain_delete_jsonWRITEDelete a sending domain. Permanently removes one sending domain from the account, after which no address at that domain can send until it is added and verified again. (POST https://api.unione.io/en/transactional/api/v1/domain/delete.json)
unione_post_domain_get_dns_records_jsonWRITEAdd a sending domain and return its DNS records. Returns the SPF, DKIM, ownership-verification, DMARC and link-tracking records to publish for a sending domain -- and ADDS the domain to the account if it is not there yet, which is why this is a write rather than a read. UniOne refuses a public free-mail domain (code 1103) and a domain its resolver cannot see (code 1101); both measured 2026-09-16. (POST https://api.unione.io/en/transactional/api/v1/domain/get-dns-records.json)
unione_post_domain_list_jsonREADList sending domains. Returns the account's sending domains with their SPF, DKIM, verification and DMARC state, optionally filtered to one domain and paginated with limit and offset. An account with none answers 200 and an empty list. (POST https://api.unione.io/en/transactional/api/v1/domain/list.json)
unione_post_domain_validate_dkim_jsonWRITEValidate a sending domain's DKIM record. Asks UniOne to re-check the published DKIM record for a domain and record the result. Answers 400 code 1401 for a domain the resolver cannot see. (POST https://api.unione.io/en/transactional/api/v1/domain/validate-dkim.json)
unione_post_domain_validate_verification_record_jsonWRITEValidate a sending domain's ownership record. Asks UniOne to re-check the ownership TXT record for a domain and record the result, which is what moves the domain towards 'verified'. Answers 400 code 1201 for a domain the resolver cannot see. (POST https://api.unione.io/en/transactional/api/v1/domain/validate-verification-record.json)
unione_post_email_send_jsonWRITESend an email. Queues one message for up to 500 recipients in a single call, from an inline body (HTML, plaintext and/or AMP) or a stored template, with per-recipient substitutions, attachments, tags, metadata and scheduling. Returns a job_id that identifies the send in statistics and event dumps. REQUIRES A CONFIRMED SENDING DOMAIN: the from_email's domain must be added to the account and verified (SPF, DKIM, ownership) first, or UniOne answers HTTP 400 naming the from_email field -- code 1574 'use address from a confirmed domain' for email/send, code 1003 'You don't have checked domain' for email/subscribe (both measured 2026-09-16 on an account with zero domains). Add the domain with domain/get-dns-records, publish the records UniOne returns, then domain/validate-verification-record and domain/validate-dkim. (POST https://api.unione.io/en/transactional/api/v1/email/send.json)
unione_post_email_subscribe_jsonWRITESend a subscription confirmation request. Sends a double opt-in confirmation email to one address, using UniOne's own confirmation template or a stored one, so the recipient's consent is recorded before any campaign reaches them. REQUIRES A CONFIRMED SENDING DOMAIN: the from_email's domain must be added to the account and verified (SPF, DKIM, ownership) first, or UniOne answers HTTP 400 naming the from_email field -- code 1574 'use address from a confirmed domain' for email/send, code 1003 'You don't have checked domain' for email/subscribe (both measured 2026-09-16 on an account with zero domains). Add the domain with domain/get-dns-records, publish the records UniOne returns, then domain/validate-verification-record and domain/validate-dkim. (POST https://api.unione.io/en/transactional/api/v1/email/subscribe.json)
unione_post_email_validation_single_jsonWRITEValidate one email address. Checks a single address for syntax, MX presence, disposable and role-account patterns and likely typos, returning a result (valid/invalid/unknown), a validity score and a did_you_mean suggestion. CONSUMES the account's email-validation quota (system/info reports validations_included and validations_used). (POST https://api.unione.io/en/transactional/api/v1/email-validation/single.json)
unione_post_event_dump_create_jsonWRITECreate an event dump. Starts an asynchronous export of delivery events for a time window, optionally filtered (by job, campaign, recipient, sender, status or tag) and aggregated. Returns a dump_id; poll event-dump/get for the file URLs. The format is 'csv' or 'csv_gzip' -- 'json' is refused with code 3304 (measured 2026-09-16). Events are retained for up to 32 days, depending on tariff. (POST https://api.unione.io/en/transactional/api/v1/event-dump/create.json)
unione_post_event_dump_delete_jsonWRITEDelete an event dump. Permanently removes one export and its generated files by dump_id. (POST https://api.unione.io/en/transactional/api/v1/event-dump/delete.json)
unione_post_event_dump_get_jsonREADGet an event dump. Returns one export's status (in_process, ready or failed) and, once ready, the temporary URLs of its files. The URLs are time-limited. (POST https://api.unione.io/en/transactional/api/v1/event-dump/get.json)
unione_post_event_dump_list_jsonREADList event dumps. Returns every export currently held for the account, with each one's status and files. (POST https://api.unione.io/en/transactional/api/v1/event-dump/list.json)
unione_post_project_create_jsonWRITECreate a project. Creates a UniOne project -- the per-tenant isolation unit, with its own API key, domains, templates, suppression lists and statistics -- and returns its id and key. ACCOUNT GATE, not a defect: UniOne disables Projects by default -- 'By default, access to this page and methods is disabled for security reasons. To enable projects functionality, please contact our support team.' -- and every project/* method answers HTTP 403 {"code":403,"message":"Access Denied."} until support enables it (measured 2026-09-16). This is an account provisioning gate and applies to any UniOne credential, so ask UniOne support to enable Projects rather than reconnecting. (POST https://api.unione.io/en/transactional/api/v1/project/create.json)
unione_post_project_delete_jsonWRITEDelete a project. Permanently removes one project, named by project_id or project_api_key, along with the isolation its key provided. ACCOUNT GATE, not a defect: UniOne disables Projects by default -- 'By default, access to this page and methods is disabled for security reasons. To enable projects functionality, please contact our support team.' -- and every project/* method answers HTTP 403 {"code":403,"message":"Access Denied."} until support enables it (measured 2026-09-16). This is an account provisioning gate and applies to any UniOne credential, so ask UniOne support to enable Projects rather than reconnecting. (POST https://api.unione.io/en/transactional/api/v1/project/delete.json)
unione_post_project_list_jsonREADList projects. Returns the account's projects with their ids, names and API keys, or one project when project_id or project_api_key is given. ACCOUNT GATE, not a defect: UniOne disables Projects by default -- 'By default, access to this page and methods is disabled for security reasons. To enable projects functionality, please contact our support team.' -- and every project/* method answers HTTP 403 {"code":403,"message":"Access Denied."} until support enables it (measured 2026-09-16). This is an account provisioning gate and applies to any UniOne credential, so ask UniOne support to enable Projects rather than reconnecting. (POST https://api.unione.io/en/transactional/api/v1/project/list.json)
unione_post_project_update_jsonWRITEUpdate a project. Renames a project or changes its settings, naming it by project_id or by its project_api_key. ACCOUNT GATE, not a defect: UniOne disables Projects by default -- 'By default, access to this page and methods is disabled for security reasons. To enable projects functionality, please contact our support team.' -- and every project/* method answers HTTP 403 {"code":403,"message":"Access Denied."} until support enables it (measured 2026-09-16). This is an account provisioning gate and applies to any UniOne credential, so ask UniOne support to enable Projects rather than reconnecting. (POST https://api.unione.io/en/transactional/api/v1/project/update.json)
unione_post_suppression_delete_jsonWRITEDelete a suppression. Removes the suppressions this account created for one address. UniOne's own bounce-derived suppressions are marked is_deletable false and are not removed by this call. (POST https://api.unione.io/en/transactional/api/v1/suppression/delete.json)
unione_post_suppression_get_jsonREADGet an address's suppressions. Returns every suppression recorded for one address, each with its cause, source (user or UniOne's own bounce handling) and whether it is deletable. An address with none answers 200 and an empty list. (POST https://api.unione.io/en/transactional/api/v1/suppression/get.json)
unione_post_suppression_list_jsonREADList suppressions. Returns the account's suppressions, filterable by cause, source and start_time, and paginated with a cursor rather than an offset. (POST https://api.unione.io/en/transactional/api/v1/suppression/list.json)
unione_post_suppression_set_jsonWRITEAdd a suppression. Suppresses one address for a stated cause (unsubscribed, temporary or permanently unavailable, complained), so UniOne stops attempting delivery to it. Distinct from the unsubscribe list: a suppression created here can be removed again with suppression/delete. (POST https://api.unione.io/en/transactional/api/v1/suppression/set.json)
unione_post_system_info_jsonREADGet account information. Returns the account's user id, email and current billing period, with the emails and validations included and used in it -- the cheapest way to see what quota a connection still has. (POST https://api.unione.io/en/transactional/api/v1/system/info.json)
unione_post_system_ping_jsonREADCheck the API key. UniOne's own credential check: 'This method checks API key validity and returns user ID'. Answers 200 {"status":"success","user_id":N} for a working key and 401 code 114 'user not found' for a bad one, or for a good key sent to the wrong regional host. This is the endpoint the paste-time probe uses. (POST https://api.unione.io/en/transactional/api/v1/system/ping.json)
unione_post_tag_delete_jsonWRITEDelete a tag. Permanently removes one tag by its numeric id. Answers 400 code 3703 naming the id when no such tag exists (measured 2026-09-16). (POST https://api.unione.io/en/transactional/api/v1/tag/delete.json)
unione_post_tag_list_jsonREADList tags. Returns the tags the account has used on sends, with their numeric ids -- which is where the tag_id that tag/delete takes comes from. (POST https://api.unione.io/en/transactional/api/v1/tag/list.json)
unione_post_template_delete_jsonWRITEDelete a template. Permanently removes one stored template by id. Any send that names the deleted template id afterwards fails. (POST https://api.unione.io/en/transactional/api/v1/template/delete.json)
unione_post_template_get_jsonREADGet a template. Returns one stored template by id, including its body parts, sender, attachments, global substitutions and creation time. (POST https://api.unione.io/en/transactional/api/v1/template/get.json)
unione_post_template_list_jsonREADList templates. Returns the account's stored templates, newest first, with their full bodies. Paginated with limit (1-100) and offset. (POST https://api.unione.io/en/transactional/api/v1/template/list.json)
unione_post_template_set_jsonWRITECreate or update a template. Stores a reusable message template -- subject, HTML/plaintext/AMP body, sender, attachments and global substitutions -- and returns its id. Passing an existing template id UPDATES that template in place rather than creating a second one, so omit the id to create. (POST https://api.unione.io/en/transactional/api/v1/template/set.json)
unione_post_unsubscribed_check_jsonREADCheck whether an address is unsubscribed. Answers is_unsubscribed for one address without changing anything. Use this before a send rather than inferring the answer from a failure. (POST https://api.unione.io/en/transactional/api/v1/unsubscribed/check.json)
unione_post_unsubscribed_list_jsonREADList unsubscribed addresses. Returns the account's unsubscribe list with the time each address was unsubscribed, optionally from a date_from cutoff. (POST https://api.unione.io/en/transactional/api/v1/unsubscribed/list.json)
unione_post_unsubscribed_set_jsonWRITEUnsubscribe an address. Adds one address to the account's unsubscribe list, after which UniOne refuses to send to it. IRREVERSIBLE THROUGH THIS API: UniOne's Web API publishes no method that removes an address from the unsubscribe list (only set, check and list exist), so an entry added here can be undone only from the UniOne dashboard, if at all. (POST https://api.unione.io/en/transactional/api/v1/unsubscribed/set.json)
unione_post_webhook_delete_jsonWRITEDelete a webhook. Permanently removes one registered webhook, named by its url. UniOne stops posting events to it immediately. (POST https://api.unione.io/en/transactional/api/v1/webhook/delete.json)
unione_post_webhook_get_jsonREADGet a webhook. Returns one registered webhook by its url, with its event selection, delivery format, parallelism and status. (POST https://api.unione.io/en/transactional/api/v1/webhook/get.json)
unione_post_webhook_list_jsonREADList webhooks. Returns every webhook registered on the account, paginated with limit and offset. (POST https://api.unione.io/en/transactional/api/v1/webhook/list.json)
unione_post_webhook_set_jsonWRITECreate or update a webhook. Registers the URL UniOne posts delivery and status events to, and which events it sends (email_status, unsubscribed, spam, and the per-status selections beneath them). The URL is the webhook's IDENTITY: calling this again with the same url updates that webhook rather than adding a second one. (POST https://api.unione.io/en/transactional/api/v1/webhook/set.json)
Often connected alongside
Put UniOne behind one governed endpoint.
Same permissions, same audit trail, whatever else you connect next.