AI Connection (API)
Everyone's Vertical Calendar (みんなの縦型カレンダー) · Last updated: October 23, 2026
Let AI assistants such as ChatGPT and Claude, iOS Shortcuts, or your own programs read, add, change and delete events in your calendar.
What you can do
- Say "Add 'Shopping' to Dad next Saturday" to add an event
- Send a photo of a printout, such as a school newsletter or a club schedule, and ask "Add all of these to my child's schedule" to add them all at once
- Paste the text of an email or message and ask "Add this event"
- Ask "What's on this week?" or "Am I free on the 10th?" (Pro and Business)
1. Getting a key
- Available for Family (up to 8 items), Pro (up to 20 items) and Business calendars.
- Family calendars can add events, and change or delete the events they added. Reading events (event lists, event details and download links) is available for Pro and Business.
- Calendar admins and editors can request a key.
- In the app menu, open "AI connection (API)" and tap "Request a key". A calendar can have more than one key.
- The key becomes usable 24 hours after the request, and all members are notified. Only the requester can display the key, and only once.
- Keys start with
tk_. Do not share your key; keep it somewhere safe. - You can revoke the key from the app at any time; connected AI services stop working immediately. Keys unused for 90 days expire automatically.
Changes made through the API appear in the app's edit history as "AI (service / requester)", and other members are notified.
2. Using the ChatGPT plugin
You can connect from most ChatGPT plans, including the free plan, without entering a URL.
- In ChatGPT, open Plugins, search for "Vertical Calendar" and add "みんなの縦型カレンダー / Everyone's Vertical Calendar" (Funeasy Soft).
- A page titled "みんなの縦型カレンダーにつなぐ" opens. Paste the API key shown in the app and press Allow.
- Then just ask, for example "What's on next week?" or "Add Dad's shopping on Saturday at 10".
3. Connecting ChatGPT or Claude with a connector
Add the following URL as a connector (custom connector / MCP server) in your AI service:
https://mcp.tatekare.com/mcp
- Claude: available from the free plan. In claude.ai, go to Settings → Connectors → Add custom connector, enter a name and the URL above, then press Connect.
- ChatGPT: connecting your own MCP server is available in ChatGPT Business, Enterprise and Edu workspaces (Pro is read-only; Free, Go and Plus cannot connect). On other plans, use the plugin above. An admin adds the URL above under Plugins → Add custom MCP server and chooses OAuth.
- A page titled "みんなの縦型カレンダーにつなぐ" opens. Paste the API key shown in the app and press Allow.
- Then just ask, for example "What's on next week?" or "Add Dad's shopping on Saturday at 10".
The AI can use the same 13 operations as the REST API below, including checking today's usage.
4. iOS Shortcuts example
- Use "Format Date" to format today as
yyyy-MM-dd. - Set "URL" to
https://mcp.tatekare.com/api/v1/events?from=(date)&to=(date). - In "Get Contents of URL", use GET and add the header
Authorization=Bearer tk_.... - Get
eventswith "Get Dictionary Value", then "Repeat with Each" to joinitem_name,start_timeandtitleand pass them to "Speak Text".
To add an event, use POST with a JSON body containing item, date, title and so on.
For details (item, date and time formats, event kinds, errors and limits), see the following sections.
5. REST API basics
| Base URL | https://mcp.tatekare.com/api/v1 |
|---|---|
| Auth | Authorization: Bearer tk_... (the API key shown in the app) |
| Body | Content-Type: application/json (POST, PATCH) |
| Dates | YYYY-MM-DD. Calendar dates as shown in the app; no time zone conversion |
| Times | HH:MM (24h). In REST, an empty string "" clears a time. An end time earlier than the start time (e.g. 22:00–06:00) ends the next morning and is shown on the start date |
| Items | item accepts an item id or the exact item name |
curl -H "Authorization: Bearer tk_xxxxxxxx" https://mcp.tatekare.com/api/v1/items
6. Event ids and kinds
| kind | Meaning | id | Change / delete with |
|---|---|---|---|
single | One-day event | s.202611.xxxx.xxxx | /events/{id} |
repeat | Repeating event | r.xxxx | /repeats/{id} |
span | Multi-day event (e.g. a 3-day trip) | r.xxxx | /repeats/{id} |
Repeating and multi-day events appear once per date in lists (the same id with different dates).
7. Items
GET /items
Returns the calendar name, today's date in the calendar owner's time zone, the items (rows) and the calendar's colors (colors). Call this first.
{
"calendar": "Our family",
"today": "2026-10-20",
"timezone": "Asia/Tokyo",
"items": [
{ "id": "WdkinSMj", "name": "Dad", "writable": true },
{ "id": "nZRHciBt", "name": "Mom", "writable": true }
],
"colors": [
{ "color": "#ffffff", "color_name": "none" },
{ "color": "#a685ff", "color_name": "purple", "color_label": "Work" }
],
"note": "…"
}
Items with writable: false (synced from Google Calendar) cannot be read or written.
8. Listing and getting events
GET /events?from=YYYY-MM-DD&to=YYYY-MM-DD
| Parameter | |
|---|---|
from, to | Required, inclusive, at most 31 days |
item | Optional item id or name |
q | Optional text filter on the title |
{
"from": "2026-11-01", "to": "2026-11-10",
"events": [
{ "id": "s.202611.StEHSASn4dZUWqaVuU2z.bf1c543e", "kind": "single",
"item_id": "nZRHciBt", "item_name": "Mom", "date": "2026-11-03",
"start_time": "15:30", "end_time": "16:00", "title": "Dentist", "color": "#fa604b", "color_name": "red", "has_memo": true },
{ "id": "r.r1fvl6hskvyxm", "kind": "repeat",
"item_id": "BKuGvbhE", "item_name": "Kids", "date": "2026-11-04",
"start_time": "17:00", "end_time": "18:00", "title": "Lessons", "color": "#ffffff", "color_name": "none",
"repeat": { "freq": "weekly", "interval": 1, "weekdays": [1, 3] },
"repeat_start": "2026-11-02", "repeat_end": "2026-11-30" },
{ "id": "r.rdx15q5700sdy", "kind": "span",
"item_id": "WdkinSMj", "item_name": "Dad", "date": "2026-11-06",
"start_time": null, "end_time": null, "title": "Business trip", "color": "#ffffff", "color_name": "none",
"start_date": "2026-11-06", "end_date": "2026-11-08" }
]
}
Events without times have null times. Lists do not include memos; has_memo: true is set when there is one.
GET /events/{id}
Returns one event with its memo and attachments.
9. Adding, changing and deleting events
POST /events
| Field | |
|---|---|
item | Required. Item id or name |
date | Required. YYYY-MM-DD |
end_date | Optional. Makes a multi-day event (kind: "span"). Give both start_time and end_time, or neither |
title | Event text (up to 500 characters) |
start_time, end_time | HH:MM |
memo | Memo (up to 5000 characters) |
color | A color name (red, blue, …), #RRGGBB, or a color label of the calendar (e.g. Work). See Colors |
Either title or a time is required.
curl -X POST https://mcp.tatekare.com/api/v1/events \
-H "Authorization: Bearer tk_xxxxxxxx" -H "Content-Type: application/json" \
-d '{"item":"Mom","date":"2026-11-03","title":"Dentist","start_time":"15:00","end_time":"16:00"}'
Returns the created event (same shape as GET /events/{id}).
PATCH /events/{id}
Changes a one-day event. Only the fields you send change; sending date or item moves the event.
DELETE /events/{id}
{ "deleted": true, "id": "s.202611.StEHSASn4dZUWqaVuU2z.bf1c543e" }
10. Repeating and multi-day events
POST /repeats
Fields: item, start_date (required), end_date (omit for no end), repeat (required), plus title, start_time, end_time, memo, color.
| repeat | |
|---|---|
freq | daily, weekly, monthly, yearly |
interval | Every N days/weeks/months/years (default 1) |
weekdays | For weekly. 1 = Mon … 7 = Sun |
monthly | {"day": 15}, {"day": -1} (last day), {"nth": 2, "weekday": 2} (2nd Tuesday), {"nth": -1, "weekday": 5} (last Friday) |
Each occurrence lasts less than 24 hours. Overnight events (e.g. every Friday 22:00–06:00) can repeat, but events lasting 24 hours or more (e.g. 3 days from the 1st of every month) cannot. Create each occurrence with POST /events and end_date instead. end_date of a repeat is when the series ends, not the length of each occurrence.
{"item":"Kids","start_date":"2026-11-02","end_date":"2026-11-30",
"title":"Lessons","start_time":"17:00","end_time":"18:00",
"repeat":{"freq":"weekly","weekdays":[1,3]}}
PATCH /repeats/{id}
scope: all, from_date (this date and later) or only_date (just this date; it becomes a one-day event). date is required for the last two. changes may contain title, start_time, end_time, memo, color, item, start_date, end_date, repeat.
{"scope":"from_date","date":"2026-11-16","changes":{"start_time":"17:30"}}
DELETE /repeats/{id}?scope=all|from_date|only_date&date=YYYY-MM-DD
Colors
color accepts any of the following. Responses include color (#RRGGBB) and, when available, color_name and color_label.
- Names:
red,rose,pink,light_pink,orange,yellow,light_yellow,lime,yellow_green,green,mint,sky,light_blue,blue,deep_blue,purple,light_gray,gray,dark_gray,none - Hex:
#RRGGBB(e.g.#00897b), any color - Calendar color labels: labels set in the app's color settings (e.g.
Work), listed incolorsofGET /items
11. Attachments
JPEG, PNG and PDF files can be attached to one-day events: up to 1 MB per file and 5 files per event. Plan-based upload limits apply (shared with the app).
POST /events/{id}/files
{"name": "card.jpg", "data": "<base64>"}
DELETE /events/{id}/files/{fileId}
GET /events/{id}/files/{fileId}/url
Returns a temporary download URL valid for 15 minutes.
12. Errors
Errors return an HTTP status and JSON like the following. message is in Japanese.
{ "error": "bad_request", "message": "…" }
| Status | error | Typical cause |
|---|---|---|
| 400 | bad_request | Bad date/time format, range over 31 days, invalid id, using /events for a repeating event |
| 401 | unauthorized | Missing, wrong, revoked or expired key; the requester lost access to the calendar |
| 403 | forbidden | Plan no longer eligible (e.g. the subscription ended, or changed from Business to Pro while still having 21+ items), item synced from Google, attachment limit |
| 404 | not_found | Event, item or attachment not found |
| 413 | too_large | Attachment over 1 MB |
| 429 | rate_limited | Limits (next section) |
| 500 | internal | Server error; please retry later |
13. Limits
The daily limits are shared by all keys of the calendar (ChatGPT, Claude and REST combined) and depend on the calendar's plan. Resets at midnight Japan time.
| Plan | Calls per day | Of which reads |
|---|---|---|
| Family | 200 | 50 |
| Pro | 800 | 150 |
| Business | 2,000 | 300 |
- Reads are: items, event lists, event details and download URLs. Writes still work after the read limit is reached
- Each key can make up to 50 calls per minute
To see today's usage and what remains:
- The app's "AI connection (API)" screen shows today's total for the calendar and each key's count
- Ask ChatGPT or Claude "how many calls are left?" (it uses the
get_usagetool) - REST
GET /usage. It does not count toward the daily limit - Headers on every REST response:
X-RateLimit-Limit,X-RateLimit-Remaining,X-RateLimit-Reset(reset time, UNIX seconds),X-RateLimit-Read-Limit,X-RateLimit-Read-Remaining
{"calls": {"used": 120, "limit": 800, "remaining": 680},
"reads": {"used": 45, "limit": 150, "remaining": 105},
"this_key": {"calls": 80, "reads": 30},
"shared_by_all_keys_of_calendar": true,
"per_minute_limit": 30, "resets_at": "2026-11-01T15:00:00.000Z", ...}
14. Notes
- Events imported from Google Calendar, and items that import from Google Calendar, are not available through the API. Items that only send events to Google Calendar (one-way) can be used.
- When you connect an AI service, events of all items in the calendar are shared with that service, under that service's terms.
- If your key may have leaked, revoke it in the app right away and request a new one.
- The API may change with prior notice.
See also: Privacy Policy. Questions: admin@funeasy-soft.com