REST-API

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

Se som Markdown

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

  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:

Hent dine programmerShell
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

EmneRegel
Basisadressehttps://app.affilyflow.com/api/v1
FormatJSON ind og ud. Send Content-Type: application/json med en body.
BeløbDanske kroner uden moms. Salg i andre valutaer er omregnet med en låst ECB-kurs; originalen står i original_currency og original_value.
Datoerfrom 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'erProgrammer, links, sites og salg har UUID'er. click_id er et heltal.
Pagineringlimit + 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.
CacheSvarene sendes med Cache-Control: no-store.

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

Grænser

GrænseVærdiFejl
Kald pr. minut pr. nøgle120HTTP 429 rate_limited med Retry-After: 60
Skrivende kald pr. minut pr. nøgle60 (et batch-kald tæller som et)HTTP 429 rate_limited
Nye links pr. døgn pr. konto500 (alle nye links på kontoen de seneste 24 timer tæller med)HTTP 429 daily_link_limit
Links pr. batch50HTTP 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

MetodeStiBruges tilMCP-værktøj
GET/accountDin konto, kvote og links til dashboardetget_account
GET/catalogSøg i alle åbne programmersearch_programs
GET/programsProgrammer, du er tilmeldtlist_programs
GET/programs/{id}Et program med regler og retningslinjerget_program
GET, POST/programs/{id}/complianceTjek en promovering mod reglernecheck_compliance
GET/productsSøg i butikkernes varersearch_products
GET/websitesDine registrerede siteslist_websites
POST/websitesTilføj et siteadd_site
PATCH/websites/{id}Ret et siteupdate_site
GET/linksDine linkslist_links
POST/linksOpret et linkcreate_link
POST/links/batchOp til 50 links i et kaldcreate_links_batch
GET/links/{id}Et link med talget_link
PATCH/links/{id}Ret navn, landingsside eller site-etiketupdate_link
POST/links/{id}/archiveArkiver et linkarchive_link
DELETE/links/{id}/archiveHent et arkiveret link fremrestore_link
GET/statsKlik, salg og provision for en periodeget_stats
GET/salesEnkelte salglist_sales
GET/clicksEnkelte klik med side og kildelist_clicks
GET/sitesMålte sitesget_sites
GET/pagesSider på dine sitesget_pages
GET/balanceSaldo og næste udbetalingget_balance
GET/payoutsDine udbetalingerlist_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.

ParameterTypeBeskrivelse
querytekstFritekst i butiksnavn, kategori, beskrivelse og målgruppe.
categorytekstKategori, fx Bolig. Svaret har listen i categories.
joinedtrue / falseKun tilmeldte eller kun ikke-tilmeldte. Udelad for begge.
min_commission_pcttal 0–100Mindste provision i procent. Programmer med fast beløb udelades.
recurring_onlytrue / falseKun programmer med provision på abonnementsfornyelser.
channeltekstKun programmer, der tillader kanalen, fx TikTok.
sortepc, commission, newest, nameStandard: epc (netværkets indtjening pr. klik).
limit1–50Standard 20.
cursortekstFra 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.

ParameterBeskrivelse
channelPlanlagt kanal, fx Instagram, SEO, E-mail.
placement_urlHele adressen på siden, hvor linket skal stå.
landing_pageSti eller adresse hos butikken.
ad_typepaid_search_brand, paid_search_generic, coupon_site, cashback_site, social_post, newsletter eller website_content.
contentUdkast 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.

Må jeg køre Google Ads på generiske søgeord?Shell
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.

ParameterTypeBeskrivelse
querytekstSøgeord, fx sofa grå. Tom = de varer, du tjener mest på.
program_idUUIDKun et program.
min_commission_pcttal 0–100Mindste provision i procent.
in_stock_onlytrue / falseSkjul udsolgte varer.
sortearnings, relevance, price, rateStandard: relevance med søgeord, ellers earnings.
limit1–60Standard 20.
cursortekstFra 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.

FeltBeskrivelse
domainPåkrævet. Fx minside.dk. En hel adresse accepteres og skæres ned til domænet.
nameVisningsnavn, højst 120 tegn. Standard: domænet.
nicheFx Bolig, højst 80 tegn.
monthly_trafficOmtrentlige 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.

