Download OpenAPI specification:
Canonical HTTP contract for MailHulk /v1 resources. Success responses use {data} for single resources, {data,meta,links} for collections, and 204 with an empty body for deletes. Errors return {code,message,details,request_id}. Cross-tenant, cross-project, and cross-environment access returns 404. A device-session principal must select its project with the X-MailHulk-Project header on every route that documents it: omitting it returns 400 project_required, and naming a project the user is not a member of returns 404 not_found. The user-plane routes — /v1/me, /v1/projects, /v1/devices — bind no project and take no such header; /v1/projects is the call that tells a client which value to send. Collections are cursor-paginated newest-first by ULID: pass links.next back as cursor until it is null. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset; a 429 adds Retry-After.
| cursor | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: cursor=01J00000000000000000000000 Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 50 Page size. A value outside 1–100, or one that is not an integer, is |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": [
- {
- "id": "01J00000000000000000000000",
- "name": "string",
- "environment": "live",
- "last_four": "string",
- "scopes": [
- "*"
], - "last_used_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z",
- "revoked_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "limit": 0,
- "has_more": true
},
}Requested scopes must be a subset of the caller's own; * is mintable only by a * caller. Omitting scopes grants the caller's own set, which is * for a full-access caller and the widest legal grant otherwise.
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| Idempotency-Key | string <= 255 characters Optional idempotency key for safe retries on create operations. |
| name required | string <= 100 characters |
| scopes | Array of strings |
| expires_at | string or null <date-time> (NullableDateTime) A timestamp that the API may return as null. Spelled as a union rather than a |
{- "name": "string",
- "scopes": [
- "string"
], - "expires_at": "2019-08-24T14:15:22Z"
}{- "data": {
- "id": "01J00000000000000000000000",
- "name": "string",
- "environment": "live",
- "last_four": "string",
- "scopes": [
- "*"
], - "last_used_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z",
- "revoked_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "secret": "string"
}
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": {
- "id": "01J00000000000000000000000",
- "name": "string",
- "environment": "live",
- "last_four": "string",
- "scopes": [
- "*"
], - "last_used_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z",
- "revoked_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z"
}
}Permitted regardless of the target's scopes — destroying authority is a safety action. Deliberately asymmetric with rotate.
| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": {
- "revoked": true
}
}Refused with 403 scope_escalation when the target key holds a scope the caller does not — otherwise a narrow credential could rotate a broad key and be handed its secret.
| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": {
- "id": "01J00000000000000000000000",
- "name": "string",
- "environment": "live",
- "last_four": "string",
- "scopes": [
- "*"
], - "last_used_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z",
- "revoked_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "secret": "string"
}
}Cursor-paginated, newest first. Device principals only — an API key has no user and therefore no alerts.
| unread | boolean |
| channel | string Enum: "arrivals" "failures" |
| type | string Enum: "message.arrived" "inbox.expiring" "inbox.quota" "team.quota" |
| cursor | string |
| limit | integer [ 1 .. 100 ] Default: 50 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": [
- {
- "id": "string",
- "type": "message.arrived",
- "channel": "arrivals",
- "severity": "success",
- "title": "string",
- "detail": "string",
- "resource_type": "inbox",
- "resource_id": "string",
- "inbox": {
- "id": "string",
- "address": "string"
}, - "count": 0,
- "occurred_at": "2019-08-24T14:15:22Z",
- "read_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "limit": 0,
- "has_more": true,
- "unread_count": 0
}, - "links": {
- "next": "string"
}
}Omitting ids marks every unread alert in the bound project read. A ULID belonging to another user or project is 422 rather than silently skipped.
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| ids | Array of strings[ items = 26 characters ] |
{- "ids": [
- "stringstringstringstringst"
]
}{- "data": {
- "unread_count": 0
}
}Human decisions on parked sensitive steps. Device-session principals only — an API key that could approve its own request would make the gate decorative.
Cursor-paginated newest first, like every other collection. Only a team owner or admin on a device session may list. An API-key principal is refused with 403 principal_not_permitted, because a key that launched the run must not be able to approve it. Cross-tenant reads are 404, not 403.
An unrecognised status is 422 validation_error, not a silently ignored filter — on a queue of pending sensitive actions, a filter typo must never widen the result set.
| cursor | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: cursor=01J00000000000000000000000 Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 50 Page size. A value outside 1–100, or one that is not an integer, is |
| status | string Enum: "pending" "approved" "rejected" "expired" |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": [
- {
- "ulid": "01J00000000000000000000000",
- "status": "pending",
- "action": "string",
- "run_ulid": "01J00000000000000000000000",
- "step_index": 0,
- "target_resource_type": "string",
- "target_resource_id": "string",
- "binding_snapshot": { },
- "expires_at": "2019-08-24T14:15:22Z",
- "decided_at": "2019-08-24T14:15:22Z",
- "decision_reason": "string",
- "self_approved": true
}
], - "meta": {
- "limit": 0,
- "has_more": true
},
}Resumes the parked run at the same step. Only a team owner or admin on a device session may decide. An API-key principal is 403 principal_not_permitted. A cross-tenant ULID is 404, not 403. An expired pending row is 410 approval_expired.
| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": {
- "ulid": "01J00000000000000000000000",
- "status": "pending",
- "action": "string",
- "run_ulid": "01J00000000000000000000000",
- "step_index": 0,
- "target_resource_type": "string",
- "target_resource_id": "string",
- "binding_snapshot": { },
- "expires_at": "2019-08-24T14:15:22Z",
- "decided_at": "2019-08-24T14:15:22Z",
- "decision_reason": "string",
- "self_approved": true
}
}Fails the parked run. Only a team owner or admin on a device session may decide. An API-key principal is 403 principal_not_permitted. A cross-tenant ULID is 404, not 403. An expired pending row is 410 approval_expired.
| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| reason | string or null <= 500 characters |
{- "reason": "string"
}{- "data": {
- "ulid": "01J00000000000000000000000",
- "status": "pending",
- "action": "string",
- "run_ulid": "01J00000000000000000000000",
- "step_index": 0,
- "target_resource_type": "string",
- "target_resource_id": "string",
- "binding_snapshot": { },
- "expires_at": "2019-08-24T14:15:22Z",
- "decided_at": "2019-08-24T14:15:22Z",
- "decision_reason": "string",
- "self_approved": true
}
}| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| Idempotency-Key | string <= 255 characters Optional idempotency key for safe retries on create operations. |
| name required | string |
| description | string |
| permissions required | Array of strings |
{- "name": "string",
- "description": "string",
- "permissions": [
- "string"
]
}{- "data": {
- "id": "01J00000000000000000000000",
- "name": "string",
- "description": "string",
- "permissions": [
- "string"
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| cursor | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: cursor=01J00000000000000000000000 Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 50 Page size. A value outside 1–100, or one that is not an integer, is |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": [
- {
- "id": "01J00000000000000000000000",
- "name": "string",
- "description": "string",
- "permissions": [
- "string"
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "limit": 0,
- "has_more": true
},
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": {
- "id": "01J00000000000000000000000",
- "name": "string",
- "description": "string",
- "permissions": [
- "string"
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| name | string |
| description | string |
| permissions | Array of strings |
{- "name": "string",
- "description": "string",
- "permissions": [
- "string"
]
}{- "data": {
- "id": "01J00000000000000000000000",
- "name": "string",
- "description": "string",
- "permissions": [
- "string"
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "code": "string",
- "message": "string",
- "details": { },
- "request_id": "string"
}Opens an agent_run with trigger_type = mcp for out-of-tree MCP clients. Requires runs:write and api_keys.agent_access_enabled. Omitting agent_id resolves the project's Standard-preset agent.
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| agent_id | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ |
{- "agent_id": "01J00000000000000000000000"
}{- "data": {
- "ulid": "01J00000000000000000000000",
- "status": "string",
- "trigger_type": "mcp",
- "expires_at": "2019-08-24T14:15:22Z",
- "agent": {
- "ulid": "string",
- "name": "string"
}, - "project": {
- "ulid": "01J00000000000000000000000",
- "environment": "live"
}, - "scopes": [
- "*"
]
}
}Closes a running MCP session and frees its cleanup ledger. Idempotent — releasing an already-released session returns 200, not an error.
| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": {
- "ulid": "01J00000000000000000000000",
- "status": "string",
- "trigger_type": "mcp",
- "expires_at": "2019-08-24T14:15:22Z",
- "agent": {
- "ulid": "string",
- "name": "string"
}, - "project": {
- "ulid": "01J00000000000000000000000",
- "environment": "live"
}, - "scopes": [
- "*"
]
}
}| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| Idempotency-Key | string <= 255 characters Optional idempotency key for safe retries on create operations. |
| origin required | string |
| description | string |
{- "origin": "string",
- "description": "string"
}{- "data": {
- "id": "01J00000000000000000000000",
- "origin": "string",
- "scheme": "string",
- "host": "string",
- "port": 0,
- "is_wildcard": true,
- "description": "string",
- "last_used_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| cursor | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: cursor=01J00000000000000000000000 Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 50 Page size. A value outside 1–100, or one that is not an integer, is |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": [
- {
- "id": "01J00000000000000000000000",
- "origin": "string",
- "scheme": "string",
- "host": "string",
- "port": 0,
- "is_wildcard": true,
- "description": "string",
- "last_used_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "limit": 0,
- "has_more": true
},
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": {
- "id": "01J00000000000000000000000",
- "origin": "string",
- "scheme": "string",
- "host": "string",
- "port": 0,
- "is_wildcard": true,
- "description": "string",
- "last_used_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| description required | string or null |
{- "description": "string"
}{- "data": {
- "id": "01J00000000000000000000000",
- "origin": "string",
- "scheme": "string",
- "host": "string",
- "port": 0,
- "is_wildcard": true,
- "description": "string",
- "last_used_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "code": "string",
- "message": "string",
- "details": { },
- "request_id": "string"
}| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| Idempotency-Key | string <= 255 characters Optional idempotency key for safe retries on create operations. |
| name required | string |
| value required | string |
{- "name": "string",
- "value": "string"
}{- "data": {
- "id": "01J00000000000000000000000",
- "name": "string",
- "version": 0,
- "reference": "string",
- "last_used_at": "2019-08-24T14:15:22Z",
- "rotated_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| cursor | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: cursor=01J00000000000000000000000 Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 50 Page size. A value outside 1–100, or one that is not an integer, is |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": [
- {
- "id": "01J00000000000000000000000",
- "name": "string",
- "version": 0,
- "reference": "string",
- "last_used_at": "2019-08-24T14:15:22Z",
- "rotated_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "limit": 0,
- "has_more": true
},
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| value required | string |
{- "value": "string"
}{- "data": {
- "id": "01J00000000000000000000000",
- "name": "string",
- "version": 0,
- "reference": "string",
- "last_used_at": "2019-08-24T14:15:22Z",
- "rotated_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": {
- "id": "01J00000000000000000000000",
- "name": "string",
- "version": 0,
- "reference": "string",
- "last_used_at": "2019-08-24T14:15:22Z",
- "rotated_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "code": "string",
- "message": "string",
- "details": { },
- "request_id": "string"
}| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| Idempotency-Key | string <= 255 characters Optional idempotency key for safe retries on create operations. |
| name required | string |
| description | string |
object |
{- "name": "string",
- "description": "string",
- "draft_definition": { }
}{- "data": {
- "id": "01J00000000000000000000000",
- "name": "string",
- "description": "string",
- "draft_definition": { },
- "draft_revision": 0,
- "current_version": {
- "id": "01J00000000000000000000000",
- "version": 0,
- "published_at": "2019-08-24T14:15:22Z"
}, - "errors": [
- { }
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| cursor | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: cursor=01J00000000000000000000000 Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 50 Page size. A value outside 1–100, or one that is not an integer, is |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": [
- {
- "id": "01J00000000000000000000000",
- "name": "string",
- "description": "string",
- "draft_definition": { },
- "draft_revision": 0,
- "current_version": {
- "id": "01J00000000000000000000000",
- "version": 0,
- "published_at": "2019-08-24T14:15:22Z"
}, - "errors": [
- { }
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "limit": 0,
- "has_more": true
},
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": {
- "id": "01J00000000000000000000000",
- "name": "string",
- "description": "string",
- "draft_definition": { },
- "draft_revision": 0,
- "current_version": {
- "id": "01J00000000000000000000000",
- "version": 0,
- "published_at": "2019-08-24T14:15:22Z"
}, - "errors": [
- { }
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| If-Match | string Integer |
| name | string |
| description | string |
object |
{- "name": "string",
- "description": "string",
- "draft_definition": { }
}{- "data": {
- "id": "01J00000000000000000000000",
- "name": "string",
- "description": "string",
- "draft_definition": { },
- "draft_revision": 0,
- "current_version": {
- "id": "01J00000000000000000000000",
- "version": 0,
- "published_at": "2019-08-24T14:15:22Z"
}, - "errors": [
- { }
], - "created_at": "2019-08-24T14:15:22Z",
- "updated_at": "2019-08-24T14:15:22Z"
}
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "code": "string",
- "message": "string",
- "details": { },
- "request_id": "string"
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
object |
{- "definition": { }
}{- "data": {
- "valid": true,
- "errors": [
- {
- "path": "string",
- "code": "string",
- "message": "string"
}
], - "required_permissions": [
- "string"
], - "has_test_mutations": true
}
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": {
- "id": "01J00000000000000000000000",
- "version": 0,
- "schema_version": 0,
- "definition": { },
- "definition_hash": "string",
- "required_permissions": [
- "string"
], - "has_test_mutations": true,
- "published_at": "2019-08-24T14:15:22Z"
}
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| cursor | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: cursor=01J00000000000000000000000 Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 50 Page size. A value outside 1–100, or one that is not an integer, is |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": [
- {
- "id": "01J00000000000000000000000",
- "version": 0,
- "schema_version": 0,
- "definition": { },
- "definition_hash": "string",
- "required_permissions": [
- "string"
], - "has_test_mutations": true,
- "published_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "limit": 0,
- "has_more": true
},
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| version required | integer >= 1 The sequential version number from |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": {
- "id": "01J00000000000000000000000",
- "version": 0,
- "schema_version": 0,
- "definition": { },
- "definition_hash": "string",
- "required_permissions": [
- "string"
], - "has_test_mutations": true,
- "published_at": "2019-08-24T14:15:22Z"
}
}| wait | integer [ 0 .. 60 ] Block for up to this many seconds for the run to reach a terminal state or await approval, then return whatever it has. Capped at 60 by default (deployment-configurable); above the cap is 422. |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| Idempotency-Key | string <= 255 characters Optional idempotency key for safe retries on create operations. |
| agent_id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ |
| scenario_id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ |
object |
{- "agent_id": "01J00000000000000000000000",
- "scenario_id": "01J00000000000000000000000",
- "inputs": { }
}{- "data": {
- "id": "01J00000000000000000000000",
- "status": "string",
- "agent": {
- "id": "01J00000000000000000000000",
- "name": "string"
}, - "scenario": {
- "id": "01J00000000000000000000000",
- "name": "string",
- "version": 0
}, - "trigger": { },
- "current_step_index": 0,
- "started_at": "2019-08-24T14:15:22Z",
- "finished_at": "2019-08-24T14:15:22Z",
- "cleanup_status": "string",
- "failed_assertions": [
- { }
], - "step_count": 0,
- "events_url": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "inputs": { },
- "cleanup_error": "string",
- "steps": [
- { }
]
}
}| cursor | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: cursor=01J00000000000000000000000 Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 50 Page size. A value outside 1–100, or one that is not an integer, is |
| status | string |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": [
- {
- "id": "01J00000000000000000000000",
- "status": "string",
- "agent": {
- "id": "01J00000000000000000000000",
- "name": "string"
}, - "scenario": {
- "id": "01J00000000000000000000000",
- "name": "string",
- "version": 0
}, - "trigger": { },
- "current_step_index": 0,
- "started_at": "2019-08-24T14:15:22Z",
- "finished_at": "2019-08-24T14:15:22Z",
- "cleanup_status": "string",
- "failed_assertions": [
- { }
], - "step_count": 0,
- "events_url": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "inputs": { },
- "cleanup_error": "string",
- "steps": [
- { }
]
}
], - "meta": {
- "limit": 0,
- "has_more": true
},
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": {
- "id": "01J00000000000000000000000",
- "status": "string",
- "agent": {
- "id": "01J00000000000000000000000",
- "name": "string"
}, - "scenario": {
- "id": "01J00000000000000000000000",
- "name": "string",
- "version": 0
}, - "trigger": { },
- "current_step_index": 0,
- "started_at": "2019-08-24T14:15:22Z",
- "finished_at": "2019-08-24T14:15:22Z",
- "cleanup_status": "string",
- "failed_assertions": [
- { }
], - "step_count": 0,
- "events_url": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "inputs": { },
- "cleanup_error": "string",
- "steps": [
- { }
]
}
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| cursor | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: cursor=01J00000000000000000000000 Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 50 Page size. A value outside 1–100, or one that is not an integer, is |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": [
- {
- "id": "01J00000000000000000000000",
- "sequence": 0,
- "type": "string",
- "payload": { },
- "occurred_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "limit": 0,
- "has_more": true
},
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": {
- "id": "01J00000000000000000000000",
- "status": "string",
- "agent": {
- "id": "01J00000000000000000000000",
- "name": "string"
}, - "scenario": {
- "id": "01J00000000000000000000000",
- "name": "string",
- "version": 0
}, - "trigger": { },
- "current_step_index": 0,
- "started_at": "2019-08-24T14:15:22Z",
- "finished_at": "2019-08-24T14:15:22Z",
- "cleanup_status": "string",
- "failed_assertions": [
- { }
], - "step_count": 0,
- "events_url": "string",
- "created_at": "2019-08-24T14:15:22Z",
- "inputs": { },
- "cleanup_error": "string",
- "steps": [
- { }
]
}
}| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": {
- "project": {
- "id": "01J00000000000000000000000",
- "slug": "string"
}, - "plan": {
- "slug": "string",
- "name": "string"
}, - "quotas": {
- "property1": 0,
- "property2": 0
}, - "usage": {
- "property1": 0,
- "property2": 0
}, - "trial": { },
- "subscription": { },
- "storage": {
- "team": {
- "used_bytes": 0,
- "quota_bytes": 1,
- "state": "normal"
}
}
}
}| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| Idempotency-Key | string <= 255 characters Optional idempotency key for safe retries on create operations. |
| X-MailHulk-Agent-Session | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Optional MCP session ulid from |
| name | string or null <= 100 characters |
| ttl_seconds | integer or null [ 60 .. 2592000 ] Lifetime of a disposable inbox, from now. Rejected with 422 alongside |
| domain_id | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ |
| local_part | string <= 64 characters Mailbox local part. Required with |
| watch | boolean Watch the new inbox from the calling device. Device principals only; an API key passing this receives 422. |
{- "name": "string",
- "ttl_seconds": 60,
- "domain_id": "01J00000000000000000000000",
- "local_part": "string",
- "watch": true
}{- "data": {
- "id": "01J00000000000000000000000",
- "address": "user@example.com",
- "name": "string",
- "type": "string",
- "status": "suspended",
- "message_count": 0,
- "unread_count": 0,
- "pop3": {
- "host": "string",
- "port": 0
}, - "imap": {
- "host": "string",
- "port": 0
}, - "retention_days": 0,
- "expires_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "storage": {
- "inbox": {
- "used_bytes": 0,
- "quota_bytes": 1,
- "state": "normal"
}, - "team": {
- "used_bytes": 0,
- "quota_bytes": 1,
- "state": "normal"
}
}, - "watched": true
}
}| cursor | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: cursor=01J00000000000000000000000 Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 50 Page size. A value outside 1–100, or one that is not an integer, is |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": [
- {
- "id": "01J00000000000000000000000",
- "address": "user@example.com",
- "name": "string",
- "type": "string",
- "status": "suspended",
- "message_count": 0,
- "unread_count": 0,
- "pop3": {
- "host": "string",
- "port": 0
}, - "imap": {
- "host": "string",
- "port": 0
}, - "retention_days": 0,
- "expires_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "storage": {
- "inbox": {
- "used_bytes": 0,
- "quota_bytes": 1,
- "state": "normal"
}, - "team": {
- "used_bytes": 0,
- "quota_bytes": 1,
- "state": "normal"
}
}, - "watched": true
}
], - "meta": {
- "limit": 0,
- "has_more": true
},
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| X-MailHulk-Agent-Session | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Optional MCP session ulid from |
{- "data": {
- "id": "01J00000000000000000000000",
- "address": "user@example.com",
- "name": "string",
- "type": "string",
- "status": "suspended",
- "message_count": 0,
- "unread_count": 0,
- "pop3": {
- "host": "string",
- "port": 0
}, - "imap": {
- "host": "string",
- "port": 0
}, - "retention_days": 0,
- "expires_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "storage": {
- "inbox": {
- "used_bytes": 0,
- "quota_bytes": 1,
- "state": "normal"
}, - "team": {
- "used_bytes": 0,
- "quota_bytes": 1,
- "state": "normal"
}
}, - "watched": true
}
}Send at least one of name or ttl_seconds — an empty body is 422. ttl_seconds runs from now rather than extending what remains, is clamped to the plan's ceiling instead of being rejected for exceeding it, and is 422 on a persistent mailbox, which does not expire.
| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| name | string or null <= 100 characters |
| ttl_seconds | integer >= 1 |
{- "name": "string",
- "ttl_seconds": 1
}{- "data": {
- "id": "01J00000000000000000000000",
- "address": "user@example.com",
- "name": "string",
- "type": "string",
- "status": "suspended",
- "message_count": 0,
- "unread_count": 0,
- "pop3": {
- "host": "string",
- "port": 0
}, - "imap": {
- "host": "string",
- "port": 0
}, - "retention_days": 0,
- "expires_at": "2019-08-24T14:15:22Z",
- "created_at": "2019-08-24T14:15:22Z",
- "storage": {
- "inbox": {
- "used_bytes": 0,
- "quota_bytes": 1,
- "state": "normal"
}, - "team": {
- "used_bytes": 0,
- "quota_bytes": 1,
- "state": "normal"
}
}, - "watched": true
}
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "code": "string",
- "message": "string",
- "details": { },
- "request_id": "string"
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": {
- "username": "string",
- "password": "string",
- "pop3": {
- "host": "string",
- "port": 0
}, - "imap": {
- "host": "string",
- "port": 0
}
}
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| last_read_ulid required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ |
{- "last_read_ulid": "01J00000000000000000000000"
}{- "data": {
- "last_read_ulid": "01J00000000000000000000000"
}
}Subscribes the calling device to this inbox. A watch means "tell me about this inbox" — arrivals plus that inbox's expiry and quota alerts. Idempotent. Device principals only; an API key has no device and receives 403.
| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "code": "string",
- "message": "string",
- "details": { },
- "request_id": "string"
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "code": "string",
- "message": "string",
- "details": { },
- "request_id": "string"
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| cursor | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: cursor=01J00000000000000000000000 Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 50 Page size. A value outside 1–100, or one that is not an integer, is |
| view | string Default: "summary" Enum: "summary" "full" "agent"
|
| headers | string Default: "projected" Enum: "projected" "full" Header projection mode for the agent representation. projected (the default) returns a bounded subset; full returns every received header, bounded with truncation when needed. |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| X-MailHulk-Agent-Session | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Optional MCP session ulid from |
{- "data": [
- {
- "id": "string",
- "inbox_id": "string",
- "from": {
- "email": "string",
- "name": "string"
}, - "subject": "string",
- "preview": "string",
- "codes": [
- "string"
], - "links_count": 0,
- "attachment_count": 0,
- "has_text": true,
- "has_html": true,
- "raw_available": true,
- "size_bytes": 0,
- "logical_size_bytes": 0,
- "received_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z",
- "read": true
}
], - "meta": {
- "limit": 0,
- "has_more": true
},
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| wait | integer [ 0 .. 60 ] Long-poll for up to this many seconds for a message newer than the baseline. The baseline is |
| after | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: after=01J00000000000000000000000 |
| view | string Default: "full" Enum: "summary" "full" "agent"
|
| headers | string Default: "projected" Enum: "projected" "full" Header projection mode for the agent representation. projected (the default) returns a bounded subset; full returns every received header, bounded with truncation when needed. |
| poll_token | string Resume a bounded wait. Returned as |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| X-MailHulk-Agent-Session | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Optional MCP session ulid from |
{- "data": {
- "id": "string",
- "inbox_id": "string",
- "from": {
- "email": "string",
- "name": "string"
}, - "subject": "string",
- "preview": "string",
- "codes": [
- "string"
], - "links_count": 0,
- "attachment_count": 0,
- "has_text": true,
- "has_html": true,
- "raw_available": true,
- "size_bytes": 0,
- "logical_size_bytes": 0,
- "received_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z",
- "read": true
}
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| view | string Default: "full" Enum: "summary" "full" "agent"
|
| headers | string Default: "projected" Enum: "projected" "full" Header projection mode for the agent representation. projected (the default) returns a bounded subset; full returns every received header, bounded with truncation when needed. |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| X-MailHulk-Agent-Session | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Optional MCP session ulid from |
{- "data": {
- "id": "string",
- "inbox_id": "string",
- "from": {
- "email": "string",
- "name": "string"
}, - "subject": "string",
- "preview": "string",
- "codes": [
- "string"
], - "links_count": 0,
- "attachment_count": 0,
- "has_text": true,
- "has_html": true,
- "raw_available": true,
- "size_bytes": 0,
- "logical_size_bytes": 0,
- "received_at": "2019-08-24T14:15:22Z",
- "expires_at": "2019-08-24T14:15:22Z",
- "read": true
}
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| X-MailHulk-Agent-Session | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Optional MCP session ulid from |
{- "code": "string",
- "message": "string",
- "details": { },
- "request_id": "string"
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| remote | string Default: "strip" Enum: "strip" "allow"
|
| headers | string Default: "projected" Enum: "projected" "full" Header projection mode for the agent representation. projected (the default) returns a bounded subset; full returns every received header, bounded with truncation when needed. |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| X-MailHulk-Agent-Session | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Optional MCP session ulid from |
{- "data": {
- "html": "string",
- "remote_blocked": 0,
- "truncated": true,
- "sanitizer_version": 0
}
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "code": "string",
- "message": "string",
- "details": { },
- "request_id": "string"
}The attachment ULID comes from Message.attachments[].id; the summary view carries only attachment_count, so fetch the message first.
| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| attachmentId required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "code": "string",
- "message": "string",
- "details": { },
- "request_id": "string"
}The agent representation of an attachment: metadata, a sha256 of the exact bytes, and decoded text for text/plain, text/csv, text/calendar, and application/json only. Raw bytes are never returned here — use the sibling download route for those. The filename sits inside the untrusted envelope because the sender wrote it.
| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| attachmentId required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": {
- "id": "01J00000000000000000000000",
- "message_id": "01J00000000000000000000000",
- "size_bytes": 0,
- "sha256": "string",
- "declared_content_type": "string",
- "served_content_type": "string",
- "text_available": true,
- "truncated": true,
- "withheld_reason": "string",
- "untrusted": {
- "provenance": "third-party-email",
- "nonce": "string",
- "filename": "string",
- "text": "string"
}
}
}Only normal-mode domains are exposed on /v1/domains.
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| Idempotency-Key | string <= 255 characters Optional idempotency key for safe retries on create operations. |
| domain required | string |
{- "domain": "string"
}{- "data": {
- "id": "01J00000000000000000000000",
- "domain": "string",
- "mode": "normal",
- "status": "string",
- "verified_at": "2019-08-24T14:15:22Z",
- "last_checked_at": "2019-08-24T14:15:22Z",
- "dkim": {
- "selector": "string"
}, - "project": {
- "id": "01J00000000000000000000000",
- "slug": "string"
}, - "records": [
- {
- "key": "string",
- "type": "string",
- "host": "string",
- "value": "string",
- "priority": 0,
- "required": true,
- "status": "string"
}
], - "created_at": "2019-08-24T14:15:22Z"
}
}| cursor | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: cursor=01J00000000000000000000000 Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 50 Page size. A value outside 1–100, or one that is not an integer, is |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": [
- {
- "id": "01J00000000000000000000000",
- "domain": "string",
- "mode": "normal",
- "status": "string",
- "verified_at": "2019-08-24T14:15:22Z",
- "last_checked_at": "2019-08-24T14:15:22Z",
- "dkim": {
- "selector": "string"
}, - "project": {
- "id": "01J00000000000000000000000",
- "slug": "string"
}, - "records": [
- {
- "key": "string",
- "type": "string",
- "host": "string",
- "value": "string",
- "priority": 0,
- "required": true,
- "status": "string"
}
], - "created_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "limit": 0,
- "has_more": true
},
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": {
- "id": "01J00000000000000000000000",
- "domain": "string",
- "mode": "normal",
- "status": "string",
- "verified_at": "2019-08-24T14:15:22Z",
- "last_checked_at": "2019-08-24T14:15:22Z",
- "dkim": {
- "selector": "string"
}, - "project": {
- "id": "01J00000000000000000000000",
- "slug": "string"
}, - "records": [
- {
- "key": "string",
- "type": "string",
- "host": "string",
- "value": "string",
- "priority": 0,
- "required": true,
- "status": "string"
}
], - "created_at": "2019-08-24T14:15:22Z"
}
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "code": "string",
- "message": "string",
- "details": { },
- "request_id": "string"
}The verification view of a domain: its status, when DNS was last checked, and the expected records each carrying its own last-seen check result. Narrower than the domain resource — it omits dkim, project, and the timestamps.
| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": {
- "status": "string",
- "last_checked_at": "2019-08-24T14:15:22Z",
- "records": [
- {
- "key": "string",
- "type": "string",
- "host": "string",
- "value": "string",
- "priority": 0,
- "required": true,
- "status": "string"
}
]
}
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": {
- "id": "01J00000000000000000000000",
- "domain": "string",
- "mode": "normal",
- "status": "string",
- "verified_at": "2019-08-24T14:15:22Z",
- "last_checked_at": "2019-08-24T14:15:22Z",
- "dkim": {
- "selector": "string"
}, - "project": {
- "id": "01J00000000000000000000000",
- "slug": "string"
}, - "records": [
- {
- "key": "string",
- "type": "string",
- "host": "string",
- "value": "string",
- "priority": 0,
- "required": true,
- "status": "string"
}
], - "created_at": "2019-08-24T14:15:22Z"
}
}An identifying projection, not the inbox resource — it carries no connection details, counts, status, or storage. Call GET /v1/inboxes/{id} for those.
| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| cursor | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: cursor=01J00000000000000000000000 Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 50 Page size. A value outside 1–100, or one that is not an integer, is |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": [
- {
- "id": "01J00000000000000000000000",
- "address": "user@example.com",
- "name": "string",
- "type": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "limit": 0,
- "has_more": true
},
}| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| Idempotency-Key | string <= 255 characters Optional idempotency key for safe retries on create operations. |
| url required | string <uri> |
| description | string |
{- "description": "string"
}{- "data": {
- "id": "01J00000000000000000000000",
- "description": "string",
- "active": true,
- "secret": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
}| cursor | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: cursor=01J00000000000000000000000 Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 50 Page size. A value outside 1–100, or one that is not an integer, is |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": [
- {
- "id": "01J00000000000000000000000",
- "description": "string",
- "active": true,
- "secret": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "limit": 0,
- "has_more": true
},
}The signing secret is never returned here. It is shown once when the webhook is created and once more by POST /v1/webhooks/{id}/rotate.
| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": {
- "id": "01J00000000000000000000000",
- "description": "string",
- "active": true,
- "secret": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
}Partial update of the destination, its label, or whether it is active. Setting active to false stops new deliveries without discarding the endpoint or its secret. The URL is re-checked against the same policy applied at create time.
| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| url | string <uri> |
| description | string or null |
| active | boolean |
{- "description": "string",
- "active": true
}{- "data": {
- "id": "01J00000000000000000000000",
- "description": "string",
- "active": true,
- "secret": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "code": "string",
- "message": "string",
- "details": { },
- "request_id": "string"
}Issues a new signing secret and returns it exactly once, keeping the webhook's id and URL. Deliveries signed with the previous secret stop verifying immediately, so update the consumer before rotating. Takes no body.
| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| Idempotency-Key | string <= 255 characters Optional idempotency key for safe retries on create operations. |
{- "data": {
- "id": "01J00000000000000000000000",
- "description": "string",
- "active": true,
- "secret": "string",
- "created_at": "2019-08-24T14:15:22Z"
}
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| Idempotency-Key | string <= 255 characters Optional idempotency key for safe retries on create operations. |
| type required | string |
| source required | string |
| action required | string |
| target_inbox_id | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ |
| forward_targets | Array of strings |
| priority | integer |
{- "type": "string",
- "source": "string",
- "action": "string",
- "target_inbox_id": "01J00000000000000000000000",
- "forward_targets": [
- "string"
], - "priority": 0
}{- "data": {
- "id": "01J00000000000000000000000",
- "type": "alias",
- "source": "string",
- "action": "deliver_to_inbox",
- "target_inbox": "string",
- "forward_targets": [
- "string"
], - "priority": 0,
- "active": true,
- "created_at": "2019-08-24T14:15:22Z"
}
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| cursor | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: cursor=01J00000000000000000000000 Opaque pagination cursor from |
| limit | integer [ 1 .. 100 ] Default: 50 Page size. A value outside 1–100, or one that is not an integer, is |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "data": [
- {
- "id": "01J00000000000000000000000",
- "type": "alias",
- "source": "string",
- "action": "deliver_to_inbox",
- "target_inbox": "string",
- "forward_targets": [
- "string"
], - "priority": 0,
- "active": true,
- "created_at": "2019-08-24T14:15:22Z"
}
], - "meta": {
- "limit": 0,
- "has_more": true
},
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
| active | boolean |
| priority | integer |
| target_inbox_ulid | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ |
| forward_targets | Array of strings |
{- "active": true,
- "priority": 0,
- "target_inbox_ulid": "01J00000000000000000000000",
- "forward_targets": [
- "string"
]
}{- "data": {
- "id": "01J00000000000000000000000",
- "type": "alias",
- "source": "string",
- "action": "deliver_to_inbox",
- "target_inbox": "string",
- "forward_targets": [
- "string"
], - "priority": 0,
- "active": true,
- "created_at": "2019-08-24T14:15:22Z"
}
}| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| X-MailHulk-Project | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 Selects the project, as a project ULID from Marked optional because whether it is required depends on the credential, which OpenAPI cannot express: a device session must send it on every route that carries this parameter — omitting it is A mobile client should simply always send it. |
{- "code": "string",
- "message": "string",
- "details": { },
- "request_id": "string"
}Registers or rotates this device's FCM token. Self only — patching another of your own devices is 403 not_calling_device, because you can already list and delete it and a 404 would lie.
| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
| push_token | string or null <= 4096 characters |
| app_version | string or null <= 20 characters |
{- "push_token": "string",
- "app_version": "string"
}{- "data": {
- "id": "string",
- "platform": "android",
- "model_label": "string",
- "app_version": "string",
- "last_seen_at": "2019-08-24T14:15:22Z",
- "current": true
}
}Deletes the device's token and drops its inbox watches, so it stops receiving push immediately. The device row is kept as the audit trail. Revoking the calling device is allowed — it is how "sign out" works.
| id required | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: 01J00000000000000000000000 |
{- "code": "string",
- "message": "string",
- "details": { },
- "request_id": "string"
}The guest plane that mints a device session. These routes produce a credential, so they require none, and they are throttled per IP — a 429 carries a Retry-After. They are the only /v1 routes that take no X-MailHulk-Project header: the project is chosen afterwards, with GET /v1/projects.
| challenge_token required | string |
| code required | string |
required | object (DeviceRegistration) |
{- "challenge_token": "string",
- "code": "string",
- "device": {
- "platform": "android",
- "model_label": "Pixel 8",
- "app_version": "1.0.0"
}
}{- "token": "string",
- "expires_at": "2019-08-24T14:15:22Z",
- "device": {
- "id": "string",
- "platform": "android",
- "model_label": "string",
- "app_version": "string",
- "last_seen_at": "2019-08-24T14:15:22Z",
- "current": true
}
}| url required | string <uri> |
required | object (DeviceRegistration) |
{- "device": {
- "platform": "android",
- "model_label": "Pixel 8",
- "app_version": "1.0.0"
}
}{- "token": "string",
- "expires_at": "2019-08-24T14:15:22Z",
- "device": {
- "id": "string",
- "platform": "android",
- "model_label": "string",
- "app_version": "string",
- "last_seen_at": "2019-08-24T14:15:22Z",
- "current": true
}
}| challenge_token required | string |
| recovery_code required | string |
required | object (DeviceRegistration) |
{- "challenge_token": "string",
- "recovery_code": "string",
- "device": {
- "platform": "android",
- "model_label": "Pixel 8",
- "app_version": "1.0.0"
}
}{- "token": "string",
- "expires_at": "2019-08-24T14:15:22Z",
- "device": {
- "id": "string",
- "platform": "android",
- "model_label": "string",
- "app_version": "string",
- "last_seen_at": "2019-08-24T14:15:22Z",
- "current": true
}
}| email required | string <email> |
| password required | string |
required | object (DeviceRegistration) |
{- "email": "user@example.com",
- "password": "string",
- "device": {
- "platform": "android",
- "model_label": "Pixel 8",
- "app_version": "1.0.0"
}
}{- "token": "string",
- "expires_at": "2019-08-24T14:15:22Z",
- "device": {
- "id": "string",
- "platform": "android",
- "model_label": "string",
- "app_version": "string",
- "last_seen_at": "2019-08-24T14:15:22Z",
- "current": true
}
}| pairing_token required | string The scanned 40-character token, or the 8-character short code shown beside the QR. Case-insensitive; grouping hyphens and spaces are ignored. |
required | object (DeviceRegistration) |
{- "pairing_token": "string",
- "device": {
- "platform": "android",
- "model_label": "Pixel 8",
- "app_version": "1.0.0"
}
}{- "status": "scanned"
}Who the caller is and what it may select. Bind no project and take no X-MailHulk-Project header.