Mailactor
Reliability

Delivery status

Know whether your email was accepted, delivered, or needs attention.

Every outbound send returns a submission ID. Read that submission with delivery:read:

curl --fail-with-body --silent --show-error \
  "$MAILACTOR_API_URL/v1/submissions/$SUBMISSION_ID" \
  -H "x-api-key: $MAILACTOR_API_KEY"

Interpret the result

StatusMeaning / next step
pendingStored; delivery work has not finished. Continue polling.
queuedAccepted into the delivery queue. Continue polling.
deferredTemporary delivery problem. Continue polling; do not send a duplicate.
deliveredThe recipient mail server accepted the message.
partially_deliveredRecipients have mixed outcomes. Inspect every recipient.
bouncedPermanent recipient/server rejection. Inspect the response.
expiredDelivery could not be confirmed before the delivery window ended.
unknownThe transport outcome is ambiguous. Reconcile before deciding to resend.
failedThe operation failed; inspect failureCode and response.

Inspect the recipients array even when the aggregate status appears final. A mixed submission can contain recipients still in a nonterminal state. Wait until every recipient has a terminal outcome, or stop at your deadline and report the remaining uncertainty. Later transport evidence can refine an expired or unknown result.

delivered is server acceptance, not proof of inbox placement, opening, or reading. Mailactor does not provide read receipts here.

HTTP 200 example

Response: getSubmission 200
{
  "id": "00000000-0000-4000-8000-000000000001",
  "from": {
    "email": "research-agent@inbox.mailactor.com",
    "name": "Research Agent"
  },
  "recipients": [
    {
      "email": "you@example.com",
      "status": "delivered",
      "response": "250 2.0.0 Message accepted",
      "updatedAt": "2026-09-08T12:01:00.000Z"
    }
  ],
  "subject": "Your research update",
  "metadata": {
    "taskId": "research-42"
  },
  "status": "delivered",
  "queueId": "mailactor-example-queue",
  "response": "250 2.0.0 Message accepted",
  "failureCode": null,
  "createdAt": "2026-09-08T12:00:00.000Z",
  "updatedAt": "2026-09-08T12:01:00.000Z"
}

Mixed recipients

For partially_delivered, inspect recipients rather than retrying the entire send:

Recipient stateAction
pending, queued, deferredContinue polling the same submission.
deliveredReport server acceptance for this recipient. Do not send it again.
bouncedReport permanent rejection with its response.
expired, unknownRetain the submission ID and report delivery as unconfirmed; later evidence may refine it.

An aggregate failed is a failed operation; retain failureCode and response. At your deadline, return a per-recipient result including any unresolved states. Any new send after failure is an explicit application decision, not an automatic retry with a fresh key.

Reference-client stopping rule

The optional runtime reference client labels partially_delivered as an aggregate terminal status. Its wait helpers can therefore return while an individual recipient is still deferred. That label does not mean every recipient finished. Inspect the returned recipients; for this guide's per-recipient completion rule, continue GET /v1/submissions/{submissionId} within your deadline whenever any recipient is pending, queued, or deferred.

GET /v1/submissions/{submissionId}/events returns {events: [...]} and has no cursor pagination. Do not pass limit or cursor or expect nextCursor on that operation.

Poll responsibly

Wait 1 second before the first request, then 2, 4, and at most 5 seconds between checks. Honor a longer Retry-After when supplied. Choose a deadline; retain the submission ID when it expires. Do not turn a deferred or unknown outcome into a success message.

GET /v1/submissions/{submissionId}/events provides delivery events. GET /v1/metrics/delivery exposes your organization's delivery metrics. Neither requires access to another tenant's data.

Why a send may be blocked

Sending requires an active organization, an authorized sender domain, sufficient key permissions, and available traffic quota. A recipient may also be suppressed after a hard bounce, complaint, or manual suppression.

An organization-wide managed starter allowance cannot be reset by creating a new inbox. Inspect limits and the error's recovery fields before retrying.

On this page