Create Send Plan
POST/api/send-plans
Calculate a new send plan in the background: how many units of each product to send from your warehouses to every enabled marketplace network. Returns 202 immediately with the plan in calculating status; poll Get Send Plan until it is ready (or failed, with error explaining why).
send-plans:writeGrant this scope to your token under Settings → Developer → Personal Access Tokens.
When a working plan is already calculating (started within the last two hours), the in-flight plan is returned instead of starting another. When a working plan finishes it supersedes the previous ready working plan, and line overrides from that plan are carried forward.
Authentication: Bearer Personal Access Token with the send-plans:write scope. The token's user also needs permission to edit the send planner.
Body fields (all optional):
- type (string): working | scenario | run. Default working. A working plan replaces the current plan when it finishes; a scenario is a what-if copy that never creates drafts; a run is a weekly send run.
- name (string, max 120): required when type is scenario.
- scope.product_ids (integer[], max 5000): plan only these products (each must exist).
- scope.brand_ids (integer[]): plan only products of these brands.
- scope.saved_view_hash (string, max 64): plan only the products a saved view of the planner shows.
- policy_overrides.velocity_window_days (integer, 7-365): days of sales history averaged for velocity.
- policy_overrides.networks.{destination_warehouse_id}.enabled (boolean): include or exclude a network for this plan.
- policy_overrides.networks.{destination_warehouse_id}.target_days (integer, 1-365): days of cover to aim for.
- policy_overrides.networks.{destination_warehouse_id}.floor_days (integer, 0-365): minimum cover filled first when stock is short.
- policy_overrides.networks.{destination_warehouse_id}.max_days (integer, 1-730): never send beyond this cover.
- policy_overrides.networks.{destination_warehouse_id}.weight (number, 0.1-10): priority weight when stock is shared.
- policy_overrides.networks.{destination_warehouse_id}.lead_days (integer, 0-180): transit + check-in days.
- policy_overrides.networks.{destination_warehouse_id}.demand_multiplier (number, 0-20): scale the network's demand (e.g. 1.3 for a promotion).
- policy_overrides.networks.{destination_warehouse_id}.buffer_days (integer, 0-180): safety days of cover on top of the target.
- policy_overrides.networks.{destination_warehouse_id}.channel_priority (string): protect_other_channels (default) | favor_network — a favored network may use stock kept for forecast self-fulfilled demand (orders the merchant ships from their own warehouses).
- policy_overrides.networks.{destination_warehouse_id}.demand_windows (array, max 6): date windows where the network's demand is scaled, e.g. a promotion. Each: start (Y-m-d, required), end (Y-m-d, on or after start, required), multiplier (number 0-20, required), label (string, max 120), promo_window_id (integer).
- policy_overrides.reserve_days (integer, 0-365): days of self-fulfilled demand (orders you ship from your own warehouses: web store, eBay, Amazon FBM, wholesale…) kept back at the source warehouses.
- policy_overrides.protect_local (boolean): when false only open orders and backorders are protected, not forecast demand.
- policy_overrides.include_inbound_days (integer, 0-180): count open purchase / manufacturing orders arriving within this many days as sendable supply.
- policy_overrides.local_demand_multiplier (number, 0-20): scale your own demand.
- policy_overrides.capacity_multiplier (number, 0.1-5): scale every network capacity limit (e.g. 0.8 for capacity cut by 20%).
- policy_overrides.rounding (string): nearest | down | up | none — case-pack rounding.
- policy_overrides.source_warehouse_ids (integer[]): ship only from these warehouses (each must exist).
- plan_anyway (boolean): calculate even when a network's stock snapshot is stale. Without it, a stale network fails the plan with an explanation.
Returns 422 on validation errors (for example a scenario without a name).
Request
Responses
- 202
- 401
- 403
- 422
- 429
Accepted
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.
Unprocessable Content
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.