Email Spam Tester

API ελέγχου spam για email,
εισερχόμενα και τομέα

Στείλτε μας ένα πραγματικό μήνυμα ή δώστε μας μόνο έναν τομέα. Όλα επιστρέφονται σε 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"}]
}
Σε αυτήν τη σελίδα

Δοκιμή email

Διαβάζουμε ένα πραγματικό μήνυμα από την αρχή μέχρι το τέλος: περιεχόμενο, υπογραφή, κεφαλίδες και τον διακομιστή που το έστειλε. Λαμβάνετε μια βαθμολογία, μια λίστα διορθώσεων και κάθε έλεγχο στον οποίο βασίζονται.

Γρήγορη εκκίνηση

Τρεις κλήσεις. Χωρίς κλειδί, χωρίς λογαριασμό, χωρίς εγγραφή. Δύο αιτήματα και ένα email. Η τρίτη κλήση υπάρχει μόνο επειδή η ανάλυση διαρκεί λίγα δευτερόλεπτα.

  1. Δεσμεύστε μια διεύθυνση

    Στείλτε POST στο endpoint του inbox. Λαμβάνετε μια διεύθυνση που δέχεται ακριβώς ένα μήνυμα και λήγει σε μία ώρα, καθώς και το slug που χρησιμοποιείται ως κλειδί για όλα τα υπόλοιπα.

    Αίτημα

    # 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"
    }
  2. Στείλτε σε αυτή το πραγματικό μήνυμα

    Μέσω SMTP, από την πλατφόρμα που θα στείλει την καμπάνια. Οι μισοί έλεγχοι διαβάζουν κεφαλίδες που προσθέτει η πλατφόρμα αποστολής σας, επομένως ένα μήνυμα που συντάχθηκε χειροκίνητα μετρά το λάθος πράγμα.

    Αίτημα

    # 2. send your message to that address, from your own platform
    To: test-<slug>@t.email-spam-tester.com
  3. Ελέγξτε περιοδικά την κατάσταση και μετά διαβάστε την αναφορά

    Το endpoint κατάστασης έχει μέγεθος μερικών εκατοντάδων byte και σας ενημερώνει αν αξίζει να ανακτηθεί ήδη η πλήρης αναφορά. Η ίδια η αναφορά εκτείνεται σε αρκετές χιλιάδες γραμμές.

    Αίτημα

    # 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"}}
      ]
    }

Δεσμεύστε μια διεύθυνση, στείλτε το μήνυμα που επρόκειτο να στείλετε στη λίστα σας, διαβάστε την αναφορά. Όλα όσα εμφανίζει η σελίδα περιλαμβάνονται στο JSON, μαζί με τη βαθμολογία, και τους 42 ελέγχους με τα τεκμήριά τους, καθώς και την ενότητα του προτύπου στην οποία βασίζεται κάθε εύρημα.

Οι πρώτες 100.000 αναφορές είναι δωρεάν, χωρίς κλειδί και χωρίς λογαριασμό. Αν συνδέετε έναν agent αντί για ένα script, ο διακομιστής MCP είναι καταλληλότερος από το polling.

Τελικά σημεία

Βασική διεύθυνση 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

Η συχνή εκτέλεση αιτημάτων είναι οικονομική. Επιστρέφει τα δύο πεδία κατάστασης και μέχρι πού έχουν φτάσει οι έλεγχοι, και τίποτε άλλο.

Εκτελέστε αιτήματα σε αυτό αντί για την αναφορά. Το analysis_status φτάνει πρώτα στην τιμή checks_ready και το σχέδιο AI εμφανίζεται στο ai_status περίπου ένα λεπτό αργότερα, ώστε ένας καλών που θέλει μόνο τους ντετερμινιστικούς ελέγχους να μη χρειάζεται να περιμένει το σχέδιο.

GET/api/v1/tests/{slug}

Ολόκληρη η αναφορά. Αποκρίνεται με 202 όσο η διεύθυνση είναι δεσμευμένη και δεν έχει φτάσει ακόμη τίποτα, και με 200 μόλις φτάσει.

GET/api/v1/tests/{slug}/message

