Werkritme
Techniek en naslag

De AFAS-connectoren die je in de praktijk nodig hebt

Welke AFAS Get- en UpdateConnectoren u nodig hebt voor orders, facturen en uren, met velden, autorisatie en waar ze u in de steek laten.

28 augustus 2026 · Jeffrey · 14 min lezen

Een naslagpagina voor wie een koppeling met AFAS Profit bouwt of beheert: welke connectoren u werkelijk aanraakt bij order-, factuur- en urenstromen, welke velden erin moeten, wat de beheerder klaarzet en waar elke connector u in de steek laat. Alles is op 28 augustus 2026 nagelezen op help.afas.nl, met de bron bij de bewering. Wat wij uit ervaring toevoegen staat onder "in de praktijk"; wat niet in de AFAS-documentatie staat, heet hier niet gedocumenteerd.

Eerst de bouwstenen

Een GetConnector haalt gegevens op en is gebaseerd op een gegevensverzameling die u zelf in Profit inricht; een UpdateConnector voegt toe, wijzigt of verwijdert en heeft een vaste, door AFAS bepaalde structuur (Connector - externe software koppelen). Van de speciale connectoren komt alleen de SubjectConnector (bijlagen bij dossieritems) hieronder terug.

begripwat het isbron
App connectorDe autorisatielaag: koppelt een gebruikersgroep, bevat de tokens en bepaalt welke Get- en UpdateConnectoren aangeroepen mogen worden.App connector
Token (classic)Sleutel voor de combinatie omgeving / app connector / gebruiker / device. Vorm: <token><version>1</version><data>…</data></token>.Tokens
Authorization-headerAuthorization: AfasToken <base64 van de token-XML>, inclusief de XML-tags.REST API voor ontwikkelaars
OAuth 2.1Authorization code flow of client credentials. De client secret is na aanmaken niet meer op te vragen, wel te vernieuwen.Eigen app connector inrichten (OAuth)
Basis-URLhttps://12345.rest.afas.online/profitrestservices voor productie (omgevingsnaam begint met O); resttest voor test (T), restaccept voor acceptatie (A); 12345 is het deelnemersnummerURL's van REST Services
Metainfo<endpoint>/metainfo/get/<GetConnectorNaam> geeft velden, typen, lengtes en codetabellen terug.GetConnector (REST/JSON)

Twee data voor de agenda: bestaande classic tokens krijgen in september 2026 een einddatum van 15 februari 2027, en app connectoren op classic tokens moeten uiterlijk 31 augustus 2027 op OAuth staan (Overstappen van classic tokens op OAuth). Wie nu bouwt, begint met OAuth.

Wat de beheerder klaarzet

De inrichting in Profit, zoals AFAS die zelf beschrijft in Eigen app connector inrichten in vogelvlucht en Beveiliging van connectoren:

stapwaarwat
1Autorisatie toolEen eigen gebruikersgroep per externe applicatie. AFAS: "Vermijd het gebruiken van gebruikersgroepen zoals 'Iedereen'."
2Autorisatie toolEen systeemgebruiker per app connector; Profit en InSite uitvinken, alleen lid van die ene groep.
3Algemeen / Beheer / App connector, NieuwOmschrijving, authenticatietype OAuth (achteraf niet te wijzigen), gebruikersgroep, flow (Code, Client credentials of beide); bij client credentials de vaste gebruiker.
4Eigenschappen app connector, tabblad connectorenGetConnectoren en UpdateConnectoren één voor één aanvinken. Wat hier niet staat, is niet aan te roepen.
5Eigenschappen app connectorClient id en client secret kopiëren; IP-restricties instellen als de aanroeper een vast adres heeft.
6Autorisatie tool, tabblad AutorisatieFilterautorisatie uitdelen aan de groep. Niet autoriseren voor functies, tabbladen of acties; de groep is alleen voor API-toegang.

