1. CarrierPortal
SpotGo
  • Getting started
    • Introduction
    • Authentication
    • Opportunities vs Orders
    • Mappings
  • Order
    • Orders Processing
    • Integrating Your Order Document Processing: A Guide to Best Practices
    • /api/v1/orders/file
      POST
    • /api/v2/orders/{orderId}
      GET
    • /api/v1/orders/{orderId}/file
      GET
  • Opportunity
    • Opportunities (Freight Qoutes)
    • /api/v1/opportunities
      POST
    • /api/v1/opportunities/file
      POST
    • /api/v1/opportunities/image
      POST
    • /api/v1/opportunities/{opportunityId}
      GET
    • /api/v1/opportunities/{opportunityId}/custom
      GET
    • /api/v1/opportunities/{opportunityId}/default
      GET
  • Freight
    • Freight publish
    • /api/v1/freights/share
    • /api/v1/freights
    • /api/v1/freights
    • /api/v1/freights/{freightId}
    • /api/v1/freights/{freightId}
    • /api/v1/freights/{freightId}
  • Vehicles
    • /api/v1/vehicles
    • /api/v1/vehicles
    • /api/v1/vehicles/{vehicleId}
    • /api/v1/vehicles/{vehicleId}
    • /api/v1/vehicles/{vehicleId}
  • Feedback
    • /api/v1/feedback
  • Webhook
    • Webhooks flow
    • /api/v1/webhooks
    • /api/v1/webhooks/{subscriptionId}/reset
    • /api/v1/webhooks
    • /api/v1/webhooks/{subscriptionId}
    • /api/v1/webhooks/{subscriptionId}/notify
  • Documents
    • Documents processing
    • /api/v1/documents
    • /api/v1/documents/{documentId}/file
    • /api/v1/documents/invoice/{documentId}
    • /api/v1/documents/receipt/{documentId}
    • /api/v1/documents/cmr/{documentId}
    • /api/v1/documents/insurance/{documentId}
  • AccountManagement
    • /api/v1/accounts
    • /api/v1/accounts/block
  • DriversDocuments
    • /api/v1/drivers-documents
    • /api/v1/drivers-documents/{documentId}
  • CarrierPortal
    • Integration flows
    • Webhooks
    • Document Upload
      POST
    • /api/v1/orders
      POST
    • /api/v1/orders/{orderId}
      PUT
    • /api/v1/orders/{orderId}
      DELETE
    • /api/v1/orders/{orderId}
      GET
    • /api/v1/orders/upsert
      POST
    • /api/v1/orders/query
      POST
    • /api/v1/orders/{orderId}/documents/{documentId}/content
      GET
    • /api/v1/orders/{orderId}/documents/{documentId}/status
      POST
  • Schemas
    • Schemas
      • ApiKeyAuthentication
      • AccountBlockSubmitModel
      • InsuranceApiModel
      • FreightShareSubmitModel
      • FreightViewModel
      • DriverDocumentTypeResponse
      • BasicAuthentication
      • AccountSubmitModel
      • InsuranceCompanyApi
      • FreightShareViewModel
      • FreightsViewModel
      • DriversDocumentApiModel
      • CustomOpportunityApiAddressModel
      • AccountViewModel
      • InsuranceResponseViewModel
      • DriversDocumentsConvertViewModel
      • CustomOpportunityApiDescriptionModel
      • DriversDocumentsViewModel
      • CustomOpportunityApiGeoCoordinateModel
      • CustomOpportunityApiLocationModel
      • CustomOpportunityApiModel
      • CustomOpportunityApiRequirementsModel
      • CustomOpportunityApiViewModel
      • CustomerCustomerListResponse
      • CustomerCustomerViewModel
      • CustomerCustomersSubmitModel
      • CustomerSubmitModel
      • DocumentFileType
      • DocumentStatus
      • DocumentsConvertSubmitModel
      • DocumentsConvertViewModel
      • ErrorItemViewModel
      • ErrorViewModel
      • FeedbackSubmitItemModel
      • FeedbackSubmitModel
      • FeedbackTransactionType
      • FeedbackType
      • FreightCreateViewModel
      • FreightSubmitModel
      • FreightUpdateSubmitModel
      • InvoiceApiAddress
      • InvoiceApiLine
      • InvoiceApiModel
      • InvoiceApiParty
      • InvoiceApiTotal
      • InvoiceResponseViewModel
      • LoadingSideTypes
      • LoadingType
      • LocationAddressSubmitModel
      • LocationCoordinatesSubmitModel
      • LocationPeriodSubmitModel
      • LocationSubmitModel
      • Oauth2Authentication
      • OpportunityApiAddress
      • OpportunityApiCargo
      • OpportunityApiCoordinates
      • OpportunityApiLocation
      • OpportunityApiModel
      • OpportunityApiPayment
      • OpportunityApiPeriod
      • OpportunityApiRequirements
      • OpportunityApiTemperature
      • OpportunityApiTransitInfo
      • OpportunityApiViewModel
      • OpportunityResultModel
      • OpportunityStatus
      • OpportunitySubmitModel
      • OrderConvertSubmitModel
      • OrderConvertViewModel
      • OrderDataViewModel
      • OrderStatus
      • OrderTypes
      • OrderViewCargo
      • OrderViewLocation
      • OrderViewLocationCoordinates
      • OrderViewParty
      • OrderViewPayments
      • PaymentSubmitModel
      • RegimeTypes
      • RequirementsSubmitModel
      • SpotGoDocumentType
      • TemperatureSubmitModel
      • VehicleAddressSubmitModel
      • VehicleLoadingLocationSubmitModel
      • VehicleLocationPeriodSubmitModel
      • VehicleRequirementsSubmitModel
      • VehicleResultViewModel
      • VehicleSubmitModel
      • VehicleUnloadingLocationSubmitModel
      • WebhookAuthType
      • WebhookAuthentication
      • WebhookEventType
      • WebhookItemViewModel
      • WebhookSubscriptionRequest
      • WebhookSubscriptionResponse
      • WebhookViewModel
    • WebhookSubscriptionNotificationsRequest
    • CarrierOrderStatus
    • CarrierSubmitModel
    • CarrierViewModel
    • DocumentRejectionReason
    • OrderViewModel
    • ProblemDetails
    • DocumentStatusChangeSubmitModel
    • ExternalErrorItemViewModel
    • ExternalErrorViewModel
    • OrderDetailsSubmitModel
    • OrderDetailsViewModel
    • OrderDocumentStatus
    • OrderDocumentViewModel
    • OrderLocationSubmitModel
    • OrderLocationType
    • OrderLocationViewModel
    • OrderQueryItemViewModel
    • OrderQuerySubmitModel
    • OrderQueryViewModel
    • OrderShareViewModel
    • OrderSubmitModel
    • OrderUpsertViewModel
    • PositionSubmitModel
    • QueryDateRange
  1. CarrierPortal

