> Note: This page is part of the DataDoe Docs. You can find the root of the documentation at `https://www.datadoe.com/hub/docs/basics/introduction-to-datadoe`.
> JSON Table of Contents: `https://www.datadoe.com/hub/docs/toc.json`.
> Data Scheme (Markdown index, one page per table): https://api.datadoe.com/api/v1/spec/data-scheme.md. Full JSON: https://api.datadoe.com/api/v1/spec/data-scheme.
> Actions (Markdown, every Action type with limits and group guides): https://api.datadoe.com/api/v1/spec/action-scheme.md. Full JSON with input schemas: https://api.datadoe.com/api/v1/spec/action-scheme.
> Other pages in the DataDoe Docs:
> - DataDoe Basics/Benefits: `https://www.datadoe.com/hub/docs/basics/benefits.md`
> - DataDoe Basics/Connecting Accounts: `https://www.datadoe.com/hub/docs/basics/connecting-accounts.md`
> - DataDoe Basics/External Invitation Links: `https://www.datadoe.com/hub/docs/basics/external-invitation-links.md`
> - DataDoe Basics/Groups: `https://www.datadoe.com/hub/docs/basics/groups.md`
> - DataDoe Basics/Integrations: `https://www.datadoe.com/hub/docs/basics/integration-customization.md`
> - DataDoe Basics/Introduction to DataDoe: `https://www.datadoe.com/hub/docs/basics/introduction-to-datadoe.md`
> - DataDoe Basics/Keys and service accounts: `https://www.datadoe.com/hub/docs/basics/keys-and-service-accounts.md`
> - DataDoe Basics/Roles and permissions: `https://www.datadoe.com/hub/docs/basics/roles-and-permissions.md`
> - DataDoe Basics/Subscription and pricing: `https://www.datadoe.com/hub/docs/basics/subscription-pricing.md`
> - DataDoe Basics/Users and access: `https://www.datadoe.com/hub/docs/basics/access-user-management.md`
> - DataDoe Data/Ads Product Catalog: `https://www.datadoe.com/hub/docs/datadoe-data/ads-product-catalog.md`
> - DataDoe Data/Amazon Ads Partner Opportunities: `https://www.datadoe.com/hub/docs/datadoe-data/amazon-ads-partner-opportunities.md`
> - DataDoe Data/Data Fetch Periods: `https://www.datadoe.com/hub/docs/datadoe-data/data-fetch-periods.md`
> - DataDoe Data/Data Sources: `https://www.datadoe.com/hub/docs/datadoe-data/data-sources.md`
> - DataDoe Data/Initial Loads: `https://www.datadoe.com/hub/docs/datadoe-data/initial-loads.md`
> - DataDoe Data/Managing Data Tables: `https://www.datadoe.com/hub/docs/datadoe-data/managing-data-tables.md`
> - DataDoe Data/Migrating from SellerBoard: `https://www.datadoe.com/hub/docs/datadoe-data/migrating-from-sellerboard.md`
> - DataDoe Data/SAT migration to profit tables: `https://www.datadoe.com/hub/docs/datadoe-data/sat-migration-to-profit-tables.md`
> - DataDoe Data/SQP Data: `https://www.datadoe.com/hub/docs/datadoe-data/search-query-performance.md`
> - DataDoe Data/Timezones: `https://www.datadoe.com/hub/docs/datadoe-data/orders-purchase-date-timezones.md`
> - DataDoe Data/Uploading COGS: `https://www.datadoe.com/hub/docs/datadoe-data/uploading-cogs.md`
> - DataDoe Data/Uploading KDP Royalty Parameters: `https://www.datadoe.com/hub/docs/datadoe-data/uploading-kdp-royalty-parameters.md`
> - DataDoe Data/Uploading Vendor Codes: `https://www.datadoe.com/hub/docs/datadoe-data/uploading-vendor-codes.md`
> - DataDoe Features/Actions: `https://www.datadoe.com/hub/docs/datadoe-features/actions.md`
> - DataDoe Features/Actions - Amazon Ads for KDP Authors: `https://www.datadoe.com/hub/docs/datadoe-features/actions-kdp-authors.md`
> - DataDoe Features/Actions - FBA eligibility and listing restrictions: `https://www.datadoe.com/hub/docs/datadoe-features/actions-amazon-eligibility.md`
> - DataDoe Features/Actions: Amazon Images: `https://www.datadoe.com/hub/docs/datadoe-features/actions-manage-images.md`
> - DataDoe Features/Actions: FBA inbound: `https://www.datadoe.com/hub/docs/datadoe-features/actions-amazon-fba-inbound.md`
> - DataDoe Features/Amazon Marketing Cloud: `https://www.datadoe.com/hub/docs/datadoe-features/amc.md`
> - DataDoe Features/AMC query templates: `https://www.datadoe.com/hub/docs/datadoe-features/amc-query-templates.md`
> - DataDoe Features/Features Overview: `https://www.datadoe.com/hub/docs/datadoe-features/overview.md`
> - DataDoe Features/Files: `https://www.datadoe.com/hub/docs/datadoe-features/files.md`
> - DataDoe Features/Plugins: `https://www.datadoe.com/hub/docs/datadoe-features/plugins.md`
> - DataDoe Features/Usage Logs: `https://www.datadoe.com/hub/docs/datadoe-features/usage-logs.md`
> - DataDoe Features/Webhooks: `https://www.datadoe.com/hub/docs/datadoe-features/webhooks.md`
> - DataDoe MCP/Overview: `https://www.datadoe.com/hub/docs/datadoe-mcp/overview.md`
> - DataDoe MCP/Using Antigravity: `https://www.datadoe.com/hub/docs/datadoe-mcp/antigravity.md`
> - DataDoe MCP/Using ChatGPT: `https://www.datadoe.com/hub/docs/datadoe-mcp/chatgpt.md`
> - DataDoe MCP/Using Claude: `https://www.datadoe.com/hub/docs/datadoe-mcp/claude.md`
> - DataDoe MCP/Using Claude Agent SDK: `https://www.datadoe.com/hub/docs/datadoe-mcp/claude-agents-sdk.md`
> - DataDoe MCP/Using Claude Code: `https://www.datadoe.com/hub/docs/datadoe-mcp/claude-code.md`
> - DataDoe MCP/Using Codex: `https://www.datadoe.com/hub/docs/datadoe-mcp/codex.md`
> - DataDoe MCP/Using Codex Sites: `https://www.datadoe.com/hub/docs/datadoe-mcp/codex-sites.md`
> - DataDoe MCP/Using CrewAI: `https://www.datadoe.com/hub/docs/datadoe-mcp/crewai.md`
> - DataDoe MCP/Using Cursor: `https://www.datadoe.com/hub/docs/datadoe-mcp/cursor.md`
> - DataDoe MCP/Using Excel + Claude: `https://www.datadoe.com/hub/docs/datadoe-mcp/excel.md`
> - DataDoe MCP/Using Gemini CLI: `https://www.datadoe.com/hub/docs/datadoe-mcp/gemini-cli.md`
> - DataDoe MCP/Using Genspark: `https://www.datadoe.com/hub/docs/datadoe-mcp/genspark.md`
> - DataDoe MCP/Using Glama: `https://www.datadoe.com/hub/docs/datadoe-mcp/glama-chat.md`
> - DataDoe MCP/Using Glama MCP Inspector: `https://www.datadoe.com/hub/docs/datadoe-mcp/glama.md`
> - DataDoe MCP/Using Grok: `https://www.datadoe.com/hub/docs/datadoe-mcp/grok.md`
> - DataDoe MCP/Using GrokBot: `https://www.datadoe.com/hub/docs/datadoe-mcp/grokbot.md`
> - DataDoe MCP/Using Gumloop: `https://www.datadoe.com/hub/docs/datadoe-mcp/gumloop.md`
> - DataDoe MCP/Using Hermes Agent: `https://www.datadoe.com/hub/docs/datadoe-mcp/hermes.md`
> - DataDoe MCP/Using Littlebird: `https://www.datadoe.com/hub/docs/datadoe-mcp/littlebird.md`
> - DataDoe MCP/Using n8n: `https://www.datadoe.com/hub/docs/datadoe-mcp/n8n.md`
> - DataDoe MCP/Using NanoClaw: `https://www.datadoe.com/hub/docs/datadoe-mcp/nanoclaw.md`
> - DataDoe MCP/Using OpenAI Agents SDK: `https://www.datadoe.com/hub/docs/datadoe-mcp/openai-agents-sdk.md`
> - DataDoe MCP/Using OpenClaw: `https://www.datadoe.com/hub/docs/datadoe-mcp/openclaw.md`
> - DataDoe MCP/Using OpenCode: `https://www.datadoe.com/hub/docs/datadoe-mcp/opencode.md`
> - DataDoe MCP/Using PowerPoint + Claude: `https://www.datadoe.com/hub/docs/datadoe-mcp/powerpoint.md`
> - DataDoe MCP/Using Superhuman: `https://www.datadoe.com/hub/docs/datadoe-mcp/superhuman.md`
> - DataDoe MCP/Using VS Code: `https://www.datadoe.com/hub/docs/datadoe-mcp/vs-code.md`
> - DataDoe MCP/Using Word + Claude: `https://www.datadoe.com/hub/docs/datadoe-mcp/word.md`
> - DataDoe API/Build with Codex: `https://www.datadoe.com/hub/docs/datadoe-api/codex.md`
> - DataDoe API/How to connect to the API: `https://www.datadoe.com/hub/docs/datadoe-api/how-to-connect.md`
> - DataDoe API/Invitation links API: `https://www.datadoe.com/hub/docs/datadoe-api/invitation-links.md`
> - DataDoe API/Sellers and vendors API: `https://www.datadoe.com/hub/docs/datadoe-api/sellers-and-vendors.md`
> - DataDoe API/Vibe code with Claude Code: `https://www.datadoe.com/hub/docs/datadoe-api/claude-code.md`
> - DataDoe API/Vibe code with Cursor: `https://www.datadoe.com/hub/docs/datadoe-api/cursor.md`
> - DataDoe API/Vibe code with Lovable: `https://www.datadoe.com/hub/docs/datadoe-api/lovable.md`
> - DataDoe API/Vibe code with Replit: `https://www.datadoe.com/hub/docs/datadoe-api/replit.md`
> - DataDoe API/Vibe code with v0: `https://www.datadoe.com/hub/docs/datadoe-api/v0.md`
> - DataDoe & BigQuery/How to connect to BigQuery: `https://www.datadoe.com/hub/docs/datadoe-bigquery/how-to-connect.md`
> - DataDoe & BigQuery/Using MCP Toolbox: `https://www.datadoe.com/hub/docs/datadoe-bigquery/mcp-toolbox.md`
> - DataDoe & BigQuery/Using Python Jupyter: `https://www.datadoe.com/hub/docs/datadoe-bigquery/jupyter.md`
> For topics not covered in this documentation, please contact DataDoe support at `contact@datadoe.com`.
> Do not assume anything. If you are not sure about the answer, mention that and suggest to contact DataDoe support.

