├── images ├── Lab.png ├── Run.gif └── Animation3.png ├── README.md ├── .github └── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug_report.md ├── CHANGELOG.md └── marvin-api.yaml /images/Lab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/amazingmarvin/MarvinAPI/HEAD/images/Lab.png -------------------------------------------------------------------------------- /images/Run.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/amazingmarvin/MarvinAPI/HEAD/images/Run.gif -------------------------------------------------------------------------------- /images/Animation3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/amazingmarvin/MarvinAPI/HEAD/images/Animation3.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Amazing Marvin API documentation 2 | Head on over to the [wiki](https://github.com/amazingmarvin/MarvinAPI/wiki) to get started. 3 | 4 | 5 | 6 | # API changelog 7 | See [`CHANGELOG.md`](https://github.com/amazingmarvin/MarvinAPI/blob/master/CHANGELOG.md) for changes in the public API. 8 | 9 | 10 | 11 | # API bugs and feature requests 12 | Create an [issue](https://github.com/amazingmarvin/MarvinAPI/issues). 13 | 14 | 15 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Request a Marvin API feature 4 | title: "[REQUEST]" 5 | labels: request 6 | assignees: amazingmarvin 7 | 8 | --- 9 | 10 | **Statement of purpose** 11 | I do solemnly swear (or affirm) that this is an API feature request and not a Marvin feature request. For a Marvin feature request I would use [Product Board](https://portal.productboard.com/gvwfgxmcwqylldrxlfagmgkw). 12 | 13 | 14 | 15 | **Is your feature request related to a problem? Please describe.** 16 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 17 | 18 | **Describe the solution you'd like** 19 | A clear and concise description of what you want to happen. 20 | 21 | **Describe alternatives you've considered** 22 | A clear and concise description of any alternative solutions or features you've considered. 23 | 24 | **Additional context** 25 | Add any other context or screenshots about the feature request here. 26 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Report a Marvin API bug 4 | title: "[BUG]" 5 | labels: bug 6 | assignees: amazingmarvin 7 | 8 | --- 9 | 10 | **Statement of purpose** 11 | 12 | I do solemnly swear (or affirm) that this is an API bug, and not a Marvin bug. For Marvin bugs I would use the in-app "?→Contact Support" feature 13 | 14 | 15 | 16 | **Describe the bug** 17 | A clear and concise description of what the bug is. 18 | 19 | **Endpoint(s) in question** 20 | e.g. `/api/track` 21 | 22 | **To Reproduce** 23 | 24 | e.g. 25 | ``` 26 | curl \ 27 | -XPOST \ 28 | -H'X-API-Token: redacted' \ 29 | --data '{"taskId":"xyz","action":"STOP"}' \ 30 | https://serv.amazingmarvin.com/api/track 31 | ``` 32 | 33 | or sample code, or ? 34 | 35 | **Expected behavior** 36 | A clear and concise description of what you expected to happen. 37 | 38 | **Screenshots** 39 | If applicable, add screenshots to help explain your problem. 40 | 41 | **HTTP client:** 42 | * curl? browser (w/ CORS details)? language library? 43 | 44 | **Additional context** 45 | Add any other context about the problem here. 46 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # 2024-05-23 2 | * Fixed review date in Tasks created through API 3 | 4 | # 2024-05-23 5 | * Document change to /api/children 6 | 7 | # 2024-01-03 8 | * Documented ?raw=1 for /api/habits endpoint 9 | 10 | # 2023-03-21 11 | * Now only tasks and projects/categories are returned in /api/children (previously Time Blocks could sneak in) 12 | 13 | # 2023-03-13 14 | * Documented /api/habits 15 | 16 | # 2023-03-09 17 | * Documented /api/updateHabit 18 | 19 | # 2023-03-06 20 | * Improved Reminder documentation 21 | 22 | # 2023-03-01 23 | * Documented /api/children 24 | * Documented /api/todayTimeBlocks 25 | * Improved Category/Project documentation 26 | 27 | # 2023-02-06 28 | * Added X-Auto-Complete to /api/addTask 29 | 30 | # 2023-01-19 31 | * Documented experimental /api/markDone 32 | 33 | # 2022-12-05 34 | * Document /api/goals 35 | * Add ##Goal as shortcut when adding a task via API 36 | 37 | # 2022-09-11 38 | * Document adding date to /api/dueItems 39 | 40 | # 2022-08-08 41 | * ID of new item now sent when creating tasks, projects, and events 42 | 43 | # 2022-04-05 44 | * Document /api/doc/create 45 | * Document /api/doc/delete 46 | * Improve documentation for /api/doc/update 47 | 48 | # 2022-03-26 49 | * Documented bugfix/breaking change in /api/doc 50 | 51 | # 2022-03-24 52 | * Documented /api/update 53 | 54 | # 2022-02-24 55 | * Added Tracking and TrackingSince to /api/me 56 | 57 | # 2022-02-23 58 | * Documented Reminders and Reminder APIs 59 | 60 | # 2022-01-29 61 | * Documented timeZoneFix 62 | 63 | # 2021-11-16 64 | * Documented RecurringTasks, SavedItems, and Recurrence in general 65 | 66 | # 2021-11-15 67 | * Documented /api/todayItems date parameter 68 | 69 | # 2021-08-22 70 | * Documented /api/addEvent 71 | 72 | # 2021-07-11 73 | * Documented /api/tracks 74 | 75 | # 2021-06-30 76 | * Documented new webhooks 77 | * Improved time block documentation 78 | * Documented user configuration (ProfileItems) 79 | 80 | # 2021-06-07 81 | * Improved Webhooks CORS documentation (this is a frequent source of confusion) 82 | 83 | # 2021-06-05 84 | * Documented Rewards 85 | * Documented BillingPeriod (in /api/me) 86 | 87 | # 2021-04-04 88 | * Documented improved tomato timer webhooks. Now "timerDone" is dispatched after each work/break session finishes. 89 | 90 | # 2021-03-08 91 | * Documented Trackers 92 | 93 | # 2021-02-25 94 | * Documented Calendars and Events 95 | 96 | # 2021-02-24 97 | * Documented Habits 98 | 99 | # 2021-02-23 100 | * Documented Goals 101 | 102 | # 2021-02-08 103 | * Documented /api/me 104 | * Documented habit webhooks 105 | 106 | # 2021-01-17 107 | * Documented /api/kudos 108 | 109 | # 2020-10-15 110 | * Documented Webhooks 111 | * Documented Timer formats 112 | * Documented conflicts and `fieldUpdates` in direct database access page 113 | 114 | # 2020-09-08 115 | * Added /api/addProject 116 | * Added support for more task fields in /api/addTask: bonusSection, customSection, timeBlockSection, rewardPoints, rewardId, backburner, reviewDate, timeEstimate, itemSnoozeTime, permaSnoozeTime 117 | * Added /api/claimRewardPoints 118 | * Added /api/unclaimRewardPoints 119 | * Added /api/spendRewardPoints 120 | * Added /api/resetRewardPoints 121 | 122 | # 2020-07-26 123 | * Start/stop time tracking API 124 | 125 | # 2020-07-17 126 | * Published API documentation 127 | -------------------------------------------------------------------------------- /marvin-api.yaml: -------------------------------------------------------------------------------- 1 | openapi: 3.0.0 2 | info: 3 | title: Amazing Marvin API 4 | version: 1.0.0 5 | description: | 6 | Use Marvin's API to access data that doesn't live in your user database, or for simplicity's sake. 7 | 8 | ## Credentials 9 | Include an HTTP header `X-API-Token` using the API_TOKEN if the endpoint requires limited access, 10 | or the header `X-Full-Access-Token` using the FULL_ACCESS_TOKEN if the endpoint requires full access. 11 | 12 | ## Rate Limits 13 | - Do not create more than 1 item per second 14 | - Do not burst more than 1 query each 3 seconds 15 | - Do not exceed 1440 queries per day (1 per minute) 16 | 17 | ## Stability 18 | Marvin's API and data formats are subject to change. Each endpoint is marked with its stability level. 19 | contact: 20 | url: https://github.com/amazingmarvin/MarvinAPI 21 | license: 22 | name: API Documentation 23 | url: https://github.com/amazingmarvin/MarvinAPI/wiki 24 | 25 | servers: 26 | - url: https://serv.amazingmarvin.com/api 27 | description: Production server 28 | 29 | security: 30 | - ApiToken: [] 31 | - FullAccessToken: [] 32 | 33 | paths: 34 | /test: 35 | post: 36 | summary: Test credentials 37 | description: Test whether your credentials are correct (stable) 38 | security: 39 | - ApiToken: [] 40 | responses: 41 | "200": 42 | description: Credentials are valid 43 | content: 44 | text/plain: 45 | schema: 46 | type: string 47 | example: OK 48 | 49 | /addTask: 50 | post: 51 | summary: Create a task 52 | description: | 53 | Create a task with a POST request (stable, but new document's _id and _rev will be included in the response in the future). 54 | 55 | Unless you add an X-Auto-Complete=false header, the title will be processed similar to autocompletion within Marvin. 56 | security: 57 | - ApiToken: [] 58 | parameters: 59 | - name: X-Auto-Complete 60 | in: header 61 | required: false 62 | schema: 63 | type: boolean 64 | description: Set to false to disable autocompletion 65 | requestBody: 66 | required: true 67 | content: 68 | application/json: 69 | schema: 70 | $ref: "#/components/schemas/CreateTaskRequest" 71 | responses: 72 | "200": 73 | description: Task created successfully 74 | 75 | /markDone: 76 | post: 77 | summary: Mark a task done 78 | description: Mark a task done by POSTing its ID (experimental) 79 | security: 80 | - ApiToken: [] 81 | requestBody: 82 | required: true 83 | content: 84 | application/json: 85 | schema: 86 | type: object 87 | required: 88 | - itemId 89 | - timeZoneOffset 90 | properties: 91 | itemId: 92 | type: string 93 | description: ID of the task to mark done 94 | timeZoneOffset: 95 | type: number 96 | description: Timezone offset in minutes 97 | responses: 98 | "200": 99 | description: Task marked done successfully 100 | 101 | /addProject: 102 | post: 103 | summary: Create a project 104 | description: Create a project with a POST request (stable) 105 | security: 106 | - ApiToken: [] 107 | requestBody: 108 | required: true 109 | content: 110 | application/json: 111 | schema: 112 | $ref: "#/components/schemas/CreateProjectRequest" 113 | responses: 114 | "200": 115 | description: Project created successfully 116 | 117 | /addEvent: 118 | post: 119 | summary: Create an event 120 | description: Create an event with a POST request (experimental). Note that calendar sync happens on the client. 121 | security: 122 | - ApiToken: [] 123 | requestBody: 124 | required: true 125 | content: 126 | application/json: 127 | schema: 128 | type: object 129 | required: 130 | - title 131 | - start 132 | - length 133 | properties: 134 | title: 135 | type: string 136 | description: Event title 137 | note: 138 | type: string 139 | description: Event note (markdown) 140 | length: 141 | type: number 142 | description: Event length in milliseconds 143 | start: 144 | type: string 145 | format: date-time 146 | description: ISO formatted start time 147 | responses: 148 | "200": 149 | description: Event created successfully 150 | 151 | /doc: 152 | get: 153 | summary: Read any doc 154 | description: Get any individual document in the couchdb database by ID (stable) 155 | security: 156 | - FullAccessToken: [] 157 | parameters: 158 | - name: id 159 | in: query 160 | required: true 161 | schema: 162 | type: string 163 | description: Document ID to retrieve 164 | responses: 165 | "200": 166 | description: Document retrieved successfully 167 | content: 168 | application/json: 169 | schema: 170 | type: object 171 | 172 | /doc/update: 173 | post: 174 | summary: Update any doc 175 | description: Update any document (experimental). Be careful with this API! 176 | security: 177 | - FullAccessToken: [] 178 | requestBody: 179 | required: true 180 | content: 181 | application/json: 182 | schema: 183 | type: object 184 | required: 185 | - itemId 186 | - setters 187 | properties: 188 | itemId: 189 | type: string 190 | description: Document ID to update 191 | setters: 192 | type: array 193 | items: 194 | type: object 195 | properties: 196 | key: 197 | type: string 198 | val: 199 | description: Value to set 200 | responses: 201 | "200": 202 | description: Document updated successfully 203 | content: 204 | application/json: 205 | schema: 206 | type: object 207 | 208 | /doc/create: 209 | post: 210 | summary: Create any doc 211 | description: Create any document (experimental). Be careful with this API! 212 | security: 213 | - FullAccessToken: [] 214 | requestBody: 215 | required: true 216 | content: 217 | application/json: 218 | schema: 219 | type: object 220 | required: 221 | - _id 222 | - db 223 | properties: 224 | _id: 225 | type: string 226 | db: 227 | type: string 228 | description: Database name (e.g., Tasks, Categories, etc.) 229 | createdAt: 230 | type: number 231 | description: Date.now() when created 232 | responses: 233 | "200": 234 | description: Document created successfully 235 | content: 236 | application/json: 237 | schema: 238 | type: object 239 | 240 | /doc/delete: 241 | post: 242 | summary: Delete any doc 243 | description: Delete any document (experimental). Be careful - Marvin's Trash functionality is client-side only! 244 | security: 245 | - FullAccessToken: [] 246 | requestBody: 247 | required: true 248 | content: 249 | application/json: 250 | schema: 251 | type: object 252 | required: 253 | - itemId 254 | properties: 255 | itemId: 256 | type: string 257 | description: Document ID to delete 258 | responses: 259 | "200": 260 | description: Document deleted successfully 261 | 262 | /trackedItem: 263 | get: 264 | summary: Get the currently tracked task 265 | description: Get the currently tracked task (stable, but will be extended to include how long tracked) 266 | security: 267 | - ApiToken: [] 268 | responses: 269 | "200": 270 | description: Currently tracked task 271 | content: 272 | application/json: 273 | schema: 274 | type: object 275 | properties: 276 | _id: 277 | type: string 278 | db: 279 | type: string 280 | title: 281 | type: string 282 | 283 | /children: 284 | get: 285 | summary: Get child tasks/projects of a category/project 286 | description: Get all items that have parentId equal to the ID you provide (experimental) 287 | security: 288 | - ApiToken: [] 289 | parameters: 290 | - name: parentId 291 | in: query 292 | required: true 293 | schema: 294 | type: string 295 | description: Parent ID (or "unassigned" for inbox items) 296 | - name: X-Parent-Id 297 | in: header 298 | required: false 299 | schema: 300 | type: string 301 | description: Can be used instead of query parameter 302 | responses: 303 | "200": 304 | description: Array of child tasks and projects 305 | content: 306 | application/json: 307 | schema: 308 | type: array 309 | items: 310 | oneOf: 311 | - $ref: "#/components/schemas/Task" 312 | - $ref: "#/components/schemas/Project" 313 | 314 | /todayItems: 315 | get: 316 | summary: Get tasks and projects scheduled today 317 | description: Get tasks and projects scheduled today, including rollover/auto-schedule due items if enabled (stable) 318 | security: 319 | - ApiToken: [] 320 | parameters: 321 | - name: date 322 | in: query 323 | required: false 324 | schema: 325 | type: string 326 | format: date 327 | description: Date in YYYY-MM-DD format 328 | - name: X-Date 329 | in: header 330 | required: false 331 | schema: 332 | type: string 333 | format: date 334 | description: Can be used instead of query parameter 335 | responses: 336 | "200": 337 | description: Array of today's tasks and projects 338 | content: 339 | application/json: 340 | schema: 341 | type: array 342 | items: 343 | oneOf: 344 | - $ref: "#/components/schemas/Task" 345 | - $ref: "#/components/schemas/Project" 346 | 347 | /dueItems: 348 | get: 349 | summary: Get open tasks and projects due today or earlier 350 | description: Get open Tasks and Projects that are due today or earlier (stable) 351 | security: 352 | - ApiToken: [] 353 | parameters: 354 | - name: by 355 | in: query 356 | required: false 357 | schema: 358 | type: string 359 | format: date 360 | description: Date in YYYY-MM-DD format (default is today) 361 | responses: 362 | "200": 363 | description: Array of due tasks and projects 364 | content: 365 | application/json: 366 | schema: 367 | type: array 368 | items: 369 | oneOf: 370 | - $ref: "#/components/schemas/Task" 371 | - $ref: "#/components/schemas/Project" 372 | 373 | /todayTimeBlocks: 374 | get: 375 | summary: Get today's time blocks 376 | description: Get a list of today's time blocks (experimental) 377 | security: 378 | - ApiToken: [] 379 | parameters: 380 | - name: date 381 | in: query 382 | required: false 383 | schema: 384 | type: string 385 | format: date 386 | description: Date in YYYY-MM-DD format 387 | - name: X-Date 388 | in: header 389 | required: false 390 | schema: 391 | type: string 392 | format: date 393 | description: Can be used instead of query parameter 394 | responses: 395 | "200": 396 | description: Array of time blocks 397 | content: 398 | application/json: 399 | schema: 400 | type: array 401 | items: 402 | $ref: "#/components/schemas/TimeBlock" 403 | 404 | /categories: 405 | get: 406 | summary: Get all categories 407 | description: Get a list of all categories (stable) 408 | security: 409 | - ApiToken: [] 410 | responses: 411 | "200": 412 | description: Array of categories 413 | content: 414 | application/json: 415 | schema: 416 | type: array 417 | items: 418 | $ref: "#/components/schemas/Category" 419 | 420 | /labels: 421 | get: 422 | summary: Get all labels 423 | description: Get a list of all labels in their sort order (stable) 424 | security: 425 | - ApiToken: [] 426 | responses: 427 | "200": 428 | description: Array of labels 429 | content: 430 | application/json: 431 | schema: 432 | type: array 433 | items: 434 | $ref: "#/components/schemas/Label" 435 | 436 | /track: 437 | post: 438 | summary: Start/stop time tracking 439 | description: Start or stop time tracking a task by its ID 440 | security: 441 | - ApiToken: [] 442 | requestBody: 443 | required: true 444 | content: 445 | application/json: 446 | schema: 447 | type: object 448 | required: 449 | - taskId 450 | - action 451 | properties: 452 | taskId: 453 | type: string 454 | description: Task ID to track 455 | action: 456 | type: string 457 | enum: [START, STOP] 458 | description: Action to perform 459 | responses: 460 | "200": 461 | description: Time tracking updated 462 | content: 463 | application/json: 464 | schema: 465 | type: object 466 | properties: 467 | startId: 468 | type: string 469 | startTimes: 470 | type: array 471 | items: 472 | type: number 473 | stopId: 474 | type: string 475 | nullable: true 476 | stopTimes: 477 | type: array 478 | items: 479 | type: number 480 | issues: 481 | type: array 482 | items: 483 | type: string 484 | 485 | /time: 486 | post: 487 | summary: Start/stop time tracking (alias) 488 | description: Alias for /track endpoint (use if "track" is in a browser extension blacklist) 489 | security: 490 | - ApiToken: [] 491 | requestBody: 492 | required: true 493 | content: 494 | application/json: 495 | schema: 496 | type: object 497 | required: 498 | - taskId 499 | - action 500 | properties: 501 | taskId: 502 | type: string 503 | action: 504 | type: string 505 | enum: [START, STOP] 506 | responses: 507 | "200": 508 | description: Time tracking updated 509 | 510 | /tracks: 511 | post: 512 | summary: Get time track info 513 | description: Get time track data for up to 100 tasks at once 514 | security: 515 | - ApiToken: [] 516 | requestBody: 517 | required: true 518 | content: 519 | application/json: 520 | schema: 521 | type: object 522 | required: 523 | - taskIds 524 | properties: 525 | taskIds: 526 | type: array 527 | items: 528 | type: string 529 | maxItems: 100 530 | responses: 531 | "200": 532 | description: Array of time track data 533 | content: 534 | application/json: 535 | schema: 536 | type: array 537 | items: 538 | type: object 539 | properties: 540 | taskId: 541 | type: string 542 | times: 543 | type: array 544 | items: 545 | type: number 546 | 547 | /times: 548 | post: 549 | summary: Get time track info (alias) 550 | description: Alias for /tracks endpoint 551 | security: 552 | - ApiToken: [] 553 | requestBody: 554 | required: true 555 | content: 556 | application/json: 557 | schema: 558 | type: object 559 | required: 560 | - taskIds 561 | properties: 562 | taskIds: 563 | type: array 564 | items: 565 | type: string 566 | responses: 567 | "200": 568 | description: Array of time track data 569 | 570 | /claimRewardPoints: 571 | post: 572 | summary: Claim reward points 573 | description: Claim reward points for completing a task or celebrating 574 | security: 575 | - ApiToken: [] 576 | requestBody: 577 | required: true 578 | content: 579 | application/json: 580 | schema: 581 | type: object 582 | required: 583 | - points 584 | - itemId 585 | - date 586 | - op 587 | properties: 588 | points: 589 | type: number 590 | description: Number of reward points 591 | itemId: 592 | type: string 593 | description: Task ID or "MANUAL" for manual point reward 594 | date: 595 | type: string 596 | format: date 597 | description: Date in YYYY-MM-DD format 598 | op: 599 | type: string 600 | enum: [CLAIM] 601 | responses: 602 | "200": 603 | description: User profile with updated points 604 | content: 605 | application/json: 606 | schema: 607 | $ref: "#/components/schemas/Profile" 608 | 609 | /unclaimRewardPoints: 610 | post: 611 | summary: Unclaim reward points 612 | description: Unclaim reward points for user error or task marked incomplete 613 | security: 614 | - ApiToken: [] 615 | requestBody: 616 | required: true 617 | content: 618 | application/json: 619 | schema: 620 | type: object 621 | required: 622 | - itemId 623 | - date 624 | - op 625 | properties: 626 | itemId: 627 | type: string 628 | description: Which itemId to undo 629 | date: 630 | type: string 631 | format: date 632 | op: 633 | type: string 634 | enum: [UNCLAIM] 635 | responses: 636 | "200": 637 | description: User profile with updated points 638 | content: 639 | application/json: 640 | schema: 641 | $ref: "#/components/schemas/Profile" 642 | 643 | /spendRewardPoints: 644 | post: 645 | summary: Spend reward points 646 | description: Spend reward points 647 | security: 648 | - ApiToken: [] 649 | requestBody: 650 | required: true 651 | content: 652 | application/json: 653 | schema: 654 | type: object 655 | required: 656 | - points 657 | - date 658 | - op 659 | properties: 660 | points: 661 | type: number 662 | date: 663 | type: string 664 | format: date 665 | op: 666 | type: string 667 | enum: [SPEND] 668 | responses: 669 | "200": 670 | description: User profile with updated points 671 | content: 672 | application/json: 673 | schema: 674 | $ref: "#/components/schemas/Profile" 675 | 676 | /resetRewardPoints: 677 | post: 678 | summary: Reset reward points 679 | description: Permanently deletes earn/spend history and resets reward points to 0 680 | security: 681 | - FullAccessToken: [] 682 | responses: 683 | "200": 684 | description: User profile with reset points 685 | content: 686 | application/json: 687 | schema: 688 | $ref: "#/components/schemas/Profile" 689 | 690 | /kudos: 691 | get: 692 | summary: Get Marvin Kudos info 693 | description: Get kudos, level, and remaining kudos information 694 | security: 695 | - ApiToken: [] 696 | responses: 697 | "200": 698 | description: Kudos information 699 | content: 700 | application/json: 701 | schema: 702 | type: object 703 | properties: 704 | kudos: 705 | type: number 706 | level: 707 | type: number 708 | kudosRemaining: 709 | type: number 710 | 711 | /me: 712 | get: 713 | summary: Get account information 714 | description: Retrieve information about your account 715 | security: 716 | - ApiToken: [] 717 | responses: 718 | "200": 719 | description: Account information 720 | content: 721 | application/json: 722 | schema: 723 | $ref: "#/components/schemas/Profile" 724 | 725 | /reminders: 726 | get: 727 | summary: Get all reminders 728 | description: Get an array of all reminders that are currently scheduled 729 | security: 730 | - FullAccessToken: [] 731 | responses: 732 | "200": 733 | description: Array of reminders 734 | content: 735 | application/json: 736 | schema: 737 | type: array 738 | items: 739 | $ref: "#/components/schemas/Reminder" 740 | 741 | /reminder/set: 742 | post: 743 | summary: Set reminders 744 | description: Set one or more reminders (currently only pushed to mobile phones) 745 | security: 746 | - ApiToken: [] 747 | requestBody: 748 | required: true 749 | content: 750 | application/json: 751 | schema: 752 | type: object 753 | required: 754 | - reminders 755 | properties: 756 | reminders: 757 | type: array 758 | items: 759 | $ref: "#/components/schemas/Reminder" 760 | responses: 761 | "200": 762 | description: Reminders set successfully 763 | content: 764 | text/plain: 765 | schema: 766 | type: string 767 | example: OK 768 | 769 | /reminder/delete: 770 | post: 771 | summary: Delete one or more reminders 772 | description: Delete reminders by their IDs 773 | security: 774 | - ApiToken: [] 775 | requestBody: 776 | required: true 777 | content: 778 | application/json: 779 | schema: 780 | type: object 781 | required: 782 | - reminderIds 783 | properties: 784 | reminderIds: 785 | type: array 786 | items: 787 | type: string 788 | responses: 789 | "200": 790 | description: Reminders deleted successfully 791 | content: 792 | text/plain: 793 | schema: 794 | type: string 795 | example: OK 796 | 797 | /reminder/deleteAll: 798 | post: 799 | summary: Delete all reminders 800 | description: Delete all reminders 801 | security: 802 | - FullAccessToken: [] 803 | responses: 804 | "200": 805 | description: All reminders deleted successfully 806 | content: 807 | text/plain: 808 | schema: 809 | type: string 810 | example: OK 811 | 812 | /goals: 813 | get: 814 | summary: Get goals 815 | description: Get a list of all goals (stable) 816 | security: 817 | - ApiToken: [] 818 | responses: 819 | "200": 820 | description: Array of goals 821 | content: 822 | application/json: 823 | schema: 824 | type: array 825 | items: 826 | $ref: "#/components/schemas/Goal" 827 | 828 | /updateHabit: 829 | post: 830 | summary: Update habit 831 | description: Record, undo record, or rewrite habit history (experimental) 832 | security: 833 | - ApiToken: [] 834 | requestBody: 835 | required: true 836 | content: 837 | application/json: 838 | schema: 839 | type: object 840 | required: 841 | - habitId 842 | properties: 843 | habitId: 844 | type: string 845 | time: 846 | type: number 847 | description: Timestamp for recording 848 | value: 849 | type: number 850 | description: Value to record 851 | undo: 852 | type: boolean 853 | description: Set to true to undo last recording 854 | history: 855 | type: array 856 | items: 857 | type: number 858 | description: Array to rewrite habit history 859 | updateDB: 860 | type: boolean 861 | description: Set to true to update the Habit in cloudant 862 | responses: 863 | "200": 864 | description: New habit value 865 | content: 866 | application/json: 867 | schema: 868 | $ref: "#/components/schemas/Habit" 869 | 870 | /habit: 871 | get: 872 | summary: Get a habit 873 | description: Retrieve a Habit including its full history (experimental) 874 | security: 875 | - ApiToken: [] 876 | parameters: 877 | - name: id 878 | in: query 879 | required: true 880 | schema: 881 | type: string 882 | description: Habit ID 883 | responses: 884 | "200": 885 | description: Habit with full history 886 | content: 887 | application/json: 888 | schema: 889 | $ref: "#/components/schemas/Habit" 890 | 891 | /habits: 892 | get: 893 | summary: List habits 894 | description: Retrieve a list of all habits with full history (experimental) 895 | security: 896 | - ApiToken: [] 897 | parameters: 898 | - name: raw 899 | in: query 900 | required: false 901 | schema: 902 | type: number 903 | enum: [0, 1] 904 | description: Set to 1 to return full habit objects (requires full access token) 905 | responses: 906 | "200": 907 | description: Array of habits 908 | content: 909 | application/json: 910 | schema: 911 | type: array 912 | items: 913 | $ref: "#/components/schemas/Habit" 914 | 915 | components: 916 | securitySchemes: 917 | ApiToken: 918 | type: apiKey 919 | in: header 920 | name: X-API-Token 921 | description: API token for limited access (create tasks, read data) 922 | FullAccessToken: 923 | type: apiKey 924 | in: header 925 | name: X-Full-Access-Token 926 | description: Full access token for all operations 927 | 928 | schemas: 929 | CreateTaskRequest: 930 | type: object 931 | properties: 932 | title: 933 | type: string 934 | description: Task title (supports autocompletion like +today, #Parent, @label) 935 | done: 936 | type: boolean 937 | default: false 938 | day: 939 | type: string 940 | format: date 941 | description: Schedule date in YYYY-MM-DD format 942 | parentId: 943 | type: string 944 | description: ID of parent category/project 945 | labelIds: 946 | type: array 947 | items: 948 | type: string 949 | description: Array of label IDs 950 | firstScheduled: 951 | type: string 952 | format: date 953 | rank: 954 | type: number 955 | dailySection: 956 | type: string 957 | enum: [Morning, Afternoon, Evening] 958 | bonusSection: 959 | type: string 960 | enum: [Essential, Bonus] 961 | customSection: 962 | type: string 963 | description: ID of custom section 964 | timeBlockSection: 965 | type: string 966 | description: ID of time block 967 | note: 968 | type: string 969 | dueDate: 970 | type: string 971 | format: date 972 | timeEstimate: 973 | type: number 974 | description: Duration estimate in milliseconds 975 | isReward: 976 | type: boolean 977 | isStarred: 978 | type: number 979 | description: Priority level (3=red, 2=orange, 1=yellow) 980 | isFrogged: 981 | type: number 982 | description: Frog status (1=normal, 2=baby, 3=monster) 983 | plannedWeek: 984 | type: string 985 | format: date 986 | description: Monday of the week (YYYY-MM-DD) 987 | plannedMonth: 988 | type: string 989 | description: Month in YYYY-MM format 990 | rewardPoints: 991 | type: number 992 | rewardId: 993 | type: string 994 | backburner: 995 | type: boolean 996 | reviewDate: 997 | type: string 998 | format: date 999 | itemSnoozeTime: 1000 | type: number 1001 | description: Date.now() until when snoozed 1002 | permaSnoozeTime: 1003 | type: string 1004 | description: Time in HH:mm format 1005 | timeZoneOffset: 1006 | type: number 1007 | description: Time offset in minutes 1008 | 1009 | CreateProjectRequest: 1010 | type: object 1011 | properties: 1012 | title: 1013 | type: string 1014 | description: Project title 1015 | done: 1016 | type: boolean 1017 | default: false 1018 | day: 1019 | type: string 1020 | format: date 1021 | description: Schedule date or null 1022 | parentId: 1023 | type: string 1024 | labelIds: 1025 | type: array 1026 | items: 1027 | type: string 1028 | firstScheduled: 1029 | type: string 1030 | format: date 1031 | rank: 1032 | type: number 1033 | dailySection: 1034 | type: string 1035 | bonusSection: 1036 | type: string 1037 | customSection: 1038 | type: string 1039 | timeBlockSection: 1040 | type: string 1041 | note: 1042 | type: string 1043 | dueDate: 1044 | type: string 1045 | format: date 1046 | timeEstimate: 1047 | type: number 1048 | isReward: 1049 | type: boolean 1050 | priority: 1051 | type: string 1052 | enum: [low, mid, high] 1053 | isFrogged: 1054 | type: number 1055 | plannedWeek: 1056 | type: string 1057 | format: date 1058 | plannedMonth: 1059 | type: string 1060 | rewardPoints: 1061 | type: number 1062 | rewardId: 1063 | type: string 1064 | backburner: 1065 | type: boolean 1066 | reviewDate: 1067 | type: string 1068 | format: date 1069 | itemSnoozeTime: 1070 | type: number 1071 | permaSnoozeTime: 1072 | type: string 1073 | timeZoneOffset: 1074 | type: number 1075 | 1076 | Task: 1077 | type: object 1078 | properties: 1079 | _id: 1080 | type: string 1081 | description: Unique task ID 1082 | _rev: 1083 | type: string 1084 | db: 1085 | type: string 1086 | default: Tasks 1087 | createdAt: 1088 | type: number 1089 | updatedAt: 1090 | type: number 1091 | workedOnAt: 1092 | type: number 1093 | title: 1094 | type: string 1095 | parentId: 1096 | type: string 1097 | dueDate: 1098 | type: string 1099 | format: date 1100 | nullable: true 1101 | startDate: 1102 | type: string 1103 | format: date 1104 | nullable: true 1105 | endDate: 1106 | type: string 1107 | format: date 1108 | nullable: true 1109 | day: 1110 | type: string 1111 | description: YYYY-MM-DD or "unassigned" 1112 | firstScheduled: 1113 | type: string 1114 | plannedWeek: 1115 | type: string 1116 | format: date 1117 | plannedMonth: 1118 | type: string 1119 | sprintId: 1120 | type: string 1121 | nullable: true 1122 | rank: 1123 | type: number 1124 | masterRank: 1125 | type: number 1126 | done: 1127 | type: boolean 1128 | completedAt: 1129 | type: number 1130 | nullable: true 1131 | duration: 1132 | type: number 1133 | times: 1134 | type: array 1135 | items: 1136 | type: number 1137 | firstTracked: 1138 | type: number 1139 | doneAt: 1140 | type: number 1141 | isReward: 1142 | type: boolean 1143 | isStarred: 1144 | type: number 1145 | isFrogged: 1146 | type: number 1147 | isPinned: 1148 | type: boolean 1149 | pinId: 1150 | type: string 1151 | recurring: 1152 | type: boolean 1153 | recurringTaskId: 1154 | type: string 1155 | echo: 1156 | type: boolean 1157 | echoId: 1158 | type: string 1159 | link: 1160 | type: string 1161 | subtasks: 1162 | type: object 1163 | additionalProperties: 1164 | $ref: "#/components/schemas/Subtask" 1165 | labelIds: 1166 | type: array 1167 | items: 1168 | type: string 1169 | timeEstimate: 1170 | type: number 1171 | note: 1172 | type: string 1173 | email: 1174 | type: string 1175 | dailySection: 1176 | type: string 1177 | bonusSection: 1178 | type: string 1179 | customSection: 1180 | type: string 1181 | timeBlockSection: 1182 | type: string 1183 | dependsOn: 1184 | type: object 1185 | additionalProperties: 1186 | type: boolean 1187 | backburner: 1188 | type: boolean 1189 | reviewDate: 1190 | type: string 1191 | format: date 1192 | itemSnoozeTime: 1193 | type: number 1194 | permaSnoozeTime: 1195 | type: string 1196 | marvinPoints: 1197 | type: number 1198 | mpNotes: 1199 | type: array 1200 | items: 1201 | type: string 1202 | rewardPoints: 1203 | type: number 1204 | rewardId: 1205 | type: string 1206 | 1207 | Subtask: 1208 | type: object 1209 | properties: 1210 | _id: 1211 | type: string 1212 | title: 1213 | type: string 1214 | done: 1215 | type: boolean 1216 | rank: 1217 | type: number 1218 | timeEstimate: 1219 | type: number 1220 | 1221 | Project: 1222 | type: object 1223 | properties: 1224 | _id: 1225 | type: string 1226 | _rev: 1227 | type: string 1228 | db: 1229 | type: string 1230 | default: Categories 1231 | type: 1232 | type: string 1233 | enum: [project, category] 1234 | title: 1235 | type: string 1236 | updatedAt: 1237 | type: number 1238 | workedOnAt: 1239 | type: number 1240 | parentId: 1241 | type: string 1242 | rank: 1243 | type: number 1244 | dayRank: 1245 | type: number 1246 | day: 1247 | type: string 1248 | nullable: true 1249 | firstScheduled: 1250 | type: string 1251 | dueDate: 1252 | type: string 1253 | format: date 1254 | nullable: true 1255 | labelIds: 1256 | type: array 1257 | items: 1258 | type: string 1259 | timeEstimate: 1260 | type: number 1261 | startDate: 1262 | type: string 1263 | format: date 1264 | endDate: 1265 | type: string 1266 | format: date 1267 | plannedWeek: 1268 | type: string 1269 | format: date 1270 | plannedMonth: 1271 | type: string 1272 | sprintId: 1273 | type: string 1274 | done: 1275 | type: boolean 1276 | doneDate: 1277 | type: string 1278 | format: date 1279 | priority: 1280 | type: string 1281 | enum: [low, mid, high] 1282 | color: 1283 | type: string 1284 | description: Hex color like #222222 1285 | icon: 1286 | type: string 1287 | note: 1288 | type: string 1289 | recurring: 1290 | type: boolean 1291 | recurringTaskId: 1292 | type: string 1293 | echo: 1294 | type: boolean 1295 | isFrogged: 1296 | type: number 1297 | reviewDate: 1298 | type: string 1299 | format: date 1300 | marvinPoints: 1301 | type: number 1302 | mpNotes: 1303 | type: array 1304 | items: 1305 | type: string 1306 | 1307 | Category: 1308 | allOf: 1309 | - $ref: "#/components/schemas/Project" 1310 | - type: object 1311 | properties: 1312 | type: 1313 | type: string 1314 | enum: [category] 1315 | 1316 | Label: 1317 | type: object 1318 | properties: 1319 | _id: 1320 | type: string 1321 | title: 1322 | type: string 1323 | groupId: 1324 | type: string 1325 | createdAt: 1326 | type: number 1327 | color: 1328 | type: string 1329 | description: Hex color like #f0a0a0 1330 | icon: 1331 | type: string 1332 | showAs: 1333 | type: string 1334 | enum: [text, icon, both] 1335 | isAction: 1336 | type: boolean 1337 | isHidden: 1338 | type: boolean 1339 | 1340 | TimeBlock: 1341 | type: object 1342 | properties: 1343 | _id: 1344 | type: string 1345 | db: 1346 | type: string 1347 | default: PlannerItems 1348 | title: 1349 | type: string 1350 | date: 1351 | type: string 1352 | format: date 1353 | time: 1354 | type: string 1355 | description: Start time in HH:mm format 1356 | duration: 1357 | type: number 1358 | description: Duration in minutes 1359 | isSection: 1360 | type: boolean 1361 | note: 1362 | type: string 1363 | 1364 | Goal: 1365 | type: object 1366 | properties: 1367 | _id: 1368 | type: string 1369 | title: 1370 | type: string 1371 | note: 1372 | type: string 1373 | hideInDayView: 1374 | type: boolean 1375 | parentId: 1376 | type: string 1377 | isStarred: 1378 | type: number 1379 | labelIds: 1380 | type: array 1381 | items: 1382 | type: string 1383 | importance: 1384 | type: number 1385 | minimum: 1 1386 | maximum: 5 1387 | difficulty: 1388 | type: number 1389 | minimum: 1 1390 | maximum: 5 1391 | motivations: 1392 | type: array 1393 | items: 1394 | type: string 1395 | committed: 1396 | type: boolean 1397 | expectedTasks: 1398 | type: number 1399 | expectedDuration: 1400 | type: number 1401 | expectedHabits: 1402 | type: string 1403 | checkIn: 1404 | type: boolean 1405 | checkIns: 1406 | type: array 1407 | items: 1408 | type: number 1409 | lastCheckIn: 1410 | type: string 1411 | format: date 1412 | checkInWeeks: 1413 | type: number 1414 | checkInStart: 1415 | type: string 1416 | format: date 1417 | status: 1418 | type: string 1419 | enum: [backburner, pending, active, done] 1420 | startedAt: 1421 | type: number 1422 | color: 1423 | type: string 1424 | dueDate: 1425 | type: string 1426 | format: date 1427 | nullable: true 1428 | hasEnd: 1429 | type: boolean 1430 | sections: 1431 | type: array 1432 | items: 1433 | type: object 1434 | properties: 1435 | _id: 1436 | type: string 1437 | title: 1438 | type: string 1439 | note: 1440 | type: string 1441 | taskProgress: 1442 | type: boolean 1443 | 1444 | Habit: 1445 | type: object 1446 | properties: 1447 | _id: 1448 | type: string 1449 | db: 1450 | type: string 1451 | default: Habits 1452 | title: 1453 | type: string 1454 | note: 1455 | type: string 1456 | color: 1457 | type: string 1458 | parentId: 1459 | type: string 1460 | labelIds: 1461 | type: array 1462 | items: 1463 | type: string 1464 | isStarred: 1465 | type: number 1466 | isFrogged: 1467 | type: number 1468 | timeEstimate: 1469 | type: number 1470 | startDate: 1471 | type: string 1472 | format: date 1473 | nullable: true 1474 | endDate: 1475 | type: string 1476 | format: date 1477 | nullable: true 1478 | units: 1479 | type: string 1480 | period: 1481 | type: string 1482 | enum: [day, week, month, quarter, year] 1483 | target: 1484 | type: number 1485 | isPositive: 1486 | type: boolean 1487 | recordType: 1488 | type: string 1489 | enum: [boolean, number] 1490 | showInDayView: 1491 | type: boolean 1492 | showInCalendar: 1493 | type: boolean 1494 | askOn: 1495 | type: array 1496 | items: 1497 | type: number 1498 | startTime: 1499 | type: string 1500 | endTime: 1501 | type: string 1502 | time: 1503 | type: string 1504 | showAfterSuccess: 1505 | type: boolean 1506 | showAfterRecord: 1507 | type: boolean 1508 | done: 1509 | type: boolean 1510 | history: 1511 | type: array 1512 | items: 1513 | type: number 1514 | description: Array of [time1, val1, time2, val2, ...] 1515 | dismissed: 1516 | type: string 1517 | format: date 1518 | 1519 | Reminder: 1520 | type: object 1521 | properties: 1522 | time: 1523 | type: number 1524 | description: Unix timestamp in seconds 1525 | offset: 1526 | type: number 1527 | description: Minutes ahead of time to remind (-1 = use default) 1528 | reminderId: 1529 | type: string 1530 | description: Unique ID (either taskId or randId) 1531 | type: 1532 | type: string 1533 | enum: [T, M, DT, DP, t] 1534 | description: T=task, M=manual, DT=due task, DP=due project, t=test 1535 | title: 1536 | type: string 1537 | maxLength: 200 1538 | snooze: 1539 | type: number 1540 | description: Snooze duration in minutes 1541 | autoSnooze: 1542 | type: boolean 1543 | canTrack: 1544 | type: boolean 1545 | 1546 | Profile: 1547 | type: object 1548 | properties: 1549 | userId: 1550 | type: string 1551 | email: 1552 | type: string 1553 | parentEmail: 1554 | type: string 1555 | emailConfirmed: 1556 | type: boolean 1557 | billingPeriod: 1558 | type: string 1559 | enum: [TRIAL, MONTH, YEAR, ONCE, PAID] 1560 | paidThrough: 1561 | type: string 1562 | format: date-time 1563 | iosSub: 1564 | type: boolean 1565 | marvinPoints: 1566 | type: number 1567 | nextMultiplier: 1568 | type: number 1569 | rewardPointsEarned: 1570 | type: number 1571 | rewardPointsSpent: 1572 | type: number 1573 | rewardPointsEarnedToday: 1574 | type: number 1575 | rewardPointsSpentToday: 1576 | type: number 1577 | rewardPointsLastDate: 1578 | type: string 1579 | format: date 1580 | tomatoes: 1581 | type: number 1582 | tomatoesToday: 1583 | type: number 1584 | tomatoTime: 1585 | type: number 1586 | tomatoTimeToday: 1587 | type: number 1588 | tomatoDate: 1589 | type: string 1590 | format: date 1591 | defaultSnooze: 1592 | type: number 1593 | defaultAutoSnooze: 1594 | type: boolean 1595 | defaultOffset: 1596 | type: number 1597 | tracking: 1598 | type: string 1599 | trackingSince: 1600 | type: number 1601 | currentVersion: 1602 | type: string 1603 | signupAppVersion: 1604 | type: string 1605 | --------------------------------------------------------------------------------