Το μήνυμα ακριβώς όπως παραδόθηκε: κάθε κεφαλίδα με τη σειρά μετάδοσης, και τα δύο σώματα, η λίστα συνημμένων και η ακατέργαστη πηγή. Ανακτάται ξεχωριστά, επειδή η αναφορά ελέγχεται επανειλημμένα και αυτό μπορεί να φτάσει το ένα megabyte.

Το ανεπεξέργαστο μήνυμα διαγράφεται σύμφωνα με το δικό του χρονόμετρο, νωρίτερα από την αναφορά. Μετά από αυτό, αυτό το endpoint απαντά με την αιτία αντί για το αρχικό περιεχόμενο.

PUT/api/v1/tests/{slug}/locale

Αλλάζει τη γλώσσα μιας κράτησης που δεν έχει χρησιμοποιηθεί ακόμη. Για έναν agent που μαθαίνει ποια γλώσσα διαβάζει ο χρήστης του αφού έχει ήδη ζητήσει τη διεύθυνση. Απορρίπτεται μόλις φτάσει το μήνυμα, επειδή μέχρι τότε εκτελείται ήδη η ανάλυση.

Τοποθέτηση στα εισερχόμεναΔοκιμαστική έκδοση

Στείλτε ένα μήνυμα σε μια λίστα δοκιμαστικών εισερχομένων και δείτε πού κατέληξε στο Gmail, το Outlook, το Yahoo και άλλους παρόχους: Εισερχόμενα, Προσφορές ή Ανεπιθύμητα.

Γρήγορη εκκίνηση

  1. Δημιουργήστε μια δοκιμή

    Κάντε POST στο endpoint τοποθέτησης. Λαμβάνετε έναν δείκτη και τα δοκιμαστικά γραμματοκιβώτια.

    Αίτημα

    # 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. Στείλτε ένα μήνυμα σε κάθε γραμματοκιβώτιο

    Βάλτε τον δείκτη στο θέμα και στείλτε από τη συνηθισμένη σας πλατφόρμα, σε όλες τις διευθύνσεις με μία αποστολή.

    Αίτημα

    # 2. one message to every address, with the marker in the subject
    Subject: October invoice est-3f9a1c7e2b4d6a80c5e1f2d3
    To: <seed>, <mailbox>, ...
  3. Ελέγξτε επανειλημμένα τους φακέλους

    Για κάθε διεύθυνση συμπληρώνονται ο πάροχος και ο φάκελός της. Ελέγχετε επανειλημμένα μέχρι η κατάσταση να πάψει να είναι 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 ελέγχει τη ρύθμιση email ενός τομέα χωρίς να στείλει τίποτα, διατηρεί το αποτέλεσμα και σας ενημερώνει τι άλλαξε από την τελευταία εκτέλεσή σας. Δεν απαιτείται κλειδί. Στο cron, η παρακάτω γραμμή τερματίζεται με μη μηδενικό κωδικό όταν ο τομέας είναι προβληματικός ή η ρύθμισή του άλλαξε με τρόπο που έχει σημασία.

Γρήγορη εκκίνηση

  1. Κάντε ένα GET

    Περάστε το domain. Το ip προσθέτει τις διευθύνσεις αποστολής σας, και το selector ορίζει τους επιλογείς DKIM προς ανάγνωση.

    Αίτημα

    curl -s 'https://email-spam-tester.com/api/v1/infra/check?domain=example.com&selector=mail&diff=true'
  2. Διαβάστε το αποτέλεσμα

    Το ok είναι η απάντηση για ένα script, και το 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"}
        ]
      }
    }
  3. Βάλτε το στο 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, μια διεύθυνση email.
