Terug naar hoofdinhoud

Web Services API in Joomla

16 juni 2026

De meeste mensen gebruiken Joomla via een browser: ze loggen in, klikken wat rond in het beheergedeelte en bewerken inhoud via een formulier. Maar Joomla kan ook worden aangestuurd door een ander programma, zonder browser en zonder menselijke tussenkomst. Een mobiele app, een tweede website of een nachtelijk script kan je inhoud rechtstreeks lezen en schrijven. De toegang tot dit alles is de Web Services API, de ingebouwde REST-interface van Joomla.

Dit artikel legt uit hoe de REST Web Services API van Joomla echt werkt. Het behandelt de basis voor eigenaren en redacteuren, de instellingen voor beheerders en de technische details voor ontwikkelaars. Je leert wat de API is, hoe je hem aanzet, hoe een verzoek bewijst wie het is, hoe je data leest en schrijft met eenvoudige curl-aanroepen, en hoe de routing onder de motorkap werkt zodat je je eigen endpoints kunt toevoegen.

Hetzelfde Joomla, maar zonder browser: elk artikel, elke gebruiker en elk menu wordt een URL die een programma kan aanroepen.

Het doel is simpel: je de Web Services API goed genoeg laten begrijpen om hem veilig in te schakelen, met vertrouwen aan te roepen en uit te breiden wanneer dat nodig is.

1. De basis

1.1 Wat is de Web Services API?

De Web Services API is een tweede voordeur naar je Joomla-site. In plaats van HTML-pagina's voor een browser terug te geven, geeft hij kale data terug die een programma kan lezen. Een verzoek vraagt om iets (bijvoorbeeld "geef me alle gepubliceerde artikelen") en Joomla antwoordt met gestructureerde JSON in plaats van een opgemaakte webpagina.

Het is een REST-API. REST betekent dat je werkt met resources (artikelen, gebruikers, menu-items) via gewone HTTP-methodes: GET om te lezen, POST om aan te maken, PATCH om bij te werken en DELETE om te verwijderen. Hetzelfde idee dat je al kent uit de backend (lijst, weergave, opslaan, verwijderen) wordt afgebeeld op deze vier werkwoorden.

1.2 Waar het zich bevindt

De API heeft zijn eigen applicatie, los van de publieke website en de administrator-backend. Hij is bereikbaar via de map /api/, en elke endpoint begint met een versie-prefix:

https://example.test/api/index.php/v1/content/articles

Joomla levert drie applicaties die een codebase en een database delen:

ApplicatieMapBedient
Site / De publieke website (HTML).
Administrator /administrator/ De backend (HTML).
API /api/ De Web Services API (JSON).

1.3 Waarom je hem zou gebruiken

De API is handig wanneer iets anders dan een persoon je content nodig heeft:

  • Een mobiele app toont je artikelen zonder HTML te scrapen.
  • Een andere site haalt automatisch je laatste nieuws binnen.
  • Een script importeert honderden artikelen of gebruikers in een keer.
  • Een extern systeem (een CRM, een webshop, een dashboard) houdt data synchroon met Joomla.

Alles wat je met de hand in de backend kunt doen, laat de API een programma voor je doen, herhaaldelijk en betrouwbaar.

Naar boven

2. JSON:API - het formaat dat Joomla spreekt

2.1 Een gedeelde afspraak

Joomla verzint geen eigen vorm voor de antwoorden. Het volgt JSON:API, een publieke afspraak over hoe een REST-antwoord eruit moet zien. Omdat het formaat een standaard is, begrijpen veel bestaande clientbibliotheken het al, en de structuur is hetzelfde voor artikelen, gebruikers of welke andere resource dan ook.

2.2 De vorm van een enkel item

Een verzoek om een artikel geeft een data-object terug met een type, een id en een attributes-blok dat de eigenlijke velden bevat:

{
  "links": { "self": "https://example.test/api/index.php/v1/content/articles/1" },
  "data": {
    "type": "articles",
    "id": "1",
    "attributes": {
      "title": "Welcome to my site",
      "alias": "welcome-to-my-site",
      "state": 1,
      "catid": 2,
      "introtext": "..."
    }
  }
}

2.3 De vorm van een lijst

