Budibase/budibase · error · HTTPError
Row action '${rowActionId}' not found in '${tableId}'
Error message
Row action '${rowActionId}' not found in '${tableId}' What it means
Thrown by get in packages/server/src/sdk/workspace/rowActions/crud.ts when the requested rowActionId does not exist in the table's row-actions document. It loads all actions for the table and throws a 400 if actionsDoc.actions[rowActionId] is undefined.
Source
Thrown at packages/server/src/sdk/workspace/rowActions/crud.ts:99
permissions: {
table: { runAllowed: true },
views: {},
},
}
await db.put(doc)
return {
id: newRowActionId,
name: automation.name,
...doc.actions[newRowActionId],
}
}
export async function get(tableId: string, rowActionId: string) {
const actionsDoc = await getAllForTable(tableId)
const rowAction = actionsDoc?.actions[rowActionId]
if (!rowAction) {
throw new HTTPError(
`Row action '${rowActionId}' not found in '${tableId}'`,
400
)
}
return rowAction
}
export async function getAllForTable(tableId: string) {
const db = context.getWorkspaceDB()
const rowActionsId = generateRowActionsID(tableId)
return await db.tryGet<TableRowActions>(rowActionsId)
}
export async function getAll() {
const db = context.getWorkspaceDB()
return (
await db.allDocs<WithDocMetadata<TableRowActions>>(
docIds.getDocParams(DocumentType.ROW_ACTIONS, undefined, {View on GitHub (pinned to a81a902e9a)
Solutions
- Confirm the rowActionId exists on that table by listing the table's row actions first.
- Ensure the id belongs to the same tableId you are passing — ids are table-scoped.
- Refresh client-side references if the action was recently deleted or recreated (new id).
Defensive patterns
Strategy: validation
Validate before calling
const actions = (await rowActions.getAllForTable(tableId))?.actions ?? {}
if (!(rowActionId in actions)) return null Try / catch
try {
const action = await rowActions.get(tableId, rowActionId)
} catch (e) {
if (e instanceof HTTPError && e.status === 400) {
// action missing: refresh table row actions
} else throw e
} Prevention
- List the table's row actions and pick ids from that response.
- Never pass an automation id where a row action id is expected.
- Invalidate cached action ids after delete/recreate operations.
When it happens
Trigger: Calling get(tableId, rowActionId) with an id that was deleted, mistyped, or belongs to a different table; also raised indirectly via guardView and automation flows that call get internally.
Common situations: Frontend holding a stale row action id after the action was deleted; passing an automation id rather than a row action id; copy-pasting ids between apps.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- View '${viewId}' not found in '${tableId}'
- Workspace app not found
- Table not found
- Row not found
- Failed to generate a unique name for the row action
AI-assisted analysis of Budibase/budibase@a81a902e9a (2026-08-29).
Data as JSON: /api/errors/7aaabfaf82f01928.
Report an issue: GitHub.