Keepable docs
Sender API

Sender attestation keys

Register a public key so you can sign the content you deliver. A sender signature proves a document is exactly what you sent, not just that Keepable sealed it.

By default Keepable's document seal proves a delivered file arrived intact. Sender attestation goes one step further: you sign the content yourself, so a recipient can prove the document is exactly what you produced, end to end. You register a public key once, keep the private key on your side, and attach a signature to each delivery you want attested.

Registering and using keys needs the content.write scope.

Register a public key

Generate an EC P-256 key pair. Send only the public key, in JWK form (RFC 7517); the private key never leaves your infrastructure.

curl -X POST https://api.keepable.co/sender/tenants/ten_01HXP/sender-keys \
  -H "Authorization: Bearer $KEEPABLE_TOKEN" \
  -H "Keepable-Version: 2026-05-24" \
  -H "Content-Type: application/json" \
  -d '{
    "public_jwk": {
      "kty": "EC",
      "crv": "P-256",
      "x": "f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU",
      "y": "x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0"
    }
  }'
201 Created
{ "key_id": "snk_01HXP" }

The returned key_id is the key's published id. You will pass it as sender_key_id on every attested delivery, so store it alongside your private key.

  • x and y are the base64url (unpadded) curve coordinates.
  • List your keys, active and retired, newest first, with GET /sender/tenants/{id}/sender-keys.
  • Retire a key with DELETE /sender/tenants/{id}/sender-keys/{key_id}. Content already sealed over it stays verifiable; the key just cannot sign new deliveries.

Sign a delivery

For each document you want attested:

Compute the canonical content hash of the raw bytes you are sending.

Sign that hash with your private key to produce a base64 ECDSA P-256 signature.

Send the content with sender_signature set to that signature and sender_key_id set to the registered key's id.

An attested delivery body (abridged)
{
  "recipient": { "identifier_type": "nin", "identifier": "12345678901" },
  "subject": "Your loan agreement",
  "content_type": "letter",
  "parts": [ { "name": "agreement.pdf", "media_type": "application/pdf", "data": "JVBER…" } ],
  "sender_signature": "MEUCIQD…",
  "sender_key_id": "snk_01HXP"
}

Keepable verifies the signature against your registered key and chains the document seal over it, so the recipient's verification proves both that Keepable sealed the file and that you signed the exact bytes.

Attestation is only accepted for non-transformed content. If Keepable would sanitise the body (for example an HTML part), the signature no longer matches the stored bytes and the delivery is rejected. Attest PDFs and other byte-stable documents.

When to use it

Reach for sender attestation when the recipient, or a third party they show the document to, needs to trust you as the origin, not just Keepable as the custodian: loan agreements, legal notices, anything where "this came unaltered from the issuing institution" is the point. For everyday mail, the standard seal is enough.