POST
/api/v1/mailboxes/{mailboxId}/messages/unjunk

Removes the Junk label from a batch of messages — the "Not spam" verb, and POST /messages/untrash's counterpart for the other state label. Where each one lands is its restoresTo: whatever it carries besides Junk if anything, otherwise the filing recorded when a label write left it carrying only Junk, otherwise Inbox. An origin label that has since been deleted is matched by name if a label of that name exists again. Reports as an update on /changes (the rows were never hidden). This does NOT train the spam filter; pair it with POST /messages/learn as before. threadIds takes a whole conversation out: it expands, server-side and in the same transaction, to the members that are IN Junk. A conversation with nothing junked expands to nothing and the call is a no-op.

Authorization

bearerAuth
headerAuthorizationBearer <token>

Two credential kinds share this scheme; GET /api/v1/auth/whoami answers which one you hold and what it reaches.

oek_… API key (minted by POST /api/v1/api-keys; shown once at mint). role: account reaches the full account surface: the directory (domains, routes, patterns, api-keys, accounts, address lists) plus every mailbox the account owns. role: system additionally reaches the operator surface, which is documented separately.

oemp_… mailbox app password (minted by POST /api/v1/identities/{identityId}/credentials). Reaches ONE mailbox: its messages, labels, threads, search, sync, send, filters and PIM collections. Directory routes refuse it with 403 insufficient_scope.

Refusal vocabulary: a missing, malformed, expired, or revoked credential answers 401 unauthorized with a WWW-Authenticate: Bearer challenge; a VALID credential outside its scope answers 403 (insufficient_scope for an app password on a directory route, system_credentials_required where only the operator may call). The public routes (health, branding, token-in-path capabilities) declare security: [].

Path Parameters

mailboxId*string

Mailbox ULID identifier

Request Body

application/json
  1. body
ids?array<string>

Array of message IDs to take out of Junk

Items1 <= items <= 200
threadIds?array<string>

Conversation IDs whose JUNKED members to take out of Junk, expanded server-side. Refused with thread_too_large past 1000 expanded messages.

Items1 <= items <= 50

Response Body

Batch unjunk outcomes per message

application/json
  1. response
results*array<>

List of unjunk outcomes for each requested message

Example Request
curl -X POST 'https://api.open.email/api/v1/mailboxes/string/messages/unjunk' \
  -H 'Content-Type: application/json' \
  -d '{}'
Example Response
{
  "results": [
    {
      "id": "string",
      "message": {
        "auth": {
          "arc": "string",
          "dkim": "string",
          "dmarc": "string",
          "junk": true,
          "spf": "string"
        },
        "bcc": [
          {
            "email": "string",
            "name": "string"
          }
        ],
        "blobGen": "string",
        "blobHash": "string",
        "cc": [
          {
            "email": "string",
            "name": "string"
          }
        ],
        "deliveryMeta": {
          "property1": null,
          "property2": null
        },
        "deliveryState": "queued",
        "envelopeFrom": "string",
        "envelopeTo": "string",
        "flags": [
          "string"
        ],
        "from": [
          {
            "email": "string",
            "name": "string"
          }
        ],
        "hasAttachment": true,
        "id": "string",
        "inReplyTo": "string",
        "keywords": [
          "string"
        ],
        "labels": [
          {
            "deleted": true,
            "modseq": 0,
            "name": "string",
            "uid": 0,
            "uidValidity": 0
          }
        ],
        "messageIdHeader": "string",
        "modseq": 0,
        "receivedAt": 0,
        "referencesIds": [
          "string"
        ],
        "restoresTo": [
          "string"
        ],
        "sentAt": 0,
        "size": 0,
        "snippet": "string",
        "subject": "string",
        "threadId": "string",
        "to": [
          {
            "email": "string",
            "name": "string"
          }
        ],
        "uid": 0
      },
      "status": "unjunked"
    }
  ]
}