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:

MethodeGebruikVeiligheidVoorbeelden
API-keyStatische sleutel in headerMatig — verlopen niet automatischBettyBlocks, veel SaaS-platforms
Basic AuthUsername + password Base64-encodedLaag — nooit gebruiken over HTTPVerouderde systemen
OAuth 2.0 (client credentials)Machine-to-machine, geen gebruikerHoogAzure AD, Google, interne APIs
OAuth 2.0 (authorization code)Gebruikersaccount-gebaseerdHoogExact Online, AFAS
Bearer tokenToken in Authorization headerHoog (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:

headers = {
    "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:

# Geneste JSON-response
{
  "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:

import pandas as pd

# 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 of cursor-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:

from sqlalchemy import create_engine

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:

SysteemKoppeltypeAuthenticatie
Exact OnlineREST / ODataOAuth 2.0 (authorization code)
AFASREST GetConnectorsAPI-token + App Connector
OnsDB (Nedap Ons)Directe SQL (SQL Server)SQL Service Account
WiseTech LSPDirecte SQL (SQL Server)SQL Service Account
BettyBlocksREST / GraphQLAPI-key
Generieke REST APIRESTAPI-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-koppeling

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