{"openapi":"3.1.0","info":{"title":"Formstack (BYOK) API","version":"0.1.0","description":"Formstack (BYOK) lets an AI assistant read your own Formstack data through the Formstack API with a key you supply (Formstack personal access token (starts with fs_pat_)). Read-only: 7 tools (list_forms, get_form, list_form_fields, list_form_submissions, get_submission_status, list_folders, list_portals). The BYOK key travels with each request, is used for that one call only and is never stored,...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-formstack.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-formstack/docs"},"termsOfService":"https://connectorbay.com/byok-formstack/terms"},"servers":[{"url":"https://byok-formstack.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-formstack/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 the forms of your Formstack account with submission counts, unread counts, folder, active flag and dates. Supports ","description":"List the forms of your Formstack account with submission counts, unread counts, folder, active flag and dates. Supports name search and folder filter. Use for \"Which Formstack forms do I have and how many submissions does each have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"search":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only forms whose name contains this text.","title":"Search"},"folder":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only forms in this folder id (from list_folders).","title":"Folder"},"order":{"anyOf":[{"enum":["ASC","DESC"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort direction: ASC or DESC.","title":"Order"},"page_number":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page Number"},"page_size":{"anyOf":[{"maximum":500,"minimum":10,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results per page (10 to 500; the API default is 50).","title":"Page Size"}},"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/get_form":{"post":{"operationId":"get_form","summary":"Get one Formstack form: name, URL, counts of submissions today and in total, settings such as time zone and active state","description":"Get one Formstack form: name, URL, counts of submissions today and in total, settings such as time zone and active state. Use for \"Show details of Formstack form 1234567\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"form_id":{"description":"Numeric Formstack form id, from list_forms.","title":"Form Id","type":"integer"}},"required":["form_id"],"title":"get_formArguments","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 fields of a Formstack form with label, type, required flag, hidden flag, order and choice options. Use for \"Wha","description":"List the fields of a Formstack form with label, type, required flag, hidden flag, order and choice options. Use for \"What fields does Formstack form 1234567 have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"form_id":{"description":"Numeric Formstack form id, from list_forms.","title":"Form Id","type":"integer"}},"required":["form_id"],"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_form_submissions":{"post":{"operationId":"list_form_submissions","summary":"List submissions of one Formstack form (id, time, display name) newest or oldest first. Does not return the answers them","description":"List submissions of one Formstack form (id, time, display name) newest or oldest first. Does not return the answers themselves. Can filter by time window or keyword. Use for \"When did Formstack form 1234567 last get a submission\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"form_id":{"description":"Numeric Formstack form id, from list_forms.","title":"Form Id","type":"integer"},"min_time":{"anyOf":[{"maxLength":30,"type":"string"},{"type":"null"}],"default":null,"description":"Only submissions at or after this date and time, for example '2026-01-01 00:00:00'.","title":"Min Time"},"max_time":{"anyOf":[{"maxLength":30,"type":"string"},{"type":"null"}],"default":null,"description":"Only submissions at or before this date and time.","title":"Max Time"},"keyword":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only submissions that contain this text.","title":"Keyword"},"order":{"anyOf":[{"enum":["ASC","DESC"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort by time: ASC (oldest first) or DESC.","title":"Order"},"page_number":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page Number"},"page_size":{"anyOf":[{"maximum":500,"minimum":10,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results per page (10 to 500; the API default is 50).","title":"Page Size"}},"required":["form_id"],"title":"list_form_submissionsArguments","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/get_submission_status":{"post":{"operationId":"get_submission_status","summary":"Get status of one Formstack submission: time, form id, payment status, approval status and workflow steps. Answers are n","description":"Get status of one Formstack submission: time, form id, payment status, approval status and workflow steps. Answers are not returned. Use for \"What is the approval status of Formstack submission 987654321\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"submission_id":{"description":"Numeric submission id, from list_form_submissions.","title":"Submission Id","type":"integer"}},"required":["submission_id"],"title":"get_submission_statusArguments","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_folders":{"post":{"operationId":"list_folders","summary":"List the folders (and subfolders) that organize your Formstack forms. Use for \"What folders do I have in Formstack\".","description":"List the folders (and subfolders) that organize your Formstack forms. Use for \"What folders do I have in Formstack\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"page":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"per_page":{"anyOf":[{"maximum":500,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many folders per page.","title":"Per Page"}},"title":"list_foldersArguments","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_portals":{"post":{"operationId":"list_portals","summary":"List the Formstack portals of your account with name, description, time zone and creation date. Use for \"Which Formstack","description":"List the Formstack portals of your account with name, description, time zone and creation date. Use for \"Which Formstack portals do I have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_portalsArguments","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}}}}