Setting 'My Day' in Microsoft To Do from your own Entra app
If you've ever wanted to drop a task into Microsoft To Do's "My Day" from a script, the standard answer has been "you can't." Microsoft Graph's todoTask schema doesn't expose it. Power Automate's connector doesn't have an action for it. EWS doesn't see it. The Microsoft 365 Developer Platform Ideas portal has had an open request to add it since 2021, the Tech Community thread asking for it has been live and unanswered since February 2022, and Microsoft's own bot closed microsoftgraph/microsoft-graph-docs#14367 without a technical response.
The endpoint exists. It's an undocumented Substrate API. Writing to it works from any Entra app registration with Tasks.ReadWrite delegated against the Office 365 Exchange Online resource — no first-party-client impersonation, no *-Internal scope shenanigans. I verified it this week in a fresh tenant with a fresh third-party app and integrated it into A Cloudflare Worker for Microsoft To Do and Claude AI (project is directly at mstodo-mcp-cloudflare).
This post walks through what the field is called, how to write it, and the one assumption the community has been making that turned out to be wrong.
What "My Day" actually is, storage-wise
My Day is a UI surface in the Microsoft To Do clients — a list separate from your real lists where you stage what you're going to focus on today, and which appears to reset each night. Microsoft's documentation describes the reset behavior: "Any tasks in My Day that aren't completed before the list resets will be saved to your Tasks list and included in your suggestions the following day."
The community's understanding stopped roughly there. The best public reverse-engineering — Pascal Bihler's writeup at overexact.com — documented the undocumented Substrate endpoint at https://outlook.office.com/todob2/api/v1/ (also reachable at substrate.office.com) and its OrderDateTime field. It did not cover My Day specifically, and as far as I could find, no one else had published the property name either.
The actual storage model turns out to be simpler than the UX implies. Each task has a CommittedDay field (a calendar date string, no timezone). Each client renders "My Day" as WHERE CommittedDay == client.localToday(). The "nightly reset" is purely client-side; the server never modifies CommittedDay. Yesterday's task doesn't get cleared at midnight — its date just no longer matches "today" in the local timezone of whatever client is rendering the list.
That's elegant, and it means anything that can PATCH CommittedDay controls My Day membership.