Private preview of the new site. Not live.

forms.list

Forms on a job (job-level and per visit), or on one visit, newest first, without fields and answers. Filter by status.

WhoAgents can call this
RESTGET /v1/forms
MCP toolforms_list
Writesno
AreaField work (checklists, forms, time, notes, change orders, subcontractors)

When to use it

Keep form templates (forms.saveTemplate: ordered fields of type heading, text, long_text, number, yes_no, choice, multi_choice, date or photos, each optionally required). Start a form on a job or one visit (forms.start) from a template, from an earlier form (copy_from_form_id, which also carries its answers), or with fields given on the spot; the form keeps its own copy of the fields.

What to tell the owner

Tell them what you found in plain words. Don't read back raw fields.

Input

FieldTypeRequired
job_idstring (uuid)no
visit_idstring (uuid)no
statusstring (one of draft, submitted, cancelled)no

Example

GET https://doingwork.work/v1/forms?job_id=00000000-0000-4000-8000-000000000000&visit_id=00000000-0000-4000-8000-000000000000&status=draft

Output

FieldTypeAlways there
itemsarrayyes
items[].form_idstring (uuid)yes
items[].shop_idstring (uuid)yes
items[].job_idstring (uuid)yes
items[].visit_id['string', 'null', ' ', '(', 'u', 'u', 'i', 'd', ')']yes
items[].form_template_id['string', 'null', ' ', '(', 'u', 'u', 'i', 'd', ')']yes
items[].copied_from_form_id['string', 'null', ' ', '(', 'u', 'u', 'i', 'd', ')']yes
items[].namestringyes
items[].statusstringyes
items[].signoff_requiredbooleanyes
items[].missingarrayyes
items[].created_bystring (uuid)yes
items[].created_atstring (date-time)yes
items[].updated_atstring (date-time)yes
items[].submitted_by['string', 'null', ' ', '(', 'u', 'u', 'i', 'd', ')']yes
items[].submitted_at['string', 'null', ' ', '(', 'd', 'a', 't', 'e', '-', 't', 'i', 'm', 'e', ')']yes
items[].document_id['string', 'null', ' ', '(', 'u', 'u', 'i', 'd', ')']yes
items[].document_sha256['string', 'null']yes
items[].cancelled_at['string', 'null', ' ', '(', 'd', 'a', 't', 'e', '-', 't', 'i', 'm', 'e', ')']yes
items[].signature_id['string', 'null', ' ', '(', 'u', 'u', 'i', 'd', ')']yes
items[].signoff_request_id['string', 'null', ' ', '(', 'u', 'u', 'i', 'd', ')']yes
{
  "items": [
    {
      "form_id": "00000000-0000-4000-8000-000000000000",
      "shop_id": "00000000-0000-4000-8000-000000000000",
      "job_id": "00000000-0000-4000-8000-000000000000",
      "visit_id": "00000000-0000-4000-8000-000000000000",
      "form_template_id": "00000000-0000-4000-8000-000000000000",
      "copied_from_form_id": "00000000-0000-4000-8000-000000000000",
      "name": "Ruiz Plumbing",
      "status": "...",
      "signoff_required": true,
      "missing": [
        "..."
      ],
      "created_by": "00000000-0000-4000-8000-000000000000",
      "created_at": "...",
      "updated_at": "...",
      "submitted_by": "00000000-0000-4000-8000-000000000000",
      "submitted_at": "...",
      "document_id": "00000000-0000-4000-8000-000000000000",
      "document_sha256": "...",
      "cancelled_at": "...",
      "signature_id": "00000000-0000-4000-8000-000000000000",
      "signoff_request_id": "00000000-0000-4000-8000-000000000000"
    }
  ]
}

Errors

CodeStatusWhat to do
invalid_input, invalid_token, rate_limitedCan happen on any call. See errors.