{"openapi":"3.1.0","info":{"title":"Holded (BYOK) API","version":"0.1.0","description":"Holded (BYOK) lets an AI assistant read your own Holded data through the Holded API with a key you supply (Holded API key). Read-only: 12 tools (list_invoices, list_purchases, list_contacts, list_products, list_payments, list_accounting_accounts, list_taxes, list_projects, list_tasks, list_leads, list_employees, list_time_offs). The BYOK key travels with each request, is used for that one call...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-holded.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-holded/docs"},"termsOfService":"https://connectorbay.com/byok-holded/terms"},"servers":[{"url":"https://byok-holded.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-holded/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_invoices":{"post":{"operationId":"list_invoices","summary":"List sales invoices with number, contact, dates, subtotal, tax, total, currency, status and amounts paid and pending. Mo","description":"List sales invoices with number, contact, dates, subtotal, tax, total, currency, status and amounts paid and pending. Money values are decimal strings. Use for \"Which Holded invoices are overdue\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"contact_id":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only documents of this contact id, from list_contacts.","title":"Contact Id"},"status":{"anyOf":[{"enum":["pending","completed","partial","cancelled","failed","overdue","outstanding"],"type":"string"},{"type":"null"}],"default":null,"description":"Document status; outstanding means pending plus partial, overdue means outstanding and past due.","title":"Status"},"start_date":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only documents issued on or after this date, for example 2026-01-01.","title":"Start Date"},"end_date":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only documents issued on or before this date (a date alone includes the whole day), for example 2026-03-31.","title":"End Date"},"due_date_start":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only documents due on or after this date, for example 2026-02-01.","title":"Due Date Start"},"due_date_end":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only documents due on or before this date, for example 2026-02-28.","title":"Due Date End"},"sort":{"anyOf":[{"enum":["date","-date","dueDate","-dueDate","total","-total"],"type":"string"},{"type":"null"}],"default":null,"description":"Order by date, dueDate or total; prefix with - for descending, for example -date.","title":"Sort"},"approval_status":{"anyOf":[{"enum":["draft","approved"],"type":"string"},{"type":"null"}],"default":null,"description":"Approval state: draft or approved.","title":"Approval Status"},"accounting_account_num":{"anyOf":[{"maximum":999999999,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only invoices posted to this chart-of-accounts number (an integer, for example 70000000).","title":"Accounting Account Num"},"limit":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 200, default 50).","title":"Limit"},"cursor":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass the cursor value from the previous answer while has_more is true.","title":"Cursor"}},"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_purchases":{"post":{"operationId":"list_purchases","summary":"List purchase (supplier) invoices with number, supplier, dates, totals, currency, status and amounts paid and pending. U","description":"List purchase (supplier) invoices with number, supplier, dates, totals, currency, status and amounts paid and pending. Use for \"What purchase invoices from suppliers are still unpaid in Holded\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"contact_id":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only documents of this contact id, from list_contacts.","title":"Contact Id"},"status":{"anyOf":[{"enum":["pending","completed","partial","cancelled","failed","overdue","outstanding"],"type":"string"},{"type":"null"}],"default":null,"description":"Document status; outstanding means pending plus partial, overdue means outstanding and past due.","title":"Status"},"start_date":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only documents issued on or after this date, for example 2026-01-01.","title":"Start Date"},"end_date":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only documents issued on or before this date (a date alone includes the whole day), for example 2026-03-31.","title":"End Date"},"due_date_start":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only documents due on or after this date, for example 2026-02-01.","title":"Due Date Start"},"due_date_end":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only documents due on or before this date, for example 2026-02-28.","title":"Due Date End"},"sort":{"anyOf":[{"enum":["date","-date","dueDate","-dueDate","total","-total"],"type":"string"},{"type":"null"}],"default":null,"description":"Order by date, dueDate or total; prefix with - for descending, for example -date.","title":"Sort"},"approval_status":{"anyOf":[{"enum":["draft","approved"],"type":"string"},{"type":"null"}],"default":null,"description":"Approval state: draft or approved.","title":"Approval Status"},"limit":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 200, default 50).","title":"Limit"},"cursor":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass the cursor value from the previous answer while has_more is true.","title":"Cursor"}},"title":"list_purchasesArguments","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_contacts":{"post":{"operationId":"list_contacts","summary":"List contacts (clients, suppliers, leads) with name, tax id, type, email, phone, tags and dates. Filters are exact match","description":"List contacts (clients, suppliers, leads) with name, tax id, type, email, phone, tags and dates. Filters are exact matches. Limit is at most 100. Use for \"Find the Holded contact with the email billing@example.com\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"email":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Exact email address to match.","title":"Email"},"phone":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Exact phone number to match.","title":"Phone"},"mobile":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Exact mobile number to match.","title":"Mobile"},"code":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Exact tax id (NIF or CIF) to match.","title":"Code"},"custom_id":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Exact external reference id to match.","title":"Custom Id"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100, default 25).","title":"Limit"},"cursor":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass the cursor value from the previous answer while has_more is true.","title":"Cursor"}},"title":"list_contactsArguments","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_products":{"post":{"operationId":"list_products","summary":"List products with name, SKU, barcode, price, cost, stock, kind (simple, variants, lots, serial numbers, pack) and sale ","description":"List products with name, SKU, barcode, price, cost, stock, kind (simple, variants, lots, serial numbers, pack) and sale and purchase flags. Use for \"Which products in Holded are low on stock\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"name":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Search text matched against product names across the whole catalog.","title":"Name"},"limit":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 200, default 50).","title":"Limit"},"cursor":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass the cursor value from the previous answer while has_more is true.","title":"Cursor"}},"title":"list_productsArguments","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 recorded payments with amount, date, contact, payment and reconciliation status and the document they settle. The d","description":"List recorded payments with amount, date, contact, payment and reconciliation status and the document they settle. The documented limit default is 50. Use for \"What payments did we record in Holded this month\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"start_date":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only payments on or after this date, for example 2026-01-01.","title":"Start Date"},"end_date":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only payments on or before this date, for example 2026-01-31.","title":"End Date"},"document_type":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Kind of document the payment belongs to, for example invoice or purchase; may be used alone or with document_id.","title":"Document Type"},"document_id":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only payments of this document id.","title":"Document Id"},"banking_account_id":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only payments through this bank account id.","title":"Banking Account Id"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 100, default 50).","title":"Limit"},"cursor":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass the cursor value from the previous answer while has_more is true.","title":"Cursor"}},"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_accounting_accounts":{"post":{"operationId":"list_accounting_accounts","summary":"List the chart of accounts with number, name, group, debit, credit and balance. Returns all matches in one answer, no pa","description":"List the chart of accounts with number, name, group, debit, credit and balance. Returns all matches in one answer, no paging. Use for \"What is the balance of each account in my Holded chart of accounts\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"text":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Case-insensitive partial match on account name or number.","title":"Text"},"start_date":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only count activity from this date (YYYY-MM-DD).","title":"Start Date"},"end_date":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only count activity up to this date (YYYY-MM-DD).","title":"End Date"},"include_empty":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to include accounts with no transactions.","title":"Include Empty"},"archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to include archived accounts.","title":"Archived"}},"title":"list_accounting_accountsArguments","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_taxes":{"post":{"operationId":"list_taxes","summary":"List the configured taxes with name, percentage, scope, group, type and whether they are active. Use for \"What tax rates","description":"List the configured taxes with name, percentage, scope, group, type and whether they are active. Use for \"What tax rates are set up in Holded\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"list_taxesArguments","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 name, status, client, dates, tags, task counts and billable flag. Use for \"Which Holded projects are ","description":"List projects with name, status, client, dates, tags, task counts and billable flag. Use for \"Which Holded projects are in progress\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"status":{"anyOf":[{"enum":["active","in_progress","completed","cancelled","waiting","budgeted"],"type":"string"},{"type":"null"}],"default":null,"description":"Project status filter.","title":"Status"},"limit":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 200, default 50).","title":"Limit"},"cursor":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass the cursor value from the previous answer while has_more is true.","title":"Cursor"}},"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_tasks":{"post":{"operationId":"list_tasks","summary":"List project tasks with name, project id, status, priority, dates and assignees. Use for \"What tasks are open across my ","description":"List project tasks with name, project id, status, priority, dates and assignees. Use for \"What tasks are open across my Holded projects\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 200, default 50).","title":"Limit"},"cursor":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass the cursor value from the previous answer while has_more is true.","title":"Cursor"}},"title":"list_tasksArguments","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_leads":{"post":{"operationId":"list_leads","summary":"List CRM leads (deals) with name, funnel and stage, contact, value, probability, due date and status (open, won, lost). ","description":"List CRM leads (deals) with name, funnel and stage, contact, value, probability, due date and status (open, won, lost). Use for \"What open leads do I have in the Holded CRM\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 200, default 50).","title":"Limit"},"cursor":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass the cursor value from the previous answer while has_more is true.","title":"Cursor"}},"title":"list_leadsArguments","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_employees":{"post":{"operationId":"list_employees","summary":"List employees with name, code, work email, job title, team and workplace ids, reporting manager and terminated flag. Sa","description":"List employees with name, code, work email, job title, team and workplace ids, reporting manager and terminated flag. Salary, bank and identity fields are not returned. Use for \"Who is on the Holded team and what are their job titles\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"search":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Free-text filter over name, surname, email and code (case and accent insensitive).","title":"Search"},"limit":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 200, default 50).","title":"Limit"},"cursor":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass the cursor value from the previous answer while has_more is true.","title":"Cursor"}},"title":"list_employeesArguments","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_time_offs":{"post":{"operationId":"list_time_offs","summary":"List employee time-off requests that start inside a date range, with employee, leave type, dates, status and number of d","description":"List employee time-off requests that start inside a date range, with employee, leave type, dates, status and number of days. Use for \"Who is on leave in Holded during March 2026\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"start_date_from":{"description":"Earliest start date of the requests to list (YYYY-MM-DD).","maxLength":200,"title":"Start Date From","type":"string"},"start_date_to":{"description":"Latest start date of the requests to list (YYYY-MM-DD).","maxLength":200,"title":"Start Date To","type":"string"},"status":{"anyOf":[{"enum":["pending","accepted","rejected","cancelled"],"type":"string"},{"type":"null"}],"default":null,"description":"Request status filter.","title":"Status"},"time_off_type_id":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only this leave type id.","title":"Time Off Type Id"},"team_id":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only employees of this team id.","title":"Team Id"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"How many results to return (1 to 100, default 50).","title":"Limit"},"cursor":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"default":null,"description":"Paging cursor: leave out for the first page, or pass the cursor value from the previous answer while has_more is true.","title":"Cursor"}},"required":["start_date_from","start_date_to"],"title":"list_time_offsArguments","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}}}}