Guides
Testing
Build and check an integration without mailing anyone or spending money.
Postaged has no test keys or sandbox. Use these safe paths to build and check an integration without mailing anyone or spending money.
Send test request
Open a campaign's audience step, open its API / Webhook setup, paste a payload into Request, and choose Send test request.
- It runs the payload through the real checks and shows you the response, so you see each recipient's result before you send live.
- It never claims an address, never charges, and never mails.
- It accepts up to 10 recipients.
- It still runs real address verification, so an address that would not verify shows up here.
The quickstart walks through it step by step.
Check records with ?validate=1
Send a batch to POST /api/integrations/push/v1/records?validate=1 with your integration key. It checks the records against the contract, answers with the same rejections and warnings a push would, and writes nothing. It needs no open sync and no Idempotency-Key.
curl "https://www.postaged.com/api/integrations/push/v1/records?validate=1" \
-H "Authorization: Bearer $POSTAGED_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"records": [
{
"external_id": "crm-1042",
"fields": {
"email": "dana@example.com",
"first_name": "Dana",
"deal_value": "1500"
}
},
{
"external_id": "crm-0977",
"op": "delete"
}
]
}'const response = await fetch("https://www.postaged.com/api/integrations/push/v1/records?validate=1", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.POSTAGED_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
records: [
{
external_id: "crm-1042",
fields: {
email: "dana@example.com",
first_name: "Dana",
deal_value: "1500",
},
},
{
external_id: "crm-0977",
op: "delete",
},
],
}),
});
const result = await response.json();
console.log(result);import os
import requests
response = requests.post(
"https://www.postaged.com/api/integrations/push/v1/records?validate=1",
headers={"Authorization": f"Bearer {os.environ['POSTAGED_API_KEY']}"},
json={
"records": [
{
"external_id": "crm-1042",
"fields": {
"email": "dana@example.com",
"first_name": "Dana",
"deal_value": "1500",
},
},
{
"external_id": "crm-0977",
"op": "delete",
},
],
},
timeout=120,
)
print(response.json()){
"validated": true,
"accepted": 2,
"rejected": 0,
"rejections": [],
"warnings": []
}The validate_records tool
The Integrations MCP server's validate_records tool runs the same check from an agent: it writes nothing and needs no open sync. See Connect Claude to connect it.
Send test event
Choose Send test event on a webhook endpoint in Settings > API & Webhooks. We send a qr.scanned event with example data and a top-level "test": true.
- A test delivery is never retried.
- It never counts toward disabling the endpoint.
{
"event": "qr.scanned",
"id": "evt_test_5d0a9c3e7f21b846",
"test": true,
"scanned_at": "2026-08-09T18:41:22Z",
"campaign": { "id": "PA-EXAMPLE", "name": "Example campaign" },
"recipient": {
"first_name": "Dana",
"last_name": "Whitfield",
"email": "dana@example.com",
"phone": null,
"address_1": "18 Rowan St",
"address_2": null,
"city": "Hartford",
"state": "CT",
"zip": "06105-2214"
},
"location": {
"city": "Hartford",
"region": "CT",
"latitude": 41.76,
"longitude": -72.69
},
"destination": "https://example.com/offers"
}