Let your agent negotiate meeting times over email Nylas developer tools enable AI agents to negotiate meeting times over email using multi-turn conversations, rather than simple calendar creation. The approach uses Nylas Agent Accounts with dedicated email and calendar, leveraging free/busy and Events APIs to build a full negotiation state machine. The developer emphasizes that real scheduling requires back-and-forth communication, not just a single API call. Most "AI scheduling assistant" demos cheat. They show a model that already knows the time, calls "create event" once, and takes a bow. That's not scheduling — that's data entry with a chat wrapper. Real scheduling is a negotiation : someone asks "are you free Tuesday?", you check, you counter with "Tuesday's full, how about Wednesday at 2?", they push back, and eventually two humans or an agent and a human converge on a slot nobody hates. It's a multi-turn conversation that happens to end in a calendar event. I already wrote about giving your agent a calendar https://developer.nylas.com/docs/v3/agent-accounts/calendars/ — provisioning a real mailbox, hosting events, RSVPing to invites. That post stops at the single create call. This one is about everything before that call: the back-and-forth where the time gets decided. The create event is the last line of the story, not the whole plot. The vehicle is a Nylas Agent Account . It's a grant with its own email address and its own calendar, so it can be an actual participant in the negotiation instead of a bot reading over a human's shoulder. I work on the Nylas CLI, so the terminal commands below are the exact ones I reach for when I'm prototyping one of these loops. One thing I'll call out up front, because it's the most common wrong turn: Scheduler is not available for Agent Accounts. No availability-configuration API, no booking pages, no /v3/scheduling/ . That's documented in Supported endpoints https://developer.nylas.com/docs/v3/agent-accounts/supported-endpoints/ . So if your instinct is "just point it at Scheduler," stop — that door is locked for this provider. What you do have is the grant's own free/busy plus the Events API, and that's enough to build the whole negotiation yourself. This post shows how. Strip away the AI and a meeting negotiation is a state machine with four moves: Three of those four moves map directly onto Nylas primitives — inbound mail, free/busy, and in-thread reply — and the fourth is the event create. The part that isn't a Nylas call is the decision in the middle: parsing "Wednesday afternoon works but not before 2" out of an email and turning it into a concrete slot. That's your application logic — an LLM call or a parser you own. I'll be honest about that boundary throughout, because pretending the API does the reasoning for you is exactly the kind of demo magic I'm complaining about. The nice thing is the data plane never changes. An Agent Account is just a grant with a grant id , so every call below is a standard /v3/grants/{grant id}/... endpoint. Nothing new to learn — if you've used the Nylas email and calendar APIs, you already know the verbs.You need: nylas agent account create support@yourcompany.com or POST /v3/connect/custom . The grant id , and a Nylas API key exported as NYLAS API KEY . message.created webhook so the agent reacts within seconds of a request arriving, or poll GET /messages on a cadence for batch flows. Both are supported.New to Agent Accounts? Read What are Agent Accounts https://developer.nylas.com/docs/v3/agent-accounts/ first — the rest of this assumes you've got a working account. All API examples use the US base host https://api.us.nylas.com and a bearer token. Swap in api.eu.nylas.com if your app lives in the EU region. When someone emails the agent — "Can we grab 30 minutes next week?" — that's a message.created webhook with a thread id . The whole negotiation lives on that one thread, so the thread id is the key you'll carry through every later step. See Email threading for agents https://developer.nylas.com/docs/v3/agent-accounts/email-threading/ for why the thread, not the subject line, is the stable identifier. Fetch the message body so your code can extract the requested window: curl --request GET \ --url "https://api.us.nylas.com/v3/grants/