# Introduction (https://eulabel.eu/docs/documentation/get-started/introduction)

> Fetch the complete documentation index at: https://eulabel.eu/docs/llms.txt
> Use this file to discover all available pages before exploring further.
> Full content: https://eulabel.eu/docs/llms-full.txt
> Append .md to any page URL for markdown, or send Accept: text/markdown.



EUlabel is the infrastructure layer that connects physical products to their digital identity. Through simple API calls, you can create compliant Digital Product Passports, generate GS1 Digital Link QR codes, and serve structured product data to consumers, regulators, recyclers, and retailers.

> **Warning**
> **Early access** — these docs are evolving quickly. If you need a walkthrough or notice a missing endpoint/example, [open an issue on GitHub](https://github.com/eulabel-eu/eulabel.eu/issues).

> **Note**
> **Phase 1: Wine e-labels** — passport creation currently supports wine data only (`productType: "wine"`). The product API accepts all categories (wine, food, textile, electronics, battery), but structured passport data is validated against the wine schema. Additional sector schemas ship with future phases.

At a glance [#at-a-glance]

* **What you're building**: Digital Product Passports (DPPs) and EU digital labels that are compliant by default.
* **How it works**: send GTIN + data → passport created with compliance guidance → QR scans resolve via the GS1-conformant resolver.
* **What you get**: API + SDKs + resolver + analytics, designed for both humans and machines. Partial data is accepted — the API guides you to full compliance over multiple calls.

Quickstart — pick your stack [#quickstart--pick-your-stack]

- [cURL](https://eulabel.eu/docs/documentation/get-started/quickstart) — Get started with raw HTTP requests
- [TypeScript](https://eulabel.eu/docs/documentation/sdks/typescript) — Type-safe SDK with auto-completion
- [Python](https://eulabel.eu/docs/documentation/sdks/python) — Idiomatic client with async support
Quick example [#quick-example]

### CURL

```bash
export EULABEL_API_KEY="sk_test_..."

curl -X POST https://api.eulabel.eu/v1/passports \
  -H "Authorization: Bearer $EULABEL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "gtin": "5601234567890",
    "name": "Quinta do Crasto Douro Red 2021",
    "brand": "Quinta do Crasto",
    "category": "wine",
    "data": {
      "productType": "wine",
      "ingredients": ["Grapes", "Sulphur Dioxide"],
      "allergens": { "containsSulphites": true }
    }
  }'
```
### JavaScript

```javascript
const EULABEL_API_KEY = process.env.EULABEL_API_KEY;

const passport = await fetch('https://api.eulabel.eu/v1/passports', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${EULABEL_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    gtin: '5601234567890',
    name: 'Quinta do Crasto Douro Red 2021',
    brand: 'Quinta do Crasto',
    category: 'wine',
    data: {
      productType: 'wine',
      ingredients: ['Grapes', 'Sulphur Dioxide'],
      allergens: { containsSulphites: true },
    },
  }),
}).then(r => r.json());

console.log(passport.id);     // "ps_w9x2kf"
console.log(passport.status); // "draft" (partial data — enrich later)
```
### Python

```python
import requests

EULABEL_API_KEY = "sk_test_..."

passport = requests.post(
    "https://api.eulabel.eu/v1/passports",
    headers={"Authorization": f"Bearer {EULABEL_API_KEY}"},
    json={
        "gtin": "5601234567890",
        "name": "Quinta do Crasto Douro Red 2021",
        "brand": "Quinta do Crasto",
        "category": "wine",
        "data": {
            "productType": "wine",
            "ingredients": ["Grapes", "Sulphur Dioxide"],
            "allergens": {"containsSulphites": True},
        },
    },
).json()

print(passport["status"])  # "draft" (partial data — enrich later)
```
One call creates the product and passport together. Partial data is accepted — the response includes a `compliance` object that tells you what is missing to reach full regulatory compliance.

> **Note**
> Use `sk_test_...` in the sandbox and `sk_live_...` in production. Keep keys server-side and store them in a secrets manager.

Explore [#explore]

- [Quickstart](https://eulabel.eu/docs/documentation/get-started/quickstart) — Go from zero to a working passport in 5 minutes
- [SDKs](https://eulabel.eu/docs/documentation/sdks) — Client libraries for TypeScript and Python
- [API Reference](https://eulabel.eu/docs/api-reference) — Complete REST endpoint documentation
- [Webhooks](https://eulabel.eu/docs/webhooks) — Real-time event notifications
- [Data Formats](https://eulabel.eu/docs/documentation/integrations/data-formats) — JSON-LD, linksets, and structured data
- [Knowledge Base](https://eulabel.eu/docs/knowledge-base) — Learn about DPP, GS1, and EU compliance
Base URL [#base-url]

All API requests use the following base URL:
```text
https://api.eulabel.eu/v1
```
Authentication [#authentication]

Include your API key in the `Authorization` header:

### CURL

```bash
curl https://api.eulabel.eu/v1/products \
  -H "Authorization: Bearer sk_test_..."
```
### JavaScript

```javascript
const response = await fetch('https://api.eulabel.eu/v1/products', {
  headers: { 'Authorization': 'Bearer sk_test_...' },
});
```
### Python

```python
response = requests.get(
    "https://api.eulabel.eu/v1/products",
    headers={"Authorization": "Bearer sk_test_..."},
)
```

