Email Spam Tester

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"}]
}
בעמוד זה

בדיקת אימייל

אנחנו קוראים הודעה אמיתית אחת מתחילתה ועד סופה: תוכן, חתימה, כותרות והשרת ששלח אותה. אתם מקבלים ציון, רשימת תיקונים ואת כל הבדיקות שעליהן הם מבוססים.

התחלה מהירה

שלוש קריאות. ללא מפתח, ללא חשבון, ללא הרשמה. שתי בקשות והודעת דוא״ל אחת. הקריאה השלישית קיימת רק מפני שהניתוח נמשך כמה שניות.

  1. שריינו כתובת

    שלחו 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"
    }
  2. שלחו אליה את ההודעה האמיתית

    דרך SMTP, מהפלטפורמה שתשלח את הקמפיין. מחצית מהבדיקות קוראות כותרות שפלטפורמת השליחה שלכם מוסיפה, ולכן הודעה שנכתבה ידנית מודדת את הדבר הלא נכון.

    בקשה

    # 2. send your message to that address, from your own platform
    To: test-<slug>@t.email-spam-tester.com
  3. תשאלו את הסטטוס, ואז קראו את הדוח

    נקודת הקצה של הסטטוס מחזירה כמה מאות בתים ומציינת אם כבר כדאי לאחזר את הדוח המלא. הדוח עצמו משתרע על פני כמה אלפי שורות.

    בקשה

    # 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 הדוחות הראשונים הם בחינם, ללא מפתח וללא חשבון. אם אתם מחברים סוכן ולא סקריפט, שרת 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

התשאול החוזר שלו זול. מחזיר את שני שדות הסטטוס ואת התקדמות הבדיקות, ושום דבר נוסף.

בצעו תשאול חוזר של נקודת קצה זו במקום של הדוח. analysis_status מגיע תחילה ל-checks_ready, ותוכנית ה-AI מופיעה תחת ai_status כדקה לאחר מכן, כך שלקוח שרוצה רק את הבדיקות הדטרמיניסטיות אינו צריך להמתין לתוכנית.

GET/api/v1/tests/{slug}

הדוח המלא. מחזיר 202 כל עוד הכתובת שמורה ועדיין לא הגיעה הודעה, ו-200 לאחר שהגיעה.

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

ההודעה בדיוק כפי שנמסרה: כל כותרת לפי הסדר בתעבורה, שני גופי ההודעה, רשימת הקבצים המצורפים והמקור הגולמי. מאוחזרת בנפרד משום שהדוח מתושאל שוב ושוב וגודלה יכול להגיע למגה-בייט.

ההודעה הגולמית נמחקת לפי לוח הזמנים שלה, מוקדם יותר מהדוח. לאחר מכן נקודת קצה זו מחזירה את הסיבה במקום את המקור.

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

משנה את השפה של הזמנה שטרם נעשה בה שימוש. מיועד לסוכן שמגלה איזו שפה המשתמש שלו קורא לאחר שכבר ביקש את הכתובת. הבקשה נדחית לאחר שההודעה הגיעה, כי בשלב זה הניתוח כבר מתבצע.

מיקום בתיבת הדואר הנכנסבטא

שלחו הודעה אחת לרשימה של תיבות בדיקה וראו לאן היא הגיעה ב-Gmail, ב-Outlook, ב-Yahoo ואצל ספקים אחרים: דואר נכנס, קידומי מכירות או ספאם.

התחלה מהירה

  1. יצירת בדיקה

    בצעו 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. שליחת הודעה אחת לכל תיבה

    הוסיפו את הסמן לנושא ושלחו מהפלטפורמה הרגילה שלכם לכל הכתובות בפעולה אחת.

    בקשה

    # 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 אחת בודקת את הגדרות הדואר של דומיין בלי לשלוח דבר, שומרת את התוצאה ומציינת מה השתנה מאז ההרצה האחרונה. אין צורך במפתח. ב-cron, השורה שלהלן מסתיימת עם קוד שאינו אפס כשהדומיין אינו תקין או כשההגדרות שלו השתנו באופן מהותי.

התחלה מהירה

  1. בצעו בקשת GET אחת

    העבירו את הדומיין. ip מוסיף את כתובות השליחה שלכם, ו-selector מציין את בוררי ה-DKIM לקריאה.

    בקשה

    curl -s 'https://email-spam-tester.com/api/v1/infra/check?domain=example.com&selector=mail&diff=true'
  2. קראו את התוצאה

    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"}
        ]
      }
    }
  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, כתובת דוא״ל.
