API8 min read

Inbox placement test API: free tier vs GlockApps paid-only

GlockApps's API is bundled into paid plans only. Our placement test API has a free tier (with rate limits) and a paid tier for high-volume senders. Here is the minimal surface and how each stacks up.

A placement test API does one thing: accept an email from you, deliver it to a set of seed mailboxes across Gmail, Outlook, Yahoo and other providers, and report back where each one landed (Inbox, Spam, Promotions, not delivered). That is the product.

GlockApps wraps this in a paid-only API — you need the $59/mo Bulk plan minimum, and the API limits scale with tier. Our placement test API has a free tier with generous rate limits and a paid tier for high-volume senders. Both expose the same minimal surface. This article shows exactly how to use it in curl, Node.js and Python, and compares feature-by-feature with GlockApps.

The minimal API for a placement test

Three endpoints cover 100% of what you need to run a test and read the result:

  1. POST /api/check — submit a test. Body contains the From address (or the whole raw EML). Returns a check ID.
  2. GET /api/check/:id — poll for the final report. Returns per-provider folder placement, authentication verdict, content score.
  3. GET /api/check/:id/stream — server-sent events stream that emits each provider's result as it arrives, so UIs can show progress live.

That is the whole interface. No message builder, no template engine, no list management. If you want those, GlockApps bundles them and charges for the bundle.

Authentication and rate limits

Every request carries a bearer token: Authorization: Bearer YOUR_KEY. The free tier allows 20 tests per day per key, with a 5-second minimum interval between POST /api/check calls. The paid tier lifts those to 5000 tests per day, 500/hour burst, and adds webhook callbacks so you don't need to poll.

What the free tier really buys you

Twenty tests per day is enough to audit a single sender weekly, run spot-checks before a big send, or build a small dashboard. It is not enough to power a production monitoring service — that's what the paid tier exists for. GlockApps charges for both uses from the same plan.

cURL: submit and retrieve

The two calls below are the entire happy path. Submit, wait a minute, fetch the report:

# 1. Submit a placement test
curl -X POST https://check.live-direct-marketing.online/api/check \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "sender@yourdomain.com",
    "subject": "Test subject line",
    "providers": ["gmail","outlook","yahoo","mailru","yandex"]
  }'

# Response:
# { "id": "chk_01HN...", "seeds": [...20 addresses...] }

# 2. Send your real email to all seed addresses, then poll:
curl https://check.live-direct-marketing.online/api/check/chk_01HN... \
  -H "Authorization: Bearer YOUR_KEY"

# Response:
# {
#   "id": "chk_01HN...",
#   "status": "complete",
#   "results": {
#     "gmail":    { "folder": "inbox",       "spf": "pass", "dkim": "pass" },
#     "outlook":  { "folder": "junk",        "spf": "pass", "dkim": "pass" },
#     "yahoo":    { "folder": "inbox",       "spf": "pass", "dkim": "pass" },
#     "mailru":   { "folder": "spam",        "spf": "pass", "dkim": "fail" },
#     "yandex":   { "folder": "inbox",       "spf": "pass", "dkim": "pass" }
#   },
#   "content_score": 2.1,
#   "verdict": "inbox_3_of_5"
# }

Node.js (native fetch, Node 18+)

const API = 'https://check.live-direct-marketing.online';
const KEY = process.env.PLACEMENT_API_KEY;

async function runTest(from) {
  const start = await fetch(`${API}/api/check`, {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({ from, providers: ['gmail', 'outlook', 'yahoo'] }),
  }).then(r => r.json());

  console.log('Seeds:', start.seeds);
  // ... your code sends the email to start.seeds here ...

  // Poll until complete
  for (let i = 0; i < 30; i++) {
    await new Promise(r => setTimeout(r, 10_000));
    const report = await fetch(`${API}/api/check/${start.id}`, {
      headers: { 'Authorization': `Bearer ${KEY}` },
    }).then(r => r.json());
    if (report.status === 'complete') return report;
  }
  throw new Error('timeout');
}

