openapi: 3.2.0 info: title: Reonic REST Api v3 Webhooks API description: 'The Reonic REST API v3 provides programmatic access to create and manage resources. The API follows REST principles and returns responses in JSON format. Authentication is required via an API key passed in the X-Authorization header. ## Errors All endpoints return errors with the same JSON shape: ```json { "message": "human-readable description" } ``` `400` responses additionally include an `errors` field with per-field validation details. The HTTP status code identifies the cause: | Status | Meaning | When | |--------|---------|------| | `400` | Bad Request | Path params, query string, or request body failed validation. Inspect `errors` for the field-level breakdown. | | `401` | Unauthorized | The `X-Authorization` header is missing, malformed, does not match an active API key, or belongs to a different API version. The response never indicates which check failed; check that the key matches the endpoint version. API v3 endpoints require a v3 key with the `rnc_v3_` prefix. | | `403` | Forbidden | The API key is read-only and the request targeted a write endpoint (`POST`). Issue a key with write access. | | `404` | Not Found | A resource referenced by a path id does not exist or is not visible to your workspace. | | `429` | Too Many Requests | The per-client rate limit was exceeded. See **Rate limiting** below. | | `500` | Internal Server Error | Unexpected failure. Safe to retry once; if it persists, contact support. | | `503` | Service Unavailable | A backing dependency is temporarily unavailable. Retry with exponential backoff. | ## Rate limiting Limits are shared across all API keys you hold and reset on a 1-minute window. Two buckets: | Bucket | Limit | Applies to | |--------|-------|------------| | `cached` | 500 / min | `GET` requests served from the response cache | | `uncached` | 30 / min | Cache misses, `GET` requests sent with `Reonic-Cache-Control: no-cache`, and all `POST` requests | Every response includes: - `X-RateLimit-Bucket` — `cached` or `uncached` - `X-RateLimit-Limit` — the bucket''s ceiling (`500` or `30`) - `X-RateLimit-Remaining` — calls left in the current window - `X-RateLimit-Reset` — Unix epoch seconds at which the window resets - `X-RateLimit-Policy` — `;w=60` `429` responses additionally set `Retry-After` (in seconds). Wait at least that long before retrying. ## Caching and Reonic-Cache-Control `GET` responses are cached for up to 1 hour. Identical requests (same path and query) on the same API key return the cached result. To force a fresh read, send `Reonic-Cache-Control: no-cache`; the response is then refreshed and re-cached. Forced refreshes count against the `uncached` rate-limit bucket. The standard `Cache-Control` header is not honored. Use `Reonic-Cache-Control` to control caching behavior. ## Authentication Every request must include your API key in the `X-Authorization` header: ``` X-Authorization: ``` API keys are issued from the Reonic web app and look like `rnc_v3_…`. Send the full value, including the prefix. ' version: 3.2.0 contact: email: kontakt@reonic.de url: https://reonic.com name: Reonic GmbH servers: - url: '{apiBaseUrl}/rest/v3/' security: - X-Authorization: [] tags: - name: Webhooks description: "Webhooks notify your systems the moment something happens in Reonic. For example when a project is created or an offer is signed. Instead of repeatedly polling the API for changes, you give Reonic a URL and we send an HTTPS `POST` request to it whenever one of the events you selected occurs.\n\nThe receiving URL does not have to be your own server. A webhook trigger from an automation tool works just as well. For example a \"Webhooks by Zapier\" trigger, an n8n Webhook node, or a Make \"Custom webhook\".\n\n### Set up a webhook\n\n1. Get the URL that should receive events — from your own service, or from your automation tool's webhook trigger step. It must be a public `https://` URL; URLs that resolve to private or internal addresses are rejected.\n2. In the Reonic Portal, open the webhook settings (Settings > API / Developers > Webhooks), enter the URL, choose the events you want to receive, and save.\n3. Send a test event from the same settings to confirm deliveries arrive (see [**Test events**](#webhooks-test-events) below).\n\nSaving also generates a signing secret (`whsec_…`), shown in the same settings. You only need it to verify signatures (recommended, see [**Verify signatures**](#webhooks-verify-signatures) below). The secret can be rotated there as well; rotation takes effect immediately and only one secret is valid at a time.\n\nYour endpoint must accept JSON `POST` requests (sent with `Content-Type: application/json`), must not redirect, and must respond within 5 seconds. Acknowledge first and process asynchronously if you need more time.\n\n\n\n### Test events\n\nThe Portal test action sends `X-Reonic-Event: test` with a `{ \"message\": … }` payload in the standard body shape (see [**Request format**](#webhooks-request-format) below). Use it to verify reachability and signature handling before enabling production events. Test deliveries are not retried and do not appear in the delivery log. Your endpoint's response is shown directly in the Portal instead.\n\n\n\n### Request format\n\nEach delivery sends a JSON body with this shape:\n\n```json\n{\n \"version\": 1,\n \"type\": \"project_created\",\n \"occurredAt\": \"2026-01-01T12:00:00.000Z\",\n \"data\": { /* event-specific payload, see the events below */ }\n}\n```\n\nPayloads are deliberately thin: they identify what happened and which resources were involved, but do not embed resource snapshots. Fetch the current state of an affected resource through the corresponding API v3 endpoint — for example, a `project_created` delivery carries a `projectId` to fetch via [**Residential Projects**](#tag/residential-projects) or [**Commercial Projects**](#tag/commercial-projects), depending on its `projectType`.\n\nEvent metadata is also sent in headers:\n\n| Header | Meaning |\n|---|---|\n| `X-Reonic-Event` | Event type for this webhook delivery. Matches the `type` field in the body. |\n| `X-Reonic-Client-Id` | Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. |\n| `X-Reonic-Event-Id` | Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. |\n| `X-Reonic-Delivery-Id` | Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. |\n| `X-Reonic-Timestamp` | Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. |\n| `X-Reonic-Signature` | HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. |\n\n\n\n### Verify signatures\n\nVerifying signatures is optional but strongly recommended: it proves a delivery was really sent by Reonic and not by someone who discovered your URL. If your tool cannot compute HMAC digests, keep your webhook URL secret and treat the data accordingly.\n\nCompute an HMAC SHA-256 digest with your webhook signing secret over `${timestamp}.${rawBody}`, then compare it to `X-Reonic-Signature`. Use the raw request body exactly as received, before JSON parsing. Reject deliveries whose `X-Reonic-Timestamp` is more than 5 minutes old to reduce replay risk — retries are signed freshly, so a legitimate delivery never carries an old timestamp.\n\nCode example:\n\n```ts\nimport { createHmac, timingSafeEqual } from \"crypto\";\n\nconst timestamp = request.headers[\"x-reonic-timestamp\"];\nconst signature = request.headers[\"x-reonic-signature\"];\n\nconst expected = Buffer.from(\"sha256=\" + createHmac(\"sha256\", secret)\n .update(`${timestamp}.${rawBody}`)\n .digest(\"hex\"));\nconst received = Buffer.from(signature);\n\nconst isValid = expected.length === received.length && timingSafeEqual(expected, received);\n```\n\n### Retries and idempotency\n\nRespond with any `2xx` status code once you have accepted the event — automation tools like Zapier and n8n do this for you. Every other response, as well as network errors and timeouts, is retried automatically, roughly 1 min, 5 min, 30 min, 2 h, 5 h, 12 h, 1 d, 2 d after the initial attempt.\n\nDelivery order is not guaranteed, and the same event may be delivered more than once, so store `X-Reonic-Event-Id` and ignore duplicates.\n\n> [!warning]\n> If all retries are exhausted, Reonic disables the webhook subscription and notifies your workspace's contact email. Re-enable it in the webhook settings once your endpoint is fixed.\n\n### When deliveries fail\n\nThe webhook settings in the Portal include a delivery log with every attempt, the response status or error we recorded, and the payload that was sent. Failed deliveries can be retried manually from there — including after you fix your endpoint and re-enable a disabled subscription.\n\n### Compatibility\n\nThe body's `version` (currently 1) only changes when the envelope shape itself — `version`, `type`, `occurredAt`, `data` — changes in a breaking way. New event types, new fields inside `data`, and new headers may appear without a version bump, so ignore anything you don't recognize." paths: {} webhooks: residentialProject_created: post: operationId: webhookV2_residentialProject_created summary: Residential project created description: 'Sent when a residential project is created. **Deprecated** — subscribe to `project_created` instead: it covers both verticals and carries a `projectType`.' deprecated: true tags: - Webhooks parameters: - schema: type: string enum: - residentialProject_created description: Event type for this webhook delivery. Matches the `type` field in the body. required: true description: Event type for this webhook delivery. Matches the `type` field in the body. name: X-Reonic-Event in: header - schema: type: string format: uuid description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. name: X-Reonic-Client-Id in: header - schema: type: string format: uuid description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. name: X-Reonic-Event-Id in: header - schema: type: string format: uuid description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. name: X-Reonic-Delivery-Id in: header - schema: type: string description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. example: '1710000000' required: true description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. name: X-Reonic-Timestamp in: header - schema: type: string description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. example: sha256=ecb03c3a8d08e7137151335708afb85d5ccd756dcdc0ce21245827a56976524e required: true description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. name: X-Reonic-Signature in: header requestBody: description: The message we send to your configured URL when this event happens. content: application/json: schema: type: object properties: version: type: number enum: - 1 description: Version of the public webhook body contract. example: 1 type: type: string enum: - residentialProject_created description: Event type for this delivery. Matches the `X-Reonic-Event` header. example: residentialProject_created occurredAt: type: string format: date-time description: When the event occurred, as an ISO 8601 timestamp. example: '2026-01-01T15:30:00.000Z' data: type: object properties: projectId: type: string format: uuid description: ID of the project this event relates to. Fetch its current state via [**Residential Projects**](#tag/residential-projects). example: 123e4567-e89b-12d3-a456-426614174000 required: - projectId required: - version - type - occurredAt - data description: Webhook body for `residentialProject_created`. responses: 2XX: description: Return any 2xx status code to acknowledge successful receipt. commercialProject_created: post: operationId: webhookV2_commercialProject_created summary: Commercial project created description: 'Sent when a commercial project is created. **Deprecated** — subscribe to `project_created` instead: it covers both verticals and carries a `projectType`.' deprecated: true tags: - Webhooks parameters: - schema: type: string enum: - commercialProject_created description: Event type for this webhook delivery. Matches the `type` field in the body. required: true description: Event type for this webhook delivery. Matches the `type` field in the body. name: X-Reonic-Event in: header - schema: type: string format: uuid description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. name: X-Reonic-Client-Id in: header - schema: type: string format: uuid description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. name: X-Reonic-Event-Id in: header - schema: type: string format: uuid description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. name: X-Reonic-Delivery-Id in: header - schema: type: string description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. example: '1710000000' required: true description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. name: X-Reonic-Timestamp in: header - schema: type: string description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. example: sha256=ecb03c3a8d08e7137151335708afb85d5ccd756dcdc0ce21245827a56976524e required: true description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. name: X-Reonic-Signature in: header requestBody: description: The message we send to your configured URL when this event happens. content: application/json: schema: type: object properties: version: type: number enum: - 1 description: Version of the public webhook body contract. example: 1 type: type: string enum: - commercialProject_created description: Event type for this delivery. Matches the `X-Reonic-Event` header. example: commercialProject_created occurredAt: type: string format: date-time description: When the event occurred, as an ISO 8601 timestamp. example: '2026-01-01T15:30:00.000Z' data: type: object properties: projectId: type: string format: uuid description: ID of the project this event relates to. Fetch its current state via [**Commercial Projects**](#tag/commercial-projects). example: 123e4567-e89b-12d3-a456-426614174000 required: - projectId required: - version - type - occurredAt - data description: Webhook body for `commercialProject_created`. responses: 2XX: description: Return any 2xx status code to acknowledge successful receipt. residentialOffer_signatureRequested: post: operationId: webhookV2_residentialOffer_signatureRequested summary: Residential offer signature requested description: Sent when a signature is requested for a residential offer. tags: - Webhooks parameters: - schema: type: string enum: - residentialOffer_signatureRequested description: Event type for this webhook delivery. Matches the `type` field in the body. required: true description: Event type for this webhook delivery. Matches the `type` field in the body. name: X-Reonic-Event in: header - schema: type: string format: uuid description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. name: X-Reonic-Client-Id in: header - schema: type: string format: uuid description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. name: X-Reonic-Event-Id in: header - schema: type: string format: uuid description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. name: X-Reonic-Delivery-Id in: header - schema: type: string description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. example: '1710000000' required: true description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. name: X-Reonic-Timestamp in: header - schema: type: string description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. example: sha256=ecb03c3a8d08e7137151335708afb85d5ccd756dcdc0ce21245827a56976524e required: true description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. name: X-Reonic-Signature in: header requestBody: description: The message we send to your configured URL when this event happens. content: application/json: schema: type: object properties: version: type: number enum: - 1 description: Version of the public webhook body contract. example: 1 type: type: string enum: - residentialOffer_signatureRequested description: Event type for this delivery. Matches the `X-Reonic-Event` header. example: residentialOffer_signatureRequested occurredAt: type: string format: date-time description: When the event occurred, as an ISO 8601 timestamp. example: '2026-01-01T15:30:00.000Z' data: type: object properties: projectId: type: string format: uuid description: ID of the project this event relates to. Fetch its current state via [**Residential Projects**](#tag/residential-projects). example: 123e4567-e89b-12d3-a456-426614174000 signatureRequestId: type: string format: uuid description: ID of the signature request. Listed under `signatureRequests` on the [**Residential Projects**](#tag/residential-projects) detail response. example: 123e4567-e89b-12d3-a456-426614174000 variantIds: type: array items: type: string format: uuid description: The offer variants presented to the customer for signature. example: - 123e4567-e89b-12d3-a456-426614174000 - 123e4567-e89b-12d3-a456-426614174002 signatureOptions: type: array items: type: object properties: variantId: type: string format: uuid description: The offer variant this signature option belongs to. example: 123e4567-e89b-12d3-a456-426614174000 paymentOptionId: type: - string - 'null' format: uuid description: The payment option this signature option belongs to. `null` for legacy/default-payment documents. example: 123e4567-e89b-12d3-a456-426614174002 required: - variantId - paymentOptionId description: The variant/payment option combinations presented to the customer for signature. required: - projectId - signatureRequestId - variantIds required: - version - type - occurredAt - data description: Webhook body for `residentialOffer_signatureRequested`. responses: 2XX: description: Return any 2xx status code to acknowledge successful receipt. residentialOffer_signed: post: operationId: webhookV2_residentialOffer_signed summary: Residential offer signed description: Sent when a residential offer is signed. A signed offer can still be withdrawn by the customer within the legal withdrawal period — also subscribe to `residentialOffer_signatureWithdrawn` if you act on this event. tags: - Webhooks parameters: - schema: type: string enum: - residentialOffer_signed description: Event type for this webhook delivery. Matches the `type` field in the body. required: true description: Event type for this webhook delivery. Matches the `type` field in the body. name: X-Reonic-Event in: header - schema: type: string format: uuid description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. name: X-Reonic-Client-Id in: header - schema: type: string format: uuid description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. name: X-Reonic-Event-Id in: header - schema: type: string format: uuid description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. name: X-Reonic-Delivery-Id in: header - schema: type: string description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. example: '1710000000' required: true description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. name: X-Reonic-Timestamp in: header - schema: type: string description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. example: sha256=ecb03c3a8d08e7137151335708afb85d5ccd756dcdc0ce21245827a56976524e required: true description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. name: X-Reonic-Signature in: header requestBody: description: The message we send to your configured URL when this event happens. content: application/json: schema: type: object properties: version: type: number enum: - 1 description: Version of the public webhook body contract. example: 1 type: type: string enum: - residentialOffer_signed description: Event type for this delivery. Matches the `X-Reonic-Event` header. example: residentialOffer_signed occurredAt: type: string format: date-time description: When the event occurred, as an ISO 8601 timestamp. example: '2026-01-01T15:30:00.000Z' data: type: object properties: projectId: type: string format: uuid description: ID of the project this event relates to. Fetch its current state via [**Residential Projects**](#tag/residential-projects). example: 123e4567-e89b-12d3-a456-426614174000 signatureRequestId: type: string format: uuid description: ID of the signature request. Listed under `signatureRequests` on the [**Residential Projects**](#tag/residential-projects) detail response. example: 123e4567-e89b-12d3-a456-426614174000 signedVariantId: type: string format: uuid description: The offer variant the customer signed. example: 123e4567-e89b-12d3-a456-426614174000 signedPaymentOptionId: type: - string - 'null' format: uuid description: The payment option the customer signed. `null` for legacy/default-payment documents. example: 123e4567-e89b-12d3-a456-426614174000 required: - projectId - signatureRequestId - signedVariantId required: - version - type - occurredAt - data description: Webhook body for `residentialOffer_signed`. responses: 2XX: description: Return any 2xx status code to acknowledge successful receipt. residentialOffer_signatureWithdrawn: post: operationId: webhookV2_residentialOffer_signatureWithdrawn summary: Residential offer signature withdrawn description: Sent when an end customer withdraws their signature from a signed residential offer — either through the customer self-service withdrawal flow or when their (e.g. postal) withdrawal is recorded with a document. It is not sent when staff withdraw a pending, not-yet-signed signature request. tags: - Webhooks parameters: - schema: type: string enum: - residentialOffer_signatureWithdrawn description: Event type for this webhook delivery. Matches the `type` field in the body. required: true description: Event type for this webhook delivery. Matches the `type` field in the body. name: X-Reonic-Event in: header - schema: type: string format: uuid description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. name: X-Reonic-Client-Id in: header - schema: type: string format: uuid description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. name: X-Reonic-Event-Id in: header - schema: type: string format: uuid description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. name: X-Reonic-Delivery-Id in: header - schema: type: string description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. example: '1710000000' required: true description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. name: X-Reonic-Timestamp in: header - schema: type: string description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. example: sha256=ecb03c3a8d08e7137151335708afb85d5ccd756dcdc0ce21245827a56976524e required: true description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. name: X-Reonic-Signature in: header requestBody: description: The message we send to your configured URL when this event happens. content: application/json: schema: type: object properties: version: type: number enum: - 1 description: Version of the public webhook body contract. example: 1 type: type: string enum: - residentialOffer_signatureWithdrawn description: Event type for this delivery. Matches the `X-Reonic-Event` header. example: residentialOffer_signatureWithdrawn occurredAt: type: string format: date-time description: When the event occurred, as an ISO 8601 timestamp. example: '2026-01-01T15:30:00.000Z' data: type: object properties: projectId: type: string format: uuid description: ID of the project this event relates to. Fetch its current state via [**Residential Projects**](#tag/residential-projects). example: 123e4567-e89b-12d3-a456-426614174000 signatureRequestId: type: string format: uuid description: ID of the signature request. Listed under `signatureRequests` on the [**Residential Projects**](#tag/residential-projects) detail response. example: 123e4567-e89b-12d3-a456-426614174000 required: - projectId - signatureRequestId required: - version - type - occurredAt - data description: Webhook body for `residentialOffer_signatureWithdrawn`. responses: 2XX: description: Return any 2xx status code to acknowledge successful receipt. residentialProject_kanbanColumnChanged: post: operationId: webhookV2_residentialProject_kanbanColumnChanged summary: Residential project Kanban column changed description: 'Sent when a residential project moves to a different Kanban column. **Deprecated** — subscribe to `project_kanbanColumnChanged` instead: it covers both verticals and carries a `projectType`.' deprecated: true tags: - Webhooks parameters: - schema: type: string enum: - residentialProject_kanbanColumnChanged description: Event type for this webhook delivery. Matches the `type` field in the body. required: true description: Event type for this webhook delivery. Matches the `type` field in the body. name: X-Reonic-Event in: header - schema: type: string format: uuid description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. name: X-Reonic-Client-Id in: header - schema: type: string format: uuid description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. name: X-Reonic-Event-Id in: header - schema: type: string format: uuid description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. name: X-Reonic-Delivery-Id in: header - schema: type: string description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. example: '1710000000' required: true description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. name: X-Reonic-Timestamp in: header - schema: type: string description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. example: sha256=ecb03c3a8d08e7137151335708afb85d5ccd756dcdc0ce21245827a56976524e required: true description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. name: X-Reonic-Signature in: header requestBody: description: The message we send to your configured URL when this event happens. content: application/json: schema: type: object properties: version: type: number enum: - 1 description: Version of the public webhook body contract. example: 1 type: type: string enum: - residentialProject_kanbanColumnChanged description: Event type for this delivery. Matches the `X-Reonic-Event` header. example: residentialProject_kanbanColumnChanged occurredAt: type: string format: date-time description: When the event occurred, as an ISO 8601 timestamp. example: '2026-01-01T15:30:00.000Z' data: type: object properties: projectId: type: string format: uuid description: ID of the project this event relates to. Fetch its current state via [**Residential Projects**](#tag/residential-projects). example: 123e4567-e89b-12d3-a456-426614174000 previousStage: type: - string - 'null' enum: - request - offer - installation - null newStage: type: - string - 'null' enum: - request - offer - installation - null previousKanbanColumnId: type: - string - 'null' format: uuid description: Reference to [**Kanban Columns**](#tag/kanban-columns). example: 123e4567-e89b-12d3-a456-426614174000 newKanbanColumnId: type: - string - 'null' format: uuid description: Reference to [**Kanban Columns**](#tag/kanban-columns). example: 123e4567-e89b-12d3-a456-426614174000 required: - projectId - previousStage - newStage - previousKanbanColumnId - newKanbanColumnId required: - version - type - occurredAt - data description: Webhook body for `residentialProject_kanbanColumnChanged`. responses: 2XX: description: Return any 2xx status code to acknowledge successful receipt. commercialProject_kanbanColumnChanged: post: operationId: webhookV2_commercialProject_kanbanColumnChanged summary: Commercial project Kanban column changed description: 'Sent when a commercial project moves to a different Kanban column. **Deprecated** — subscribe to `project_kanbanColumnChanged` instead: it covers both verticals and carries a `projectType`.' deprecated: true tags: - Webhooks parameters: - schema: type: string enum: - commercialProject_kanbanColumnChanged description: Event type for this webhook delivery. Matches the `type` field in the body. required: true description: Event type for this webhook delivery. Matches the `type` field in the body. name: X-Reonic-Event in: header - schema: type: string format: uuid description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. name: X-Reonic-Client-Id in: header - schema: type: string format: uuid description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. name: X-Reonic-Event-Id in: header - schema: type: string format: uuid description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. name: X-Reonic-Delivery-Id in: header - schema: type: string description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. example: '1710000000' required: true description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. name: X-Reonic-Timestamp in: header - schema: type: string description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. example: sha256=ecb03c3a8d08e7137151335708afb85d5ccd756dcdc0ce21245827a56976524e required: true description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. name: X-Reonic-Signature in: header requestBody: description: The message we send to your configured URL when this event happens. content: application/json: schema: type: object properties: version: type: number enum: - 1 description: Version of the public webhook body contract. example: 1 type: type: string enum: - commercialProject_kanbanColumnChanged description: Event type for this delivery. Matches the `X-Reonic-Event` header. example: commercialProject_kanbanColumnChanged occurredAt: type: string format: date-time description: When the event occurred, as an ISO 8601 timestamp. example: '2026-01-01T15:30:00.000Z' data: type: object properties: projectId: type: string format: uuid description: ID of the project this event relates to. Fetch its current state via [**Commercial Projects**](#tag/commercial-projects). example: 123e4567-e89b-12d3-a456-426614174000 previousStage: type: - string - 'null' enum: - request - offer - installation - null newStage: type: - string - 'null' enum: - request - offer - installation - null previousKanbanColumnId: type: - string - 'null' format: uuid description: Reference to [**Kanban Columns**](#tag/kanban-columns). example: 123e4567-e89b-12d3-a456-426614174000 newKanbanColumnId: type: - string - 'null' format: uuid description: Reference to [**Kanban Columns**](#tag/kanban-columns). example: 123e4567-e89b-12d3-a456-426614174000 required: - projectId - previousStage - newStage - previousKanbanColumnId - newKanbanColumnId required: - version - type - occurredAt - data description: Webhook body for `commercialProject_kanbanColumnChanged`. responses: 2XX: description: Return any 2xx status code to acknowledge successful receipt. residentialProject_dealStateChanged: post: operationId: webhookV2_residentialProject_dealStateChanged summary: Residential project deal-state changed description: 'Sent when a residential project''s deal state changes. **Deprecated** — subscribe to `project_dealStateChanged` instead: it covers both verticals and carries a `projectType`.' deprecated: true tags: - Webhooks parameters: - schema: type: string enum: - residentialProject_dealStateChanged description: Event type for this webhook delivery. Matches the `type` field in the body. required: true description: Event type for this webhook delivery. Matches the `type` field in the body. name: X-Reonic-Event in: header - schema: type: string format: uuid description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. name: X-Reonic-Client-Id in: header - schema: type: string format: uuid description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. name: X-Reonic-Event-Id in: header - schema: type: string format: uuid description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. name: X-Reonic-Delivery-Id in: header - schema: type: string description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. example: '1710000000' required: true description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. name: X-Reonic-Timestamp in: header - schema: type: string description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. example: sha256=ecb03c3a8d08e7137151335708afb85d5ccd756dcdc0ce21245827a56976524e required: true description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. name: X-Reonic-Signature in: header requestBody: description: The message we send to your configured URL when this event happens. content: application/json: schema: type: object properties: version: type: number enum: - 1 description: Version of the public webhook body contract. example: 1 type: type: string enum: - residentialProject_dealStateChanged description: Event type for this delivery. Matches the `X-Reonic-Event` header. example: residentialProject_dealStateChanged occurredAt: type: string format: date-time description: When the event occurred, as an ISO 8601 timestamp. example: '2026-01-01T15:30:00.000Z' data: type: object properties: projectId: type: string format: uuid description: ID of the project this event relates to. Fetch its current state via [**Residential Projects**](#tag/residential-projects). example: 123e4567-e89b-12d3-a456-426614174000 previousDealState: type: - string - 'null' enum: - Open - Won - Lost - null newDealState: type: - string - 'null' enum: - Open - Won - Lost - null required: - projectId - previousDealState - newDealState required: - version - type - occurredAt - data description: Webhook body for `residentialProject_dealStateChanged`. responses: 2XX: description: Return any 2xx status code to acknowledge successful receipt. commercialProject_dealStateChanged: post: operationId: webhookV2_commercialProject_dealStateChanged summary: Commercial project deal-state changed description: 'Sent when a commercial project''s deal state changes. **Deprecated** — subscribe to `project_dealStateChanged` instead: it covers both verticals and carries a `projectType`.' deprecated: true tags: - Webhooks parameters: - schema: type: string enum: - commercialProject_dealStateChanged description: Event type for this webhook delivery. Matches the `type` field in the body. required: true description: Event type for this webhook delivery. Matches the `type` field in the body. name: X-Reonic-Event in: header - schema: type: string format: uuid description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. name: X-Reonic-Client-Id in: header - schema: type: string format: uuid description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. name: X-Reonic-Event-Id in: header - schema: type: string format: uuid description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. name: X-Reonic-Delivery-Id in: header - schema: type: string description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. example: '1710000000' required: true description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. name: X-Reonic-Timestamp in: header - schema: type: string description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. example: sha256=ecb03c3a8d08e7137151335708afb85d5ccd756dcdc0ce21245827a56976524e required: true description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. name: X-Reonic-Signature in: header requestBody: description: The message we send to your configured URL when this event happens. content: application/json: schema: type: object properties: version: type: number enum: - 1 description: Version of the public webhook body contract. example: 1 type: type: string enum: - commercialProject_dealStateChanged description: Event type for this delivery. Matches the `X-Reonic-Event` header. example: commercialProject_dealStateChanged occurredAt: type: string format: date-time description: When the event occurred, as an ISO 8601 timestamp. example: '2026-01-01T15:30:00.000Z' data: type: object properties: projectId: type: string format: uuid description: ID of the project this event relates to. Fetch its current state via [**Commercial Projects**](#tag/commercial-projects). example: 123e4567-e89b-12d3-a456-426614174000 previousDealState: type: - string - 'null' enum: - Open - Won - Lost - null newDealState: type: - string - 'null' enum: - Open - Won - Lost - null required: - projectId - previousDealState - newDealState required: - version - type - occurredAt - data description: Webhook body for `commercialProject_dealStateChanged`. responses: 2XX: description: Return any 2xx status code to acknowledge successful receipt. project_archived: post: operationId: webhookV2_project_archived summary: Project archived description: Sent when a residential or commercial project is archived. tags: - Webhooks parameters: - schema: type: string enum: - project_archived description: Event type for this webhook delivery. Matches the `type` field in the body. required: true description: Event type for this webhook delivery. Matches the `type` field in the body. name: X-Reonic-Event in: header - schema: type: string format: uuid description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. name: X-Reonic-Client-Id in: header - schema: type: string format: uuid description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. name: X-Reonic-Event-Id in: header - schema: type: string format: uuid description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. name: X-Reonic-Delivery-Id in: header - schema: type: string description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. example: '1710000000' required: true description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. name: X-Reonic-Timestamp in: header - schema: type: string description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. example: sha256=ecb03c3a8d08e7137151335708afb85d5ccd756dcdc0ce21245827a56976524e required: true description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. name: X-Reonic-Signature in: header requestBody: description: The message we send to your configured URL when this event happens. content: application/json: schema: type: object properties: version: type: number enum: - 1 description: Version of the public webhook body contract. example: 1 type: type: string enum: - project_archived description: Event type for this delivery. Matches the `X-Reonic-Event` header. example: project_archived occurredAt: type: string format: date-time description: When the event occurred, as an ISO 8601 timestamp. example: '2026-01-01T15:30:00.000Z' data: type: object properties: projectId: type: string format: uuid description: ID of the project this event relates to. Fetch its current state via [**Residential Projects**](#tag/residential-projects) or [**Commercial Projects**](#tag/commercial-projects), depending on `projectType`. example: 123e4567-e89b-12d3-a456-426614174000 projectType: type: string enum: - residential - commercial description: Which vertical the project belongs to. example: residential required: - projectId - projectType required: - version - type - occurredAt - data description: Webhook body for `project_archived`. responses: 2XX: description: Return any 2xx status code to acknowledge successful receipt. projectChecklist_segmentCompletionChanged: post: operationId: webhookV2_projectChecklist_segmentCompletionChanged summary: Project checklist segment completion changed description: Sent when a checklist segment is completed or un-completed for a project. tags: - Webhooks parameters: - schema: type: string enum: - projectChecklist_segmentCompletionChanged description: Event type for this webhook delivery. Matches the `type` field in the body. required: true description: Event type for this webhook delivery. Matches the `type` field in the body. name: X-Reonic-Event in: header - schema: type: string format: uuid description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. name: X-Reonic-Client-Id in: header - schema: type: string format: uuid description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. name: X-Reonic-Event-Id in: header - schema: type: string format: uuid description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. name: X-Reonic-Delivery-Id in: header - schema: type: string description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. example: '1710000000' required: true description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. name: X-Reonic-Timestamp in: header - schema: type: string description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. example: sha256=ecb03c3a8d08e7137151335708afb85d5ccd756dcdc0ce21245827a56976524e required: true description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. name: X-Reonic-Signature in: header requestBody: description: The message we send to your configured URL when this event happens. content: application/json: schema: type: object properties: version: type: number enum: - 1 description: Version of the public webhook body contract. example: 1 type: type: string enum: - projectChecklist_segmentCompletionChanged description: Event type for this delivery. Matches the `X-Reonic-Event` header. example: projectChecklist_segmentCompletionChanged occurredAt: type: string format: date-time description: When the event occurred, as an ISO 8601 timestamp. example: '2026-01-01T15:30:00.000Z' data: type: object properties: projectId: type: string format: uuid description: ID of the project this event relates to. Fetch its current state via [**Residential Projects**](#tag/residential-projects). example: 123e4567-e89b-12d3-a456-426614174000 checklistId: type: string format: uuid description: Reference to [**Checklists**](#tag/checklists). example: 123e4567-e89b-12d3-a456-426614174000 segmentId: type: string format: uuid description: ID of the segment within the [**Checklists**](#tag/checklists) response. example: 123e4567-e89b-12d3-a456-426614174000 completed: type: boolean description: Whether the segment is completed after this change. example: true changedByUserId: type: string format: uuid description: Reference to [**Users**](#tag/users) — the user who completed or un-completed the segment. example: 123e4567-e89b-12d3-a456-426614174000 required: - projectId - checklistId - segmentId - completed - changedByUserId required: - version - type - occurredAt - data description: Webhook body for `projectChecklist_segmentCompletionChanged`. responses: 2XX: description: Return any 2xx status code to acknowledge successful receipt. projectChecklist_pdfGenerated: post: operationId: webhookV2_projectChecklist_pdfGenerated summary: Checklist PDF generated description: Sent when a PDF export of a project's checklist has finished generating and is available for download. tags: - Webhooks parameters: - schema: type: string enum: - projectChecklist_pdfGenerated description: Event type for this webhook delivery. Matches the `type` field in the body. required: true description: Event type for this webhook delivery. Matches the `type` field in the body. name: X-Reonic-Event in: header - schema: type: string format: uuid description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. name: X-Reonic-Client-Id in: header - schema: type: string format: uuid description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. name: X-Reonic-Event-Id in: header - schema: type: string format: uuid description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. name: X-Reonic-Delivery-Id in: header - schema: type: string description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. example: '1710000000' required: true description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. name: X-Reonic-Timestamp in: header - schema: type: string description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. example: sha256=ecb03c3a8d08e7137151335708afb85d5ccd756dcdc0ce21245827a56976524e required: true description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. name: X-Reonic-Signature in: header requestBody: description: The message we send to your configured URL when this event happens. content: application/json: schema: type: object properties: version: type: number enum: - 1 description: Version of the public webhook body contract. example: 1 type: type: string enum: - projectChecklist_pdfGenerated description: Event type for this delivery. Matches the `X-Reonic-Event` header. example: projectChecklist_pdfGenerated occurredAt: type: string format: date-time description: When the event occurred, as an ISO 8601 timestamp. example: '2026-01-01T15:30:00.000Z' data: type: object properties: projectId: type: string format: uuid description: Reference to [**Residential Projects**](#tag/residential-projects) or [**Commercial Projects**](#tag/commercial-projects) — the project this checklist belongs to. example: 123e4567-e89b-12d3-a456-426614174000 projectType: type: string enum: - residentialProject - commercialProject description: The type of project the checklist belongs to, indicating which endpoint to use for projectId. example: residentialProject checklistId: type: string format: uuid description: Reference to [**Checklists**](#tag/checklists). example: 123e4567-e89b-12d3-a456-426614174000 fileId: type: string format: uuid description: Reference to [**Files**](#tag/files) — fetch it to obtain the download URL for the generated PDF. example: 123e4567-e89b-12d3-a456-426614174000 required: - projectId - projectType - checklistId - fileId required: - version - type - occurredAt - data description: Webhook body for `projectChecklist_pdfGenerated`. responses: 2XX: description: Return any 2xx status code to acknowledge successful receipt. contact_created: post: operationId: webhookV2_contact_created summary: Contact created description: 'Sent when a new contact is created, either directly or while creating a project. Contact creation is deduplicated: when an existing matching contact is reused for a new project, this event is not sent.' tags: - Webhooks parameters: - schema: type: string enum: - contact_created description: Event type for this webhook delivery. Matches the `type` field in the body. required: true description: Event type for this webhook delivery. Matches the `type` field in the body. name: X-Reonic-Event in: header - schema: type: string format: uuid description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. name: X-Reonic-Client-Id in: header - schema: type: string format: uuid description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. name: X-Reonic-Event-Id in: header - schema: type: string format: uuid description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. name: X-Reonic-Delivery-Id in: header - schema: type: string description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. example: '1710000000' required: true description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. name: X-Reonic-Timestamp in: header - schema: type: string description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. example: sha256=ecb03c3a8d08e7137151335708afb85d5ccd756dcdc0ce21245827a56976524e required: true description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. name: X-Reonic-Signature in: header requestBody: description: The message we send to your configured URL when this event happens. content: application/json: schema: type: object properties: version: type: number enum: - 1 description: Version of the public webhook body contract. example: 1 type: type: string enum: - contact_created description: Event type for this delivery. Matches the `X-Reonic-Event` header. example: contact_created occurredAt: type: string format: date-time description: When the event occurred, as an ISO 8601 timestamp. example: '2026-01-01T15:30:00.000Z' data: type: object properties: contactId: type: string format: uuid description: Reference to [**Contacts**](#tag/contacts). example: 123e4567-e89b-12d3-a456-426614174000 required: - contactId required: - version - type - occurredAt - data description: Webhook body for `contact_created`. responses: 2XX: description: Return any 2xx status code to acknowledge successful receipt. project_created: post: operationId: webhookV2_project_created summary: Project created description: Sent when a project is created, regardless of vertical. `projectType` tells whether the project is residential or commercial. tags: - Webhooks parameters: - schema: type: string enum: - project_created description: Event type for this webhook delivery. Matches the `type` field in the body. required: true description: Event type for this webhook delivery. Matches the `type` field in the body. name: X-Reonic-Event in: header - schema: type: string format: uuid description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. name: X-Reonic-Client-Id in: header - schema: type: string format: uuid description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. name: X-Reonic-Event-Id in: header - schema: type: string format: uuid description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. name: X-Reonic-Delivery-Id in: header - schema: type: string description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. example: '1710000000' required: true description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. name: X-Reonic-Timestamp in: header - schema: type: string description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. example: sha256=ecb03c3a8d08e7137151335708afb85d5ccd756dcdc0ce21245827a56976524e required: true description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. name: X-Reonic-Signature in: header requestBody: description: The message we send to your configured URL when this event happens. content: application/json: schema: type: object properties: version: type: number enum: - 1 description: Version of the public webhook body contract. example: 1 type: type: string enum: - project_created description: Event type for this delivery. Matches the `X-Reonic-Event` header. example: project_created occurredAt: type: string format: date-time description: When the event occurred, as an ISO 8601 timestamp. example: '2026-01-01T15:30:00.000Z' data: type: object properties: projectId: type: string format: uuid description: ID of the project this event relates to. Fetch its current state via [**Residential Projects**](#tag/residential-projects) or [**Commercial Projects**](#tag/commercial-projects), depending on `projectType`. example: 123e4567-e89b-12d3-a456-426614174000 projectType: type: string enum: - residential - commercial description: Which vertical the project belongs to. example: residential required: - projectId - projectType required: - version - type - occurredAt - data description: Webhook body for `project_created`. responses: 2XX: description: Return any 2xx status code to acknowledge successful receipt. project_kanbanColumnChanged: post: operationId: webhookV2_project_kanbanColumnChanged summary: Project Kanban column changed description: Sent when a project moves to a different Kanban column, regardless of vertical. `projectType` tells whether the project is residential or commercial. tags: - Webhooks parameters: - schema: type: string enum: - project_kanbanColumnChanged description: Event type for this webhook delivery. Matches the `type` field in the body. required: true description: Event type for this webhook delivery. Matches the `type` field in the body. name: X-Reonic-Event in: header - schema: type: string format: uuid description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. name: X-Reonic-Client-Id in: header - schema: type: string format: uuid description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. name: X-Reonic-Event-Id in: header - schema: type: string format: uuid description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. name: X-Reonic-Delivery-Id in: header - schema: type: string description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. example: '1710000000' required: true description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. name: X-Reonic-Timestamp in: header - schema: type: string description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. example: sha256=ecb03c3a8d08e7137151335708afb85d5ccd756dcdc0ce21245827a56976524e required: true description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. name: X-Reonic-Signature in: header requestBody: description: The message we send to your configured URL when this event happens. content: application/json: schema: type: object properties: version: type: number enum: - 1 description: Version of the public webhook body contract. example: 1 type: type: string enum: - project_kanbanColumnChanged description: Event type for this delivery. Matches the `X-Reonic-Event` header. example: project_kanbanColumnChanged occurredAt: type: string format: date-time description: When the event occurred, as an ISO 8601 timestamp. example: '2026-01-01T15:30:00.000Z' data: type: object properties: projectId: type: string format: uuid description: ID of the project this event relates to. Fetch its current state via [**Residential Projects**](#tag/residential-projects) or [**Commercial Projects**](#tag/commercial-projects), depending on `projectType`. example: 123e4567-e89b-12d3-a456-426614174000 projectType: type: string enum: - residential - commercial description: Which vertical the project belongs to. example: residential previousStage: type: - string - 'null' enum: - request - offer - installation - null newStage: type: - string - 'null' enum: - request - offer - installation - null previousKanbanColumnId: type: - string - 'null' format: uuid description: Reference to [**Kanban Columns**](#tag/kanban-columns). example: 123e4567-e89b-12d3-a456-426614174000 newKanbanColumnId: type: - string - 'null' format: uuid description: Reference to [**Kanban Columns**](#tag/kanban-columns). example: 123e4567-e89b-12d3-a456-426614174000 required: - projectId - projectType - previousStage - newStage - previousKanbanColumnId - newKanbanColumnId required: - version - type - occurredAt - data description: Webhook body for `project_kanbanColumnChanged`. responses: 2XX: description: Return any 2xx status code to acknowledge successful receipt. project_dealStateChanged: post: operationId: webhookV2_project_dealStateChanged summary: Project deal-state changed description: Sent when a project's deal state changes, regardless of vertical. `projectType` tells whether the project is residential or commercial. tags: - Webhooks parameters: - schema: type: string enum: - project_dealStateChanged description: Event type for this webhook delivery. Matches the `type` field in the body. required: true description: Event type for this webhook delivery. Matches the `type` field in the body. name: X-Reonic-Event in: header - schema: type: string format: uuid description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. name: X-Reonic-Client-Id in: header - schema: type: string format: uuid description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. name: X-Reonic-Event-Id in: header - schema: type: string format: uuid description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. name: X-Reonic-Delivery-Id in: header - schema: type: string description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. example: '1710000000' required: true description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. name: X-Reonic-Timestamp in: header - schema: type: string description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. example: sha256=ecb03c3a8d08e7137151335708afb85d5ccd756dcdc0ce21245827a56976524e required: true description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. name: X-Reonic-Signature in: header requestBody: description: The message we send to your configured URL when this event happens. content: application/json: schema: type: object properties: version: type: number enum: - 1 description: Version of the public webhook body contract. example: 1 type: type: string enum: - project_dealStateChanged description: Event type for this delivery. Matches the `X-Reonic-Event` header. example: project_dealStateChanged occurredAt: type: string format: date-time description: When the event occurred, as an ISO 8601 timestamp. example: '2026-01-01T15:30:00.000Z' data: type: object properties: projectId: type: string format: uuid description: ID of the project this event relates to. Fetch its current state via [**Residential Projects**](#tag/residential-projects) or [**Commercial Projects**](#tag/commercial-projects), depending on `projectType`. example: 123e4567-e89b-12d3-a456-426614174000 projectType: type: string enum: - residential - commercial description: Which vertical the project belongs to. example: residential previousDealState: type: - string - 'null' enum: - Open - Won - Lost - null newDealState: type: - string - 'null' enum: - Open - Won - Lost - null required: - projectId - projectType - previousDealState - newDealState required: - version - type - occurredAt - data description: Webhook body for `project_dealStateChanged`. responses: 2XX: description: Return any 2xx status code to acknowledge successful receipt. test: post: operationId: webhookV2_test summary: Test event description: Sent when an admin uses the Portal's webhook test action. Use it to verify reachability and signature handling before enabling production events. deprecated: false tags: - Webhooks parameters: - schema: type: string enum: - test description: Event type for this webhook delivery. Matches the `type` field in the body. required: true description: Event type for this webhook delivery. Matches the `type` field in the body. name: X-Reonic-Event in: header - schema: type: string format: uuid description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Id of the sending client. Stable across deliveries. If one endpoint receives webhooks from multiple clients, use this to pick the matching signing secret before verifying the signature. name: X-Reonic-Client-Id in: header - schema: type: string format: uuid description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Stable event id, identical across redeliveries of the same event. Use this as your idempotency key. name: X-Reonic-Event-Id in: header - schema: type: string format: uuid description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. example: 123e4567-e89b-12d3-a456-426614174000 required: true description: Unique id of this delivery attempt. Unlike the event id, it changes on every redelivery — reference it when reporting issues with a specific delivery. name: X-Reonic-Delivery-Id in: header - schema: type: string description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. example: '1710000000' required: true description: Unix timestamp in seconds at which this delivery was signed. Changes on every redelivery — verify signatures against this value, not the body's `occurredAt`. name: X-Reonic-Timestamp in: header - schema: type: string description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. example: sha256=ecb03c3a8d08e7137151335708afb85d5ccd756dcdc0ce21245827a56976524e required: true description: HMAC SHA-256 signature in the format `sha256=`, computed over `${timestamp}.${rawBody}`. name: X-Reonic-Signature in: header requestBody: description: The message we send to your configured URL when this event happens. content: application/json: schema: type: object properties: version: type: number enum: - 1 description: Version of the public webhook body contract. example: 1 type: type: string enum: - test description: Event type for this delivery. Matches the `X-Reonic-Event` header. example: test occurredAt: type: string format: date-time description: When the event occurred, as an ISO 8601 timestamp. example: '2026-01-01T15:30:00.000Z' data: type: object properties: message: type: string description: Human-readable confirmation that your webhook setup is working. required: - message required: - version - type - occurredAt - data description: Webhook body for `test`. responses: 2XX: description: Return any 2xx status code to acknowledge successful receipt. components: securitySchemes: X-Authorization: type: apiKey in: header name: X-Authorization x-tagGroups: - name: People tags: - Contacts - Users - Teams - name: Projects tags: - Residential Projects - Commercial Projects - name: Working on a project tags: - Notes - Tasks - Files - File Folders - Activities - Time Tracking - Checklists - Checklist Templates - Signature Requests - name: Calendar tags: - Calendars - Calendar Categories - Appointments - name: Catalog tags: - Components - Planning Templates - Planning Packages - Offer Templates - name: Workspace setup tags: - Kanban Boards - Kanban Columns - Tags - Lead Sources - name: Wiki tags: - Wiki - name: Services tags: - Photogrammetry - name: API helpers tags: - Upload - Links - name: Integrations tags: - Webhooks - name: Guides tags: - Migrating from API v2 to v3 - Changelog