{"openapi":"3.1.0","info":{"title":"MOCO (BYOK) API","version":"0.1.0","description":"MOCO (BYOK) lets an AI assistant read your own MOCO data through the MOCO API with a key you supply (MOCO API key (a user key from your profile, or an account key with read-only access)). Read-only: 11 tools (check_session, list_projects, get_project, list_project_tasks, list_activities, list_companies, get_company, list_users, list_invoices, list_deals, list_planning_entries). The BYOK key...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-moco.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-moco/docs"},"termsOfService":"https://connectorbay.com/byok-moco/terms"},"servers":[{"url":"https://byok-moco.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-moco/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/check_session":{"post":{"operationId":"check_session","summary":"Check that the key is valid and show the id and uuid of the key's user. Use for \"Is my MOCO API key working\".","description":"Check that the key is valid and show the id and uuid of the key's user. Use for \"Is my MOCO API key working\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"domain":{"description":"Your MOCO account subdomain, the part before .mocoapp.com (for example 'acme' for acme.mocoapp.com).","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Domain","type":"string"}},"required":["domain"],"title":"check_sessionArguments","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 customer, leader, budget, billing variant and active flag. Filter by search text, customer, leader or","description":"List projects with customer, leader, budget, billing variant and active flag. Filter by search text, customer, leader or tags. Use for \"Which active MOCO projects do we have for customer 123456\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"domain":{"description":"Your MOCO account subdomain, the part before .mocoapp.com (for example 'acme' for acme.mocoapp.com).","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Domain","type":"string"},"include_archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to include archived projects.","title":"Include Archived"},"company_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only projects of this customer (company) id.","title":"Company Id"},"leader_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only projects led by this user id.","title":"Leader Id"},"term":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Search text matched against project name, identifier and customer name.","title":"Term"},"updated_after":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only entries created or updated after this ISO 8601 time, for example 2026-01-01T00:00:00Z.","title":"Updated After"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. Each page holds up to 100 entries.","title":"Page"}},"required":["domain"],"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/get_project":{"post":{"operationId":"get_project","summary":"Get one project with its tasks (services), assigned staff contracts, budget and customer. Use for \"Show MOCO project 123","description":"Get one project with its tasks (services), assigned staff contracts, budget and customer. Use for \"Show MOCO project 1234567 with its tasks and budget\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"domain":{"description":"Your MOCO account subdomain, the part before .mocoapp.com (for example 'acme' for acme.mocoapp.com).","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Domain","type":"string"},"id":{"description":"Numeric project id.","title":"Id","type":"integer"}},"required":["domain","id"],"title":"get_projectArguments","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_project_tasks":{"post":{"operationId":"list_project_tasks","summary":"List the tasks (services) of a project with billable, active, budget and hourly rate. Use for \"Which tasks does MOCO pro","description":"List the tasks (services) of a project with billable, active, budget and hourly rate. Use for \"Which tasks does MOCO project 1234567 have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"domain":{"description":"Your MOCO account subdomain, the part before .mocoapp.com (for example 'acme' for acme.mocoapp.com).","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Domain","type":"string"},"id":{"description":"Numeric project id.","title":"Id","type":"integer"}},"required":["domain","id"],"title":"list_project_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_activities":{"post":{"operationId":"list_activities","summary":"List tracked time entries (activities) with date, hours, project, task, customer and user. Filter by period, user, proje","description":"List tracked time entries (activities) with date, hours, project, task, customer and user. Filter by period, user, project, task or billing state. Use for \"How many hours were tracked on MOCO project 944587499 in June 2026\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"domain":{"description":"Your MOCO account subdomain, the part before .mocoapp.com (for example 'acme' for acme.mocoapp.com).","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Domain","type":"string"},"date_from":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"First day, YYYY-MM-DD.","title":"Date From"},"date_to":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Last day, YYYY-MM-DD.","title":"Date To"},"user_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only entries of this user id.","title":"User Id"},"project_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only entries of this project id.","title":"Project Id"},"task_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only entries of this task id.","title":"Task Id"},"company_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only entries of this customer id.","title":"Company Id"},"billable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for billable entries only, false for non-billable only.","title":"Billable"},"billed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"True for already billed entries only, false for not yet billed.","title":"Billed"},"term":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Search text matched against tag, description and remote id.","title":"Term"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. Each page holds up to 100 entries.","title":"Page"}},"required":["domain"],"title":"list_activitiesArguments","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_companies":{"post":{"operationId":"list_companies","summary":"List customers, suppliers and organizations with type, identifier, tags, currency and active state. Use for \"List our MO","description":"List customers, suppliers and organizations with type, identifier, tags, currency and active state. Use for \"List our MOCO customers whose name contains 'acme'\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"domain":{"description":"Your MOCO account subdomain, the part before .mocoapp.com (for example 'acme' for acme.mocoapp.com).","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Domain","type":"string"},"type":{"anyOf":[{"enum":["customer","supplier","organization"],"type":"string"},{"type":"null"}],"default":null,"description":"Company type: customer, supplier or organization.","title":"Type"},"include_archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to include archived companies.","title":"Include Archived"},"identifier":{"anyOf":[{"maxLength":50,"type":"string"},{"type":"null"}],"default":null,"description":"Exact company identifier, for example 'K0405'.","title":"Identifier"},"term":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Search text matched against the company name.","title":"Term"},"updated_after":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Only entries created or updated after this ISO 8601 time, for example 2026-01-01T00:00:00Z.","title":"Updated After"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. Each page holds up to 100 entries.","title":"Page"}},"required":["domain"],"title":"list_companiesArguments","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_company":{"post":{"operationId":"get_company","summary":"Get one company with its projects, tags, currency, VAT settings and default payment terms. Use for \"Show MOCO customer 7","description":"Get one company with its projects, tags, currency, VAT settings and default payment terms. Use for \"Show MOCO customer 760253573 with its projects\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"domain":{"description":"Your MOCO account subdomain, the part before .mocoapp.com (for example 'acme' for acme.mocoapp.com).","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Domain","type":"string"},"id":{"description":"Numeric company id.","title":"Id","type":"integer"}},"required":["domain","id"],"title":"get_companyArguments","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 team (staff) with name, active and external flags, unit, role and tags. Contact, bank and birthday fields are n","description":"List the team (staff) with name, active and external flags, unit, role and tags. Contact, bank and birthday fields are not returned. Use for \"Who is on our MOCO team\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"domain":{"description":"Your MOCO account subdomain, the part before .mocoapp.com (for example 'acme' for acme.mocoapp.com).","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Domain","type":"string"},"include_archived":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":false,"description":"True to include deactivated users.","title":"Include Archived"},"tags":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Comma-separated tags to filter by, for example 'Designer, Developer'.","title":"Tags"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. Each page holds up to 100 entries.","title":"Page"}},"required":["domain"],"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_invoices":{"post":{"operationId":"list_invoices","summary":"List invoices (without line items) with identifier, customer, status, dates, currency, net and gross totals. Filter by s","description":"List invoices (without line items) with identifier, customer, status, dates, currency, net and gross totals. Filter by status, period, customer or project. Use for \"Which MOCO invoices are overdue\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"domain":{"description":"Your MOCO account subdomain, the part before .mocoapp.com (for example 'acme' for acme.mocoapp.com).","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Domain","type":"string"},"status":{"anyOf":[{"maxLength":80,"type":"string"},{"type":"null"}],"default":null,"description":"Comma-separated statuses: draft, created, sent, partially_paid, paid, overdue, ignored.","title":"Status"},"date_from":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Invoice date from, YYYY-MM-DD.","title":"Date From"},"date_to":{"anyOf":[{"maxLength":10,"type":"string"},{"type":"null"}],"default":null,"description":"Invoice date to, YYYY-MM-DD.","title":"Date To"},"company_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only invoices of this customer id.","title":"Company Id"},"project_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only invoices of this project id.","title":"Project Id"},"term":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Search text matched against invoice title and identifier.","title":"Term"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. Each page holds up to 100 entries.","title":"Page"}},"required":["domain"],"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_deals":{"post":{"operationId":"list_deals","summary":"List leads (deals) with status, value, currency, company, category probability and reminder date. Use for \"Which MOCO le","description":"List leads (deals) with status, value, currency, company, category probability and reminder date. Use for \"Which MOCO leads are still pending\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"domain":{"description":"Your MOCO account subdomain, the part before .mocoapp.com (for example 'acme' for acme.mocoapp.com).","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Domain","type":"string"},"status":{"anyOf":[{"enum":["potential","pending","won","lost","dropped"],"type":"string"},{"type":"null"}],"default":null,"description":"Lead status: potential, pending, won, lost or dropped.","title":"Status"},"company_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only leads of this company id.","title":"Company Id"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. Each page holds up to 100 entries.","title":"Page"}},"required":["domain"],"title":"list_dealsArguments","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_planning_entries":{"post":{"operationId":"list_planning_entries","summary":"List planned staff time (planning entries) for a period, optionally for one user, project or lead. Use for \"Who is plann","description":"List planned staff time (planning entries) for a period, optionally for one user, project or lead. Use for \"Who is planned on MOCO project 944514545 in July 2026\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"domain":{"description":"Your MOCO account subdomain, the part before .mocoapp.com (for example 'acme' for acme.mocoapp.com).","maxLength":200,"pattern":"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$","title":"Domain","type":"string"},"period":{"anyOf":[{"maxLength":21,"type":"string"},{"type":"null"}],"default":null,"description":"Period as 'YYYY-MM-DD:YYYY-MM-DD', for example 2026-07-01:2026-07-31.","title":"Period"},"user_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only entries for this user id.","title":"User Id"},"project_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only entries for this project id.","title":"Project Id"},"deal_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only entries for this lead id.","title":"Deal Id"},"page":{"anyOf":[{"maximum":10000,"minimum":1,"type":"integer"},{"type":"null"}],"default":1,"description":"Page number, starting at 1. Each page holds up to 100 entries.","title":"Page"}},"required":["domain"],"title":"list_planning_entriesArguments","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}}}}