Stap 6 is niet cosmetisch: een GetConnector geeft records "voor zover dit is toegestaan op basis van de filterautorisatie" (App connector), en KnSubject wijzigt of verwijdert alleen dossieritems waar de connector-gebruiker via filterautorisatie rechten op heeft (KnSubject). Een koppeling die in test alles ziet en in productie de helft, heeft hier het verschil zitten.

GetConnectoren: wat voor alle drie de stromen geldt

Een GetConnector heeft geen vaste velden. De beheerder maakt hem aan via Algemeen / Uitvoer / Beheer / GetConnector op een gegevensverzameling en kiest de velden; de namen in de kolom Veld worden de namen in het resultaat, en de gegevensverzameling is na aanmaken niet meer te wisselen (GetConnector toevoegen). Welk veld u ook mist: de klant zet het er zelf in, en de metainfo-aanroep is de enige betrouwbare manier om te zien wat erin zit.

parametergedragbron
skip, takeZonder deze parameters "worden altijd de eerste 100 regels teruggegeven". -1 en -1 haalt alles op, door AFAS zelf afgeraden.REST API voor ontwikkelaars
omvang per paginaAdvies: aantal kolommen × aantal regels < 150.000.GetConnector (REST/JSON)
orderbyfieldidsAltijd sorteren bij skip/take, bij voorkeur op een sleutelveld; - voor aflopend. "De sortering zou anders kunnen wijzigen tijdens het ophalen van de data."idem
filterfieldids, filtervalues, operatortypesKomma = EN, puntkomma = OF. Operators: 1 gelijk, 2 ≥, 3 ≤, 4 >, 5 <, 6 bevat, 7 ongelijk, 8 leeg, 9 niet leeg, 10 begint met, 11 bevat niet, 12 begint niet met, 13 eindigt met, 14 eindigt niet met, 15 snelfilter.idem
komma in filterwaarde"Zitten er komma's of puntkomma's in de filterwaarden, gebruik dan een complex filter."idem
datum/tijd in filterNotatie jjjj-mm-ddTuu:mm:ss; voorbeeld in de REST-documentatie 2019-01-01T00:00.XML-filter in GetConnector
tijdzone van filtersNiet gedocumenteerd op 28 augustus 2026. Alleen bij webhooks schrijft AFAS dat het mutatietijdstip in UTC is en "kan afwijken van de tijd op je lokale machine".Webhooks
time-outEen verbinding die "langer dan ongeveer 15 minuten actief is" loopt op een time-out.REST API voor ontwikkelaars
parallelle aanroepenMaximaal zes tegelijk.Performance GetConnector
URL-lengteMaximaal 2.048 tekens; totale omvang van een call maximaal 75 MB.REST API voor ontwikkelaars

Een gepagineerde aanroep ziet er dan zo uit (fictieve deelnemer, fictieve connectornaam):

`` GET https://12345.resttest.afas.online/profitrestservices/connectors/Wr_Verkooporders ?skip=0&take=500 &orderbyfieldids=Ordernummer &filterfieldids=Orderdatum%2CStatus &filtervalues=2026-08-01T00%3A00%2C1 &operatortypes=2%2C1 Authorization: AfasToken PHRva2VuPjx2ZXJzaW9uPjE8L3ZlcnNpb24+PGRhdGE+...PC9kYXRhPjwvdG9rZW4+ ``

Doorlopen tot er een lege set terugkomt, zoals AFAS het zelf beschrijft.

Gewijzigd en verwijderd ophalen

Voor "alleen wat er sinds gisteren veranderde" zet de beheerder de logvelden Toevoegdatum en Wijzigingsdatum uit de sectie Logging in de gegevensverzameling. AFAS: "In de audit-velden zie je alleen de laatste wijziging, niet de voorgaande wijzigingen"; >=[Vandaag] filtert op 00:00 uur van vandaag; betaal- en afletterstatus van facturen vallen erbuiten (Gewijzigde gegevens opvragen).

