Flash Express · AsyncAPI Specification

Flash Express Webhooks

Version

View Spec View on GitHub CompanyLogisticsShippingDeliveryParcel TrackingE-CommerceLast MileCourierCash on DeliveryThailandSoutheast AsiaWebhooksAsyncAPIWebhooksEvents

AsyncAPI Specification

flash-express-webhooks.yml Raw ↑
generated: '2026-08-12'
method: searched
source: https://open-docs.flashexpress.com/#web-hook-api
spec_type: null
note: >-
  Flash Express publishes NO AsyncAPI document. Every host was probed and no
  /asyncapi.yaml, /asyncapi.json or event-catalog surface exists, and there is no
  Flash Express GitHub organization to search. What the provider does publish is a
  real, documented webhook catalog with five event types, a self-service subscription
  API, a defined acknowledgement contract and automatic redelivery. That webhook
  surface is captured here and pointed at with `type: Webhooks`; no `type: AsyncAPI`
  pointer is emitted because no AsyncAPI document exists. Nothing in this file is
  fabricated into AsyncAPI shape.
event_surface:
  style: webhooks
  transport: HTTP POST to a merchant-registered callback URL
  payload_content_type: application/x-www-form-urlencoded
  subscription: self-service via API
  asyncapi_published: false
  streaming: false
subscription_api:
  configure:
    operation: POST /open/v1/setting/web_hook_service
    description: Register, replace or close the callback URL for one webhook type.
    parameters:
    - {name: mchId, type: string(32), required: true, description: merchant No}
    - {name: nonceStr, type: string(32), required: true, description: random nonce string}
    - {name: sign, type: string(64), required: true, description: signature}
    - {name: serviceCategory, type: integer, required: true, description: '0 = close the URL, 1 = configure the URL'}
    - {name: url, type: string(200), required: false, description: callback URL address}
    - {name: webhookApiCode, type: integer, required: true, description: which webhook type this configuration applies to}
    response_fields: [mchId, webhookApiCode, url, state, updateAt]
  list:
    operation: POST /gw/fda/open/standard/webhook/setting/infos
    description: Retrieve the merchant's current webhook settings.
events:
- name: Web hook status
  webhookApiCode: 0
  description: Parcel status changes.
  docs: https://open-docs.flashexpress.com/#web-hook-status
- name: Web hook weight
  webhookApiCode: 1
  description: Parcel weight modifications recorded by Flash Express after measurement.
  docs: https://open-docs.flashexpress.com/#web-hook-weight
- name: Web hook price
  webhookApiCode: 2
  description: Parcel price/freight updates.
  docs: https://open-docs.flashexpress.com/#web-hook-price
- name: Web hook courier
  webhookApiCode: 3
  description: Courier assignment for a parcel.
  docs: https://open-docs.flashexpress.com/#web-hook-courier
- name: Web hook routes
  webhookApiCode: 4
  description: Route/tracking scan events as the parcel moves through the network.
  docs: https://open-docs.flashexpress.com/#web-hook-routes
delivery_contract:
  method: POST
  signature:
    signed: true
    algorithm: SHA256
    signed_parameters: [mchId, nonceStr]
    note: >-
      Inbound webhook requests are signed, but only mchId and nonceStr participate in the
      webhook signature — a narrower parameter set than the outbound API signature. A
      merchant verifying a callback must sign those two fields only.
  common_payload_fields:
  - {name: mchId, description: Merchant account from FlashExpress}
  - {name: nonceStr, description: timestamp string}
  - {name: sign, description: SHA256 signature over (mchId, nonceStr)}
  - {name: data.orderId, description: FlashExpress order id}
  - {name: data.outTradeNo, description: merchant order number}
  - {name: data.pno, description: waybill / tracking number}
  - {name: data.recentPno, description: current tracking number}
  - {name: data.state, description: status code}
acknowledgement:
  required_http_status: '[200,300)'
  required_body:
    errorCode: '1'
    state: success
  failure_body:
    errorCode: '0'
  note: >-
    Both conditions must hold. An HTTP 2xx alone is not an acknowledgement — the body must
    also be {"errorCode":"1","state":"success"}, otherwise Flash Express treats the
    delivery as failed and resends.
retry:
  automatic: true
  policy: >-
    "If the transmission fail, the flash system will automatically resend until it receives
    success status." No maximum attempt count, backoff schedule or expiry window is
    published.
  max_attempts: null
  backoff: null
  manual_replay: false
  manual_replay_note: >-
    The published Q&A states the web hook is unable to re-push again on demand and that the
    merchant should check the related information through Flash Printer. There is no
    self-service event replay endpoint.
route_actions:
  note: >-
    The routes webhook and the tracking operations emit a documented routedAction
    vocabulary. Full list published at https://open-docs.flashexpress.com/#route-action
  values:
  - RECEIVED
  - RECEIVE_WAREHOUSE_SCAN
  - SHIPMENT_WAREHOUSE_SCAN
  - ARRIVAL_WAREHOUSE_SCAN
  - DELIVERY_TICKET_CREATION_SCAN
  - DETAIN_WAREHOUSE
  - DELIVERY_CONFIRM
  - DIFFICULTY_HANDOVER
  - CONTINUE_TRANSPORT
  - DIFFICULTY_RE_TRANSIT
  - CANCEL_PARCEL
  - HURRY_PARCEL
  - CHANGE_PARCEL_INFO
  - CHANGE_PARCEL_CLOSE
  - CHANGE_PARCEL_SIGNED
  - CHANGE_PARCEL_CANCEL
  - CHANGE_PARCEL_IN_TRANSIT
  - REVISION_TIME
  - CUSTOMER_CHANGE_PARCEL_INFO
  - DIFFICULTY_FINISH_INDEMNITY
  - SYSTEM_AUTO_RETURN
status_flow:
  published: true
  format: pdf
  url: https://open-docs.flashexpress.com/download/status.pdf
  note: >-
    The parcel status state machine is published only as a PDF diagram, not as a
    machine-readable enumeration.
summary:
  event_count: 5
  asyncapi_present: false
  webhooks_present: true
  message_schemas_published: false
  signed_deliveries: true
  automatic_retry: true