ipΗ διεύθυνση αποστολής σας. Επαναλάβετε την παράμετρο για περισσότερες διευθύνσεις, έως 6.
selectorΈνας επιλογέας DKIM. Επαναλάβετε την παράμετρο για περισσότερους επιλογείς, έως 10. Κάθε επιλογέας που περνάτε πρέπει να υπάρχει, διαφορετικά η ενότητα dkim αποτυγχάνει.
heloΤο όνομα που δίνει ο διακομιστής σας στο HELO, σε σύγκριση με το PTR του.
accountΓια ποιον προορίζεται το αίτημα. Απαιτείται με ένα κλειδί που εξυπηρετεί πολλά άτομα.
checksΟι ενότητες που θα εκτελεστούν, διαχωρισμένες με κόμματα. Όλες από προεπιλογή.
diffΗ τιμή true συγκρίνει αυτή την εκτέλεση με την τελευταία εκτέλεση του domain σας.
since7d, 12h ή μια ημερομηνία ISO 8601. Συγκρίνει με την εκτέλεσή σας που είναι πλησιέστερη σε εκείνη τη χρονική στιγμή εντός 12 ωρών, διαφορετικά με την τελευταία πριν από αυτή. Ενεργοποιεί το diff.
baselineΤο αναγνωριστικό μίας από τις εκτελέσεις σας με την οποία θα γίνει σύγκριση. Ενεργοποιεί το diff.
freshΗ τιμή true παρακάμπτει την cache των 60 δευτερολέπτων.

Ανάγνωση της απάντησης

Ένας έλεγχος που ολοκληρώθηκε απαντά με 200 και η ετυμηγορία βρίσκεται στο σώμα. Το status είναι το χειρότερο αποτέλεσμα από τις απαιτούμενες ενότητες: spf, dkim, dmarc, ptr, blocklist_ip, blocklist_domain, mx και smtp. Το unknown σε μια απαιτούμενη ενότητα υπολογίζεται ως warn. Το ok είναι true όταν το status είναι pass ή warn. Το score κυμαίνεται από 0 έως 100 για τις απαιτούμενες ενότητες που απάντησαν και είναι null όταν τα errors και unknowns αφήνουν λιγότερο από το μισό του βάρους που εφαρμόζεται. Τα 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 σας και από όρους ip4: και ip6: με μία διεύθυνση στη βασική εγγραφή SPF. Οι διευθύνσεις ενός γνωστού παρόχου αλληλογραφίας αναφέρονται ως 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 σας, επομένως τερματίζεται όταν αλλάξει η διεύθυνση και τα άτομα πίσω από μία διεύθυνση το μοιράζονται: η εκτέλεση ενός συναδέλφου μετακινεί τη γραμμή βάσης σας. Με ένα προσωπικό κλειδί API στο Authorization: Bearer, το ιστορικό ακολουθεί το κλειδί. Οι εκτελέσεις με κλειδί διατηρούνται για 365 ημέρες και είναι προσβάσιμες μόνο με αυτό το κλειδί. Οι εκτελέσεις χωρίς κλειδί διατηρούνται για 30 ημέρες και είναι προσβάσιμες σε οποιονδήποτε έχει το id τους.

6 αιτήματα ανά λεπτό και 50 ανά ημέρα για κάθε IP ή 30 και 500 για κάθε κλειδί. Πάνω από αυτό το όριο, η απάντηση είναι 429 με Retry-After. Ένα πανομοιότυπο αίτημα εντός 60 δευτερολέπτων προέρχεται από προσωρινή μνήμη, επισημαίνεται ως cached: true, δεν καταγράφει εκτέλεση και δεν προσμετράται. Η ανάγνωση αποθηκευμένων εκτελέσεων επιτρέπει 120 αιτήματα ανά λεπτό για κάθε πρόγραμμα-πελάτη. Το 503 με Retry-After σημαίνει ότι εκτελούνται πάρα πολλοί έλεγχοι ή, κατά την ανάγνωση αποθηκευμένων εκτελέσεων, ότι το σύστημα αποθήκευσης δεν είναι διαθέσιμο. Το 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

Οι εκτελέσεις σας για έναν τομέα, πρώτα οι νεότερες: αναγνωριστικό, χρόνος, κατάσταση, βαθμολογία και αριθμός αλλαγών. Δέχεται limit (1 έως 100, 30 από προεπιλογή) και before, ένα αναγνωριστικό εκτέλεσης.

GET/api/v1/infra/diff

Η ίδια σύγκριση μεταξύ δύο αποθηκευμένων εκτελέσεων, ?from=<id>&to=<id>. Χρειάζεστε πρόσβαση και στις δύο.

GET/api/v1/infra/checks

