Public API · Strong ETags · Verify widget

GetProofAnchor documentation

The public API exposes a read-only surface for listing proofs, fetching a single proof and verifying whether a given piece of content still matches the original proof.

Quickstart

The GetProofAnchor prototype focuses on a small public surface: listing existing proofs and verifying whether a given content block still matches a stored proof.

Base URL

https://getproofanchor.com/api/public

All endpoints in this document are relative to the base URL above.

Authentication

The public API currently exposes a read-only public surface. No authentication or API keys are required for the endpoints below.

Environment & base URL

All examples assume the production environment: https://getproofanchor.com. If you run your own instance, replace the base domain accordingly.

API reference

GET /public/proofs

Returns a paginated list of public proofs. This is mainly useful for debugging and exploring stored proofs in the prototype.

Request
GET /api/public/proofs
Example response
{
  "items": [
    {
      "id": "f6e03a4f-802f-4aa0-820a-fd54bebfb808",
      "title": "Search check",
      "fingerprint": "aeab415b4f3f4c05e672f5df6402206c1d9505c55a0d8dfc88b035716559e207",
      "created_at": "2025-11-10T09:15:00Z"
    }
  ]
}

GET /public/proofs/{id}

Returns the details of a single proof, identified by its id (UUID). This includes the stored fingerprint and metadata.

Request
GET /api/public/proofs/{id}
Example response
{
  "id": "f6e03a4f-802f-4aa0-820a-fd54bebfb808",
  "title": "Search check",
  "fingerprint": "aeab415b4f3f4c05e672f5df6402206c1d9505c55a0d8dfc88b035716559e207",
  "created_at": "2025-11-10T09:15:00Z"
}

POST /public/proofs/{id}/verify

Compares a supplied title and/or content string with the stored proof. Returns whether the supplied inputs match the stored fingerprint.

Request body

JSON object with the following fields:

  • title (optional, string) – canonical title text.
  • content (optional, string) – canonical body text.

At least one of title or content should be provided.

POST /api/public/proofs/{id}/verify
Content-Type: application/json

{
  "title": "Search check",
  "content": "Tady je slovo list v obsahu"
}
Example response (valid)
{
  "id": "f6e03a4f-802f-4aa0-820a-fd54bebfb808",
  "valid": true,
  "fingerprint": "aeab415b4f3f4c05e672f5df6402206c1d9505c55a0d8dfc88b035716559e207"
}
Example response (modified)
{
  "id": "f6e03a4f-802f-4aa0-820a-fd54bebfb808",
  "valid": false,
  "fingerprint": "13b38b30875b2d1d4fa499aa3a2dffb17c0a08b6363e6f11eb45c865dda540"
}

GET /public/proofs/search

Simple search over public proofs. Useful for debugging and for UI that lets you look up a proof by title or content.

Query parameters:

  • q (required, string) – free-text query.
Request
GET /api/public/proofs/search?q=hello

Verify widget

The verify widget is a small JavaScript snippet that you can embed into your pages. It reads text from the page (or from a specific selector), sends it to the /verify endpoint and shows a modal with the result.

Basic usage

Place this snippet before the closing </body> of any public page:

<script
  src="https://getproofanchor.com/widget.js"
  data-proof="YOUR_PROOF_ID"></script>

The widget will:

  • Read visible text from the page (or a custom selector).
  • Send it to /api/public/proofs/{id}/verify.
  • Show a badge and modal with the verification result.

You can experiment with different options on the Embed builder page.

Embed builder

The /embed page is a prototype UI that helps you generate the right widget snippet for your use case: proof ID, theme, badge mode, position and target selector.

ETags & caching behavior

All public endpoints return strong ETags based on a SHA-256 hash of the normalized JSON response. Responses are marked as:

  • Cache-Control: public, max-age=60
  • Strong ETags in quotes, e.g. "aeab41..."

If you send an If-None-Match header with the ETag you previously received, the API will respond with 304 Not Modified when the underlying data did not change.

Errors & status codes

The prototype uses conventional HTTP status codes and FastAPI-style error bodies.

  • 200 OK – request succeeded.
  • 304 Not Modified – ETag matches existing data.
  • 400 Bad Request – invalid body or query parameters.
  • 404 Not Found – proof with given ID does not exist.
  • 500 Internal Server Error – unexpected server error.
Example validation error
{
  "detail": [
    {
      "type": "string_type",
      "loc": ["body", "title"],
      "msg": "Input should be a valid string",
      "input": null
    }
  ]
}