REST API

Predictable JSON endpoints for generation and validation. Bulk, history and analytics endpoints are available on Pro and above.

Authentication

Create API keys from your dashboard and send them as a bearer token. Public generation and validation endpoints are open for evaluation and rate-limited per IP.

curl https://exoders.app/api/public/v1/validate \
  -H "Authorization: Bearer exo_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"symbology":"ean13","value":"4006381333931"}'
Manage API keys
POST
/api/public/v1/products

Generate GS1-compliant product barcodes and link QR codes from a product payload. Missing GTIN check digits are calculated for you.

Request

{
  "products": [
    {
      "name": "Single Origin Cocoa 500g",
      "brand": "Ember Foods",
      "sku": "EF-COC-500",
      "price": "12.90",
      "currency": "EUR",
      "symbology": "ean13",
      "value": "400638133393",
      "url": "https://store.example.com/p/cocoa-500"
    }
  ],
  "options": { "scale": 3, "includeQr": true }
}

Response

{
  "count": 1,
  "generated": 1,
  "failed": 0,
  "results": [{
    "index": 0,
    "ok": true,
    "symbology": "ean13",
    "value": "4006381333931",
    "gs1": { "compliant": true, "checkDigit": 1 },
    "barcode": { "format": "svg", "svg": "<svg …>" },
    "qr": { "format": "svg", "url": "https://…", "svg": "<svg …>" }
  }]
}
POST
/api/public/v1/generate

Render any single barcode or QR code as SVG.

Request

{
  "symbology": "ean13",
  "value": "4006381333931",
  "scale": 3,
  "foreground": "#1A1512",
  "background": "#FFFFFF"
}

Response

{
  "symbology": "ean13",
  "value": "4006381333931",
  "format": "svg",
  "svg": "<svg …>"
}
POST
/api/public/v1/validate

Validate a value against a symbology and return the expected check digit.

Request

{ "symbology": "gtin13", "value": "4006381333931" }

Response

{
  "valid": true,
  "symbology": "gtin13",
  "normalized": "4006381333931",
  "checkDigit": 1,
  "gs1Compliant": true
}
GET
/api/public/v1/symbologies

List every supported symbology with its group and example value.

Request

Response

{ "count": 22, "symbologies": [ … ] }

Errors

Errors return the appropriate HTTP status with a JSON body:

{ "error": "Invalid check digit", "hint": "Correct: 4006381333931" }