# REST-API

> Affiliate-API'et under /api/v1 – nøgler, grænser, alle endpoints med parametre og svar, paginering og fejlkoder.

REST-API'et giver dine egne scripts og integrationer adgang til det samme som dashboardet: programmer, regler, produkter, links, sites, klik, salg, saldo og udbetalinger. Hvert endpoint svarer til et værktøj på [MCP-serveren](https://www.affilyflow.com/docs/affiliate/mcp) – det er de samme funktioner bag begge.

API'et er kun for affiliates. Butikker har intet API.

## Kom i gang

1. Åbn **AI og API** i dashboardets menu (under Tjen penge – adressen er `app.affilyflow.com/indstillinger/api`).
2. Opret en API-nøgle, og giv den et navn, fx "Mit site".
3. Kopier nøglen med det samme. Den vises kun en gang og gemmes kun som et fingeraftryk hos os.

Send nøglen i `Authorization`-headeren på hvert kald:

```bash title="Hent dine programmer"
curl https://app.affilyflow.com/api/v1/programs \
  -H "Authorization: Bearer $AFFILYFLOW_API_KEY"
```

Headeren `X-API-Key: afk_…` virker også. En nøgle starter altid med `afk_`.

> [!WARNING]
> Nøglen giver adgang til dine links og tal. Gem den på serveren som en miljøvariabel – aldrig i kode, der kører i browseren, eller i et offentligt repository. Tilbagekald en nøgle under **AI og API**, hvis den er blevet delt. Du kan have højst 10 aktive nøgler.

`GET https://app.affilyflow.com/api/v1` kræver ingen nøgle og svarer med en maskinlæsbar oversigt over alle endpoints, parametre og grænser.

OAuth-forbindelser (claude.ai, ChatGPT, Claude Code) virker kun på MCP-serveren – ikke på REST-API'et.

## Konventioner

| Emne | Regel |
|---|---|
| Basisadresse | `https://app.affilyflow.com/api/v1` |
| Format | JSON ind og ud. Send `Content-Type: application/json` med en body. |
| Beløb | Danske kroner uden moms. Salg i andre valutaer er omregnet med en låst ECB-kurs; originalen står i `original_currency` og `original_value`. |
| Datoer | `from` og `to` som `ÅÅÅÅ-MM-DD` i dansk tid (Europe/Copenhagen), begge dage med. Uden dem: de seneste 30 dage. Højst 366 dage pr. kald. |
| Id'er | Programmer, links, sites og salg har UUID'er. `click_id` er et heltal. |
| Paginering | `limit` + `cursor`. Svaret har `total`, `has_more` og `next_cursor`. Send `next_cursor` tilbage som `cursor` med de samme filtre. |
| Fejl | `{ "error": { "code": "…", "message": "…" } }` med en HTTP-status. Beskederne er på dansk. |
| Cache | Svarene sendes med `Cache-Control: no-store`. |

Afviste salg tæller aldrig som salg eller provision i tallene.

## Grænser

| Grænse | Værdi | Fejl |
|---|---|---|
| Kald pr. minut pr. nøgle | 120 | HTTP 429 `rate_limited` med `Retry-After: 60` |
| Skrivende kald pr. minut pr. nøgle | 60 (et batch-kald tæller som et) | HTTP 429 `rate_limited` |
| Nye links pr. døgn pr. konto | 500 (alle nye links på kontoen de seneste 24 timer tæller med) | HTTP 429 `daily_link_limit` |
| Links pr. batch | 50 | HTTP 400 `invalid_input` |

