{"openapi":"3.1.0","info":{"title":"ServiceM8 Forms (BYOK) API","version":"0.1.0","description":"ServiceM8 Forms (BYOK) lets an AI assistant read your own ServiceM8 Forms data through the ServiceM8 Forms API with a key you supply (ServiceM8 API key). Read-only: 6 tools (list_forms, list_form_fields, list_badges, list_allocation_windows, list_availabilities, list_job_checklists). The BYOK key travels with each request, is used for that one call only and is never stored, logged or cached; it...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-servicem8-forms.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-servicem8-forms/docs"},"termsOfService":"https://connectorbay.com/byok-servicem8-forms/terms"},"servers":[{"url":"https://byok-servicem8-forms.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-servicem8-forms/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/list_forms":{"post":{"operationId":"list_forms","summary":"List form definitions with name, linked document template, standalone-use flag and badge settings. Use for \"Which forms ","description":"List form definitions with name, linked document template, standalone-use flag and badge settings. Use for \"Which forms can staff fill in on ServiceM8 jobs\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"filter":{"anyOf":[{"maxLength":250,"type":"string"},{"type":"null"}],"default":null,"description":"Optional OData-style filter, for example \"active eq 1\". Operators eq, ne, gt, lt joined by 'and'; text values in single quotes.","title":"Filter"}},"title":"list_formsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_form_fields":{"post":{"operationId":"list_form_fields","summary":"List the questions of forms with form, question name, configuration JSON and sort order. Filter by form_uuid to read one","description":"List the questions of forms with form, question name, configuration JSON and sort order. Filter by form_uuid to read one form. Use for \"What questions are on ServiceM8 form abc\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"filter":{"anyOf":[{"maxLength":250,"type":"string"},{"type":"null"}],"default":null,"description":"Optional OData-style filter, for example \"active eq 1\". Operators eq, ne, gt, lt joined by 'and'; text values in single quotes.","title":"Filter"}},"title":"list_form_fieldsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_badges":{"post":{"operationId":"list_badges","summary":"List job badges with name, whether they are allocated automatically and any linked form or asset type. Use for \"Which ba","description":"List job badges with name, whether they are allocated automatically and any linked form or asset type. Use for \"Which badges exist in ServiceM8\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"filter":{"anyOf":[{"maxLength":250,"type":"string"},{"type":"null"}],"default":null,"description":"Optional OData-style filter, for example \"active eq 1\". Operators eq, ne, gt, lt joined by 'and'; text values in single quotes.","title":"Filter"}},"title":"list_badgesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_allocation_windows":{"post":{"operationId":"list_allocation_windows","summary":"List allocation windows (named time slots such as morning or afternoon) with start and end in minutes from midnight and ","description":"List allocation windows (named time slots such as morning or afternoon) with start and end in minutes from midnight and sort priority. Use for \"What allocation windows are configured in ServiceM8\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"filter":{"anyOf":[{"maxLength":250,"type":"string"},{"type":"null"}],"default":null,"description":"Optional OData-style filter, for example \"active eq 1\". Operators eq, ne, gt, lt joined by 'and'; text values in single quotes.","title":"Filter"}},"title":"list_allocation_windowsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_availabilities":{"post":{"operationId":"list_availabilities","summary":"List availability records (for example staff unavailable or available periods) with type, start and end time and source.","description":"List availability records (for example staff unavailable or available periods) with type, start and end time and source. Use for \"When is staff unavailable in ServiceM8 next week\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"filter":{"anyOf":[{"maxLength":250,"type":"string"},{"type":"null"}],"default":null,"description":"Optional OData-style filter, for example \"active eq 1\". Operators eq, ne, gt, lt joined by 'and'; text values in single quotes.","title":"Filter"}},"title":"list_availabilitiesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_job_checklists":{"post":{"operationId":"list_job_checklists","summary":"List job checklist items with job, item name, section, type, sort order and completion time (no staff names). Use for \"W","description":"List job checklist items with job, item name, section, type, sort order and completion time (no staff names). Use for \"Which checklist items on ServiceM8 job abc are still open\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"filter":{"anyOf":[{"maxLength":250,"type":"string"},{"type":"null"}],"default":null,"description":"Optional OData-style filter, for example \"active eq 1\". Operators eq, ne, gt, lt joined by 'and'; text values in single quotes.","title":"Filter"}},"title":"list_job_checklistsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}