ParameterBeskrivelse
from, toValgfri periode. Uden: hele historikken.
pages_per_site0–25 topsider pr. site. Standard 5.
include_minorMedtag 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.

ParameterBeskrivelse
from, toValgfri periode. Uden: hele historikken.
siteKun sider på dette site (domæne uden www).
known_onlySkjul rækkerne uden kendt side.
min_clicksMindste antal klik.
limit1–200. Standard 50.
cursorFra next_cursor.

Dine links, nyeste først.

ParameterBeskrivelse
program_idKun links til dette program.
sub_idKun links med dette sub-ID.
searchTekst i navn, butik, destination eller sub-ID.
archivedexclude (standard), include eller only.
include_statstrue tilføjer klik, salg, provision, EPC og konvertering pr. link.
limit1–200. Standard 50.
cursorFra 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.

FeltBeskrivelse
program_idPåkrævet. Fra /catalog eller /programs.
landing_pageSti eller hel adresse på butikkens domæne, fx /produkter/sofa. Standard: forsiden.
sub_idHøjst 80 tegn.
campaignHøjst 80 tegn. Sendes som utm_campaign og bliver linkets navn.
channelEn af programmets tilladte kanaler: SEO, Blog, Instagram, TikTok, YouTube, Facebook, Pinterest, E-mail, Website.
utm_content, utm_termHøjst 100 tegn hver.
website_idValgfri site-etiket fra /websites.
placement_urlHele adressen på siden, hvor linket skal stå (https://…).
nameLinkets navn i dashboardet, højst 120 tegn.
include_qrtrue tilføjer en QR-kode som PNG i qr_png_base64.
Opret et linkShell
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.

Svar (forkortet)JSON
{
  "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.

Links til tre varerShell
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.

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.

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.

ParameterBeskrivelse
from, toPeriode. Standard: de seneste 30 dage.
group_bytotal (standard), sub_id, program, link, day, site, page, source, device eller country.
program_idKun dette program.
sub_idKun dette sub-ID.
comparetrue tilføjer perioden før (samme længde) med ændring i procent.
limit1–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.

Sidste måned pr. program med sammenligningShell
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.

ParameterBeskrivelse
from, toPeriode for salgets dato. Standard: de seneste 30 dage.
statuspending, approved eller rejected.
program_idKun dette program.
limit1–200. Standard 50.
cursorFra 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.

ParameterBeskrivelse
from, toPeriode. Standard: de seneste 30 dage.
siteKun klik fra dette site (domæne uden www).
pageKun klik fra sider, der starter med denne adresse – eller unknown for klik uden kendt side.
link_id, program_id, sub_idFiltre.
sourceKun denne kilde, fx Google, Instagram, Direkte.
outcomesale, no_sale eller rejected (kun afviste salg).
limit1–200. Standard 50.
cursorFra 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

HTTPKodeBetyder
400invalid_inputEn parameter mangler eller er ugyldig. Beskeden siger hvilken.
400invalid_jsonBody er ikke gyldig JSON.
400invalid_cursorcursor er ugyldig. Start forfra uden.
400channel_not_allowedKanalen er ikke tilladt i programmet. Beskeden lister de tilladte.
400landing_page_other_hostLandingssiden ligger ikke på butikkens domæne.
400invalid_landing_pageLandingssiden er ikke en gyldig sti eller adresse.
400unknown_websitewebsite_id findes ikke på din konto.
400immutable_fieldSub-ID, kampagne, kanal, program eller UTM kan ikke ændres på et eksisterende link.
400invalid_domainDomænet skal skrives som minside.dk.
401missing_keyIngen nøgle sendt.
401invalid_keyNøglen er ugyldig eller tilbagekaldt.
403not_joinedDu er ikke tilmeldt programmet. Beskeden har linket til tilmelding i dashboardet.
403inactiveProgrammet eller butikken er ikke aktiv lige nu.
403account_suspendedKontoen er suspenderet.
404not_foundProgrammet, linket eller sitet findes ikke på din konto.
409duplicate_domainDu har allerede et site med det domæne.
429rate_limitedFor mange kald. Vent, og prøv igen.
429daily_link_limit500 nye links det seneste døgn. Genbrug et link med ?sid= eller ?p=.
500server_error, save_failedNoget gik galt hos os. Prøv igen.
503unavailableAPI'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.

Kontakt support