Skip to content

Software

The seal is software.

The machine looks. The software signs, keeps and answers for what it saw. Through an API, webhooks, and speaking directly with your AI agents.

KYP Seal

Sign. Seal. Keep.

Every capture becomes a record: size, weight, images and label reading, bound together by a cryptographic fingerprint.

The fingerprint is sealed with a time certified by a qualified provider and stored in a ledger that only grows. If anything changes, it shows. We cannot touch it either.

Fingerprint
SHA-256 of the full record
Time
Qualified timestamp (eIDAS)
Custody
Append-only ledger, EU copy
Output
PDF with QR + signed JSON

KYP Verify

Anyone can check it.

Every record carries a public link and QR code. Whoever opens it sees what you see: what was measured, when, with which device, and whether the fingerprint is still intact.

No account. No cost. No need to ask us. That is the difference between a capture and a proof.

Native AI

It speaks to AI. Natively.

Know Your Parcel does not just have an API. It has an MCP server and described tools so any compatible AI assistant or agent can search, verify and compare records, and build a claim file, without anyone writing a line of integration.

And something more important: an AI can make up an answer, but not a Know Your Parcel proof. Either the fingerprint matches or it does not. Your agents cite sealed facts, with a link, instead of guessing.

Tools for agents

  • kyp_find_recordsFinds records by order, tracking, customer or date.
  • kyp_get_recordReturns the record: size, weight, images, label and seal.
  • kyp_verifyChecks that a record or a file is still intact.
  • kyp_compareSets two records side by side, such as outbound and return.
  • kyp_check_declarationCross-checks what was declared against what was measured.
  • kyp_build_dossierBuilds a claim file ready to send.
Operator

The customer says order ORD-88213 arrived broken. How did it leave?

Know Your Parcel

kyp_find_records · reference: "ORD-88213" → 1 outbound record

Know Your Parcel

kyp_verify · KYP-2026-000123 → intact

Assistant

It left on 7 October at 09:41 UTC: 32.0 × 24.5 × 18.0 cm and 2.340 kg, with no visible packaging damage in either image. The record is intact. Shall I prepare the file for the carrier?

Operator

Yes, in Spanish.

Know Your Parcel

kyp_build_dossier · claim: damage, lang: es → ready

Assistant

Claim file ready, with a public verification link. Attaching it to the claim.

Connect it in a minute

  • MCP server with key authentication and per-tool permissions
  • OpenAPI 3.1 schemas ready for function calling
  • Machine-readable documentation (llms.txt)
  • Records as signed JSON with content credentials
{
  "mcpServers": {
    "kyp": {
      "url": "https://mcp.knowyourparcel.com",
      "headers": { "Authorization": "Bearer kyp_sk_…" }
    }
  }
}

API

Everything is a call.

REST, JSON and webhooks. One key per environment, per-resource permissions and a log of every request. Open an endpoint to see the shape of the response.

Records

POST/v1/recordsCreates and seals a record from a capture.
{
  "device": "pns-0007",
  "reference": "ORD-88213",
  "capture": "cap_9f1a…",
  "declared": {
    "weight_kg": 2.3,
    "contents": "Laptop"
  }
}
{
  "id": "KYP-2026-000123",
  "status": "sealed",
  "sealed_at": "2026-10-07T09:41:18Z",
  "sha256": "…a91f",
  "verify_url": "https://verify.knowyourparcel.com/KYP-2026-000123"
}
GET/v1/records/{id}Returns the full record: signed JSON, PDF and images.
{
  "id": "KYP-2026-000123",
  "reference": "ORD-88213",
  "measured": {
    "l_cm": 32,
    "w_cm": 24.5,
    "h_cm": 18,
    "weight_kg": 2.34
  },
  "images": [
    "top",
    "perspective"
  ],
  "label": {
    "carrier": "UPS",
    "tracking": "1Z…"
  },
  "device": {
    "id": "pns-0007",
    "integrity": "ok"
  },
  "seal": {
    "timestamp": "qualified",
    "sha256": "…a91f"
  },
  "files": {
    "pdf": "…/KYP-2026-000123.pdf",
    "json": "…/KYP-2026-000123.json"
  }
}
GET/v1/records?reference=ORD-88213Searches by order, tracking, customer, station or date.
{
  "data": [
    {
      "id": "KYP-2026-000123",
      "reference": "ORD-88213",
      "sealed_at": "2026-10-07T09:41:18Z",
      "kind": "outbound"
    },
    {
      "id": "KYP-2026-000481",
      "reference": "ORD-88213",
      "sealed_at": "2026-10-19T15:02:44Z",
      "kind": "return"
    }
  ],
  "next": null
}

Verification

