Webhooks
We POST to your endpoint when a job finishes or your balance runs low, and retry with backoff for 24 hours until you answer 2xx.
hooks.zapier.com is failing. It has answered 500 to every delivery since 08:00 UTC. The latest has failed 3 of 8 attempts; the next retry is at 10:43 UTC, in 14 min. 6 deliveries are waiting to retry.
Endpoints
2 registered · delivery rate and latency over the last 30 days
| Endpoint | Events | Status | Delivery rate | p50 latency | Actions |
|---|---|---|---|---|---|
Order worker — attaches print files to the order | job.completedjob.failedcredits.low | Enabled | 99.6%delivered · p50 142 ms | 142 ms | |
Slack alert on finished pipelines | job.completed | Failing | 71.2%delivered · p50 610 ms | 610 ms |
Endpointhttps://alvarezprint.co/
https://alvarezprint.co/ hooks/ designmintEnabled
Order worker — attaches print files to the order · Added Aug 29, 2026
Signing secret
Signs every delivery
whsec_••••••••3f9aYour endpoint checks it against the DesignMint-Signature header — see how.
Events
3 of 3 sent to this endpoint
job.completedA job finished and its outputs are ready.job.failedA job could not complete. Failed jobs are not charged.credits.lowThe balance dropped below your alert threshold. Yours is set to 3,000 credits.Recent deliveries
Newest first · select one for the request and response
| Event | Response | Attempt | Duration | When |
|---|---|---|---|---|
job_01JENHHQQ7 · 16 min ago | 200 | 1 of 8 | 106 ms | 16 min ago |
job_01JZE4H4VK · 30 min ago | 200 | 1 of 8 | 201 ms | 30 min ago |
job_01JJ91NYZH · 43 min ago | 200 | 1 of 8 | 176 ms | 43 min ago |
job_01JEVXHEEC · 57 min ago | 200 | 1 of 8 | 154 ms | 57 min ago |
job_01J949DY3J · 2 h ago | 200 | 1 of 8 | 244 ms | 2 h ago |
job_01JQPD9PV4 · 2 h ago | 200 | 1 of 8 | 116 ms | 2 h ago |
Verify signatures
Every delivery is signed with its endpoint’s secret. Check it before you trust the body.
- 1Read the headerDesignMint-Signature: t=…,v1=… — t is when we signed it, in Unix seconds; v1 is the signature.
- 2Sign the raw body yourselfHMAC-SHA256 of {t}.{raw body} with the endpoint’s signing secret, hex-encoded.
- 3Compare, then check the timeIt must equal v1 — compare in constant time — and reject anything signed more than five minutes ago.
- 4Answer 2xx, then do the workAnything else, or no answer, is retried with backoff — 8 attempts over 24 hours:now+1 min+5 min+30 min+2 h+6 h+12 h+24 h
server.js
js
1import crypto from 'node:crypto'2import express from 'express'34const app = express()5const secret = process.env.DM_WEBHOOK_SECRET // whsec_…6// Keep the raw bytes: re-serialised JSON won't match the signature.7const raw = express.raw({ type: 'application/json' })89app.post('/hooks/designmint', raw, (req, res) => {10 const header = req.get('DesignMint-Signature') ?? ''11 const { t, v1 = '' } = Object.fromEntries(12 header.split(',').map((part) => part.split('=')),13 )1415 const expected = crypto.createHmac('sha256', secret)16 .update(`${t}.${req.body}`).digest('hex')17 const valid = v1.length === expected.length &&18 crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(expected))19 const fresh = Date.now() / 1000 - Number(t) < 5 * 60 // 5 minutes2021 if (!valid || !fresh) return res.status(400).send('Bad signature')2223 res.sendStatus(200) // answer first, then do the work24 handle(JSON.parse(req.body)) // { event, job, result | error }25})