Courier Manifest

The Courier Manifest API enables courier partners to submit manifest data for customs processing. Supports single uploads, chunked uploads for large files (25MB+), and complete pipeline monitoring with 4-stage processing.

All endpoints require authentication via Bearer token. For JSON webhook API, always use default as the courier slug.

Base Path: /api/v1/couriers

Courier codes

CodeUse ForDescription
defaultJSON APIStandard JSON webhook (recommended)
goluckyExcel onlyGoLucky Excel file conversion
bfeExcel onlyBFE Excel file conversion
360lionExcel only360Lion Excel file conversion

POST/v1/couriers/{courier}/manifests/webhook

Submit manifest

Submit a courier manifest for customs processing. Supports both single and chunked uploads.

Path parameters

  • Name
    courier
    Type
    string
    Description

    Courier code. Use default for JSON API.

Headers

  • Name
    Idempotency-Key
    Type
    string
    Description

    UUID to prevent duplicate processing.

  • Name
    X-Signature
    Type
    string
    Description

    HMAC SHA256 signature: sha256={hex_signature}.

Required attributes

  • Name
    mawbNumber
    Type
    string
    Description

    Master Air Waybill number. Max 50 characters.

  • Name
    items
    Type
    array
    Description

    Array of manifest items (min 1 item).

Optional attributes

  • Name
    manifestNumber
    Type
    string
    Description

    Manifest identifier. Defaults to mawbNumber.

  • Name
    airline
    Type
    string
    Description

    Airline code (e.g., "AA", "DHL").

  • Name
    flightNumber
    Type
    string
    Description

    Flight number.

  • Name
    originAirport
    Type
    string
    Description

    Origin airport IATA code.

Item attributes

  • Name
    trackingNumber
    Type
    string
    Description

    Package tracking number.

  • Name
    originCountry
    Type
    string
    Description

    2-letter ISO country code.

  • Name
    consigneeName
    Type
    string
    Description

    Recipient full name.

  • Name
    consigneeIdNumber
    Type
    string
    Description

    Tax ID (CUIT/CUIL/DNI).

  • Name
    consigneeAddress
    Type
    string
    Description

    Street address.

  • Name
    itemName
    Type
    string
    Description

    Product name/title.

  • Name
    hsCode
    Type
    string
    Description

    HS/NCM code.

  • Name
    fobValueUsd
    Type
    number
    Description

    FOB value in USD.

  • Name
    totalWeightKg
    Type
    number
    Description

    Weight in kilograms.

Request

POST
/v1/couriers/default/manifests/webhook
curl -X POST https://app.price2b.com/api/v1/couriers/default/manifests/webhook \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "mawbNumber": "071-57898304",
    "manifestNumber": "071-57898304",
    "airline": "AA",
    "flightNumber": "AA1234",
    "originAirport": "MIA",
    "items": [
      {
        "trackingNumber": "071-57898304-001",
        "originCountry": "CN",
        "consigneeName": "Juan Pérez",
        "consigneeIdNumber": "20-12345678-9",
        "consigneeAddress": "Av. Corrientes 1234",
        "itemName": "Wireless Headphones",
        "hsCode": "8518.30.00",
        "fobValueUsd": 49.99,
        "totalWeightKg": 0.5
      }
    ]
  }'

Response (202 Accepted)

{
  "success": true,
  "status": "queued",
  "message": "Manifest queued for processing",
  "idempotency_key": "7b2a58e4-8c1c-46d9-9f28-b5f1b1c4a7aa",
  "tracking": {
    "mawb_number": "071-57898304",
    "items_count": 1,
    "timestamp": "2026-01-14T12:00:00Z"
  }
}

GET/v1/couriers/{courier}/webhook/{idempotencyKey}/status

Get webhook status

Check the processing status of a webhook request using its idempotency key.

Path parameters

  • Name
    courier
    Type
    string
    Description

    Courier code.

  • Name
    idempotencyKey
    Type
    string
    Description

    The idempotency key from webhook submission.

Request

GET
/v1/couriers/default/webhook/{key}/status
curl https://app.price2b.com/api/v1/couriers/default/webhook/7b2a58e4-8c1c-46d9-9f28-b5f1b1c4a7aa/status \
  -H "Authorization: Bearer {token}"

Response

{
  "success": true,
  "status": "queued",
  "idempotency_key": "7b2a58e4-8c1c-46d9-9f28-b5f1b1c4a7aa",
  "created_at": "2026-01-24T10:30:00",
  "updated_at": "2026-01-24T10:30:05"
}

GET/v1/couriers/manifests

List manifests

Get a paginated list of all manifests for the authenticated user with processing progress.

