Skip to content

Online cover purchase opens soon Learn more

APIPackCover

Quote, check eligibility, purchase cover and follow a claim from your own system. REST, JSON, one key, nothing else to install.

What you can do

Quote

Get the premium for a shipment from its declared value, without creating cover.

Check eligibility

The same call tells you whether the chosen contents and carrier can be insured. The check happens before payment, not after.

Purchase cover

Create cover and retrieve the certificate and invoice.

Claim and track

Open a claim, upload documents and follow its progress until payment.

Get started in three steps

  1. 1

    Get your keys

    One test key and one production key.

  2. 2

    Quote a shipment

    One call returns the premium, deductible and eligibility verdict.

  3. 3

    Purchase cover

    A second call creates the cover and returns the certificate.

cURL quote call
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"
  }'

Authentication

All requests use HTTPS, with TLS 1.2 as a minimum. Unencrypted calls are rejected.

Authorization

Use the Bearer scheme with your secret key in the Authorization header.

Test and production keys

The pk_test_ prefix identifies the test environment and pk_live_ identifies production. A test key never creates real cover or triggers billing.

Idempotency-Key

Add this header to every POST request so retrying after a timeout does not create two covers.

Reference

Base URL: https://api.packcover.com/v1

MethodPathDescription
POST/quotesQuote and eligibility check
POST/policiesCreate cover
GET/policies/{id}Retrieve cover
POST/policies/{id}/cancelCancel before carrier handover
POST/claimsOpen a claim
POST/claims/{id}/documentsUpload supporting evidence
GET/claims/{id}Track a claim

POST /quotes

Request
{
  "transporteur": "UPS",
  "valeur_declaree": 500.00,
  "devise": "EUR",
  "contenu": "Camera",
  "date_expedition": "2026-10-05",
  "pays_destination": "FR",
  "mode_de_livraison": "home"
}
Response
{
  "id_cotation": "quote_01J8N7K4D6",
  "eligibilite": {
    "verdict": "covered",
    "motif": null
  },
  "prime": 4.50,
  "franchise": 50.00,
  "devise": "EUR",
  "plafond": 100000.00
}

POST /policies

Request
{
  "id_cotation": "quote_01J8N7K4D6",
  "expediteur": {
    "nom": "Camille Martin",
    "email": "camille@example.com"
  },
  "destinataire": {
    "nom": "Alex Bernard",
    "pays": "FR"
  },
  "reference_transporteur": "1Z999AA10123456784"
}
Response
{
  "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"
}

Webhooks

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.

EventDescription
policy.issuedCover is created and its documents are available.
policy.cancelledCover is cancelled before carrier handover.
claim.openedA claim is opened.
claim.document_requiredAdditional supporting evidence is requested.
claim.submittedThe complete claim is submitted for processing.
claim.settledCompensation is paid.
claim.settled notification
{
  "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

Errors return a standard HTTP status and a JSON body with an error object containing code, message and, when relevant, field.

CodeHTTPDescription
invalid_request400The request is incomplete or a field is invalid.
unauthorized401The key is missing, invalid or does not match the environment called.
not_eligible422The 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_limit422The declared value exceeds the cover limit.
shipment_already_dispatched422The parcel has already been handed to the carrier.
rate_limited429The key's request limit has been exceeded.
server_error500An internal error prevents the request from being processed.

Test environment and limits

01

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.

02

The limit is 600 requests per minute per key. Above it, rate_limited is returned with a header indicating the delay before retrying.

03

Amounts are expressed in whole currency units with two decimal places, and the currency is always stated explicitly.

No developer at hand?

These connection methods require no development.

  • Declare from the client area
  • Import a shipment file
  • Paste a webhook into the shop settings
See integrations

Get my API keys

Tell us which tool you want to connect. This form prepares your request without displaying a key on screen.

API frequently asked questions

Give every shipment the attention it deserves.

Start with a simple, no-obligation estimate.

Get notified when we open