Skip to main content
The Candidate Self-Scheduling API lets you integrate with TapTalent’s self-scheduling flow — the one candidates use to pick their own interview slot, or an appointment at a vendor site such as a background-check or assessment center. Recruiters create and configure booking schedules (sites, durations, availability) from the TapTalent dashboard; this API covers everything a partner system needs at runtime:
  1. Look up a schedule and its open slots.
  2. Generate a unique scheduling link for a candidate and hand it to them.
  3. Read the resulting booking once the candidate picks a slot (or subscribe to webhooks instead of polling).
  4. Reschedule or cancel a booking on the candidate’s behalf.
  5. Push back attendance (check-in/no-show) captured on your side.
Base path: /v1/partner/booking-schedules and /v1/partner/bookings Authentication: Authorization: Bearer YOUR_API_KEY Booking schedule creation and availability configuration are dashboard-only, the same way webhook URLs and API keys are — see API Reference Overview for the general conventions (response envelopes, pagination, errors) this API follows.
POST /booking-schedules/{bookingScheduleId}/links only supports INTERVIEW-profile schedules. For an EVENT-profile schedule (candidate picks a location and answers custom questions), use GET /booking-schedules/{bookingScheduleId}/locations and GET /booking-schedules/{bookingScheduleId}/questions to get the choices, then POST /booking-schedules/{bookingScheduleId}/bookings to record the booking directly. Attendance recording and rescheduling/cancellation work the same way for both profiles.
A booking’s candidate isn’t always a job applicant. Booking/BookingLink identify them with entityType + entityId (both always present):
  • entityType: "JOB_CANDIDATE" — a job applicant; entityId matches a jobCandidateId from the Jobs/Candidates APIs.
  • entityType: "OUTREACH_CAMPAIGN_CANDIDATE" — a lead from an outreach campaign; entityId is internal to TapTalent.
  • entityType: "NOVA_CANDIDATE" — a candidate from TapTalent’s Agentic Onboarding flow; entityId is internal to TapTalent.
If you just need “the booking for the link I created” rather than which candidate it is, use bookingLinkId instead — returned from Create a candidate scheduling link, and it works the same regardless of entityType. Since a schedule is shared with TapTalent’s own outreach and onboarding flows, GET /bookings can include the other two types alongside yours — filter by entityType=JOB_CANDIDATE if you only want your own.

List booking schedules

GET /booking-schedules

Retrieves the non-deleted booking schedules for your company. Use this to discover which schedules (sites, interview types) are available before creating a scheduling link for a candidate.

Query parameters

Example request

Example response


Get a booking schedule

GET /booking-schedules/:bookingScheduleId

Retrieves a single booking schedule. You can only access schedules that belong to your company; cross-company access returns 404.

Path parameters

Example request

Booking Schedule object


List available slots

GET /booking-schedules/:bookingScheduleId/slots

Returns the still-bookable slots for a schedule within a date range, after excluding slots already filled by active bookings. Use this to preview availability before creating a booking link, or to validate a scheduledStartAt before calling Reschedule a booking.

Path parameters

Query parameters

Example request

Example response

remainingCapacity reports how many more candidates can still book that slot; schedules configured with no booking limit report a large sentinel value rather than null — treat any positive number as bookable.

List locations

GET /booking-schedules/:bookingScheduleId/locations

Returns the locations a candidate can pick from when booking this schedule. Only meaningful for EVENT-profile schedules; an INTERVIEW-profile schedule always returns an empty list.

Path parameters

Example request

Location object

Example response


List questions

GET /booking-schedules/:bookingScheduleId/questions

Returns the custom questions a candidate must answer when booking this schedule. Only meaningful for EVENT-profile schedules; an INTERVIEW-profile schedule always returns an empty list.

Path parameters

Example request

Question object

Example response

bookingAnswers echoes these shapes back: a plain string for text/textarea/phone, a single string for single_choice, and an array of strings for multi_choice.

POST /booking-schedules/:bookingScheduleId/links

