Naar de inhoud
SyncMyShop

Kennisbank

AFAS connectoren: GetConnector, UpdateConnector en app connector

AFAS Profit geeft data vrij via connectoren: een GetConnector leest een gegevensverzameling, een UpdateConnector schrijft met vaste veldcodes, en de app connector bepaalt welke van die twee een koppeling mag aanroepen. Sinds september 2026 hebben classic tokens een einddatum, dus een nieuwe koppeling meldt zich aan met OAuth.

Bijgewerkt op

Drie soorten connectoren

Alles wat een externe koppeling met AFAS Profit doet, loopt via connectoren op de REST API onder https://<omgevingsnummer>.rest.afas.online/ProfitRestServices. Er zijn drie soorten, en ze hebben elk een andere eigenaar:

Soort Wat hij doet Wie hem inricht Voorbeeld
App connector de toegang: welke connectoren, welke gebruikersgroep, welk IP beheerder van de omgeving één per externe applicatie
GetConnector leest records uit een gegevensverzameling beheerder stelt hem samen, koppeling roept hem aan Profit_Article, Profit_Stock
UpdateConnector maakt, wijzigt of verwijdert records vast in Profit, velden in de metainfo FbSales, KnSalesRelationOrg

Een GetConnector of UpdateConnector die niet in de app connector staat, bestaat voor de koppeling niet. De aanroep krijgt dan de melding "GetConnector niet ondersteund voor deze app of de gebruiker is niet geautoriseerd", ook met een geldig token. Welke GetConnectoren en UpdateConnectoren een omgeving heeft, en welke daarvan geblokkeerd zijn, geeft de aanroep GET /metainfo.

Daarmee ligt de eerste stap van elke AFAS koppeling bij de beheerder, niet bij de bouwer. In de praktijk is dat de stap waar het op wacht. Wij leveren daarom vooraf de volledige lijst: welke GetConnectoren en UpdateConnectoren, welke velden per GetConnector, welke gebruikersgroep.

Classic token of OAuth

Een koppeling meldt zich op twee manieren aan. Met een classic token, een vaste sleutel die bij elke aanroep meegaat als Authorization: AfasToken <Base64>. Of met OAuth, waarbij de koppeling eerst een kortlevend access token ophaalt. AFAS faseert het classic token uit. De tijdlijn uit de documentatie over authenticatie, bijgewerkt op 30 september 2026:

Datum Wat er verandert
September 2026 bestaande classic tokens krijgen een einddatum
1 mei 2027 bestaande classic tokens verlopen; nieuwe zijn alleen nog met beperkte geldigheid aan te maken
31 augustus 2027 laatste dag waarop app connectoren met een classic token werken

Het helpcentrum van AFAS noemt voor het verlopen van bestaande tokens 15 februari 2027 in plaats van 1 mei 2027. Reken met de vroegste datum. Het helpcentrum meldt ook dat app connectoren die 6 maanden of langer niet zijn gebruikt, worden geblokkeerd.

Voor een koppeling tussen twee systemen is de client credentials flow de route: geen gebruiker die inlogt, de koppeling werkt onder de gebruiker van de app connector.

POST /ProfitRestServices/oauth/token HTTP/1.1
Host: 12345.rest.afas.online
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials&client_id=<CLIENT_ID>&client_secret=<CLIENT_SECRET>

Het antwoord bevat een access_token met expires_in: 3600, zonder refresh token. Na een uur vraagt de koppeling een nieuw token; tussendoor hergebruikt hij het, in plaats van per aanroep een nieuw te halen. Vanaf Profit 9 heeft een client secret een geldigheidsduur, standaard 180 dagen. Een verlopen secret stopt de koppeling, dus het vernieuwen hoort in de planning, of de koppeling gebruikt private key JWT.

Twee regels gelden voor beide methoden. Een token of secret is na het aanmaken niet meer in Profit te raadplegen; is het kwijt, dan maakt de beheerder een nieuw. En een IP-restrictie op de app connector wordt in CIDR-notatie ingesteld, zonder IPv6. De koppeling komt dan van een vast IPv4-adres; een ander adres krijgt een 403.

GetConnector: lezen met skip, take en filters