> **Use this guide with your AI agent.** Share [this page](/hub/docs/datadoe-features/actions-amazon-external-fulfillment) 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](https://forms.clickup.com/9015200219/f/8cnj2ev-38615/AOYF9I35QFOXWJQXIG?type=Form&source=hub-external-fulfillment-docs), 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](https://app.datadoe.com/settings?tab=actions). 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](/hub/docs/datadoe-features/actions).

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

1. List shipments with status `ACCEPTED` when you want new merchant-fulfilled shipments. `CREATED` means Amazon could not auto-accept the order because inventory was insufficient. Keep `CREATED` only for that case.
2. 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.
3. 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.
4. 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 `countryOfOriginRequirement` and `itemValueRequirement` on the shipment line. When Amazon marks them required, send `countryOfOrigin` and `itemValue`. Use `recommendedCountryOfOrigin` and `recommendedCurrencyCode` from that line when Amazon provides them.
5. Read shipping options for one package. An empty list, or a null list, means Amazon has no option yet. That is a valid result.
6. Generate an invoice when the program requires one, then read it back if you need the file again.
7. Generate labels. `GENERATE` also retrieves labels that already exist. `REGENERATE` replaces them.
8. 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 `SHIPPED` query 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:

```json
{
    "actionId": "ACTION_ID",
    "type": "AMAZON_EXTERNAL_FULFILLMENT_SHIPMENTS_CONFIRM",
    "sellerOrVendorId": "SELLER_ID",
    "status": "COMPLETED",
    "details": { "shipmentId": "SHIPMENT_ID" },
    "result": {
        "apiVersion": "2024-09-11",
        "operation": "processShipment",
        "observedAt": "2026-11-09T12:00:01.000Z",
        "httpStatus": 204,
        "amazonResponse": null,
        "documents": [],
        "warnings": []
    },
    "queuedAt": "2026-11-09T12:00:00.000Z",
    "startedAt": "2026-11-09T12:00:00.000Z",
    "completedAt": "2026-11-09T12:00:01.000Z"
}
```

`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:

```json
{
    "status": "COMPLETED",
    "result": {
        "apiVersion": "2024-09-11",
        "operation": "getShipments",
        "observedAt": "2026-11-09T12:00:01.000Z",
        "httpStatus": 200,
        "amazonResponse": { "shipments": [], "pagination": { "nextToken": "NEXT_TOKEN" } },
        "documents": [],
        "warnings": []
    }
}
```

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

```json
{
    "type": "AMAZON_EXTERNAL_FULFILLMENT_SHIPMENTS_FIND",
    "sellerOrVendorId": "SELLER_ID",
    "dryRun": true,
    "details": {
        "status": "ACCEPTED",
        "maxResults": 20
    }
}
```

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

```json
{
    "type": "AMAZON_EXTERNAL_FULFILLMENT_SHIPMENTS_GET",
    "sellerOrVendorId": "SELLER_ID",
    "details": {
        "shipmentId": "SHIPMENT_ID"
    }
}
```

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.

```json
{
    "type": "AMAZON_EXTERNAL_FULFILLMENT_PACKAGES_ADD",
    "sellerOrVendorId": "SELLER_ID",
    "details": {
        "shipmentId": "SHIPMENT_ID",
        "packages": [
            {
                "id": "PACKAGE_ID",
                "dimensions": {
                    "length": { "value": 20, "dimensionUnit": "CM" },
                    "width": { "value": 15, "dimensionUnit": "CM" },
                    "height": { "value": 10, "dimensionUnit": "CM" }
                },
                "weight": { "value": 500, "weightUnit": "G" },
                "packageLineItems": [
                    {
                        "packageLineItemId": "LINE_ITEM_ID",
                        "quantity": 1,
                        "countryOfOrigin": "CN",
                        "itemValue": { "value": 25, "currencyCode": "USD" }
                    }
                ]
            }
        ]
    }
}
```

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.

```json
{
    "type": "AMAZON_EXTERNAL_FULFILLMENT_SHIPMENTS_CONFIRM",
    "sellerOrVendorId": "SELLER_ID",
    "details": {
        "shipmentId": "SHIPMENT_ID",
        "acknowledgement": {
            "referenceId": "WAREHOUSE_REF",
            "lineItems": [{ "lineItem": { "id": "LINE_ITEM_ID", "quantity": 1 } }]
        }
    }
}
```

### Read shipping options

```json
{
    "type": "AMAZON_EXTERNAL_FULFILLMENT_SHIPPING_OPTIONS_FIND",
    "sellerOrVendorId": "SELLER_ID",
    "details": {
        "shipmentId": "SHIPMENT_ID",
        "packageId": "PACKAGE_ID"
    }
}
```

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`.

```json
{
    "type": "AMAZON_EXTERNAL_FULFILLMENT_INVOICES_GENERATE",
    "sellerOrVendorId": "SELLER_ID",
    "details": {
        "shipmentId": "SHIPMENT_ID",
        "fulfillmentProgram": "EASY_SHIP",
        "marketplaceId": "A21TJRUUN4KGV"
    }
}
```

A finished invoice Action stores the file and removes the raw content:

```json
{
    "status": "COMPLETED",
    "result": {
        "apiVersion": "2024-09-11",
        "operation": "generateInvoice",
        "observedAt": "2026-11-09T12:00:01.000Z",
        "httpStatus": 200,
        "amazonResponse": { "document": { "format": "PDF", "fileId": "FILE_ID" } },
        "documents": [
            {
                "fileId": "FILE_ID",
                "name": "external-fulfillment-ACTION_ID-1.pdf",
                "mediaType": "application/pdf",
                "downloadUrl": "https://files.example/invoice",
                "urlExpiresAt": "2026-11-09T12:05:00.000Z",
                "fileExpiresAt": "2026-11-16T12:00:00.000Z"
            }
        ],
        "warnings": []
    }
}
```

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

```json
{
    "type": "AMAZON_EXTERNAL_FULFILLMENT_SHIPPING_LABELS_GENERATE",
    "sellerOrVendorId": "SELLER_ID",
    "details": {
        "shipmentId": "SHIPMENT_ID",
        "operation": "GENERATE",
        "shippingOptionId": "SHIPPING_OPTION_ID",
        "packageIds": ["PACKAGE_ID"]
    }
}
```

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:

```json
{
    "status": "PARTIALLY_COMPLETED",
    "result": {
        "apiVersion": "2024-09-11",
        "operation": "generateShipLabels",
        "observedAt": "2026-11-09T12:00:01.000Z",
        "httpStatus": 200,
        "amazonResponse": {
            "packageShipLabelList": [
                {
                    "packageId": "PACKAGE_ID",
                    "status": "SUCCESS",
                    "fileData": { "fileId": "FILE_ID" }
                },
                {
                    "packageId": "OTHER_PACKAGE_ID",
                    "status": "FAILURE",
                    "errorDetails": { "code": "FAILED" }
                }
            ]
        },
        "documents": [
            {
                "fileId": "FILE_ID",
                "name": "external-fulfillment-ACTION_ID-1.png",
                "mediaType": "image/png",
                "downloadUrl": "https://files.example/label",
                "urlExpiresAt": "2026-11-09T12:05:00.000Z",
                "fileExpiresAt": "2026-11-16T12:00:00.000Z"
            }
        ],
        "packageLabels": [
            { "packageId": "PACKAGE_ID", "status": "SUCCESS" },
            { "packageId": "OTHER_PACKAGE_ID", "status": "FAILURE", "error": { "code": "FAILED" } }
        ],
        "warnings": []
    }
}
```

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.

```json
{
    "type": "AMAZON_EXTERNAL_FULFILLMENT_PACKAGES_STATUS_UPDATE",
    "sellerOrVendorId": "SELLER_ID",
    "details": {
        "shipmentId": "SHIPMENT_ID",
        "packageId": "PACKAGE_ID",
        "fulfillmentProgram": "SELLER_FLEX",
        "marketplaceId": "A1F83G8C2ARO7P"
    }
}
```

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.

```json
{
    "type": "AMAZON_EXTERNAL_FULFILLMENT_PACKAGES_STATUS_UPDATE",
    "sellerOrVendorId": "SELLER_ID",
    "details": {
        "shipmentId": "SHIPMENT_ID",
        "packageId": "PACKAGE_ID",
        "fulfillmentProgram": "SELF_SHIP",
        "marketplaceId": "ATVPDKIKX0DER",
        "deliveryStatus": {
            "status": "SHIPPED",
            "subStatus": "OUT_FOR_DELIVERY",
            "reason": "OutForDelivery"
        }
    }
}
```

## Where to find each Action

Open the [External Fulfillment section of the Actions explorer](/hub/actions#group-external-fulfillment). It lists the identifier, purpose, read or write access, program limits, role, PII, inputs and the result. The same list is in [Settings > Actions](https://app.datadoe.com/settings?tab=actions), the API specification and MCP.
