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.

Webhook reference

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

EndpointEventsStatusDelivery ratep50 latencyActions
Order worker — attaches print files to the order
job.completedjob.failedcredits.lowEnabled
99.6%delivered · p50 142 ms
142 ms
Slack alert on finished pipelines
job.completedFailing
71.2%delivered · p50 610 ms
610 ms
Endpoint

https://alvarezprint.co/hooks/designmintEnabled

Order worker — attaches print files to the order · Added Aug 29, 2026

Signing secret

Signs every delivery

whsec_••••••••3f9a

Your 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

EventResponseAttemptDurationWhen
job_01JENHHQQ7 · 16 min ago
2001 of 8106 ms16 min ago
job_01JZE4H4VK · 30 min ago
2001 of 8201 ms30 min ago
job_01JJ91NYZH · 43 min ago
2001 of 8176 ms43 min ago
job_01JEVXHEEC · 57 min ago
2001 of 8154 ms57 min ago
job_01J949DY3J · 2 h ago
2001 of 8244 ms2 h ago
job_01JQPD9PV4 · 2 h ago
2001 of 8116 ms2 h ago
Showing 6 of 18

Verify signatures

Every delivery is signed with its endpoint’s secret. Check it before you trust the body.

  1. 1Read the headerDesignMint-Signature: t=…,v1=… — t is when we signed it, in Unix seconds; v1 is the signature.
  2. 2Sign the raw body yourselfHMAC-SHA256 of {t}.{raw body} with the endpoint’s signing secret, hex-encoded.
  3. 3Compare, then check the timeIt must equal v1 — compare in constant time — and reject anything signed more than five minutes ago.
  4. 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
Webhook reference
server.js
js
1import crypto from 'node:crypto'2import express from 'express'3​4const 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' })8​9app.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  )14​15  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 minutes20​21  if (!valid || !fresh) return res.status(400).send('Bad signature')22​23  res.sendStatus(200) // answer first, then do the work24  handle(JSON.parse(req.body)) // { event, job, result | error }25})