Zudo Works

Low-code endpoints

Method & pathBody / notesPermission
`GET /forms?archived=truefalse`forms as the caller sees them (hidden fields stripped), with nav_section, record_count, can_designforms.read
GET /forms/:idOrSlug—forms.read
POST /formsname (5–20), description?, icon?, nav_section?, fields[], settings { title_field?, submit_label?, detail_layout? }forms.design
PATCH /forms/:idany of the above + `status (activearchived)`forms.design
DELETE /forms/:idcascades to records, rules, dashboard & home widgets; 409 while referenced by another form's lookupforms.design
GET /forms/:id/referencesforms whose lookups point at this formforms.read
GET /forms/:id/recordssearch, filters (JSON), sort, page, page_sizeforms.read
GET /forms/:id/records/:recordIdrecord with title, linked_from, workflow_runsforms.read
POST /forms/:id/records · PATCH …/:recordId · DELETE …/:recordIddata { field_id: value } (field RBAC applied; rules fire)forms.write
GET /lookups/:target?q=&form_id=options for `itemcustomervendorwarehouseform`forms.read
GET /links/:target/:idcustom records referencing a core record / another recordforms.read
GET /workflow-rules?form_id= · GET /workflow-rules/:id—workflows.manage
POST /workflow-rules · PATCH /:id · DELETE /:idform_id (null for report_button), name, trigger, condition?, actions[], enabled?workflows.manage
GET /workflow-rules/:id/runs · POST /workflow-rules/:id/testrun log; test with a sample recordworkflows.manage
GET /workflow-functions · GET /:id · POST · PATCH /:id · DELETE /:id · POST /:id/testname, params[], steps[], returns?workflows.manage
GET /dashboards · GET /dashboards/:idwidgets, filters, nav_sectiondashboards.read
POST /dashboards · PATCH /:id · DELETE /:idname, description?, nav_section?, widgets[] (≤ 40), filters[] (≤ 10)dashboards.manage
GET /analytics/sourcesdatasets and forms with their columns (permission-filtered)dashboards.read
POST /analytics/runan analytics query → { columns, rows, points?, trend }dashboards.read
POST /analytics/drilldownquery + clicked point → raw rows (paginated)dashboards.read
GET /reports?module= · GET /reports/:idsaved module reportsdashboards.read
POST /reports · PATCH /:id · DELETE /:idmodule, name, api_name? (derived when omitted; kept on rename), description?, chart, query (module dataset), options, buttons[] (≤ 8)dashboards.manage
POST /forms/:id/records/:recordId/buttons/:buttonId/runruns a record button's "Button on a record" rule on that record → { run, record }
GET /blueprints · GET /blueprints/:idblueprints with stages, transitions, is_active, owner
POST /blueprints · PATCH /:id · DELETE /:idform_id, name, description?, stages[] (≤ 30), initial_stage, transitions[] (≤ 60), is_active?; 409 limit_reached after 20 per user
GET /forms/:id/records/:recordId/blueprintthe record's stage, available transitions and journey
POST /forms/:id/records/:recordId/blueprint/transitions/:transitionIdcomment?, data? → moves the record, records the journey, runs the linked rule
GET /extensions/:module · POST /extensions/:modulethe custom-fields form of a built-in section (created on first POST, forms.design)
GET /extensions/:module/records/:coreId · PUT …custom field values of one built-in record (data)
GET /reports/catalogevery report the caller may open (saved + built-in all_<module> / all_form_<slug>) → { id, module, name, api_name, chart, kind, endpoint }[]dashboards.read
GET /reports/by-name/:apiNameone report by API name (a built-in one has id: null)dashboards.read + roles
GET /reports/by-name/:apiName/rows · GET /reports/:id/rowslimit (≤ 500), offset, sort, dir, filters (JSON) → { report, columns, rows, total, limit, offset }dashboards.read + the dataset's read permission + roles
POST /reports/:id/buttons/:buttonId/runruns the button's workflow with the report rows (≤ 200)dashboards.read

Last updated