Query parameters

  • Name
    per_page
    Type
    integer
    Description

    Items per page (default: 15).

  • Name
    status
    Type
    string
    Description

    Filter by status: pending, processing, completed.

  • Name
    date_from
    Type
    date
    Description

    Filter by date from (Y-m-d).

  • Name
    date_to
    Type
    date
    Description

    Filter by date to (Y-m-d).

Request

GET
/v1/couriers/manifests
curl -G https://app.price2b.com/api/v1/couriers/manifests \
  -H "Authorization: Bearer {token}" \
  -d per_page=20 \
  -d status=completed

Response

{
  "success": true,
  "data": [
    {
      "manifest_id": "071-57898304",
      "status": "completed",
      "progress": 100,
      "summary": {
        "total_awbs": 10,
        "total_articles": 25,
        "personal_items": 15,
        "commercial_items": 8,
        "prohibited_items": 2,
        "amount_to_pay": 1250.50,
        "currency": "USD"
      }
    }
  ],
  "meta": {
    "current_page": 1,
    "total": 95,
    "per_page": 20
  }
}

GET/v1/couriers/manifests/{manifest}/pipeline-status

Get pipeline status

Get detailed 4-stage pipeline processing status for a manifest.

Pipeline stages

StageWeightDescription
Classification25%Regime determination (Personal/Commercial/Prohibited)
Web Services25%CUIT validation, quota checks
OpenAI (NCM)25%AI-powered NCM code classification
Calculations25%Customs duties and taxes calculation

Request

GET
/v1/couriers/manifests/{manifest}/pipeline-status
curl https://app.price2b.com/api/v1/couriers/manifests/071-57898304/pipeline-status \
  -H "Authorization: Bearer {token}"

Response

{
  "success": true,
  "data": {
    "manifest_id": "071-57898304",
    "status": "processing",
    "overall_progress": 75,
    "pipeline_steps": {
      "classification": {
        "status": "completed",
        "progress": 100
      },
      "webservices": {
        "status": "completed",
        "progress": 100
      },
      "openai": {
        "status": "completed",
        "progress": 100
      },
      "calculations": {
        "status": "processing",
        "progress": 50
      }
    },
    "summary": {
      "total_products": 25,
      "regime_breakdown": {
        "personal": 15,
        "commercial": 8,
        "prohibited": 2
      },
      "amount_to_pay": 625.25
    }
  }
}

GET/v1/couriers/manifests/{manifest}/download

Download results

Download processed manifest results. Only available when processing is 100% complete.

Query parameters

  • Name
    format
    Type
    string
    Description

    Output format: json (default), csv, excel, xlsx.

Request

GET
/v1/couriers/manifests/{manifest}/download
curl https://app.price2b.com/api/v1/couriers/manifests/071-57898304/download \
  -H "Authorization: Bearer {token}" \
  -o results.json

Response (JSON)

{
  "success": true,
  "data": {
    "manifest": "071-57898304",
    "total_products": 25,
    "products": [
      {
        "awb_number": "AWB-001",
        "tracking_number": "071-57898304-001",
        "ncm_code": "8518.30.00",
        "regime": "P",
        "cif_value": 59.99,
        "ddp_value": 79.99,
        "customs_duty": 12.00,
        "customs_channel": "V"
      }
    ]
  }
}

POST/v1/couriers/manifests/batch-status

Batch status check

Check the processing status of multiple manifests in a single request (max 50).

Required attributes

  • Name
    manifests
    Type
    array
    Description

    Array of manifest IDs to check (1-50 items).

Request

POST
/v1/couriers/manifests/batch-status
curl -X POST https://app.price2b.com/api/v1/couriers/manifests/batch-status \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "manifests": ["071-57898304", "071-57898305", "071-57898306"]
  }'

Response

{
  "success": true,
  "data": [
    {
      "manifest_id": "071-57898304",
      "status": "completed",
      "progress": 100,
      "can_download": true
    },
    {
      "manifest_id": "071-57898305",
      "status": "processing",
      "progress": 75,
      "can_download": false
    }
  ]
}

POST/v1/couriers/{courier}/manifests/webhook

Chunked upload - Submit

Submit a manifest chunk for large files (25MB+). Include _chunk_metadata to enable chunked upload mode.

Chunk metadata

  • Name
    chunk_number
    Type
    integer
    Description

    Current chunk number (1-indexed).

  • Name
    total_chunks
    Type
    integer
    Description

    Total number of chunks (max: 50).

  • Name
    base_idempotency_key
    Type
    string
    Description

    UUID to group chunks from same manifest.

  • Name
    total_items
    Type
    integer
    Description

    Total items across all chunks.

Request