Verwijderingen ziet u er niet in. Daarvoor is een GetConnector op het logboek nodig, met Type log = D en Log datum als filter, en "Logs worden ingesteld per omgeving": wat in test aanstaat, staat in productie niet vanzelf aan (Verwijderde gegevens opvragen).

UpdateConnectoren: wat voor alle drie de stromen geldt

De REST-kant is eenvormig (UpdateConnector (REST/JSON)): POST <endpoint>/connectors/<Connector> voegt toe, PUT wijzigt, DELETE <endpoint>/connectors/<Connector>/<Element>/@<Sleutelveld>/<waarde> verwijdert. De body is altijd { "<Connector>": { "Element": { "Fields": {…}, "Objects": {…} } } }. Speciale tekens moeten in UTF-8; anders komen er vraagtekens in Profit.

responscodebetekenis volgens AFASbron
200 / 201Gelukt; bij 201 staat het aangemaakte record (bijvoorbeeld een id) in de body.Responscodes
400Verzoek voldoet niet aan de specificatie: parameter, URL, token of app connector klopt niet.idem
401Niet geauthenticeerd; ook bij een verlopen token of een verkeerd webserviceadres.idem
500Verbinding gelukt, verzoek inhoudelijk afgekeurd door de business rules; detail in het Profit-logboek en in de header X-Profit-Error (base64).idem, REST API
503Webservice niet beschikbaar (onderhoud, verstoring); opnieuw proberen lukt meestal.idem

Verplichte velden staan niet als lijst op de helppagina's maar in de XML-voorbeeldbestanden en in AFAS Connect en API Docs. Hieronder staan alleen de velden die de helppagina met naam noemt.

Orders

connectordoelvelden die de documentatie noemtwat er ontbreektautorisatie
GetConnector op verkooporders (eigen naam)Orders en orderregels lezen, status volgenWat de beheerder erin zet; niets is standaardAlles wat niet is toegevoegd; verwijderde orders (zie logboek)In app connector aangevinkt, filterautorisatie op de groep
FbSalesVerkooporders toevoegen, wijzigen, verwijderenKop: DbId verkooprelatie, OrNu ordernummer, OrDa orderdatum, SoQu offertenummer, DlAd afleveradres (Adres ID), ExAd omschrijving, status 0 onderhanden of 1 definitief bij insert. Regels: VaIt itemtype, ItCo itemcode, QuUn aantal, Unit, War magazijn, CoPr kostprijsVrijgeven (dat is FbFreeOrder); afhandelen (FbSettleOrder)UpdateConnector in app connector
FbPurchInkooporders toevoegen, wijzigen, verwijderenDlad afleveradres (Adres Id uit de adressentabel), DlDa afwijkende leverdatum op regelniveau, GuLi regel-GUID, OrNu, BcDa, InSc/AmTo voor termijnschema'sGeen basisorder voor een termijnschema kiezen; verplichte kopvelden niet als lijst gedocumenteerdidem
FbSettleOrderOrder op status Afgehandeld zettenOrNu verplicht, Unit administratie optioneel, VaOt ordertype (03 verkooporder, 04 pakbon, 13 inkooporder, 14 ontvangst, 21 productieorder, e.a.)Alleen INSERT; terugzetten is niet gedocumenteerdidem

Uit de FbSales-pagina (FbSales): "Een insert van een verkooporder zonder regels en zonder SoQu zal afgekeurd worden." Met SoQu neemt Profit de hele offerte met alle regels over. Regels wijzigt u op artikelcode of op GUID; verwijderen kan per order of per regel. Het afleveradres is een Adres ID uit de debiteurweergave, anders krijgt u "De ingevulde waarde bij 'Afleveradres' bestaat niet." Voor FbPurch geldt hetzelfde met Dlad, en de afwijkende leverdatum is alleen te wijzigen "als de regelstatus niet op Afgehandeld staat" (FbPurch).

In de praktijk: wijzig regels op GUID, niet op artikelcode. Of een PUT de niet-meegestuurde regels laat staan is niet beschreven; dat is de eerste test in de testomgeving, voordat er een productieorder wordt aangeraakt.

