Discovery

Search providers, compare offers, then bind to a specific slot.

Discovery routes are public and read-only. They return professional provider information, bookable Health Service Object offers, availability windows, and Sure Price context without exposing patient data.

SearchGET /search
OffersGET /offers
AvailabilityGET /providers/:id/availability

Boundary

Call the OpenDoc Search API, not its backing index.

Typesense and provider-profile repositories are implementation details. Product code and partner integrations should use /search, /providers, /offers, and /sure-price as the canonical discovery boundary.

/searchProvider search with query, geo/state, specialty, ranking profile, and optional clinical routing enrichment.
/providersActive provider directory rows with public NPI-backed professional profile fields.
/offersFlat provider x HSO x SCP rate-card rows sorted by cash price.
/sure-priceMachine-readable cash-price ceiling context for an HSO, geography, and payer regime.

Typical flow

Use discovery output to choose the transaction inputs.

1
Search.Find candidate providers and services with q, state, geo, specialty, or a ranking profile.
2
Read offers.Select a bookable providerHsoId from /offers or the provider detail offerings list.
3
Check availability.Fetch open slots for the provider and optional SCP scope.
4
Declare intent.Pass providerHsoId and availabilitySlotId into the transaction flow after identity/agent authority exists.

Examples

Public discovery can be smoke-tested directly.

curl "https://api.opendoc.com/search?q=knee%20MRI&state=GA&limit=10"
curl "https://api.opendoc.com/offers?q=knee&specialty=Orthopedic%20Surgery"
curl "https://api.opendoc.com/providers?specialty=Orthopedic%20Surgery&limit=10"
curl "https://api.opendoc.com/providers/<provider-id>/availability?from=2026-06-03T00:00:00.000Z"
Public does not mean transactable. Directory visibility, offer visibility, and transaction authority are different states. Transactions still require patient identity or delegated agent authority.

SDK

The SDK keeps the route sequence compact.

const client = new OpenDocClient({
  baseUrl: "https://api.opendoc.com",
});

const search = await client.search({
  q: "knee MRI",
  geo: "us-GA",
  limit: 10,
});

const offers = await client.listOffers({
  q: "knee",
  specialty: "Orthopedic Surgery",
  limit: 20,
});

const slots = await client.checkAvailability(offers.data[0].providerId, {
  scpId: offers.data[0].scpId,
});