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.
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