GET/v1/verify/{id}Checks fingerprint, timestamp and device signature. Public, no key.
{
  "id": "KYP-2026-000123",
  "intact": true,
  "sealed_at": "2026-10-07T09:41:18Z",
  "timestamp_authority": "qualified (eIDAS)",
  "device": "pns-0007",
  "checks": {
    "fingerprint": "match",
    "timestamp": "valid",
    "device_signature": "valid"
  }
}
POST/v1/verify/fileUpload a PDF or image and learn whether it is an intact record.
multipart/form-data  file=@acta.pdf
{
  "is_kyp_record": true,
  "id": "KYP-2026-000123",
  "intact": false,
  "reason": "fingerprint_mismatch"
}

Analysis

POST/v1/compareSets two records side by side: weight, size and packaging. Returns differences, not verdicts.
{
  "a": "KYP-2026-000123",
  "b": "KYP-2026-000481"
}
{
  "weight_kg": {
    "a": 2.34,
    "b": 0.41,
    "delta": -1.93
  },
  "dims_cm": {
    "a": [
      32,
      24.5,
      18
    ],
    "b": [
      32,
      24.5,
      18
    ],
    "delta": [
      0,
      0,
      0
    ]
  },
  "packaging": "changed",
  "differences": [
    "weight",
    "packaging"
  ],
  "verdict": null
}
POST/v1/declarations/checkCross-checks declared against measured, including dimensional weight.
{
  "reference": "ORD-88213",
  "declared": {
    "weight_kg": 1.2,
    "dims_cm": [
      30,
      20,
      10
    ],
    "contents": "Book"
  }
}
{
  "record": "KYP-2026-000123",
  "mismatches": [
    {
      "field": "weight_kg",
      "declared": 1.2,
      "measured": 2.34
    },
    {
      "field": "dims_cm",
      "declared": [
        30,
        20,
        10
      ],
      "measured": [
        32,
        24.5,
        18
      ]
    }
  ],
  "dim_weight_kg": {
    "declared": 1.2,
    "measured": 2.82
  }
}

Claims

POST/v1/dossiersBuilds the claim file: records, timeline, seals and a public link.
{
  "records": [
    "KYP-2026-000123"
  ],
  "claim": {
    "type": "damage",
    "counterparty": "carrier",
    "reference": "1Z…"
  },
  "lang": "es"
}
{
  "id": "dos_7c2e…",
  "status": "ready",
  "pdf": "…/dossier.pdf",
  "zip": "…/evidence.zip",
  "share_url": "https://verify.knowyourparcel.com/d/dos_7c2e…"
}

Operations

GET/v1/devices/{id}Status and integrity of each station: calibration, activity and alerts.
{
  "id": "pns-0007",
  "online": true,
  "integrity": "ok",
  "calibration": {
    "status": "valid",
    "last": "2026-10-01"
  },
  "records_today": 412,
  "alerts": []
}
POST/v1/exportsExports records and evidence for audit.
{
  "from": "2026-10-01",
  "to": "2026-10-31",
  "format": "zip"
}
{
  "id": "exp_31b0…",
  "status": "processing",
  "format": "zip",
  "records": 18240,
  "notify": "webhook"
}

Webhooks

record.sealedrecord.verifiedcompare.mismatchdeclaration.mismatchdossier.readydevice.integrity_alert

SDK

TypeScript and Python. Sandbox with a simulated station.

API v1 being designed with pilot partners. Routes and fields are illustrative.

For those who do not read code.

Everything the API does also has a dashboard. This is the day to day.

  • 01

    One-click claim file

    Pick the order and download the claim, ready for the carrier or insurer, in their language.

  • 02

    Outbound versus return

    What left and what came back, side by side. If it weighs 1.9 kg less, you see it before refunding.

  • 03

    Declared versus measured

    Every weight, size or contents discrepancy flagged before customs or the carrier flags it.

  • 04

    Evidence search

    By order, tracking, customer, date or station. Every result with its verifiable link.

  • 05

    Alerts

    Differences, stations out of calibration or tampering attempts, instantly, wherever you work.

  • 06

    Audit

    Export months of records with their seals for an auditor, a judge or a customer. Without asking us.

KYP Lite · In development

No machine. Just a phone.

For those who do not need a station: capture with a phone against printed rulers, with the image signed on the device itself so nobody can inject one along the way.

Less precision than PackNSign, the same chain of custody. It comes after the pilot.

A phone photographing a parcel on printed rulers.

What we keep to ourselves.

Some things are not published. They are told in a meeting, with a confidentiality agreement on the table.

  1. How the station signs each image before it leaves the device.
  2. How we detect an injected or generated image trying to bypass the camera.
  3. How we calibrate the measurement so the photo is proof, not an estimate.
  4. How we score each parcel’s risk without deciding for you.

Request the technical documentation

What we do not do.

  • We do not let artificial intelligence decide whether a photo is fake. We certify that it came from a real camera, on an intact device, at a sealed instant.
  • We do not issue verdicts. We issue evidence. Whoever decides keeps deciding.
  • We do not touch your customer data. The record carries what is needed to prove the parcel, and nothing else.

We want to integrate with your system before anyone else’s.

Early access