Take messages out of Junk, back to where they were filed
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.
bearerAuthAuthorizationBearer <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: [].
mailboxId*stringMailbox ULID identifier
application/json- body
ids?array<string>Array of message IDs to take out of Junk
1 <= items <= 200threadIds?array<string>Conversation IDs whose JUNKED members to take out of Junk, expanded server-side. Refused with thread_too_large past 1000 expanded messages.
1 <= items <= 50Batch unjunk outcomes per message
application/json- response
results*array<>List of unjunk outcomes for each requested message
curl -X POST 'https://api.open.email/api/v1/mailboxes/string/messages/unjunk' \
-H 'Content-Type: application/json' \
-d '{}'{
"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"
}
]
}Take messages out of Trash, back to where they… POST
Removes the Trash label from a batch of messages. Where each one lands is its restoresTo: whatever it carries besides Trash if anything, otherwise the filing…
Restore an expunged message from trash POST
Restores one message from the Recently-deleted tier back to where it was filed (restoresTo), or Inbox when that is no longer resolvable. For a message on the…