Added

OnSched 3.14.0 - appointment cursor pagination and durable Bulk Migration Sync

API

  • GET /v3/appointments/cursor: Traverse large appointment histories without
    deep offsets or total-count queries. The first request accepts existing appointment
    filters, sort, order, and a limit up to 100. Later requests send only the opaque
    nextCursor; stop when it is null.
  • Compatibility: GET /v3/appointments remains available for page/count UIs.
    The deprecated /v3/appointments/filter alias remains available with the same
    offset and request safeguards while clients migrate.
  • Operational behavior: Cursor traversal has a separate relaxed Company request
    budget and still honors Retry-After when shared database admission is full.

See Cursor Pagination for Appointments.

Bulk Migration Sync

  • Enqueue a Bulk Migration Sync: POST /v3/migration/jobs with a dashboard JWT and { "v1CompanyIds": ["…"] } returns 202 and { "success": true, "jobId": "<uuid>" } within seconds. Company Sync then runs sequentially on the server. IDs must belong to that operator's V1 companies (400 otherwise). An empty or missing v1CompanyIds array returns 400. A second start while that operator already has a pending or running job returns 409 with the existing jobId.
  • Poll progress: GET /v3/migration/jobs/{id} returns the job status, per-company pending / running / done / error rows, counters, and errors[]. Only the owning operator can read the job; other operators get 404.
  • Active job: GET /v3/migration/jobs returns the operator's current pending or running job, or 404 if none.
  • POST /v3/migration/sync is an alias: Same body, same 202 { jobId } (or 400). It does not hold the HTTP request until import finishes, and it does not sync every company for the operator email when v1CompanyIds is omitted.
  • Company list unchanged: GET /v3/migration/companies still returns the full V1 company list for the signed-in email.
  • Job completion: The job is completed when every selected company is done or error. A company-level error does not by itself mark the job failed. failed is reserved for enqueue blowing up before work starts.

These routes use a dashboard JWT, not OAuth2 client credentials. See Migrating from v1 to v3.

Dashboard

  • Bulk Migration Sync modal: Getting Started and API Settings both open the same company picker. Choose V1 companies, then start the job. The table pages 20 companies at a time; Select all applies to the full loaded list, not only the current page.
  • Close the tab: Import continues on the server. Re-open the modal to attach to the active job. Large sets may take hours.