
Web Services API in Joomla
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:
| Applicatie | Map | Bedient |
|---|---|---|
| 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 boven2. 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.
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
- Schakel in de Algemene configuratie de Web Services API in.
- Schakel de
webservices-plugin in voor elke component die je wilt bereiken. - Stel authenticatie in (zie de volgende sectie), zodat aanroepen kunnen bewijzen wie ze zijn.
- Doe een eerste alleen-lezen
GET-aanroep om te bevestigen dat de API antwoordt.
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:
- Schakel de plugin User - Joomla API Token in (deze voegt het tokenveld toe aan gebruikersprofielen).
- Schakel de plugin API Authentication - Token in (deze leest de header bij elk verzoek).
- 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 boven5. Je eerste verzoeken (CRUD)
5.1 De vier werkwoorden
Elke resource volgt hetzelfde patroon. Met artikelen als voorbeeld:
| Doel | Methode | Endpoint |
|---|---|---|
| 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 boven6. 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:
| Parameter | Betekenis |
|---|---|
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 boven7. 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/:
| Resource | Basisroute |
|---|---|
| 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 boven8. 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
| Tabel | Rol |
|---|---|
#__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.
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:
| Actie | Nodig 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:
| Status | Betekenis |
|---|---|
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.
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 boven11. 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.
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 boven13. 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
allowedUserGroupszo 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
GETom 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.
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 boven15. 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, bouwtcreateCRUDRoutes()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

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