runTest('sender@yourdomain.com').then(r => console.log(r.results));

Python (requests)

import os
import time
import requests

API = "https://check.live-direct-marketing.online"
KEY = os.environ["PLACEMENT_API_KEY"]
H = {"Authorization": f"Bearer {KEY}"}

def run_test(from_addr: str):
    start = requests.post(
        f"{API}/api/check",
        json={"from": from_addr, "providers": ["gmail", "outlook", "yahoo"]},
        headers=H,
    ).json()
    # Send your real email to start["seeds"] here

    for _ in range(30):
        time.sleep(10)
        r = requests.get(f"{API}/api/check/{start['id']}", headers=H).json()
        if r["status"] == "complete":
            return r
    raise TimeoutError()

report = run_test("sender@yourdomain.com")
print(report["results"])

Feature-by-feature vs GlockApps

Below is an honest comparison. We use GlockApps for client audits and respect the product; this is not hand-waving.

  • Free tier: ours yes (20/day), GlockApps no (paid only from $59/mo).
  • Endpoints: both offer submit + poll. GlockApps also ships a test-builder API. Ours does not — build your EML in your ESP.
  • SSE live stream: ours yes, GlockApps no (polling only).
  • Webhook callbacks: ours paid tier, GlockApps paid tier.
  • Seed mailbox count: ours 20+, GlockApps 80+. If you need every regional ISP in one run, GlockApps wins.
  • Authentication verdict in response: both yes.
  • Content score (SpamAssassin / Rspamd): ours yes, GlockApps yes.
  • Inbox screenshots: ours yes in the web UI (not in API response), GlockApps yes (API).
  • MCP server for AI agents: ours yes, GlockApps no.

When to pay for our API vs GlockApps

Pay for our paid tier if you want the free-tier experience at higher volume: same API, same endpoints, same predictable behaviour, just with webhooks and 5000 tests/day. It is the right fit for engineering teams building deliverability into a product.

Pay for GlockApps if you need the 80+ seed mailbox coverage (every regional ISP), the test-builder, or the bundled dashboard of content testing, DMARC analyser, and uptime monitor in one seat. It is the right fit for marketing operations teams who live in a dashboard.

A sensible migration path

Start on the free tier. Build a small script that runs weekly. Watch what your placement actually looks like for a month. If the free tier's 20/day becomes the constraint, upgrade to our paid tier. If the 20-mailbox coverage becomes the constraint, then GlockApps is the right tool.

Frequently asked questions

Do I need to send the email myself, or does the API send it for me?

You send it. The API gives you seed addresses; your actual sender (Gmail, SendGrid, your own MTA) sends the message to those seeds. This is deliberate — testing the seed delivery path with a different sender doesn't tell you how your real sender performs.

How long does a test take end-to-end?

60–180 seconds for the 5 major providers. Some regional ISPs (Mail.ru, GMX) can take 3–5 minutes. The /stream endpoint emits each provider result as it arrives so you don't wait for the slowest.

Is there a rate limit on the GET /api/check/:id poll?

Yes — 60 requests per minute per key. Use the /stream endpoint if you need real-time and poll sparingly otherwise. Webhooks on the paid tier remove the need entirely.

Can I test a raw EML file, or only From address?

Free tier: From address only (you send the real message). Paid tier: you can POST a raw EML and we relay it through our own queue to the seeds — handy for CI tests where you don't want to depend on an external sender.
Related reading

Check your deliverability across 20+ providers

Gmail, Outlook, Yahoo, Mail.ru, Yandex, GMX, ProtonMail and more. Real inbox screenshots, SPF/DKIM/DMARC, spam engine verdicts. Free, no signup.

Run Free Test →

Unlimited tests · 20+ seed mailboxes · Live results · No account required