Inbound API
Received mail with verdicts and attachments, routing rules and forwarding.
10 operations. Guide: Receive email on your domain. Requests and responses are JSON with snake_case fields; authenticate with Authorization: Bearer <api key>. The examples assume a client built as in SDKs and the command line.
List inbound routing rules
GET /v1/inbound/routes
Response
200 Success: object.
| Field | Type | Required | Description |
|---|---|---|---|
object | "list" | yes | |
data | array of object | yes | |
data[]. | string | yes | A UUID. |
data[]. | "route" | yes | |
data[]. | string | yes | A UUID. |
data[]. | string | yes | A UUID. |
data[]. | object | yes | |
data[]. | "address" | yes | |
data[]. | string | yes | 1 to 64 characters. |
data[]. | "plus" | yes | |
data[]. | string | yes | 1 to 64 characters. |
data[]. | "catchall" | yes | |
data[]. | object | yes | |
data[]. | "webhook" | yes | |
data[]. | string | yes | A UUID. |
data[]. | "forward" | yes | |
data[]. | array of string | yes | At most 5 items. |
data[]. | "store" | yes | |
data[]. | one of "flag", "drop", "quarantine" | yes | |
data[]. | boolean | yes | |
data[]. | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
has_more | boolean | yes |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl https://api.minket.com/v1/inbound/routes \
-H "Authorization: Bearer $MINKET_API_KEY"const result = await minket.inbound.routes.list();minket api listInboundRoutesfrom minket.api.inbound import list_inbound_routes
result = list_inbound_routes.sync(client=client)res, err := client.ListInboundRoutesWithResponse(ctx)Create an inbound routing rule
POST /v1/inbound/routes
An exact address, a plus-address base (support matches support+anything@) or the catch-all, to a webhook endpoint of the project, confirmed forwarding addresses, or storage only. Mail no rule matches goes to every endpoint subscribed to email.received.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
domain_id | string | yes | A UUID. |
match | object | yes | |
match (shape 1). | "address" | yes | |
match (shape 1). | string | yes | 1 to 64 characters. |
match (shape 2). | "plus" | yes | |
match (shape 2). | string | yes | 1 to 64 characters. |
match (shape 3). | "catchall" | yes | |
action | object | yes | |
action (shape 1). | "webhook" | yes | |
action (shape 1). | string | yes | A UUID. |
action (shape 2). | "forward" | yes | |
action (shape 2). | array of string | yes | At most 5 items. |
action (shape 3). | "store" | yes | |
spam_handling | one of "flag", "drop", "quarantine" | no | Default "flag". |
enabled | boolean | no | Default true. |
Response
201 Created: object.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | A UUID. |
object | "route" | yes | |
project_id | string | yes | A UUID. |
domain_id | string | yes | A UUID. |
match | object | yes | |
match (shape 1). | "address" | yes | |
match (shape 1). | string | yes | 1 to 64 characters. |
match (shape 2). | "plus" | yes | |
match (shape 2). | string | yes | 1 to 64 characters. |
match (shape 3). | "catchall" | yes | |
action | object | yes | |
action (shape 1). | "webhook" | yes | |
action (shape 1). | string | yes | A UUID. |
action (shape 2). | "forward" | yes | |
action (shape 2). | array of string | yes | At most 5 items. |
action (shape 3). | "store" | yes | |
spam_handling | one of "flag", "drop", "quarantine" | yes | |
enabled | boolean | yes | |
created_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl -X POST https://api.minket.com/v1/inbound/routes \
-H "Authorization: Bearer $MINKET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"domain_id":"019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b","match":{"type":"address","local_part":"support"},"action":{"type":"store"}}'const result = await minket.inbound.routes.create({
domain_id: "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b",
match: {
type: "address",
local_part: "support"
},
action: {
type: "store"
}
});minket api createInboundRoute --body '{"domain_id":"019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b","match":{"type":"address","local_part":"support"},"action":{"type":"store"}}'from minket.api.inbound import create_inbound_route
from minket.models import CreateInboundRouteBody
result = create_inbound_route.sync(client=client, body=CreateInboundRouteBody.from_dict({"domain_id":"019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b","match":{"type":"address","local_part":"support"},"action":{"type":"store"}}))var body minket.CreateInboundRouteJSONRequestBody
res, err := client.CreateInboundRouteWithResponse(ctx, body)Update an inbound routing rule
PATCH /v1/inbound/routes/{id}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | A UUID. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
match | object | no | |
match (shape 1). | "address" | yes | |
match (shape 1). | string | yes | 1 to 64 characters. |
match (shape 2). | "plus" | yes | |
match (shape 2). | string | yes | 1 to 64 characters. |
match (shape 3). | "catchall" | yes | |
action | object | no | |
action (shape 1). | "webhook" | yes | |
action (shape 1). | string | yes | A UUID. |
action (shape 2). | "forward" | yes | |
action (shape 2). | array of string | yes | At most 5 items. |
action (shape 3). | "store" | yes | |
spam_handling | one of "flag", "drop", "quarantine" | no | |
enabled | boolean | no |
Response
200 Success: object.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | A UUID. |
object | "route" | yes | |
project_id | string | yes | A UUID. |
domain_id | string | yes | A UUID. |
match | object | yes | |
match (shape 1). | "address" | yes | |
match (shape 1). | string | yes | 1 to 64 characters. |
match (shape 2). | "plus" | yes | |
match (shape 2). | string | yes | 1 to 64 characters. |
match (shape 3). | "catchall" | yes | |
action | object | yes | |
action (shape 1). | "webhook" | yes | |
action (shape 1). | string | yes | A UUID. |
action (shape 2). | "forward" | yes | |
action (shape 2). | array of string | yes | At most 5 items. |
action (shape 3). | "store" | yes | |
spam_handling | one of "flag", "drop", "quarantine" | yes | |
enabled | boolean | yes | |
created_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl -X PATCH https://api.minket.com/v1/inbound/routes/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b \
-H "Authorization: Bearer $MINKET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"enabled":false}'const result = await minket.inbound.routes.update("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", {
enabled: false
});minket api updateInboundRoute 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b --body '{"enabled":false}'from minket.api.inbound import update_inbound_route
from minket.models import UpdateInboundRouteBody
result = update_inbound_route.sync("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", client=client, body=UpdateInboundRouteBody.from_dict({"enabled":false}))var body minket.UpdateInboundRouteJSONRequestBody
res, err := client.UpdateInboundRouteWithResponse(ctx, "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", body)Delete an inbound routing rule
DELETE /v1/inbound/routes/{id}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | A UUID. |
Response
200 Success: object.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | A UUID. |
object | "route" | yes |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl -X DELETE https://api.minket.com/v1/inbound/routes/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b \
-H "Authorization: Bearer $MINKET_API_KEY"const result = await minket.inbound.routes.delete("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b");minket api deleteInboundRoute 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5bfrom minket.api.inbound import delete_inbound_route
result = delete_inbound_route.sync("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", client=client)res, err := client.DeleteInboundRouteWithResponse(ctx, "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b")List received messages
GET /v1/inbound
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
limit | query | integer | no | Default 20. |
after | query | string | no | A UUID. |
before | query | string | no | A UUID. |
domain_id | query | string | no | A UUID. |
from | query | string | no | |
to | query | string | no | |
status | query | one of "received", "routed", "forwarded", "dropped", "quarantined" | no | |
spam | query | boolean | no |
Response
200 Success: object.
| Field | Type | Required | Description |
|---|---|---|---|
object | "list" | yes | |
data | array of object | yes | |
data[]. | string | yes | A UUID. |
data[]. | "inbound" | yes | |
data[]. | string | yes | A UUID. |
data[]. | string or null | yes | A UUID. |
data[]. | string | yes | |
data[]. | array of string | yes | |
data[]. | array of string | yes | |
data[]. | array of string | yes | |
data[]. | array of string | yes | |
data[]. | array of string | yes | |
data[]. | string | yes | |
data[]. | string | yes | |
data[]. | string or null | yes | |
data[]. | array of object | yes | |
data[]. | string | yes | A UUID. |
data[]. | "attachment" | yes | |
data[]. | string or null | yes | |
data[]. | string | yes | |
data[]. | integer | yes | |
data[]. | string or null | yes | |
data[]. | one of "attachment", "inline" | yes | |
data[]. | string | no | |
data[]. | string (date-time) | no | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
data[]. | object | yes | |
data[]. | one of "pass", "fail", "softfail", "neutral", "none", "temperror", "permerror" | yes | |
data[]. | one of "pass", "fail", "none", "temperror", "permerror" | yes | |
data[]. | one of "pass", "fail", "none", "temperror", "permerror" | yes | |
data[]. | one of "pass", "fail", "unknown" | yes | |
data[]. | one of "pass", "fail", "unknown" | yes | |
data[]. | boolean | yes | |
data[]. | boolean | yes | |
data[]. | integer | yes | |
data[]. | one of "received", "routed", "forwarded", "dropped", "quarantined" | yes | |
data[]. | array of object | yes | |
data[]. | one of "webhook", "forward", "store" | yes | |
data[]. | string | yes | |
data[]. | one of "pending", "done", "failed", "skipped" | yes | |
data[]. | string | no | |
data[]. | string | no | A UUID. |
data[]. | array of one of "message_too_large", "malformed", "headers_too_large", "too_many_parts", "too_deep", "nested_messages_kept", "attachments_truncated", "addresses_truncated", "virus", "spam", "forward_loop", "dmarc_refused" | yes | |
data[]. | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
has_more | boolean | yes |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl https://api.minket.com/v1/inbound \
-H "Authorization: Bearer $MINKET_API_KEY"const result = await minket.inbound.list();minket api listInboundfrom minket.api.inbound import list_inbound
result = list_inbound.sync(client=client)res, err := client.ListInboundWithResponse(ctx, &minket.ListInboundParams{})Get a received message with its parsed content and verdicts
GET /v1/inbound/{id}
html carries inline images as data URIs unless html_format=cid. raw.download_url downloads the message as received until raw.expires_at (an hour at most).
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | A UUID. |
html_format | query | one of "data_uri", "cid" | no | Default "data_uri". |
Response
200 Success: Inbound.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | A UUID. |
object | "inbound" | yes | |
project_id | string | yes | A UUID. |
domain_id | string or null | yes | A UUID. |
from | string | yes | |
to | array of string | yes | |
cc | array of string | yes | |
bcc | array of string | yes | |
reply_to | array of string | yes | |
received_for | array of string | yes | |
subject | string | yes | |
message_id | string | yes | |
in_reply_to | string or null | yes | |
headers | map of string | no | |
html | string or null | no | |
text | string or null | no | |
attachments | array of object | yes | |
attachments[]. | string | yes | A UUID. |
attachments[]. | "attachment" | yes | |
attachments[]. | string or null | yes | |
attachments[]. | string | yes | |
attachments[]. | integer | yes | |
attachments[]. | string or null | yes | |
attachments[]. | one of "attachment", "inline" | yes | |
attachments[]. | string | no | |
attachments[]. | string (date-time) | no | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
verdicts | object | yes | |
verdicts. | one of "pass", "fail", "softfail", "neutral", "none", "temperror", "permerror" | yes | |
verdicts. | one of "pass", "fail", "none", "temperror", "permerror" | yes | |
verdicts. | one of "pass", "fail", "none", "temperror", "permerror" | yes | |
verdicts. | one of "pass", "fail", "unknown" | yes | |
verdicts. | one of "pass", "fail", "unknown" | yes | |
spam | boolean | yes | |
virus | boolean | yes | |
size | integer | yes | |
status | one of "received", "routed", "forwarded", "dropped", "quarantined" | yes | |
routing | array of object | yes | |
routing[]. | one of "webhook", "forward", "store" | yes | |
routing[]. | string | yes | |
routing[]. | one of "pending", "done", "failed", "skipped" | yes | |
routing[]. | string | no | |
routing[]. | string | no | A UUID. |
issues | array of one of "message_too_large", "malformed", "headers_too_large", "too_many_parts", "too_deep", "nested_messages_kept", "attachments_truncated", "addresses_truncated", "virus", "spam", "forward_loop", "dmarc_refused" | yes | |
raw | object or null | no | |
raw. | string | yes | |
raw. | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
created_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl https://api.minket.com/v1/inbound/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b \
-H "Authorization: Bearer $MINKET_API_KEY"const result = await minket.inbound.get("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b");minket api getInbound 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5bfrom minket.api.inbound import get_inbound
result = get_inbound.sync("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", client=client)res, err := client.GetInboundWithResponse(ctx, "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", &minket.GetInboundParams{})List a received message's attachments with download URLs
GET /v1/inbound/{id}/attachments
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | A UUID. |
Response
200 Success: object.
| Field | Type | Required | Description |
|---|---|---|---|
object | "list" | yes | |
data | array of object | yes | |
data[]. | string | yes | A UUID. |
data[]. | "attachment" | yes | |
data[]. | string or null | yes | |
data[]. | string | yes | |
data[]. | integer | yes | |
data[]. | string or null | yes | |
data[]. | one of "attachment", "inline" | yes | |
data[]. | string | yes | |
data[]. | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
has_more | boolean | yes |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl https://api.minket.com/v1/inbound/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b/attachments \
-H "Authorization: Bearer $MINKET_API_KEY"const result = await minket.inbound.attachments("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b");minket api listInboundAttachments 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5bfrom minket.api.inbound import list_inbound_attachments
result = list_inbound_attachments.sync("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", client=client)res, err := client.ListInboundAttachmentsWithResponse(ctx, "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b")Get one attachment with a download URL
GET /v1/inbound/{id}/attachments/{attachmentId}
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | A UUID. |
attachmentId | path | string | yes | A UUID. |
Response
200 Success: object.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | A UUID. |
object | "attachment" | yes | |
filename | string or null | yes | |
content_type | string | yes | |
size | integer | yes | |
content_id | string or null | yes | |
disposition | one of "attachment", "inline" | yes | |
download_url | string | yes | |
expires_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl https://api.minket.com/v1/inbound/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b/attachments/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b \
-H "Authorization: Bearer $MINKET_API_KEY"const result = await minket.inbound.attachment("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b");minket api getInboundAttachment 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5bfrom minket.api.inbound import get_inbound_attachment
result = get_inbound_attachment.sync("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", client=client)res, err := client.GetInboundAttachmentWithResponse(ctx, "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b")Forward a received message
POST /v1/inbound/{id}/forward
Only mail SES scanned as spam pass (and not a virus), only to addresses confirmed in the console, and never past three platform forwards. From becomes the receiving address and Reply-To the sender. Send Idempotency-Key to make retries safe.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | A UUID. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
to | array of string | yes | At most 5 items. |
from | string | no | An email address, optionally with a display name as Name <address>. 3 to 998 characters. |
passthrough | boolean | no | Default true. |
text | string | no | At most 1048576 characters. |
html | string | no | At most 1048576 characters. |
Response
200 Success: object.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | yes | A UUID. |
object | "email" | yes | |
status | one of "queued", "scheduled", "sent", "delivered", "delivery_delayed", "opened", "clicked", "bounced", "complained", "failed", "canceled", "suppressed" | yes | |
scheduled_at | string (date-time) or null | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
idempotent_replay | boolean | yes |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.
Examples
curl -X POST https://api.minket.com/v1/inbound/019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b/forward \
-H "Authorization: Bearer $MINKET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"to":["jane@example.com"]}'const result = await minket.inbound.forward("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", {
to: [
"jane@example.com"
]
});minket api forwardInbound 019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b --body '{"to":["jane@example.com"]}'from minket.api.inbound import forward_inbound
from minket.models import ForwardInboundBody
result = forward_inbound.sync("019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", client=client, body=ForwardInboundBody.from_dict({"to":["jane@example.com"]}))var body minket.ForwardInboundJSONRequestBody
res, err := client.ForwardInboundWithResponse(ctx, "019a2b3c-4d5e-7f60-8a9b-0c1d2e3f4a5b", body)Share a received message
POST /v1/inbound/{id}/share
A link on links. that shows the email's headers and content to whoever has it, until expires_at (expires_in: up to and by default 48 hours). The content opens in a sandboxed frame: no scripts or forms. The link cannot be revoked; it only expires.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
id | path | string | yes | A UUID. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
expires_in | string | no | At most 40 characters. |
Response
201 Created: object.
| Field | Type | Required | Description |
|---|---|---|---|
object | one of "email", "inbound" | yes | |
id | string | yes | A UUID. |
url | string | yes | |
expires_at | string (date-time) | yes | An ISO 8601 timestamp with timezone, for example 2026-10-24T18:00:00.000Z. |
Errors: 400, 401, 403, 404, 409, 422, 429, 500, with the error body.