ipכתובת השליחה שלכם. יש לחזור עליה לכתובות נוספות, עד 6.
selectorselector של DKIM. יש לחזור עליו לערכי selector נוספים, עד 10. כל ערך שתעבירו חייב להתקיים, אחרת dkim נכשל.
heloהשם שהשרת שלכם מוסר ב-HELO, בהשוואה לרשומת ה-PTR שלו.
accountעבור מי הבקשה. נדרש עם מפתח שמשרת אנשים רבים.
checksהמקטעים להרצה, מופרדים בפסיקים. כולם כברירת מחדל.
difftrue משווה את ההרצה הזו להרצה האחרונה שלכם עבור הדומיין.
since7d,‏ 12h או תאריך ISO 8601. משווה להרצה שלכם הקרובה ביותר למועד זה בטווח של 12 שעות, אחרת להרצה האחרונה שלפניו. מפעיל את diff.
baselineה-id של אחת ההרצות שלכם שאליה יש להשוות. מפעיל את diff.
freshtrue מדלג על המטמון של 60 שניות.

קריאת התשובה

בדיקה שהסתיימה מחזירה 200, וההכרעה נמצאת בגוף התשובה. status הוא המצב הגרוע ביותר מבין הסעיפים הנדרשים: spf, dkim, dmarc, ptr, blocklist_ip, blocklist_domain, mx ו-smtp. ‏unknown בסעיף נדרש נחשב ל-warn. ‏ok הוא true כאשר status הוא pass או warn. ‏score נע בין 0 ל-100 לפי הסעיפים הנדרשים שהחזירו תשובה, והוא null כאשר שגיאות וערכי unknown מותירים פחות ממחצית המשקל הרלוונטי. ‏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. בחירת בדיקה

    בחרו את הכלי מהרשימה שלמטה והעבירו את הדומיין, הכתובת או כתובת ה-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 של דומיין: התחביר שלה, מעקב אחר כל include ו-redirect, ומספר שאילתות ה-DNS שהעץ כולו צורך מתוך המגבלה של עשר. יש להעביר ?domain=example.com.

GET/api/v1/tools/dmarc

רשומת ה-DMARC של דומיין, או של הדומיין הארגוני שלו כאשר אין לו רשומה: התגיות, המדיניות והאם כל כתובת חיצונית לקבלת דוחות הסכימה לקבל דוחות. יש להעביר ?domain=example.com.

GET/api/v1/tools/dkim

מפתח ה-DKIM שפורסם עבור selector: האם הוא קיים וניתן לפענוח, הסוג והגודל שלו, ודגלי הביטול והבדיקה. יש להעביר ?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 של דומיין בארבעה שלבים: מדיניות DMARC שנדרשת על ידי BIMI, הרשומה ב-default._bimi, לוגו SVG שנבדק מול פרופיל Tiny PS, ואישור הסימן עם הסוג, הדומיינים ותאריך התפוגה שלו. העבירו ?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, מנפיק, תאריך תפוגה והאם השרשרת והשם תקינים. אנחנו מתחברים רק למארחים תחת הדומיין שעליו שאלתם ומדלגים על ספקי דואר, ותוצאה אחת לכל כתובת משותפת למשך 6 שעות. לא נשלח דואר. העבירו ?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: המסלול מעבר אחר מעבר עם עיכובים, TLS וסטיית שעון, ה-Authentication-Results של המקבל עצמו, ההתאמה בין הדומיינים From,‏ DKIM d= ו-Return-Path, וכותרות DKIM,‏ ARC, ביטול הרשמה ומסנני ספאם. כל מה שמופיע אחרי השורה הריקה הראשונה נמחק בלי להיקרא. הכותרות מעובדות בזיכרון ואינן נשמרות, מוטמנות במטמון או נרשמות ביומן.

בדקו את הדומיין בכל לילה.
בדקו את האימייל לפני שהוא נשלח.

משותף לכל מוצר

גישה, מפתחות, פורמט הדוח, סטטוסים, שגיאות, וגם 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 מציינת את הדרישה שלה. נאספו ידנית ולא נוצרו אוטומטית, ולכן אפשר להסתמך עליהם.
תיקונים[]מה לשנות, לפי הסדר, עם מספר הנקודות שכל שינוי שווה. השיפור מחושב באמצעות ניקוד מחדש של הדוח, ולא באמצעות הערכה.
הושלםשקר כאשר לא ניתן היה להריץ בדיקה. פריט שלא נבדק לעולם אינו עובר, לכן יש להתייחס לציון כאופטימי עד שערך זה יהיה אמת.
כתובת_הדוחהדף הקריא לבני אדם. העבירו אותו לאדם במקום קיר של JSON.

סטטוסים

לבדיקה יש אחד מחמישה מצבים, וההבדל בין שניים מהם חשוב יותר מכפי שנראה.

עברהבדיקה רצה ולא מצאה שום בעיה.
אזהרהכדאי לתקן. עולה בנקודות.
נכשליפגע במסירה. מפחית יותר נקודות.
דילוגלא היה רלוונטי. אין קבצים מצורפים לסריקה, ואין חלק 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 מתאר.

קבלת כתובת בדיקה

ארגז חול.

כל נקודת קצה, עם כפתור שמפעיל אותה מול השירות הפעיל. שום דבר כאן אינו דורש מפתח, ולכן בקשה שתשלחו מדף זה היא בקשה אמיתית: היא מקצה כתובת אמיתית והיא נספרת.

נסו בארגז החול