{"openapi":"3.1.0","info":{"title":"Fulcrum (BYOK) API","version":"0.1.0","description":"Fulcrum (BYOK) lets an AI assistant read your own Fulcrum data through the Fulcrum API with a key you supply (Fulcrum API token (US instance, Developer Pack)). Read-only: 8 tools (list_forms, get_form, list_records, get_record, get_record_history, list_projects, list_roles, run_query). 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-fulcrum.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-fulcrum/docs"},"termsOfService":"https://connectorbay.com/byok-fulcrum/terms"},"servers":[{"url":"https://byok-fulcrum.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-fulcrum/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 forms (apps) of the organization. Schema details are left out by default so the list stays small; each form carries","description":"List forms (apps) of the organization. Schema details are left out by default so the list stays small; each form carries id, name and record count. Use for \"Which Fulcrum forms do I have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"False (default here) returns form metadata only; true adds every field definition and can be very large.","title":"Schema"},"status":{"anyOf":[{"enum":["active","inactive","all"],"type":"string"},{"type":"null"}],"default":"active","description":"Which forms: active (default), inactive or all.","title":"Status"},"type":{"anyOf":[{"enum":["organization","system","all"],"type":"string"},{"type":"null"}],"default":"organization","description":"Which forms: organization (default), system or all.","title":"Type"},"per_page":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many forms per page.","title":"Per Page"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"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 form's definition summary: name, description, record count, geometry types and dates. Use for \"Show Fulcrum form","description":"Get one form's definition summary: name, description, record count, geometry types and dates. Use for \"Show Fulcrum form details for a form ID\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"form_id":{"description":"Form ID (a UUID).","maxLength":200,"title":"Form Id","type":"string"},"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"False (default here) skips the field definitions.","title":"Schema"}},"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_records":{"post":{"operationId":"list_records","summary":"List records (survey, inspection or asset entries) filtered by form, project, changeset or dates, with status, author, l","description":"List records (survey, inspection or asset entries) filtered by form, project, changeset or dates, with status, author, location and update time. Form field values are left out; use get_record for one record. Use for \"What records were updated in Fulcrum form X since yesterday\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"form_id":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Only records of this form ID.","title":"Form Id"},"project_id":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Only records of this project ID.","title":"Project Id"},"changeset_id":{"anyOf":[{"maxLength":60,"type":"string"},{"type":"null"}],"default":null,"description":"Only records of this changeset ID.","title":"Changeset Id"},"updated_since":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Only records updated on the server after this time, as Unix epoch seconds.","title":"Updated Since"},"updated_before":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Only records updated on the server before this time, as Unix epoch seconds.","title":"Updated Before"},"created_since":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Only records created on the server after this time, as Unix epoch seconds.","title":"Created Since"},"created_before":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Only records created on the server before this time, as Unix epoch seconds.","title":"Created Before"},"newest_first":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":true,"description":"True to sort by update time, newest first.","title":"Newest First"},"per_page":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many records per page (the service allows up to 20000; this connector shows at most 50 per answer).","title":"Per Page"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"title":"list_recordsArguments","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_record":{"post":{"operationId":"get_record","summary":"Get one record by ID with its form values, status, location and timestamps. Use for \"Show Fulcrum record 8b3c... in full","description":"Get one record by ID with its form values, status, location and timestamps. Use for \"Show Fulcrum record 8b3c... in full\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"record_id":{"description":"Record ID (a UUID).","maxLength":200,"title":"Record Id","type":"string"}},"required":["record_id"],"title":"get_recordArguments","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_record_history":{"post":{"operationId":"get_record_history","summary":"Get the version history of one record: each saved version with status and update time. Use for \"How did Fulcrum record 8","description":"Get the version history of one record: each saved version with status and update time. Use for \"How did Fulcrum record 8b3c... change over time\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"record_id":{"description":"Record ID (a UUID).","maxLength":200,"title":"Record Id","type":"string"},"per_page":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many records per page (the service allows up to 20000; this connector shows at most 50 per answer).","title":"Per Page"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"required":["record_id"],"title":"get_record_historyArguments","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_projects":{"post":{"operationId":"list_projects","summary":"List projects used to group records, with name and description. Use for \"Which Fulcrum projects exist\".","description":"List projects used to group records, with name and description. Use for \"Which Fulcrum projects exist\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"per_page":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many projects per page.","title":"Per Page"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"title":"list_projectsArguments","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_roles":{"post":{"operationId":"list_roles","summary":"List the roles of the organization. Use for \"What roles exist in my Fulcrum organization\".","description":"List the roles of the organization. Use for \"What roles exist in my Fulcrum organization\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"per_page":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many roles per page.","title":"Per Page"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"title":"list_rolesArguments","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/run_query":{"post":{"operationId":"run_query","summary":"Run a read-only SQL query against the organization's Fulcrum data (forms, records, repeatables, choice lists and more) a","description":"Run a read-only SQL query against the organization's Fulcrum data (forms, records, repeatables, choice lists and more) and return rows as JSON. The query cannot change data; it is limited to 10 seconds of processing. Use for \"How many records does each Fulcrum form have? (SELECT ...)\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"q":{"description":"SQL SELECT statement, for example: SELECT _record_id, _status FROM \"My Form\" LIMIT 20.","maxLength":2000,"title":"Q","type":"string"},"format":{"anyOf":[{"const":"json","type":"string"},{"type":"null"}],"default":"json","description":"Result format; only json is offered here.","title":"Format"},"per_page":{"anyOf":[{"maximum":1000,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"Rows per page (this connector shows at most 50 rows per answer).","title":"Per Page"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"required":["q"],"title":"run_queryArguments","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}}}}