Facturen

connectordoelvelden die de documentatie noemtwat er ontbreektautorisatie
GetConnector op verkoop- of inkoopfacturen (eigen naam)Facturen, openstaande posten en status lezenWat de beheerder erin zetBetaal- en afletterstatus komen niet mee via de auditvelden; verwijderde facturen via de verzameling met factuurnummer, klantreferentie en annuleringsindicatorGetConnector in app connector, filterautorisatie
FbDirectInvoiceBalie-/directfacturen incl. creditfacturen toevoegen, wijzigen, verwijderenRegels wijzigen op artikelcode of GUID; V1Cd t/m V5Cd verbijzondering alleen bij INSERT; FbOrderLocationLines voor magazijnlocatie, aantallen dan in basiseenheidOf en wanneer de factuur wordt gejournaliseerd: niet op de helppaginaUpdateConnector in app connector
FiEntriesFinanciële mutaties toevoegen of verwijderen (waaronder inkoopfacturen als boeking)Year, Peri, JoCo dagboek, VaAs 1 grootboek / 2 debiteur / 3 crediteur, AcNr, EnDa, BpDa, InId factuurnummer, Ds, AmDe/AmCr, VaId btw; structuur FiEntryParFiEntries, subobjecten FiPrjEntries, FiDimEntriesWijzigen: "Mutaties wijzigen" staat als niet mogelijk; verwijzing naar FiInvoiceidem
FiInvoiceBepaalde velden van een bestaande in- of verkoopfactuur wijzigenSleutel UnId administratie + InId factuurnummer; alleen UPDATEWelke velden precies: niet op de helppaginaidem
FiElectronicInvoicePurchaseInkoopfactuur als e-factuur aanleveren: UBL, PDF, of een losse PDFBestanden in base64; UnId administratie; alleen INSERTVerwerking loopt via Scan & Herken; wat daar niet wordt herkend, is niet via deze connector te sturenidem
KnSubject met type -5Inkoopfactuur als dossieritem met bijlageZie de sectie dossieritemsBoeking zelfidem

Vier regels uit de FiEntries-documentatie (FiEntries): "Je kunt met deze UpdateConnector alleen complete boekingen aanleveren (met alle benodigde debet- en creditregels)"; "Crediteurenfacturen mogen alleen worden geboekt in een inkoopboek"; "Je kunt maximaal 1.000 regels per journaalpost aanbieden"; en "Er wordt geen controle gedaan op de geldigheid van btw-codes." Een verkeerde btw-code gaat er dus in en komt er pas bij de aangifte weer uit.

In de praktijk is FiEntries of FiElectronicInvoicePurchase de keuze tussen zelf coderen en laten herkennen. FiEntries verlangt dat de koppeling grootboek, btw en kostenplaats al kent; de e-factuurconnector laat Profit dat doen, in de fiatteerstroom die de klant al heeft. Wie beide door elkaar gebruikt krijgt dubbele facturen.

Uren

connectordoelvelden die de documentatie noemtwat er ontbreektautorisatie
GetConnector op nacalculatie (eigen naam)Uren, accorderingsstatus en factureerbaarheid lezenWat de beheerder erin zet; verwijderde regels via de speciale verzameling met regelnummer, GUID en aanmaaktijdstipWat niet is toegevoegdGetConnector in app connector, filterautorisatie
PtRealizationNacalculatieregels toevoegen, wijzigen, verwijderenEmId medewerker, PrId project, PrSt fase, DaTi datum, StId werksoort, VaIt 1 werksoort / 2 artikel / 6 kosten, Qu aantal, BeTi/EnTi begin- en eindtijd, Ch doorbelasten, Id regelnummer bij delete; CoPr, MoId, CoTy, CcIdVerplichte velden niet als lijst gedocumenteerdUpdateConnector in app connector
PtRealizationWeekNacalculatie per weekMedewerker en datum verplicht; Id bij update en deleteVerwerkte weken: "Is de week verwerkt, dan kan je de nacalculatie niet meer bewerken"idem