POST
/v1/couriers/default/manifests/webhook
curl -X POST https://app.price2b.com/api/v1/couriers/default/manifests/webhook \
  -H "Authorization: Bearer {token}" \
  -H "Idempotency-Key: 550e8400-chunk-1-of-25" \
  -d '{
    "mawbNumber": "071-57898304",
    "items": [...],
    "_chunk_metadata": {
      "chunk_number": 1,
      "total_chunks": 25,
      "total_items": 2500,
      "base_idempotency_key": "550e8400-e29b-41d4-a716-446655440000"
    }
  }'

Response

{
  "success": true,
  "status": "receiving",
  "message": "Chunk received successfully",
  "chunk_number": 1,
  "total_chunks": 25,
  "progress": {
    "received_chunks": 1,
    "missing_chunks": [2, 3, 4, 5],
    "percentage": 4,
    "is_complete": false
  }
}

GET/v1/couriers/manifests/chunks/{baseIdempotencyKey}/status

Chunked upload - Status

Check the status of a chunked upload, including received and missing chunks.

Request

GET
/v1/couriers/manifests/chunks/{key}/status
curl https://app.price2b.com/api/v1/couriers/manifests/chunks/550e8400-e29b-41d4-a716-446655440000/status \
  -H "Authorization: Bearer {token}"

Response

{
  "success": true,
  "data": {
    "manifest_number": "071-57898304",
    "status": "receiving",
    "progress": {
      "total_chunks": 25,
      "received_chunks": 20,
      "missing_chunks": [3, 15, 18, 22, 24],
      "percentage": 80
    }
  }
}

POST/v1/couriers/manifests/chunks/{baseIdempotencyKey}/retry-missing

Chunked upload - Retry

Get a list of missing chunks to retry.

Request

POST
/v1/couriers/manifests/chunks/{key}/retry-missing
curl -X POST https://app.price2b.com/api/v1/couriers/manifests/chunks/550e8400-e29b-41d4-a716-446655440000/retry-missing \
  -H "Authorization: Bearer {token}"

Response

{
  "success": true,
  "message": "Please resend the following chunks",
  "data": {
    "manifest_number": "071-57898304",
    "missing_chunks": [3, 15, 18, 22, 24],
    "missing_count": 5
  }
}

Alternative Manifest API

An alternative REST API for manifest management, suitable for simpler integrations.

Base Path: /api/v1/manifests


GET/v1/manifests

List manifests (alt)

Get a paginated list of manifests using the alternative API.

Request

GET
/v1/manifests
curl -G https://app.price2b.com/api/v1/manifests \
  -H "Authorization: Bearer {token}" \
  -d per_page=20

Response

{
  "success": true,
  "data": [
    {
      "manifest_id": "MAN-20260124-001",
      "total_products": 25,
      "processing_status": "completed"
    }
  ],
  "meta": {
    "current_page": 1,
    "total": 45
  }
}

POST/v1/manifests

Upload manifest (alt)

Upload a manifest with up to 1000 products.

Product attributes

  • Name
    awb_number
    Type
    string
    Description

    Air Waybill number.

  • Name
    consignee
    Type
    string
    Description

    Consignee full name.

  • Name
    tax_id
    Type
    string
    Description

    Tax ID (CUIT).

  • Name
    product_description
    Type
    string
    Description

    Product description.

  • Name
    quantity
    Type
    integer
    Description

    Quantity.

  • Name
    unit_value
    Type
    number
    Description

    Unit value in currency.

  • Name
    country_of_manufacture
    Type
    string
    Description

    2-letter ISO country code.

Request

POST
/v1/manifests
curl -X POST https://app.price2b.com/api/v1/manifests \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "manifest": "MAN-20260124-001",
    "products": [
      {
        "awb_number": "AWB123456",
        "consignee": "Juan Pérez",
        "tax_id": "20-12345678-9",
        "product_description": "Wireless Headphones",
        "quantity": 2,
        "unit_value": 49.99,
        "country_of_manufacture": "CN"
      }
    ]
  }'

Response (201)

{
  "success": true,
  "message": "Manifest uploaded successfully",
  "data": {
    "manifest_id": "MAN-20260124-001",
    "total_products": 1,
    "processing_status": "pending"
  }
}

GET/v1/manifests/{manifest}

Get manifest details (alt)

Get complete manifest details including all products with NCM codes and customs calculations.

Request

GET
/v1/manifests/MAN-20260124-001
curl https://app.price2b.com/api/v1/manifests/MAN-20260124-001 \
  -H "Authorization: Bearer {token}"

Response

{
  "success": true,
  "data": {
    "manifest": "MAN-20260124-001",
    "products": [
      {
        "awb_number": "AWB123456",
        "ncm_code": "8518.30.00",
        "cif_value": 105.48,
        "ddp_value": 186.12,
        "customs_duty": 35.50,
        "quota": {
          "tax_id": "20-12345678-9",
          "quota": 3
        }
      }
    ]
  }
}

