Most scheduling APIs are built around a simple assumption: you already know who the appointment is with.
You have a host. You have their calendar. You need to find open slots and book one. That's it.
For a lot of applications, that's exactly right. If your product is a personal calendar app, a meeting scheduler, or a widget that lets customers book time with a specific consultant β traditional scheduling APIs are the correct tool.
But there's a different class of problem that looks similar from the outside, and breaks when you try to solve it with the same tools.
The Problem Traditional Scheduling APIs Solve
A scheduling API like Calendly, Cal.com, or the Nylas Scheduling API is optimized around this flow:
- You know the provider (host)
- You query their availability
- You present open slots to the user
- The user picks one
- You create the event
The data model is: calendar accounts β events β availability windows.
This works perfectly when the provider identity is already known. Your AI assistant scheduling a meeting for you with a specific colleague. A patient booking a follow-up with their existing doctor. A customer selecting a specific account manager.
In these cases, the question is: when is this person free?
The Problem Provider Resolution Solves
Provider resolution starts from a different question: who should handle this request?
You have a customer with a need. You have a network of professionals. The right provider isn't known yet β it has to be determined based on:
- Hard constraints: Is the provider licensed for this service? Do they have the required certifications? Are they in the right jurisdiction?
- Customer-specific rules: Does the customer have a preferred provider? Are there conflict-of-interest restrictions?
- Availability: Among eligible providers, who has an open slot in the requested window?
- Ranking: Among those with open slots, which should be presented first β and why?
The data model is: providers β services β eligibility rules β availability β ranked options with explanations.
This is fundamentally different from "show me free slots for this person." It's closer to: "given this need and these constraints, find me the best match."
The Two Flows Side by Side
Scheduling API flow
// You already know the provider
const slots = await schedulingApi.getAvailability({
hostId: "dr_smith",
duration: 30,
dateRange: { from: "2026-08-05", to: "2026-08-12" }
});
// Present slots β user picks one
const booking = await schedulingApi.createBooking({
hostId: "dr_smith",
slotId: slots[0].id,
attendee: { name: "Jane", email: "jane@example.com" }
});
Provider resolution flow
// You know the need, not the provider
const resolution = await orita.resolveScheduling({
serviceId: "svc_therapy_initial",
constraints: {
languageCodes: { anyOf: ["es", "en"] },
acceptingNewPatients: true,
insuranceNetworks: { anyOf: ["BlueCross"] }
},
preferences: {
specializationTags: ["anxiety", "CBT"]
},
dateRange: { from: "2026-08-05", to: "2026-08-12" }
});
// Returns ranked options with explanations
// resolution.options[0].explanation:
// "Dr. GarcΓa β licensed, accepting new patients, BlueCross in-network,
// specializes in CBT, earliest available: Aug 6 at 10:00 AM"
// Hold the slot while the customer decides
const hold = await orita.holdOption(
resolution.resolutionId,
resolution.options[0].optionId,
{ ttlSeconds: 300 }
);
// Customer confirms β atomic booking
const booking = await orita.confirmResolution(
resolution.resolutionId,
{ optionId: resolution.options[0].optionId, customer }
);
The resolve β hold β confirm pattern exists because provider resolution deals with contention: multiple agents or users may be evaluating the same provider simultaneously. A hold prevents double-booking during the decision window.
Hard Constraints vs Preferences
One of the biggest differences between the two paradigms is how they handle constraints.
A scheduling API is mostly about time: is this slot free or not? It's binary.
Provider resolution has to handle two distinct layers:
Hard constraints are disqualifying. A provider without the required license cannot take this booking, period. A provider outside the required jurisdiction cannot appear in results. These aren't preferences β violating them is a compliance failure, not a degraded experience.
Preferences are ranking signals. A customer might prefer a provider who speaks Spanish. That doesn't disqualify English-only providers, but it should rank Spanish speakers higher. A provider with more experience in a relevant specialization might rank above a generalist, all else equal.
Mixing these up is a common source of bugs. Applications that try to implement eligibility logic themselves tend to either:
- Treat hard constraints as soft (and produce legally non-compliant bookings)
- Treat preferences as hard (and fail to find matches unnecessarily)
A proper provider resolution API separates these explicitly.
When to Use a Scheduling API
Use a traditional scheduling API when:
- The provider is already known. You're booking time with a specific person, not searching for one.
- You need to sync with external calendars. Google Calendar, Outlook, Exchange β if multi-calendar connectivity is the core problem, use a calendar API.
- The product is consumer-facing scheduling. Meeting widgets, personal booking pages, "book time with me" flows.
- Your routing logic is simple. Round-robin among a small team, or manual assignment.
These tools are mature, well-documented, and have excellent ecosystem support. Don't replace them when they fit.
When to Use Provider Resolution
Use provider resolution when:
- The provider identity must be determined, not assumed. You know the need; the system must find who satisfies it.
- Eligibility rules are real. Licensing, certifications, jurisdictions, insurance networks, conflict checks β constraints that go beyond availability.
- Your results need to be explainable. "We booked Dr. GarcΓa because she is in-network, available Tuesday, and specializes in your condition" is a different UX than "here are open slots."
- You're building for AI agents. Agents need a structured resolution layer they can call with constraints and get back ranked, explained options β not a raw calendar API they have to build matching logic on top of.
- You need booking safety. Holds, idempotency, atomic confirmation, and webhook delivery matter when you're operating at scale or in regulated industries.
A Generic Comparison
| Dimension | Scheduling API | Provider Resolution API | |---|---|---| | Starting point | A known provider | A customer need | | Primary job | Find open slots for a person | Find the eligible person for a need | | Data model | Calendar accounts + events | Providers + services + eligibility rules | | Routing | Manual or round-robin | Deterministic rules + preference ranking | | Result | Available time slots | Ranked, explained provider-time options | | Constraint model | Time availability only | Hard eligibility + soft preferences | | Execution | Create calendar event | Hold β atomic confirm β webhooks | | AI agent support | Calendar read/write | Native MCP tools with safety rules |
Can You Use Both?
Yes β and some applications should.
A common pattern in healthcare or legal tech: Orita resolves which provider is eligible and available, the customer confirms, and then a calendar API (Nylas, Google Calendar API, etc.) writes the confirmed event to the provider's actual calendar system.
// 1. Orita finds and confirms the right provider
const booking = await orita.confirmResolution(resolutionId, {
optionId: selectedOptionId,
customer: { name, email, phone }
});
// 2. Calendar API writes to the provider's calendar
await calendarApi.events.create({
calendarId: providerCalendarId,
title: `${booking.serviceName} β ${booking.customer.name}`,
when: {
startTime: booking.startUtc,
endTime: booking.endUtc
}
});
The division of labor: Orita owns the who and the why. The calendar API owns the what (the event record in the provider's calendar system).
The Diagnostic Question
If you're not sure which you need, ask yourself:
Does my application know who the appointment is with before it starts looking for availability?
If yes β scheduling API.
If no β provider resolution.
Most enterprise applications that deal with professional services, healthcare, legal, financial advice, or technical support operate in the "no" case. The provider must be found, not assumed.
Building that routing logic from scratch on top of a calendar API is possible β but it means you're reimplementing matching, eligibility checking, conflict detection, preference ranking, holds, and idempotent confirmation yourself. That's the problem a provider resolution API is designed to solve.
Provider resolution isn't a replacement for scheduling infrastructure β it's a layer above it. If your product needs to answer "who should handle this?" before it can answer "when are they free?", that's the layer you're missing.