Een lijstverzoek geeft data terug als een array van die objecten, plus een meta-blok met het totale aantal en links om door de resultaten te bladeren. Als je deze vorm een keer kent, kun je elke lijst lezen die de API teruggeeft, ongeacht de resource.

Naar boven

3. De API aanzetten

3.1 De globale schakelaar

De API wordt geregeld in Systeem → Algemene configuratie. De bijbehorende groep instellingen is klein maar belangrijk. Zolang de API niet is ingeschakeld, geeft elke aanroep een foutmelding, wat de veilige standaardinstelling is voor een gloednieuwe site.

3.2 De Web Services-plugins

Elke component stelt zijn endpoints beschikbaar via een Web Services-plugin. Deze plugins zitten in de plugingroep webservices, en elke plugin registreert de routes voor zijn component. Als de plugin voor een component is uitgeschakeld, heeft die component geen API, zelfs als al het andere aanstaat.

Plugin (groep webservices)Stelt beschikbaar
Web Services - Content Artikelen, categorieen, velden, geschiedenis.
Web Services - Users Gebruikers, groepen, toegangsniveaus.
Web Services - Menus Site- en administrator-menu's en items.
Web Services - Banners, Contact, Newsfeeds, Tags, Media, ... De data van de bijbehorende component.

Om ze te vinden, open je Systeem → Beheren → Plugins en filter je de lijst op het type webservices. Schakel alleen de plugins in die je echt nodig hebt.

3.3 De checklist voor de installatie

  1. Schakel in de Algemene configuratie de Web Services API in.
  2. Schakel de webservices-plugin in voor elke component die je wilt bereiken.
  3. Stel authenticatie in (zie de volgende sectie), zodat aanroepen kunnen bewijzen wie ze zijn.
  4. Doe een eerste alleen-lezen GET-aanroep om te bevestigen dat de API antwoordt.
Naar boven

4. Authenticatie - bewijzen wie je bent

4.1 Geen formulier, geen sessie

De website onthoudt je met een sessiecookie nadat je een keer bent ingelogd. De API heeft geen inlogformulier en houdt geen sessie bij. Een programma moet bij elk afzonderlijk verzoek bewijzen wie het is. Joomla ondersteunt twee methodes, beide afgehandeld door de plugingroep api-authentication.

4.2 Token-authenticatie (aanbevolen)

Elke gebruiker krijgt een persoonlijk token, een lange geheime tekenreeks, en stuurt dat als header mee bij elke aanroep. Er verlaat nooit een wachtwoord de server, en een token kan op zichzelf worden ingetrokken zonder het wachtwoord van de gebruiker te wijzigen.

curl -H "X-Joomla-Token: <your-token>" \
     https://example.test/api/index.php/v1/content/articles

# Joomla accepteert ook de standaard Authorization-header (Bearer is hoofdlettergevoelig):
curl -H "Authorization: Bearer <your-token>" \
     https://example.test/api/index.php/v1/content/articles

Om tokens te laten werken, schakel je twee plugins in en genereer je een token:

  1. Schakel de plugin User - Joomla API Token in (deze voegt het tokenveld toe aan gebruikersprofielen).
  2. Schakel de plugin API Authentication - Token in (deze leest de header bij elk verzoek).
  3. Open het profiel van de gebruiker, zoek het tabblad Joomla API Token en genereer een token. Kopieer het meteen: Joomla bewaart alleen een seed, dus het kan het token niet nog eens aan je tonen.

Standaard mogen alleen Super Users een token gebruiken. Verbreed dit via de parameter allowedUserGroups van de plugin User - Joomla API Token, en houd die lijst zo smal als de taak toelaat.

4.3 Basic-authenticatie

De plugin API Authentication - Web Services Basic laat een client bij elk verzoek een gebruikersnaam en wachtwoord meesturen, via standaard HTTP Basic-auth:

curl -u myusername:mypassword \
     https://example.test/api/index.php/v1/content/articles

Het is eenvoudig, maar het stuurt het echte accountwachtwoord bij elke aanroep mee. Gebruik het alleen over HTTPS, en geef voor alles wat langdurig is de voorkeur aan tokens, want een gelekt wachtwoord is veel schadelijker dan een gelekt token dat je kunt intrekken.

