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,
});