# Mijn producten

GET /my-products: één regel per klantartikel, met jouw prijs en voorraad, SEO, categorieën en kenmerken.

Sectie: PIM · API
Canonieke URL: https://docs.omniretailconnect.nl/pim/api/mijn-producten

## Mijn producten ophalen

`GET /my-products` — Eén regel per klantartikel, met jouw prijs en voorraad.

Dit adres geeft je klantartikelen: de artikelen zoals ze bij jou in de PIM staan. Het antwoord heeft dezelfde velden als [Producten](https://docs.omniretailconnect.nl/pim/api/producten.md#velden-van-een-product), plus jouw prijs, jouw voorraad en enkele extra gegevens.

**Eerste twee klantartikelen ophalen · curl**

```bash
# Zet je token in een omgevingsvariabele. Zet het nooit in een script dat je deelt.
export PIM_API_TOKEN='<jouw-token>'

# -g laat curl de blokhaken in filter[...] ongemoeid.
curl -sS -g "https://pim.internetservicebureau.nl/api/v1/my-products?per_page=2" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $PIM_API_TOKEN"
```

**Eerste twee klantartikelen ophalen · JavaScript**

```javascript
// Alleen in code op je eigen server: zet het token nooit in browsercode.
// Top-level await werkt in een ES-module (een .mjs-bestand of "type": "module").
const token = process.env.PIM_API_TOKEN;

const response = await fetch('https://pim.internetservicebureau.nl/api/v1/my-products?per_page=2', {
  headers: {
    Accept: 'application/json',
    Authorization: `Bearer ${token}`,
  },
});

// Een fout is ook JSON: {"message": "..."}
console.log(response.status, await response.json());
```

**Eerste twee klantartikelen ophalen · PHP**

```php
<?php

// Het token komt uit de omgeving, niet uit de code.
$token = getenv('PIM_API_TOKEN');

$curl = curl_init('https://pim.internetservicebureau.nl/api/v1/my-products?per_page=2');
curl_setopt_array($curl, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Accept: application/json',
        "Authorization: Bearer {$token}",
    ],
]);

$body = json_decode(curl_exec($curl), true);

// Een fout is ook JSON: {"message": "..."}
echo curl_getinfo($curl, CURLINFO_RESPONSE_CODE), PHP_EOL;
print_r($body);
```

**Eerste twee klantartikelen ophalen · Python**

```python
import json
import os
import urllib.error
import urllib.request

# Het token komt uit de omgeving, niet uit de code.
token = os.environ["PIM_API_TOKEN"]

request = urllib.request.Request(
    "https://pim.internetservicebureau.nl/api/v1/my-products?per_page=2",
    headers={
        "Accept": "application/json",
        "Authorization": f"Bearer {token}",
    },
)

try:
    with urllib.request.urlopen(request) as response:
        print(response.status, json.load(response))
except urllib.error.HTTPError as error:
    # Een fout is ook JSON: {"message": "..."}
    print(error.code, json.load(error))
```

## Het verschil met Producten

- **Welke artikelen.** Producten laat zien wat je kunt verkopen, op basis van de aanbiedingen. Mijn producten geeft één regel per actief klantartikel, ook als er op dit moment geen aanbod is dat je mag gebruiken. Dan is `suppliers` leeg.
- **Prijs.** Producten heeft alleen de prijzen van de leveranciers. Mijn producten heeft ook jouw prijs: `price` en `price_incl`.
- **Voorraad.** In Producten is `stock` je eigen voorraad uit je kassa of ERP, of `null`. In Mijn producten is `stock` altijd een geheel getal.
- **Extra gegevens.** Mijn producten heeft ook `seo`, `categories` en `features`.
- **Extra filter.** Mijn producten kent ook `filter[reference]`.
- **Volgorde.** Mijn producten staat in een vaste volgorde, ook als je door de pagina's loopt.

## Parameters

`page`, `per_page` en `limit` werken zoals bij Producten: standaard 100, maximaal 1000, en een andere waarde wordt stilzwijgend 100. Het antwoord heeft ook hier geen totaal.

*Filters van GET /my-products*

| Naam | Type | Verplicht | Omschrijving |
| --- | --- | --- | --- |
| `filter[updated_at]` | string | Optioneel | Alleen artikelen die zijn gewijzigd. Zelfde voorvoegsels, URL-codering en tijdzone als bij Producten. Zie hieronder. |
| `filter[stock]` | string | Optioneel | Filter op de voorraad van je klantartikel, met een voorvoegsel zoals `>=5` (in de URL `%3E%3D5`). |
| `filter[reference]` | string | Optioneel | De referentie van het artikel. Moet precies kloppen. |
| `filter[ean13]` | string | Optioneel | Eén EAN. Zoekt op de EAN van het artikel en op de extra EAN-codes die erbij horen. |
| `filter[eancode]` | string | Optioneel | Hetzelfde als `filter[ean13]`. |
| `filter[nut_plas_number]` | string | Optioneel | Een of meer NUT- of PLAS-nummers, gescheiden door een komma. |

### Wat het filter updated_at oplevert

Een artikel komt mee als zijn eigen inhoud is gewijzigd: naam, beschrijving, afbeeldingen, prijs of voorraad. Bij een artikel uit je eigen kassa of ERP tellen ook een wijziging van je voorraad en een wijziging van de status van een aanbod mee.

Alle klantartikelen die sinds 12 maart 2026 om 10:00 uur zijn gewijzigd:

**Wijzigingen sinds een tijdstip**

```bash
curl -sS -g "https://pim.internetservicebureau.nl/api/v1/my-products?filter[updated_at]=%3E%3D2026-03-12T10:00:00" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer $PIM_API_TOKEN"
```

### Het verschil bij het filter stock

Bij Producten moet de waarde een getal zijn en krijg je anders een `422`. Hier krijg je bij een waarde die geen getal is geen foutmelding, alleen geen resultaten. Controleer dus of je waarde klopt.

## Het antwoord

Het antwoord heeft dezelfde indeling als bij Producten: `data`, `links` en `meta`, zonder totaal. Een artikel heeft alle velden van [een product](https://docs.omniretailconnect.nl/pim/api/producten.md#velden-van-een-product). Hieronder staan alleen de extra velden en een ingekort voorbeeld. De waarden zijn verzonnen.

*Extra velden van een klantartikel*

| Veld | Type | Omschrijving |
| --- | --- | --- |
| `price` | number | Jouw prijs voor dit artikel, zonder btw. |
| `price_incl` | string | Jouw prijs met btw, op twee decimalen, als tekst. Berekend met `vat`. |
| `stock` | integer | Jouw voorraad voor dit artikel, als geheel getal. `0` als er geen voorraad is. |
| `seo` | object | SEO-gegevens van het artikel, zoals een metatitel. Leeg als er niets is: `[]`. |
| `categories` | array | De categorieën van het artikel. Leeg als er geen zijn: `[]`. |
| `features` | array | De kenmerken van het artikel, zoals een naam met een waarde. Leeg als er geen zijn: `[]`. |

**Een klantartikel (ingekort)**

```json
{
  "ean13": "8710000000001",
  "reference": "REF-1",
  "name": "Voorbeeldmerk Voorbeeld Vitamine C - 90cp",
  "brand": "Voorbeeldmerk",
  "vat": 9,
  "status": "active",
  "suppliers": [
    { "supplier": "Voorbeeldleverancier", "sku": "V-1", "stock": 40, "price": 8.5, "price_incl": "9.27" }
  ],
  "price": 12.5,
  "price_incl": "13.63",
  "stock": 7,
  "seo": {
    "meta_title": "Voorbeeldtitel"
  },
  "categories": [
    { "id": 1, "name": "Vitamines" }
  ],
  "features": [
    { "id": 1, "name": "Vorm", "value": "Capsules" }
  ]
}
```

In dit voorbeeld zijn de velden die je ook bij Producten ziet weggelaten. Wat er in `seo`, `categories` en `features` staat, hangt af van wat voor jouw artikelen is vastgelegd.

> **Opmerking — Welk adres kies je:** Wil je alleen weten wat je kunt verkopen en tegen welke leveranciersprijs, gebruik dan [Producten](https://docs.omniretailconnect.nl/pim/api/producten.md). Wil je je eigen artikelen met prijs, voorraad, SEO, categorieën en kenmerken, gebruik dan Mijn producten. Je kunt ook allebei gebruiken.