Κάθε ενότητα με τη βαρύτητά της, την έκδοση βαθμολογίας και τα όρια.

Μεμονωμένοι έλεγχοι

Κάθε κλήση απαντά σε μία ερώτηση και δεν διατηρεί ιστορικό. Ένα εργαλείο εκτελεί αυτόνομα ένα μέρος του ελέγχου υποδομής, εκτός από το εργαλείο κεφαλίδων, το οποίο διαβάζει ένα μήνυμα που έχετε ήδη λάβει.

Γρήγορη εκκίνηση

  1. Επιλέξτε έλεγχο

    Επιλέξτε το εργαλείο από την παρακάτω λίστα και δώστε το domain, τη διεύθυνση ή την IP που ζητά.

    Αίτημα

    curl -s 'https://email-spam-tester.com/api/v1/tools/spf?domain=example.com'
  2. Διαβάστε την κατάσταση και τα ευρήματα

    Κάθε εργαλείο απαντά με μια κατάσταση και τα ευρήματά του. Τα πεδία που ακολουθούν εξαρτώνται από το εργαλείο.

    Απόκριση

    {
      "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}
    }

Τελικά σημεία

Όλα απαντούν με 200, μια κατάσταση και μια λίστα ευρημάτων, καθένα με έναν κωδικό και τις παραμέτρους του. Η κατάσταση είναι pass, warn, fail ή error, ενώ ένα εργαλείο που χρησιμοποιείται επίσης από τον έλεγχο υποδομής μπορεί να απαντήσει και με unknown ή skipped. Μια αναζήτηση που έληξε λόγω χρονικού ορίου ή μια λίστα που απέρριψε το ερώτημα δεν υπολογίζεται ποτέ ως pass. 30 αιτήματα ανά λεπτό και 300 ανά ημέρα ανά IP συνολικά για όλα τα εργαλεία· πάνω από αυτό το όριο, η απάντηση είναι 429 με Retry-After.

GET/api/v1/tools/spf

Η εγγραφή SPF ενός domain: η σύνταξή της, κάθε include και redirect που ακολουθείται και οι αναζητήσεις DNS που κοστίζει ολόκληρο το δέντρο έναντι του ορίου των δέκα. Δώστε ?domain=example.com.

GET/api/v1/tools/dmarc

Η εγγραφή DMARC ενός domain, ή του οργανωτικού του domain όταν δεν διαθέτει εγγραφή: οι ετικέτες, η πολιτική και αν κάθε εξωτερική διεύθυνση αναφορών έχει συμφωνήσει να λαμβάνει αναφορές. Δώστε ?domain=example.com.

GET/api/v1/tools/dkim

Το κλειδί DKIM που έχει δημοσιευτεί για έναν selector: αν υπάρχει και αποκωδικοποιείται, ο τύπος και το μέγεθός του και οι σημαίες ανάκλησης και δοκιμής. Δώστε ?domain=example.com&selector=s1.

GET/api/v1/tools/blocklist

Μια διεύθυνση IPv4, μια διεύθυνση IPv6 ή ένα domain που ελέγχεται στις λίστες αποκλεισμού DNS τις οποίες χρησιμοποιεί η αναφορά, με την απάντηση κάθε λίστας. Δώστε ?target=203.0.113.5.

GET/api/v1/tools/mx

Οι εγγραφές MX ενός domain με τη σειρά που τις δοκιμάζουν οι αποστολείς, μαζί με τις διευθύνσεις IPv4 και IPv6 κάθε host. Αναφέρονται Null MX, domain χωρίς MX, host που είναι διευθύνσεις IP ή CNAME και host που δεν επιλύονται, καθώς και οι εγγραφές MTA-STS και TLS-RPT. Περάστε ?domain=example.com.

GET/api/v1/tools/bimi

Η ρύθμιση BIMI ενός domain σε τέσσερα βήματα: η πολιτική DMARC που απαιτεί το BIMI, η εγγραφή στο default._bimi, το λογότυπο SVG ελεγμένο ως προς το προφίλ Tiny PS και το πιστοποιητικό σήματος με τον τύπο, τα domain και την ημερομηνία λήξης του. Περάστε ?domain=example.com και &selector= για selector διαφορετικό από το default.

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

