이메일, 받은편지함 및 도메인용
스팸 검사 API
실제 메시지 하나를 보내거나 도메인만 알려주세요. 모든 결과는 JSON으로 반환됩니다.
키도 계정도 필요 없습니다.
요청
# reserve a single-use address
$ curl -sX POST '.../api/v1/inbox?lang=en'
# send your message to that address, then
$ curl -s '.../api/v1/tests/k7m2x9qplw4tz8vn3b6c/status'
# read the report
$ curl -s '.../api/v1/tests/k7m2x9qplw4tz8vn3b6c'
응답
200 OK
{
"address": "test-k7m2x9qplw4tz8vn3b6c@t.email-spam-tester.com",
"slug": "k7m2x9qplw4tz8vn3b6c",
"expires_at": "2026-10-31T13:00:00Z"
}200 OK
{
"analysis_status": "checks_ready",
"ai_status": "running",
"checks_done": 42,
"checks_total": 42
}200 OK
{
"score_ours": 86.4,
"score_compat": 9.2,
"subscores": {"auth": 100.0, "infra_spam": 78.1, "content": 92.0},
"complete": true,
"checks": [{"id": "auth.dmarc", "status": "warn"}],
"fixes": [{"id": "dmarc-enforce", "gain_ours": 4.0}]
}요청
# create a test
$ curl -sX POST '.../api/v1/placement' \
-d '{"public_results_accepted":true}'
# put the marker in the subject, send once to all, then
$ curl -s '.../api/v1/placement/wR3kP9xLq2vT8mZc'
응답
201 Created
{
"marker": "est-3f9a1c7e2b4d6a80c5e1f2d3",
"status": "waiting",
"results": [{"provider": "gmail", "placement": "pending"}],
"fleet": {"status": "observing", "results": [
{"provider": "yahoo", "placement": "pending"},
{"provider": "outlook", "placement": "pending"}
]}
}200 OK
{
"status": "complete",
"results": [{"provider": "gmail", "placement": "primary"}],
"fleet": {"status": "finished", "results": [
{"provider": "yahoo", "placement": "inbox"},
{"provider": "outlook", "placement": "spam"}
]}
}요청
# no email needed, one GET
$ curl -s '.../api/v1/infra/check?domain=example.com'
# compare with your last run
$ curl -s '.../api/v1/infra/check?domain=example.com&diff=true' \
| jq '.diff'
응답
200 OK
{
"domain": "example.com",
"ok": false,
"status": "fail",
"score": 78,
"coverage": {"answered": 7, "total": 8},
"sections": {"ptr": {"status": "fail", "core": true}}
}200 OK
{
"changed": true,
"worsened": true,
"status_from": "pass",
"score_from": 100,
"changes": [{"path": "dkim.key.mail.sha256", "kind": "removed",
"severity": "critical", "effect": "worsened"}]
}이 페이지의 내용
이메일 테스트
실제 메시지 하나의 콘텐츠, 서명, 헤더 및 메시지를 보낸 서버까지 전체를 검사합니다. 점수, 수정 사항 목록 및 그 근거가 되는 모든 검사 결과를 확인할 수 있습니다.
빠른 시작
호출 세 번. 키도, 계정도, 가입도 필요 없습니다. 요청 두 번과 이메일 한 통입니다. 분석에 몇 초가 걸리기 때문에 세 번째 호출이 필요합니다.
주소 예약
받은편지함 엔드포인트에 POST합니다. 정확히 한 개의 메시지를 수신하고 한 시간 후 만료되는 주소와, 나머지 모든 항목의 키로 사용되는 슬러그를 받습니다.
요청
# 1. reserve a single-use address curl -sX POST 'https://email-spam-tester.com/api/v1/inbox?lang=en'응답
{ "address": "test-<slug>@t.email-spam-tester.com", "slug": "<slug>", "expires_at": "2026-01-01T12:00:00Z" }실제 메시지 전송
캠페인을 전송할 플랫폼에서 SMTP를 통해 보냅니다. 검사 항목 중 절반은 전송 플랫폼이 추가하는 헤더를 확인하므로, 직접 작성한 메시지를 사용하면 잘못된 항목을 측정하게 됩니다.
요청
# 2. send your message to that address, from your own platform To: test-<slug>@t.email-spam-tester.com상태 폴링 후 보고서 확인
상태 엔드포인트의 응답은 수백 바이트이며 전체 보고서를 가져올 준비가 되었는지 알려 줍니다. 보고서 자체는 수천 줄에 달합니다.
요청
# 3. poll curl -s 'https://email-spam-tester.com/api/v1/tests/<slug>/status'응답
{ "slug": "<slug>", "analysis_status": "checks_ready", "ai_status": "running", "checks_done": 42, "checks_total": 42 }요청
# 4. read the report once analysis_status is checks_ready curl -s 'https://email-spam-tester.com/api/v1/tests/<slug>'응답
{ "report_url": "https://email-spam-tester.com/t/<slug>", "score_ours": 86.4, "score_compat": 9.2, "subscores": {"auth": 100.0, "infra_spam": 78.1, "content": 92.0, "compliance": 75.0}, "complete": true, "checks": [ { "id": "auth.dmarc", "status": "warn", "title": "DMARC result", "summary": "DMARC passes, but the policy is p=none.", "weight_ours": -4.0, "evidence": {"policy": "none", "aligned": "dkim"}, "citations": {"standards": [{"title": "RFC 9989 §4.7", "quote": "..."}]} } ], "fixes": [ {"id": "dmarc-enforce", "gain_ours": 4.0, "gain_compat": 0.0, "fix": {"title": "Move DMARC to quarantine", "severity": "medium"}} ] }
주소를 예약하고, 목록에 보내려던 메시지를 보낸 다음, 보고서를 확인합니다. 점수, 근거가 포함된 42개 검사 전체, 각 결과의 근거가 되는 표준 섹션을 포함하여 페이지에 표시되는 모든 내용이 JSON에 들어 있습니다.
처음 100,000개의 보고서는 키와 계정 없이 무료입니다. 스크립트가 아니라 에이전트를 연결하는 경우에는 폴링보다 MCP 서버가 더 적합합니다.
엔드포인트
기본 주소는 https://email-spam-tester.com입니다. 모든 응답은 JSON입니다.
POST/api/v1/inbox
일회용 주소를 예약합니다. 두 매개변수 모두 선택 사항입니다.
| lang | 수정 계획과 검사별 결과가 작성될 언어를 ISO 코드로 지정합니다. 메시지는 몇 분 뒤 SMTP를 통해 도착하며 누가 기다리고 있는지에 대한 정보가 없으므로 지금 결정합니다. 알 수 없는 코드는 영어로 대체됩니다. |
| utm_source, utm_medium, utm_campaign | 분석 시스템으로 그대로 전달됩니다. 자체 통합을 측정하는 경우 유용합니다. |
GET/api/v1/tests/{slug}/status
부담 없이 폴링할 수 있습니다. 두 상태 필드와 검사 진행 정도만 반환합니다.
GET/api/v1/tests/{slug}
전체 보고서입니다. 주소가 예약된 상태이고 아직 아무것도 도착하지 않았으면 202로 응답하고, 도착한 뒤에는 200으로 응답합니다.
GET/api/v1/tests/{slug}/message
전달된 그대로의 메시지입니다. 전송 순서의 모든 헤더, 두 본문, 첨부 파일 목록과 원시 소스를 포함합니다. 보고서는 폴링되고 이것은 최대 1메가바이트에 달할 수 있으므로 별도로 가져옵니다.
PUT/api/v1/tests/{slug}/locale
아직 사용되지 않은 예약의 언어를 변경합니다. 이미 주소를 요청한 후 사용자가 읽는 언어를 알게 되는 에이전트를 위한 기능입니다. 메시지가 도착한 후에는 분석이 실행 중이므로 거부됩니다.
받은편지함 배치베타
테스트 받은편지함 목록으로 메시지 하나를 보내고 Gmail, Outlook, Yahoo 및 기타 제공업체에서 받은편지함, 프로모션 또는 스팸 중 어디에 도착했는지 확인하세요.
빠른 시작
테스트 생성
배치 엔드포인트에 POST 요청을 보내세요. 마커와 테스트 받은편지함이 반환됩니다.
요청
# 1. create a test curl -sX POST 'https://email-spam-tester.com/api/v1/placement' \ -H 'Content-Type: application/json' \ -d '{"public_results_accepted":true}'응답
{ "slug": "<slug>", "marker": "est-3f9a1c7e2b4d6a80c5e1f2d3", "status": "waiting", "deadline": "2026-10-31T12:30:00Z", "poll_after_seconds": 60, "results": [ {"address": "<seed>", "provider": "gmail", "kind": "Gmail", "placement": "pending", "observed_at": null} ], "fleet": { "status": "observing", "results": [ {"address": "<mailbox>", "provider": "yahoo", "available": true, "placement": "pending", "coverage": "pending"} ] } }모든 받은편지함에 메시지 하나 보내기
제목에 마커를 넣고 평소 사용하는 플랫폼에서 모든 주소로 한 번에 보내세요.
요청
# 2. one message to every address, with the marker in the subject Subject: October invoice est-3f9a1c7e2b4d6a80c5e1f2d3 To: <seed>, <mailbox>, ...폴더 폴링
각 주소에 제공업체와 폴더 정보가 채워집니다. 상태가 waiting이 아닐 때까지 폴링하세요.
요청
# 3. poll for the folders curl -s 'https://email-spam-tester.com/api/v1/placement/<slug>'응답
{ "status": "complete", "received": 2, "total": 2, "results": [ {"address": "<seed>", "provider": "gmail", "kind": "Gmail", "placement": "primary", "observed_at": "2026-10-31T12:04:11Z"}, {"address": "<seed>", "provider": "gmail", "kind": "Google Workspace", "placement": "promotions", "observed_at": "2026-10-31T12:04:11Z"} ], "fleet": { "status": "finished", "results": [ {"address": "<mailbox>", "provider": "yahoo", "available": true, "placement": "inbox", "coverage": "ok"}, {"address": "<mailbox>", "provider": "outlook", "available": true, "placement": "spam", "coverage": "ok"} ] } }
엔드포인트
An optional test using public GMass seed inboxes and available project test mailboxes, alone or alongside the email score. Explain to the sender that GMass receives their email and publishes its subject, sender name and placement before creating a test. Use all test mailboxes for non-confidential test messages only.
GET /api/v1/placement/availability
Returns providers: the provider identifiers of currently healthy,
admitted project mailboxes. No addresses or credentials are exposed. This read does
not create a test or contact GMass. Actual recipients are allocated at creation and
may differ as availability or capacity changes.
POST /api/v1/placement
Send JSON {"public_results_accepted":true}. Returns HTTP 201 with
slug, marker, results (the seed addresses),
deadline and expires_at. Limit: 20 tests per IP per UTC day.
For one-send combined testing, first reserve an email score address and include
its score_slug in the placement creation JSON. Repeated creation for
that score returns the same placement test. Send the marked email to the score
address, every returned seed and every available fleet.results address;
keep the main /t/<score_slug>
report link. Creating a link after the score address was used or expired returns HTTP 409.
GET /api/v1/placement/by-score/{score_slug}
Read and refresh the placement run attached to the main email test. The response has the same format and polling limits as the standalone endpoint below. HTTP 404 means placement was not included or its stored results have been removed.
GET /api/v1/placement/{slug}
Use poll_after_seconds (normally 60 seconds) while the page is open.
Upstream errors trigger a shared cooldown. Add the marker to the subject and
send through the sender's normal platform to every seed. Observations are saved for
30 days. Collection ends after 30 minutes or when all seeds have results.
status: waiting, complete or timed_out. Each result has an address,
provider, kind, placement and observed_at. Placement is primary, promotions, inbox,
updates, social, forums, spam, unknown, pending or not_observed. Missing results do
not mean Spam; Promotions is an inbox category. provider_error indicates
an upstream outage without discarding saved observations. HTTP 404 means unknown,
410 expired, 429 quota exhausted, and 503 no test inboxes available at creation.
The optional fleet object contains independently collected project
mailbox results, with status observing, settling or finished. Refresh
every 30 seconds until it finishes, even when Gmail has completed. Each fleet result
includes address, provider, available,
placement, category and coverage. Exclude
unavailable addresses from new sends; retain their saved observations. Category
data may be unavailable even when the physical folder is known.
If GMass is unavailable at creation but project mailboxes can be allocated,
provider is fleet and the top-level seed results are empty.
Use fleet.results; do not interpret an empty Gmail list as successful
delivery. Existing runs never gain new recipient addresses silently.
인프라 검사
한 번의 GET으로 아무것도 전송하지 않고 도메인의 메일 설정을 검사하며, 결과를 보관하고 마지막 실행 이후 변경된 내용을 알려드립니다. 키는 필요하지 않습니다. cron에서는 도메인이 손상되었거나 설정이 중요한 방식으로 변경된 경우 아래 줄이 0이 아닌 값으로 종료됩니다.
빠른 시작
GET 요청을 한 번 보내세요
도메인을 전달하세요. ip에는 발신 주소를 추가하고, selector에는 조회할 DKIM 셀렉터를 지정하세요.
요청
curl -s 'https://email-spam-tester.com/api/v1/infra/check?domain=example.com&selector=mail&diff=true'판정 결과를 확인하세요
ok는 스크립트용 응답이며, sections는 어느 부분이 실패했는지 보여줍니다.
응답
{ "id": "ir_01JB8Y4T2M6K9QZ7H3V5N1XWDA", "domain": "example.com", "checked_at": "2026-10-31T12:00:00Z", "ok": false, "status": "fail", "score": 78, "coverage": {"answered": 7, "total": 8}, "ips": [{"ip": "203.0.113.5", "sources": ["mx", "spf"], "managed": false}], "sections": { "dkim": {"status": "pass", "core": true, "findings": [], "data": {}}, "ptr": {"status": "fail", "core": true, "findings": [], "data": {}} }, "not_checked": [ {"check": "dkim_signature", "reason": "needs_a_message"}, {"check": "alignment", "reason": "needs_a_message"} ], "diff": { "baseline": {"id": "ir_01JB2...", "checked_at": "2026-10-24T12:00:00Z"}, "first_run": false, "changed": true, "worsened": true, "status_from": "pass", "score_from": 100, "changes": [ {"path": "dkim.key.mail.sha256", "section": "dkim", "kind": "removed", "severity": "critical", "effect": "worsened", "from": "9f2c...", "to": null} ], "not_compared": [ {"path": "blocklist_ip.203.0.113.5.bl.spamcop.net.listed", "reason": "lookup_failed"} ] } }cron에 추가하세요
diff=true를 사용하면 각 실행을 마지막 실행과 비교하며, jq는 응답을 종료 코드로 변환합니다.
요청
# exits non-zero if the domain is broken or its setup changed curl -s 'https://email-spam-tester.com/api/v1/infra/check?domain=example.com&selector=mail&diff=true' \ | jq -e '.ok and (.diff.changed | not)'
| domain | 필수입니다. 도구에서 받는 항목인 도메인, URL, 이메일 주소를 받습니다. |
| ip | 발신 주소입니다. 여러 개를 지정하려면 반복해서 전달하세요. 최대 6개까지 가능합니다. |
| selector | DKIM 선택자입니다. 여러 개를 지정하려면 반복해서 전달하세요. 최대 10개까지 가능합니다. 전달한 선택자는 모두 존재해야 하며, 그렇지 않으면 DKIM 섹션이 실패합니다. |
| helo | 서버가 HELO에서 제공하는 이름이며, 서버의 PTR과 비교됩니다. |
| account | 요청의 대상입니다. 여러 사용자를 지원하는 키를 사용할 때 필수입니다. |
| checks | 실행할 섹션이며, 쉼표로 구분합니다. 기본적으로 모두 실행됩니다. |
| diff | true이면 이 실행을 도메인의 마지막 실행과 비교합니다. |
| since | 7d, 12h 또는 ISO 8601 날짜입니다. 해당 시점에서 12시간 이내에 가장 가까운 실행과 비교하고, 없으면 그 이전의 마지막 실행과 비교합니다. diff를 켭니다. |
| baseline | 비교할 실행 중 하나의 ID입니다. diff를 켭니다. |
| fresh | true이면 60초 캐시를 건너뜁니다. |
응답 읽기
완료된 검사는 200으로 응답하며, 판정은 본문에 있습니다. status는 필수 섹션인 spf, dkim, dmarc, ptr, blocklist_ip, blocklist_domain, mx, smtp 중 가장 나쁜 상태입니다. 필수 섹션의 unknown은 warn으로 간주합니다. status가 pass 또는 warn이면 ok는 true입니다. score는 응답한 필수 섹션을 기준으로 0부터 100까지이며, error와 unknown 때문에 해당 가중치의 절반 미만만 남으면 null입니다. mta_sts, tls_rpt, bimi, dnssec, dane, ns, registration은 보고되고 비교되지만 ok 또는 score에는 영향을 주지 않습니다.
섹션의 상태는 pass, warn, fail, error (확인할 수 없음), unknown (판단할 정보가 너무 적음), skipped (적용되지 않음) 중 하나일 수 있습니다. skipped는 결과에 영향을 주지 않으며, 이유는 not_checked에 있습니다. dkim_signature와 alignment는 실제 메시지가 필요하므로 항상 포함됩니다.
ip와 selector가 바꾸는 것
PTR과 차단 목록은 주소에 관한 것이므로 실행에는 주소가 필요합니다. 전달한 ip 값을 사용합니다. 값이 없으면 MX 호스트와 루트 SPF 레코드의 단일 주소 ip4: 및 ip6: 항목에서 최대 4개를 가져옵니다. 알려진 메일 제공업체의 주소는 managed로 표시하고 확인하지 않으며, 남은 주소가 없으면 ptr과 blocklist_ip는 skipped로 응답합니다. selector는 DNS에서 읽을 수 없으므로 실행 시 전달한 값, 이전 실행에서 찾은 값, 일반적인 이름 목록을 시도합니다. 아무것도 찾지 못했다고 해서 아무것도 입증되지는 않으며, dkim은 unknown으로 응답합니다. 자체 서버에서 전송하는 경우 둘 다 전달해야 합니다.
변경된 내용
diff.changes의 각 항목에는 path, kind(added, removed, changed), severity(critical, warning, info), effect(worsened, improved, neutral)가 있습니다. critical과 warning만 diff.changed를 설정하므로, 길이가 같은 DKIM 키로 교체하거나 새 MX 주소를 추가하거나 인증서를 갱신해도 cron 줄이 실패하지 않습니다. diff.worsened는 모든 변경 사항의 effect를 따릅니다. 첫 실행에서는 비교할 항목이 없으며, diff.first_run이 이를 나타냅니다.
기준은 항상 사용자의 실행 중 하나이므로, 두 실행 사이에 다른 사람이 도메인을 확인해도 아무것도 숨겨지지 않습니다. 이번에 읽을 수 없었던 모든 항목은 마지막으로 알려진 값을 유지한 채 diff.not_compared로 이동합니다. 따라서 장애 중에 발생한 변경은 조회가 다시 작동하면 표시됩니다. ip 또는 selector가 다른 실행도 같은 시리즈에 유지되며, 해당 실행에서 요청하지 않은 항목 역시 비교되지 않습니다.
예약 검사가 키를 사용해야 하는 이유
키가 없으면 기록은 IP 주소의 키 지정 해시에 속하므로 주소가 바뀌면 끝나며, 한 주소 뒤에 있는 사람들이 기록을 공유합니다. 동료의 실행이 사용자의 기준을 이동시킵니다. Authorization: Bearer에 개인 API 키를 사용하면 기록이 해당 키를 따릅니다. 키를 사용한 실행은 365일 동안 보관되며 해당 키로만 열 수 있습니다. 키를 사용하지 않은 실행은 30일 동안 보관되며 id를 가진 누구나 열 수 있습니다.
IP당 분당 6개 및 일일 50개 요청, 또는 키당 분당 30개 및 일일 500개 요청이 허용됩니다. 이를 초과하면 Retry-After와 함께 429로 응답합니다. 60초 이내의 동일한 요청은 캐시에서 제공되고 cached: true로 표시되며, 실행을 기록하지 않고 요청 수에도 포함되지 않습니다. 저장된 실행을 읽는 경우 클라이언트당 분당 120개 요청이 허용됩니다. Retry-After와 함께 반환되는 503은 너무 많은 검사가 실행 중이거나, 저장된 실행을 읽는 경우 저장소를 사용할 수 없음을 의미합니다. 401은 잘못된 키를 의미합니다. 422에는 detail.code로 invalid_domain, invalid_ip, invalid_selector, invalid_check, invalid_since, unknown_baseline 또는 account_required가 포함됩니다.
엔드포인트
GET/api/v1/infra/check
검사를 실행합니다. 매개변수는 위 표에 있습니다.
GET/api/v1/infra/runs/{public_id}
저장된 실행 하나의 전체 내용입니다. 존재하지 않거나 다른 키에 속하면 404입니다.
GET/api/v1/infra/domains/{domain}/runs
도메인 실행을 최신순으로 반환합니다: id, 시간, 상태, 점수 및 변경 사항 수. limit(1~100, 기본값 30)와 실행 id인 before를 받습니다.
GET/api/v1/infra/diff
저장된 두 실행 간의 동일한 비교입니다. ?from=<id>&to=<id>. 두 실행 모두에 접근할 수 있어야 합니다.
GET/api/v1/infra/checks
가중치, 점수 버전 및 제한이 포함된 모든 섹션입니다.
개별 검사
각 호출은 하나의 질문에 답하고 기록을 보관하지 않습니다. 헤더 도구를 제외한 각 도구는 인프라 검사의 한 부분을 자체적으로 실행하며, 헤더 도구는 이미 수신한 메시지를 읽습니다.
빠른 시작
검사 선택
아래 목록에서 도구를 선택하고 도구에서 요구하는 도메인, 주소 또는 IP를 전달하세요.
요청
curl -s 'https://email-spam-tester.com/api/v1/tools/spf?domain=example.com'상태 및 발견 사항 확인
모든 도구는 상태와 발견 사항을 응답합니다. 그 뒤의 필드는 도구에 따라 달라집니다.
응답
{ "tool": "spf", "query": {"domain": "example.com"}, "checked_at": "2026-10-31T12:00:00Z", "duration_ms": 412, "status": "fail", "findings": [ {"code": "spf.too_many_lookups", "level": "fail", "params": {"limit": 10, "count": 12}, "message": "RFC 7208 §4.6.4 allows at most 10 DNS lookups, and this record needs 12, so receivers return permerror."} ], "record": "v=spf1 include:_spf.example.net ~all", "lookups": {"count": 12, "limit": 10, "void": 0} }
엔드포인트
GET/api/v1/tools/spf
도메인의 SPF 레코드: 구문, 추적된 모든 include와 redirect, 전체 트리에서 발생한 DNS 조회 횟수와 한도 10회 대비 결과입니다. ?domain=example.com을 전달합니다.
GET/api/v1/tools/dmarc
도메인의 DMARC 레코드 또는 해당 레코드가 없는 경우 조직 도메인의 DMARC 레코드: 태그, 정책, 각 외부 보고서 주소가 보고서 수신에 동의했는지 여부입니다. ?domain=example.com을 전달합니다.
GET/api/v1/tools/dkim
selector에 게시된 DKIM 키: 존재하고 디코딩되는지 여부, 유형과 크기, 폐기 및 테스트 플래그입니다. ?domain=example.com&selector=s1을 전달합니다.
GET/api/v1/tools/blocklist
IPv4 주소, IPv6 주소 또는 도메인을 보고서에서 사용하는 DNS 차단 목록과 대조하여 확인하고 각 목록의 응답을 반환합니다. ?target=203.0.113.5를 전달합니다.
GET/api/v1/tools/mx
발신자가 시도하는 순서대로 도메인의 MX 레코드를 보여주며, 각 호스트의 IPv4 및 IPv6 주소도 함께 제공합니다. Null MX, MX가 없는 도메인, IP 주소 또는 CNAME인 호스트, 확인되지 않는 호스트를 보고하며, MTA-STS 및 TLS-RPT 레코드도 보고합니다. ?domain=example.com을 전달하세요.
GET/api/v1/tools/bimi
도메인의 BIMI 설정을 네 단계로 보여줍니다: BIMI에 필요한 DMARC 정책, default._bimi의 레코드, Tiny PS 프로필을 기준으로 검사한 SVG 로고, 유형, 도메인 및 만료일이 포함된 마크 인증서입니다. ?domain=example.com을 전달하고, default 이외의 셀렉터에는 &selector=를 전달하세요.
GET/api/v1/tools/ptr
주소의 PTR 레코드와 해당 이름 중 주소로 다시 확인되는 이름이 있는지 여부입니다. 조회에 실패하면 상태 error가 되고, 레코드가 없으면 상태 fail이 됩니다. ?ip=8.8.8.8을 전달하세요.
GET/api/v1/tools/mta-sts
도메인의 MTA-STS 레코드와 이 레코드가 가리키는 정책 파일, 즉 모드, 나열된 호스트, 정책에서 제외된 MX 호스트입니다. ?domain=example.com을 전달하세요.
GET/api/v1/tools/tls-rpt
도메인의 TLS-RPT 레코드와 보고서를 수신하는 주소입니다. ?domain=example.com을 전달하세요.
GET/api/v1/tools/dnssec
DNSKEY 및 DS 레코드를 기준으로 도메인의 영역이 서명됨, 서명되지 않음 또는 손상됨 상태인지 확인합니다. 잘못된 서명은 리졸버 장애와 구분됩니다. ?domain=example.com을 전달하세요.
GET/api/v1/tools/dane
MX 호스트의 TLSA 레코드를 호스트가 제시하는 인증서와 비교합니다(해당 인증서를 읽을 수 있는 경우). ?domain=example.com을 전달하세요.
GET/api/v1/tools/smtp
처음 두 MX 호스트의 STARTTLS 및 인증서, 즉 TLS 버전, 발급자, 만료일, 체인과 이름의 유효 여부입니다. 요청하신 도메인에 속한 호스트에만 연결하고 메일 제공업체는 건너뛰며, 주소별 결과 하나를 6시간 동안 공유합니다. 메일은 전송하지 않습니다. ?domain=example.com을 전달하세요.
GET/api/v1/tools/ns
도메인의 네임 서버와 해당 영역에 SOA 레코드가 있는지 여부입니다. 네임 서버가 하나뿐이면 warn입니다. ?domain=example.com을 전달하세요.
GET/api/v1/tools/registration
RDAP에서 확인한 도메인 등록 만료 시점입니다. 남은 기간이 30일 미만이면 warn입니다. RDAP 서비스가 없는 영역은 skipped로 응답합니다. ?domain=example.com을 전달하세요.
POST/api/v1/tools/header
수신된 메시지의 헤더를 JSON {"headers": "..."} 또는 text/plain으로 전송하세요: 지연 시간, TLS 및 시계 오차가 포함된 홉별 경로, 수신자 자체의 Authentication-Results, From, DKIM d= 및 Return-Path 도메인의 정렬, 그리고 DKIM, ARC, 구독 해지 및 스팸 필터 헤더를 보여줍니다. 첫 번째 빈 줄 이후의 모든 내용은 읽지 않고 삭제됩니다. 헤더는 메모리에서 처리되며 저장, 캐시 또는 기록되지 않습니다.
매일 밤 도메인을 검사하세요.
이메일을 보내기 전에 테스트하세요.
모든 제품의 공통 사항
접근 권한, 키, 보고서 형식, 상태, 오류와 더불어 기계용 OpenAPI 및 llms.txt를 제공합니다.
인증
없습니다. 요청할 키도, 설정할 헤더도, 생성할 계정도 없습니다. 반환받는 슬러그 자체가 접근 권한입니다. 슬러그를 가진 사람은 누구나 해당 보고서를 읽을 수 있고, 그 외의 사람은 이를 추측할 수 없습니다.
개인 API 키
Everything above works without a key. A key is for automation platforms such as
Zapier, where every user's calls come from the platform's servers and per-IP limits
would be shared by all of them. With a key, limits count per key (50 tests a day,
3 with placement, 5 permanent mailboxes), the key's tests form a history, and the
key can keep permanent mailboxes whose reports only it can read. Send the key as
Authorization: Bearer est_live_… on any call on this page. The routes
below also take account, a short name of your choosing
([A-Za-z0-9_-], up to 64 characters) that keeps separate lists under one
key. GET /api/v1/installations/tests requires it; pass the same one on
POST /api/v1/inbox so the test shows up there. The Zapier integration
uses zapier.
POST /api/v1/keys
Send JSON {"email":"you@example.com"}. Returns HTTP 201 with
key and email. The key is shown once; only its hash is
kept. Asking again gives a new key and leaves the earlier ones working. Limit: 5 keys
per IP per UTC day. The form on /zapier/ calls this.
GET /api/v1/keys/me
Returns email, key_prefix and created_at of
the key in the header, or HTTP 401. Use it to check a key.
GET /api/v1/installations/tests
The key's tests, newest first: ?account=…&limit=50 (up to 100),
and before=<slug> for the next page. Each item has
slug, created_at, analysis_status
(waiting or expired before an email arrived),
score_ours, score_compat, placement and
changes, the checks that moved since the previous test of the same
sending domain. Read the full report at /api/v1/tests/{slug}.
POST /api/v1/installations/mailboxes
Send JSON {"domain":"example.com","account":"…"}. Returns the
permanent mailbox of that sending domain: id, address,
domain, state, daily_cap and
created. HTTP 201 when it is new, 200 when it already existed, 409 when
the key keeps as many mailboxes as it may. Subscribe the address to a newsletter or
a sequence and every email that arrives is checked. GET on the same
path with ?account=… lists them, and DELETE
/api/v1/installations/mailboxes/{mailbox_id} stops one.
GET /api/v1/installations/mailboxes/{mailbox_id}/letters
The emails that arrived, oldest first, paged with after_id and
next_after_id. settled=true ends the page before the first
email still being checked, so paging never skips one. newest=true turns
the order round, for a quick look at the latest; settled does nothing
with it. Each has
test_id, slug, received_at,
analysis_status, score_ours, score_compat,
subject, from_addr and kind.
GET /api/v1/installations/letters/{slug}
The report of one email in a permanent mailbox, the same JSON as
/api/v1/tests/{slug} with report_url null: there is no
public page for it. HTTP 410 once the report has expired.
보고서 읽기
원하는 순서대로 답을 제공하는 필드입니다.
| score_ours | 0~100. 자체 모델. 인증과 인프라가 대부분의 가중치를 차지합니다. 필터가 본문의 단어를 읽기 전에 전송 여부를 결정하기 때문입니다. |
| score_compat | 0~10. 사람들이 이미 비교에 사용하는 SpamAssassin 방식의 수치를 재현하므로, 다른 곳에서 본 결과와 보고서를 비교할 수 있습니다. |
| subscores | 섹션별로 동일한 0~100 척도를 사용합니다: auth, infra_spam, content, compliance. |
| checks[] | 42개 항목 전체이며, 각 항목에는 상태, 한 줄 결과, 판단에 사용된 근거, 두 점수에 미친 영향이 포함됩니다. |
| checks[].citations | 결과의 근거: RFC의 해당 섹션과 원문 그대로 인용한 내용, 그리고 Google이 자체 요구사항을 명시한 페이지입니다. 자동 생성하지 않고 직접 선별했으므로 신뢰할 수 있습니다. |
| fixes[] | 변경해야 할 사항을 순서대로 제시하며, 각 변경으로 얻는 점수를 함께 표시합니다. 점수 상승분은 추정하지 않고 보고서를 다시 채점하여 계산합니다. |
| complete | 검사를 실행할 수 없으면 False입니다. 검사하지 않은 항목은 절대 통과로 간주되지 않으므로, true가 될 때까지 점수를 낙관적인 값으로 간주하십시오. |
| report_url | 사람이 읽을 수 있는 페이지입니다. JSON 덩어리 대신 사람에게 이 페이지를 전달하십시오. |
상태
검사 상태는 다섯 가지 중 하나이며, 그중 두 상태의 차이는 보기보다 더 중요합니다.
| pass | 검사가 실행되었으며 문제를 발견하지 못했습니다. |
| warn | 수정할 가치가 있습니다. 점수가 차감됩니다. |
| fail | 전달률을 떨어뜨립니다. 점수가 더 많이 차감됩니다. |
| 건너뜀 | 적용되지 않았습니다. 검사할 첨부 파일이 없거나 평가할 HTML 부분이 없습니다. 통과한 것은 아닙니다. |
| 오류 | 확인할 수 없었습니다. 통과로 계산하지 않고 점수에서 제외했으며 플래그를 지정했습니다. |
analysis_status는 received, analyzing, checks_ready, failed 순으로 진행됩니다. ai_status는 pending, running, ready, fallback, error 순으로 진행됩니다. 결정론적 보고서는 checks_ready에서 최종 확정되며, ai_status는 계획만 추가합니다.
반환될 수 있는 항목
| 202 | 주소가 예약되었으며 아직 메시지가 도착하지 않았습니다. 본문에는 주소, 만료 시간 및 언어가 포함되므로 예약을 생성하지 않은 호출자도 이를 표시할 수 있습니다. |
| 404 | 해당 슬러그가 없습니다. 존재한 적이 없거나 예약이 잊혔습니다. |
| 410 | 메시지가 도착하기 전에 주소가 만료되었습니다. |
| 409 | 메시지가 이미 도착한 후에 언어를 변경하려고 했습니다. |
| 429 | 해당 주소의 무료 테스트 한도입니다. 현재 이 서비스에는 개인별 한도가 없습니다. 추후 한도가 설정되면 본문에 재설정 시점이 표시됩니다. |
알아둘 네 가지
주소당 메시지 하나
두 번째 메시지는 거부됩니다. 이전 보고서는 그대로 유지되며, 이것이 이 제한의 목적입니다.
사용 기한은 1시간
주소는 만료되지만 보고서는 만료되지 않습니다. 보고서 링크는 영구적이므로 티켓에 붙여 넣은 링크는 계속 작동합니다.
플랫폼에서 전송
개인 계정에서 캠페인을 테스트하면 해당 계정을 측정하게 됩니다. 인증 섹션의 거의 모든 내용은 텍스트가 아니라 전송 인프라에 관한 것입니다.
수정 후 다시 테스트
예상 개선치는 한 번에 하나의 수정 사항을 기준으로 계산되며 서로 합산되지 않습니다. 두 번째 보고서가 정확한 수치입니다.
머신용
- /api/openapi.json API를 제공하는 동일한 코드에서 생성된 OpenAPI 설명입니다.
- /llms.txt, /llms-full.txt 언어 모델을 위한 이 사이트의 간략한 맵으로, llms.txt 규칙을 따르며 전체 루프와 보고서 필드를 한 파일에 담은 더 긴 버전도 제공합니다.
- /mcp 동일한 기능과 블로킹 대기 기능을 제공하는 MCP 서버로, 모델 내부에서 폴링하는 것보다 효율적입니다.
- For agents 에이전트 페이지: 언제 이것을 사용해야 하는지, 건너뛴 검사를 통과한 검사와 비교해 해석하는 방법, 그리고 어떤 결과가 에이전트가 편집할 수 있는 텍스트가 아니라 사람이 변경해야 하는 DNS 레코드인지 설명합니다.
GET/api/health
활성 상태 확인. 인증이 없고 부작용도 없습니다.
샌드박스.
모든 엔드포인트에 라이브 서비스에서 실행하는 버튼이 있습니다. 여기서는 키가 필요하지 않으므로 이 페이지에서 보내는 요청은 실제 요청입니다. 실제 주소를 예약하며 사용량에 포함됩니다.
샌드박스에서 사용해 보기