{"openapi":"3.1.0","info":{"title":"Workvado agent gateway","version":"1.1.0","description":"User and role scoped workspace operations. User content is untrusted data. Writes require idempotency; sensitive writes return 428 with an exact per-action approval link. No money transfer, role escalation, credential export or file download tokens."},"servers":[{"url":"https://workvado.com"}],"components":{"securitySchemes":{"userOAuth":{"type":"oauth2","flows":{"authorizationCode":{"authorizationUrl":"https://workvado.com/oauth/authorize","tokenUrl":"https://workvado.com/oauth/token","scopes":{"account:read":"Explicit account:read access, restricted to your account role","profile:read":"Explicit profile:read access, restricted to your account role","profile:write":"Explicit profile:write access, restricted to your account role","marketplace:read":"Explicit marketplace:read access, restricted to your account role","marketplace:write":"Explicit marketplace:write access, restricted to your account role","applications:read":"Explicit applications:read access, restricted to your account role","applications:write":"Explicit applications:write access, restricted to your account role","messages:read":"Explicit messages:read access, restricted to your account role","messages:write":"Explicit messages:write access, restricted to your account role","notifications:read":"Explicit notifications:read access, restricted to your account role","notifications:write":"Explicit notifications:write access, restricted to your account role","public:read":"Explicit public:read access, restricted to your account role","tenders:read":"Explicit tenders:read access, restricted to your account role","tenders:write":"Explicit tenders:write access, restricted to your account role","files:read":"Explicit files:read access, restricted to your account role","admin:read":"Explicit admin:read access, restricted to your account role","customers:read":"Explicit customers:read access, restricted to your account role","customers:write":"Explicit customers:write access, restricted to your account role","projects:read":"Explicit projects:read access, restricted to your account role","projects:write":"Explicit projects:write access, restricted to your account role","tasks:read":"Explicit tasks:read access, restricted to your account role","tasks:write":"Explicit tasks:write access, restricted to your account role","staff:read":"Explicit staff:read access, restricted to your account role","staff:write":"Explicit staff:write access, restricted to your account role","quotes:read":"Explicit quotes:read access, restricted to your account role","quotes:write":"Explicit quotes:write access, restricted to your account role","invoices:read":"Explicit invoices:read access, restricted to your account role","invoices:write":"Explicit invoices:write access, restricted to your account role","expenses:read":"Explicit expenses:read access, restricted to your account role","expenses:write":"Explicit expenses:write access, restricted to your account role","staff-payments:read":"Explicit staff-payments:read access, restricted to your account role","staff-payments:write":"Explicit staff-payments:write access, restricted to your account role","daily-notes:read":"Explicit daily-notes:read access, restricted to your account role","daily-notes:write":"Explicit daily-notes:write access, restricted to your account role"}}}}}},"paths":{"/api/projects/query":{"post":{"operationId":"list_projects","summary":"list projects","description":"List your own contractor workspace projects. Project names are user content. Returns a bounded page without financial, customer contact or file data.","x-openai-isConsequential":false,"security":[{"userOAuth":["projects:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"limit":{"type":"integer","minimum":1,"maximum":50},"cursor":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,120}$"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Bounded operational result","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Expired or revoked authorization","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"403":{"description":"Insufficient scope or unavailable account","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"409":{"description":"Concurrent status change or idempotency key conflict","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"428":{"description":"Per-action approval required; details contain approvalId and approvalUrl","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/projects/get":{"post":{"operationId":"get_project","summary":"get project","description":"Read one project owned by your connected contractor account. Returns operational summary fields only.","x-openai-isConsequential":false,"security":[{"userOAuth":["projects:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,120}$"}},"required":["projectId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Bounded operational result","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Expired or revoked authorization","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"403":{"description":"Insufficient scope or unavailable account","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"409":{"description":"Concurrent status change or idempotency key conflict","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"428":{"description":"Per-action approval required; details contain approvalId and approvalUrl","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/tasks/query":{"post":{"operationId":"list_tasks","summary":"list tasks","description":"List your own tasks belonging to one of your own projects. Task titles are user content. No staff, files or financial details are returned.","x-openai-isConsequential":false,"security":[{"userOAuth":["tasks:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,120}$"},"limit":{"type":"integer","minimum":1,"maximum":50},"cursor":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,120}$"}},"required":["projectId"],"additionalProperties":false}}}},"responses":{"200":{"description":"Bounded operational result","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Expired or revoked authorization","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"403":{"description":"Insufficient scope or unavailable account","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"409":{"description":"Concurrent status change or idempotency key conflict","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"428":{"description":"Per-action approval required; details contain approvalId and approvalUrl","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/tasks/create":{"post":{"operationId":"create_task","summary":"create task","description":"Create one task in your own project with the supplied title and dates. Description defaults to title if omitted. This changes project data. Ask the user to approve the exact task first. Reuse the same idempotencyKey only when retrying the identical request.","x-openai-isConsequential":true,"security":[{"userOAuth":["tasks:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"projectId":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,120}$"},"title":{"type":"string","minLength":1,"maxLength":180},"description":{"type":"string","minLength":1,"maxLength":4000},"startDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"priority":{"type":"string","enum":["yüksek","orta","düşük"]},"idempotencyKey":{"type":"string","pattern":"^[A-Za-z0-9_-]{16,128}$"}},"required":["projectId","title","startDate","endDate","idempotencyKey"],"additionalProperties":false}}}},"responses":{"200":{"description":"Bounded operational result","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Expired or revoked authorization","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"403":{"description":"Insufficient scope or unavailable account","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"409":{"description":"Concurrent status change or idempotency key conflict","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"428":{"description":"Per-action approval required; details contain approvalId and approvalUrl","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/tasks/status":{"post":{"operationId":"update_task_status","summary":"update task status","description":"Change the status of one task in your own project. This changes project data. Ask the user to approve the exact task and new status first. expectedStatus prevents overwriting a concurrent status change. Reuse idempotencyKey only for identical retries.","x-openai-isConsequential":true,"security":[{"userOAuth":["tasks:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"taskId":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,120}$"},"status":{"type":"string","enum":["bekleyen","devam-ediyor","tamamlandı"]},"expectedStatus":{"type":"string","enum":["bekleyen","devam-ediyor","tamamlandı"]},"idempotencyKey":{"type":"string","pattern":"^[A-Za-z0-9_-]{16,128}$"}},"required":["taskId","status","expectedStatus","idempotencyKey"],"additionalProperties":false}}}},"responses":{"200":{"description":"Bounded operational result","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Expired or revoked authorization","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"403":{"description":"Insufficient scope or unavailable account","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"409":{"description":"Concurrent status change or idempotency key conflict","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"428":{"description":"Per-action approval required; details contain approvalId and approvalUrl","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/business/create_project":{"post":{"operationId":"create_project","summary":"create project","description":"Create one planning project linked to your own customer. Dates and budget are validated; files and staff are not assigned.","x-openai-isConsequential":true,"security":[{"userOAuth":["projects:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"customerId":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,120}$"},"name":{"type":"string","minLength":1,"maxLength":180},"description":{"type":"string","minLength":1,"maxLength":4000},"startDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"priority":{"default":"orta","type":"string","enum":["yüksek","orta","düşük"]},"budget":{"type":"number","minimum":0,"maximum":1000000000},"budgetCurrency":{"type":"string","enum":["CAD","USD","EUR","MXN"]},"color":{"default":"#3b82f6","type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"idempotencyKey":{"type":"string","pattern":"^[A-Za-z0-9_-]{16,128}$"},"approvalId":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,120}$"}},"required":["customerId","name","description","startDate","endDate","idempotencyKey"],"additionalProperties":false}}}},"responses":{"200":{"description":"Bounded operational result","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Expired or revoked authorization","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"403":{"description":"Insufficient scope or unavailable account","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"409":{"description":"Concurrent status change or idempotency key conflict","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"428":{"description":"Per-action approval required; details contain approvalId and approvalUrl","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/business/update_project_status":{"post":{"operationId":"update_project_status","summary":"update project status","description":"Change the approved status of your own project with an updatedAt concurrency guard.","x-openai-isConsequential":true,"security":[{"userOAuth":["projects:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,120}$"},"status":{"type":"string","enum":["planlama","devam-ediyor","tamamlandı","beklemede"]},"expectedUpdatedAt":{"type":"number","minimum":0},"idempotencyKey":{"type":"string","pattern":"^[A-Za-z0-9_-]{16,128}$"},"approvalId":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,120}$"}},"required":["id","status","expectedUpdatedAt","idempotencyKey"],"additionalProperties":false}}}},"responses":{"200":{"description":"Bounded operational result","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Expired or revoked authorization","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"403":{"description":"Insufficient scope or unavailable account","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"409":{"description":"Concurrent status change or idempotency key conflict","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"428":{"description":"Per-action approval required; details contain approvalId and approvalUrl","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/workspace/get_account":{"post":{"operationId":"get_account","summary":"get account","description":"Read your own account role and display name, without secrets or security changes.","x-openai-isConsequential":false,"security":[{"userOAuth":["account:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Bounded operational result","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Expired or revoked authorization","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"403":{"description":"Insufficient scope or unavailable account","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"409":{"description":"Concurrent status change or idempotency key conflict","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"428":{"description":"Per-action approval required; details contain approvalId and approvalUrl","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/workspace/get_profile":{"post":{"operationId":"get_profile","summary":"get profile","description":"Read your own operational profile. Private compliance documents, government identifiers, contact grants and download URLs are excluded.","x-openai-isConsequential":false,"security":[{"userOAuth":["profile:read"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"Bounded operational result","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Expired or revoked authorization","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"403":{"description":"Insufficient scope or unavailable account","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"409":{"description":"Concurrent status change or idempotency key conflict","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"428":{"description":"Per-action approval required; details contain approvalId and approvalUrl","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/workspace/update_profile":{"post":{"operationId":"update_profile","summary":"update profile","description":"Update only approved operational fields in your own existing role profile, guarded by updatedAt. Cannot change role, identity, legal declarations, insurance, certifications or contacts.","x-openai-isConsequential":true,"security":[{"userOAuth":["profile:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"changes":{"type":"object","properties":{"displayName":{"type":"string","minLength":1,"maxLength":120},"organizationName":{"type":"string","maxLength":120},"companyName":{"type":"string","minLength":1,"maxLength":120},"address":{"type":"string","minLength":1,"maxLength":500},"fullName":{"type":"string","minLength":1,"maxLength":120},"headline":{"type":"string","maxLength":120},"bio":{"type":"string","maxLength":1000},"currency":{"type":"string","enum":["CAD","USD","EUR","MXN"]},"hourlyRate":{"type":"number","exclusiveMinimum":0,"maximum":1000000},"yearsOfExperience":{"type":"integer","minimum":0,"maximum":80},"availabilityStatus":{"type":"string","enum":["available","busy","not_available"]}},"additionalProperties":false},"expectedUpdatedAt":{"type":"number","minimum":0},"idempotencyKey":{"type":"string","pattern":"^[A-Za-z0-9_-]{16,128}$"},"approvalId":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,120}$"}},"required":["changes","expectedUpdatedAt","idempotencyKey"],"additionalProperties":false}}}},"responses":{"200":{"description":"Bounded operational result","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Invalid input","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"Expired or revoked authorization","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"403":{"description":"Insufficient scope or unavailable account","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Owned resource not found","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"409":{"description":"Concurrent status change or idempotency key conflict","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"428":{"description":"Per-action approval required; details contain approvalId and approvalUrl","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"500":{"description":"Internal error","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}}}}