Tax ID / CUIT Quota API

Check and manage tax ID (CUIT) quota for customs imports.


POST/v1/couriers/quota/check

Check CUIT quota

Check the current quota status for a tax ID (CUIT). Returns remaining purchases allowed (0-5).

Required attributes

  • Name
    tax_id
    Type
    string
    Description

    Tax ID (CUIT). Accepts: 20-12345678-9 or 20123456789.

Optional attributes

  • Name
    awb_number
    Type
    string
    Description

    AWB number to check specific record quota.

Request

POST
/v1/couriers/quota/check
curl -X POST https://app.price2b.com/api/v1/couriers/quota/check \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{"tax_id": "20-12345678-9"}'

Response

{
  "success": true,
  "data": {
    "tax_id": "20123456789",
    "tax_id_formatted": "20-12345678-9",
    "current_quota": {
      "quota": 3,
      "status": 200,
      "domicilio": "S"
    },
    "historical_records_count": 2
  }
}

PUT/v1/couriers/client-info

Update client info

Update the tax ID (CUIT) for a consignee record.

Required attributes

  • Name
    awb_number
    Type
    string
    Description

    AWB number to update.

  • Name
    tax_id
    Type
    string
    Description

    New tax ID (CUIT).

Request

PUT
/v1/couriers/client-info
curl -X PUT https://app.price2b.com/api/v1/couriers/client-info \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{"awb_number": "AWB123456", "tax_id": "20-98765432-1"}'

Response

{
  "success": true,
  "message": "Client info updated successfully",
  "data": {
    "awb_number": "AWB123456",
    "tax_id_formatted": "20-98765432-1"
  }
}

POST/v1/couriers/client-info/can-edit

Check editability

Check if a record's tax ID can be modified.

Request

POST
/v1/couriers/client-info/can-edit
curl -X POST https://app.price2b.com/api/v1/couriers/client-info/can-edit \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{"awb_number": "AWB123456"}'

Response

{
  "success": true,
  "data": {
    "awb_number": "AWB123456",
    "can_edit": true,
    "current_tax_id": "20-12345678-9",
    "status": "pending"
  }
}

S3 Storage API

Direct file upload to S3 for large manifest files (up to 40MB).


POST/v1/manifests/storage/upload

Upload to S3

Upload manifest files (JSON or Excel) directly to S3 storage.

Required attributes

  • Name
    file
    Type
    file
    Description

    Manifest file. Max 40MB. Allowed: json, xlsx, xls, xlsm.

  • Name
    courier_code
    Type
    string
    Description

    Carrier code: OCA, DHL, FEDEX, UPS, etc.

Optional attributes

  • Name
    manifest_name
    Type
    string
    Description

    Custom name for the manifest.

  • Name
    description
    Type
    string
    Description

    Description or notes.

Request

POST
/v1/manifests/storage/upload
curl -X POST https://app.price2b.com/api/v1/manifests/storage/upload \
  -H "Authorization: Bearer {token}" \
  -F "file=@daily-manifest.xlsx" \
  -F "courier_code=DHL" \
  -F "manifest_name=Daily-Shipments-2026-01-24"

Response (201)

{
  "success": true,
  "message": "Manifest uploaded successfully",
  "data": {
    "file_name": "DHL_daily-shipments_2026-01-24.xlsx",
    "file_url": "https://storage.price2b.com/manifests/DHL/...",
    "file_size": {
      "bytes": 2458624,
      "human": "2.34 MB"
    },
    "courier_code": "DHL"
  }
}

GET/v1/manifests/storage/list

List S3 manifests

List all manifest files uploaded to S3 storage.

Query parameters

  • Name
    courier_code
    Type
    string
    Description

    Filter by carrier code.

  • Name
    per_page
    Type
    integer
    Description

    Items per page (default: 15).

Request

GET
/v1/manifests/storage/list
curl -G https://app.price2b.com/api/v1/manifests/storage/list \
  -H "Authorization: Bearer {token}" \
  -d courier_code=DHL

Response

{
  "success": true,
  "data": [
    {
      "file_name": "DHL_daily-shipments_2026-01-24.xlsx",
      "file_url": "https://storage.price2b.com/...",
      "file_size": {
        "bytes": 2458624,
        "human": "2.34 MB"
      },
      "courier_code": "DHL",
      "uploaded_at": "2026-01-24T15:45:30+00:00"
    }
  ]
}

Status values

StatusProgressDescription
pending0%Uploaded, not started
processing1-99%Pipeline running
completed100%All processing complete

Customs channels

CodeNameDescription
VVerdeGreen - automatic clearance
AAzulBlue - document review
RORojoRed - physical inspection

Rate limits

EndpointLimit
Webhook submissions60/min
Status checks120/min
Downloads30/min

Was this page helpful?