Pickups
Schedule carrier pickups (recolecciones), check their status, and cancel them when needed.
A pickup (recolección) asks the carrier to collect your packages at an address, on a date, within a time window. Schedule, check, and cancel pickups with any carrier through the same API.
The lifecycle
PENDING → CONFIRMED → IN_PROGRESS → COMPLETED
↘ CANCELLED
↘ FAILED
Endpoints
| Method | Path | Description |
|---|---|---|
POST |
/v1/pickups |
Schedule a pickup |
GET |
/v1/pickups |
List pickups (filterable) |
GET |
/v1/pickups/carriers |
Carriers with pickup support |
GET |
/v1/pickups/:id |
Pickup detail |
PATCH |
/v1/pickups/:id/cancel |
Cancel a pickup |
POST |
/v1/pickups/:id/refresh-status |
Fetch the latest status from the carrier |
Schedule a pickup
Body parameters
carrierCodestring
A carrier with pickup support (GET /v1/pickups/carriers).
stringpickupDatestring
ISO date (YYYY-MM-DD), today or later.
stringreadyTimestring
HH:mm time from which the packages are ready.
stringclosingTimestring
HH:mm closing time. It must be later than readyTime.
stringpackageCountnumber
Number of packages (1–999).
numbertotalWeightnumber
Total weight in kg (minimum 0.1).
numbercontactNamestring
The person who will meet the courier.
stringcontactPhonestring
Contact phone number.
stringpickupAddressId?string
A saved address in your organization.
stringspecialInstructions?string
Instructions for the courier (up to 500 characters).
stringshipmentIds?string[]
1–50 shipments to associate with the pickup.
string[]curl -X POST https://api.sendit.mx/v1/pickups \
-H "X-API-Key: sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"carrierCode": "DHL",
"pickupAddressId": "clx_origin_address",
"pickupDate": "2026-07-20",
"readyTime": "09:00",
"closingTime": "18:00",
"packageCount": 5,
"totalWeight": 12.5,
"contactName": "Juan Pérez",
"contactPhone": "+525512345678",
"specialInstructions": "Ring the bell twice, ask for Juan.",
"shipmentIds": ["clxship001", "clxship002"]
}'
{
"success": true,
"data": {
"id": "clxpickup_xyz",
"carrierCode": "DHL",
"pickupDate": "2026-07-20",
"readyTime": "09:00",
"closingTime": "18:00",
"packageCount": 5,
"totalWeight": "12.5",
"status": "CONFIRMED",
"confirmationNumber": "DHL-A1B2C3D4",
"confirmedAt": "2026-07-17T10:30:00.000Z"
}
}
Keep the confirmationNumber. It is the reference the carrier recognizes if you need to sort something out by phone.
Check which carriers pick up
GET /v1/pickups/carriers
{
"success": true,
"data": [
{ "carrierCode": "DHL", "carrierName": "DHL Express", "supportsPickups": true },
{ "carrierCode": "ESTAFETA", "carrierName": "Estafeta", "supportsPickups": true },
{ "carrierCode": "FEDEX", "carrierName": "FedEx", "supportsPickups": true }
]
}
List and filter
GET /v1/pickups?carrierCode=DHL&status=CONFIRMED&dateFrom=2026-07-01&dateTo=2026-07-31
| Filter | Description |
|---|---|
carrierCode |
By carrier |
status |
By lifecycle status |
dateFrom / dateTo |
Pickup-date range (ISO) |
Pagination follows the page model described in Pagination & filtering.
Cancel a pickup
curl -X PATCH https://api.sendit.mx/v1/pickups/clxpickup_xyz/cancel \
-H "X-API-Key: sk_live_..." \
-H "Content-Type: application/json" \
-d '{ "reason": "Packages will not be ready in time" }'
Pickups already CANCELLED or COMPLETED can’t be cancelled again (400).
Refresh the status
POST /v1/pickups/:id/refresh-status
Queries the carrier directly and updates the local record. Use it when you need a status fresher than the last sync.
Handle errors
| Code | When it happens | How to resolve it |
|---|---|---|
400 INVALID_INPUT |
The date, time window, address, or carrier is invalid | Correct the input and try again |
400 LIVE_MODE_REQUIRED |
You tried to manage a pickup in TEST mode | Switch to an sk_live_ key |
404 RESOURCE_NOT_FOUND |
The pickup does not exist or belongs to another organization | Check the id |