4.4 Publieke routes

Een paar routes kunnen als publiek worden gemarkeerd, wat betekent dat ze antwoorden zonder enige inloggegevens. De meeste schrijfroutes zijn nooit publiek. Leesroutes zijn alleen publiek wanneer de Web Services-plugin van de component daarvoor kiest. Behandel publieke toegang als de uitzondering, niet de regel, en stel nooit schrijfmethodes op die manier beschikbaar.

Naar boven

5. Je eerste verzoeken (CRUD)

5.1 De vier werkwoorden

Elke resource volgt hetzelfde patroon. Met artikelen als voorbeeld:

DoelMethodeEndpoint
Alle artikelen oplijsten GET /v1/content/articles
Een artikel lezen GET /v1/content/articles/1
Een artikel aanmaken POST /v1/content/articles
Een artikel bijwerken PATCH /v1/content/articles/1
Een artikel verwijderen DELETE /v1/content/articles/1

5.2 Data lezen

Een leesactie is de veiligste aanroep om mee te beginnen, omdat hij niets verandert:

curl -H "X-Joomla-Token: <your-token>" \
     https://example.test/api/index.php/v1/content/articles/1

5.3 Data aanmaken

Om een artikel aan te maken stuur je een POST met een JSON-body. Vertel Joomla met een Content-Type-header dat de body JSON is:

curl -X POST \
     -H "X-Joomla-Token: <your-token>" \
     -H "Content-Type: application/json" \
     -d '{"title":"My new article","catid":2,"articletext":"Hello world","language":"*"}' \
     https://example.test/api/index.php/v1/content/articles

5.4 Bijwerken en verwijderen

Een PATCH wijzigt alleen de velden die je meestuurt en laat de rest ongemoeid. Een DELETE verwijdert het item (voor artikelen volgt het de normale prullenbak- en verwijderregels van de component):

curl -X PATCH \
     -H "X-Joomla-Token: <your-token>" \
     -H "Content-Type: application/json" \
     -d '{"title":"An updated title"}' \
     https://example.test/api/index.php/v1/content/articles/1

curl -X DELETE \
     -H "X-Joomla-Token: <your-token>" \
     https://example.test/api/index.php/v1/content/articles/1

De gebruiker achter het token behoudt al zijn normale rechten. Als hij een artikel niet in de backend mag bewerken, weigert de API dezelfde bewerking. De API is nooit een manier om de toegangsregels te omzeilen.

Naar boven

6. Lijsten bevragen

6.1 Door resultaten bladeren

Een lijst geeft niet alle rijen in een keer terug. Joomla blader door de resultaten met de offset-notatie van JSON:API. Je bepaalt het venster met twee query-parameters:

ParameterBetekenis
page[limit] Hoeveel items er teruggegeven worden.
page[offset] Hoeveel items er overgeslagen worden voordat het venster begint.
curl -H "X-Joomla-Token: <your-token>" \
  "https://example.test/api/index.php/v1/content/articles?page[limit]=20&page[offset]=0"

Het meta-blok in het antwoord vertelt je het totale aantal, zodat je weet hoeveel pagina's er zijn.

6.2 Sorteren

Sorteer een lijst met list[ordering] voor de kolom en list[direction] voor de richting (asc of desc). Joomla controleert de kolom tegen de toegestane filters van het model, dus je kunt niet op een willekeurig veld sorteren:

"...?list[ordering]=created&list[direction]=desc"

6.3 Filteren

Versmal een lijst met filter[...]-parameters. De beschikbare filters hangen af van de component, en ze komen overeen met dezelfde filters die de backend-lijst gebruikt. Voor artikelen kun je bijvoorbeeld filteren op categorie of op publicatiestatus:

"...?filter[catid]=2&filter[state]=1"

6.4 Velden kiezen

Om een antwoord klein te houden, vraag je alleen om de velden die je nodig hebt met de JSON:API-parameter fields, met vermelding van het resource-type:

"...?fields[articles]=title,catid,state"

Vergeet niet de vierkante haken URL-te-coderen en de hele URL tussen aanhalingstekens te zetten in je shell, anders worden de haken en ampersands verkeerd gelezen.

