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:
POST /api/check— submit a test. Body contains the From address (or the whole raw EML). Returns a check ID.GET /api/check/:id— poll for the final report. Returns per-provider folder placement, authentication verdict, content score.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.
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.
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.