Both flags skip the approved-template requirement and nothing else. Authentication, business ownership, field mapping, required fields, phone validation and opt-out handling all still apply.
Validate only
POST /api/webhooks/ingest?type=appointment&dry_run=1Nothing is queued and Meta is not contacted. The response returns HTTP 200 with the resolved payload after mapping, the message MsgOrb composed, and a template report explaining exactly why a live call would or would not succeed:
{
"success": true,
"mode": "dry_run",
"recipient_phone": "+15551234567",
"resolved_payload": { "client_name": "Jane Doe" },
"composed_message": "Hello Jane Doe, this is a reminder ...",
"template": {
"configured": true,
"approved": false,
"missing_variables": [],
"note": "Status is \"pending\", so a live call would be rejected with 409 until Meta approves it."
}
}Send for real, without a template
POST /api/webhooks/ingest?type=appointment&test_send=1This queues the composed text as a free-form message on the normal pipeline and returns HTTP 202. It is a real send from your connected number.
test_send exists so you can prove the integration works while a template is still awaiting approval. It is not a substitute for one in production.Reading the result
The Connection Logs table at the bottom of each Notification page records the real outcome of every call, including rejections. Green is 2xx, orange is 4xx, red is 5xx. Delivery and Queue Health then shows whether the queued message actually reached the recipient.