{"items":[{"type":"link","label":"Jigcar webhooks","link":"/openapi-webhooks-v1","routeSlug":"/openapi-webhooks-v1","content":{"contentType":"overview","meta":{"name":"Jigcar webhooks"},"children":[{"nodeType":"container","panels":[{"title":"Download OpenAPI description","titleTranslationKey":"download.description.title","children":[{"kind":"download","label":"openapi-webhooks-v1.json","url":"/_bundle/openapi-webhooks-v1.json?download"},{"kind":"download","label":"openapi-webhooks-v1.yaml","url":"/_bundle/openapi-webhooks-v1.yaml?download"}]},{"title":"Overview","titleTranslationKey":"info.title","children":[{"kind":"externallink","title":"URL","titleTranslationKey":"info.contact.url","label":"https://jigcar.com/","url":"https://jigcar.com/"},{"kind":"email","title":"E-mail","titleTranslationKey":"info.contact.name","email":"engineering@jigcar.com","label":"engineering@jigcar.com","withCopyButton":true,"copyContent":"engineering@jigcar.com"}]},{"title":"Languages","titleTranslationKey":"languages.title","children":[{"kind":"languages","options":[{"key":"curl","title":"curl","lang":"curl"},{"key":"javascript","title":"JavaScript","lang":"JavaScript"},{"key":"node","title":"Node.js","lang":"Node.js"},{"key":"python","title":"Python","lang":"Python"},{"key":"java","title":"Java","lang":"Java"},{"key":"csharp","title":"C#","lang":"C#"},{"key":"php","title":"PHP","lang":"PHP"},{"key":"go","title":"Go","lang":"Go"},{"key":"ruby","title":"Ruby","lang":"Ruby"},{"key":"r","title":"R","lang":"R"},{"key":"payload","title":"Payload","lang":"Payload"}]}]},{"title":"Servers","titleTranslationKey":"servers.title","children":[{"kind":"servers","servers":[{"url":"/_mock/openapi-webhooks-v1","description":"Mock server","isMockServer":true},{"url":"https://public-api.jigcar.com/v1"}],"mode":"default"}]}],"children":[{"nodeType":"overview-section-wrapper","children":[{"nodeType":"header","level":1,"label":"Jigcar webhooks (1.0.0)","showPageActions":true},{"nodeType":"overview-section-wrapper","children":[{"nodeType":"markdoc","content":[{"$$mdtype":"Node","type":"paragraph","attributes":{},"children":[{"$$mdtype":"Node","type":"inline","attributes":{},"children":[{"$$mdtype":"Node","type":"text","inline":true,"attributes":{"content":"Outbound webhooks for vehicle movement lifecycle events, plus the endpoint for reconciling against them."},"children":[]}]}]},{"$$mdtype":"Node","type":"paragraph","attributes":{},"children":[{"$$mdtype":"Node","type":"inline","attributes":{},"children":[{"$$mdtype":"Node","type":"text","inline":true,"attributes":{"content":"Every request is signed. Verify "},"children":[]},{"$$mdtype":"Node","type":"code","inline":true,"attributes":{"content":"svix-signature"},"children":[]},{"$$mdtype":"Node","type":"text","inline":true,"attributes":{"content":" against the RAW request body before parsing it, and deduplicate on the envelope's "},"children":[]},{"$$mdtype":"Node","type":"code","inline":true,"attributes":{"content":"eventId"},"children":[]},{"$$mdtype":"Node","type":"text","inline":true,"attributes":{"content":". Delivery is at-least-once."},"children":[]}]}]},{"$$mdtype":"Node","type":"paragraph","attributes":{},"children":[{"$$mdtype":"Node","type":"inline","attributes":{},"children":[{"$$mdtype":"Node","type":"text","inline":true,"attributes":{"content":"See docs/webhooks.md for the integration guide."},"children":[]}]}]}]}],"sectionId":"/openapi-webhooks-v1"}],"sectionId":"/openapi-webhooks-v1"}]}]}},{"type":"group","label":"Webhooks","link":"/openapi-webhooks-v1/webhooks","routeSlug":"/openapi-webhooks-v1/webhooks","items":[{"label":"List movement events","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/openapi-webhooks-v1/webhooks/listmovementevents","routeSlug":"/openapi-webhooks-v1/webhooks/listmovementevents","metadata":{"seo":{"title":"List movement events","description":"Replays the webhook envelopes we published for your profile, newest first. Use it to confirm you processed everything: a consumer that acknowledges before it persists (a Power Automate flow answers 202 the moment the request lands) can lose an event without either side seeing a failure, and a retry cannot help once we have had a 2xx."}},"content":{"contentType":"item","itemVariant":"httpItem","meta":{"sourceId":"listMovementEvents","name":"List movement events","isWebhook":false,"pointer":"/paths/~1movement-requests~1events/get","hasSamples":false},"children":[{"nodeType":"container","children":[{"nodeType":"header","level":2,"label":"List movement events","isWebhook":false,"showPageActions":true}],"panels":[]},{"nodeType":"container","children":[{"nodeType":"header","level":4,"label":"Request","labelTranslationKey":"request","deepLinkSuffix":"request"},{"nodeType":"markdoc","content":"Replays the webhook envelopes we published for your profile, newest first. Use it to confirm you processed everything: a consumer that acknowledges before it persists (a Power Automate flow answers 202 the moment the request lands) can lose an event without either side seeing a failure, and a retry cannot help once we have had a 2xx.\n\nBounded by message retention, which depends on the Svix plan: 30 days on free, 90 on Pro. An empty page is indistinguishable from an expired one, so reconcile well inside the window."},{"nodeType":"security","requirements":[{"schemes":[{"name":"JigcarAPIAuth","scopes":[],"type":"apiKey","in":"header","paramName":"X-Jigcar-API-Key"}]}]},{"nodeType":"item-content","variant":"query","label":"Query","labelTranslationKey":"query","parameters":[{"name":"since","in":"query","schemaId":"schema_14","description":"Only events at or after this ISO 8601 instant."},{"name":"cursor","in":"query","schemaId":"schema_15","description":[{"$$mdtype":"Node","type":"paragraph","attributes":{},"children":[{"$$mdtype":"Node","type":"inline","attributes":{},"children":[{"$$mdtype":"Node","type":"text","inline":true,"attributes":{"content":"Opaque continuation token from a previous response's "},"children":[]},{"$$mdtype":"Node","type":"code","inline":true,"attributes":{"content":"nextCursor"},"children":[]},{"$$mdtype":"Node","type":"text","inline":true,"attributes":{"content":"."},"children":[]}]}]}]},{"name":"limit","in":"query","schemaId":"schema_16","description":"Page size, 1 to 250. Defaults to 50."}],"pointer":"/paths/~1movement-requests~1events/get/parameters"}],"panels":[{"children":[{"kind":"code-sample","source":{"kind":"code-sample","operationType":"http","method":"GET","path":"/movement-requests/events","servers":[{"url":"/_mock/openapi-webhooks-v1","description":"Mock server","isMockServer":true},{"url":"https://public-api.jigcar.com/v1"}],"parameters":{"path":[],"query":[{"name":"since","in":"query","required":false,"schemaId":"schema_14"},{"name":"cursor","in":"query","required":false,"schemaId":"schema_15"},{"name":"limit","in":"query","required":false,"schemaId":"schema_16"}],"querystring":[],"header":[],"cookie":[]},"security":[{"schemes":[{"id":"JigcarAPIAuth","type":"apiKey","name":"X-Jigcar-API-Key","in":"header"}],"scopes":[]}],"responseCodes":["200","400","401"],"pointer":"/movement-requests/events","href":"webhooks/listmovementevents","openApiOperationId":"listMovementEvents","summary":"List movement events"},"isWebhook":false,"hideReplay":false,"servers":[{"url":"/_mock/openapi-webhooks-v1","description":"Mock server","isMockServer":true},{"url":"https://public-api.jigcar.com/v1"}],"examples":[]}]}]},{"nodeType":"container","children":[{"nodeType":"header","level":4,"label":"Responses","labelTranslationKey":"responses","deepLinkSuffix":"responses"},{"nodeType":"item-content","variant":"responses","responses":[{"code":"200","description":"A page of events.","mediaType":"application/json","mediaTypes":["application/json"],"mediaTypeContent":{"application/json":{"schemaId":"schema_17"}},"schemaId":"schema_17"},{"code":"400","description":[{"$$mdtype":"Node","type":"paragraph","attributes":{},"children":[{"$$mdtype":"Node","type":"inline","attributes":{},"children":[{"$$mdtype":"Node","type":"text","inline":true,"attributes":{"content":"Invalid "},"children":[]},{"$$mdtype":"Node","type":"code","inline":true,"attributes":{"content":"since"},"children":[]},{"$$mdtype":"Node","type":"text","inline":true,"attributes":{"content":" or "},"children":[]},{"$$mdtype":"Node","type":"code","inline":true,"attributes":{"content":"limit"},"children":[]},{"$$mdtype":"Node","type":"text","inline":true,"attributes":{"content":"."},"children":[]}]}]}]},{"code":"401","description":"Missing or invalid API key."}],"pointer":"/paths/~1movement-requests~1events/get/responses"}],"panels":[{"children":[{"kind":"response","responseCodes":[{"code":"200","schemaId":"schema_17","mediaTypes":["application/json"],"mediaTypeContent":{"application/json":{"schemaId":"schema_17"}}},{"code":"400"},{"code":"401"}],"examples":[]}]}]},{"nodeType":"container","children":[{"nodeType":"feedback","pageSlug":"/webhooks/listmovementevents"}],"panels":[]}]},"httpPath":"/movement-requests/events"},{"type":"separator","label":"Webhooks","variant":"secondary","content":null},{"label":"Movement collected","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":true,"type":"link","link":"/openapi-webhooks-v1/webhooks/webhookmovementcollected","routeSlug":"/openapi-webhooks-v1/webhooks/webhookmovementcollected","metadata":{"seo":{"title":"Movement collected","description":"The vehicle has been collected from the origin and is in transit."}},"content":{"contentType":"item","itemVariant":"httpItem","meta":{"sourceId":"webhookMovementCollected","name":"Movement collected","isWebhook":true,"pointer":"/paths/movement.collected/post","hasSamples":true},"children":[{"nodeType":"container","children":[{"nodeType":"header","level":2,"label":"Movement collected","isWebhook":true,"showPageActions":true}],"panels":[]},{"nodeType":"container","children":[{"nodeType":"header","level":4,"label":"Request","labelTranslationKey":"request","deepLinkSuffix":"request"},{"nodeType":"markdoc","content":"The vehicle has been collected from the origin and is in transit."},{"nodeType":"item-content","variant":"body","label":"Request Body","labelTranslationKey":"body","required":true,"mediaTypes":["application/json"],"mediaTypeSchemas":{"application/json":{"schemaId":"components/schemas/MovementCollectedEvent"}},"schemaId":"components/schemas/MovementCollectedEvent","pointer":"/paths/movement.collected/post/requestBody"}],"panels":[{"children":[{"kind":"code-sample","source":{"kind":"code-sample","operationType":"webhook","method":"POST","path":"movement.collected","servers":[{"url":"/_mock/openapi-webhooks-v1","description":"Mock server","isMockServer":true},{"url":"https://public-api.jigcar.com/v1"}],"parameters":{"path":[],"query":[],"querystring":[],"header":[],"cookie":[]},"security":[],"requestBody":{"application/json":{"schemaId":"components/schemas/MovementCollectedEvent"}},"responseCodes":["2xx"],"pointer":"movement.collected","href":"webhooks/webhookmovementcollected","openApiOperationId":"webhookMovementCollected","summary":"Movement collected"},"isWebhook":true,"hideReplay":false,"servers":[{"url":"/_mock/openapi-webhooks-v1","description":"Mock server","isMockServer":true},{"url":"https://public-api.jigcar.com/v1"}],"schemaId":"components/schemas/MovementCollectedEvent","mediaTypes":["application/json"],"mediaTypeSchemas":{"application/json":{"schemaId":"components/schemas/MovementCollectedEvent"}},"examples":[]}]}]},{"nodeType":"container","children":[{"nodeType":"header","level":4,"label":"Responses","labelTranslationKey":"responses","deepLinkSuffix":"responses"},{"nodeType":"item-content","variant":"responses","responses":[{"code":"2xx","description":"Return any 2xx to acknowledge. A non-2xx is retried on Svix's schedule; sustained failure disables the endpoint and notifies you."}],"pointer":"/paths/movement.collected/post/responses"}],"panels":[]},{"nodeType":"container","children":[{"nodeType":"feedback","pageSlug":"/webhooks/webhookmovementcollected"}],"panels":[]}]},"httpPath":"movement.collected"},{"label":"Movement delivered","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":true,"type":"link","link":"/openapi-webhooks-v1/webhooks/webhookmovementdelivered","routeSlug":"/openapi-webhooks-v1/webhooks/webhookmovementdelivered","metadata":{"seo":{"title":"Movement delivered","description":"The vehicle has been delivered to the destination. The normal terminal state."}},"content":{"contentType":"item","itemVariant":"httpItem","meta":{"sourceId":"webhookMovementDelivered","name":"Movement delivered","isWebhook":true,"pointer":"/paths/movement.delivered/post","hasSamples":true},"children":[{"nodeType":"container","children":[{"nodeType":"header","level":2,"label":"Movement delivered","isWebhook":true,"showPageActions":true}],"panels":[]},{"nodeType":"container","children":[{"nodeType":"header","level":4,"label":"Request","labelTranslationKey":"request","deepLinkSuffix":"request"},{"nodeType":"markdoc","content":"The vehicle has been delivered to the destination. The normal terminal state."},{"nodeType":"item-content","variant":"body","label":"Request Body","labelTranslationKey":"body","required":true,"mediaTypes":["application/json"],"mediaTypeSchemas":{"application/json":{"schemaId":"components/schemas/MovementDeliveredEvent"}},"schemaId":"components/schemas/MovementDeliveredEvent","pointer":"/paths/movement.delivered/post/requestBody"}],"panels":[{"children":[{"kind":"code-sample","source":{"kind":"code-sample","operationType":"webhook","method":"POST","path":"movement.delivered","servers":[{"url":"/_mock/openapi-webhooks-v1","description":"Mock server","isMockServer":true},{"url":"https://public-api.jigcar.com/v1"}],"parameters":{"path":[],"query":[],"querystring":[],"header":[],"cookie":[]},"security":[],"requestBody":{"application/json":{"schemaId":"components/schemas/MovementDeliveredEvent"}},"responseCodes":["2xx"],"pointer":"movement.delivered","href":"webhooks/webhookmovementdelivered","openApiOperationId":"webhookMovementDelivered","summary":"Movement delivered"},"isWebhook":true,"hideReplay":false,"servers":[{"url":"/_mock/openapi-webhooks-v1","description":"Mock server","isMockServer":true},{"url":"https://public-api.jigcar.com/v1"}],"schemaId":"components/schemas/MovementDeliveredEvent","mediaTypes":["application/json"],"mediaTypeSchemas":{"application/json":{"schemaId":"components/schemas/MovementDeliveredEvent"}},"examples":[]}]}]},{"nodeType":"container","children":[{"nodeType":"header","level":4,"label":"Responses","labelTranslationKey":"responses","deepLinkSuffix":"responses"},{"nodeType":"item-content","variant":"responses","responses":[{"code":"2xx","description":"Return any 2xx to acknowledge. A non-2xx is retried on Svix's schedule; sustained failure disables the endpoint and notifies you."}],"pointer":"/paths/movement.delivered/post/responses"}],"panels":[]},{"nodeType":"container","children":[{"nodeType":"feedback","pageSlug":"/webhooks/webhookmovementdelivered"}],"panels":[]}]},"httpPath":"movement.delivered"},{"label":"Movement cancelled","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":true,"type":"link","link":"/openapi-webhooks-v1/webhooks/webhookmovementcancelled","routeSlug":"/openapi-webhooks-v1/webhooks/webhookmovementcancelled","metadata":{"seo":{"title":"Movement cancelled","description":"The movement was cancelled before it was carried out."}},"content":{"contentType":"item","itemVariant":"httpItem","meta":{"sourceId":"webhookMovementCancelled","name":"Movement cancelled","isWebhook":true,"pointer":"/paths/movement.cancelled/post","hasSamples":true},"children":[{"nodeType":"container","children":[{"nodeType":"header","level":2,"label":"Movement cancelled","isWebhook":true,"showPageActions":true}],"panels":[]},{"nodeType":"container","children":[{"nodeType":"header","level":4,"label":"Request","labelTranslationKey":"request","deepLinkSuffix":"request"},{"nodeType":"markdoc","content":"The movement was cancelled before it was carried out."},{"nodeType":"item-content","variant":"body","label":"Request Body","labelTranslationKey":"body","required":true,"mediaTypes":["application/json"],"mediaTypeSchemas":{"application/json":{"schemaId":"components/schemas/MovementCancelledEvent"}},"schemaId":"components/schemas/MovementCancelledEvent","pointer":"/paths/movement.cancelled/post/requestBody"}],"panels":[{"children":[{"kind":"code-sample","source":{"kind":"code-sample","operationType":"webhook","method":"POST","path":"movement.cancelled","servers":[{"url":"/_mock/openapi-webhooks-v1","description":"Mock server","isMockServer":true},{"url":"https://public-api.jigcar.com/v1"}],"parameters":{"path":[],"query":[],"querystring":[],"header":[],"cookie":[]},"security":[],"requestBody":{"application/json":{"schemaId":"components/schemas/MovementCancelledEvent"}},"responseCodes":["2xx"],"pointer":"movement.cancelled","href":"webhooks/webhookmovementcancelled","openApiOperationId":"webhookMovementCancelled","summary":"Movement cancelled"},"isWebhook":true,"hideReplay":false,"servers":[{"url":"/_mock/openapi-webhooks-v1","description":"Mock server","isMockServer":true},{"url":"https://public-api.jigcar.com/v1"}],"schemaId":"components/schemas/MovementCancelledEvent","mediaTypes":["application/json"],"mediaTypeSchemas":{"application/json":{"schemaId":"components/schemas/MovementCancelledEvent"}},"examples":[]}]}]},{"nodeType":"container","children":[{"nodeType":"header","level":4,"label":"Responses","labelTranslationKey":"responses","deepLinkSuffix":"responses"},{"nodeType":"item-content","variant":"responses","responses":[{"code":"2xx","description":"Return any 2xx to acknowledge. A non-2xx is retried on Svix's schedule; sustained failure disables the endpoint and notifies you."}],"pointer":"/paths/movement.cancelled/post/responses"}],"panels":[]},{"nodeType":"container","children":[{"nodeType":"feedback","pageSlug":"/webhooks/webhookmovementcancelled"}],"panels":[]}]},"httpPath":"movement.cancelled"},{"label":"Movement aborted","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":true,"type":"link","link":"/openapi-webhooks-v1/webhooks/webhookmovementaborted","routeSlug":"/openapi-webhooks-v1/webhooks/webhookmovementaborted","metadata":{"seo":{"title":"Movement aborted","description":"The movement was abandoned after it had started, for example the vehicle was not on site."}},"content":{"contentType":"item","itemVariant":"httpItem","meta":{"sourceId":"webhookMovementAborted","name":"Movement aborted","isWebhook":true,"pointer":"/paths/movement.aborted/post","hasSamples":true},"children":[{"nodeType":"container","children":[{"nodeType":"header","level":2,"label":"Movement aborted","isWebhook":true,"showPageActions":true}],"panels":[]},{"nodeType":"container","children":[{"nodeType":"header","level":4,"label":"Request","labelTranslationKey":"request","deepLinkSuffix":"request"},{"nodeType":"markdoc","content":"The movement was abandoned after it had started, for example the vehicle was not on site."},{"nodeType":"item-content","variant":"body","label":"Request Body","labelTranslationKey":"body","required":true,"mediaTypes":["application/json"],"mediaTypeSchemas":{"application/json":{"schemaId":"components/schemas/MovementAbortedEvent"}},"schemaId":"components/schemas/MovementAbortedEvent","pointer":"/paths/movement.aborted/post/requestBody"}],"panels":[{"children":[{"kind":"code-sample","source":{"kind":"code-sample","operationType":"webhook","method":"POST","path":"movement.aborted","servers":[{"url":"/_mock/openapi-webhooks-v1","description":"Mock server","isMockServer":true},{"url":"https://public-api.jigcar.com/v1"}],"parameters":{"path":[],"query":[],"querystring":[],"header":[],"cookie":[]},"security":[],"requestBody":{"application/json":{"schemaId":"components/schemas/MovementAbortedEvent"}},"responseCodes":["2xx"],"pointer":"movement.aborted","href":"webhooks/webhookmovementaborted","openApiOperationId":"webhookMovementAborted","summary":"Movement aborted"},"isWebhook":true,"hideReplay":false,"servers":[{"url":"/_mock/openapi-webhooks-v1","description":"Mock server","isMockServer":true},{"url":"https://public-api.jigcar.com/v1"}],"schemaId":"components/schemas/MovementAbortedEvent","mediaTypes":["application/json"],"mediaTypeSchemas":{"application/json":{"schemaId":"components/schemas/MovementAbortedEvent"}},"examples":[]}]}]},{"nodeType":"container","children":[{"nodeType":"header","level":4,"label":"Responses","labelTranslationKey":"responses","deepLinkSuffix":"responses"},{"nodeType":"item-content","variant":"responses","responses":[{"code":"2xx","description":"Return any 2xx to acknowledge. A non-2xx is retried on Svix's schedule; sustained failure disables the endpoint and notifies you."}],"pointer":"/paths/movement.aborted/post/responses"}],"panels":[]},{"nodeType":"container","children":[{"nodeType":"feedback","pageSlug":"/webhooks/webhookmovementaborted"}],"panels":[]}]},"httpPath":"movement.aborted"}],"content":{"contentType":"group","meta":{"name":"Webhooks"},"children":[{"nodeType":"container","children":[{"nodeType":"header","level":2,"label":"Webhooks","showPageActions":true},{"nodeType":"markdoc","content":"Events we send you, and how to reconcile against them."}],"panels":[{"children":[{"kind":"group-items","title":"Operations","titleTranslationKey":"operations","items":[{"title":"/movement-requests/events","summary":"List movement events","prefix":{"name":"get","color":"get"},"badges":[],"link":"/webhooks/listmovementevents","deprecated":false}]},{"kind":"group-items","title":"Webhooks","titleTranslationKey":"webhooks","items":[{"title":"movement.collected","summary":"Movement collected","prefix":{"name":"post","color":"post"},"badges":[],"link":"/webhooks/webhookmovementcollected","deprecated":false},{"title":"movement.delivered","summary":"Movement delivered","prefix":{"name":"post","color":"post"},"badges":[],"link":"/webhooks/webhookmovementdelivered","deprecated":false},{"title":"movement.cancelled","summary":"Movement cancelled","prefix":{"name":"post","color":"post"},"badges":[],"link":"/webhooks/webhookmovementcancelled","deprecated":false},{"title":"movement.aborted","summary":"Movement aborted","prefix":{"name":"post","color":"post"},"badges":[],"link":"/webhooks/webhookmovementaborted","deprecated":false}]}]}]}]}}],"store":{"schemaStore":{"components/schemas/Movement":{"id":"components/schemas/Movement","kind":"json-schema","title":"Movement","data":{"type":"object","title":"Movement","description":"The movement every event carries. Each event adds the fields it alone reports.","required":["id","status","businessArea","transportMethod"],"properties":{"id":{"type":"string","description":"Jigcar's identifier for the movement.","examples":["01JQ8W3H2K4M5N6P7R8S9T0V1W"]},"status":{"type":"string","enum":["IN_PROGRESS","DELIVERED","CANCELLED","ABORTED"],"examples":["DELIVERED"]},"vin":{"type":"string","examples":["2T1BURHE2FC361469"]},"vrm":{"type":"string","description":"UK registration mark. Absent for vehicles without one."},"make":{"type":"string","examples":["Toyota"]},"model":{"type":"string","examples":["Corolla"]},"modelVariant":{"type":"string","examples":["LE"]},"businessArea":{"type":"string","examples":["Retail"]},"transportMethod":{"type":"string","enum":["DRIVEN","TRANSPORTED"]},"notes":{"type":"string","description":"The note supplied when the movement was created."},"confirmedBy":{"type":"string","description":"Who confirmed the vehicle was available."},"originSiteId":{"type":"string","description":"Present when collection is from one of your sites.","examples":["site-orchard-park"]},"originAddressLine1":{"type":"string","description":"Present when collection is from an ad-hoc address."},"originAddressPostcode":{"type":"string"},"originScheduledOn":{"type":"string","format":"date","description":"The collection date requested when the movement was created.","examples":["2026-08-27"]},"originScheduledTimeslot":{"type":"string","enum":["ANYTIME","AM","PM"]},"originPredictedOn":{"type":"string","format":"date","description":"When we currently expect collection to happen.","examples":["2026-08-27"]},"originPredictedTimeslot":{"type":"string","enum":["ANYTIME","AM","PM"]},"destinationSiteId":{"type":"string","examples":["site-lockport"]},"destinationAddressLine1":{"type":"string"},"destinationAddressPostcode":{"type":"string"},"destinationScheduledOn":{"type":"string","format":"date","description":"The delivery deadline requested at creation.","examples":["2026-08-27"]},"destinationScheduledTimeslot":{"type":"string","enum":["ANYTIME","AM","PM"]},"destinationPredictedOn":{"type":"string","format":"date","description":"When we currently expect delivery to happen.","examples":["2026-08-27"]},"destinationPredictedTimeslot":{"type":"string","enum":["ANYTIME","AM","PM"]},"driverName":{"type":"string","description":"The assigned driver. Absent when the movement is carried by a logistics provider.","examples":["John Davidson"]}}}},"components/schemas/CollectedMovement":{"id":"components/schemas/CollectedMovement","kind":"json-schema","title":"CollectedMovement","data":{"title":"CollectedMovement","allOf":[{"$ref":"#/components/schemas/Movement"},{"type":"object","required":["originActualOn"],"properties":{"originActualOn":{"type":"string","format":"date","description":"When the vehicle was actually collected.","examples":["2026-08-27"]}}}]}},"components/schemas/DeliveredMovement":{"id":"components/schemas/DeliveredMovement","kind":"json-schema","title":"DeliveredMovement","data":{"title":"DeliveredMovement","allOf":[{"$ref":"#/components/schemas/Movement"},{"type":"object","required":["destinationActualOn"],"properties":{"destinationActualOn":{"type":"string","format":"date","description":"When the vehicle was actually delivered.","examples":["2026-08-27"]}}}]}},"components/schemas/AbortedMovement":{"id":"components/schemas/AbortedMovement","kind":"json-schema","title":"AbortedMovement","data":{"title":"AbortedMovement","allOf":[{"$ref":"#/components/schemas/Movement"},{"type":"object","required":[],"properties":{"abortReason":{"type":"string","enum":["NotOnSite","NotReady","NeedsDifferentTransportMethod","CancelledTooLate","Other"],"description":"Why the movement was aborted. Free-text detail is not published.","examples":["NotOnSite"]}}}]}},"components/schemas/MovementEvent":{"id":"components/schemas/MovementEvent","kind":"json-schema","title":"MovementEvent","data":{"type":"object","title":"MovementEvent","description":"The envelope fields common to every movement webhook.","required":["schemaVersion","eventId","occurredAt","occurredAtLocal"],"properties":{"schemaVersion":{"type":"string","description":"Bumped only for a breaking change to this envelope.","examples":["1.0"]},"eventId":{"type":"string","description":"Stable across redeliveries of the same event. Deduplicate on this.","examples":["01JQ8W3H2K4M5N6P7R8S9T0V1W"]},"occurredAt":{"type":"string","format":"date-time","description":"When the transition happened, as an ISO 8601 instant. The only instant in the payload.","examples":["2026-08-27T09:14:02.000Z"]},"occurredAtLocal":{"type":"string","description":"The same instant at the offset of the site the event happened at.","examples":["2026-08-27T05:14:02-04:00"]},"reference":{"type":"string","description":[{"$$mdtype":"Node","type":"paragraph","attributes":{},"children":[{"$$mdtype":"Node","type":"inline","attributes":{},"children":[{"$$mdtype":"Node","type":"text","inline":true,"attributes":{"content":"Your own identifier for the vehicle, as supplied on "},"children":[]},{"$$mdtype":"Node","type":"code","inline":true,"attributes":{"content":"vehicle.externalVehicleId"},"children":[]},{"$$mdtype":"Node","type":"text","inline":true,"attributes":{"content":"."},"children":[]}]}]}],"examples":["STOCK-12345"]}}}},"components/schemas/MovementCollectedEvent":{"id":"components/schemas/MovementCollectedEvent","kind":"json-schema","title":"MovementCollectedEvent","data":{"title":"MovementCollectedEvent","allOf":[{"$ref":"#/components/schemas/MovementEvent"},{"type":"object","required":["eventType","movement"],"properties":{"eventType":{"type":"string","const":"movement.collected"},"movement":{"$ref":"#/components/schemas/CollectedMovement"}}}]}},"components/schemas/MovementDeliveredEvent":{"id":"components/schemas/MovementDeliveredEvent","kind":"json-schema","title":"MovementDeliveredEvent","data":{"title":"MovementDeliveredEvent","allOf":[{"$ref":"#/components/schemas/MovementEvent"},{"type":"object","required":["eventType","movement"],"properties":{"eventType":{"type":"string","const":"movement.delivered"},"movement":{"$ref":"#/components/schemas/DeliveredMovement"}}}]}},"components/schemas/MovementCancelledEvent":{"id":"components/schemas/MovementCancelledEvent","kind":"json-schema","title":"MovementCancelledEvent","data":{"title":"MovementCancelledEvent","allOf":[{"$ref":"#/components/schemas/MovementEvent"},{"type":"object","required":["eventType","movement"],"properties":{"eventType":{"type":"string","const":"movement.cancelled"},"movement":{"$ref":"#/components/schemas/Movement"}}}]}},"components/schemas/MovementAbortedEvent":{"id":"components/schemas/MovementAbortedEvent","kind":"json-schema","title":"MovementAbortedEvent","data":{"title":"MovementAbortedEvent","allOf":[{"$ref":"#/components/schemas/MovementEvent"},{"type":"object","required":["eventType","movement"],"properties":{"eventType":{"type":"string","const":"movement.aborted"},"movement":{"$ref":"#/components/schemas/AbortedMovement"}}}]}},"schema_14":{"kind":"json-schema","data":{"type":"string","format":"date-time","examples":["2026-08-27T00:00:00Z"]},"id":"schema_14"},"schema_15":{"kind":"json-schema","data":{"type":"string"},"id":"schema_15"},"schema_16":{"kind":"json-schema","data":{"type":"string","pattern":"^[0-9]+$","examples":["50"]},"id":"schema_16"},"schema_17":{"kind":"json-schema","data":{"type":"object","required":["data","nextCursor"],"properties":{"data":{"type":"array","description":"The same envelopes a webhook would have delivered.","items":{"oneOf":[{"$ref":"#/components/schemas/MovementCollectedEvent"},{"$ref":"#/components/schemas/MovementDeliveredEvent"},{"$ref":"#/components/schemas/MovementCancelledEvent"},{"$ref":"#/components/schemas/MovementAbortedEvent"}],"discriminator":{"propertyName":"eventType","mapping":{"movement.collected":"#/components/schemas/MovementCollectedEvent","movement.delivered":"#/components/schemas/MovementDeliveredEvent","movement.cancelled":"#/components/schemas/MovementCancelledEvent","movement.aborted":"#/components/schemas/MovementAbortedEvent"}}}},"nextCursor":{"type":["string","null"],"description":[{"$$mdtype":"Node","type":"paragraph","attributes":{},"children":[{"$$mdtype":"Node","type":"inline","attributes":{},"children":[{"$$mdtype":"Node","type":"text","inline":true,"attributes":{"content":"Pass as "},"children":[]},{"$$mdtype":"Node","type":"code","inline":true,"attributes":{"content":"cursor"},"children":[]},{"$$mdtype":"Node","type":"text","inline":true,"attributes":{"content":" for the next page. Null on the last page."},"children":[]}]}]}]}}},"id":"schema_17"}},"exampleStore":{},"securitySchemeStore":{"JigcarAPIAuth":{"id":"JigcarAPIAuth","type":"apiKey","in":"header","paramName":"X-Jigcar-API-Key"}},"servers":[{"url":"/_mock/openapi-webhooks-v1","isMockServer":true,"description":"Mock server"},{"url":"https://public-api.jigcar.com/v1"}],"specType":"openapi"},"options":{"mockServer":{"url":"/_mock/openapi-webhooks-v1","position":"first","description":"Mock server"},"disableRouter":true,"downloadUrls":[{"url":"/_bundle/openapi-webhooks-v1.json?download"},{"url":"/_bundle/openapi-webhooks-v1.yaml?download"}],"excludeFromSearch":false,"replayFeatures":{"graphql":false},"specType":"openapi","markdocOptions":{"tags":{},"nodes":{},"components":{}},"metadata":{"title":"Jigcar webhooks","description":"Outbound webhooks for vehicle movement lifecycle events, plus the endpoint for reconciling against them.\n\nEvery request is signed. Verify `svix-signature` against the RAW request body before parsing it, and deduplicate on the envelope's `eventId`. Delivery is at-least-once.\n\nSee docs/webhooks.md for the integration guide."}},"baseSlug":"/openapi-webhooks-v1","routesMapping":{}}