ReDesk
NewProposals drafted by ReDesk AI in under four minutesSee what's new
Case studySunfield EPC cut feasibility turnaround from 3.4 days to 6 hoursRead the story
Pricing
Sign inSchedule a demo
Documentation

Build on the ReDesk stack

Guides, references and webhooks for every product. Pick the platform you are integrating with — the whole library follows.

Platform
ReDesk AI › Webhooks

Webhooks

Subscribe once and receive every state change as it happens. Events are signed, delivered at least once, and retried with exponential backoff for 24 hours.

Events

EventSent when
project.createdA project is created, in the app or over the API.
project.stage_changedA verified step moves the project to a new stage.
proposal.acceptedThe customer accepts a proposal.
sop_step.verifiedA manager verifies a step's evidence.
milestone.releasedA milestone payment is released.

Subscribe an endpoint

POST/v1/webhook_endpoints

Register a URL to receive events. The response includes the signing secret — it is shown once.

ParameterDescription
url
body · stringrequired
An HTTPS URL that accepts POST requests.
events
body · string[]required
Event names to send, or ["*"] for all.
description
body · string
A note for your team, e.g. which service owns it.
Request
curl -X POST https://api.redesk.ai/v1/webhook_endpoints \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/hooks/redesk",
    "events": [
      "project.created",
      "project.stage_changed"
    ]
  }'
Response
{
  "id": "we_3Jd8",
  "object": "webhook_endpoint",
  "url": "https://example.com/hooks/redesk",
  "events": [
    "project.created",
    "project.stage_changed"
  ],
  "secret": "whsec_f8Kd2...",
  "created_at": "2026-08-01T09:12:00Z"
}

Payload

project.created payload
{
  "id": "evt_1Nc8Yz",
  "type": "project.created",
  "created_at": "2026-08-01T06:20:11Z",
  "data": {
    "object": {
      "id": "prj_71Ka",
      "object": "project",
      "customer": "cus_8Q2Xk",
      "stage": "lead"
    }
  }
}

Verifying signatures

Each delivery carries a ReDesk-Signature header: a timestamp and an HMAC-SHA256 of timestamp.body keyed with your endpoint's secret. Reject anything older than five minutes.

Node.js
import crypto from "node:crypto";

export function verify(rawBody, header, secret) {
  const { t, v1 } = Object.fromEntries(header.split(",").map((kv) => kv.split("=")));
  if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
  const expected = crypto.createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(v1));
}

Retries

AttemptDelay after the previous one
1Immediately
21 minute
310 minutes
41 hour
5–8Every 4 hours, up to 24 hours after the event

Respond with a 2xx within 10 seconds and do the work asynchronously. Deliveries can arrive more than once or out of order — deduplicate on the event id.