workorder.create the natural replacement for polling your queue: the event is the signal that a work order has landed in your queue, usually waiting for you to accept or decline it.
Set up an endpoint
Endpoints are registered per supplier facility. A company with several facilities registers each one that has its own integration. There is no self-serve API for this yet: email support@useopenwrench.com with- the HTTPS URL that should receive deliveries,
- which of the three events you want (
workorder.create,workorder.status_update,workorder.new_note), and - whether the endpoint is for testing or production.
Events
Some detail on each:
workorder.createmeans “new work for you”, not only “a new row was created”. It fires when a work order is created with your facility assigned, when a buyer reassigns an existing work order to you (it entersPendingConfirmationByServiceProvider), and when you open a supplier-initiated work order yourself (SupplierInitiatedPendingApproval). A work order created for you that first needs the buyer’s internal approval emitsworkorder.createonce it reachesPendingConfirmationByServiceProvider, not when the buyer’s approver first sees it.workorder.status_updatefires when a work order assigned to you entersConfirmedByServiceProvider,TechAssigned,TechScheduled,TechRescheduled,WorkIncompleteWithReason(unless it comes straight fromTechWorkingOnSite, which is a check-out),WorkUnsatisfactory,WorkReviewedAndCompleted,CancelledWithReason, orPaymentMade. That covers your own acceptance, scheduling done by your technicians in the OpenWrench apps, and the buyer’s decisions on your work. The parts statuses,TechEnRoute,TechWaitingOnSite,TechWorkingOnSite,WaitingForReview, and the quote and proposal statuses do not emit events.workorder.new_notefires for notes on the root buyer–supplier thread from either side, including notes posted by your own integration, bulk photo posts, and the note attached to a status action. Your internal notes and the threads on work orders you sub-contract never emit events.
- Reassignment away from you. If the buyer moves a work order to another supplier, it simply disappears from your queue. Reconcile against
GET /v1/supplier/work_order/work_ordersif that matters to you. - Work orders you can only see. If your facility is on a work order’s visibility list rather than assigned to it, you receive its events only if OpenWrench has enabled visibility webhooks for your company. Ask support if you need this.
Delivery payload
Every delivery is an HTTPPOST with a JSON body. The body has two fields: event_type and data.
Create and status events
workorder.status_update uses the same data shape with oldStatus filled in.
Note events
The payload does not include the rest of the thread. Read it with
GET /v1/supplier/work_order/work_order_notes/{woId} if you need context.
Verify deliveries
Every delivery is signed. The gateway computes an HMAC over the raw request body with your endpoint’s signing secret and sends it in a signature header. When support registers your endpoint they give you the secret, the header name, and the hash algorithm. Verify the signature against the raw bytes of the body before you parse it, and reject anything that does not match. Because the secret is per endpoint, rotating it is a support request: ask for a new secret, deploy it, then ask support to switch the endpoint over.Respond, retries, and duplicates
- Acknowledge fast. Return a
2xxas soon as you have stored the event, and do the follow-up work (fetching the work order, updating your system) asynchronously. A non-2xxresponse or a timeout counts as a failed delivery. - Failed deliveries are retried by the gateway with a backoff schedule. Make your handler idempotent so a retry after a partial success does no harm.
- Deliveries are at-least-once. The same event can arrive more than once even without a failure on your side. Deduplicate on
event_typeplusworkOrderIdpluschangedAt(oraddedAtfor notes). - Order is not guaranteed. Two events for the same work order can arrive out of order. Do not derive state from the sequence of events; fetch the work order and trust its
status. - Stale events are dropped, not delivered late. An event that has not been handed to the gateway within three hours of the change is discarded. After an outage on OpenWrench’s side, or if your endpoint was down for longer than the retry window, reconcile by polling
GET /v1/supplier/work_order/work_orders?statusChangedAt=...for the period you missed.
React to an event
The recommended handler is small: verify, store, acknowledge, then fetch.Putting it together
The typical integration loop, driven by webhooks:- Register an endpoint for
workorder.createandworkorder.status_update(addworkorder.new_noteif you mirror the conversation). - On
workorder.create, fetch the work order and create the job in your system. Then branch onnewStatus:PendingConfirmationByServiceProvidermeans the buyer is waiting on you, soconfirmordeclinewithin your SLA;SupplierInitiatedPendingApprovalmeans your own request is waiting on the buyer, so do nothing until aworkorder.status_updatereports the outcome; any other status means the work order is already yours, so go straight to scheduling. - On
workorder.status_update, fetch the work order.WorkUnsatisfactoryandWorkReviewedAndCompletedtell you the buyer’s verdict;CancelledWithReasoncloses the job;PaymentMadecloses the money side. - Run a periodic poll on
assignedAtorstatusChangedAtas a safety net for anything the webhook path missed, including work reassigned away from you.