{"openapi":"3.1.0","info":{"title":"Nobe public API","version":"1.0.0","description":"Read and add tasks, and post a message to the team channel, from your own systems. Available on the Pro plan. Per key: 60 requests a minute. Version 1 only ever gets additions: fields and endpoints are never renamed, changed or removed."},"servers":[{"url":"https://doable-olive.vercel.app/api/v1"}],"security":[{"bearer":[]}],"paths":{"/me":{"get":{"operationId":"getMe","summary":"Check a key","description":"The key's name, prefix and scopes, and the company's name. Any valid key.","responses":{"200":{"description":"The key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"429":{"$ref":"#/components/responses/Error429"}}}},"/tasks":{"get":{"operationId":"listTasks","summary":"List tasks","description":"Needs tasks:read. Newest first.","parameters":[{"name":"status","in":"query","schema":{"$ref":"#/components/schemas/TaskStatus"}},{"name":"team_id","in":"query","schema":{"type":"string","format":"uuid"}},{"name":"assignee_person_id","in":"query","schema":{"type":"string","format":"uuid"}},{"name":"external_id","in":"query","schema":{"type":"string"}},{"name":"updated_since","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"cursor","in":"query","description":"Opaque, from next_cursor of the previous page.","schema":{"type":"string"}}],"responses":{"200":{"description":"A page of results.","content":{"application/json":{"schema":{"type":"object","required":["data","next_cursor"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Task"}},"next_cursor":{"type":["string","null"]}}}}}},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"}}},"post":{"operationId":"createTask","summary":"Create a task","description":"Needs tasks:write.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"1 to 64 printable characters. The same key with the same body returns the first response and creates nothing. Kept 24 hours.","schema":{"type":"string","minLength":1,"maxLength":64}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewTask"}}}},"responses":{"201":{"description":"The new task.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"409":{"$ref":"#/components/responses/Error409"},"413":{"$ref":"#/components/responses/Error413"},"415":{"$ref":"#/components/responses/Error415"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"}}}},"/tasks/{id}":{"get":{"operationId":"getTask","summary":"One task","description":"Needs tasks:read.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The task.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"429":{"$ref":"#/components/responses/Error429"}}},"patch":{"operationId":"updateTask","summary":"Change a task","description":"Needs tasks:write. external_id cannot be changed.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskChanges"}}}},"responses":{"200":{"description":"The task.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"413":{"$ref":"#/components/responses/Error413"},"415":{"$ref":"#/components/responses/Error415"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"}}}},"/tasks/{id}/complete":{"post":{"operationId":"completeTask","summary":"Mark a task done","description":"Needs tasks:write. Refused with 422 evidence_required when the task needs a photo, which the API cannot send.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The task.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"404":{"$ref":"#/components/responses/Error404"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"}}}},"/task-types":{"get":{"operationId":"listTaskTypes","summary":"Task types","description":"Needs tasks:read.","parameters":[],"responses":{"200":{"description":"All of them.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NamedItem"}}}}}}},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"429":{"$ref":"#/components/responses/Error429"}}}},"/teams":{"get":{"operationId":"listTeams","summary":"Teams","description":"Needs tasks:read.","parameters":[],"responses":{"200":{"description":"All of them.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/NamedItem"}}}}}}},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"429":{"$ref":"#/components/responses/Error429"}}}},"/people":{"get":{"operationId":"listPeople","summary":"People","description":"Needs people:read. Only id, name and team ids of active people.","parameters":[],"responses":{"200":{"description":"All of them.","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Person"}}}}}}},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"429":{"$ref":"#/components/responses/Error429"}}}},"/messages":{"post":{"operationId":"postMessage","summary":"Post a message to the team channel","description":"Needs messages:write. Plain text, shown as sent by the integration (the key's name). Sends no notification.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"1 to 64 printable characters. The same key with the same body returns the first response and creates nothing. Kept 24 hours.","schema":{"type":"string","minLength":1,"maxLength":64}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"additionalProperties":false,"properties":{"text":{"type":"string","minLength":1,"maxLength":4000}}}}}},"responses":{"201":{"description":"The message.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"created_at":{"type":"string","format":"date-time"}}}}}},"401":{"$ref":"#/components/responses/Error401"},"403":{"$ref":"#/components/responses/Error403"},"413":{"$ref":"#/components/responses/Error413"},"415":{"$ref":"#/components/responses/Error415"},"422":{"$ref":"#/components/responses/Error422"},"429":{"$ref":"#/components/responses/Error429"}}}}},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"An API key made in Settings > Integrations: Authorization: Bearer dbl_live_..."}},"schemas":{"TaskStatus":{"type":"string","enum":["new","available","assigned","accepted","in_progress","waiting","awaiting_approval","resolved","cancelled"]},"Task":{"type":"object","required":["id","title","status","priority","created_at","updated_at"],"properties":{"id":{"type":"string","format":"uuid"},"external_id":{"type":["string","null"]},"title":{"type":"string"},"description":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/TaskStatus"},"priority":{"type":"string","enum":["low","normal","high","urgent"]},"due_at":{"type":["string","null"],"format":"date-time"},"team_id":{"type":["string","null"],"format":"uuid"},"assignee_person_id":{"type":["string","null"],"format":"uuid"},"task_type_id":{"type":["string","null"],"format":"uuid"},"source":{"type":"string","enum":["api","chat","manual"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"completed_at":{"type":["string","null"],"format":"date-time"}}},"NewTask":{"type":"object","required":["title"],"additionalProperties":false,"properties":{"title":{"type":"string","minLength":1,"maxLength":200},"description":{"type":"string","maxLength":4000},"priority":{"type":"string","enum":["low","normal","high","urgent"]},"due_at":{"type":"string","format":"date-time"},"team_id":{"type":"string","format":"uuid"},"assignee_person_id":{"type":"string","format":"uuid"},"task_type_id":{"type":"string","format":"uuid"},"external_id":{"type":"string","minLength":1,"maxLength":100,"pattern":"^[A-Za-z0-9._:/-]+$","description":"For example an order number. Unique among the company's tasks that are not cancelled."}}},"TaskChanges":{"type":"object","additionalProperties":false,"properties":{"title":{"type":"string","maxLength":200},"description":{"type":"string","maxLength":4000},"priority":{"type":"string","enum":["low","normal","high","urgent"]},"due_at":{"type":"string","format":"date-time"},"team_id":{"type":"string","format":"uuid"},"assignee_person_id":{"type":"string","format":"uuid"},"task_type_id":{"type":"string","format":"uuid"}}},"NamedItem":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}}},"Person":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"team_ids":{"type":"array","items":{"type":"string","format":"uuid"}}}},"Me":{"type":"object","properties":{"key":{"type":"object","properties":{"name":{"type":"string"},"prefix":{"type":"string"},"scopes":{"type":"array","items":{"type":"string","enum":["tasks:read","tasks:write","messages:write","people:read"]}}}},"company":{"type":"object","properties":{"name":{"type":"string"}}}}},"Error":{"type":"object","required":["error","request_id"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","forbidden_scope","plan_required","not_found","conflict","payload_too_large","unsupported_media_type","validation_failed","rate_limited","server_error"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}},"request_id":{"type":"string"}}}},"responses":{"Error401":{"description":"The key is missing, malformed, unknown, revoked or expired.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Error403":{"description":"The key lacks the scope (forbidden_scope) or the company is not on a plan with the API (plan_required).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Error404":{"description":"Not found in this company.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Error409":{"description":"external_id already used (existing_task_id is returned), or the same Idempotency-Key is still being processed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Error413":{"description":"Body over 256 KB.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Error415":{"description":"The body is not application/json.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Error422":{"description":"A wrong or missing field, an unknown field, or a state the task cannot move to.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Error429":{"description":"Over 60 requests in the minute. Retry-After says how many seconds to wait.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}