Zapier and Make (webhook-based)

Connect CapchaCloud to Zapier or Make with plain webhooks and HTTP modules. No marketplace listing.

Evidence tooling, not legal advice. Whether a capture satisfies a particular consent requirement is for your counsel to decide.

Set up

  1. Status, plainly: webhook-based, no marketplace listing. There is no CapchaCloud app in the Zapier or Make directories; you use Zapier's Webhooks and Make's HTTP modules.
  2. Inbound to your zap/scenario: register a Catch Hook / custom webhook URL as your tenant webhook (POST /api/v1/tenant/webhook). Each capture then posts a JSON event containing certificate_id, verify_json_url, verify_html_url and the lead fields.
  3. Verify the signature in a Code step before trusting an event (snippet below): HMAC-SHA256 over timestamp + dot + raw body, in the X-CapchaCloud-Signature header as v1=hex.
  4. Outbound from your zap/scenario: call the API with an HTTP module and your API key (verify-lead, suppression check, certificate export).

Snippets

Verify a CapchaCloud webhook signature (Node, for a Code step)server

const crypto = require("crypto");

// rawBody: the exact request body string. headers: the request headers (lower-cased keys).
function verifyCapchaWebhook(rawBody, headers, secret, toleranceSeconds = 300) {
  const sig = String(headers["x-capchacloud-signature"] || "");
  const ts = String(headers["x-capchacloud-timestamp"] || "");
  if (!sig.startsWith("v1=") || !/^\d{10}$/.test(ts)) return false;
  if (Math.abs(Date.now() / 1000 - Number(ts)) > toleranceSeconds) return false;
  const expected = crypto.createHmac("sha256", secret).update(ts + "." + rawBody).digest("hex");
  const got = sig.slice(3);
  return got.length === expected.length && crypto.timingSafeEqual(Buffer.from(got), Buffer.from(expected));
}

HTTP module: check a lead (Zapier Webhooks 'Custom Request' or Make 'Make a request')server

POST https://capchacloud.com/api/v1/verify-lead
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json

{"email": "lead@example.com", "phone": "+15551234567"}

HTTP module: check the suppression (DNC) list before you dial or sendserver

POST https://capchacloud.com/api/v1/suppression/check
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json

{"phone": "+15551234567"}

HTTP module: pull a flat certificate record for a pipeline (LeadConduit-style field names)server

GET https://capchacloud.com/api/v1/leadconduit/cert?certificate_id=CERTIFICATE_ID
Authorization: Bearer YOUR_API_KEY

HTTP module (buyer side): validate a certificate before you buy the leadserver

POST https://capchacloud.com/api/v1/buyer/certificate/validate
Authorization: Bearer YOUR_BUYER_API_KEY
Content-Type: application/json

{"certificate_id": "CERTIFICATE_ID", "max_age_seconds": 86400}

What is tested

Every snippet on this page is checked by an automated test that loads the page, takes the snippet out of it, and runs the real /widget.js in a browser DOM: the attributes must be exactly the ones the widget reads, the form selector must match exactly one form, and a test submission must produce a capture request carrying your campaign and form ids.

What is not verified

  • We have not built or run a Zap or a Make scenario against these calls. The routes and the signature algorithm are verified against the Worker's own route tables and the webhook delivery code; the Zapier/Make UI steps are your side.
  • Server-side calls cannot create browser-captured consent evidence. Consent capture needs the on-page widget (it requires a human Turnstile token).
  • The LeadConduit-style export is a field format only. Publishing it as a marketplace app on ActiveProspect, Zapier or Make would need accounts on those platforms and is not done.

This is not a marketplace app, partner listing or certified integration of Zapier / Make. It is a snippet for your own pages.

All integrations · API reference