Οι εγγραφές TLSA των κεντρικών υπολογιστών MX, σε σύγκριση με το πιστοποιητικό που παρουσιάζει ένας κεντρικός υπολογιστής όταν ήταν δυνατή η ανάγνωση αυτού του πιστοποιητικού. Δώστε ?domain=example.com.

GET/api/v1/tools/smtp

Το STARTTLS και το πιστοποιητικό στους πρώτους δύο κεντρικούς υπολογιστές MX: έκδοση TLS, εκδότης, ημερομηνία λήξης και αν η αλυσίδα και το όνομα είναι έγκυρα. Συνδεόμαστε μόνο με κεντρικούς υπολογιστές στον τομέα για τον οποίο ζητήσατε έλεγχο και παραλείπουμε τους παρόχους email, ενώ ένα αποτέλεσμα ανά διεύθυνση επαναχρησιμοποιείται για 6 ώρες. Δεν αποστέλλεται κανένα email. Δώστε ?domain=example.com.

GET/api/v1/tools/ns

Οι διακομιστές ονομάτων ενός τομέα και αν η ζώνη του έχει εγγραφή SOA. Ένας διακομιστής ονομάτων αποτελεί προειδοποίηση. Δώστε ?domain=example.com.

GET/api/v1/tools/registration

Πότε λήγει η καταχώριση ενός τομέα, βάσει του RDAP. Αν απομένουν λιγότερες από 30 ημέρες, αποτελεί προειδοποίηση. Για μια ζώνη χωρίς υπηρεσία RDAP, η απάντηση είναι skipped. Δώστε ?domain=example.com.

POST/api/v1/tools/header

Οι κεφαλίδες ενός ληφθέντος μηνύματος, σταλμένες ως JSON {"headers": "..."} ή ως text/plain: η διαδρομή ανά hop με τις καθυστερήσεις, το TLS και την απόκλιση ρολογιού, το Authentication-Results του ίδιου του παραλήπτη, η ευθυγράμμιση των domain στα From, DKIM d= και Return-Path, και οι κεφαλίδες DKIM, ARC, κατάργησης εγγραφής και φίλτρου ανεπιθύμητης αλληλογραφίας. Ό,τι ακολουθεί την πρώτη κενή γραμμή απορρίπτεται χωρίς να διαβαστεί. Οι κεφαλίδες υποβάλλονται σε επεξεργασία στη μνήμη και δεν αποθηκεύονται, δεν εισάγονται σε cache και δεν καταγράφονται.

Ελέγχετε το domain κάθε βράδυ.
Δοκιμάστε το email πριν αποσταλεί.

Κοινά για κάθε προϊόν

Πρόσβαση, κλειδιά, μορφή αναφοράς, καταστάσεις, σφάλματα, καθώς και OpenAPI και llms.txt για μηχανές.

Έλεγχος ταυτότητας

Δεν υπάρχει. Δεν χρειάζεται να ζητήσετε κλειδί, να ορίσετε κεφαλίδα ή να δημιουργήσετε λογαριασμό. Το slug που λαμβάνετε είναι η δυνατότητα πρόσβασης: όποιος το κατέχει μπορεί να διαβάσει αυτή την αναφορά και κανείς άλλος δεν μπορεί να το μαντέψει.

Αυτό σημαίνει επίσης ότι ένα slug πρέπει να αντιμετωπίζεται όπως ένας κωδικός πρόσβασης. Μια αναφορά εμφανίζει τη γραμμή θέματος, τον αποστολέα, τη διεύθυνση επιστροφής και την πλήρη πηγή του μηνύματος σε οποιονδήποτε διαθέτει τον σύνδεσμο.

