{"record":{"id":"7aaabfaf82f01928","repo":"Budibase/budibase","slug":"row-action-rowactionid-not-found-in-tablei","errorCode":null,"errorMessage":"Row action '${rowActionId}' not found in '${tableId}'","messagePattern":"Row action '(.+?)' not found in '(.+?)'","errorType":"http","errorClass":"HTTPError","httpStatus":400,"severity":"error","filePath":"packages/server/src/sdk/workspace/rowActions/crud.ts","lineNumber":99,"sourceCode":"    permissions: {\n      table: { runAllowed: true },\n      views: {},\n    },\n  }\n  await db.put(doc)\n\n  return {\n    id: newRowActionId,\n    name: automation.name,\n    ...doc.actions[newRowActionId],\n  }\n}\n\nexport async function get(tableId: string, rowActionId: string) {\n  const actionsDoc = await getAllForTable(tableId)\n  const rowAction = actionsDoc?.actions[rowActionId]\n  if (!rowAction) {\n    throw new HTTPError(\n      `Row action '${rowActionId}' not found in '${tableId}'`,\n      400\n    )\n  }\n  return rowAction\n}\n\nexport async function getAllForTable(tableId: string) {\n  const db = context.getWorkspaceDB()\n  const rowActionsId = generateRowActionsID(tableId)\n  return await db.tryGet<TableRowActions>(rowActionsId)\n}\n\nexport async function getAll() {\n  const db = context.getWorkspaceDB()\n  return (\n    await db.allDocs<WithDocMetadata<TableRowActions>>(\n      docIds.getDocParams(DocumentType.ROW_ACTIONS, undefined, {","sourceCodeStart":81,"sourceCodeEnd":117,"githubUrl":"https://github.com/Budibase/budibase/blob/a81a902e9a8fe55b467d106765f6638f12e35c49/packages/server/src/sdk/workspace/rowActions/crud.ts#L81-L117","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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)."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"const actions = (await rowActions.getAllForTable(tableId))?.actions ?? {}\nif (!(rowActionId in actions)) return null","typeGuard":null,"tryCatchPattern":"try {\n  const action = await rowActions.get(tableId, rowActionId)\n} catch (e) {\n  if (e instanceof HTTPError && e.status === 400) {\n    // action missing: refresh table row actions\n  } else throw e\n}","preventionTips":["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."],"tags":["not-found","row-actions","http-400"],"backgroundTag":"resource-not-found","analyzedSha":"a81a902e9a8fe55b467d106765f6638f12e35c49","analyzedAt":"2026-08-29T01:03:10.972Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}