Uit de PtRealization-documentatie (PtRealization): over Ch, doorbelasten: "Als dit veld niet wordt aangeleverd, wordt de waarde 'True' toegepast", met als uitzondering projecten met termijnen. "Het veld Aantal wordt niet berekend op basis van de begin- en eindtijd, maar overgenomen zoals je dit aanlevert." En: "De nacalculatieregel kan na accordering aangepast worden. De nacalculatieregel kan na accordering verwijderd worden." Dat geldt ook voor regels die uit verlofaanvragen en verzuimmeldingen zijn ontstaan.

Bij PtRealizationWeek staat een eigenaardigheid die u nergens anders leest (PtRealizationWeek): bij eindtijd 00:00 gaat Profit de eindtijd alsnog berekenen, "en dit levert soms niet de goede uitkomst op. Als workaround kun je 23:59 uur gebruiken."

Dossieritems

Dossieritems zitten in alle drie de stromen: de PDF bij de inkooporder, de getekende urenstaat, de scan van de inkoopfactuur.

connectordoelvelden die de documentatie noemtwat er ontbreektautorisatie
KnSubjectDossieritem toevoegen, wijzigen, verwijderen, met bijlagenStId dossieritemtype, Ds onderwerp, Da datum; KnSubjectLink: SfTp type bestemming (2 medewerker, 4 verkooprelatie, 11 inkooprelatie, 16 inkooprelatie + contact, 17 sollicitant), SfId bestemming, BcId organisatie/persoon, DoCRM, PjId project; KnSubjectAttachment: FileName zonder pad, FileStream base64, maximaal 75 MB; @SbId als sleutel bij wijzigen/verwijderenAlleen eigen dossieritemtypen en type -5 (inkoopfactuur); "dossieritems die zich in een workflow bevinden" zijn niet te verwijderenUpdateConnector in app connector én filterautorisatie op het dossieritem
SubjectConnectorBijlage van een dossieritem ophalen<endpoint>/subjectconnector/<SbId>/<GUID>; ReactieId voor bijlagen bij reactiesMoet apart in de app connector aangezet wordenSpeciale connector in app connector
WebhooksMelding bij toevoegen, wijzigen, verwijderen van dossieritems en workflowtakenEindpunt-URL en wachtwoord per app connector; tijdstempel in UTCNiet voor orders, facturen of uren zelfApp connector

Een correct gevormd verzoek zoals AFAS het documenteert, voor een inkoopfactuur-PDF als dossieritem bij een inkooprelatie. Alle nummers zijn fictief.

``` POST https://12345.resttest.afas.online/profitrestservices/connectors/KnSubject Authorization: AfasToken <base64> Content-Type: application/json;charset=utf-8

{ "KnSubject": { "Element": { "Fields": { "StId": -5, "Ds": "Inkoopfactuur 2026-0418 Leverancier B.V.", "Da": "2026-08-28" }, "Objects": [ { "KnSubjectLink": { "Element": { "Fields": { "DoCRM": true, "SfTp": 11, "SfId": "300042", "BcId": "300042" } } } }, { "KnSubjectAttachment": { "Element": { "Fields": { "FileName": "inkoopfactuur-2026-0418.pdf", "FileStream": "JVBERi0xLjcKJeLjz9MKMSAwIG9iago8PC9UeXBlL0NhdGFsb2c..." } } } } ] } } } ```

Bij succes komt er een 201 terug met het aangemaakte dossieritem; wijzigen gaat via PUT met "@SbId": <nummer> in het element, verwijderen via DELETE …/connectors/KnSubject/KnSubject/@SbId/<nummer> (KnSubject, UpdateConnector REST).

Valkuilen die u pas kent als u het gedaan hebt

Het gedrag staat telkens in de documentatie; niemand leest het voordat het misgaat.