Προσωπικά κλειδιά 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_ours0 έως 100. Το μοντέλο μας. Ο έλεγχος ταυτότητας και η υποδομή έχουν τη μεγαλύτερη βαρύτητα, επειδή καθορίζουν την παράδοση προτού ένα φίλτρο διαβάσει έστω και μία λέξη του κειμένου.
score_compat0 έως 10. Αναπαράγει τη βαθμολογία τύπου SpamAssassin που οι χρήστες ήδη συγκρίνουν, ώστε η αναφορά να είναι συγκρίσιμη με ό,τι είδε κάποιος αλλού.
subscoresΗ ίδια κλίμακα από 0 έως 100 ανά ενότητα: auth, infra_spam, content, compliance.
checks[]Και οι 42 έλεγχοι, ο καθένας με κατάσταση, εύρημα μίας γραμμής, τα αποδεικτικά στοιχεία στα οποία βασίστηκε η απόφαση και το κόστος του για τις δύο βαθμολογίες.
checks[].citationsΑπό πού προέρχεται το εύρημα: η ενότητα του RFC, παρατιθέμενη κατά λέξη, και η σελίδα όπου η Google δηλώνει τη δική της απαίτηση. Έχουν επιμεληθεί χειροκίνητα αντί να έχουν δημιουργηθεί αυτόματα, ώστε να είναι αξιόπιστα.
fixes[]Τι πρέπει να αλλάξει, με τη σειρά, μαζί με τους βαθμούς που αξίζει κάθε αλλαγή. Τα οφέλη υπολογίζονται με νέα βαθμολόγηση της αναφοράς, δεν αποτελούν εκτίμηση.
completeFalse όταν ένας έλεγχος δεν μπόρεσε να εκτελεστεί. Ένα στοιχείο που δεν ελέγχθηκε δεν θεωρείται ποτέ επιτυχές, οπότε θεωρήστε τη βαθμολογία αισιόδοξη μέχρι να γίνει 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Δεν υπάρχει τέτοιο slug. Είτε δεν υπήρξε ποτέ είτε η δέσμευση ξεχάστηκε.
410Η διεύθυνση έληξε πριν φτάσει κάποιο μήνυμα.
409Προσπαθήσατε να αλλάξετε τη γλώσσα αφού το μήνυμα είχε ήδη φτάσει.
429Το όριο δωρεάν δοκιμών για τη διεύθυνσή σας. Αυτή τη στιγμή δεν υπάρχει όριο ανά άτομο σε αυτή την υπηρεσία· αν οριστεί ποτέ, το σώμα αναφέρει πότε μηδενίζεται.

Τέσσερα πράγματα που αξίζει να γνωρίζετε

Ένα μήνυμα ανά διεύθυνση

Το δεύτερο απορρίπτεται. Η προηγούμενη αναφορά σας παραμένει ανέπαφη, και αυτό είναι το ζητούμενο.

Μία ώρα για να τη χρησιμοποιήσετε

Η διεύθυνση λήγει· η αναφορά όχι. Οι σύνδεσμοι αναφορών είναι μόνιμοι, οπότε ένας σύνδεσμος που επικολλάται σε ένα αίτημα υποστήριξης συνεχίζει να λειτουργεί.

Στείλτε από την πλατφόρμα

Η δοκιμή μιας καμπάνιας από προσωπικό λογαριασμό μετρά αυτόν τον λογαριασμό. Σχεδόν όλα στην ενότητα ελέγχου ταυτότητας αφορούν την υποδομή αποστολής, όχι το κείμενο.

Επαναλάβετε τη δοκιμή μετά τη διόρθωση

Τα αναμενόμενα οφέλη υπολογίζονται για μία διόρθωση κάθε φορά και δεν συνδυάζονται. Η δεύτερη αναφορά δίνει τον πραγματικό αριθμό.

Για συστήματα

GET/api/health

Έλεγχος λειτουργίας. Χωρίς έλεγχο ταυτότητας, χωρίς παρενέργειες.

Δοκιμάστε πρώτα ένα χειροκίνητα

Χρειάζεται περίπου ένα λεπτό και σας δείχνει ακριβώς τι περιγράφει το JSON.

Λήψη διεύθυνσης δοκιμής

Sandbox.

Κάθε endpoint, με ένα κουμπί που το εκτελεί στην ενεργή υπηρεσία. Τίποτα εδώ δεν χρειάζεται κλειδί, επομένως ένα αίτημα που στέλνετε από αυτή τη σελίδα είναι πραγματικό: δεσμεύει μια πραγματική διεύθυνση και προσμετράται.

Δοκιμάστε το στο sandbox