VeriPix / developer reference

Verify the record, not the story.

Use the public VPX Badge ID endpoint to retrieve the registration evidence that VeriPix makes available for an issued badge. It is deliberately small, stable, and safe to call without credentials.

No authentication required
Public endpoint
GET
/api/badges/{badgeId}

Replace {badgeId} with a supported VPX identifier. The endpoint returns only the public verification projection.

VPX-YYYY-XXXXXXXX

GET https://veripix.polsia.app/api/badges/{badgeId}

01 / request

Start with a VPX Badge ID

The path parameter must use this exact grammar:

VPX-YYYY-XXXXXXXX
  • YYYY is a four-digit year.
  • XXXXXXXX is eight characters from A-H J-N P-Z 2-9.
  • The identifier is uppercase; the alphabet omits I, O, 0, and 1.

A malformed ID returns HTTP 400 with code invalid_badge_id. A well-formed ID with no public issued record follows the privacy-safe 404 behavior below.

02 / integrate

Make the request

Send a GET request to the relative route from your application’s public origin. The endpoint does not require an API key or a session.

curl
curl --request GET \
  --url https://veripix.polsia.app/api/badges/VPX-2026-ABCD2345

03 / response

Read the public projection

An issued badge record returns HTTP 200 with ten top-level fields. Dotted paths below describe each nested registration and history field. The normalized status distinguishes active, revoked, and corrected records. Private account, payment, storage, and upload fields are never included.

Every sample below is illustrative, including its VPX ID and image URL. The base64 signature and public-key strings satisfy the response format but are synthetic, are not a production key pair, and cannot verify a real badge.

Successful lookups return HTTP 200. The embedded history and /api/badges/{badgeId}/history contain at most 100 events: the registration followed by the 99 newest verifications in chronological order. Older events are omitted from this response. The public JSON response is capped at 32 KiB.

FieldType
vpxBadgeIdstring
imageUrlstring (URL)
photoSha256string
registeredAtstring (ISO 8601)
issuanceStatusstring
statusstring
statusExplanationstring
registrationEventobject
registrationEvent.eventTypestring
registrationEvent.vpxBadgeIdstring
registrationEvent.photoSha256string
registrationEvent.registeredAtstring (ISO 8601)
registrationEvent.signaturestring (base64)
registrationEvent.algorithmstring
registrationEvent.keyIdstring
registrationEvent.publicKeystring (base64)
registrationEvent.verificationStatusstring
verificationHistoryobject
verificationHistory.vpxBadgeIdstring
verificationHistory.eventsarray (up to 100)
verificationHistory.events[].eventTypestring
verificationHistory.events[].timestampstring (ISO 8601)
verificationHistory.events[].signatureStatusstring
squadobject | null
squad.familyIdstring
squad.memberNamesarray of strings
badgePresentationobject
badgePresentation.badgeobject or null
badgePresentation.disclaimerstring
disclaimerstring
200 / illustrative active response
{
  "vpxBadgeId": "VPX-2026-ABCD2345",
  "imageUrl": "https://assets.example.test/photo.jpg",
  "photoSha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "registeredAt": "2026-09-13T00:00:00.000Z",
  "issuanceStatus": "ISSUED",
  "status": "active",
  "statusExplanation": "This badge is active and currently valid.",
  "registrationEvent": {
    "eventType": "INITIAL_REGISTRATION",
    "vpxBadgeId": "VPX-2026-ABCD2345",
    "photoSha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
    "registeredAt": "2026-09-13T00:00:00.000Z",
    "signature": "c2lnbmF0dXJl",
    "algorithm": "Ed25519",
    "keyId": "illustrative-key-id",
    "publicKey": "cHVibGljLWtleQ==",
    "verificationStatus": "valid"
  },
  "verificationHistory": {
    "vpxBadgeId": "VPX-2026-ABCD2345",
    "events": [
      {
        "eventType": "INITIAL_REGISTRATION",
        "timestamp": "2026-09-13T00:00:00.000Z",
        "signatureStatus": "valid"
      },
      {
        "eventType": "PUBLIC_VERIFICATION",
        "timestamp": "2026-09-13T00:01:00.000Z",
        "signatureStatus": "valid"
      }
    ]
  },
  "squad": null,
  "badgePresentation": {
    "badge": {
      "style": "Futuristic",
      "title": "Future Verified",
      "report": "Main character energy: confirmed.",
      "rarity": "Epic"
    },
    "disclaimer": "Badge titles, reports, and rarity are entertainment only. They are not forensic or legal proof."
  },
  "disclaimer": "Registration records evidence; it does not prove ownership or authorship."
}
200 / illustrative revoked status excerpt
{
  "issuanceStatus": "REVOKED",
  "status": "revoked",
  "statusExplanation": "This badge is revoked and is no longer valid."
}
200 / illustrative corrected status excerpt
{
  "issuanceStatus": "CORRECTED",
  "status": "corrected",
  "statusExplanation": "This record was corrected; the displayed evidence is the current public evidence."
}

04 / responses

Validation and not-found responses

Malformed identifiers return HTTP 400. Well-formed unknown and not-yet-issued IDs return the same generic HTTP 404, so consumers cannot distinguish those two private states.

400 / malformed ID
HTTP/1.1 400 Bad Request
Content-Type: application/json

{
  "error": "Invalid VPX Badge ID.",
  "code": "invalid_badge_id"
}
404 / unknown or unissued ID
HTTP/1.1 404 Not Found
Content-Type: application/json

{
  "error": "Badge not found."
}

05 / scope

Registration is evidence, not ownership

Registration records evidence; it does not prove ownership or authorship.

The API verifies what VeriPix recorded about an image and when it was registered. It does not independently establish who created, owns, or is authorized to use the image.