Een GetConnector zonder skip en take geeft altijd de eerste 100 regels. Er komt geen foutmelding bij: de koppeling ziet 100 artikelen en denkt dat dat alles is. De grenzen per aanroep:

  • velden maal regels onder 150.000 (een advies; AFAS kondigt een harde limiet aan)
  • maximaal 75 MB per aanroep
  • time-out na 900 seconden
  • een URL met filter van maximaal 2.048 tekens

Een rekenvoorbeeld met 42.000 artikelen:

GetConnector Velden Take binnen 150.000 Aanroepen
Geen take 19 100 1, met 41.900 artikelen te weinig
Profit_Article 19 150.000 / 19 = 7.894, dus 7.500 42.000 / 7.500 = 5,6, dus 6
Eigen GetConnector Webshop_Artikelen 10 150.000 / 10 = 15.000 15.000 + 15.000 + 12.000: 3

Bij bladeren hoort een sortering op een uniek veld (orderbyfieldids=ItemCode), anders verschuift de volgorde tussen twee aanroepen en valt er een regel tussen de pagina's. AFAS schrijft ook dat het ophalen trager wordt naarmate skip oploopt. Bij grote sets werkt een filter op het gesorteerde veld beter: de volgende aanroep vraagt alles vanaf de laatste artikelcode van de vorige.

Filters gaan als drie parallelle lijsten in de URL: filterfieldids, filtervalues en operatortypes. Een komma tussen de waarden is EN, een puntkomma is OF. De operators die een koppeling het meest gebruikt:

Type Betekenis Gebruik
1 is gelijk aan één artikel of één debiteur
2 groter of gelijk aan alles gewijzigd sinds de vorige ronde
6 bevat zoeken op een deel van een naam
8 / 9 is leeg / is niet leeg artikelen zonder barcode; vraagt een lege filtervalues

Een ongeldige combinatie, zoals skip=2&take=-1, geeft geen nette 400 maar een 500 met "Er is een onverwachte fout opgetreden". Hoe je zo'n ronde over de hele dag doorrekent, staat in doorvoer berekenen.

UpdateConnector: schrijven en foutmeldingen lezen

Schrijven gaat met POST voor nieuw, PUT voor wijzigen en DELETE voor verwijderen, naar /connectors/FbSales, /connectors/KnSalesRelationOrg enzovoort. Twee instellingen in het verzoek bepalen of de inhoud goed aankomt. Speciale tekens moeten in UTF-8; anders staat er in Profit een vraagteken in plaats van é of ü. En de header Accept-Language bepaalt in welke taal codetabelwaarden worden gelezen: voor het geslacht Man is dat M bij nl-nl en H bij fr-fr.

Een ronde tegen AFAS Profit met OAuth, een GetConnector en een UpdateConnector De koppeling vraagt met client credentials een access token aan dat 3600 seconden geldig is. Daarmee haalt hij 15.000 artikelregels op uit een eigen GetConnector en stuurt hij een order naar FbSales. Profit weigert die order met een 500, een korte melding en een logreferentie. De order gaat naar de controlelijst in plaats van opnieuw te worden verstuurd. Koppeling wachtrij AFAS Profit ProfitRestServices POST /oauth/token, client_credentials access_token, expires_in: 3600 GET Webshop_Artikelen ?skip=0&take=15000 200 OK, 15.000 rows POST /connectors/FbSales 500, externalMessage, profitLogReference Inhoudelijke fout: de betaalvoorwaarde bestaat niet. Opnieuw sturen helpt niet; de order gaat met de logreferentie naar de controlelijst. na 3600 seconden POST /oauth/token, nieuw token
Eén ronde: token, lezen, schrijven, en een inhoudelijke fout die niet opnieuw wordt verstuurd.

Weigert Profit een record, dan komt er een 500 met drie velden in de body:

{
  "externalMessage": "De ingevulde waarde bij 'Betaalvoorwaarde' bestaat niet.",
  "errorNumber": -2147220469,
  "profitLogReference": "5D0E7C21A94B4F6E8B1F3A60C2D9E447"
}

externalMessage is de korte melding die een gebruiker in Profit ook zou zien. profitLogReference verwijst naar het omgevingslogboek, waar de beheerder de volledige fout vindt. errorNumber is meestal een algemene code en zegt weinig. AFAS logt alleen fouten, en nooit de inhoud van het verzoek. Wat er precies is verstuurd, moet dus in de log van de koppeling staan.

Of een nieuwe poging zin heeft, hangt af van de code:

Code Betekenis Opnieuw proberen?
500, inhoudelijk een code of veld klopt niet nee; naar de controlelijst
500, geblokkeerd bijvoorbeeld een boekingslay-out die een gebruiker open heeft ja, met pauzes
503 onderhoud; de body bevat retry_after in seconden, bijvoorbeeld 7200 ja, na die tijd
401 / 403 token ongeldig / IP-restrictie nee

Een time-out aan de kant van de koppeling betekent niet dat Profit gestopt is. AFAS raadt aan de volle 900 seconden af te wachten voordat dezelfde aanroep opnieuw gaat. Wie eerder opnieuw stuurt, laat Profit hetzelfde werk twee keer doen, en een order kan dan twee keer binnenkomen. Hoe dubbele relaties en orders ontstaan staat in dubbele klanten en debiteuren.

Wat betekent dit voor je koppeling?

Het werk aan AFAS zit voor een deel bij de beheerder: de app connector, de GetConnectoren en de overstap naar OAuth voor 31 augustus 2027. Wij leveren de lijst die daarvoor nodig is en bouwen de koppeling op OAuth, met eigen GetConnectoren, sortering en filters per ronde, en een foutafhandeling die per code kiest tussen opnieuw proberen en de controlelijst. In het dashboard staat bij elke geweigerde order de melding en de profitLogReference, zodat je beheerder hem in het logboek terugvindt.

Welke stromen we tussen AFAS en je webshop koppelen, en waar de veldcodes op vastlopen, staat op de pagina over de AFAS webshop koppeling. Voor WooCommerce is er de WooCommerce AFAS koppeling. Vertel welke Profit-versie en welke authenticatie je nu gebruikt, dan zie je welke connectoren en welke stappen nodig zijn.

Veelgestelde vragen

Wie maakt de app connector en de GetConnectoren aan?

De beheerder van jouw AFAS-omgeving, onder Algemeen, Beheer, App connector. Die kiest welke GetConnectoren en UpdateConnectoren erin komen, koppelt een gebruikersgroep en zet eventueel een IP-restrictie. Wij leveren vooraf de lijst met GetConnectoren, UpdateConnectoren en velden die de koppeling nodig heeft.

Wanneer stoppen classic tokens bij AFAS?

Bestaande classic tokens krijgen sinds september 2026 een einddatum. AFAS noemt op 3 oktober 2026 twee data: 15 februari 2027 in het helpcentrum en 1 mei 2027 in de ontwikkelaarsdocumentatie, die op 30 september 2026 is bijgewerkt. Na 31 augustus 2027 werken app connectoren met een classic token niet meer. Vanaf Profit 9 zet de beheerder een bestaande app connector op Hybride of OAuth zonder hem opnieuw in te richten.

Heeft AFAS een limiet op het aantal aanroepen?

AFAS noemt geen aantal per minuut maar hanteert een fair-use policy. De grenzen zitten in omvang en tijd: een aanroep is maximaal 75 MB, na 900 seconden volgt een time-out, een URL met filter is maximaal 2.048 tekens, en het advies is velden maal regels per aanroep onder 150.000.

Kan ik een meegeleverde GetConnector zoals Profit_Article gebruiken?

Dat kan, maar AFAS raadt zelf aan een eigen GetConnector te maken met alleen de velden die de koppeling nodig heeft. Profit_Article heeft 19 velden; een eigen GetConnector met 10 velden haalt per aanroep bijna twee keer zoveel regels op binnen dezelfde grens van 150.000.

Heeft AFAS webhooks?

Alleen voor dossieritems en workflows. Voor artikelen, voorraad, relaties en orders vraagt de koppeling op vaste momenten op wat er gewijzigd is, met een filter op het veld gewijzigd op en operator 2 (groter of gelijk).

Vertel wat je nodig hebt

Vertel welke systemen je gebruikt en wat je wilt verbeteren. Je krijgt binnen één werkdag een persoonlijk antwoord. We helpen je de werkzaamheden helder te krijgen en spreken de prijs en planning af voordat je iets toezegt.

  • Je weet de prijs en de doorlooptijd voordat je iets toezegt
  • Wij zoeken uit welke koppeling het werk uit handen neemt
  • Wij verzorgen de bouw, hosting, bewaking en het onderhoud
  • Je team krijgt minder overtypwerk en minder uitzoekwerk

Leveranciers, producten, orders per dag, een ruwe schatting is prima.

Of mail direct: carsten@syncmyshop.com