mirror of
https://github.com/stalwartlabs/mail-server.git
synced 2025-09-04 02:54:11 +08:00
2622 lines
82 KiB
YAML
2622 lines
82 KiB
YAML
# SPDX-FileCopyrightText: 2025 Stalwart Labs Ltd <hello@stalw.art>
|
|
#
|
|
# SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL
|
|
|
|
openapi: 3.0.0
|
|
info:
|
|
title: Stalwart API
|
|
version: 1.0.0
|
|
servers:
|
|
- url: https://mail.example.org/api
|
|
description: Sample server
|
|
paths:
|
|
/oauth:
|
|
post:
|
|
summary: Obtain OAuth token
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
properties:
|
|
code:
|
|
type: string
|
|
permissions:
|
|
type: array
|
|
items:
|
|
type: string
|
|
version:
|
|
type: string
|
|
isEnterprise:
|
|
type: boolean
|
|
example:
|
|
data:
|
|
code: 4YmRFLu9Df1t4JO7Iffnuney4B8tVLAxjimdRxEg
|
|
permissions:
|
|
- webadmin-update
|
|
- spam-filter-update
|
|
- dkim-signature-get
|
|
- dkim-signature-create
|
|
- undelete
|
|
- fts-reindex
|
|
- purge-account
|
|
- purge-in-memory-store
|
|
- purge-data-store
|
|
- purge-blob-store
|
|
version: 0.11.0
|
|
isEnterprise: true
|
|
"401":
|
|
description: Unauthorized
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
type:
|
|
type: string
|
|
status:
|
|
type: number
|
|
title:
|
|
type: string
|
|
detail:
|
|
type: string
|
|
example:
|
|
type: about:blank
|
|
status: 401
|
|
title: Unauthorized
|
|
detail: You have to authenticate first.
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
type:
|
|
type: string
|
|
client_id:
|
|
type: string
|
|
redirect_uri:
|
|
type: string
|
|
nonce:
|
|
type: string
|
|
example:
|
|
type: code
|
|
client_id: webadmin
|
|
redirect_uri: stalwart://auth
|
|
nonce: ttsaXca3qx
|
|
/telemetry/metrics:
|
|
get:
|
|
summary: Fetch Telemetry Metrics
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
error:
|
|
type: string
|
|
details:
|
|
type: string
|
|
reason:
|
|
type: string
|
|
example:
|
|
error: other
|
|
details: No metrics store has been defined
|
|
reason:
|
|
You need to configure a metrics store in order to use this
|
|
feature.
|
|
parameters:
|
|
- name: after
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: string
|
|
/telemetry/live/metrics-token:
|
|
get:
|
|
summary: Obtain Metrics Telemetry token
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: string
|
|
example:
|
|
data: 2GO4RahIkSAms6S00R9BRsroo97ZdYTz4QVxFCOwGrGkr7zguP0AVyTMA/iha3Vz/////w8DhZi1+ALBmLX4AndlYg==
|
|
/telemetry/metrics/live:
|
|
get:
|
|
summary: Live Metrics
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content: {}
|
|
parameters:
|
|
- name: metrics
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: string
|
|
- name: interval
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
- name: token
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: string
|
|
/principal:
|
|
get:
|
|
summary: List Principals
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
properties:
|
|
items:
|
|
type: array
|
|
items: {}
|
|
total:
|
|
type: number
|
|
example:
|
|
data:
|
|
items: []
|
|
total: 0
|
|
parameters:
|
|
- name: page
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
- name: limit
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
- name: types
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: string
|
|
post:
|
|
summary: Create Principal
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: number
|
|
example:
|
|
data: 50
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
type:
|
|
type: string
|
|
quota:
|
|
type: number
|
|
name:
|
|
type: string
|
|
description:
|
|
type: string
|
|
secrets:
|
|
type: array
|
|
items: {}
|
|
emails:
|
|
type: array
|
|
items: {}
|
|
urls:
|
|
type: array
|
|
items: {}
|
|
memberOf:
|
|
type: array
|
|
items: {}
|
|
roles:
|
|
type: array
|
|
items: {}
|
|
lists:
|
|
type: array
|
|
items: {}
|
|
members:
|
|
type: array
|
|
items: {}
|
|
enabledPermissions:
|
|
type: array
|
|
items: {}
|
|
disabledPermissions:
|
|
type: array
|
|
items: {}
|
|
externalMembers:
|
|
type: array
|
|
items: {}
|
|
example:
|
|
type: domain
|
|
quota: 0
|
|
name: example.org
|
|
description: Example domain
|
|
secrets: []
|
|
emails: []
|
|
urls: []
|
|
memberOf: []
|
|
roles: []
|
|
lists: []
|
|
members: []
|
|
enabledPermissions: []
|
|
disabledPermissions: []
|
|
externalMembers: []
|
|
/dkim:
|
|
post:
|
|
summary: Create DKIM Signature
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
nullable: true
|
|
example:
|
|
data:
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: object
|
|
nullable: true
|
|
algorithm:
|
|
type: string
|
|
domain:
|
|
type: string
|
|
selector:
|
|
type: object
|
|
nullable: true
|
|
example:
|
|
id:
|
|
algorithm: Ed25519
|
|
domain: example.org
|
|
selector:
|
|
/principal/{principal_id}:
|
|
get:
|
|
summary: Fetch Principal
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: number
|
|
type:
|
|
type: string
|
|
secrets:
|
|
type: string
|
|
name:
|
|
type: string
|
|
quota:
|
|
type: number
|
|
description:
|
|
type: string
|
|
emails:
|
|
type: string
|
|
roles:
|
|
type: array
|
|
items:
|
|
type: string
|
|
lists:
|
|
type: array
|
|
items:
|
|
type: string
|
|
example:
|
|
data:
|
|
id: 90
|
|
type: individual
|
|
secrets: $6$ONjGT6nQtmPNaxw0$NNF5DXtPfOay2mfVnPJ0uQ77C.L3LNxXO/QMyphP/DzpODqbDBBGd4/gCnckYPQj3st6pqwY8/KeBsCJ.oe1Y1
|
|
name: jane
|
|
quota: 0
|
|
description: Jane Doe
|
|
emails: jane@example.org
|
|
roles:
|
|
- user
|
|
lists:
|
|
- all
|
|
parameters:
|
|
- name: principal_id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
patch:
|
|
summary: Update Principal
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
nullable: true
|
|
example:
|
|
data:
|
|
parameters:
|
|
- name: principal_id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
field:
|
|
type: string
|
|
value:
|
|
type: string
|
|
example:
|
|
- action: set
|
|
field: name
|
|
value: jane.doe
|
|
- action: set
|
|
field: description
|
|
value: Jane Mary Doe
|
|
- action: addItem
|
|
field: emails
|
|
value: jane-doe@example.org
|
|
- action: removeItem
|
|
field: emails
|
|
value: jane@example.org
|
|
delete:
|
|
summary: Delete Principal
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
nullable: true
|
|
example:
|
|
data:
|
|
parameters:
|
|
- name: principal_id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
/queue/messages:
|
|
get:
|
|
summary: List Queued Messages
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
properties:
|
|
items:
|
|
type: array
|
|
items: {}
|
|
total:
|
|
type: number
|
|
status:
|
|
type: boolean
|
|
example:
|
|
data:
|
|
items: []
|
|
total: 0
|
|
status: true
|
|
parameters:
|
|
- name: page
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
- name: max-total
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
- name: limit
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
- name: values
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
patch:
|
|
summary: Reschedule Queued Messages
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: boolean
|
|
example:
|
|
data: true
|
|
parameters:
|
|
- name: filter
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: string
|
|
delete:
|
|
summary: Delete Queued Messages
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: boolean
|
|
example:
|
|
data: true
|
|
parameters:
|
|
- name: text
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: string
|
|
/queue/reports:
|
|
get:
|
|
summary: List Queued Reports
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
properties:
|
|
items:
|
|
type: array
|
|
items: {}
|
|
total:
|
|
type: number
|
|
example:
|
|
data:
|
|
items: []
|
|
total: 0
|
|
parameters:
|
|
- name: max-total
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
- name: limit
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
- name: page
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
/reports/dmarc:
|
|
get:
|
|
summary: List Incoming DMARC Reports
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
properties:
|
|
items:
|
|
type: array
|
|
items: {}
|
|
total:
|
|
type: number
|
|
example:
|
|
data:
|
|
items: []
|
|
total: 0
|
|
parameters:
|
|
- name: max-total
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
- name: limit
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
- name: page
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
/reports/tls:
|
|
get:
|
|
summary: List Incoming TLS Reports
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
properties:
|
|
items:
|
|
type: array
|
|
items: {}
|
|
total:
|
|
type: number
|
|
example:
|
|
data:
|
|
items: []
|
|
total: 0
|
|
parameters:
|
|
- name: limit
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
- name: max-total
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
- name: page
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
/reports/arf:
|
|
get:
|
|
summary: List Incoming ARF Reports
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
properties:
|
|
items:
|
|
type: array
|
|
items: {}
|
|
total:
|
|
type: number
|
|
example:
|
|
data:
|
|
items: []
|
|
total: 0
|
|
parameters:
|
|
- name: page
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
- name: limit
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
- name: max-total
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
/telemetry/traces:
|
|
get:
|
|
summary: List Stored Traces
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
error:
|
|
type: string
|
|
details:
|
|
type: string
|
|
example:
|
|
error: unsupported
|
|
details: No tracing store has been configured
|
|
parameters:
|
|
- name: type
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: string
|
|
- name: page
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
- name: limit
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
- name: values
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
/logs:
|
|
get:
|
|
summary: Quere Log Files
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
properties:
|
|
items:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
timestamp:
|
|
type: string
|
|
level:
|
|
type: string
|
|
event:
|
|
type: string
|
|
event_id:
|
|
type: string
|
|
details:
|
|
type: string
|
|
total:
|
|
type: number
|
|
example:
|
|
data:
|
|
items:
|
|
- timestamp: "2025-01-05T14:06:29Z"
|
|
level: TRACE
|
|
event: HTTP request body
|
|
event_id: http.request-body
|
|
details:
|
|
listenerId = "http", localPort = 1443, remoteIp = ::1,
|
|
remotePort = 57223, contents = "", size = 0
|
|
- timestamp: "2025-01-05T14:06:29Z"
|
|
level: TRACE
|
|
event: Write batch operation
|
|
event_id: store.data-write
|
|
details: elapsed = 0ms, total = 2
|
|
- timestamp: "2025-01-05T14:06:29Z"
|
|
level: TRACE
|
|
event: Expression evaluation result
|
|
event_id: eval.result
|
|
details:
|
|
listenerId = "http", localPort = 1443, remoteIp = ::1,
|
|
remotePort = 57223, id = "server.http.allowed-endpoint", result
|
|
= "Integer(200)"
|
|
- timestamp: "2025-01-05T14:06:29Z"
|
|
level: DEBUG
|
|
event: HTTP request URL
|
|
event_id: http.request-url
|
|
details:
|
|
listenerId = "http", localPort = 1443, remoteIp = ::1,
|
|
remotePort = 57223, url = "/api/logs?page=1&limit=50&"
|
|
- timestamp: "2025-01-05T14:06:23Z"
|
|
level: TRACE
|
|
event: HTTP response body
|
|
event_id: http.response-body
|
|
details:
|
|
listenerId = "http", localPort = 1443, remoteIp = ::1,
|
|
remotePort = 57223, contents = "{"error":"unsupported","details":"No
|
|
tracing store has been configured"}", code = 200, size = 72
|
|
- timestamp: "2025-01-05T14:06:23Z"
|
|
level: DEBUG
|
|
event: Management operation not supported
|
|
event_id: manage.not-supported
|
|
details:
|
|
listenerId = "http", localPort = 1443, remoteIp = ::1,
|
|
remotePort = 57223, details = No tracing store has been configured
|
|
- timestamp: "2025-01-05T14:06:23Z"
|
|
level: TRACE
|
|
event: HTTP request body
|
|
event_id: http.request-body
|
|
details:
|
|
listenerId = "http", localPort = 1443, remoteIp = ::1,
|
|
remotePort = 57223, contents = "", size = 0
|
|
- timestamp: "2025-01-05T14:06:23Z"
|
|
level: TRACE
|
|
event: Write batch operation
|
|
event_id: store.data-write
|
|
details: elapsed = 0ms, total = 2
|
|
- timestamp: "2025-01-05T14:06:23Z"
|
|
level: TRACE
|
|
event: Expression evaluation result
|
|
event_id: eval.result
|
|
details:
|
|
listenerId = "http", localPort = 1443, remoteIp = ::1,
|
|
remotePort = 57223, id = "server.http.allowed-endpoint", result
|
|
= "Integer(200)"
|
|
- timestamp: "2025-01-05T14:06:23Z"
|
|
level: DEBUG
|
|
event: HTTP request URL
|
|
event_id: http.request-url
|
|
details:
|
|
listenerId = "http", localPort = 1443, remoteIp = ::1,
|
|
remotePort = 57223, url = "/api/telemetry/traces?page=1&type=delivery.attempt-start&limit=10&values=1&"
|
|
total: 100
|
|
parameters:
|
|
- name: page
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
- name: limit
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
/spam-filter/train/spam:
|
|
post:
|
|
summary: Train Spam Filter as Spam
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
nullable: true
|
|
example:
|
|
data:
|
|
requestBody:
|
|
content:
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
? "From: john@example.org\nTo: list@example.org\nSubject: Testing,
|
|
please ignore\nContent-Type: text/plain; charset"
|
|
: type: string
|
|
example:
|
|
? "From: john@example.org\nTo: list@example.org\nSubject: Testing, please
|
|
ignore\nContent-Type: text/plain; charset"
|
|
: "\"utf-8\"\nContent-Transfer-Encoding: 8bit\n\nTesting 1, 2, 3\n"
|
|
/spam-filter/train/ham:
|
|
post:
|
|
summary: Train Spam Filter as Ham
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
nullable: true
|
|
example:
|
|
data:
|
|
requestBody:
|
|
content:
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
? "From: john@example.org\nTo: list@example.org\nSubject: Testing,
|
|
please ignore\nContent-Type: text/plain; charset"
|
|
: type: string
|
|
example:
|
|
? "From: john@example.org\nTo: list@example.org\nSubject: Testing, please
|
|
ignore\nContent-Type: text/plain; charset"
|
|
: "\"utf-8\"\nContent-Transfer-Encoding: 8bit\n\nTesting 1, 2, 3\n"
|
|
/spam-filter/train/spam/{account_id}:
|
|
post:
|
|
summary: Train Account's Spam Filter as Spam
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
nullable: true
|
|
example:
|
|
data:
|
|
parameters:
|
|
- name: account_id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
requestBody:
|
|
content:
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
? "From: john@example.org\nTo: list@example.org\nSubject: Testing,
|
|
please ignore\nContent-Type: text/plain; charset"
|
|
: type: string
|
|
example:
|
|
? "From: john@example.org\nTo: list@example.org\nSubject: Testing, please
|
|
ignore\nContent-Type: text/plain; charset"
|
|
: "\"utf-8\"\nContent-Transfer-Encoding: 8bit\n\nTesting 1, 2, 3\n"
|
|
/spam-filter/train/ham/{account_id}:
|
|
post:
|
|
summary: Train Account's Spam Filter as Ham
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
nullable: true
|
|
example:
|
|
data:
|
|
parameters:
|
|
- name: account_id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
requestBody:
|
|
content:
|
|
application/x-www-form-urlencoded:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
? "From: john@example.org\nTo: list@example.org\nSubject: Testing,
|
|
please ignore\nContent-Type: text/plain; charset"
|
|
: type: string
|
|
example:
|
|
? "From: john@example.org\nTo: list@example.org\nSubject: Testing, please
|
|
ignore\nContent-Type: text/plain; charset"
|
|
: "\"utf-8\"\nContent-Transfer-Encoding: 8bit\n\nTesting 1, 2, 3\n"
|
|
/spam-filter/classify:
|
|
post:
|
|
summary: Test Spam Filter Classification
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
properties:
|
|
score:
|
|
type: number
|
|
tags:
|
|
type: object
|
|
properties:
|
|
FROM_NO_DN:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
SOURCE_ASN_15169:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
SOURCE_COUNTRY_US:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
MISSING_DATE:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
FROMHOST_NORES_A_OR_MX:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
MISSING_MIME_VERSION:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
FORGED_SENDER:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
SPF_NA:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
X_HDR_TO:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
HELO_IPREV_MISMATCH:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
X_HDR_CONTENT_TYPE:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
AUTH_NA:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
FORGED_RECIPIENTS:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
RBL_SENDERSCORE_REPUT_BLOCKED:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
RCVD_COUNT_ZERO:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
X_HDR_SUBJECT:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
X_HDR_FROM:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
RCPT_COUNT_ONE:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
MISSING_MID:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
TO_DOM_EQ_FROM_DOM:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
ARC_NA:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
RCVD_TLS_LAST:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
X_HDR_CONTENT_TRANSFER_ENCODING:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
HELO_NORES_A_OR_MX:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
TO_DN_NONE:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
FROM_NEQ_ENV_FROM:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
DMARC_NA:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
SINGLE_SHORT_PART:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
DKIM_NA:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: number
|
|
disposition:
|
|
type: object
|
|
properties:
|
|
action:
|
|
type: string
|
|
value:
|
|
type: string
|
|
example:
|
|
data:
|
|
score: 12.7
|
|
tags:
|
|
FROM_NO_DN:
|
|
action: allow
|
|
value: 0.0
|
|
SOURCE_ASN_15169:
|
|
action: allow
|
|
value: 0.0
|
|
SOURCE_COUNTRY_US:
|
|
action: allow
|
|
value: 0.0
|
|
MISSING_DATE:
|
|
action: allow
|
|
value: 1.0
|
|
FROMHOST_NORES_A_OR_MX:
|
|
action: allow
|
|
value: 1.5
|
|
MISSING_MIME_VERSION:
|
|
action: allow
|
|
value: 2.0
|
|
FORGED_SENDER:
|
|
action: allow
|
|
value: 0.3
|
|
SPF_NA:
|
|
action: allow
|
|
value: 0.0
|
|
X_HDR_TO:
|
|
action: allow
|
|
value: 0.0
|
|
HELO_IPREV_MISMATCH:
|
|
action: allow
|
|
value: 1.0
|
|
X_HDR_CONTENT_TYPE:
|
|
action: allow
|
|
value: 0.0
|
|
AUTH_NA:
|
|
action: allow
|
|
value: 1.0
|
|
FORGED_RECIPIENTS:
|
|
action: allow
|
|
value: 2.0
|
|
RBL_SENDERSCORE_REPUT_BLOCKED:
|
|
action: allow
|
|
value: 0.0
|
|
RCVD_COUNT_ZERO:
|
|
action: allow
|
|
value: 0.1
|
|
X_HDR_SUBJECT:
|
|
action: allow
|
|
value: 0.0
|
|
X_HDR_FROM:
|
|
action: allow
|
|
value: 0.0
|
|
RCPT_COUNT_ONE:
|
|
action: allow
|
|
value: 0.0
|
|
MISSING_MID:
|
|
action: allow
|
|
value: 2.5
|
|
TO_DOM_EQ_FROM_DOM:
|
|
action: allow
|
|
value: 0.0
|
|
ARC_NA:
|
|
action: allow
|
|
value: 0.0
|
|
RCVD_TLS_LAST:
|
|
action: allow
|
|
value: 0.0
|
|
X_HDR_CONTENT_TRANSFER_ENCODING:
|
|
action: allow
|
|
value: 0.0
|
|
HELO_NORES_A_OR_MX:
|
|
action: allow
|
|
value: 0.3
|
|
TO_DN_NONE:
|
|
action: allow
|
|
value: 0.0
|
|
FROM_NEQ_ENV_FROM:
|
|
action: allow
|
|
value: 0.0
|
|
DMARC_NA:
|
|
action: allow
|
|
value: 1.0
|
|
SINGLE_SHORT_PART:
|
|
action: allow
|
|
value: 0.0
|
|
DKIM_NA:
|
|
action: allow
|
|
value: 0.0
|
|
disposition:
|
|
action: allow
|
|
value:
|
|
"X-Spam-Result: ARC_NA (0.00),\r\n\tDKIM_NA (0.00),\r\n
|
|
\tFROM_NEQ_ENV_FROM (0.00),\r\n\tFROM_NO_DN (0.00),\r\n\tRBL_SENDERSCORE_REPUT_BLOCKED
|
|
(0.00),\r\n\tRCPT_COUNT_ONE (0.00),\r\n\tRCVD_TLS_LAST (0.00),\r
|
|
\n\tSINGLE_SHORT_PART (0.00),\r\n\tSPF_NA (0.00),\r\n\tTO_DN_NONE
|
|
(0.00),\r\n\tTO_DOM_EQ_FROM_DOM (0.00),\r\n\tRCVD_COUNT_ZERO
|
|
(0.10),\r\n\tFORGED_SENDER (0.30),\r\n\tHELO_NORES_A_OR_MX (0.30),\r
|
|
\n\tAUTH_NA (1.00),\r\n\tDMARC_NA (1.00),\r\n\tHELO_IPREV_MISMATCH
|
|
(1.00),\r\n\tMISSING_DATE (1.00),\r\n\tFROMHOST_NORES_A_OR_MX
|
|
(1.50),\r\n\tFORGED_RECIPIENTS (2.00),\r\n\tMISSING_MIME_VERSION
|
|
(2.00),\r\n\tMISSING_MID (2.50)\r\nX-Spam-Status: Yes, score=12.70\r\
|
|
\n"
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
message:
|
|
type: string
|
|
remoteIp:
|
|
type: string
|
|
ehloDomain:
|
|
type: string
|
|
authenticatedAs:
|
|
type: object
|
|
nullable: true
|
|
isTls:
|
|
type: boolean
|
|
envFrom:
|
|
type: string
|
|
envFromFlags:
|
|
type: number
|
|
envRcptTo:
|
|
type: array
|
|
items:
|
|
type: string
|
|
example:
|
|
message:
|
|
"From: john@example.org\nTo: list@example.org\nSubject: Testing,
|
|
please ignore\nContent-Type: text/plain; charset=\"utf-8\"\nContent-Transfer-Encoding:
|
|
8bit\n\nTesting 1, 2, 3\n"
|
|
remoteIp: 8.8.8.8
|
|
ehloDomain: foo.org
|
|
authenticatedAs:
|
|
isTls: true
|
|
envFrom: bill@foo.org
|
|
envFromFlags: 0
|
|
envRcptTo:
|
|
- john@example.org
|
|
/troubleshoot/token:
|
|
get:
|
|
summary: Obtain a Troubleshooting Token
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: string
|
|
example:
|
|
data: +bS1rCUcrjoEtl9f7Vz1P6daqVs4nywxa56bHltPIASijRFrj1JrwvHxJCWphPKs/////w8E8p21+AKunrX4AndlYg==
|
|
/troubleshoot/delivery/{recipient}:
|
|
get:
|
|
summary: Run Delivery Troubleshooting
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content: {}
|
|
parameters:
|
|
- name: recipient
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
- name: token
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: string
|
|
/troubleshoot/dmarc:
|
|
post:
|
|
summary: Run DMARC Troubleshooting
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
properties:
|
|
spfEhloDomain:
|
|
type: string
|
|
spfEhloResult:
|
|
type: object
|
|
properties:
|
|
type:
|
|
type: string
|
|
spfMailFromDomain:
|
|
type: string
|
|
spfMailFromResult:
|
|
type: object
|
|
properties:
|
|
type:
|
|
type: string
|
|
details:
|
|
type: object
|
|
nullable: true
|
|
ipRevResult:
|
|
type: object
|
|
properties:
|
|
type:
|
|
type: string
|
|
ipRevPtr:
|
|
type: array
|
|
items:
|
|
type: string
|
|
dkimResults:
|
|
type: array
|
|
items: {}
|
|
dkimPass:
|
|
type: boolean
|
|
arcResult:
|
|
type: object
|
|
properties:
|
|
type:
|
|
type: string
|
|
dmarcResult:
|
|
type: object
|
|
properties:
|
|
type:
|
|
type: string
|
|
dmarcPass:
|
|
type: boolean
|
|
dmarcPolicy:
|
|
type: string
|
|
elapsed:
|
|
type: number
|
|
example:
|
|
data:
|
|
spfEhloDomain: mx.google.com
|
|
spfEhloResult:
|
|
type: none
|
|
spfMailFromDomain: google.com
|
|
spfMailFromResult:
|
|
type: softFail
|
|
details:
|
|
ipRevResult:
|
|
type: pass
|
|
ipRevPtr:
|
|
- dns.google.
|
|
dkimResults: []
|
|
dkimPass: false
|
|
arcResult:
|
|
type: none
|
|
dmarcResult:
|
|
type: none
|
|
dmarcPass: false
|
|
dmarcPolicy: reject
|
|
elapsed: 200
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
remoteIp:
|
|
type: string
|
|
ehloDomain:
|
|
type: string
|
|
mailFrom:
|
|
type: string
|
|
body:
|
|
type: string
|
|
example:
|
|
remoteIp: 8.8.8.8
|
|
ehloDomain: mx.google.com
|
|
mailFrom: john@google.com
|
|
body:
|
|
"From: john@example.org\nTo: list@example.org\nSubject: Testing,
|
|
please ignore\nContent-Type: text/plain; charset=\"utf-8\"\nContent-Transfer-Encoding:
|
|
8bit\n\nTesting 1, 2, 3\n"
|
|
/reload:
|
|
get:
|
|
summary: Reload Settings
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
properties:
|
|
warnings:
|
|
type: object
|
|
properties: {}
|
|
errors:
|
|
type: object
|
|
properties: {}
|
|
example:
|
|
data:
|
|
warnings: {}
|
|
errors: {}
|
|
parameters:
|
|
- name: dry-run
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: string
|
|
/update/spam-filter:
|
|
get:
|
|
summary: Update Spam Filter
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
nullable: true
|
|
example:
|
|
data:
|
|
/update/webadmin:
|
|
get:
|
|
summary: Update WebAdmin
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
nullable: true
|
|
example:
|
|
data:
|
|
/store/reindex:
|
|
get:
|
|
summary: Request FTS Reindex
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
nullable: true
|
|
example:
|
|
data:
|
|
/store/purge/in-memory/default/bayes-global:
|
|
get:
|
|
summary: Delete Global Bayes Model
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
nullable: true
|
|
example:
|
|
data:
|
|
/settings/keys:
|
|
get:
|
|
summary: List Settings by Key
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
properties:
|
|
lookup.default.hostname:
|
|
type: string
|
|
example:
|
|
data:
|
|
lookup.default.hostname: mx.fr.email
|
|
parameters:
|
|
- name: prefixes
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: string
|
|
- name: keys
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: string
|
|
/settings/group:
|
|
get:
|
|
summary: List Settings by Group
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
properties:
|
|
total:
|
|
type: number
|
|
items:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
_id:
|
|
type: string
|
|
bind:
|
|
type: string
|
|
protocol:
|
|
type: string
|
|
example:
|
|
data:
|
|
total: 11
|
|
items:
|
|
- _id: http
|
|
bind: "[::]:1443"
|
|
protocol: http
|
|
- bind: "[::]:443"
|
|
_id: https
|
|
protocol: http
|
|
tls.implicit: "true"
|
|
- protocol: imap
|
|
bind: "[::]:143"
|
|
_id: imap
|
|
- bind: "[::]:1143"
|
|
tls.implicit: "false"
|
|
_id: imapnotls
|
|
protocol: imap
|
|
proxy.override: "false"
|
|
tls.override: "false"
|
|
tls.enable: "false"
|
|
socket.override: "false"
|
|
- bind: "[::]:993"
|
|
tls.implicit: "true"
|
|
protocol: imap
|
|
_id: imaptls
|
|
- bind: "[::]:110"
|
|
protocol: pop3
|
|
_id: pop3
|
|
- tls.implicit: "true"
|
|
_id: pop3s
|
|
protocol: pop3
|
|
bind: "[::]:995"
|
|
- protocol: managesieve
|
|
_id: sieve
|
|
bind: "[::]:4190"
|
|
- bind: "[::]:25"
|
|
_id: smtp
|
|
protocol: smtp
|
|
- _id: submission
|
|
bind: "[::]:587"
|
|
protocol: smtp
|
|
parameters:
|
|
- name: limit
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
- name: page
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
- name: suffix
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: string
|
|
- name: prefix
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: string
|
|
/settings/list:
|
|
get:
|
|
summary: List Settings
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
properties:
|
|
total:
|
|
type: number
|
|
items:
|
|
type: object
|
|
properties:
|
|
enable:
|
|
type: string
|
|
format:
|
|
type: string
|
|
limits.entries:
|
|
type: string
|
|
limits.entry-size:
|
|
type: string
|
|
limits.size:
|
|
type: string
|
|
refresh:
|
|
type: string
|
|
retry:
|
|
type: string
|
|
timeout:
|
|
type: string
|
|
url:
|
|
type: string
|
|
example:
|
|
data:
|
|
total: 9
|
|
items:
|
|
enable: "true"
|
|
format: list
|
|
limits.entries: "100000"
|
|
limits.entry-size: "512"
|
|
limits.size: "104857600"
|
|
refresh: 12h
|
|
retry: 1h
|
|
timeout: 30s
|
|
url: https://openphish.com/feed.txt
|
|
parameters:
|
|
- name: prefix
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: string
|
|
/settings:
|
|
post:
|
|
summary: Update Settings
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
nullable: true
|
|
example:
|
|
data:
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
type:
|
|
type: string
|
|
prefix:
|
|
type: string
|
|
example:
|
|
- type: clear
|
|
prefix: spam-filter.rule.stwt_arc_signed.
|
|
/account/crypto:
|
|
get:
|
|
summary: Obtain Encryption-at-Rest Settings
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
properties:
|
|
type:
|
|
type: string
|
|
example:
|
|
data:
|
|
type: disabled
|
|
post:
|
|
summary: Update Encryption-at-Rest Settings
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: number
|
|
example:
|
|
data: 1
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
type:
|
|
type: string
|
|
algo:
|
|
type: string
|
|
certs:
|
|
type: string
|
|
example:
|
|
type: pGP
|
|
algo: Aes256
|
|
certs:
|
|
"-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nxsFNBGTGHwkBEADRB5EEtfsnUwgF2ZRg6h1fp2E8LNhv4lb9AWersI8KNFoWM6qx\n
|
|
Bk/MfEpgILSPdW3g7PWHOxPV/hxjtStFHfbU/Ye5VvfbkU49faIPiw1V3MQJJ171\n
|
|
cN6kgMnABfdixNiutDkHP4f34ABrEqexX2myOP+btxL24gI/N9UpOD5PiKTyKR7i\n
|
|
GwNpi+O022rs/KvjlWR7iSJ4vk7bGFfTNHvWI6dZworey1tZoTIZ0CgvgMeB/F1q\n
|
|
OOa0FvrJdNYR227RpHmICqFqTptNZ2EfdkJ6QUXW7bZ9dWgL36ds9QPJOGcG3c5i\n
|
|
JebeX5YdJnniBefiWjfZElcqh/N6SqVuEwoTLyMCnMZ6gjNMn6tddwPH24kavZhT\n
|
|
p6+vhTHmyq8XBqK/XEt9r+clSfg2hi5s7GO7hQV+W26xRjX7sQJY41PfzkgYJ0BM\n
|
|
6+w09X1ZO/iMjEp44t2rd3xSudwGYhlbazXbdB+OJaa3RtyjOAeFgY8OyNlODx3V\n
|
|
xXLtF+104HGSL7nkpBsu6LLighSgEEF2Vok43grr0omyb1NPhWoAZhM8sT5iv5gW\n
|
|
fKvB1O13c+hDc/iGTAvcrtdLLnF2Cs+6HD7r7zPPM4L6DrD1+oQt510H/oOEE5NZ\n
|
|
wIS9CmBf0txqwk7n1U5V95lonaCK9nfoKeQ1fKl/tu01dCeERRbMXG2nCQARAQAB\n
|
|
zRtKb2huIERvZSA8am9obkBleGFtcGxlLm9yZz7CwYcEEwEIADEWIQQWwx1eM+Aa\n
|
|
o8okGzL45grMTSggxQUCZMYfCQIbAwQLCQgHBRUICQoLBRYCAwEAAAoJEPjmCsxN\n
|
|
KCDFWP4QAI3eS5nPxmU0AC9/h8jeKNgjgpENroNQZKeWZQ8x4PfncDRkcbsJfT7Y\n
|
|
IVZl4zw6gFKY5EoB1s1KkYJxPgYsqicmKNiR7Tnzabb3mzomU48FKaIyVCBzFUnJ\n
|
|
YMroL/rm7QhoW2WWLvT+CPCPway/tA3By8Be/YOjhavJ8mf1W3rPzt87/4Vo6erf\n
|
|
yzL0lN+FQmmhKfT4j42jF4SMSyyC2yzvfC7PT49u+KUKQm/LpQsfKHpwXZ/VI6+X\n
|
|
GtZjTqsc+uglJYRo69oosImLzieA/ST1ltjmUutZQOSvlQFpDUEFrMej8XZ0qsrf\n
|
|
0gP2iwxyl0vkhV8c6wO6CacDHPivvQEHed9H1PNGn3DBfKb7Mq/jado2DapRtJg3\n
|
|
2OH0F0HTvQ0uNKl30xMUcwGQB0cKOlaFtksZT1LsosQPhtPLpFy1TuWaXOInpQLq\n
|
|
JmNVcTbydOsCKq0mb6bgGcvhElC1q39tclKP3rOEDOnJ8hE6wYNaMGrt6WSKr3Tt\n
|
|
h52M6KwTXOuMAecMvpDBSS3UFEVQ+T5puzInDTkjINxmj23ip+swA1x3HH2IgNrO\n
|
|
VJ7O20oEf0+qC47R5rTRUxrvh/U0U3DRE5xt2J2T3xetFDT2mnQv0jcyMg/UlXXv\n
|
|
GpGVfwNkvN0Cxmb1tFiBNLKCcPVizxq4MLrwx+MVfQBaRCwjJrUszsFNBGTGHwoB\n
|
|
EACr5lA+j5pH0Er6Q76btbS4q9JgNjDNrjKJwX9brdBY1oXIUeBqCW9ekoqDTFpn\n
|
|
xA5EFGJvPO++/0ZCa+zXE4IAcXS9+I9HVBouenPYBLETnXK0Phws+OCLoe0cAIvG\n
|
|
e9Xo9VrHcGXCs9tJruVSAW3NF04YejHmnHNfEuD8mbaUdxVn5zc23w/2gLaY/ABL\n
|
|
ZfNV8XZw0jBVBm3YXS3Ob3uIO+RvsNqBgnhGYN/C51QI9hdxXWUDlD1vdRacXmcI\n
|
|
LDCYC3w6u8caxL0ktXTS4zwN+hEu7jHxBNiKcovCeIF5VZ5NcPpp6+6Y+vNdmmXw\n
|
|
+lWNwAzj3ah6iu+y25LKSsz+7IkCh5liOwwYohO+YI7SjtTD+gL9HiHYAIO+PtBh\n
|
|
7GudmUwFoARu/q54hE4ThpzkeOzJzPqGkM/CzmwdKKM3u81ze+72ptJOqVKbFEsQ\n
|
|
3+RURrIAfyYyeJj4VVCfHNzrRRVpARZc9hJm1AXefxPnDN9dxbikjQgbg5UxrKaJ\n
|
|
cjVU+go5CH5lg2D1LRGfKqTJtfiWFPjtztNgMp/SeslkhhFXsyJ0RJDcU8VfRBrO\n
|
|
DBnZvPnZi4nLaWCL1LdHA8Y9EJgSwVOsfdRqL/Xk9qxqgl5R8m8lsNKZN2EYkfMN\n
|
|
4Vd+/8UBbmibHYoGIQi7UlNSPthc0XQcRzFen+3H4sg5kQARAQABwsF2BBgBCAAg\n
|
|
FiEEFsMdXjPgGqPKJBsy+OYKzE0oIMUFAmTGHwsCGwwACgkQ+OYKzE0oIMXn4hAA\n
|
|
lUWeF7tDdyENsOYyhsbtLIuLipYe6orHFY5m68NNOoLWwqEeTvutJgFeDT4WxYi0\n
|
|
PJaNQYFPyGVyg7N0hCx5cGwajdnwGpb5zpSNyvG2Yes9I1O/u7+FFrbSwOuo61t1\n
|
|
scGa8YlgTKoyGc9cwxl5U8krrlEwXTWQ/qF1Gq2wHG23wm1D2d2PXFDRvw3gPxJn\n
|
|
yWkrx5k26ru1kguM7XFVyRi7B+uG4vdvMlxMBXM3jpH1CJRr82VvzYPv7f05Z5To\n
|
|
C7XDqHpWKx3+AQvh/ZsSBpBhzK8qaixysMwnawe05rOPydWvsLlnMCGManKVnq9Y\n
|
|
Wek1P2dwYT9zuroBR5nmrECY+xVWk7vhsDasKsYlQ/LdDyzSL7qh0Vq3DjcoHxLI\n
|
|
uL7qQ3O0YRcKGfmQibpKdDzvIqA+48Nfh2nDnTxvfuwOxb41zdLTZQftaSXc0Xwd\n
|
|
HgquBAFbRDr5TyWlUUc8iACowKkk01pEPc8coxPCp6F/hz6kgmebRevzs7sxwrS7\n
|
|
aUWycSls783JC7WO267DRD30FNx+9S7SY4ECzhDGjLdne6wIoib1L9SFkk1AAKb3\n
|
|
m2+6BB/HxCXtMqi95pFeCjV99bp+PBqoifx9SlFYZq9qcGDr/jyrdG8V2Wf/HF4n\n
|
|
K8RIPxB+daAPMLTpj4WBhNquSE6mRQvABEf0GPi2eLA=\n=0TDv\n-----END PGP
|
|
PUBLIC KEY BLOCK-----\n\n\n"
|
|
/account/auth:
|
|
get:
|
|
summary: Obtain Account Authentication Settings
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
properties:
|
|
otpEnabled:
|
|
type: boolean
|
|
appPasswords:
|
|
type: array
|
|
items: {}
|
|
example:
|
|
data:
|
|
otpEnabled: false
|
|
appPasswords: []
|
|
post:
|
|
summary: Update Account Authentication Settings
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
error:
|
|
type: string
|
|
details:
|
|
type: string
|
|
reason:
|
|
type: object
|
|
nullable: true
|
|
example:
|
|
error: other
|
|
details: Fallback administrator accounts do not support 2FA or AppPasswords
|
|
reason:
|
|
"401":
|
|
description: Unauthorized
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
type:
|
|
type: string
|
|
status:
|
|
type: number
|
|
title:
|
|
type: string
|
|
detail:
|
|
type: string
|
|
example:
|
|
type: about:blank
|
|
status: 401
|
|
title: Unauthorized
|
|
detail: You have to authenticate first.
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
type:
|
|
type: string
|
|
name:
|
|
type: string
|
|
password:
|
|
type: string
|
|
example:
|
|
- type: addAppPassword
|
|
name: dGVzdCQyMDI1LTAxLTA1VDE0OjEyOjUxLjg0NyswMDowMA==
|
|
password: $6$4M/5LmG7b13r0cdE$6zb.i6wJ3pAQHA2MRHkKg0t8bgSYb2IeqiIU115t.NugwW6VXifE0VKI5n2BQUNwdeDMUzaX82TmhuVVgC0Gx1
|
|
/reload/:
|
|
get:
|
|
summary: Reload Settings
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
properties:
|
|
warnings:
|
|
type: object
|
|
properties: {}
|
|
errors:
|
|
type: object
|
|
properties: {}
|
|
example:
|
|
data:
|
|
warnings: {}
|
|
errors: {}
|
|
/queue/status/stop:
|
|
patch:
|
|
summary: Stop Queue Processing
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: boolean
|
|
example:
|
|
data: true
|
|
/queue/status/start:
|
|
patch:
|
|
summary: Resume Queue Processing
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: boolean
|
|
example:
|
|
data: false
|
|
/queue/messages/{message_id}:
|
|
get:
|
|
summary: Obtain Queued Message Details
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: number
|
|
return_path:
|
|
type: string
|
|
domains:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
name:
|
|
type: string
|
|
status:
|
|
type: string
|
|
recipients:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
address:
|
|
type: string
|
|
status:
|
|
type: string
|
|
retry_num:
|
|
type: number
|
|
next_retry:
|
|
type: string
|
|
next_notify:
|
|
type: string
|
|
expires:
|
|
type: string
|
|
created:
|
|
type: string
|
|
size:
|
|
type: number
|
|
blob_hash:
|
|
type: string
|
|
example:
|
|
data:
|
|
id: 217700302698266624
|
|
return_path: pepe@pepe.com
|
|
domains:
|
|
- name: example.org
|
|
status: scheduled
|
|
recipients:
|
|
- address: john@example.org
|
|
status: scheduled
|
|
retry_num: 0
|
|
next_retry: "2025-01-05T14:33:15Z"
|
|
next_notify: "2025-01-06T14:33:15Z"
|
|
expires: "2025-01-10T14:33:15Z"
|
|
created: "2025-01-05T14:33:15Z"
|
|
size: 1451
|
|
blob_hash: ykrZ_KghvdG2AdjH4AZajkSvZvcsxP_oI2HEZvw-tS0
|
|
"404":
|
|
description: Not Found
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
type:
|
|
type: string
|
|
status:
|
|
type: number
|
|
title:
|
|
type: string
|
|
detail:
|
|
type: string
|
|
example:
|
|
type: about:blank
|
|
status: 404
|
|
title: Not Found
|
|
detail: The requested resource does not exist on this server.
|
|
parameters:
|
|
- name: message_id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
patch:
|
|
summary: Reschedule Delivery of Queued Message
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: boolean
|
|
example:
|
|
data: true
|
|
parameters:
|
|
- name: message_id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
delete:
|
|
summary: Cancel Delivery of Queued Message
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: boolean
|
|
example:
|
|
data: true
|
|
parameters:
|
|
- name: message_id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
/store/blobs/{blob_id}:
|
|
get:
|
|
summary: Fetch Blob by ID
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content: {}
|
|
parameters:
|
|
- name: blob_id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
- name: limit
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
/telemetry/trace/{trace_id}:
|
|
get:
|
|
summary: Obtain Trace Details
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
text:
|
|
type: string
|
|
details:
|
|
type: string
|
|
createdAt:
|
|
type: string
|
|
type:
|
|
type: string
|
|
data:
|
|
type: object
|
|
properties:
|
|
listenerId:
|
|
type: string
|
|
localPort:
|
|
type: number
|
|
remoteIp:
|
|
type: string
|
|
remotePort:
|
|
type: number
|
|
example:
|
|
data:
|
|
- text: SMTP connection started
|
|
details: A new SMTP connection was started
|
|
createdAt: "2025-01-05T14:34:50Z"
|
|
type: smtp.connection-start
|
|
data:
|
|
listenerId: smtp
|
|
localPort: 25
|
|
remoteIp: ::1
|
|
remotePort: 57513
|
|
- text: SMTP EHLO command
|
|
details: The remote server sent an EHLO command
|
|
createdAt: "2025-01-05T14:34:50Z"
|
|
type: smtp.ehlo
|
|
data:
|
|
domain: test.eml
|
|
- text: SPF EHLO check failed
|
|
details: EHLO identity failed SPF check
|
|
createdAt: "2025-01-05T14:34:50Z"
|
|
type: smtp.spf-ehlo-fail
|
|
data:
|
|
domain: test.eml
|
|
result:
|
|
type: spf.none
|
|
text: No SPF record
|
|
details: No SPF record was found
|
|
data: {}
|
|
elapsed: 24
|
|
- text: IPREV check passed
|
|
details: Reverse IP check passed
|
|
createdAt: "2025-01-05T14:34:50Z"
|
|
type: smtp.iprev-pass
|
|
data:
|
|
domain: test.eml
|
|
result:
|
|
type: iprev.pass
|
|
text: IPREV check passed
|
|
details: The IPREV check has passed
|
|
data:
|
|
details:
|
|
- localhost.
|
|
elapsed: 0
|
|
- text: SPF From check failed
|
|
details: MAIL FROM identity failed SPF check
|
|
createdAt: "2025-01-05T14:34:50Z"
|
|
type: smtp.spf-from-fail
|
|
data:
|
|
domain: test.eml
|
|
from: pepe@pepe.com
|
|
result:
|
|
type: spf.none
|
|
text: No SPF record
|
|
details: No SPF record was found
|
|
data: {}
|
|
elapsed: 18
|
|
- text: SMTP MAIL FROM command
|
|
details: The remote client sent a MAIL FROM command
|
|
createdAt: "2025-01-05T14:34:50Z"
|
|
type: smtp.mail-from
|
|
data:
|
|
from: pepe@pepe.com
|
|
- text: SMTP RCPT TO command
|
|
details: The remote client sent an RCPT TO command
|
|
createdAt: "2025-01-05T14:34:50Z"
|
|
type: smtp.rcpt-to
|
|
data:
|
|
to: john@example.org
|
|
- text: DKIM verification failed
|
|
details: Failed to verify DKIM signature
|
|
createdAt: "2025-01-05T14:34:50Z"
|
|
type: smtp.dkim-fail
|
|
data:
|
|
strict: false
|
|
result: []
|
|
elapsed: 0
|
|
- text: ARC verification passed
|
|
details: Successful ARC verification
|
|
createdAt: "2025-01-05T14:34:50Z"
|
|
type: smtp.arc-pass
|
|
data:
|
|
strict: false
|
|
result:
|
|
type: dkim.none
|
|
text: No DKIM signature
|
|
details: No DKIM signature was found
|
|
data: {}
|
|
elapsed: 0
|
|
- text: DMARC check failed
|
|
details: Failed to verify DMARC policy
|
|
createdAt: "2025-01-05T14:34:50Z"
|
|
type: smtp.dmarc-fail
|
|
data:
|
|
strict: false
|
|
domain: example.org
|
|
policy: reject
|
|
result:
|
|
type: dmarc.none
|
|
text: No DMARC record
|
|
details: No DMARC record was found
|
|
data: {}
|
|
elapsed: 0
|
|
parameters:
|
|
- name: trace_id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
/telemetry/live/tracing-token:
|
|
get:
|
|
summary: Request a Tracing Token
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: string
|
|
example:
|
|
data: VLxkixOwgDF8Frj0wi8kPhx3SpzKqtsDvbo25wgKw2tBIz/O8La0dwioQw9pN11c/////w8Ctau1+ALxq7X4AndlYg==
|
|
/telemetry/traces/live:
|
|
get:
|
|
summary: Start Live Tracing
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content: {}
|
|
parameters:
|
|
- name: filter
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: string
|
|
- name: token
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: string
|
|
/dns/records/{domain}:
|
|
get:
|
|
summary: Obtain DNS Records for Domain
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
type:
|
|
type: string
|
|
name:
|
|
type: string
|
|
content:
|
|
type: string
|
|
example:
|
|
data:
|
|
- type: MX
|
|
name: example.org.
|
|
content: 10 mx.fr.email.
|
|
- type: CNAME
|
|
name: mail.example.org.
|
|
content: mx.fr.email.
|
|
- type: TXT
|
|
name: 202501e._domainkey.example.org.
|
|
content: v=DKIM1; k=ed25519; h=sha256; p=82LqzMGRHEBI2HGDogjojWGz+Crrv0TAi8pcaOBd1vw=
|
|
- type: TXT
|
|
name: 202501r._domainkey.example.org.
|
|
content: v=DKIM1; k=rsa; h=sha256;
|
|
p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu1qtCbIlrZffIqm7gHqpihPUlxOq1zD6K3j1RO/enhkZRp5dEdCqcLbyFk5d+rqRsVIWwUZiU4HXHWqMTN1hlKojUlzmU1JYtlHRMwtM5vN4mzG4x1KA0i8ZHxkahE8ITsP+kPByDF9x0vAySHXpyErNXq3BeFyu/VW+6X+fmUW6x39PfWq7kQQTcwU0Ogo447oJfmAX9H4Z+/cD5WJVNiLgvLY6faVgoXm0mJJjRU5xoEStXoUcKwrwbl7G3K7JfxtmWsgEn97auV6v4he2LRRfTxbY9smkqUtcJs61E9iyyYroJv0iRda2pv71qg8e4wTb2sqBloZv/F2FZQhM+wIDAQAB
|
|
- type: TXT
|
|
name: example.org.
|
|
content: v=spf1 mx ra=postmaster -all
|
|
- type: SRV
|
|
name: _jmap._tcp.example.org.
|
|
content: 0 1 443 mx.fr.email.
|
|
- type: SRV
|
|
name: _imaps._tcp.example.org.
|
|
content: 0 1 993 mx.fr.email.
|
|
- type: SRV
|
|
name: _imap._tcp.example.org.
|
|
content: 0 1 143 mx.fr.email.
|
|
- type: SRV
|
|
name: _imap._tcp.example.org.
|
|
content: 0 1 1143 mx.fr.email.
|
|
- type: SRV
|
|
name: _pop3s._tcp.example.org.
|
|
content: 0 1 995 mx.fr.email.
|
|
parameters:
|
|
- name: domain
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
/store/purge/account/{account_id}:
|
|
get:
|
|
summary: Purge Account
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
nullable: true
|
|
example:
|
|
data:
|
|
parameters:
|
|
- name: account_id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
/store/purge/in-memory/default/bayes-account/{account_id}:
|
|
get:
|
|
summary: Delete Bayes Model for Account
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
nullable: true
|
|
example:
|
|
data:
|
|
parameters:
|
|
- name: account_id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
/store/undelete/{account_id}:
|
|
get:
|
|
summary: List Deleted Messages
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
properties:
|
|
items:
|
|
type: array
|
|
items: {}
|
|
total:
|
|
type: number
|
|
example:
|
|
data:
|
|
items: []
|
|
total: 0
|
|
parameters:
|
|
- name: account_id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
- name: limit
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
- name: page
|
|
in: query
|
|
required: false
|
|
schema:
|
|
type: number
|
|
post:
|
|
summary: Undelete Messages
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
type:
|
|
type: string
|
|
example:
|
|
data:
|
|
- type: success
|
|
parameters:
|
|
- name: account_id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
requestBody:
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
type: object
|
|
properties:
|
|
hash:
|
|
type: string
|
|
collection:
|
|
type: string
|
|
restoreTime:
|
|
type: string
|
|
cancelDeletion:
|
|
type: string
|
|
example:
|
|
- hash: 9pDYGrkDlLYuBNl062qhi0wStnDYyq4ZWalnj2vXbLY
|
|
collection: email
|
|
restoreTime: "2025-01-05T14:50:13Z"
|
|
cancelDeletion: "2025-02-04T14:50:13Z"
|
|
/queue/status:
|
|
get:
|
|
summary: Obtain Queue Status
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: boolean
|
|
example:
|
|
data: true
|
|
/store/purge/blob:
|
|
get:
|
|
summary: Purge Blob Store
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
nullable: true
|
|
example:
|
|
data:
|
|
/store/purge/data:
|
|
get:
|
|
summary: Purge Data Store
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
nullable: true
|
|
example:
|
|
data:
|
|
/store/purge/in-memory:
|
|
get:
|
|
summary: Purge In-Memory Store
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
nullable: true
|
|
example:
|
|
data:
|
|
/store/purge/account:
|
|
get:
|
|
summary: Purge All Accounts
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: object
|
|
nullable: true
|
|
example:
|
|
data:
|
|
/store/uids/{account_id}:
|
|
delete:
|
|
summary: Reset IMAP UIDs for Account
|
|
responses:
|
|
"200":
|
|
description: OK
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
data:
|
|
type: array
|
|
items:
|
|
type: number
|
|
example:
|
|
data:
|
|
- 0
|
|
- 0
|
|
parameters:
|
|
- name: account_id
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|