De stille 100. Een GetConnector zonder skip en take geeft geen fout; hij geeft de eerste honderd regels en zwijgt (REST API). Een koppeling die in test met 60 orders werkt en in productie bij order 101 ophoudt, heeft dit. Wie dan -1/-1 invult, loopt bij een grote tabel tegen de 15 minuten of de 150.000 aan. Pagineren, met sortering op een sleutelveld.

FiEntries kent geen verschil, alleen een boeking. Een inkoopfactuur die al in Profit staat is met FiEntries niet te corrigeren: alleen toevoegen en verwijderen, en wat u toevoegt moet als geheel in evenwicht zijn (FiEntries). Een koppeling die "de gewijzigde regel opnieuw stuurt" maakt een tweede boeking. Herstel is verwijderen op factuurnummer en opnieuw aanleveren, of de paar velden van FiInvoice.

Doorbelasten staat standaard aan. Uren via PtRealization zonder Ch zijn factureerbare uren, ook de interne (PtRealization). En Qu wordt niet uit begin- en eindtijd berekend: 09:00 tot 17:00 met aantal 0 is acht uur in de tijden en nul op de factuur. Reken het aantal zelf en stuur Ch altijd mee.

Het token is er vier. Een token geldt voor de combinatie omgeving, app connector, gebruiker en device (Tokens); test, acceptatie en productie hebben elk een eigen basis-URL (URL's). Een productietoken op de test-URL geeft een 401 die niet zegt welke van de vier niet klopt. Zet de omgevingsletter (O, T, A) naast het token in de configuratie.

De komma in de klantnaam. Filterwaarden gaan de URL in met %2C en %3B als scheidingsteken; "Janssen, Henk" wordt twee filters (GetConnector REST). AFAS verwijst dan naar een complex filter. Filter op codes, niet op namen.

Wat u hier niet mee kunt, en waar maatwerk begint

De connectoren doen wat in de tabellen staat en niets meer. Daarbuiten valt:

  • Een GetConnector geeft alleen de velden die de beheerder heeft toegevoegd, en de gegevensverzameling ligt na aanmaken vast. Een veld dat de verzameling niet kent is inrichting aan de Profit-kant, geen koppelingswerk.
  • Verwijderingen komen alleen uit het logboek, en dat moet per omgeving aanstaan.
  • Tijdzonegedrag van datumfilters is niet gedocumenteerd; wie rond middernacht op "gisteren" filtert, test dat eerst in de eigen omgeving.
  • Financiële mutaties zijn niet te wijzigen; verwijderen en opnieuw boeken is de enige weg.
  • Verplichte velden van FbDirectInvoice en FbPurch staan niet op de helppagina, alleen in het XML-voorbeeld en in AFAS Connect.
  • Of een PUT op FbSales de niet-meegestuurde regels laat staan, is nergens beschreven.

Maatwerk begint waar de koppeling moet beslissen: welke regel bij welke order hoort, welk grootboek bij welke leverancier, wat er gebeurt met een order die in Profit al is vrijgegeven terwijl het bronsysteem hem nog wijzigt. Dat is geen connector-vraag maar een vertaalvraag, en die hoort in de laag tussen de systemen. Hoe wij die laag inrichten staat op /koppelingen/afas/ en op /koppelingen/; de technische uitgangspunten op /techniek/.

Dit is de stand van de AFAS-documentatie op 28 augustus 2026. AFAS verwijst voor de volledige specificaties naar AFAS Connect en API Docs; wijkt een veld daar af van deze pagina, dan heeft AFAS gelijk.

Bronnen

Begin met één proces

Vertel welk werk bij u het vaakst wordt overgetypt. Blijkt automatiseren daar geen goed idee, dan hoort u dat in het eerste gesprek – vóór er een factuur is.

Laat uw proces beoordelen

Kennismaking is gratis en vrijblijvend. Wilt u het onderbouwd? Dan is de Automation Check €295 – verrekend als u binnen 30 dagen laat bouwen.