Public Carrier Protocol (PCP)
Introduction
The Public Carrier Protocol provides a way for any carrier to integrate with the delivery platform. As an integrator you will provide information shipment data to the platform. You will also receive information back to your systems when different events occur, i.e. a parcel has been delivered. Ingrid will provide you with the necessary credentials to connect to the platform. These are the steps involved in a typical delivery journey When the carrier receives a shipment booking, the carrier pre-advice the platform with shipment data. The parcel is arrival scanned at the store and the platform notifies the carrier that a parcel has been received and is ready to be picked up by consumer The carrier notifies the consumer that the parcel is ready to be picked up The consumer identifies themselves with a pre-authenticated QR code or an identity document. The platform requests validation from the carrier. If everything is ok, the parcel is handed out to the consumer. The platform notifies the carrier that the parcel has been delivered.
Sequence diagrams
Pre Advise
Ingestion
Delivery
1st mile (Send / Customer return)
Overdue returns
API
In-Store side endpoints
Upsert parcel 🔗
Pre-advise parcel or to update already stored parcel/ For Ingrid to work as efficiently as possible it is required by the carrier to keep the In-Store system up-to-date with current parcel information. This includes pre-advicing parcel, that is, provide information about parcels which has been booked for a certain location. It also includes updating parcels already at location, i.e. if a parcel should be recalled to the merchant ahead of time.
Carrier side endpoints
Query a parcel
Query parcel by a given code. This endpoint is used for gathering more information about a parcel given for example a tracking number, a receive code or a drop-off code.
Request
GET /api/v1/parcel/query?code=997123123&location_id=123 HTTP/1.1
Host: api.ingrid.com
Accept: application/json
Content-Type: application/json
Authorization: Bearer base64-encoded-api-token
Response
{
"parcel_id": "9971231233",
"tracking_id": "string",
"receive_code": "1234",
"product_code": "instr-dummyproduct",
"journey_stage": "JOURNEY_STAGE_LAST_MILE",
"sender": {
"name": "John Test",
"phone": "987654321",
"email": "john@test.com",
"address": {
"street": "437 Lytton",
"city": "Palo Alto",
"state": "CA",
"country": "US",
"zip": "94301"
}
},
"recipient": {
"name": "John Test",
"phone": "987654321",
"email": "john@test.com",
"address": {
"street": "437 Lytton",
"city": "Palo Alto",
"state": "CA",
"country": "US",
"zip": "94301"
}
},
"dimensions": {
"height": 1000,
"width": 500,
"length": 500
},
"weight": 2000,
"is_identity_confirmed": false,
"delivery_requirements": [
{
"type": "DELIVERY_REQUIREMENT_TYPE_CASH_ON_DELIVERY",
"data": {
"amount": 200,
"currency": "USD"
}
}
],
"blocker": {
"blocked": true,
"reasons": [
{
"language": "en-GB",
"text": "Canceled by merchant."
}
]
}
}
Ingest a parcel 🔗
Acknowledge that a parcel is ingested so is dropped off by a courier in a given location. It concerns B2C parcels. It means that the parcel is physically stored in one of the locations either in a locker or on a shelf and from now on the parcel can be picked up by a customer. This is the time to notify the recipient that the parcel is ready to be picked up.
Request
POST /api/v1/parcel/ingested HTTP/1.1
Host: api.ingrid.com
Accept: application/json
Content-Type: application/json
Authorization: Bearer base64-encoded-api-token
{
"parcel_id": "9971231233",
"location_id": "9b6b047bfc1f4d06a2f5a567e5144345",
"delivery_module": "MODULE_TYPE_RACK",
"relocated": false
}
Response
{
"receive_code": "1234"
}
Refuse a parcel 🔗
Acknowledge that a parcel is refused by a customer. It means that the customer refused to pick up the parcel. Reasons for refusing picking up a parcel includes for example damaged parcel and parcel not ordered
Request
POST /api/v1/parcel/refused HTTP/1.1
Host: api.ingrid.com
Accept: application/json
Content-Type: application/json
Authorization: Bearer base64-encoded-api-token
{
"parcel_id": "9971231233",
"deviation": {
"comment": "Customer reports that a parcel is damaged.",
"type": "DEVIATION_TYPE_GOODS_DAMAGED"
}
}
Response
{
"digital_receipt_sent": true,
"receipt": {
"url": "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf",
"content_type": "PDF"
}
}
Deliver a parcel 🔗
Acknowledge that a parcel is successfully delivered to a customer.
Request
POST /api/v1/parcel/delivered HTTP/1.1
Host: api.ingrid.com
Accept: application/json
Content-Type: application/json
Authorization: Bearer base64-encoded-api-token
{
"parcel_id": "9971231233",
"recipient_identity_document": {
"number": "123456789",
"type": "DOCUMENT_TYPE_SWEDISH_DRIVING_LICENSE"
},
"proxy_identity_document": {
"number": "123456789",
"type": "DOCUMENT_TYPE_SWEDISH_DRIVING_LICENSE"
},
"deviation": {
"comment": "Customer reports that a parcel is damaged.",
"type": "DEVIATION_TYPE_GOODS_DAMAGED"
}
}
Response
{
"digital_receipt_sent": true,
"receipt": {
"url": "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf",
"content_type": "PDF"
}
}
Return a parcel 🔗
Acknowledge that a parcel is returned. It means that the parcel previously ingested in a location is now returned. It's used for all return types except a customer return. Common case is an overdue return.
Request
Request
POST /api/v1/parcel/returned HTTP/1.1
Host: api.ingrid.com
Accept: application/json
Content-Type: application/json
Authorization: Bearer base64-encoded-api-token
{
"parcel_id": "9971231233"
}
Response
{
"label": {
"url": "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf",
"content_type": "PDF"
}
}
Accept a parcel 🔗
Acknowledge that a parcel is delivered to a given location by a customer and accepted by a staff member. It means that a parcel is physically in the location and waits to be picked-up by a driver. It applies only to customer parcels so C2B (customer returns) and C2C (send) parcels.
Request
POST /api/v1/parcel/accepted HTTP/1.1
Host: api.ingrid.com
Accept: application/json
Content-Type: application/json
Authorization: Bearer base64-encoded-api-token
{
"parcel_id": "9971231233",
"location_id": "9b6b047bfc1f4d06a2f5a567e5144345"
}
Response
{
"digital_receipt_sent": true,
"document": {
"url": "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf",
"content_type": "PDF"
}
}