Use this guide with your AI agent. Share this page with an AI agent connected to DataDoe MCP and ask it to help with External Fulfillment shipping.
For questions or issues, contact DataDoe support using the form (opens in a new tab), or ask your agent to create a support case through MCP.
Ship orders that Amazon does not fulfill
Use External Fulfillment Actions when you pack and ship an order yourself, or when Amazon coordinates pickup for Seller Flex or Easy Ship. You or your AI agent choose each step. DataDoe does not confirm, reject, regenerate a label, or update delivery status unless you start that Action.
These Actions call Amazon External Fulfillment Shipping API version 2024-09-11. They are not:
- Buy Shipping version 2, which buys a label for a merchant-fulfilled order through the Shipping API
- FBA inbound, which sends inventory to an Amazon fulfillment center
- Multi-Channel Fulfillment, which asks Amazon to ship from FBA inventory
- Vendor Direct Fulfillment, which is for vendor accounts
Before you start
- Connect the Seller Central account that owns the shipment. Vendor Central cannot run these Actions.
- The account needs the Amazon role Direct-to-Consumer Shipping (Restricted).
- Enable the Action types you need in Settings > Actions (opens in a new tab). New types start disabled.
- Give your user or service account access to that Seller and those Action types.
- Use Read and write account access for write Actions.
- Enable Organization personally identifiable information (PII) access, and your role's Access PII data permission, for Actions marked PII. Shipment reads, shipping options, invoices and labels can contain a recipient, address or document.
Your agent can use the standard DataDoe MCP connection or the REST API. The readonly MCP connection does not provide these Actions. See Actions permissions and billing.
One Action counts as one execution item. A dry run does not spend AI Tokens.
Keep the identifiers separate
Amazon uses different IDs. Do not substitute one for another.
- The order ID is the buyer order on the shipment. It is not the ID you send to later Actions.
- The shipment ID comes from a shipment list or shipment read. Later Actions use this ID.
- The package ID comes from the packages on that shipment, or from the package you created.
- The location ID filters shipments for one fulfillment location.
- The shipping option ID comes from the shipping-options read. Send it when you generate a label that needs a chosen option.
Follow the shipment
- List shipments with status
ACCEPTEDwhen you want new merchant-fulfilled shipments.CREATEDmeans Amazon could not auto-accept the order because inventory was insufficient. KeepCREATEDonly for that case. - Read one shipment. It includes line items, package IDs, status, substatus, reason, channel and shipping type. Package tracking is optional. A package without tracking is still a valid shipment.
- Confirm the shipment when you will fulfill it, or reject it when you will not. Rejection rejects this fulfillment shipment. It does not cancel the order, and it does not cancel a Buy Shipping label.
- Create packages. Send the full package: dimensions, weight and line items. Add serial numbers or hazmat labels when Amazon requires them. For a cross-border line, read
countryOfOriginRequirementanditemValueRequirementon the shipment line. When Amazon marks them required, sendcountryOfOriginanditemValue. UserecommendedCountryOfOriginandrecommendedCurrencyCodefrom that line when Amazon provides them. - Read shipping options for one package. An empty list, or a null list, means Amazon has no option yet. That is a valid result.
- Generate an invoice when the program requires one, then read it back if you need the file again.
- Generate labels.
GENERATEalso retrieves labels that already exist.REGENERATEreplaces them. - Update package status only when the program requires that step.
Validate with dryRun: true before a live call. A successful check returns VALIDATED and does not call Amazon.
Choose the program
Use channelName and shippingType from the shipment read.
| Program | channelName | shippingType | DataDoe program |
|---|---|---|---|
| Easy Ship | MFN | MARKETPLACE | EASY_SHIP |
| Self Ship | MFN | SELF | SELF_SHIP |
| Seller Flex | FBA | MARKETPLACE | SELLER_FLEX |
Use MFN_SELF_DELIVERY when the order is Merchant Fulfillment Network (MFN) self-delivery and needs the same delivery body as Self Ship. Amazon's shipment guide does not publish a separate channel pair for that program.
Program rules
Seller Flex, Easy Ship and Self Delivery do not share every step.
- Easy Ship updates package status automatically. Do not send a status update. Easy Ship invoices work only for the India store.
- Seller Flex handover uses status
SHIPPED. Send that step only for the UK, Spain, France, Germany and Italy stores. Do not send a delivery body. - Self Delivery and MFN Self Delivery send a delivery body. Use one allowed combination from the table below. Mark out for delivery and delivered on the same calendar day. If the delivery attempt is on another day, send out for delivery again before delivered. Send a status only between 6 AM and 11:59 PM local time. Do not send the Seller Flex
SHIPPEDquery for these programs.
| Status | Substatus | Reason |
|---|---|---|
SHIPPED | OUT_FOR_DELIVERY | OutForDelivery |
DELIVERED | DELIVERED | DeliveredToCustomer |
DELIVERED | DELIVERED | DeliveredToHouseholdMember |
DELIVERED | DELIVERED | DeliveredToReception |
DELIVERED | DELIVERED | DeliveredToSecurityGuard |
SHIPPED | NOT_DELIVERED | CustomerNotAvailable |
SHIPPED | NOT_DELIVERED | MissedDelivery |
SHIPPED | NOT_DELIVERED | CustomerContactIssue |
SHIPPED | UNDELIVERABLE | RejectedByCustomer |
SHIPPED | UNDELIVERABLE | RejectedOrderDamaged |
- Label files differ by program. Seller Flex uses PNG or ZPL for one package, and ZPL for more than one package. Easy Ship uses PNG, ZPL or PDF. Self Ship uses PNG. DataDoe stores the file Amazon returns when the format is PDF, PNG, ZPL or plain text.
Tracking details on a package are returned by Amazon. Do not send them when you create or replace a package.
Read the result
Keep the Action ID. Read that Action to see progress, the Amazon response, stored files and errors.
A successful confirm, reject, package create, package replace or status update often has no response body. DataDoe records HTTP 204 and does not invent a body. Read the Action to see that result:
1{
2 "actionId": "ACTION_ID",
3 "type": "AMAZON_EXTERNAL_FULFILLMENT_SHIPMENTS_CONFIRM",
4 "sellerOrVendorId": "SELLER_ID",
5 "status": "COMPLETED",
6 "details": { "shipmentId": "SHIPMENT_ID" },
7 "result": {
8 "apiVersion": "2024-09-11",
9 "operation": "processShipment",
10 "observedAt": "2026-11-09T12:00:01.000Z",
11 "httpStatus": 204,
12 "amazonResponse": null,
13 "documents": [],
14 "warnings": []
15 },
16 "queuedAt": "2026-11-09T12:00:00.000Z",
17 "startedAt": "2026-11-09T12:00:00.000Z",
18 "completedAt": "2026-11-09T12:00:01.000Z"
19}actions_get in MCP returns the same fields.
List results keep Amazon's next token. If a page is empty and a next token is present, repeat the same filters with that token. An empty page looks like this:
1{
2 "status": "COMPLETED",
3 "result": {
4 "apiVersion": "2024-09-11",
5 "operation": "getShipments",
6 "observedAt": "2026-11-09T12:00:01.000Z",
7 "httpStatus": 200,
8 "amazonResponse": { "shipments": [], "pagination": { "nextToken": "NEXT_TOKEN" } },
9 "documents": [],
10 "warnings": []
11 }
12}Send the next request with the same filters and "paginationToken": "NEXT_TOKEN".
Shipping labels include a status for each package. If some packages succeed and some fail, the Action is partial. If every package fails, the Action fails. Do not treat either case as a full success. Successful label files are still stored. Call GENERATE again to retrieve labels that already exist. Call REGENERATE only when you intend to replace them.
If a write times out, or Amazon returns a server error, DataDoe does not send that write again. Read the shipment, then decide whether a new Action is safe.
Amazon error details stay on the Action result. Amazon returns 403 when the Seller is missing Direct-to-Consumer Shipping (Restricted).
Documents
Invoice content and label download locations are stored as DataDoe Files. The Action result contains the file ID, content type and an authenticated download link. The link expires. The file is kept for one week. Read the same Action again to refresh a link that is still within that week. DataDoe does not publish a permanent public URL or a credential.
Examples
Replace SELLER_ID with your Seller connection ID. These examples use the REST envelope. MCP uses the same type, sellerOrVendorId, dryRun and details fields on actions_start.
List accepted shipments
1{
2 "type": "AMAZON_EXTERNAL_FULFILLMENT_SHIPMENTS_FIND",
3 "sellerOrVendorId": "SELLER_ID",
4 "dryRun": true,
5 "details": {
6 "status": "ACCEPTED",
7 "maxResults": 20
8 }
9}A later page repeats every filter and adds paginationToken from the previous result. An empty shipments array with a next token is still a page, not an error.
Read a shipment that has no tracking yet
1{
2 "type": "AMAZON_EXTERNAL_FULFILLMENT_SHIPMENTS_GET",
3 "sellerOrVendorId": "SELLER_ID",
4 "details": {
5 "shipmentId": "SHIPMENT_ID"
6 }
7}The response can include packages without trackingDetails. Leave the shipment as Amazon returned it.
Easy Ship cross-border package
India store ID is A21TJRUUN4KGV. Send the country of origin and the item value with its currency code.
1{
2 "type": "AMAZON_EXTERNAL_FULFILLMENT_PACKAGES_ADD",
3 "sellerOrVendorId": "SELLER_ID",
4 "details": {
5 "shipmentId": "SHIPMENT_ID",
6 "packages": [
7 {
8 "id": "PACKAGE_ID",
9 "dimensions": {
10 "length": { "value": 20, "dimensionUnit": "CM" },
11 "width": { "value": 15, "dimensionUnit": "CM" },
12 "height": { "value": 10, "dimensionUnit": "CM" }
13 },
14 "weight": { "value": 500, "weightUnit": "G" },
15 "packageLineItems": [
16 {
17 "packageLineItemId": "LINE_ITEM_ID",
18 "quantity": 1,
19 "countryOfOrigin": "CN",
20 "itemValue": { "value": 25, "currencyCode": "USD" }
21 }
22 ]
23 }
24 ]
25 }
26}Package weight must be at least five grams. Replace the whole package with AMAZON_EXTERNAL_FULFILLMENT_PACKAGES_UPDATE and the same package object plus packageId. Do not send trackingDetails.
Confirm a shipment
Reject uses the same acknowledgement body with AMAZON_EXTERNAL_FULFILLMENT_SHIPMENTS_REJECT. Rejection rejects this fulfillment shipment. It does not cancel the order or a Buy Shipping label.
1{
2 "type": "AMAZON_EXTERNAL_FULFILLMENT_SHIPMENTS_CONFIRM",
3 "sellerOrVendorId": "SELLER_ID",
4 "details": {
5 "shipmentId": "SHIPMENT_ID",
6 "acknowledgement": {
7 "referenceId": "WAREHOUSE_REF",
8 "lineItems": [{ "lineItem": { "id": "LINE_ITEM_ID", "quantity": 1 } }]
9 }
10 }
11}Read shipping options
1{
2 "type": "AMAZON_EXTERNAL_FULFILLMENT_SHIPPING_OPTIONS_FIND",
3 "sellerOrVendorId": "SELLER_ID",
4 "details": {
5 "shipmentId": "SHIPMENT_ID",
6 "packageId": "PACKAGE_ID"
7 }
8}An empty or null option list is a valid result. Use shippingOptionId from a returned option when you generate a label.
Generate or retrieve an invoice
Easy Ship invoices are only for the India store, A21TJRUUN4KGV. Generate and retrieve use the same details. Retrieve uses AMAZON_EXTERNAL_FULFILLMENT_INVOICES_GET.
1{
2 "type": "AMAZON_EXTERNAL_FULFILLMENT_INVOICES_GENERATE",
3 "sellerOrVendorId": "SELLER_ID",
4 "details": {
5 "shipmentId": "SHIPMENT_ID",
6 "fulfillmentProgram": "EASY_SHIP",
7 "marketplaceId": "A21TJRUUN4KGV"
8 }
9}A finished invoice Action stores the file and removes the raw content:
1{
2 "status": "COMPLETED",
3 "result": {
4 "apiVersion": "2024-09-11",
5 "operation": "generateInvoice",
6 "observedAt": "2026-11-09T12:00:01.000Z",
7 "httpStatus": 200,
8 "amazonResponse": { "document": { "format": "PDF", "fileId": "FILE_ID" } },
9 "documents": [
10 {
11 "fileId": "FILE_ID",
12 "name": "external-fulfillment-ACTION_ID-1.pdf",
13 "mediaType": "application/pdf",
14 "downloadUrl": "https://files.example/invoice",
15 "urlExpiresAt": "2026-11-09T12:05:00.000Z",
16 "fileExpiresAt": "2026-11-16T12:00:00.000Z"
17 }
18 ],
19 "warnings": []
20 }
21}The download link is authenticated and expires. The file is kept for one week. Read the same Action again to refresh a link that is still within that week.
Generate labels
1{
2 "type": "AMAZON_EXTERNAL_FULFILLMENT_SHIPPING_LABELS_GENERATE",
3 "sellerOrVendorId": "SELLER_ID",
4 "details": {
5 "shipmentId": "SHIPMENT_ID",
6 "operation": "GENERATE",
7 "shippingOptionId": "SHIPPING_OPTION_ID",
8 "packageIds": ["PACKAGE_ID"]
9 }
10}Use REGENERATE only when the current labels must be replaced. Send at most 50 package IDs. A mixed result is partial, not a full success:
1{
2 "status": "PARTIALLY_COMPLETED",
3 "result": {
4 "apiVersion": "2024-09-11",
5 "operation": "generateShipLabels",
6 "observedAt": "2026-11-09T12:00:01.000Z",
7 "httpStatus": 200,
8 "amazonResponse": {
9 "packageShipLabelList": [
10 {
11 "packageId": "PACKAGE_ID",
12 "status": "SUCCESS",
13 "fileData": { "fileId": "FILE_ID" }
14 },
15 {
16 "packageId": "OTHER_PACKAGE_ID",
17 "status": "FAILURE",
18 "errorDetails": { "code": "FAILED" }
19 }
20 ]
21 },
22 "documents": [
23 {
24 "fileId": "FILE_ID",
25 "name": "external-fulfillment-ACTION_ID-1.png",
26 "mediaType": "image/png",
27 "downloadUrl": "https://files.example/label",
28 "urlExpiresAt": "2026-11-09T12:05:00.000Z",
29 "fileExpiresAt": "2026-11-16T12:00:00.000Z"
30 }
31 ],
32 "packageLabels": [
33 { "packageId": "PACKAGE_ID", "status": "SUCCESS" },
34 { "packageId": "OTHER_PACKAGE_ID", "status": "FAILURE", "error": { "code": "FAILED" } }
35 ],
36 "warnings": []
37 }
38}Download the stored file from documents. Call GENERATE again to retrieve labels that already exist.
Seller Flex status in the UK
The UK store ID is A1F83G8C2ARO7P. This step is also used for Spain, France, Germany and Italy. It is not used for Easy Ship.
1{
2 "type": "AMAZON_EXTERNAL_FULFILLMENT_PACKAGES_STATUS_UPDATE",
3 "sellerOrVendorId": "SELLER_ID",
4 "details": {
5 "shipmentId": "SHIPMENT_ID",
6 "packageId": "PACKAGE_ID",
7 "fulfillmentProgram": "SELLER_FLEX",
8 "marketplaceId": "A1F83G8C2ARO7P"
9 }
10}DataDoe sends Amazon status SHIPPED for this program. Do not add a delivery body.
Self Delivery status
Send this only for SELF_SHIP or MFN_SELF_DELIVERY. Mark out for delivery and delivered on the same calendar day, between 6 AM and 11:59 PM local time.
1{
2 "type": "AMAZON_EXTERNAL_FULFILLMENT_PACKAGES_STATUS_UPDATE",
3 "sellerOrVendorId": "SELLER_ID",
4 "details": {
5 "shipmentId": "SHIPMENT_ID",
6 "packageId": "PACKAGE_ID",
7 "fulfillmentProgram": "SELF_SHIP",
8 "marketplaceId": "ATVPDKIKX0DER",
9 "deliveryStatus": {
10 "status": "SHIPPED",
11 "subStatus": "OUT_FOR_DELIVERY",
12 "reason": "OutForDelivery"
13 }
14 }
15}Where to find each Action
Open the External Fulfillment section of the Actions explorer. It lists the identifier, purpose, read or write access, program limits, role, PII, inputs and the result. The same list is in Settings > Actions (opens in a new tab), the API specification and MCP.