Naar boven

7. Welke endpoints bestaan er

7.1 De kern-resources

Elke ingeschakelde Web Services-plugin voegt een familie van routes toe. Dit zijn de handigste kern-endpoints, allemaal onder /api/index.php/:

ResourceBasisroute
Artikelen v1/content/articles
Content-categorieen v1/content/categories
Gebruikers v1/users
Gebruikersgroepen / toegangsniveaus v1/users/groups, v1/users/levels
Site- / admin-menu's v1/menus/site, v1/menus/administrator
Menu-items v1/menus/site/items
Contacten v1/contacts
Newsfeeds v1/newsfeeds/feeds
Banners v1/banners
Tags v1/tags
Mediabestanden v1/media/files
Aangepaste velden v1/fields/content/articles
Globale / component-configuratie v1/config/application, v1/config/:component
Geinstalleerde extensies v1/extensions

7.2 Sub-resources

Sommige routes nestelen zich onder een item om gerelateerde data beschikbaar te stellen. De versiegeschiedenis van een artikel zit bijvoorbeeld onder het artikel waar hij bij hoort:

v1/content/articles/1/contenthistory

De exacte set routes hangt altijd af van welke plugins je hebt ingeschakeld. Als een route "404 Not Found" teruggeeft terwijl de URL er goed uitziet, is de bijbehorende Web Services-plugin meestal uitgeschakeld.

Naar boven

8. Onder de motorkap (ontwikkelaarsblik)

8.1 De reis van een verzoek

Een API-verzoek legt een duidelijk pad af van URL naar JSON:

/api/index.php   →  API-applicatie start op
                 →  ApiRouter koppelt de URL aan een route
                 →  een api-authentication-plugin controleert het token
                 →  de ApiController van de component draait (list/item/add/...)
                 →  een ListModel/AdminModel haalt of bewaart de data
                 →  een JsonapiView + serializer bouwen het JSON:API-antwoord

8.2 Routes komen uit plugins

De API heeft geen vaste routetabel. Elke Web Services-plugin luistert naar de gebeurtenis onBeforeApiRoute en registreert zijn eigen routes wanneer de router wordt opgebouwd. De com_content-plugin doet dit bijvoorbeeld:

public function onBeforeApiRoute(BeforeApiRouteEvent $event): void
{
    $router = $event->getRouter();

    $router->createCRUDRoutes(
        'v1/content/articles',
        'articles',
        ['component' => 'com_content']
    );
}

De helper createCRUDRoutes() is de reden dat de meeste resources dezelfde vorm met vijf werkwoorden delen. Een aanroep wordt uitgebreid tot alle vijf REST-routes:

GET    v1/content/articles        → articles.displayList
GET    v1/content/articles/:id    → articles.displayItem
POST   v1/content/articles        → articles.add
PATCH  v1/content/articles/:id    → articles.edit
DELETE v1/content/articles/:id    → articles.delete

Het vierde argument, $publicGets, bepaalt of de twee GET-routes antwoorden zonder authenticatie. De standaardwaarde is false.

8.3 De controller en view

Elke component heeft een dunne API-laag onder api/components/com_xxx/. Een controller breidt ApiController uit en hergebruikt dezelfde modellen als de backend. Hij leest de parameters voor paginering, sortering en filtering uit het verzoek, draait het model en geeft het resultaat door aan een JsonapiView. Een serializer zet vervolgens het Joomla-object om in de JSON:API-vorm met type / id / attributes.

api/components/com_content/src/
├─ Controller/ArticlesController.php   (extends ApiController)
├─ View/Articles/JsonapiView.php       (renders JSON:API)
└─ Serializer/ContentSerializer.php    (maps fields to attributes)

Omdat de API de bestaande modellen hergebruikt, draaien dezelfde validatie, toegangscontroles en gebeurtenissen die in de backend lopen ook voor een API-aanroep. De API is een nieuw gezicht op dezelfde motor, niet een parallelle motor.

8.4 Betrokken tabellen

TabelRol
#__extensions Waar de webservices- en api-authentication-plugins worden ingeschakeld.
#__user_profiles Bevat de seed van het API-token (joomlatoken.token) en de bijbehorende ingeschakeld-vlag.
#__users Het account achter een token of Basic-login, met al zijn groepen.

