{"openapi":"3.1.0","info":{"title":"Field Pulse (BYOK) API","version":"0.1.0","description":"Field Pulse (BYOK) lets an AI assistant read your own Field Pulse data through the Field Pulse API with a key you supply (FieldPulse API key). Read-only: 10 tools (list_customers, list_jobs, list_estimates, list_invoices, list_payments, list_projects, list_timesheets, list_users, list_assets, list_items). 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-fieldpulse.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-fieldpulse/docs"},"termsOfService":"https://connectorbay.com/byok-fieldpulse/terms"},"servers":[{"url":"https://byok-fieldpulse.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-fieldpulse/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_customers":{"post":{"operationId":"list_customers","summary":"List customers, optionally searched by text and sorted by email, phone or address. Use for \"Which customers do I have in","description":"List customers, optionally searched by text and sorted by email, phone or address. Use for \"Which customers do I have in FieldPulse\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"search":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Free-text search string.","title":"Search"},"sort_by":{"anyOf":[{"enum":["searchable","email","phone","address_1"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort field: searchable, email, phone or address_1.","title":"Sort By"},"sort_dir":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort direction: asc or desc.","title":"Sort Dir"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many records per page (1 to 100; the provider default is 20).","title":"Limit"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"calculate_count":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":true,"description":"True to also return total_count, the number of matching records across all pages.","title":"Calculate Count"}},"title":"list_customersArguments","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_jobs":{"post":{"operationId":"list_jobs","summary":"List jobs, filtered by creation time window or status ids, newest or oldest first. Use for \"Which jobs were created in F","description":"List jobs, filtered by creation time window or status ids, newest or oldest first. Use for \"Which jobs were created in FieldPulse this month\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"search":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Free-text search string.","title":"Search"},"sort_by":{"anyOf":[{"enum":["created_at","updated_at"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort field: created_at or updated_at.","title":"Sort By"},"sort_dir":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort direction: asc or desc.","title":"Sort Dir"},"created_from":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Only jobs created at or after this UNIX timestamp (seconds).","title":"Created From"},"created_to":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Only jobs created at or before this UNIX timestamp (seconds).","title":"Created To"},"status_id":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Comma-separated custom job status ids to include, for example '12,15'.","title":"Status Id"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many records per page (1 to 100; the provider default is 20).","title":"Limit"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"title":"list_jobsArguments","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_estimates":{"post":{"operationId":"list_estimates","summary":"List estimates with optional text search and sorting. Use for \"Show my latest FieldPulse estimates\".","description":"List estimates with optional text search and sorting. Use for \"Show my latest FieldPulse estimates\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"search":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Free-text search string.","title":"Search"},"sort_by":{"anyOf":[{"maxLength":50,"type":"string"},{"type":"null"}],"default":null,"description":"Attribute name to sort by, for example created_at.","title":"Sort By"},"sort_dir":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort direction: asc or desc.","title":"Sort Dir"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many records per page (1 to 100; the provider default is 20).","title":"Limit"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"calculate_count":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":true,"description":"True to also return total_count, the number of matching records across all pages.","title":"Calculate Count"}},"title":"list_estimatesArguments","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_invoices":{"post":{"operationId":"list_invoices","summary":"List invoices with optional text search and sorting. Use for \"What invoices have I issued in FieldPulse\".","description":"List invoices with optional text search and sorting. Use for \"What invoices have I issued in FieldPulse\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"search":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Free-text search string.","title":"Search"},"sort_by":{"anyOf":[{"maxLength":50,"type":"string"},{"type":"null"}],"default":null,"description":"Attribute name to sort by, for example created_at.","title":"Sort By"},"sort_dir":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort direction: asc or desc.","title":"Sort Dir"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many records per page (1 to 100; the provider default is 20).","title":"Limit"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"calculate_count":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":true,"description":"True to also return total_count, the number of matching records across all pages.","title":"Calculate Count"}},"title":"list_invoicesArguments","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_payments":{"post":{"operationId":"list_payments","summary":"List payments received, sortable by method, amount or payment date. Use for \"Which payments did FieldPulse record most r","description":"List payments received, sortable by method, amount or payment date. Use for \"Which payments did FieldPulse record most recently\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"search":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Free-text search string.","title":"Search"},"sort_by":{"anyOf":[{"enum":["cuid","method","amount","payment_date"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort field: cuid, method, amount or payment_date.","title":"Sort By"},"sort_dir":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort direction: asc or desc.","title":"Sort Dir"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many records per page (1 to 100; the provider default is 20).","title":"Limit"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"}},"title":"list_paymentsArguments","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 with optional text search and sorting. Use for \"What projects are open in FieldPulse\".","description":"List projects with optional text search and sorting. Use for \"What projects are open in FieldPulse\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"search":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Free-text search string.","title":"Search"},"sort_by":{"anyOf":[{"maxLength":50,"type":"string"},{"type":"null"}],"default":null,"description":"Attribute name to sort by, for example created_at.","title":"Sort By"},"sort_dir":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":null,"description":"Sort direction: asc or desc.","title":"Sort Dir"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many records per page (1 to 100; the provider default is 20).","title":"Limit"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"calculate_count":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":true,"description":"True to also return total_count, the number of matching records across all pages.","title":"Calculate Count"}},"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_timesheets":{"post":{"operationId":"list_timesheets","summary":"List staff timesheet entries, filtered by user, clock-in or clock-out time, or type. Use for \"How many hours did user 42","description":"List staff timesheet entries, filtered by user, clock-in or clock-out time, or type. Use for \"How many hours did user 42 clock in FieldPulse\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"user_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only timesheets of this user id.","title":"User Id"},"in_time":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Clock-in time as a UNIX timestamp (seconds).","title":"In Time"},"out_time":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Clock-out time as a UNIX timestamp (seconds).","title":"Out Time"},"type":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Timesheet type to filter by, for example job.","title":"Type"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many records per page (1 to 100; the provider default is 20).","title":"Limit"},"calculate_count":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":true,"description":"True to also return total_count, the number of matching records across all pages.","title":"Calculate Count"}},"title":"list_timesheetsArguments","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_users":{"post":{"operationId":"list_users","summary":"List the company's FieldPulse users (office staff and technicians). Use for \"Who are the technicians and staff in my Fie","description":"List the company's FieldPulse users (office staff and technicians). Use for \"Who are the technicians and staff in my FieldPulse account\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many records per page (1 to 100; the provider default is 20).","title":"Limit"},"calculate_count":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":true,"description":"True to also return total_count, the number of matching records across all pages.","title":"Calculate Count"}},"title":"list_usersArguments","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_assets":{"post":{"operationId":"list_assets","summary":"List customer assets (equipment), filtered by status installed, uninstalled or retired. Use for \"Which equipment assets ","description":"List customer assets (equipment), filtered by status installed, uninstalled or retired. Use for \"Which equipment assets are installed at customer sites in FieldPulse\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"search":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Free-text search string.","title":"Search"},"status":{"anyOf":[{"enum":["uninstalled","installed","retired"],"type":"string"},{"type":"null"}],"default":null,"description":"Asset status: uninstalled, installed or retired.","title":"Status"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many records per page (1 to 100; the provider default is 20).","title":"Limit"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"calculate_count":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":true,"description":"True to also return total_count, the number of matching records across all pages.","title":"Calculate Count"}},"title":"list_assetsArguments","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_items":{"post":{"operationId":"list_items","summary":"List the invoice items (price book entries) defined in FieldPulse. Use for \"What items are in my FieldPulse price book\".","description":"List the invoice items (price book entries) defined in FieldPulse. Use for \"What items are in my FieldPulse price book\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many records per page (1 to 100; the provider default is 20).","title":"Limit"},"page":{"anyOf":[{"maximum":100000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1.","title":"Page"},"calculate_count":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":true,"description":"True to also return total_count, the number of matching records across all pages.","title":"Calculate Count"}},"title":"list_itemsArguments","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}}}}