Webhooks

Document webhooks notify your system when carrier-uploaded documents on a Carrier Portal order are processed or when the order's aggregate document status changes. They complement the order API described in Integration flows.
Base URLs
PurposeTestProduction
Webhook registration (POST /api/v1/webhooks, etc.)https://api-test.spotgo.euhttps://api.spotgo.eu
Carrier order data (dataUrl in webhooks — order GET, document download)https://carrier-test.spotgo.euhttps://carrier.spotgo.eu
Authentication uses your company API key (X-Api-Key header), same as other public API calls.

1. Webhook registration#

Register via the Webhook API:
POST /api/v1/webhooks
FieldValue
Registration type (eventType)CarrierDocuments (enum value 12)
ScopeOne subscription per company account and callback URL

Request example (test environment)#

{
  "eventType": "CarrierDocuments",
  "callbackUrl": "https://your-system.example.com/webhooks/spotgo",
  "callbackAuth": {
    "type": "ApiKey",
    "apiKey": {
      "headerName": "X-Api-Key",
      "headerValue": "your-inbound-secret"
    }
  },
  "notificationsEmails": [
    "integrations@your-company.com"
  ]
}
Supported callbackAuth.type values: None, Basic, ApiKey, OAuth2.
callbackUrl must use HTTPS.

Response#

{
  "subscriptionId": "53559882-b8cd-4f08-b3f4-efc71a9e0254"
}

Registration test ping#