Et identisk link, der genbruges, tæller ikke som et nyt link. Brug `?sid=` og `?p=` på et eksisterende link i stedet for at lave mange næsten ens links – se [Links og sub-ID](https://www.affilyflow.com/docs/affiliate/links-og-sub-id).

## Endpoints

| Metode | Sti | Bruges til | MCP-værktøj |
|---|---|---|---|
| GET | `/account` | Din konto, kvote og links til dashboardet | `get_account` |
| GET | `/catalog` | Søg i alle åbne programmer | `search_programs` |
| GET | `/programs` | Programmer, du er tilmeldt | `list_programs` |
| GET | `/programs/{id}` | Et program med regler og retningslinjer | `get_program` |
| GET, POST | `/programs/{id}/compliance` | Tjek en promovering mod reglerne | `check_compliance` |
| GET | `/products` | Søg i butikkernes varer | `search_products` |
| GET | `/websites` | Dine registrerede sites | `list_websites` |
| POST | `/websites` | Tilføj et site | `add_site` |
| PATCH | `/websites/{id}` | Ret et site | `update_site` |
| GET | `/links` | Dine links | `list_links` |
| POST | `/links` | Opret et link | `create_link` |
| POST | `/links/batch` | Op til 50 links i et kald | `create_links_batch` |
| GET | `/links/{id}` | Et link med tal | `get_link` |
| PATCH | `/links/{id}` | Ret navn, landingsside eller site-etiket | `update_link` |
| POST | `/links/{id}/archive` | Arkiver et link | `archive_link` |
| DELETE | `/links/{id}/archive` | Hent et arkiveret link frem | `restore_link` |
| GET | `/stats` | Klik, salg og provision for en periode | `get_stats` |
| GET | `/sales` | Enkelte salg | `list_sales` |
| GET | `/clicks` | Enkelte klik med side og kilde | `list_clicks` |
| GET | `/sites` | Målte sites | `get_sites` |
| GET | `/pages` | Sider på dine sites | `get_pages` |
| GET | `/balance` | Saldo og næste udbetaling | `get_balance` |
| GET | `/payouts` | Dine udbetalinger | `list_payouts` |

## Konto

### GET /account

Svarer med `account` (AF-nummer, visningsnavn og hvordan butikkerne ser dig, land, niche, antal sites, links og tilmeldte programmer, valuta og tidszone), `access`, `quota` (links de seneste 24 timer, resterende, grænser og kald brugt det seneste minut) og `dashboard` med adresser til dashboardets sider.

## Programmer

### GET /catalog

Hele kataloget af åbne programmer – også dem, du ikke er tilmeldt.

| Parameter | Type | Beskrivelse |
|---|---|---|
| `query` | tekst | Fritekst i butiksnavn, kategori, beskrivelse og målgruppe. |
| `category` | tekst | Kategori, fx `Bolig`. Svaret har listen i `categories`. |
| `joined` | `true` / `false` | Kun tilmeldte eller kun ikke-tilmeldte. Udelad for begge. |
| `min_commission_pct` | tal 0–100 | Mindste provision i procent. Programmer med fast beløb udelades. |
| `recurring_only` | `true` / `false` | Kun programmer med provision på abonnementsfornyelser. |
| `channel` | tekst | Kun programmer, der tillader kanalen, fx `TikTok`. |
| `sort` | `epc`, `commission`, `newest`, `name` | Standard: `epc` (netværkets indtjening pr. klik). |
| `limit` | 1–50 | Standard 20. |
| `cursor` | tekst | Fra `next_cursor`. |

Hvert program har bl.a. `program_id`, `store`, `joined`, `commission` (`type`, `value`, `text`), `cookie_days`, `approval_days`, `recurring_months`, `allowed_channels`, `paid_search` (`allowed`, `no_brand` eller `forbidden`), `allow_coupon_sites`, `network` (EPC, konvertering, ordreværdi og godkendelsesrate – afviste salg er ikke med) og `join_url`. Tilmelding sker i dashboardet via `join_url` – API'et tilmelder dig ikke.

### GET /programs

De programmer, du er tilmeldt, med provision, cookie-varighed, kanaler, de gemte regler og butikkens retningslinjer (forkortet). `active: false` betyder, at nye salg ikke giver provision; `inactive_reason` siger hvorfor (`program_paused` eller `store_inactive`). Feltet `brand_bidding` er forældet – brug `paid_search`. Parameter: `search` (butiksnavn).

### GET /programs/{id}

Alt om et program: butikkens beskrivelse og målgruppe, retningslinjerne ordret, reglerne i dag (`rules.now`), de gemte regler (`rules.saved`) og datoen, hvor en stramning træder i kraft (`rules.tightening_effective_from`), en `compliance_summary`, regelvagtens tilstand (`enforcement.mode`: `shadow` eller `enforce`), rabatkoder, materialer (bannere med færdig HTML og dit link, når du er tilmeldt), topprodukter, netværkstal og dine egne tal for programmet (`mine`).

### GET eller POST /programs/{id}/compliance

Tjekker en planlagt promovering mod programmets målbare regler. Send mindst en af parametrene. Brug POST med JSON, når `content` er lang.

| Parameter | Beskrivelse |
|---|---|
| `channel` | Planlagt kanal, fx `Instagram`, `SEO`, `E-mail`. |
| `placement_url` | Hele adressen på siden, hvor linket skal stå. |
| `landing_page` | Sti eller adresse hos butikken. |
| `ad_type` | `paid_search_brand`, `paid_search_generic`, `coupon_site`, `cashback_site`, `social_post`, `newsletter` eller `website_content`. |
| `content` | Udkast til teksten (højst 20.000 tegn) – tjekkes for reklamemarkering. |

Svaret har `verdict` (`ok`, `warning` eller `not_allowed`), `checks` med en dom og en begrundelse pr. regel (og `effective_from`, når en stramning er på vej), butikkens retningslinjer ordret og regelvagtens tilstand. Kun de målbare regler dømmes: kanal, rabatkode- og cashbacksider ud fra placeringens domæne, betalt søgning som angivet og landingssiden. Reklamemarkeringen er et heuristisk tjek, og butikkens fritekst vurderes ikke. Se [Programregler](https://www.affilyflow.com/docs/affiliate/regler).

```bash title="Må jeg køre Google Ads på generiske søgeord?"
curl "https://app.affilyflow.com/api/v1/programs/PROGRAM_ID/compliance?ad_type=paid_search_generic" \
  -H "Authorization: Bearer $AFFILYFLOW_API_KEY"
```

## Produkter

### GET /products

Søger i butikkernes varer på tværs af åbne programmer.

| Parameter | Type | Beskrivelse |
|---|---|---|
| `query` | tekst | Søgeord, fx `sofa grå`. Tom = de varer, du tjener mest på. |
| `program_id` | UUID | Kun et program. |
| `min_commission_pct` | tal 0–100 | Mindste provision i procent. |
| `in_stock_only` | `true` / `false` | Skjul udsolgte varer. |
| `sort` | `earnings`, `relevance`, `price`, `rate` | Standard: `relevance` med søgeord, ellers `earnings`. |
| `limit` | 1–60 | Standard 20. |
| `cursor` | tekst | Fra `next_cursor`. |

Hver vare har `product_id`, `title`, `url`, `image_url`, `price`, `currency`, `in_stock`, `store`, `program_id`, `commission`, `est_commission` og `joined`. For tilmeldte programmer er `tracking_url` dit eksisterende link sendt direkte til varen (`?p=`). `est_commission` er et skøn: satsen af prisen uden moms eller det faste beløb.

## Sites

### GET /websites

Dine registrerede sites med `website_id`, `domain`, `name`, `niche`, `monthly_traffic` og `created_at`.

### POST /websites

Tilføjer et site med de samme regler som **Mine sites**.

| Felt | Beskrivelse |
|---|---|
| `domain` | Påkrævet. Fx `minside.dk`. En hel adresse accepteres og skæres ned til domænet. |
| `name` | Visningsnavn, højst 120 tegn. Standard: domænet. |
| `niche` | Fx `Bolig`, højst 80 tegn. |
| `monthly_traffic` | Omtrentlige besøgende pr. måned. |

Et nyt site svarer HTTP 201. Har du allerede domænet, oprettes intet, og svaret er det eksisterende site med `already_existed: true` og HTTP 200. Svaret har `history` med de klik, salg og den provision, der allerede er kommet fra domænet.

### PATCH /websites/{id}

Retter `domain`, `name`, `niche` eller `monthly_traffic`. Send `null` eller `""` for at rydde `name`, `niche` eller `monthly_traffic`. Et domæne, du allerede har på et andet site, afvises med `duplicate_domain`. Sites kan kun slettes i dashboardet.

### GET /sites

Sites målt på klikkene – registrerede og opdagede – med klik, salg, provision, EPC, side-sporingens dækning og metode, topbutikker og topsider. `suggest_add: true` markerer et opdaget site med mindst 3 klik eller et salg, som du ikke har tilføjet.

| Parameter | Beskrivelse |
|---|---|
| `from`, `to` | Valgfri periode. Uden: hele historikken. |
| `pages_per_site` | 0–25 topsider pr. site. Standard 5. |
| `include_minor` | Medtag opdagede sites med meget få klik. |

### GET /pages

Siderne på dine sites, sorteret efter provision, med klik, salg, EPC, konvertering, bedst sælgende vare, butikker og udvikling over 30 dage. Klik uden kendt side står som en række pr. site med `known: false`.

| Parameter | Beskrivelse |
|---|---|
| `from`, `to` | Valgfri periode. Uden: hele historikken. |
| `site` | Kun sider på dette site (domæne uden www). |
| `known_only` | Skjul rækkerne uden kendt side. |
| `min_clicks` | Mindste antal klik. |
| `limit` | 1–200. Standard 50. |
| `cursor` | Fra `next_cursor`. |

## Links

### GET /links

Dine links, nyeste først.

| Parameter | Beskrivelse |
|---|---|
| `program_id` | Kun links til dette program. |
| `sub_id` | Kun links med dette sub-ID. |
| `search` | Tekst i navn, butik, destination eller sub-ID. |
| `archived` | `exclude` (standard), `include` eller `only`. |
| `include_stats` | `true` tilføjer klik, salg, provision, EPC og konvertering pr. link. |
| `limit` | 1–200. Standard 50. |
| `cursor` | Fra `next_cursor`. |

Hvert link har `link_id`, `url`, `program_id`, `store`, `active`, `name`, `landing_page`, `destination`, `sub_id`, `channel`, `utm`, `website_id`, `placement_url`, `archived`, `created_at` og `html`.

### POST /links

Opretter et link – præcis som link-generatoren i dashboardet. Du skal være tilmeldt programmet.

| Felt | Beskrivelse |
|---|---|
| `program_id` | Påkrævet. Fra `/catalog` eller `/programs`. |
| `landing_page` | Sti eller hel adresse på butikkens domæne, fx `/produkter/sofa`. Standard: forsiden. |
| `sub_id` | Højst 80 tegn. |
| `campaign` | Højst 80 tegn. Sendes som `utm_campaign` og bliver linkets navn. |
| `channel` | En af programmets tilladte kanaler: `SEO`, `Blog`, `Instagram`, `TikTok`, `YouTube`, `Facebook`, `Pinterest`, `E-mail`, `Website`. |
| `utm_content`, `utm_term` | Højst 100 tegn hver. |
| `website_id` | Valgfri site-etiket fra `/websites`. |
| `placement_url` | Hele adressen på siden, hvor linket skal stå (`https://…`). |
| `name` | Linkets navn i dashboardet, højst 120 tegn. |
| `include_qr` | `true` tilføjer en QR-kode som PNG i `qr_png_base64`. |

```bash title="Opret et link"
curl -X POST https://app.affilyflow.com/api/v1/links \
  -H "Authorization: Bearer $AFFILYFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"program_id":"PROGRAM_ID","landing_page":"/produkter/sofa","sub_id":"blog-bedste-sofaer-okt"}'
```

Et nyt link svarer HTTP 201. Findes der et identisk link, genbruges det med `reused: true` og HTTP 200.

```json title="Svar (forkortet)"
{
  "link": {
    "url": "https://app.affilyflow.com/go/3f9a1c07be",
    "short_code": "3f9a1c07be",
    "reused": false,
    "program_id": "PROGRAM_ID",
    "store": "Butik",
    "landing_page": "/produkter/sofa",
    "sub_id": "blog-bedste-sofaer-okt",
    "html": "<a href=\"https://app.affilyflow.com/go/3f9a1c07be\" rel=\"sponsored noopener\" target=\"_blank\" referrerpolicy=\"no-referrer-when-downgrade\">Butik</a>",
    "variants": {
      "with_sub_id": "https://app.affilyflow.com/go/3f9a1c07be?sid={sub_id}",
      "deeplink": "https://app.affilyflow.com/go/3f9a1c07be?p={path_on_store}"
    },
    "warnings": []
  },
  "warnings": [],
  "quota": {
    "links_created_last_24h": 1,
    "links_remaining_24h": 499,
    "daily_link_limit": 500,
    "requests_per_minute": 120,
    "requests_used_this_minute": 1,
    "write_calls_per_minute": 60
  }
}
```

`warnings` har regel-advarsler for programmet – fx en kanal eller placering, der ikke er tilladt, eller en stramning på vej. Brug `html` på dit site: så får hvert klik den præcise side med. Se [Side-sporing](https://www.affilyflow.com/docs/affiliate/side-sporing).

### POST /links/batch

Op til 50 links i et kald. Felterne på topniveau (`program_id`, `sub_id`, `campaign`, `channel`, `website_id`, `utm_content`, `utm_term`) er standardværdier, som hvert element i `items` kan overskrive. Et element kan desuden have `landing_page`, `placement_url` og `name`.

```bash title="Links til tre varer"
curl -X POST https://app.affilyflow.com/api/v1/links/batch \
  -H "Authorization: Bearer $AFFILYFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"program_id":"PROGRAM_ID","sub_id":"artikel-sofaer-okt","items":[{"landing_page":"/produkter/sofa-a"},{"landing_page":"/produkter/sofa-b"},{"landing_page":"/produkter/sofa-c"}]}'
```

Svaret har et resultat pr. element (`index`, `ok` og enten `link` eller `error` med `code` og `message`), en `summary` (`requested`, `created`, `reused`, `failed`) og den resterende kvote. Et element, der fejler, stopper ikke de andre.

### GET /links/{id}

Et link med tal, `performs_on` (de sider, sites eller kanaler klikkene kom fra), programmets status og de regler, der gælder i dag, og `variants`. `?include_qr=true` tilføjer en QR-kode.

### PATCH /links/{id}

Retter `name`, `landing_page` (på butikkens domæne) eller `website_id` (`null` fjerner etiketten). Adressen ændrer sig aldrig.

Sub-ID, kampagne, kanal, program og UTM-værdier kan ikke ændres på et eksisterende link, fordi klikkene er registreret med dem. Forsøger du, svarer API'et HTTP 400 `immutable_field`. Lav et nyt link, eller sæt `?sid=` på det eksisterende.

### POST og DELETE /links/{id}/archive

POST arkiverer linket, DELETE henter det frem igen. Et arkiveret link virker stadig – det er kun skjult i listen.

## Resultater

### GET /stats

Klik, salg og provision for en periode.

| Parameter | Beskrivelse |
|---|---|
| `from`, `to` | Periode. Standard: de seneste 30 dage. |
| `group_by` | `total` (standard), `sub_id`, `program`, `link`, `day`, `site`, `page`, `source`, `device` eller `country`. |
| `program_id` | Kun dette program. |
| `sub_id` | Kun dette sub-ID. |
| `compare` | `true` tilføjer perioden før (samme længde) med ændring i procent. |
| `limit` | 1–500 rækker ved gruppering. Standard 100. `day` giver altid alle dage. |

`totals` og hver række i `rows` har `clicks`, `sales`, `sales_pending`, `sales_approved`, `sales_rejected`, `revenue`, `commission`, `commission_pending`, `commission_approved`, `conversion_rate_pct` og `epc`. Rækker har desuden `key` og `label`. Et salg tælles på den dag, det blev registreret. Ved `site`, `page`, `source`, `device` og `country` grupperes salget efter det klik, det kom fra.

```bash title="Sidste måned pr. program med sammenligning"
curl "https://app.affilyflow.com/api/v1/stats?from=2026-09-01&to=2026-09-30&group_by=program&compare=true" \
  -H "Authorization: Bearer $AFFILYFLOW_API_KEY"
```

### GET /sales

Enkelte salg, nyeste først.

| Parameter | Beskrivelse |
|---|---|
| `from`, `to` | Periode for salgets dato. Standard: de seneste 30 dage. |
| `status` | `pending`, `approved` eller `rejected`. |
| `program_id` | Kun dette program. |
| `limit` | 1–200. Standard 50. |
| `cursor` | Fra `next_cursor`. |

Hvert salg har `sale_id`, `created_at`, `store`, `order_ref` (kun de sidste tegn af ordrenummeret), `order_value`, `commission_base` (når provisionen er regnet af et andet beløb end ordren), `commission` (efter eventuelle delvise refusioner), `commission_before_refund`, `refunded_value`, originalvaluta og kurs, `status` og `status_text`, `rejection_reason` (fx *Regelbrud: …*), `approval_due_at` for afventende salg, `items`, og klikket: `click_id`, `clicked_at`, `link_id`, `sub_id` og `landing_page`.

### GET /clicks

Enkelte klik med hele sporet: tidspunkt, siden linket stod på og hvordan den er kendt (`page_basis`), site, kilde med grundlag, link og sub-ID, landingsside, enhed, land, den låste provision og de salg, klikket førte til. Perioden følger klikkets dato.

| Parameter | Beskrivelse |
|---|---|
| `from`, `to` | Periode. Standard: de seneste 30 dage. |
| `site` | Kun klik fra dette site (domæne uden www). |
| `page` | Kun klik fra sider, der starter med denne adresse – eller `unknown` for klik uden kendt side. |
| `link_id`, `program_id`, `sub_id` | Filtre. |
| `source` | Kun denne kilde, fx `Google`, `Instagram`, `Direkte`. |
| `outcome` | `sale`, `no_sale` eller `rejected` (kun afviste salg). |
| `limit` | 1–200. Standard 50. |
| `cursor` | Fra `next_cursor`. |

## Saldo og udbetalinger

Kun læsning. Svarene indeholder aldrig IBAN (heller ikke maskeret), CPR, TIN eller adresse, og API'et kan ikke bede om udbetaling.

### GET /balance

`balance` (til rådighed, afventende salg, undervejs, optjent i alt og udbetalt – alt uden moms), `payout` (næste automatiske udbetalingsdag, minimum, om du kan bede om udbetaling nu, og hvad der mangler – med kode, tekst og `you_can_fix`) og de 5 seneste udbetalinger. Se [Udbetaling](https://www.affilyflow.com/docs/affiliate/udbetaling).

### GET /payouts

Alle udbetalinger, nyeste først: status, automatisk eller anmodet, beløb uden moms, moms, overført beløb, datoer og afregningsbilagets nummer. Parametre: `limit` (1–100, standard 24) og `cursor`.

## Fejlkoder

| HTTP | Kode | Betyder |
|---|---|---|
| 400 | `invalid_input` | En parameter mangler eller er ugyldig. Beskeden siger hvilken. |
| 400 | `invalid_json` | Body er ikke gyldig JSON. |
| 400 | `invalid_cursor` | `cursor` er ugyldig. Start forfra uden. |
| 400 | `channel_not_allowed` | Kanalen er ikke tilladt i programmet. Beskeden lister de tilladte. |
| 400 | `landing_page_other_host` | Landingssiden ligger ikke på butikkens domæne. |
| 400 | `invalid_landing_page` | Landingssiden er ikke en gyldig sti eller adresse. |
| 400 | `unknown_website` | `website_id` findes ikke på din konto. |
| 400 | `immutable_field` | Sub-ID, kampagne, kanal, program eller UTM kan ikke ændres på et eksisterende link. |
| 400 | `invalid_domain` | Domænet skal skrives som `minside.dk`. |
| 401 | `missing_key` | Ingen nøgle sendt. |
| 401 | `invalid_key` | Nøglen er ugyldig eller tilbagekaldt. |
| 403 | `not_joined` | Du er ikke tilmeldt programmet. Beskeden har linket til tilmelding i dashboardet. |
| 403 | `inactive` | Programmet eller butikken er ikke aktiv lige nu. |
| 403 | `account_suspended` | Kontoen er suspenderet. |
| 404 | `not_found` | Programmet, linket eller sitet findes ikke på din konto. |
| 409 | `duplicate_domain` | Du har allerede et site med det domæne. |
| 429 | `rate_limited` | For mange kald. Vent, og prøv igen. |
| 429 | `daily_link_limit` | 500 nye links det seneste døgn. Genbrug et link med `?sid=` eller `?p=`. |
| 500 | `server_error`, `save_failed` | Noget gik galt hos os. Prøv igen. |
| 503 | `unavailable` | API'et er midlertidigt utilgængeligt. |

Spørger du efter et link eller site, der tilhører en anden affiliate, svarer API'et `not_found` – det afslører ikke, at det findes.

## Det kan API'et ikke

- Tilmelde dig programmer – det sker i dashboardet, hvor butikken får besked.
- Slette links eller sites – links kan arkiveres, sites slettes kun i dashboardet.
- Se eller ændre bankoplysninger, stamdata eller profil – eller bede om udbetaling.

Kilde: https://www.affilyflow.com/docs/affiliate/rest-api
