Info
TABLE OF CONTENTS
1. Overview
2. Customs fields in the Order request
3. Option 1 - Invoice sent with the order
4. Option 2 - Invoice uploaded after the order is created
5. Full request examples
6. Common errors

1. Overview

Shipments to countries outside the EU customs territory (e.g. GB, NO, CH) need a customs declaration. You send it as part of the normal Order request: invoice data, the list of articles, exporter/importer details and the invoice PDF.

The invoice PDF can reach the courier in two ways:

  • Option 1 - the PDF is sent in the order request (section 3).
  • Option 2 - the order is created without the PDF, and the PDF is uploaded afterwards (section 4).

In both options the customs data (invoice fields, articles, CustomsDeclaration) is sent in the order request.

2. Customs fields in the Order request

Customs data is placed in three parts of the Order request. Field types and limits are listed in the Order article.

ObjectFieldsNotes
ContentInvoiceNumber, InvoiceDate, InvoiceValue, InvoiceValueCurrencyMandatory for commercial shipments (Reason 10)
Content.Articles[]Quantity, Description, CountryOfOrigin, Tariff, WeightNet, WeightGross, PricePerPieceAmount, PricePerPieceAmountCurrencyOne entry per invoice line. Description max. 50 characters
Extra.CustomsDeclarationExporter, Importer, ExporterTaxId, ExporterEORI, ImporterTaxId, ImporterEORI, Reason, Incoterm, AttachmentsReason: 10 - commercial, 20 - non-commercial. Attachments: invoice PDF, base64 (Option 1 only)

3. Option 1 - Invoice sent with the order

  1. Encode the invoice PDF in base64.
  2. Send POST /api/Order with the customs fields from section 2 and the PDF in Extra.CustomsDeclaration.Attachments.
  3. Innoship sends the shipment, the customs data and the invoice to the courier and returns the AWB and the label.

Customs part of the request:

{
  ...
  "Content": {
    ...
    "InvoiceNumber": "INV-0001",
    "InvoiceDate": "2026-11-10T00:00:00Z",
    "InvoiceValue": 69,
    "InvoiceValueCurrency": "GBP",
    "Articles": [ { ... } ]
  },
  "Extra": {
    "CustomsDeclaration": {
      "Exporter": { ... },
      "Importer": { ... },
      ...
      "Reason": 10,
      "Incoterm": "DDP",
      "Attachments": [
        {
          "Name": "INV-0001.pdf",
          "Content": "<base64 PDF>"
        }
      ]
    }
  }
}

Full request: 5.1 Option 1.

4. Option 2 - Invoice uploaded after the order is created

Uploading documents after order creation is available only for specific couriers. Contact Innoship support to confirm your courier supports it.

  1. Send POST /api/Order with the customs fields from section 2, without the invoice in Attachments.
  2. From the response, keep courier and courierShipmentId.
  3. Send the invoice with POST /api/Order/UploadDocuments, using these two values as CourierId and CourierShipmentId, and DocumentType 1 (Commercial Invoice).

INFO: Upload the invoice before the parcel is handed over to the courier. Otherwise the shipment can be held in customs.

Upload request:

{
  "CourierId": <courier from the order response>,
  "CourierShipmentId": "<courierShipmentId from the order response>",
  "Attachments": [
    {
      "Name": "INV-0001.pdf",
      "DocumentType": 1,
      "Content": "<base64 PDF>"
    }
  ]
}

Response (HTTP 200):

{
  "success": true,
  "message": "Your document was processed successfully."
}

Other document types (certificate of origin, packing list etc.) are listed in Upload documents.

Full requests: 5.2 Option 2.

5. Full request examples

All names, addresses, tax IDs and AWB numbers below are placeholders.

5.1 Option 1

POST /api/Order