On create (and on PUT /api/v1/webhooks/{subscriptionId}/reset), SpotGo sends a connectivity test to your callback URL:
{
  "id": "771de42bf63f48f6b6e2ffaf253170cd",
  "subscriptionId": "53559882-b8cd-4f08-b3f4-efc71a9e0254",
  "event": "example.event.publish.test",
  "dataUrl": "https://api-test.spotgo.eu/api/v1/documents/test/771de42bf63f48f6b6e2ffaf253170cd"
}
Registration succeeds only if your endpoint returns a successful HTTP response to this test.

Existing All subscriptions#

If you already have a webhook with eventType: "All", you will also receive carrier document events — no separate CarrierDocuments subscription is required.

Per-event filtering#

Subscriptions are registered at the type level (CarrierDocuments), not per individual event. All three document events below are delivered to the same subscription. Filter on the event field in your handler if you only care about some of them (e.g. only carrier.document.accepted for Workflow A, or only carrier.document.processed for Workflow B).

Manage subscriptions#

MethodPathPurpose
GET/api/v1/webhooksList subscriptions
DELETE/api/v1/webhooks/{subscriptionId}Remove subscription
PUT/api/v1/webhooks/{subscriptionId}/resetRe-send test ping and reset failed-delivery counter

2. Events#

SpotGo delivers an HTTP POST (JSON body) to your callbackUrl. The payload is intentionally small: use dataUrl to fetch the full order (including documents) with your API key.
EventWhen it firesTypical use
carrier.document.processedAfter initial AI processing completes for the order — i.e. no documents remain in Processing on that order. Fires once for the whole order, not per split document. Failed classifications still count as "no longer processing".Workflow B — review newly uploaded/classified documents (GET order → download via .../content → accept/reject via status API).
carrier.document.acceptedWhen the order's aggregate document status transitions to Accepted — every required document type has at least one accepted document.Workflow A — trigger downstream automation when paperwork is ready.
carrier.document.rejectedWhen the order's aggregate document status transitions to Rejected — at least one required document type has all of its documents rejected.Alert or retry flows when required paperwork cannot be accepted.
Important behaviour
id in the webhook body is the order orderId (GUID string). Persist this when you create/upsert orders.
dataUrl points to GET /api/v1/orders/{orderId} on the Carrier Portal order host (https://carrier-test.spotgo.eu in test, https://carrier.spotgo.eu in production) — not the webhook registration host (api-test.spotgo.eu / api.spotgo.eu).
Re-uploads can move an order through InReview → Accepted → InReview → Rejected over time; accepted/rejected events may fire more than once. Always treat dataUrl as the latest state.
There is no per-document webhook; document details are always loaded from the order response after notification.
Duplicate notifications are possible; design your consumer to be safe when the same event arrives more than once.

3. Webhook payload examples (test environment)#

Documents processed (upload + AI classification finished)#

{
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "subscriptionId": "53559882-b8cd-4f08-b3f4-efc71a9e0254",
  "event": "carrier.document.processed",
  "dataUrl": "https://carrier-test.spotgo.eu/api/v1/orders/a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}

Order documents accepted (aggregate)#

{
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "subscriptionId": "53559882-b8cd-4f08-b3f4-efc71a9e0254",
  "event": "carrier.document.accepted",
  "dataUrl": "https://carrier-test.spotgo.eu/api/v1/orders/a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}

Order documents rejected (aggregate)#

{
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "subscriptionId": "53559882-b8cd-4f08-b3f4-efc71a9e0254",
  "event": "carrier.document.rejected",
  "dataUrl": "https://carrier-test.spotgo.eu/api/v1/orders/a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}

Recommended handler flow#

1.
Receive POST on your callbackUrl.
2.
Read event and id (orderId).
3.
GET the dataUrl with your X-Api-Key to load the order and Documents (test: https://carrier-test.spotgo.eu, production: https://carrier.spotgo.eu).
4.
For each document you need, call GET .../orders/{orderId}/documents/{documentId}/content on the same order host as dataUrl.
5.
(Workflow B only) Update document status via POST .../orders/{orderId}/documents/{documentId}/status on the same order host.
Modified at 2026-06-29 17:32:33
Previous
Integration flows
Next
Document Upload
Built with