Connect Retool to Joomla using a REST API Resource with your Joomla site URL and a Joomla API token for authentication. Available in Joomla 4 and later, the Web Services API exposes articles, categories, users, and menus via standard REST endpoints at /api/index.php/v1/. Build content management dashboards for bulk article editing, category management, and user administration directly from Retool.
| Fact | Value |
|---|---|
| Tool | Joomla |
| Category | CMS |
| Method | REST API Resource |
| Difficulty | Intermediate |
| Time required | 25 minutes |
| Last updated | April 2026 |
Build a Joomla Content Management Panel in Retool
Joomla's native backend is powerful but can be slow for content teams that need to perform bulk operations — publishing dozens of draft articles, reassigning categories across hundreds of posts, or auditing user access levels. Retool solves this by connecting to Joomla's Web Services API (introduced in Joomla 4) and presenting data through fast, customizable Tables, Forms, and Bulk Action panels that Joomla's native administrator interface cannot match for speed.
With a Retool-Joomla integration, you can build a bulk article publisher that lets editors select multiple draft articles and publish them with a single button click, a category reassignment tool that moves articles between categories at scale, a user management panel for auditing and updating access levels across your Joomla user base, and a content audit dashboard that surfaces stale articles (not updated in 90+ days) for review or archival. Because Retool runs queries server-side, your Joomla API token is never exposed in the browser.
Joomla's API follows JSON:API specification, which means responses are structured with a 'data' array containing items with 'id', 'type', and 'attributes' sub-objects. Retool's JavaScript transformers make it straightforward to flatten this nested structure into table-friendly rows. The API is available on Joomla 4.0 and later — if your site runs Joomla 3.x, an upgrade or third-party REST API extension is required before this integration is possible.
Integration method
Joomla 4 introduced a built-in Web Services API accessible at /api/index.php/v1/ with token-based authentication. In Retool, you configure a REST API Resource pointing to your Joomla site's API base URL with a Joomla API token sent as a Bearer token in the Authorization header. All queries route through Retool's server-side proxy, so credentials never reach the browser and CORS is not a concern. The API covers articles, categories, users, tags, modules, and menus with standard CRUD operations.
Prerequisites
- A Joomla 4.0 or later installation with administrator access
- The Web Services Authentication plugin enabled in Joomla (Extensions → Plugins → search 'Web Services')
- A Joomla API token generated from the user's profile (User Menu → Edit Account → Joomla API Token tab)
- Your Joomla site URL (e.g., https://yoursite.com)
- A Retool account with permission to create Resources
Step-by-step guide
Enable Joomla's Web Services API and generate a token
Joomla's REST API is disabled by default in a fresh installation. Log in to your Joomla Administrator backend (yoursite.com/administrator). Navigate to Extensions → Plugins and search for 'Web Services'. You will find two relevant plugins: 'Authentication - Web Services' (required for token-based auth) and individual 'Web Services - Content', 'Web Services - Users', and 'Web Services - Tags' plugins for each resource type you want to expose. Enable all of these plugins by clicking each one and toggling Status to Enabled, then clicking Save. Next, generate your API token by clicking your username in the top-right of the Joomla backend and selecting 'Edit Account'. On your profile page, click the 'Joomla API Token' tab. If no token exists, click 'Invalidate Token' to generate a new one — this creates a long token string associated with your user account. Note that the token inherits your user's permissions, so use a dedicated administrator account for full API access or a lower-privileged account for read-only dashboards. Copy the token string and store it securely. The token does not expire unless explicitly invalidated from the same profile tab.
Pro tip: Create a dedicated Joomla user account (e.g., retool-api@yoursite.com) assigned to the 'Manager' or 'Administrator' group specifically for the Retool integration. This isolates the API token from personal accounts and gives you control over the account's access level independently.
Expected result: The Web Services plugins are enabled and you have a Joomla API token copied. Test by visiting yoursite.com/api/index.php/v1/articles in a browser with your token as a Bearer header — you should receive a JSON response.
Create the Joomla REST API Resource in Retool
In Retool, navigate to the Resources tab in the left sidebar and click Add Resource in the top-right. Select REST API from the resource type list. Name the resource 'Joomla CMS'. In the Base URL field, enter your Joomla API base URL: https://yoursite.com/api/index.php/v1 — replace yoursite.com with your actual domain. This path includes the /api/index.php/v1 prefix which is the standard Joomla 4 API route prefix. Do not include a trailing slash. Scroll to the Headers section and add two default headers. First, add Authorization with the value Bearer YOUR_JOOMLA_API_TOKEN — replace YOUR_JOOMLA_API_TOKEN with the token you generated in the previous step. Second, add Content-Type with value application/json for POST and PATCH request bodies. You do not need to configure the Authentication section since auth is handled via the Authorization header. Click Save Changes. To verify the connection, you can create a quick test query in an app with GET method and path /articles — a successful response confirms the resource is correctly configured. If you receive a 401 Unauthorized, ensure the Authentication - Web Services plugin is enabled and the token is correctly prefixed with 'Bearer '.
Pro tip: Use Retool's Configuration Variables (Settings → Configuration Variables, marked as secret) to store your Joomla API token and reference it as {{ retoolContext.configVars.JOOMLA_API_TOKEN }} in the Authorization header. This allows token rotation without editing the Resource configuration.
Expected result: The Joomla CMS resource appears in your Resources list. Creating a test GET query to /articles returns a JSON:API formatted response with article data.
Query articles with filtering and pagination
Open or create a Retool app. In the Code panel, click + to create a new query named 'getArticles'. Select your Joomla CMS resource. Set Method to GET and Path to /articles. Joomla's API supports several URL parameters for filtering and pagination. In the URL Parameters section, add the following parameters: 'page[limit]' set to {{ pagination.pageSize || 25 }} for result count per page, 'page[offset]' set to {{ (pagination.page - 1) * (pagination.pageSize || 25) }} for pagination offset, 'filter[state]' set to {{ stateFilter.value || '' }} where stateFilter is a Select component with options '' (all), '1' (published), '0' (unpublished), '-1' (archived), and 'list[ordering]' set to 'a.modified' with 'list[direction]' set to 'DESC' for most-recently-modified first. Joomla's API returns JSON:API formatted responses where article data lives in the 'data' array and each item has 'id', 'type', and 'attributes' keys. Add a transformer to flatten this structure into table-friendly rows. Enable 'Run query when app loads' and also set it to re-run when the stateFilter selection changes using an event handler on that component.
1// Transformer: flatten Joomla JSON:API response to table rows2const items = data.data || [];3return items.map(item => ({4 id: item.id,5 title: item.attributes?.title || '',6 alias: item.attributes?.alias || '',7 state: item.attributes?.state === 1 ? 'Published' : item.attributes?.state === 0 ? 'Unpublished' : 'Archived',8 category_id: item.attributes?.catid || '',9 author: item.attributes?.author || '',10 created: item.attributes?.created ? new Date(item.attributes.created).toLocaleDateString() : '',11 modified: item.attributes?.modified ? new Date(item.attributes.modified).toLocaleDateString() : '',12 hits: item.attributes?.hits || 013}));Pro tip: Joomla's API supports full-text search via the 'filter[search]' parameter. Add a Text Input component named 'searchInput' and bind filter[search] to {{ searchInput.value }} — this triggers a server-side search across article titles and content, which is much more efficient than client-side filtering in large sites.
Expected result: The getArticles query returns a table-friendly array of article objects with title, state, author, and date fields visible in the Results panel.
Build the article management dashboard UI
In the app canvas, drag a Table component and set its Data property to {{ getArticles.data }}. Configure visible columns: title, state, category_id, author, modified, hits. Set the title column to a text type and add a Link column that opens the article in Joomla's edit view using the URL format https://yoursite.com/administrator/index.php?option=com_content&task=article.edit&id={{ row.id }}. Above the table, add a row of filter controls: a Select component for state filtering (named 'stateFilter'), a Text Input for search (named 'searchInput' — bind to filter[search] in the query), and a Date Range Picker for modified date filtering. Add a Pagination component below the table and bind the getArticles query's page parameters to it. Create a second query named 'updateArticleState' with Method PATCH, Path /articles/{{ articlesTable.selectedRow.id }}, and Body Type JSON. The request body should be { "state": {{ newStateSelect.value }} } where newStateSelect is a Select component in a side panel. For bulk publishing, add a Multi-select checkbox to the Table (enable row selection in Table settings) and create a 'publishSelected' query using Retool's JavaScript query type that loops through the selected rows and triggers the PATCH query for each: use Promise.all with selectedRows.map() to send requests in parallel. Add event handlers to show notifications and refresh getArticles on success.
1// JavaScript query: bulk publish selected articles2const selectedRows = articlesTable.selectedRows || [];3if (selectedRows.length === 0) {4 return utils.showNotification({ title: 'No articles selected', notificationType: 'warning' });5}67const requests = selectedRows.map(row =>8 fetch(`${retoolContext.origin}/proxy`, {9 method: 'POST',10 body: JSON.stringify({11 resource: 'joomla_cms',12 method: 'PATCH',13 path: `/articles/${row.id}`,14 body: { state: 1 }15 })16 })17);1819await Promise.all(requests);20return await getArticles.trigger();Pro tip: Rather than a JavaScript query for bulk operations, consider using Retool Workflows for bulk updates — create a Workflow triggered from an app button that accepts an array of article IDs and loops through them with error handling and retry logic. This is more reliable than Promise.all in the browser for large batches.
Expected result: A functional article management dashboard shows filterable, searchable articles with state update controls and bulk publishing capability.
Add category and user management panels
Create a second query named 'getCategories' with GET method and path /categories?filter[extension]=com_content to list all content categories. The com_content extension filter scopes results to article categories, excluding other component categories. Add a transformer similar to the articles transformer to flatten JSON:API items into rows with id, title, alias, parent_id, level, and item count. Create a third query named 'getUsers' with GET method and path /users — this endpoint requires administrator-level permissions on your Joomla API token account. Apply a transformer to extract username, email, user groups, registration date, last visit date, and block status from each user's attributes. Build a tab layout in your Retool app with three tabs: Articles, Categories, and Users. On the Categories tab, display categories in a Table with inline editing for title — set the column to 'editable' type and create a PATCH query named 'updateCategory' triggered by the Table's on-change event. On the Users tab, show users with a Block/Unblock toggle that sends PATCH /users/{{ usersTable.selectedRow.id }} with body { "block": {{ row.block === 0 ? 1 : 0 }} }. For complex multi-content-type management and automated content Workflows connecting Joomla with your CRM or email platform, RapidDev's team can help architect your Retool content operations solution.
1// Transformer: flatten Joomla categories JSON:API response2const items = data.data || [];3return items.map(item => ({4 id: item.id,5 title: item.attributes?.title || '',6 alias: item.attributes?.alias || '',7 parent_id: item.attributes?.parent_id || 0,8 level: item.attributes?.level || 0,9 published: item.attributes?.published === 1 ? 'Yes' : 'No',10 note: item.attributes?.note || ''11}));Pro tip: Joomla's API supports creating new articles via POST /articles with a JSON body containing title, alias, articletext (HTML content), catid, state, and other fields. Build a Form component in Retool with these fields for a lightweight article creation panel — useful for content teams who want a simpler interface than Joomla's full editor.
Expected result: The app has three working tabs for Articles, Categories, and Users, each with its own filtered Table and inline edit/update capabilities.
Common use cases
Build a bulk article publishing and management dashboard
Create a Retool panel that lists all Joomla articles with their publish state, category, author, and last modified date. Include filters for article state (unpublished, published, archived, trashed), category, and date range. Add a multi-select checkbox column and a Publish Selected button that triggers a batch PATCH request to publish all selected articles simultaneously — far faster than doing this one by one in Joomla's native backend.
Build a Retool dashboard showing all Joomla articles in a Table with columns for title, state (published/unpublished), category, author, and modified date. Include state and category filter dropdowns, a checkbox column for multi-select, and a Publish Selected button that sends batch PATCH requests to update article state to 1.
Copy this prompt to try it in Retool
Build a category and content structure management panel
Create a Retool interface for managing Joomla's category hierarchy and bulk reassigning articles to different categories. Show the category tree with article counts in each category, allow inline category renaming, and provide a drag-select interface for moving groups of articles from one category to another. This is particularly useful for large sites undergoing content reorganization.
Build a Retool panel showing Joomla categories in a Table with article counts. Include a Select component for bulk category reassignment — selecting articles from one category and a target category, then triggering PATCH requests to move them. Add inline editing for category title and alias.
Copy this prompt to try it in Retool
Build a user access and account management panel
Create a Retool user management dashboard for Joomla site administrators that shows all registered users with their user groups, registration date, last visit date, and activation status. Include search and filter controls, and enable inline editing of user group assignments and account block/unblock status. This is ideal for large community sites with thousands of registered members.
Build a Retool user management panel querying Joomla's /api/index.php/v1/users endpoint. Show a Table with username, email, group, registration date, last visit, and blocked status. Include a Block/Unblock toggle button and a group reassignment dropdown per row.
Copy this prompt to try it in Retool
Troubleshooting
401 Unauthorized when connecting to Joomla's API
Cause: The 'Authentication - Web Services' plugin is not enabled, or the Bearer token is missing the 'Bearer ' prefix in the Authorization header. Joomla requires this plugin to validate API tokens — without it, all API requests return 401 regardless of token validity.
Solution: In your Joomla backend, go to Extensions → Plugins, search for 'Authentication - Web Services', and confirm the plugin status is 'Enabled' (green checkmark). In your Retool resource settings, verify the Authorization header value is 'Bearer YOUR_TOKEN' with a space after 'Bearer' — it must not be just the token string alone.
404 Not Found when accessing /api/index.php/v1/articles
Cause: The Joomla site has URL rewriting configured differently, or the specific Web Services plugin for content (Web Services - Content) is not enabled. Joomla requires both the authentication plugin and the resource-specific web services plugin to be active.
Solution: Ensure the 'Web Services - Content' plugin is enabled (Extensions → Plugins → search 'Web Services - Content'). If the URL returns 404 even with plugins enabled, try the non-SEF URL format: yoursite.com/index.php?api/index.php/v1/articles as some hosting configurations do not support clean URLs for the API path. Check your .htaccess file for any rules blocking /api/ paths.
Transformer fails with 'Cannot read property of undefined' when processing the API response
Cause: Joomla's API follows the JSON:API specification where data lives in response.data and attributes live in each item's .attributes sub-object. Accessing response fields directly (e.g., item.title instead of item.attributes.title) causes undefined errors.
Solution: In your transformer, always access article fields through the .attributes path: item.attributes?.title, item.attributes?.state, etc. The item.id is a direct field (not inside attributes). Use optional chaining (?.) throughout the transformer to handle cases where the API returns partial data or empty attributes objects.
1const items = data.data || [];2return items.map(item => ({3 id: item.id,4 title: item.attributes?.title || '(no title)',5 state: item.attributes?.state ?? -1,6 catid: item.attributes?.catid || 07}));PATCH request to update an article returns 403 Forbidden
Cause: The Joomla user account whose API token is being used does not have the 'Edit' permission for the article's category, or the user is not in the Administrator or Manager group which allows article editing via API.
Solution: In Joomla's backend, navigate to Users → Manage and find the account associated with your API token. Confirm the user is in the Manager or Administrator group. Alternatively, navigate to Content → Articles → Options → Permissions to verify the user's group has 'Edit' permission. For self-authored articles, 'Edit Own' permission is sufficient, but for editing any article the account needs broader Edit access.
Best practices
- Create a dedicated Joomla administrator account for the Retool integration rather than using a personal account — this way token invalidation and rotation are independent of individual team members
- Store your Joomla API token in Retool's Configuration Variables (Settings → Configuration Variables) as a secret rather than hardcoding it in the Resource header, enabling token rotation without Resource reconfiguration
- Enable only the Web Services plugins for resource types your Retool app actually needs (Content, Users, Tags) to minimize the attack surface of your Joomla API exposure
- Use server-side filtering via URL parameters (filter[state], filter[search], filter[category_id]) instead of fetching all articles and filtering client-side — Joomla sites can have tens of thousands of articles and client-side filtering is impractical at scale
- Apply Retool's query caching (Advanced tab → Cache responses for 30-60 seconds) to category and tag list queries that are used as filter dropdowns — these change infrequently and caching reduces unnecessary API calls
- Add Confirm Modals to bulk operations like bulk publish, bulk delete, or category reassignment to prevent accidental mass changes to production content
- Use Retool Workflows for scheduled content audits — set up a Workflow that queries articles not modified in 90 days, generates a report in Retool Database, and sends a summary email notification to the content team
Alternatives
WordPress has a more mature REST API ecosystem with Application Passwords auth and a larger selection of third-party plugins, making it a better fit for teams comfortable with the WordPress ecosystem.
Ghost offers a cleaner, more developer-friendly REST API with built-in membership management — a better choice for content-focused teams starting fresh without a legacy Joomla install.
Kentico is a better choice for enterprise organizations needing a .NET-native DXP with advanced personalization and multi-site management beyond Joomla's capabilities.
Frequently asked questions
Does Retool work with Joomla 3.x?
Joomla's built-in Web Services API was introduced in Joomla 4.0 and is not available in Joomla 3.x. If your site runs Joomla 3.x, you would need either a third-party REST API extension (such as com_api or similar Joomla extensions) or to upgrade to Joomla 4+. The Retool integration described here specifically requires Joomla 4.0 or later with the standard Web Services plugins.
Can I create or delete articles from Retool?
Yes. Use POST /articles with a JSON body containing required fields (title, alias, articletext for content, catid for category, and state) to create new articles. For deletion, use DELETE /articles/{id}. Both operations require the API token account to have appropriate Joomla permissions (Create and Delete for the relevant category). Always add a Confirm Modal before DELETE operations to prevent accidental content removal.
How do I filter Joomla articles by category in Retool?
Joomla's articles API supports the 'filter[category_id]' URL parameter for category filtering. First, query /categories?filter[extension]=com_content to get all categories and populate a Select dropdown. Then bind filter[category_id] in the articles query to {{ categorySelect.value }}. Set the articles query to re-run when the category selection changes using an event handler on the Select component.
Why does the Joomla API return data in a nested format instead of flat fields?
Joomla's Web Services API follows the JSON:API specification (jsonapi.org), which wraps all resource data in a structured format with 'data' arrays, 'id', 'type', and 'attributes' keys for each item. This standardized format improves interoperability but requires flattening in transformers. Use Retool's JavaScript transformer with item.attributes?.fieldname to access the actual data fields.
Can Retool access Joomla extensions and custom component data?
Retool can access any Joomla component that exposes Web Services API endpoints. Third-party Joomla extensions must explicitly implement Joomla's Web Services API plugin interface to be accessible via REST. For components without native API support, you can expose data through a custom Joomla component that implements the ApiController class, or connect Retool directly to the Joomla database via a PostgreSQL or MySQL Resource for direct SQL access to extension tables.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation