{"openapi":"3.1.0","info":{"title":"Find doctors and specialists in the Greater Toronto Area","version":"1.0.0","description":"Structured REST API and MCP access to Greater Toronto Area doctors, specialists, clinics, languages, availability signals, and data freshness. CPSO remains the authoritative source for Ontario physician registration. Availability is best-effort: surface freshness and tell users to phone the clinic to confirm.","termsOfService":"https://finddoc-ten.vercel.app/contact","contact":{"name":"FindDoc","url":"https://finddoc-ten.vercel.app/contact"}},"externalDocs":{"description":"Developer documentation and MCP setup","url":"https://finddoc-ten.vercel.app/developers"},"servers":[{"url":"https://finddoc-ten.vercel.app/api/v1","description":"Direct FindDoc API; use Authorization: Bearer."},{"url":"https://finddoc.p.rapidapi.com","description":"RapidAPI gateway; use X-RapidAPI-Key and X-RapidAPI-Host."}],"tags":[{"name":"Health","description":"Liveness and readiness."},{"name":"Doctors","description":"Doctor search and detail by CPSO number."},{"name":"Clinics","description":"Clinic search, detail, reviews, and signals."},{"name":"Specialists","description":"Specialist clinic search."},{"name":"Metadata","description":"Supported specialties and languages."}],"paths":{"/":{"get":{"operationId":"getApiReadiness","summary":"API readiness","description":"Database-backed readiness check.","tags":["Health"],"security":[],"responses":{"200":{"description":"Successful response. Availability fields are best-effort and must be confirmed with the clinic.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/ping":{"get":{"operationId":"getApiLiveness","summary":"API liveness","description":"Unauthenticated, database-free liveness check.","tags":["Health"],"security":[],"responses":{"200":{"description":"The API process is live.","content":{"text/plain":{"schema":{"type":"string","const":"pong"}}}}}}},"/doctors":{"get":{"operationId":"listDoctors","summary":"List doctors","description":"Filter GTA doctors by specialty, language, gender, experience, and accepting-patients signal.","tags":["Doctors"],"security":[{"bearerAuth":[]},{"rapidApiKey":[],"rapidApiHost":[]}],"parameters":[{"name":"specialty","in":"query","description":"Normalized specialty name.","schema":{"type":"string"}},{"name":"languages","in":"query","description":"Comma-separated languages.","schema":{"type":"string"}},{"name":"gender","in":"query","description":"Doctor gender filter.","schema":{"type":"string"}},{"name":"accepting","in":"query","description":"Filter by accepting-new-patients signal.","schema":{"type":"boolean"}},{"name":"minYears","in":"query","description":"Minimum years in practice.","schema":{"type":"integer","minimum":0}},{"name":"maxYears","in":"query","description":"Maximum years in practice.","schema":{"type":"integer","minimum":0}},{"name":"limit","in":"query","description":"Maximum records to return; capped at 100.","schema":{"type":"integer","minimum":0}},{"name":"offset","in":"query","description":"Zero-based result offset.","schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"Successful response. Availability fields are best-effort and must be confirmed with the clinic.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/doctors/search":{"get":{"operationId":"searchDoctors","summary":"Search doctors","description":"Search doctor names and structured doctor fields.","tags":["Doctors"],"security":[{"bearerAuth":[]},{"rapidApiKey":[],"rapidApiHost":[]}],"parameters":[{"name":"q","in":"query","description":"Search query; minimum two characters.","schema":{"type":"string"},"required":true},{"name":"specialty","in":"query","description":"Normalized specialty name.","schema":{"type":"string"}},{"name":"languages","in":"query","description":"Comma-separated languages.","schema":{"type":"string"}},{"name":"gender","in":"query","description":"Doctor gender filter.","schema":{"type":"string"}},{"name":"accepting","in":"query","description":"Filter by accepting-new-patients signal.","schema":{"type":"boolean"}},{"name":"minYears","in":"query","description":"Minimum years in practice.","schema":{"type":"integer","minimum":0}},{"name":"maxYears","in":"query","description":"Maximum years in practice.","schema":{"type":"integer","minimum":0}},{"name":"limit","in":"query","description":"Maximum records to return; capped at 100.","schema":{"type":"integer","minimum":0}},{"name":"offset","in":"query","description":"Zero-based result offset.","schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"Successful response. Availability fields are best-effort and must be confirmed with the clinic.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/doctors/summary":{"get":{"operationId":"getDoctorSummary","summary":"Doctor summary","description":"Aggregate doctor coverage summary.","tags":["Doctors"],"security":[{"bearerAuth":[]},{"rapidApiKey":[],"rapidApiHost":[]}],"parameters":[],"responses":{"200":{"description":"Successful response. Availability fields are best-effort and must be confirmed with the clinic.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/doctors/{cpso}":{"get":{"operationId":"getDoctor","summary":"Get a doctor","description":"Get doctor detail by CPSO registration number.","tags":["Doctors"],"security":[{"bearerAuth":[]},{"rapidApiKey":[],"rapidApiHost":[]}],"parameters":[{"name":"cpso","in":"path","required":true,"description":"Ontario CPSO registration number.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response. Availability fields are best-effort and must be confirmed with the clinic.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/doctors/{cpso}/reviews":{"get":{"operationId":"listDoctorReviews","summary":"List doctor reviews","description":"Get the review records associated with a doctor.","tags":["Doctors"],"security":[{"bearerAuth":[]},{"rapidApiKey":[],"rapidApiHost":[]}],"parameters":[{"name":"cpso","in":"path","required":true,"description":"Ontario CPSO registration number.","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum records to return; capped at 100.","schema":{"type":"integer","minimum":0}},{"name":"offset","in":"query","description":"Zero-based result offset.","schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"Successful response. Availability fields are best-effort and must be confirmed with the clinic.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/doctors/{cpso}/signals":{"get":{"operationId":"getDoctorSignals","summary":"Get doctor care signals","description":"Get minimum-sample, per-dimension review signals.","tags":["Doctors"],"security":[{"bearerAuth":[]},{"rapidApiKey":[],"rapidApiHost":[]}],"parameters":[{"name":"cpso","in":"path","required":true,"description":"Ontario CPSO registration number.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response. Availability fields are best-effort and must be confirmed with the clinic.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/clinics":{"get":{"operationId":"listClinics","summary":"List clinics","description":"Filter GTA clinics by location, accessibility, hours, language, specialty, and accepting-patients signal.","tags":["Clinics"],"security":[{"bearerAuth":[]},{"rapidApiKey":[],"rapidApiHost":[]}],"parameters":[{"name":"accepting","in":"query","description":"Filter by accepting-new-patients signal.","schema":{"type":"boolean"}},{"name":"languages","in":"query","description":"Comma-separated languages.","schema":{"type":"string"}},{"name":"specialties","in":"query","description":"Comma-separated specialties.","schema":{"type":"string"}},{"name":"gender","in":"query","description":"Doctor gender represented at the clinic.","schema":{"type":"string"}},{"name":"minYears","in":"query","description":"Minimum years in practice.","schema":{"type":"integer","minimum":0}},{"name":"maxYears","in":"query","description":"Maximum years in practice.","schema":{"type":"integer","minimum":0}},{"name":"lat","in":"query","description":"Latitude used for proximity ordering.","schema":{"type":"number"}},{"name":"lng","in":"query","description":"Longitude used for proximity ordering.","schema":{"type":"number"}},{"name":"evening","in":"query","description":"Require evening hours.","schema":{"type":"boolean"}},{"name":"weekend","in":"query","description":"Require weekend hours.","schema":{"type":"boolean"}},{"name":"wheelchair","in":"query","description":"Require wheelchair accessibility.","schema":{"type":"boolean"}},{"name":"virtualVisits","in":"query","description":"Require a virtual-visit signal.","schema":{"type":"boolean"}},{"name":"nearTTC","in":"query","description":"Require a near-TTC signal.","schema":{"type":"boolean"}},{"name":"hasWebsite","in":"query","description":"Require a clinic website.","schema":{"type":"boolean"}},{"name":"include","in":"query","description":"Comma-separated optional fields: notes,links.","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum records to return; capped at 100.","schema":{"type":"integer","minimum":0}},{"name":"offset","in":"query","description":"Zero-based result offset.","schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"Successful response. Availability fields are best-effort and must be confirmed with the clinic.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/clinics/{id}":{"get":{"operationId":"getClinic","summary":"Get a clinic","description":"Get a clinic and its contact/navigation details.","tags":["Clinics"],"security":[{"bearerAuth":[]},{"rapidApiKey":[],"rapidApiHost":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"FindDoc clinic identifier.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response. Availability fields are best-effort and must be confirmed with the clinic.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/clinics/{id}/reviews":{"get":{"operationId":"listClinicReviews","summary":"List clinic reviews","description":"Get review aggregates and records for a clinic.","tags":["Clinics"],"security":[{"bearerAuth":[]},{"rapidApiKey":[],"rapidApiHost":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"FindDoc clinic identifier.","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Maximum records to return; capped at 100.","schema":{"type":"integer","minimum":0}},{"name":"offset","in":"query","description":"Zero-based result offset.","schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"Successful response. Availability fields are best-effort and must be confirmed with the clinic.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/clinics/{id}/signals":{"get":{"operationId":"getClinicSignals","summary":"Get clinic care signals","description":"Get minimum-sample, per-dimension clinic review signals.","tags":["Clinics"],"security":[{"bearerAuth":[]},{"rapidApiKey":[],"rapidApiHost":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"FindDoc clinic identifier.","schema":{"type":"string"}}],"responses":{"200":{"description":"Successful response. Availability fields are best-effort and must be confirmed with the clinic.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/specialists":{"get":{"operationId":"listSpecialists","summary":"List specialists","description":"Find GTA specialist clinics by specialty and constraints.","tags":["Specialists"],"security":[{"bearerAuth":[]},{"rapidApiKey":[],"rapidApiHost":[]}],"parameters":[{"name":"specialty","in":"query","description":"Required normalized specialty.","schema":{"type":"string"},"required":true},{"name":"accepting","in":"query","description":"Filter by accepting-new-patients signal.","schema":{"type":"boolean"}},{"name":"languages","in":"query","description":"Comma-separated languages.","schema":{"type":"string"}},{"name":"specialties","in":"query","description":"Comma-separated specialties.","schema":{"type":"string"}},{"name":"gender","in":"query","description":"Doctor gender represented at the clinic.","schema":{"type":"string"}},{"name":"minYears","in":"query","description":"Minimum years in practice.","schema":{"type":"integer","minimum":0}},{"name":"maxYears","in":"query","description":"Maximum years in practice.","schema":{"type":"integer","minimum":0}},{"name":"lat","in":"query","description":"Latitude used for proximity ordering.","schema":{"type":"number"}},{"name":"lng","in":"query","description":"Longitude used for proximity ordering.","schema":{"type":"number"}},{"name":"evening","in":"query","description":"Require evening hours.","schema":{"type":"boolean"}},{"name":"weekend","in":"query","description":"Require weekend hours.","schema":{"type":"boolean"}},{"name":"wheelchair","in":"query","description":"Require wheelchair accessibility.","schema":{"type":"boolean"}},{"name":"virtualVisits","in":"query","description":"Require a virtual-visit signal.","schema":{"type":"boolean"}},{"name":"nearTTC","in":"query","description":"Require a near-TTC signal.","schema":{"type":"boolean"}},{"name":"hasWebsite","in":"query","description":"Require a clinic website.","schema":{"type":"boolean"}},{"name":"limit","in":"query","description":"Maximum records to return; capped at 100.","schema":{"type":"integer","minimum":0}},{"name":"offset","in":"query","description":"Zero-based result offset.","schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"Successful response. Availability fields are best-effort and must be confirmed with the clinic.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/metadata/specialties":{"get":{"operationId":"listSpecialties","summary":"List specialties","description":"List normalized specialty filter values and doctor counts.","tags":["Metadata"],"security":[{"bearerAuth":[]},{"rapidApiKey":[],"rapidApiHost":[]}],"parameters":[],"responses":{"200":{"description":"Successful response. Availability fields are best-effort and must be confirmed with the clinic.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/metadata/languages":{"get":{"operationId":"listLanguages","summary":"List languages","description":"List supported language filter values and doctor counts.","tags":["Metadata"],"security":[{"bearerAuth":[]},{"rapidApiKey":[],"rapidApiHost":[]}],"parameters":[],"responses":{"200":{"description":"Successful response. Availability fields are best-effort and must be confirmed with the clinic.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"fd_ API key","description":"Direct FindDoc API key."},"rapidApiKey":{"type":"apiKey","in":"header","name":"X-RapidAPI-Key","description":"RapidAPI consumer key; send only to the RapidAPI server."},"rapidApiHost":{"type":"apiKey","in":"header","name":"X-RapidAPI-Host","description":"Must be finddoc.p.rapidapi.com."}},"responses":{"BadRequest":{"description":"A required parameter is missing or invalid."},"Unauthorized":{"description":"A direct API key or RapidAPI subscription is required."},"Forbidden":{"description":"The credential is valid but cannot access this resource."},"RateLimited":{"description":"Rate limit exceeded; inspect the rate-limit headers."}}}}