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 – det er de samme funktioner bag begge.
API'et er kun for affiliates. Butikker har intet API.
Kom i gang
- Åbn AI og API i dashboardets menu (under Tjen penge – adressen er
app.affilyflow.com/indstillinger/api). - Opret en API-nøgle, og giv den et navn, fx "Mit site".
- 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:
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_.
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.
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.
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. |
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.
{
"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.
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.
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.
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.
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.
Mangler du noget?
Skriv til os – vi svarer hurtigt, og siden bliver rettet.