Generates a unique self-scheduling link for the given entity on this schedule — or returns its existing active link for it, rather than creating a duplicate. Identify the entity with entityType + entityId (see the candidate-identification note near the top of this page); TapTalent resolves the record and snapshots its contact details (firstName/lastName/email/phone) onto the link — you don’t supply those yourself. The entity must already exist; this endpoint doesn’t create new candidate records. Only JOB_CANDIDATE ids are obtainable through this API — OUTREACH_CAMPAIGN_CANDIDATE and NOVA_CANDIDATE ids have no corresponding lookup here. Share data.url with the candidate yourself (email, SMS, your own portal); TapTalent does not send it on your behalf.

Path parameters

Body (JSON)

Example request

Example response

status is ACTIVE while awaiting a booking, LOCKED once the candidate has booked, REVOKED if invalidated, or REPLACED if superseded by a newer link for the same candidate and schedule. firstName/lastName/email/phone are snapshotted from the resolved entity at creation time, not supplied by you — any of them may be null if the source record doesn’t have that field on file.

Create a booking

POST /booking-schedules/:bookingScheduleId/bookings

Creates a booking directly for a given entity, slot, and — for an EVENT-profile schedule — a location and question answers. TapTalent validates the slot is still available, that selectedFormat is given when required (a BOTH-mode schedule) and omitted otherwise, and that selectedLocationId plus every required answer are present for an EVENT-profile schedule.

Path parameters

Body (JSON)

Example request — INTERVIEW-profile schedule

Example response

Example request — EVENT-profile schedule

Example response

Note that a check-in attendanceCode is issued for EVENT-profile bookings too, the same as INTERVIEW — see Record attendance / check-in.

List bookings

GET /bookings

Paginated list of bookings for your company.

Query parameters

Example response


Get a booking

GET /bookings/:bookingId

Retrieves a single booking.

Booking object

Example request

Example response


Reschedule a booking

POST /bookings/:bookingId/reschedule

Moves a booking to a new slot on the same schedule. This cancels the current booking and creates a new one — the response returns the new booking with previousBookingId set, matching how candidate-initiated reschedules behave. The original booking’s own status becomes CANCELLED. Blocked (returns 409) when:
  • The schedule has allowCandidateReschedule: false
  • Fewer than rescheduleCutoffHours remain before the current scheduledStartAt
  • The booking is not ACTIVE
  • The requested slot has no remaining capacity

Body (JSON)

Example request

Example response

Error response (409)


Cancel a booking

POST /bookings/:bookingId/cancel

Cancels an ACTIVE booking. Already-cancelled, already-attended, or no-show bookings cannot be cancelled again (409).

Body (JSON)

Example request


Record attendance / check-in

Two ways to mark attendance, depending on what your check-in point knows at that moment: Both work for a booking on any schedule profile (INTERVIEW or EVENT), and both emit booking.attendance_updated to your webhook endpoint.

Record attendance by bookingId

POST /bookings/:bookingId/attendance

Marks a candidate as attended or not-attended. The booking does not need to already be past its scheduledStartAt — you can check a candidate in early. Not valid on a CANCELLED booking (409).

Body (JSON)

Example request

TapTalent records the fixed value PARTNER_API in Booking.attendanceMarkedVia for any attendance update made through either endpoint, alongside whatever you pass in method.

Record attendance by code

POST /attendance-codes/:attendanceCode/check-in

Resolves the booking directly from its attendanceCode and records attendance — call this from a desk, kiosk, or QR scanner at the point of check-in. Consumes the code: on success, Booking.attendanceCode becomes null, same as the bookingId-based endpoint.

Path parameters

Body (JSON)

Same body as Record attendance by bookingId above.

Example request

Returns 404 if the code doesn’t match any booking in your company — wrong, already consumed, or expired.

Webhooks

Rather than polling, subscribe to booking lifecycle events at your configured webhook endpoint: booking.scheduled, booking.rescheduled, booking.cancelled, and booking.attendance_updated. See Webhooks Overview for setup.

Errors

Validation errors return 400 with code: "INVALID_REQUEST" (or a specific code such as RESCHEDULE_CUTOFF_PASSED). Missing or cross-company schedules/bookings return 404 with code: "NOT_FOUND". State conflicts (reschedule/cancel/attendance not allowed from the booking’s current status) return 409. Other failures may return 401, 429, or 500; see API Reference Overview for the shared error envelope and authentication error shapes.