{
  "ServiceId": 1,
  "ShipmentDate": "2026-11-10T10:00:00+01:00",
  "AddressTo": {
    "Name": "Recipient Name",
    "ContactPerson": "Recipient Name",
    "Country": "GB",
    "LocalityName": "London",
    "AddressText": "Example Street 1",
    "PostalCode": "EC1A 1BB",
    "Phone": "+440000000000",
    "Email": "recipient@example.com"
  },
  "Payment": 1,
  "Content": {
    "EnvelopeCount": 0,
    "ParcelsCount": 1,
    "PalettesCount": 0,
    "TotalWeight": 15.3,
    "Contents": "Cookware",
    "OversizedPackage": false,
    "Parcels": [
      {
        "SequenceNo": 1,
        "Size": { "Width": 35, "Height": 28, "Length": 37 },
        "Weight": 15.3,
        "Type": 2,
        "Reference1": "ORDER-0001"
      }
    ],
    "InvoiceNumber": "INV-0001",
    "InvoiceDate": "2026-11-10T00:00:00Z",
    "InvoiceValue": 69,
    "InvoiceValueCurrency": "GBP",
    "Articles": [
      {
        "Quantity": 1,
        "Description": "Cast iron pot",
        "CountryOfOrigin": "CN",
        "Tariff": "7323920000",
        "WeightNet": 14,
        "WeightGross": 15.3,
        "PricePerPieceAmount": 69,
        "PricePerPieceAmountCurrency": "GBP"
      }
    ]
  },
  "Extra": {
    "CustomsDeclaration": {
      "Exporter": {
        "Name": "Exporter Company",
        "ContactPerson": "Exporter Contact",
        "Country": "PL",
        "LocalityName": "Warszawa",
        "AddressText": "Example Street 2",
        "PostalCode": "00-001",
        "Phone": "+480000000000",
        "Email": "exporter@example.com"
      },
      "Importer": {
        "Name": "Importer Company",
        "ContactPerson": "Importer Contact",
        "Country": "GB",
        "LocalityName": "London",
        "AddressText": "Example Street 3",
        "PostalCode": "EC1A 1BB",
        "Phone": "+440000000000",
        "Email": "importer@example.com"
      },
      "ExporterTaxId": "PL0000000000",
      "ExporterEORI": "PL000000000000000",
      "ImporterTaxId": "GB000000000",
      "ImporterEORI": "GB000000000000",
      "Reason": 10,
      "Incoterm": "DDP",
      "Attachments": [
        {
          "Name": "INV-0001.pdf",
          "Content": "<base64 PDF>"
        }
      ]
    }
  },
  "Parameters": {
    "GetParcelsBarcodes": true
  },
  "ExternalClientLocation": "<your location id>"
}

Response - relevant fields (full response: Order):

{
  ...
  "courier": <courier id>,
  "courierShipmentId": "XXXXXXXXXX",
  "trackingNumber": "XXXXXXXXXX",
  ...
}

5.2 Option 2

Step 1 - POST /api/Order. Same as 5.1, without Attachments:

{
  "ServiceId": 1,
  "ShipmentDate": "2026-11-10T10:00:00+01:00",
  "AddressTo": { ... same as 5.1 ... },
  "Payment": 1,
  "Content": { ... same as 5.1 ... },
  "Extra": {
    "CustomsDeclaration": {
      "Exporter": { ... same as 5.1 ... },
      "Importer": { ... same as 5.1 ... },
      "ExporterTaxId": "PL0000000000",
      "ExporterEORI": "PL000000000000000",
      "ImporterTaxId": "GB000000000",
      "ImporterEORI": "GB000000000000",
      "Reason": 10,
      "Incoterm": "DDP"
    }
  },
  "Parameters": {
    "GetParcelsBarcodes": true
  },
  "ExternalClientLocation": "<your location id>"
}

Step 2 - POST /api/Order/UploadDocuments with the invoice:

{
  "CourierId": <courier from the order response>,
  "CourierShipmentId": "XXXXXXXXXX",
  "Attachments": [
    {
      "Name": "INV-0001.pdf",
      "DocumentType": 1,
      "Content": "<base64 PDF>"
    }
  ]
}

6. Common errors

  • InvoiceValue does not match the sum of Quantity × PricePerPieceAmount, or the currencies differ.
  • Currency is not an ISO code (e.g. UKL instead of GBP).
  • TotalWeight or parcel Weight is 0, or WeightNet is greater than WeightGross.
  • Article Description is longer than 50 characters.
  • Placeholder values sent in ID fields (e.g. "eori"). If you don't have the number, leave the field out.
  • Base64 content includes the data:application/pdf;base64, prefix. Send only the base64 string.

Related articles: Order | Upload documents | Couriers table