8.5 Je eigen endpoint toevoegen

Om een eigen component over de API beschikbaar te stellen, schrijf je een kleine webservices-plugin die routes registreert op onBeforeApiRoute, plus een API-controller, view en serializer onder de map api/ van je component. Je past nooit de core aan en raakt nooit de bestaande routes aan. Dit is hetzelfde mechanisme dat elke kerncomponent gebruikt, wat betekent dat een externe extensie als volwaardig burger aan de API kan meedoen.

Naar boven

9. Toegangscontrole (ACL) en rechten

9.1 Authenticatie is niet autorisatie

Twee verschillende controles bewaken elke schrijfactie naar de API, en het helpt om ze uit elkaar te houden:

  • Authenticatie beantwoordt "wie ben je?" Dit is het token of de Basic-login uit sectie 4.
  • Autorisatie beantwoordt "mag je dit doen?" Dit is de ACL (Access Control List) van Joomla.

Een geldig token brengt je alleen door de deur. Wat je daarna mag lezen, aanmaken, bewerken of verwijderen wordt bepaald door hetzelfde rechtensysteem dat de backend regelt. De API heeft geen eigen regels en biedt geen manier om de bestaande regels te omzeilen.

9.2 De rechtenacties

De API-controller controleert de gebruiker tegen de standaard Joomla-rechtenacties voordat hij een schrijfactie uitvoert. Dit zijn precies de acties die je instelt op het tabblad Rechten van een component of een item in de backend:

ActieNodig voor
core.create Een POST die een nieuw item aanmaakt.
core.edit Een PATCH die een item wijzigt.
core.edit.own Alleen items bewerken die de gebruiker zelf heeft aangemaakt.
core.edit.state De publicatiestatus wijzigen (publiceren, depubliceren, in prullenbak).
core.delete Een DELETE die een item verwijdert.

Onder de motorkap vraagt de controller de ingelogde identiteit rechtstreeks, bijvoorbeeld $user->authorise('core.delete', $this->option). Als het antwoord nee is, wordt de aanroep geweigerd voordat er data verandert.

9.3 Hoe een recht wordt bepaald

Een recht wordt nooit als een simpel ja of nee op de gebruiker opgeslagen. Joomla rekent het uit door van de gebruiker omhoog te lopen via zijn groepen en omlaag door de asset-boom, waarbij elke component en elk item een asset is met eigen regels in de tabel #__assets:

