Sendardocs
Jump to content
Developer guides

Check email links before sending

Run asynchronous checks on rendered email content, then review broken, skipped and uncertain destinations.

Dashboard workflow

Open Link checker and paste rendered HTML, or use the link panel in the template editor and broadcast composer. Templates remain editable drafts. The broadcast composer requires a completed check of its current sample before sending. Fix broken links or explicitly record a reason for accepting them. Changing the rendered content invalidates the approval.

Queue and retrieve results

POST /link-checks accepts an html string up to 300,000 characters and returns 202 with an id and content_hash. Poll GET /link-checks/{id} until completed or failed. The worker checks at most the first 40 anchors; additional links require a separate check. Thirty jobs per workspace per day are allowed. Jobs and results expire after seven days; queued HTML is discarded after completion.

POST /api/link-checks
{"html":"<a href="https://sendar.app/docs">Documentation</a>"}

GET /api/link-checks/{id}

Interpret the result

Healthy means a destination answered HEAD successfully at check time. Broken covers missing or placeholder links, unresolved template variables and HTTP 404/410. Inconclusive covers timeouts, blocked checks, authentication, other server errors and redirect limits. Skipped covers mailto/tel and recognized action or sensitive links. Query values and long path tokens are redacted in results. A successful check does not guarantee that every personalized email or a later destination will work.

Safety and overrides

The checker uses bounded HEAD requests, validates each redirect, blocks private network addresses and never loads response bodies. Recognized reset, verification, unsubscribe and signed links are not fetched. Review other state-changing destinations manually before submitting content. POST /link-checks/{id}/override requires the exact contentHash and a reason of at least ten characters. The broadcast API accepts an optional linkCheckId: when provided it enforces the current rendered sample and broken-link override. Older API clients without that field keep their existing behavior.

POST /api/link-checks/{id}/override
{"contentHash":"<content_hash from the job>","reason":"Reviewed this intentional placeholder manually"}
Need a hand with your integration?Contact Sendar