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.
| cursor | string (Ulid) ^[0-9A-HJKMNP-TV-Z]{26}$ Example: cursor=01J00000000000000000000000 Opaque pagination cursor from |
| 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": "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.
Newest first, capped at 100. 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.
| 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
}
]
}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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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
},
}| 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. |
| 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 |
| 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.