User
  → de groepen waartoe de gebruiker behoort
  → regels op de asset (component of item)  [#__assets]
  → overgeerfde regels van bovenliggende assets
  → uiteindelijk Allow of Deny

Een expliciete Deny ergens hoger in de keten wint altijd, en daarom kan een recht globaal worden uitgeschakeld en nooit weer worden ingeschakeld door een lager niveau. Dit is dezelfde berekening die de tabbladen Rechten in de backend uitvoeren, dus de API gedraagt zich precies als een administrator-actie met hetzelfde account.

9.4 Wat dit in de praktijk betekent

Twee HTTP-antwoorden vertellen je welke controle faalde:

StatusBetekenis
401 Unauthorized Authenticatie is mislukt. Het token of de login ontbrak of was verkeerd.
403 Forbidden Authenticatie werkte, maar de gebruiker mist de ACL-rechten voor deze actie.

De praktische conclusie is om elke integratie een eigen gebruiker te geven in een groep met alleen de rechten die de taak nodig heeft. Een alleen-lezen synchronisatie hoort in een groep die wel kan bekijken maar niet bewerken; een content-importeur heeft core.create nodig maar zelden core.delete. Grijp nooit naar een Super User-account alleen om een aanroep te laten lukken, want dat geeft het token veel meer macht dan de taak vereist.

Naar boven

10. Verder gaan: headless, AI en schaal

Zodra de API de manier is waarop je content Joomla verlaat, volgt er een grotere vraag: wat verbruikt het? Hier houdt Joomla op alleen een website te zijn en wordt het een contentplatform. Dezelfde JSON die je al aanroept, kan een ontkoppelde frontend, een AI-assistent of een hele vloot aan kanalen tegelijk voeden.

  • Headless Joomla. Laat de eigen weergave van Joomla vallen en laat een aparte frontend (React, Vue, Next.js, een mobiele app) de pagina's tekenen vanuit de API. Joomla wordt een pure contentopslag.
  • AI en RAG. Omdat elk artikel schone JSON is, vormt Joomla een natuurlijke bron van waarheid voor chatbots en Retrieval-Augmented Generation-pijplijnen die antwoorden uit je eigen content halen.
  • Prestaties en schaal. Een drukke API-opzet leunt op paginering, caching (Redis, Varnish, CDN), rate limiting en token-rotatie om snel en veilig te blijven.

Deze onderwerpen vormen op zichzelf een architectuuronderwerp, dus ze hebben hun eigen begeleidende artikel. Voor het volledige plaatje - ontkoppelde frontends, een Next.js-voorbeeld, AI-chatbots, RAG en vectordatabases, MCP, AI-agents, caching en SEO voor een ontkoppelde site - zie het aparte Focus On-artikel over Joomla als headless website. Dit artikel blijft gericht op de API zelf: hoe hij werkt, hoe je hem aanroept en hoe je hem beveiligt.

Naar boven

11. SEO en metadata

De Web Services API heeft geen directe SEO-waarde, en dat hoort ook niet. Hij geeft JSON terug voor machines, niet pagina's die zoekmachines kunnen indexeren, dus er is hier niets voor een crawler om te ranken.

De indirecte punten zijn belangrijker. Houd de /api/-endpoints uit je sitemap en link er niet naar vanaf publieke pagina's. Bedien elke aanroep over HTTPS, want tokens en Basic-inloggegevens mogen nooit onversleuteld over de lijn gaan. En plaats nooit een token in een URL-querystring, een publieke repository of een browserscript, waar een crawler of een nieuwsgierige bezoeker het kan opvangen. Een gelekte inloggegeven schaadt je veel meer dan welke ranking ook ooit zou kunnen.

Naar boven

12. Veelgemaakte fouten en valkuilen

12.1 De API staat uit

Symptoom: elke aanroep geeft een foutmelding, zelfs een simpele leesactie.

Oplossing: schakel de Web Services API in via Systeem → Algemene configuratie. Hij staat standaard uit op een nieuwe site.

12.2 De componentplugin is uitgeschakeld

Symptoom: een resource geeft 404 terwijl een andere prima werkt.

Oplossing: schakel de bijbehorende webservices-plugin in. Zonder die plugin registreert die component geen routes.

12.3 Het token wordt geweigerd (401)

Symptoom: een token dat er correct uitziet wordt geweigerd als niet-geautoriseerd.

Oplossing: controleer drie dingen. De plugin API Authentication - Token moet ingeschakeld zijn, de gebruiker moet behoren tot een groep die in allowedUserGroups staat, en het account mag niet geblokkeerd zijn of wachten op activatie. Onthoud dat het sleutelwoord Bearer hoofdlettergevoelig is.

12.4 De shell vreet de URL op

Symptoom: paginering of filtering wordt genegeerd, of de shell geeft een foutmelding.

Oplossing: zet de hele URL tussen aanhalingstekens en escape de ampersand. Vierkante haken en & hebben een speciale betekenis in de meeste shells, dus "...?page[limit]=20&page[offset]=0" heeft de aanhalingstekens nodig.

12.5 De Content-Type vergeten

Symptoom: een POST of PATCH maakt niets aan, of de body wordt genegeerd.

Oplossing: stuur Content-Type: application/json mee bij elke schrijfactie, en zorg dat de body geldige JSON is.

12.6 Verwachten dat de API rechten omzeilt

Symptoom: een aanroep wordt geweigerd hoewel het token geldig is.

Oplossing: de gebruiker achter het token heeft hetzelfde recht nodig dat hij in de backend zou nodig hebben. Geef de juiste groep toegang; zoek niet naar een API-only override, want die bestaat niet.

Naar boven

13. Best practices

Als je maar een paar dingen uit dit artikel onthoudt, onthoud dan deze:

  • Schakel alleen de webservices-plugins in die je echt gebruikt. Elke ingeschakelde plugin vergroot het aanvalsoppervlak.
  • Geef de voorkeur aan token-authenticatie boven Basic, en houd allowedUserGroups zo smal mogelijk.
  • Behandel een token als een wachtwoord: alleen HTTPS, nooit in een URL, een repository of een browserscript, en trek het in op het moment dat het mogelijk gelekt is.
  • Maak een eigen API-gebruiker aan met alleen de rechten die de integratie nodig heeft, in plaats van een Super User te gebruiken.
  • Begin elke integratie met een alleen-lezen GET om de toegang te bevestigen voordat je iets schrijft.
  • Gebruik page[limit] om door grote lijsten te bladeren; probeer niet duizenden rijen in een aanroep op te halen.
  • Voeg eigen endpoints toe met je eigen webservices-plugin. Pas nooit de core-routes aan.
Naar boven

14. In het kort

BASE URL     https://example.test/api/index.php/v1/...

VERBS        GET     read (list or single item)
             POST    create
             PATCH   update (only the fields you send)
             DELETE  remove

AUTH         X-Joomla-Token: <token>        (recommended)
             Authorization: Bearer <token>   (Bearer is case-sensitive)
             curl -u user:pass               (Basic, HTTPS only)

ACL          core.create  core.edit  core.edit.state  core.delete
             401 = not authenticated   403 = not authorised

LIST QUERY   page[limit]=20  page[offset]=0
             list[ordering]=created  list[direction]=desc
             filter[catid]=2  filter[state]=1
             fields[articles]=title,catid,state

ENDPOINTS    v1/content/articles      v1/content/categories
             v1/users                 v1/users/groups
             v1/menus/site/items      v1/contacts
             v1/banners               v1/tags
             v1/media/files           v1/extensions

ENABLE       Global Config        turn the API on
             webservices plugin   per component (routes)
             api-auth + user      Token plugins (login)

SCALE        page large lists, request only needed fields
             caching, CDN, rate limiting: see the headless article

DIAGNOSE     SELECT name, folder, enabled FROM #__extensions
             WHERE folder IN ('webservices','api-authentication');
Naar boven

15. Samenvatting

De Web Services API maakt van je hele Joomla-site iets wat een programma kan aansturen:

  • Het is een REST/JSON:API-interface onder /api/index.php/v1/..., los van de website en backend maar met dezelfde database en modellen.
  • Je zet hem aan in de Algemene configuratie, en schakelt daarna een webservices-plugin in voor elke component die je beschikbaar wilt stellen.
  • Elk verzoek authenticeert, met een token (aanbevolen) of Basic-auth, en wordt daarna gecontroleerd tegen de ACL van Joomla, zodat het de normale rechten van de gebruiker behoudt.
  • De vier werkwoorden GET, POST, PATCH en DELETE worden afgebeeld op oplijsten, lezen, aanmaken, bijwerken en verwijderen.
  • Lijsten ondersteunen paginering, sortering, filtering en veldselectie via query-parameters.
  • Onder de motorkap registreren plugins routes op onBeforeApiRoute, bouwt createCRUDRoutes() de vijf REST-routes, en geeft een serializer vorm aan de JSON:API-uitvoer.
  • Het is de basis voor headless frontends, AI- en RAG-pijplijnen en integraties, die het begeleidende artikel over headless Joomla diepgaand behandelt.

Zodra je de API ziet als hetzelfde Joomla maar zonder browser, houdt hij op mysterieus te zijn. Je weet waar je hem aanzet, hoe een aanroep bewijst wie hij is, en hoe de routing een URL omzet in data.

Als je een integratie, een mobiele app of een datamigratie plant die leunt op de Web Services API, is de veilige weg om alleen in te schakelen wat je nodig hebt, het token en zijn gebruikersgroep dicht te timmeren, en elke endpoint te testen voordat je hem in productie vertrouwt. Het ontwerpen van die opzet zodat hij zowel handig als veilig is, is precies het soort zorgvuldige werk dat een Joomla-specialist doet voordat de eerste regel integratiecode wordt geschreven.

Naar boven
Web Services API in Joomla
Peter Martin
Peter Martin

Joomla specialist en Linux admin voor snelle, veilige en schaalbare websites.