Label Registryby Glint

Public certificate verification API

Brands and marketplaces can query Label Registry automatically. The response matches what visitors see on the public certificate and verify pages: holder, scope, validity, effective status, published history notes, and public claims when present. No personal names or private emails are returned.

Overview

PublicApiDocs.overviewBody

Endpoint

Replace the identifier in the path with a published certificate number or the public token from a QR verification link.

GET https://glint-label-registry.vercel.app/api/public/v1/certificates/ECOV-2026-000001

Certificate identifier

PublicApiDocs.identifierBody

Example response

effectiveStatus reflects calendar expiry even when the stored status is still ACTIVE. When claims are published on the certificate page, they appear under claims with the same public evidence metadata.

{
  "schemaVersion": "1",
  "generatedAt": "2026-10-20T09:00:00.000Z",
  "certificate": {
    "number": "ECOV-2026-000001",
    "status": "ACTIVE",
    "effectiveStatus": "ACTIVE",
    "hasConditions": false,
    "holder": {
      "legalName": "Atelier du Foron SAS",
      "country": "FR",
      "legalEntityId": "900000043"
    },
    "scheme": {
      "slug": "vallee-verte",
      "name": { "fr": "Label Vallée Verte", "en": "Green Valley Label" },
      "version": 1
    },
    "scope": "Miel de montagne, miellerie de Fillinges.",
    "validFrom": "2026-09-01",
    "validUntil": "2029-08-31",
    "verifier": { "name": "Alpes Contrôle" },
    "history": [
      {
        "status": "ACTIVE",
        "at": "2026-09-01T09:00:00.000Z",
        "note": { "fr": "Certificat accordé.", "en": null }
      }
    ],
    "verifyUrl": "https://glint-label-registry.vercel.app/fr/verify/seedtokenECOV2026000001"
  },
  "claims": [],
  "disclaimer": "Status reflects the scheme owner's decision. Label Registry is software and does not certify."
}

Errors

A missing certificate or unpublished scheme returns 404. When you exceed the rate limit, the server returns 429 with Retry-After and X-RateLimit headers.

HTTP/1.1 404 Not Found
{ "error": "not_found" }
HTTP/1.1 429 Too Many Requests
{ "error": "rate_limited" }

Rate limit

Each client IP may send up to 60 GET requests per 60 seconds on this endpoint. Integrators should cache responses (the API already sends Cache-Control) and back off when they receive 429.

Related

PublicApiDocs.relatedBody

Open the public registry