> For the complete documentation index, see [llms.txt](https://docs.adpage.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.adpage.io/data-and-insights/data-and-insights-nl/marketingintegraties/adpage-feed-je-eigen-api.md).

# AdPage Feed (je eigen API)

Lever wekelijks omzet en retouren uit je eigen ERP- of bronsysteem via drie alleen-lezen eindpunten aan.

Wanneer je echte omzet ergens zit waarvoor AdPage geen integratie heeft — een aangepaste ERP, een groothandelssysteem, een kassa in een fysieke winkel — kun je het zelf aanleveren. **AdPage Feed v1** is een klein contract: drie GET-endpoints, één sleutel, alleen wekelijkse totalen.

{% hint style="info" %}
Deze integratie wordt per klant vrijgegeven. Als je de tegel niet ziet, vraag <support@adpage.io> om deze in te schakelen.
{% endhint %}

### Waarom dit bestaat

Het Marketing Mix Model draait op één omzetcijfer per week: het bedrag dat je advertentiebudget moet verklaren. Hoe dichter dat bedrag bij je werkelijke omzet ligt, hoe betrouwbaarder de conclusies van het model zijn.

Tracking meet iets wat net anders is dan je boekhouding, en het meet winkelomzet helemaal niet. Dat doet je bronsysteem. Met deze koppeling kun je dat bedrag aanleveren zonder dat AdPage ooit in je ERP hoeft te kijken.

### Wat AdPage vraagt, en wat het niet vraagt

| Gevraagd                                     | Nooit gevraagd                        |
| -------------------------------------------- | ------------------------------------- |
| Omzet per ISO-week per verkoopkanaal         | Bestellingen, orderregels, klanten    |
| Retourwaarde per week per kanaal (optioneel) | Persoonsgegevens                      |
| Leesrechten via één sleutel                  | Schrijfrechten van welke aard dan ook |
| Ongeveer twee verzoeken per week             | Realtime of dagelijkse polling        |

Een statische sleutel op drie alleen-lezen endpoints is bewust het kleinst mogelijke aanvalsoppervlak. Het komt door de meeste securityreviews zonder discussie heen.

### Drie manieren om te koppelen

**Route A — jij bouwt de feed (aanbevolen).** Implementeer de drie endpoints. Voor een ontwikkelaar met toegang tot de data kost dit een halve dag tot een dag. Geen maatwerk aan AdPage-zijde, dus niets om op te wachten.

**Route B — je hebt al een API en AdPage koppelt die.** Stuur je documentatie plus één voorbeeldrespons en AdPage bevestigt of deze zo gebruikt kan worden. De voorwaarden die niet omzeild kunnen worden: data beschikbaar per week (of per dag, wat AdPage aggregeert), onderscheidbaar per verkoopkanaal, en stabiel — om dezelfde week twee keer vragen moet hetzelfde antwoord opleveren.

**Route C — geen API beschikbaar.** De wekelijkse CSV-upload blijft beschikbaar. Het werkt, maar iemand moet het elke week doen, en dat is precies de stap die wordt overgeslagen als het druk wordt.

### Het contract

```
GET {base}/livez                                      → {"status":"ok"}, geen authenticatie
GET {base}/adpage/v1/weekly-revenue?date_from&date_to  → omzet per ISO-week per kanaal
GET {base}/adpage/v1/weekly-returns?date_from&date_to  → retouren per ISO-week per kanaal (optioneel)
```

Vier regels dragen het contract:

1. Geef terug **hele ISO-weken**.
2. De **dezelfde week geeft altijd hetzelfde bedrag terug**.
3. Wanneer een bedrag wordt herzien, **`modified_at` loopt op**.
4. **Eén rij per week per kanaal** — geen duplicaten.

Regel 2 is de belangrijkste. Een feed die elke keer dat erom wordt gevraagd net andere cijfers teruggeeft, maakt het model op manieren instabiel die later heel moeilijk te diagnosticeren zijn.

De volledige specificatie, een OpenAPI-bestand dat je in Postman kunt importeren, en een uitgewerkt voorbeeld staan in de `docs/partner-data-api/` map van de AdPage-repository. Vraag support als je ze toegestuurd wilt krijgen.

### Koppel de feed in AdPage

{% stepper %}
{% step %}

#### Open de tegel

Ga naar **Integraties**, selecteer de container en open de **Eigen API (AdPage Feed)** tegel.
{% endstep %}

{% step %}

#### Vul de basis-URL en authenticatie in

Voer je **basis-URL**, de **headernaam** waarin je API de sleutel verwacht, een optioneel **waardevoorvoegsel** (bijvoorbeeld `Bearer`), en de **sleutel** zelf in.

Stel het **btw-tarief** in en of je cijfers inclusief of exclusief btw zijn. Als je dit fout doet, worden alle getallen in het model met ongeveer een vijfde geschaald, en niets anders zal dat aangeven.

Als je kanaalnamen afwijken van die van AdPage, map ze dan onder kanaalroutering.
{% endstep %}

{% step %}

#### Testen en dan opslaan

AdPage roept `/livez` aan en voert een droge test uit over de afgelopen vier weken voordat er iets wordt opgeslagen. Een feed die niet antwoordt, wordt nooit opgeslagen — anders zou die stilzwijgend blijven falen in de wekelijkse taak.

Gebruik **Alleen testen** om te controleren zonder op te slaan. De sleutel gaat naar de server en komt nooit terug: de respons toont hoogstens de laatste vier tekens.
{% endstep %}

{% step %}

#### Haal de geschiedenis binnen

Na het koppelen voer je een synchronisatie uit om de geschiedenis op te halen — standaard twee jaar, tot vier jaar. De wekelijkse taak zou daar vanzelf komen, maar niemand wil tot dinsdag wachten.

Als een uitvoering tegen zijn tijdslimiet aanloopt, wordt dat als afgekapt gerapporteerd. Wat is opgehaald, is compleet, en opnieuw uitvoeren maakt de taak af: de blokken overlappen op hun grensweek en de tabellen verwijderen doublures vanzelf, dus een herhaling kan nooit dubbel tellen.
{% endstep %}
{% endstepper %}

### De sleutel roteren

Plak de nieuwe sleutel en sla op. Alle andere velden kunnen ongewijzigd blijven — een weggelaten veld behoudt zijn opgeslagen waarde, dus alleen de sleutel vervangen is één handeling.

### Probleemoplossing

**`/livez` mislukt.** De basis-URL klopt niet of het endpoint is niet bereikbaar vanaf internet. Het gebruikt bewust geen authenticatie; als het wel een sleutel vereist, ligt dat aan het endpoint.

**Authenticatie mislukt op de data-endpoints.** Controleer de headernaam en het waardevoorvoegsel apart. `Authorization` met voorvoegsel `Bearer` en `X-API-Key` zonder voorvoegsel zijn beide gebruikelijk, en ze door elkaar halen is meestal de oorzaak.

**De droge test geeft niets terug.** De feed antwoordt wel, maar heeft geen data voor de afgelopen vier weken, of het datumfilter wordt niet toegepast. Controleer de `date_from` en `date_to` afhandeling.

**De omzet wijkt ongeveer 21% af.** De btw-basis staat omgekeerd ingesteld. Corrigeer dat in de tegel.

**Het model gedraagt zich na verloop van tijd vreemd.** Controleer regel 2 — of dezelfde week nog steeds hetzelfde bedrag teruggeeft. Een feed die uit een live tabel leest zonder cutoff-datum gaat verschuiven.

Nog steeds vastgelopen? Neem contact op met <support@adpage.io> met de container en de basis-URL — nooit de sleutel.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.adpage.io/data-and-insights/data-and-insights-nl/marketingintegraties/adpage-feed-je-eigen-api.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
