Submit Single Fulfillment
POST/api/tiktok-shop/integration-instances/:integration_instance_id/fulfillments/:sales_order_fulfillment_id/submit
Reports one fulfillment's shipment to TikTok Shop.
This endpoint currently requires session authentication; Personal Access Token scope support is in progress.
Authentication: Requires Bearer token. Requires the sales_orders.fulfill permission.
Body:
force_submit(boolean, optional, default false): submit even when SKU.io is not running in production. It does not bypass the integration's sync controls.
For each fulfillment, SKU.io marks the TikTok package shipped with the fulfillment's tracking number and its carrier, matched to one of TikTok Shop's shipping providers for the order's delivery option. The fulfillment is then marked as submitted. Outcomes:
- Submitted: TikTok Shop accepted the shipment.
- Already shipped: TikTok Shop already had every item shipped; nothing new is sent and the fulfillment is marked as submitted.
- Skipped: nothing is sent, and the fulfillment is left as it is. This happens when the fulfillment is not pending on this integration (already submitted, not fulfilled, a pickup, a cancelled sales order, or another integration's order), TikTok ships the order itself, or the TikTok order is cancelled.
- Failed: for example, a missing tracking number, a carrier that matches none of TikTok Shop's shipping providers, or TikTok Shop rejecting the shipment. The reason is returned and also recorded on the fulfillment and the sales order.
Nothing sent returns 409, never a success. The body is {success: false, skipped: true, reason, message}, and message says why and what to do:
reason: sync_disabled(alsoskipped_sync_disabled: true): outbound Tracking sync is turned off for this integration. Turn it on in the TikTok Shop integration's sync controls.force_submitdoes not bypass this. A paused sync schedule does not block these endpoints: pausing stops only the automatic submissions.reason: non_production(alsoskipped_non_production: true): SKU.io is not running in production andforce_submitwas not true. Send again withforce_submit: trueto submit anyway.reasonis the skip reason otherwise:already_submitted,not_fulfilled,pickup,order_cancelled,not_for_this_integration,not_found, ornot_sent(TikTok ships the order, or the TikTok order is cancelled).
Response: 200 {success: true, skipped: false, message} when TikTok Shop received it; 422 {success: false, skipped: false, message} when the submission failed.
Request
Responses
- 200
- 401
- 403
- 404
- 409
- 422
- 429
OK
Response Headers
Unauthenticated — the bearer token is missing, revoked, expired, or malformed. Never retry automatically; fix the credential. See the Errors guide.
Forbidden — the token lacks a required scope, the endpoint is not available to API tokens, or the user behind the token lacks the permission. A human must adjust the token scopes or user permissions; do not retry.
Not found — no record with the given identifier (or the route does not exist). Verify the ID before retrying.
Conflict
Response Headers
Unprocessable Entity
Response Headers
Rate limited — platform limit is 1,000 requests/min; individual tokens may carry lower limits. Honor the Retry-After header before retrying. See the Rate Limits guide.