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

  1. Confirm the rowActionId exists on that table by listing the table's row actions first.
  2. Ensure the id belongs to the same tableId you are passing — ids are table-scoped.
  3. 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

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


AI-assisted analysis of Budibase/budibase@a81a902e9a (2026-08-29). Data as JSON: /api/errors/7aaabfaf82f01928. Report an issue: GitHub.