How to Build Interview Coordination Across ATS and Calendar Platforms with ATS and Calendar APIs
March 4, 2026
Updated June 2026
Recruiting platforms often provide interview coordination tools that help hiring teams schedule, manage, and track candidate interviews — coordinating availability across interviewers, scheduling meetings with candidates, and keeping hiring systems updated.
Many SaaS products build these capabilities directly into their platforms. Instead of manually coordinating across email, calendars, and ATS systems, recruiters manage the whole workflow in one place.
The challenge is that interview data and scheduling live in different tools. Applicant tracking systems like Greenhouse or Lever store candidate and application data, while calendars like Outlook or Google Calendar manage availability and meetings.
Unified.to provides normalized APIs across ATS and calendar platforms. You retrieve candidate and application data from the ATS and create interview events in calendar systems through one consistent API — fetched live from the source, with no candidate data stored at rest.
Why SaaS products build interview coordination
Interview coordination is a common feature across recruiting workflow platforms, candidate scheduling tools, hiring coordination products, interview management software, and AI recruiting assistants.
Typical capabilities include recruiter-scheduled interviews with available time slots, candidate self-scheduling links, panel coordination with multiple interviewers, automatic rescheduling and cancellations, and interview feedback collection. Integrating with customer ATS and calendar systems automates these workflows.
The two Unified.to categories involved
| Category | Description | Key objects |
|---|---|---|
| ATS | Candidate and application data from platforms like Greenhouse or Lever | candidate, application, interview |
| Calendar & Meetings | Calendar events used to schedule interviews | calendar_event |
| Normalizing across these categories lets a SaaS platform coordinate interview scheduling without building separate integrations per ATS or calendar provider. |
ATS objects and key fields
Candidate
The person being interviewed.
| Field | Purpose |
|---|---|
id | Unique identifier |
first_name / last_name | Candidate name |
emails | Used to send calendar invitations (each entry has name, email, type) |
telephones | Contact information |
created_at / updated_at | Record timestamps |
Application
Connects a candidate to a job.
| Field | Purpose |
|---|---|
id | Unique identifier |
candidate_id | Candidate associated with the application |
job_id | Job being applied for |
status | Current normalized stage |
original_status | Provider-specific stage label |
applied_at | Application timestamp |
Application stage often determines when an interview should be scheduled. The normalized status enum includes SCREENING, FIRST_INTERVIEW, SECOND_INTERVIEW, and THIRD_INTERVIEW — so you might trigger coordination when a candidate reaches FIRST_INTERVIEW, for example. |
Interview
Stores the interview scheduling information.
| Field | Purpose |
|---|---|
id | Unique interview identifier |
candidate_id | Candidate being interviewed |
application_id | Associated application |
job_id | Associated job |
user_ids | Interviewers participating |
status | Interview state: SCHEDULED, AWAITING_FEEDBACK, COMPLETE, CANCELED, or NEEDS_SCHEDULING |
start_at / end_at | Interview time window |
location | Meeting location or virtual link |
external_event_xref | ID of the linked calendar event |
created_at / updated_at | Timestamps |
The external_event_xref field is what ties an ATS interview to the calendar event you create for it. |
Connecting customer ATS and calendars
Customers authorize their ATS and calendar platforms through Unified.to's embedded authorization flow:
- Your application launches the authorization flow.
- The user selects integrations such as Greenhouse, Outlook, or Google Calendar.
- The user authorizes access.
- Unified.to returns a
connection_id.
Store the mapping user_id → connection_id and reference it in all subsequent API calls.
Retrieving candidate and application data
Coordination begins by reading data from the ATS:
GET /ats/{connection_id}/candidate
GET /ats/{connection_id}/application
GET /ats/{connection_id}/interview
GET /ats/{connection_id}/job
These let the application retrieve candidate contact details, identify the associated job, determine the application stage, and view existing interviews — the context needed for scheduling.
Scheduling interviews in calendars
Once interview details are determined, the system creates a meeting in the interviewers' calendars through the Calendar & Meetings API:
POST /calendar/{connection_id}/event
The normalized CalendarEvent carries the fields you need:
| Field | Purpose |
|---|---|
subject | The event title shown on the calendar |
start_at / end_at | Interview time window |
attendees | Candidate and interviewers (each with email, name, optional user_id, and a status of ACCEPTED/REJECTED/TENTATIVE) |
conference | Video meeting details (url, label, access codes) for Zoom, Google Meet, or Teams |
location | Physical location for in-person interviews |
notes | Interview agenda or preparation notes |
send_notifications | Whether to send calendar invitations to attendees |
| Node SDK: |
const event = await sdk.calendar.createCalendarEvent({
connectionId,
calendarEvent: {
subject: 'Frontend Engineer Interview – Round 2',
startAt: '2026-07-01T15:00:00Z',
endAt: '2026-07-01T16:00:00Z',
attendees: [
{ email: 'jane@example.com', name: 'Jane Doe' },
{ email: 'interviewer@yourco.com', name: 'Sam Lee', required: true },
],
notes: 'Technical round. Focus on system design.',
sendNotifications: true,
},
});
The attendees array ensures interviewers and the candidate receive invitations. Store the returned event id against the ATS interview's external_event_xref so the two stay linked.
Keeping the ATS interview record in sync
You can create or update ATS interview records so the ATS reflects the scheduled meeting:
POST /ats/{connection_id}/interview
PUT /ats/{connection_id}/interview/{id}
Writable fields are candidate_id, job_id, application_id, user_ids, status, start_at, end_at, location, and external_event_xref. Set external_event_xref to the id of the calendar event you created, which links the ATS interview to the meeting on the calendar.
await sdk.ats.updateAtsInterview({
connectionId,
id: interviewId,
atsInterview: {
status: 'SCHEDULED',
startAt: '2026-07-01T15:00:00Z',
endAt: '2026-07-01T16:00:00Z',
externalEventXref: event.id,
},
});
Write support varies by integration, so confirm field-level support for each ATS on its Supported Integrations page.
Handling rescheduling and cancellations
Coordination tools need to react to scheduling changes. Subscribe to Unified.to calendar webhooks for created and updated events so your system can update interview times and notify participants. A cancelled meeting is represented by the event's status moving to CANCELED (the event status enum is CONFIRMED, TENTATIVE, or CANCELED), so a cancellation arrives as an update you can act on.
Supported platforms
Unified.to covers a wide range of hiring and scheduling platforms.
ATS (82 integrations) — including Greenhouse, Lever, Ashby, SmartRecruiters, iCIMS, Workday, Jobvite, BambooHR, and Workable.
Calendar & Meetings — including Google Calendar, Microsoft Outlook, Zoom Calendar, Calendly, and Webex.
Why product teams choose Unified.to
Building interview coordination normally means integrating with multiple ATS platforms and calendar systems separately. Unified.to provides normalized ATS objects for candidates, applications, and interviews; a unified calendar API for creating events; consistent authentication; and webhooks for updates — so product teams can focus on the recruiting workflow instead of maintaining dozens of integrations.
Start building interview coordination across Greenhouse, Outlook, Google Calendar, and dozens of other platforms today. Start a free 30-day trial or book a demo.