Let an agent own the invite: RSVP reconciliation with Agent Accounts Nylas introduced Agent Accounts that allow AI agents to act as meeting organizers with automatic RSVP reconciliation. The system uses iCalendar standards to send invites and automatically updates participant status via webhooks, eliminating the need for manual email parsing. This approach handles the complexity of cross-provider RSVP replies from Google Calendar, Outlook, and Apple Calendar. Most "AI scheduling" demos point a model at a human's inbox, parse a few invite emails, and call it a day. That's fine until you want the agent to actually run the meeting — to be the organizer whose name is at the top of the invite, whose calendar is the source of truth, and who has to know, in real time, who's coming. That last part is the interesting one. When your agent is the organizer, sending the invite is the easy 20%. The other 80% is reconciliation : someone accepts, someone declines, someone flips from "yes" to "maybe" the morning of, and the agent's internal picture of "who is attending this meeting" has to stay correct without you babysitting it. RSVP replies arrive over the next few hours and days as ICS REPLY messages bouncing back from Google Calendar, Outlook, and Apple Calendar. If you're treating those as emails to parse, you've signed up for the worst job in calendaring. This post is about doing it the boring, correct way: let the agent send the invite, let Nylas fold the incoming RSVP replies into the event's participant list, and react to a single webhook when status changes. I work on the Nylas CLI, so the terminal commands below are the exact ones I reach for when I'm poking at this by hand before wiring it into app code. An Agent Account is a Nylas grant with its own real mailbox and its own real calendar. From a participant's side there's nothing special about it — it shows up as a normal organizer on a normal invite. Under the hood it speaks standard iCalendar, so it interoperates with Google Calendar, Microsoft 365, and Apple Calendar as a first-class participant. The reconciliation loop has three moving parts, and Nylas owns two of them for you: notify participants=true . Nylas sends an ICS REQUEST from the Agent Account's address to each attendee. REPLY back to the Agent Account's mailbox. Nylas reads it and updates that participant's status on the event object to yes , no , maybe , or noreply . You don't parse anything. event.updated webhook fires for the Agent Account's calendar. That's your cue to recompute attendance and do whatever your app does with it.The conceptual pivot worth internalizing: the event object is your participant database . You don't reconstruct attendance from a pile of reply emails — you read it off participants .status , which Nylas keeps current. The Agent Account calendars doc https://developer.nylas.com/docs/v3/agent-accounts/calendars/ confirms this reconciliation behavior specifically for Agent Account grants: each response lands in the mailbox, Nylas reads it, and the event's participants .status is updated automatically. If you went the naive route — agent reads its inbox, finds the "Accepted: Product demo" email, regexes out who and what — you'd be reimplementing an iCalendar parser badly. A few reasons not to: REPLY messages are not consistent across providers. METHOD:REPLY block is consistent, but now you're parsing MIME and text/calendar parts by hand. status . Re-deriving that from the raw email is strictly more work for a worse result.The honest tradeoff: you're trusting Nylas's reconciliation instead of owning the parse. For organizer-side RSVP tracking, that's the trade you want. If you needed full round-trip time negotiation — propose slots, collect picks, book the winner — that's a different problem, and one the Events API doesn't try to solve on its own. You need an Agent Account and an API key. If you don't have an account yet, the Agent Accounts quickstart https://developer.nylas.com/docs/v3/getting-started/agent-accounts/ walks through provisioning; the short version from the CLI is: nylas agent account create scheduler@yourcompany.nylas.email --name "Scheduling Agent" The same thing over raw HTTP is a POST /v3/connect/custom with provider: "nylas" and a settings.email on a domain you've registered — no refresh token, no OAuth dance: curl --request POST \ --url "https://api.us.nylas.com/v3/connect/custom" \ --header "Authorization: Bearer $NYLAS API KEY" \ --header "Content-Type: application/json" \ --data '{ "provider": "nylas", "name": "Scheduling Agent", "settings": { "email": "scheduler@yourcompany.nylas.email" } }' Either way you get a grant with a primary calendar already provisioned. Grab the grant id — every endpoint below is grant-scoped at /v3/grants/{grant id}/... , which is the whole point of the grant abstraction: there's nothing new to learn on the data plane. An Agent Account hits the same Events endpoints as any connected Google or Microsoft grant. For the raw HTTP examples I'll use https://api.us.nylas.com and a bearer token: export NYLAS API KEY="