{
 "openapi": "3.1.0",
 "info": {
  "title": "Tasks API",
  "version": "1.0.0",
  "summary": "Free kanban boards (a free Trello alternative) for people and their AI assistants.",
  "description": "Make boards, add, change and move cards, comment, and read boards back. No account. Reading a board needs only its id (the secret in its link). Changing it needs the board key, returned once as boardKey when the board is made, in the x-board-key header. Errors are JSON with an error sentence that says what to change. Full guide: https://tasks-free.openapps.xyz/llms.txt",
  "contact": {
   "name": "OpenApps",
   "url": "https://free-apps.openapps.xyz/"
  }
 },
 "servers": [
  {
   "url": "https://functions.bounded.sh/apps/f6f2112e77bc8c011e38c83a/api"
  }
 ],
 "externalDocs": {
  "url": "https://tasks-free.openapps.xyz/llms.txt",
  "description": "llms.txt guide"
 },
 "components": {
  "securitySchemes": {
   "boardKey": {
    "type": "apiKey",
    "in": "header",
    "name": "x-board-key",
    "description": "The board's key (boardKey from POST /boards, or the part after #k= in the admin link). It also allows renaming, archiving and deleting the board, so keep it private."
   }
  },
  "schemas": {
   "Error": {
    "type": "object",
    "properties": {
     "error": {
      "type": "string"
     }
    },
    "required": [
     "error"
    ]
   },
   "Checklist": {
    "type": "array",
    "items": {
     "type": "object",
     "properties": {
      "text": {
       "type": "string"
      },
      "done": {
       "type": "boolean"
      }
     },
     "required": [
      "text",
      "done"
     ]
    }
   },
   "Card": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string"
     },
     "title": {
      "type": "string"
     },
     "list": {
      "type": "string"
     },
     "listId": {
      "type": "string"
     },
     "position": {
      "type": "integer",
      "description": "Place in its list, from 0."
     },
     "description": {
      "type": "string",
      "description": "Markdown."
     },
     "due": {
      "type": "string",
      "description": "\"\" when there is none."
     },
     "done": {
      "type": "boolean"
     },
     "labels": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "assignees": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "checklist": {
      "$ref": "#/components/schemas/Checklist"
     },
     "cover": {
      "type": "string"
     },
     "archived": {
      "type": "boolean"
     },
     "url": {
      "type": "string",
      "format": "uri"
     },
     "comments": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Comment"
      }
     }
    },
    "required": [
     "id",
     "title",
     "description",
     "due",
     "done",
     "labels",
     "assignees",
     "checklist",
     "archived",
     "url"
    ]
   },
   "Comment": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string"
     },
     "name": {
      "type": "string"
     },
     "text": {
      "type": "string"
     },
     "at": {
      "type": "string",
      "format": "date-time"
     }
    }
   },
   "List": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string"
     },
     "title": {
      "type": "string"
     },
     "archived": {
      "type": "boolean"
     },
     "cards": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/Card"
      }
     }
    },
    "required": [
     "id",
     "title",
     "archived",
     "cards"
    ]
   },
   "Board": {
    "type": "object",
    "properties": {
     "board": {
      "type": "object",
      "properties": {
       "id": {
        "type": "string"
       },
       "title": {
        "type": "string"
       },
       "url": {
        "type": "string",
        "format": "uri"
       },
       "archived": {
        "type": "boolean"
       }
      }
     },
     "labels": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "id": {
         "type": "string"
        },
        "name": {
         "type": "string"
        },
        "color": {
         "type": "string",
         "enum": [
          "green",
          "yellow",
          "orange",
          "red",
          "pink",
          "purple",
          "blue",
          "sky",
          "gray"
         ]
        }
       }
      }
     },
     "members": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "id": {
         "type": "string"
        },
        "name": {
         "type": "string"
        }
       }
      }
     },
     "lists": {
      "type": "array",
      "items": {
       "$ref": "#/components/schemas/List"
      }
     },
     "counts": {
      "type": "object",
      "properties": {
       "lists": {
        "type": "integer"
       },
       "cards": {
        "type": "integer"
       }
      }
     }
    },
    "required": [
     "board",
     "labels",
     "members",
     "lists"
    ]
   },
   "CreatedBoard": {
    "allOf": [
     {
      "$ref": "#/components/schemas/Board"
     },
     {
      "type": "object",
      "properties": {
       "boardKey": {
        "type": "string"
       },
       "adminUrl": {
        "type": "string",
        "format": "uri"
       },
       "note": {
        "type": "string"
       }
      },
      "required": [
       "boardKey",
       "adminUrl"
      ]
     }
    ]
   },
   "CardInput": {
    "type": "object",
    "properties": {
     "title": {
      "type": "string",
      "maxLength": 500
     },
     "description": {
      "type": "string",
      "maxLength": 20000
     },
     "due": {
      "type": [
       "string",
       "null"
      ],
      "description": "Wall-clock date, \"2026-11-03\" or \"2026-11-03T15:00\". null or \"\" clears it.",
      "examples": [
       "2026-11-03"
      ]
     },
     "done": {
      "type": "boolean",
      "description": "The due date is complete."
     },
     "labels": {
      "type": "array",
      "items": {
       "type": "string",
       "maxLength": 40
      },
      "description": "Labels by name or id. Names the board does not have yet are added. Replaces the whole list.",
      "maxItems": 50
     },
     "assignees": {
      "type": "array",
      "items": {
       "type": "string",
       "maxLength": 40
      },
      "description": "People by name or id. Names the board does not have yet are added. Replaces the whole list.",
      "maxItems": 100
     },
     "checklist": {
      "type": "array",
      "maxItems": 100,
      "description": "Replaces the whole checklist.",
      "items": {
       "oneOf": [
        {
         "type": "string",
         "maxLength": 500
        },
        {
         "type": "object",
         "properties": {
          "text": {
           "type": "string",
           "maxLength": 500
          },
          "done": {
           "type": "boolean"
          }
         },
         "required": [
          "text"
         ]
        }
       ]
      }
     },
     "cover": {
      "oneOf": [
       {
        "type": "string",
        "enum": [
         "green",
         "yellow",
         "orange",
         "red",
         "pink",
         "purple",
         "blue",
         "sky",
         "gray"
        ]
       },
       {
        "type": "string",
        "enum": [
         ""
        ]
       }
      ]
     },
     "archived": {
      "type": "boolean"
     },
     "list": {
      "type": "string",
      "description": "A list title or id."
     },
     "position": {
      "description": "\"top\", \"bottom\" (default) or a whole number from 0 (0 is the top).",
      "oneOf": [
       {
        "type": "string",
        "enum": [
         "top",
         "bottom"
        ]
       },
       {
        "type": "integer",
        "minimum": 0
       }
      ]
     }
    }
   },
   "NewBoard": {
    "type": "object",
    "properties": {
     "title": {
      "type": "string",
      "maxLength": 120
     },
     "template": {
      "type": "string",
      "enum": [
       "blank",
       "kanban",
       "weekly-plan",
       "content-calendar",
       "bug-tracker"
      ]
     },
     "lists": {
      "type": "array",
      "maxItems": 100,
      "description": "List titles, or lists with cards. Defaults to To do, Doing, Done.",
      "items": {
       "oneOf": [
        {
         "type": "string"
        },
        {
         "type": "object",
         "properties": {
          "title": {
           "type": "string"
          },
          "archived": {
           "type": "boolean"
          },
          "cards": {
           "type": "array",
           "items": {
            "oneOf": [
             {
              "type": "string"
             },
             {
              "$ref": "#/components/schemas/CardInput"
             }
            ]
           }
          }
         },
         "required": [
          "title"
         ]
        }
       ]
      }
     },
     "labels": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "name": {
         "type": "string"
        },
        "color": {
         "type": "string",
         "enum": [
          "green",
          "yellow",
          "orange",
          "red",
          "pink",
          "purple",
          "blue",
          "sky",
          "gray"
         ]
        }
       }
      }
     },
     "members": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "trello": {
      "type": "object",
      "description": "A Trello board's JSON export (up to 128 KB). Lists, cards, labels, checklists, due dates, members and comments come across."
     }
    }
   }
  }
 },
 "paths": {
  "/templates": {
   "get": {
    "operationId": "listTemplates",
    "summary": "List the board templates and what they contain",
    "responses": {
     "200": {
      "description": "Templates",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "templates": {
           "type": "array",
           "items": {
            "type": "object",
            "properties": {
             "id": {
              "type": "string"
             },
             "name": {
              "type": "string"
             },
             "summary": {
              "type": "string"
             },
             "lists": {
              "type": "array",
              "items": {
               "type": "object",
               "properties": {
                "title": {
                 "type": "string"
                },
                "cards": {
                 "type": "array",
                 "items": {
                  "type": "string"
                 }
                }
               }
              }
             }
            }
           }
          }
         }
        },
        "example": {
         "templates": [
          {
           "id": "kanban",
           "name": "Kanban",
           "summary": "To do, Doing and Done, with a few cards that show how a board works.",
           "lists": [
            {
             "title": "To do",
             "cards": [
              "Drag a card to Doing when you start it"
             ]
            },
            {
             "title": "Doing",
             "cards": []
            },
            {
             "title": "Done",
             "cards": [
              "Make a board"
             ]
            }
           ]
          }
         ]
        }
       }
      }
     }
    }
   }
  },
  "/boards": {
   "post": {
    "operationId": "createBoard",
    "summary": "Make a board from a template, a description of lists and cards, or a Trello export",
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/NewBoard"
       },
       "example": {
        "title": "Website relaunch",
        "lists": [
         {
          "title": "To do",
          "cards": [
           "Pick a hosting plan",
           {
            "title": "Write the About page",
            "due": "2026-11-03",
            "labels": [
             "Copy"
            ],
            "assignees": [
             "Sam"
            ],
            "checklist": [
             "Draft",
             "Review"
            ]
           }
          ]
         },
         "Doing",
         "Done"
        ],
        "labels": [
         {
          "name": "Copy",
          "color": "blue"
         }
        ]
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "The new board, with boardKey and adminUrl",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/CreatedBoard"
        },
        "example": {
         "board": {
          "id": "aB3dE5fG7hJ9kL2mN4pQ",
          "title": "Launch plan",
          "url": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ",
          "archived": false
         },
         "labels": [
          {
           "id": "Lb2cD4eF6g",
           "name": "High priority",
           "color": "red"
          }
         ],
         "members": [
          {
           "id": "Mm7nP8qR9s",
           "name": "Sam"
          }
         ],
         "lists": [
          {
           "id": "Hn4xW2pQ9r",
           "title": "To do",
           "archived": false,
           "cards": [
            {
             "id": "Kq3vT8mZp2Lw",
             "title": "Write the brief",
             "description": "",
             "due": "2026-11-03",
             "done": false,
             "labels": [
              "High priority"
             ],
             "assignees": [
              "Sam"
             ],
             "checklist": [
              {
               "text": "Outline",
               "done": true
              },
              {
               "text": "Draft",
               "done": false
              }
             ],
             "cover": "",
             "archived": false,
             "url": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ/c/Kq3vT8mZp2Lw"
            }
           ]
          },
          {
           "id": "Jk5yX3rS8t",
           "title": "Doing",
           "archived": false,
           "cards": []
          },
          {
           "id": "Tz6aB4cD7e",
           "title": "Done",
           "archived": false,
           "cards": []
          }
         ],
         "counts": {
          "lists": 3,
          "cards": 1
         },
         "boardKey": "xY7zA2bC4dE6fG8hJ3kL5mN9",
         "adminUrl": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ/admin#k=xY7zA2bC4dE6fG8hJ3kL5mN9",
         "note": "Give the person the board url..."
        }
       }
      }
     },
     "400": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "401": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "403": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "404": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "409": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     }
    }
   }
  },
  "/boards/{boardId}": {
   "parameters": [
    {
     "name": "boardId",
     "in": "path",
     "required": true,
     "description": "The board id, from its link (https://tasks-free.openapps.xyz/b/<boardId>).",
     "schema": {
      "type": "string"
     }
    }
   ],
   "get": {
    "operationId": "getBoard",
    "summary": "Read a board: lists in order with their cards, labels and people",
    "parameters": [
     {
      "name": "archived",
      "in": "query",
      "required": false,
      "description": "true to include archived lists and cards.",
      "schema": {
       "type": "string",
       "enum": [
        "true",
        "false"
       ]
      }
     },
     {
      "name": "comments",
      "in": "query",
      "required": false,
      "description": "true to include each card's comments.",
      "schema": {
       "type": "string",
       "enum": [
        "true",
        "false"
       ]
      }
     },
     {
      "name": "format",
      "in": "query",
      "required": false,
      "description": "json (default) or csv (one row per card).",
      "schema": {
       "type": "string",
       "enum": [
        "json",
        "csv"
       ]
      }
     }
    ],
    "responses": {
     "200": {
      "description": "The board",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Board"
        },
        "example": {
         "board": {
          "id": "aB3dE5fG7hJ9kL2mN4pQ",
          "title": "Launch plan",
          "url": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ",
          "archived": false
         },
         "labels": [
          {
           "id": "Lb2cD4eF6g",
           "name": "High priority",
           "color": "red"
          }
         ],
         "members": [
          {
           "id": "Mm7nP8qR9s",
           "name": "Sam"
          }
         ],
         "lists": [
          {
           "id": "Hn4xW2pQ9r",
           "title": "To do",
           "archived": false,
           "cards": [
            {
             "id": "Kq3vT8mZp2Lw",
             "title": "Write the brief",
             "description": "",
             "due": "2026-11-03",
             "done": false,
             "labels": [
              "High priority"
             ],
             "assignees": [
              "Sam"
             ],
             "checklist": [
              {
               "text": "Outline",
               "done": true
              },
              {
               "text": "Draft",
               "done": false
              }
             ],
             "cover": "",
             "archived": false,
             "url": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ/c/Kq3vT8mZp2Lw"
            }
           ]
          },
          {
           "id": "Jk5yX3rS8t",
           "title": "Doing",
           "archived": false,
           "cards": []
          },
          {
           "id": "Tz6aB4cD7e",
           "title": "Done",
           "archived": false,
           "cards": []
          }
         ],
         "counts": {
          "lists": 3,
          "cards": 1
         }
        }
       },
       "text/csv": {
        "schema": {
         "type": "string",
         "description": "With format=csv: one row per card (List, Card, Description, Labels, Assigned to, Due, Done, Checklist, Archived)."
        }
       }
      }
     },
     "400": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "401": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "403": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "404": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "409": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     }
    }
   },
   "patch": {
    "operationId": "updateBoard",
    "summary": "Rename, archive or restore a board",
    "security": [
     {
      "boardKey": []
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "title": {
          "type": "string",
          "maxLength": 120
         },
         "archived": {
          "type": "boolean"
         }
        }
       },
       "example": {
        "archived": true
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "The board",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Board"
        },
        "example": {
         "board": {
          "id": "aB3dE5fG7hJ9kL2mN4pQ",
          "title": "Launch plan",
          "url": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ",
          "archived": false
         },
         "labels": [
          {
           "id": "Lb2cD4eF6g",
           "name": "High priority",
           "color": "red"
          }
         ],
         "members": [
          {
           "id": "Mm7nP8qR9s",
           "name": "Sam"
          }
         ],
         "lists": [
          {
           "id": "Hn4xW2pQ9r",
           "title": "To do",
           "archived": false,
           "cards": [
            {
             "id": "Kq3vT8mZp2Lw",
             "title": "Write the brief",
             "description": "",
             "due": "2026-11-03",
             "done": false,
             "labels": [
              "High priority"
             ],
             "assignees": [
              "Sam"
             ],
             "checklist": [
              {
               "text": "Outline",
               "done": true
              },
              {
               "text": "Draft",
               "done": false
              }
             ],
             "cover": "",
             "archived": false,
             "url": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ/c/Kq3vT8mZp2Lw"
            }
           ]
          },
          {
           "id": "Jk5yX3rS8t",
           "title": "Doing",
           "archived": false,
           "cards": []
          },
          {
           "id": "Tz6aB4cD7e",
           "title": "Done",
           "archived": false,
           "cards": []
          }
         ],
         "counts": {
          "lists": 3,
          "cards": 1
         }
        }
       }
      }
     },
     "400": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "401": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "403": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "404": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "409": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     }
    }
   },
   "delete": {
    "operationId": "deleteBoard",
    "summary": "Delete the board and everything on it, for everyone",
    "security": [
     {
      "boardKey": []
     }
    ],
    "responses": {
     "200": {
      "description": "Deleted",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "ok": {
           "type": "boolean"
          },
          "deleted": {
           "type": "string"
          }
         }
        },
        "example": {
         "ok": true,
         "deleted": "aB3dE5fG7hJ9kL2mN4pQ"
        }
       }
      }
     },
     "400": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "401": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "403": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "404": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "409": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     }
    }
   }
  },
  "/boards/{boardId}/lists": {
   "parameters": [
    {
     "name": "boardId",
     "in": "path",
     "required": true,
     "description": "The board id, from its link (https://tasks-free.openapps.xyz/b/<boardId>).",
     "schema": {
      "type": "string"
     }
    }
   ],
   "post": {
    "operationId": "addList",
    "summary": "Add a list",
    "security": [
     {
      "boardKey": []
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "title": {
          "type": "string",
          "maxLength": 120
         },
         "position": {
          "description": "\"top\", \"bottom\" (default) or a whole number from 0 (0 is the top).",
          "oneOf": [
           {
            "type": "string",
            "enum": [
             "top",
             "bottom"
            ]
           },
           {
            "type": "integer",
            "minimum": 0
           }
          ]
         }
        },
        "required": [
         "title"
        ]
       },
       "example": {
        "title": "Waiting",
        "position": 1
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "The new list",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/List"
        },
        "example": {
         "id": "Wq2eR4tY6u",
         "title": "Waiting",
         "archived": false,
         "cards": []
        }
       }
      }
     },
     "400": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "401": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "403": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "404": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "409": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     }
    }
   }
  },
  "/boards/{boardId}/lists/{listId}": {
   "parameters": [
    {
     "name": "boardId",
     "in": "path",
     "required": true,
     "description": "The board id, from its link (https://tasks-free.openapps.xyz/b/<boardId>).",
     "schema": {
      "type": "string"
     }
    },
    {
     "name": "listId",
     "in": "path",
     "required": true,
     "description": "The list id, from GET /boards/{boardId}.",
     "schema": {
      "type": "string"
     }
    }
   ],
   "patch": {
    "operationId": "updateList",
    "summary": "Rename, move, archive or restore a list",
    "security": [
     {
      "boardKey": []
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "title": {
          "type": "string",
          "maxLength": 120
         },
         "archived": {
          "type": "boolean"
         },
         "position": {
          "description": "\"top\", \"bottom\" (default) or a whole number from 0 (0 is the top).",
          "oneOf": [
           {
            "type": "string",
            "enum": [
             "top",
             "bottom"
            ]
           },
           {
            "type": "integer",
            "minimum": 0
           }
          ]
         }
        }
       },
       "example": {
        "title": "Blocked"
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "The list",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "id": {
           "type": "string"
          },
          "title": {
           "type": "string"
          },
          "archived": {
           "type": "boolean"
          }
         }
        },
        "example": {
         "id": "Wq2eR4tY6u",
         "title": "Blocked",
         "archived": false
        }
       }
      }
     },
     "400": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "401": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "403": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "404": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "409": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     }
    }
   }
  },
  "/boards/{boardId}/cards": {
   "parameters": [
    {
     "name": "boardId",
     "in": "path",
     "required": true,
     "description": "The board id, from its link (https://tasks-free.openapps.xyz/b/<boardId>).",
     "schema": {
      "type": "string"
     }
    }
   ],
   "post": {
    "operationId": "addCard",
    "summary": "Add a card to a list",
    "security": [
     {
      "boardKey": []
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "allOf": [
         {
          "$ref": "#/components/schemas/CardInput"
         },
         {
          "required": [
           "list",
           "title"
          ]
         }
        ]
       },
       "example": {
        "list": "To do",
        "title": "Write the brief",
        "due": "2026-11-03",
        "labels": [
         "High priority"
        ],
        "assignees": [
         "Sam"
        ],
        "checklist": [
         "Outline",
         "Draft"
        ]
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "The new card",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Card"
        },
        "example": {
         "id": "Kq3vT8mZp2Lw",
         "title": "Write the brief",
         "list": "To do",
         "listId": "Hn4xW2pQ9r",
         "position": 0,
         "description": "",
         "due": "2026-11-03",
         "done": false,
         "labels": [
          "High priority"
         ],
         "assignees": [
          "Sam"
         ],
         "checklist": [
          {
           "text": "Outline",
           "done": true
          },
          {
           "text": "Draft",
           "done": false
          }
         ],
         "cover": "",
         "archived": false,
         "url": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ/c/Kq3vT8mZp2Lw"
        }
       }
      }
     },
     "400": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "401": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "403": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "404": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "409": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     }
    }
   }
  },
  "/boards/{boardId}/cards/{cardId}": {
   "parameters": [
    {
     "name": "boardId",
     "in": "path",
     "required": true,
     "description": "The board id, from its link (https://tasks-free.openapps.xyz/b/<boardId>).",
     "schema": {
      "type": "string"
     }
    },
    {
     "name": "cardId",
     "in": "path",
     "required": true,
     "description": "The card id, from GET /boards/{boardId}.",
     "schema": {
      "type": "string"
     }
    }
   ],
   "get": {
    "operationId": "getCard",
    "summary": "Read one card with its comments",
    "responses": {
     "200": {
      "description": "The card",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Card"
        },
        "example": {
         "id": "Kq3vT8mZp2Lw",
         "title": "Write the brief",
         "list": "To do",
         "listId": "Hn4xW2pQ9r",
         "position": 0,
         "description": "",
         "due": "2026-11-03",
         "done": false,
         "labels": [
          "High priority"
         ],
         "assignees": [
          "Sam"
         ],
         "checklist": [
          {
           "text": "Outline",
           "done": true
          },
          {
           "text": "Draft",
           "done": false
          }
         ],
         "cover": "",
         "archived": false,
         "url": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ/c/Kq3vT8mZp2Lw",
         "comments": [
          {
           "id": "Cm1nB2vC3xZ4aS",
           "name": "Sam",
           "text": "On it.",
           "at": "2026-10-19T14:02:11.000Z"
          }
         ]
        }
       }
      }
     },
     "400": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "401": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "403": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "404": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "409": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     }
    }
   },
   "patch": {
    "operationId": "updateCard",
    "summary": "Change a card, or move it with list and position",
    "security": [
     {
      "boardKey": []
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/CardInput"
       },
       "example": {
        "done": true,
        "list": "Done"
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "The card",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Card"
        },
        "example": {
         "id": "Kq3vT8mZp2Lw",
         "title": "Write the brief",
         "list": "Done",
         "listId": "Hn4xW2pQ9r",
         "position": 0,
         "description": "",
         "due": "2026-11-03",
         "done": true,
         "labels": [
          "High priority"
         ],
         "assignees": [
          "Sam"
         ],
         "checklist": [
          {
           "text": "Outline",
           "done": true
          },
          {
           "text": "Draft",
           "done": false
          }
         ],
         "cover": "",
         "archived": false,
         "url": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ/c/Kq3vT8mZp2Lw"
        }
       }
      }
     },
     "400": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "401": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "403": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "404": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "409": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     }
    }
   },
   "delete": {
    "operationId": "deleteCard",
    "summary": "Delete a card and its comments for good",
    "security": [
     {
      "boardKey": []
     }
    ],
    "responses": {
     "200": {
      "description": "Deleted",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "ok": {
           "type": "boolean"
          },
          "deleted": {
           "type": "string"
          }
         }
        },
        "example": {
         "ok": true,
         "deleted": "Kq3vT8mZp2Lw"
        }
       }
      }
     },
     "400": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "401": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "403": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "404": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "409": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     }
    }
   }
  },
  "/boards/{boardId}/cards/{cardId}/move": {
   "parameters": [
    {
     "name": "boardId",
     "in": "path",
     "required": true,
     "description": "The board id, from its link (https://tasks-free.openapps.xyz/b/<boardId>).",
     "schema": {
      "type": "string"
     }
    },
    {
     "name": "cardId",
     "in": "path",
     "required": true,
     "description": "The card id, from GET /boards/{boardId}.",
     "schema": {
      "type": "string"
     }
    }
   ],
   "post": {
    "operationId": "moveCard",
    "summary": "Move a card to a list and position",
    "security": [
     {
      "boardKey": []
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "list": {
          "type": "string",
          "description": "A list title or id."
         },
         "position": {
          "description": "\"top\", \"bottom\" (default) or a whole number from 0 (0 is the top).",
          "oneOf": [
           {
            "type": "string",
            "enum": [
             "top",
             "bottom"
            ]
           },
           {
            "type": "integer",
            "minimum": 0
           }
          ]
         }
        }
       },
       "example": {
        "list": "Doing",
        "position": 0
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "The moved card",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Card"
        },
        "example": {
         "id": "Kq3vT8mZp2Lw",
         "title": "Write the brief",
         "list": "Doing",
         "listId": "Hn4xW2pQ9r",
         "position": 0,
         "description": "",
         "due": "2026-11-03",
         "done": false,
         "labels": [
          "High priority"
         ],
         "assignees": [
          "Sam"
         ],
         "checklist": [
          {
           "text": "Outline",
           "done": true
          },
          {
           "text": "Draft",
           "done": false
          }
         ],
         "cover": "",
         "archived": false,
         "url": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ/c/Kq3vT8mZp2Lw"
        }
       }
      }
     },
     "400": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "401": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "403": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "404": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "409": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     }
    }
   }
  },
  "/boards/{boardId}/cards/{cardId}/comments": {
   "parameters": [
    {
     "name": "boardId",
     "in": "path",
     "required": true,
     "description": "The board id, from its link (https://tasks-free.openapps.xyz/b/<boardId>).",
     "schema": {
      "type": "string"
     }
    },
    {
     "name": "cardId",
     "in": "path",
     "required": true,
     "description": "The card id, from GET /boards/{boardId}.",
     "schema": {
      "type": "string"
     }
    }
   ],
   "post": {
    "operationId": "addComment",
    "summary": "Comment on a card",
    "security": [
     {
      "boardKey": []
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "properties": {
         "text": {
          "type": "string",
          "maxLength": 5000
         },
         "name": {
          "type": "string",
          "maxLength": 40,
          "description": "Shown as the author. Defaults to Assistant."
         }
        },
        "required": [
         "text"
        ]
       },
       "example": {
        "text": "Draft is in the shared folder.",
        "name": "Claude"
       }
      }
     }
    },
    "responses": {
     "201": {
      "description": "The comment",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "id": {
           "type": "string"
          },
          "cardId": {
           "type": "string"
          },
          "name": {
           "type": "string"
          },
          "text": {
           "type": "string"
          },
          "at": {
           "type": "string",
           "format": "date-time"
          },
          "url": {
           "type": "string",
           "format": "uri"
          }
         }
        },
        "example": {
         "id": "Cm1nB2vC3xZ4aS",
         "cardId": "Kq3vT8mZp2Lw",
         "name": "Claude",
         "text": "Draft is in the shared folder.",
         "at": "2026-10-19T14:02:11.000Z",
         "url": "https://tasks-free.openapps.xyz/b/aB3dE5fG7hJ9kL2mN4pQ/c/Kq3vT8mZp2Lw"
        }
       }
      }
     },
     "400": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "401": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "403": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "404": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     },
     "409": {
      "description": "The request was refused. error says what to change.",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        },
        "example": {
         "error": "That key does not match this board."
        }
       }
      }
     }
    }
   }
  }
 }
}