Quote
Get the premium for a shipment from its declared value, without creating cover.
Online cover purchase opens soonOnline cover purchase opens soon. Price calculation and eligibility checks are already available. Learn more
Quote, check eligibility, purchase cover and follow a claim from your own system. REST, JSON, one key, nothing else to install.
Get the premium for a shipment from its declared value, without creating cover.
The same call tells you whether the chosen contents and carrier can be insured. The check happens before payment, not after.
Create cover and retrieve the certificate and invoice.
Open a claim, upload documents and follow its progress until payment.
One test key and one production key.
One call returns the premium, deductible and eligibility verdict.
A second call creates the cover and returns the certificate.
curl https://api.packcover.com/v1/quotes \
--request POST \
--header "Authorization: Bearer pk_test_VOTRE_CLE" \
--header "Content-Type: application/json" \
--header "Idempotency-Key: quote-demo-001" \
--data '{
"transporteur": "UPS",
"valeur_declaree": 500.00,
"devise": "EUR",
"contenu": "Camera",
"date_expedition": "2026-10-05",
"pays_destination": "FR",
"mode_de_livraison": "home"
}'All requests use HTTPS, with TLS 1.2 as a minimum. Unencrypted calls are rejected.
Use the Bearer scheme with your secret key in the Authorization header.
The pk_test_ prefix identifies the test environment and pk_live_ identifies production. A test key never creates real cover or triggers billing.
Add this header to every POST request so retrying after a timeout does not create two covers.
Base URL: https://api.packcover.com/v1
| Method | Path | Description |
|---|---|---|
POST | /quotes | Quote and eligibility check |
POST | /policies | Create cover |
GET | /policies/{id} | Retrieve cover |
POST | /policies/{id}/cancel | Cancel before carrier handover |
POST | /claims | Open a claim |
POST | /claims/{id}/documents | Upload supporting evidence |
GET | /claims/{id} | Track a claim |
{
"transporteur": "UPS",
"valeur_declaree": 500.00,
"devise": "EUR",
"contenu": "Camera",
"date_expedition": "2026-10-05",
"pays_destination": "FR",
"mode_de_livraison": "home"
}{
"id_cotation": "quote_01J8N7K4D6",
"eligibilite": {
"verdict": "covered",
"motif": null
},
"prime": 4.50,
"franchise": 50.00,
"devise": "EUR",
"plafond": 100000.00
}{
"id_cotation": "quote_01J8N7K4D6",
"expediteur": {
"nom": "Camille Martin",
"email": "camille@example.com"
},
"destinataire": {
"nom": "Alex Bernard",
"pays": "FR"
},
"reference_transporteur": "1Z999AA10123456784"
}{
"id_police": "policy_01J8N8Q2M4",
"statut": "issued",
"url_attestation": "https://api.packcover.com/v1/policies/policy_01J8N8Q2M4/certificate",
"url_facture": "https://api.packcover.com/v1/policies/policy_01J8N8Q2M4/invoice",
"date_debut_couverture": "2026-10-05T09:30:00Z"
}You provide a receiving URL. Every notification is signed. The PackCover-Signature header contains an HMAC SHA-256 signature and a timestamp to verify before processing.
If delivery fails, the notification is retried for twenty-four hours at increasing intervals.
| Event | Description |
|---|---|
policy.issued | Cover is created and its documents are available. |
policy.cancelled | Cover is cancelled before carrier handover. |
claim.opened | A claim is opened. |
claim.document_required | Additional supporting evidence is requested. |
claim.submitted | The complete claim is submitted for processing. |
claim.settled | Compensation is paid. |
{
"event": "claim.settled",
"created_at": "2026-10-12T14:22:31Z",
"data": {
"claim_id": "claim_01J8P4M6R2",
"policy_id": "policy_01J8N8Q2M4",
"status": "settled",
"currency": "EUR",
"amount": 450.00
}
}Errors return a standard HTTP status and a JSON body with an error object containing code, message and, when relevant, field.
| Code | HTTP | Description |
|---|---|---|
invalid_request | 400 | The request is incomplete or a field is invalid. |
unauthorized | 401 | The key is missing, invalid or does not match the environment called. |
not_eligible | 422 | The shipment cannot be insured. The reason returned is the same as the one shown in our online flow, for example contents refused for carriage by the selected carrier. |
value_above_limit | 422 | The declared value exceeds the cover limit. |
shipment_already_dispatched | 422 | The parcel has already been handed to the carrier. |
rate_limited | 429 | The key's request limit has been exceeded. |
server_error | 500 | An internal error prevents the request from being processed. |
Keys beginning with pk_test_ give access to the same set of endpoints. Eligibility rules and pricing are identical to production. No real cover is issued and no invoice is generated.
The limit is 600 requests per minute per key. Above it, rate_limited is returned with a header indicating the delay before retrying.
Amounts are expressed in whole currency units with two decimal places, and the currency is always stated explicitly.
These connection methods require no development.
Tell us which tool you want to connect. This form prepares your request without displaying a key on screen.
No, three of the four connection methods need none.
See integrationsYes, test keys give access to every endpoint, without real cover or billing.
Yes, it is the same pricing table published on the Pricing page.
See pricingIt is retried for twenty-four hours, and the current state remains available through GET on the relevant resource.
Start with a simple, no-obligation estimate.