Data Formats
Structured data formats used by EUlabel -- JSON-LD, schema.org, and GS1 Web Vocabulary.
EUlabel outputs passport data in formats aligned with GS1 standards, EU regulatory requirements, and web interoperability best practices.
At a glance
JSON-LD
Structured passport datasets for regulators, search engines, and interoperability
Linkset
Discoverable link collections returned by the resolver (RFC 9264)
OpenAPI
The API contract that powers the reference docs and SDK generation
JSON-LD: Primary passport format
Product passport data is serialized as JSON-LD using schema.org as the semantic anchor, extended with GS1 Web Vocabulary terms where schema.org lacks coverage.
JSON-LD ensures that passport data is:
- Machine-readable by search engines, AI agents, and regulatory systems
- Interoperable across platforms without proprietary data mappings
- Discoverable when embedded in HTML pages
Example: Wine passport as JSON-LD
{
"@context": ["https://schema.org", "https://www.gs1.org/voc/"],
"@type": "Product",
"name": "Quinta dos Carvalhais Alfrocheiro 2019",
"gtin": "05601012012200",
"brand": {
"@type": "Brand",
"name": "Quinta dos Carvalhais"
},
"countryOfOrigin": {
"@type": "Country",
"name": "Portugal"
},
"hasIngredientList": [
{
"@type": "gs1:FoodBeverageTobaccoIngredientDetails",
"ingredientName": "Grapes (Alfrocheiro)",
"ingredientContentPercentage": 99.986
},
{
"@type": "gs1:FoodBeverageTobaccoIngredientDetails",
"ingredientName": "Sulphites",
"ingredientContentPercentage": 0.014
}
],
"hasAllergen": [
{
"@type": "gs1:AllergenDetails",
"allergenType": "https://gs1.org/voc/AllergenTypeCode-AS",
"allergenLevelOfContainment": "CONTAINS"
}
],
"nutritionInformation": {
"@type": "NutritionInformation",
"servingSize": "100 mL",
"calories": "84 kcal",
"fatContent": "0 g",
"carbohydrateContent": "1 g",
"sugarContent": "0.1 g",
"proteinContent": "0 g",
"sodiumContent": "0 g"
}
}If you’re embedding passport data in your own pages, JSON-LD is the most portable representation: it works across regulatory systems and web tooling.
Content negotiation
Request Accept: application/ld+json from the passport endpoint to receive JSON-LD instead of the default JSON response:
export EULABEL_API_KEY="sk_test_..."
curl https://api.eulabel.eu/v1/products/a1b2c3d4-.../passport \
-H "Authorization: Bearer $EULABEL_API_KEY" \
-H "Accept: application/ld+json"Embedding in HTML
Structured data is embedded in passport web pages using a <script> tag, invisible to consumers but discoverable by machines:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Quinta dos Carvalhais Alfrocheiro 2019",
"gtin": "05601012012200"
}
</script>This satisfies two requirements simultaneously: a human-readable passport page for consumers and a machine-readable dataset for regulators and search engines.
Linkset: machine-discoverable links
Use a linkset when you want to discover what resources exist for a product (product page, nutrition section, allergen section, compliance datasets) in a single request.
- Guide: Linkset (RFC 9264)
- Resolver behavior: How the Resolver Works
OpenAPI: API contract
EUlabel publishes an OpenAPI 3.1 spec that powers this documentation and the SDK generators.
- Reference: API Reference
- SDKs: SDK Overview