├── 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 |
--------------------------------------------------------------------------------