Wat is een API-koppeling voor Power BI?
Een API-koppeling voor Power BI is het proces waarbij data uit een extern systeem — via een Application Programming Interface (API) — wordt opgehaald en beschikbaar gemaakt in Power BI voor rapportage. In de professionele aanpak verloopt dit niet direct (Power BI → API), maar via een tussenlaag:
Bronsysteem REST API → Python ETL-pipeline → Azure SQL → Power BI Import mode
De ETL-tussenlaag is essentieel: zij beheert authenticatie, verwerkt paginering, valideert de data, en slaat historische snapshots op. Power BI ziet alleen de opgeschoonde data in Azure SQL — niet de complexiteit van de API-communicatie.
REST API's: de meest voorkomende standaard
De meeste moderne softwareplatforms bieden een REST API: Exact Online, AFAS, BettyBlocks, Salesforce, HubSpot, en honderden andere systemen. REST staat voor Representational State Transfer en is een architectuurstijl waarbij:
- Endpoints zijn aangesproken via HTTP-methoden: GET (ophalen), POST (aanmaken), PUT/PATCH (bijwerken), DELETE (verwijderen)
- Data wordt uitgewisseld in JSON-formaat
- Endpoints zijn resource-georiënteerd:
/api/v1/customers,/api/v1/invoices - Stateless: elke request bevat alle benodigde informatie (inclusief authenticatietokens)
OData (Open Data Protocol) is een specifieke variant van REST die veel wordt gebruikt in Microsoft-ecosystemen. Exact Online en AFAS gebruiken OData. OData biedt standaard queryopties: $filter, $select, $orderby, $skip, $top — handig voor filtering en paginering.
Authenticatie: API-key, OAuth 2.0 en bearer tokens
API-authenticatie bepaalt wie toegang heeft tot de API. De meest voorkomende methoden:
| Methode | Gebruik | Veiligheid | Voorbeelden |
|---|---|---|---|
| API-key | Statische sleutel in header | Matig — verlopen niet automatisch | BettyBlocks, veel SaaS-platforms |
| Basic Auth | Username + password Base64-encoded | Laag — nooit gebruiken over HTTP | Verouderde systemen |
| OAuth 2.0 (client credentials) | Machine-to-machine, geen gebruiker | Hoog | Azure AD, Google, interne APIs |
| OAuth 2.0 (authorization code) | Gebruikersaccount-gebaseerd | Hoog | Exact Online, AFAS |
| Bearer token | Token in Authorization header | Hoog (afhankelijk van tokentype) | Meeste moderne APIs |
De gouden regel voor API-keys: nooit in de URL, altijd in de header. Een API-key in de URL wordt gelogd door webservers, proxies en browsers — een ernstig beveiligingslek. De correcte manier:
"X-API-Key": api_key, # Of: "Authorization": f"Bearer {token}"
"Content-Type": "application/json"
}
JSON-verwerking en gegevensextractie
REST APIs retourneren JSON. Eenvoudige JSON-responses zijn vlak (een array van objecten), maar in de praktijk zijn responses vaak genest:
{
"data": {
"results": [
{
"id": "12345",
"customer": { "id": "C001", "name": "Bol.com" },
"lines": [ {"product": "P1", "qty": 10}, {"product": "P2", "qty": 5} ]
}
]
}
}
Voor geneste structuren gebruik je pd.json_normalize() om de data plat te slaan naar een DataFrame:
# Flatten geneste JSON
df = pd.json_normalize(
records,
record_path=["lines"],
meta=["id", ["customer", "id"], ["customer", "name"]],
meta_prefix="order_"
)
Paginering: hoe verwerk je grote datasets?
APIs retourneren zelden alle records in één response. Paginering beperkt het aantal records per response om de server niet te overbelasten. De meest voorkomende pagineringsvormen:
- Cursor-based (Exact Online, modern REST): Response bevat een
__next-link ofcursor-waarde voor de volgende pagina. Meest robuust — volgorde is stabiel ook als records worden toegevoegd. - Offset-based (AFAS GetConnectors): Je vraagt pagina N op via
?skip=100&top=100. Eenvoudig maar instabiel bij concurrent inserts. - Link-header (GitHub API, moderne REST): Paginering-URLs staan in de
Link-responseheader. - Geen paginering: Sommige APIs retourneren alles in één response. Problematisch bij grote datasets — gebruik datum-filters als workaround.
Van API-response naar Azure SQL
De verwerkte data (pandas DataFrame) wordt geladen naar Azure SQL via SQLAlchemy. Voor productie gebruik je een UPSERT-patroon (MERGE) om duplicaten te voorkomen bij herhaalde laadpogingen:
connection_string = (
f"mssql+pyodbc://{server}/{database}"
f"?driver=ODBC+Driver+18+for+SQL+Server"
f"&Authentication=ActiveDirectoryMsi" # Managed Identity
)
engine = create_engine(connection_string)
df.to_sql("staging_orders", engine, if_exists="replace", index=False)
Let op de Authentication=ActiveDirectoryMsi: dit laat de Azure Function verbinding maken met Azure SQL via een Managed Identity, zonder wachtwoord of connection string met credentials. Dit is de veiligste en meest onderhoudsvriendelijke aanpak.
Veelgebruikte API-koppelingen die Argus BI bouwt
Argus BI heeft ervaring met de volgende API-koppelingen in productieomgevingen:
| Systeem | Koppeltype | Authenticatie |
|---|---|---|
| Exact Online | REST / OData | OAuth 2.0 (authorization code) |
| AFAS | REST GetConnectors | API-token + App Connector |
| OnsDB (Nedap Ons) | Directe SQL (SQL Server) | SQL Service Account |
| WiseTech LSP | Directe SQL (SQL Server) | SQL Service Account |
| BettyBlocks | REST / GraphQL | API-key |
| Generieke REST API | REST | API-key / Bearer token / OAuth |
API-koppeling nodig voor uw systeem?
Argus BI bouwt betrouwbare API-koppelingen voor Exact Online, AFAS, OnsDB, WiseTech LSP en andere systemen. Van authenticatie tot Power BI dashboard — volledig ontzorgd.
Bespreek je API-koppelingVeelgestelde vragen
Welke API-standaarden worden ondersteund?
Argus BI bouwt koppelingen voor REST APIs, OData APIs (Exact Online, AFAS) en directe SQL-verbindingen (OnsDB, WiseTech LSP). SOAP-webservices kunnen ook worden ondersteund maar vereisen meer werk. GraphQL-APIs zijn koppelbaar via dezelfde Python-aanpak als REST.
Wat als een API geen paginering ondersteunt maar miljoenen records heeft?
Als een API geen paginering ondersteunt, zijn er twee opties: (1) gebruik datum-filters om de data per periode op te halen en sla elke batch op in Azure SQL; (2) vraag de API-leverancier om paginering te implementeren. Als alternatief kan een directe SQL-verbinding op de onderliggende database soms meer controle geven dan de API.
Hoe beveilig je API-credentials in een Python-koppeling?
API-credentials worden nooit hardcoded in de Python-code. De standaardaanpak van Argus BI is Azure Key Vault: credentials worden als secrets opgeslagen in Key Vault, en de Azure Function haalt ze op via een Managed Identity (geen wachtwoord in de code). Dit is de Microsoft-aanbevolen aanpak voor productieomgevingen.
Kan een API-koppeling ook XML verwerken?
Ja. Oudere SOAP-webservices retourneren XML. Python's xml.etree.ElementTree of de lxml-bibliotheek kan XML parsen en omzetten naar een pandas DataFrame, waarna het dezelfde laadstrategie naar Azure SQL volgt als JSON-gebaseerde APIs. XML-koppelingen zijn wel complexer en trager dan JSON REST APIs.