Skip to content

Quick Start

Make your first API call in 30 seconds.

Base URL

https://fhir-api.luxera.io

1. Search for endpoints

Find all FHIR endpoints for "Cleveland Clinic":

bash
curl "https://fhir-api.luxera.io/api/v1/endpoints?query=Cleveland+Clinic"
python
import requests

response = requests.get("https://fhir-api.luxera.io/api/v1/endpoints", params={
    "query": "Cleveland Clinic"
})
data = response.json()

for endpoint in data["data"]:
    print(f"{endpoint['organizationName']}{endpoint['url']}")
typescript
const response = await fetch(
  "https://fhir-api.luxera.io/api/v1/endpoints?query=Cleveland+Clinic"
);
const { data, meta } = await response.json();

for (const endpoint of data) {
  console.log(`${endpoint.organizationName} — ${endpoint.url}`);
}
csharp
using var client = new HttpClient();
var response = await client.GetAsync(
    "https://fhir-api.luxera.io/api/v1/endpoints?query=Cleveland+Clinic"
);
var json = await response.Content.ReadAsStringAsync();
var result = JsonSerializer.Deserialize<ApiResponse>(json);

foreach (var endpoint in result.Data)
{
    Console.WriteLine($"{endpoint.OrganizationName} — {endpoint.Url}");
}

Response:

json
{
  "success": true,
  "data": [
    {
      "id": "a1b2c3d4e5f6g7h8",
      "url": "https://epicproxy.et0965.epichosted.com/FHIRProxy/api/FHIR/R4/",
      "vendorName": "Epic Systems",
      "vendorId": "epic",
      "organizationName": "Cleveland Clinic",
      "fhirVersion": "R4",
      "access": [],
      "status": "listed",
      "lastUpdated": "2026-04-09T03:14:32.584Z"
    }
  ],
  "meta": { "total": 23, "page": 1, "limit": 25 }
}

2. Filter by vendor

bash
curl "https://fhir-api.luxera.io/api/v1/endpoints?vendor=epic&limit=5"
python
response = requests.get("https://fhir-api.luxera.io/api/v1/endpoints", params={
    "vendor": "epic",
    "limit": 5
})
typescript
const response = await fetch(
  "https://fhir-api.luxera.io/api/v1/endpoints?vendor=epic&limit=5"
);
csharp
var response = await client.GetAsync(
    "https://fhir-api.luxera.io/api/v1/endpoints?vendor=epic&limit=5"
);

3. Filter by FHIR version

bash
curl "https://fhir-api.luxera.io/api/v1/endpoints?fhirVersion=R4&limit=5"
python
response = requests.get("https://fhir-api.luxera.io/api/v1/endpoints", params={
    "fhirVersion": "R4",
    "limit": 5
})
typescript
const response = await fetch(
  "https://fhir-api.luxera.io/api/v1/endpoints?fhirVersion=R4&limit=5"
);
csharp
var response = await client.GetAsync(
    "https://fhir-api.luxera.io/api/v1/endpoints?fhirVersion=R4&limit=5"
);

4. Combine filters

Epic endpoints in Wisconsin:

bash
curl "https://fhir-api.luxera.io/api/v1/endpoints?vendor=epic&state=WI&limit=5"
python
response = requests.get("https://fhir-api.luxera.io/api/v1/endpoints", params={
    "vendor": "epic",
    "state": "WI",
    "limit": 5
})
typescript
const response = await fetch(
  "https://fhir-api.luxera.io/api/v1/endpoints?vendor=epic&state=WI&limit=5"
);
csharp
var response = await client.GetAsync(
    "https://fhir-api.luxera.io/api/v1/endpoints?vendor=epic&state=WI&limit=5"
);

5. Get dataset stats

bash
curl "https://fhir-api.luxera.io/api/v1/stats"
python
response = requests.get("https://fhir-api.luxera.io/api/v1/stats")
stats = response.json()["data"]
print(f"Endpoints: {stats['totalEndpoints']:,}")
print(f"Vendors: {stats['vendorCount']}")
typescript
const response = await fetch("https://fhir-api.luxera.io/api/v1/stats");
const { data: stats } = await response.json();
console.log(`Endpoints: ${stats.totalEndpoints.toLocaleString()}`);
console.log(`Vendors: ${stats.vendorCount}`);
csharp
var response = await client.GetAsync(
    "https://fhir-api.luxera.io/api/v1/stats"
);

6. List all vendors

bash
curl "https://fhir-api.luxera.io/api/v1/vendors"
python
response = requests.get("https://fhir-api.luxera.io/api/v1/vendors")
for vendor in response.json()["data"]:
    print(f"{vendor['name']}: {vendor['endpointCount']} endpoints")
typescript
const response = await fetch("https://fhir-api.luxera.io/api/v1/vendors");
const { data: vendors } = await response.json();
for (const vendor of vendors) {
  console.log(`${vendor.name}: ${vendor.endpointCount} endpoints`);
}
csharp
var response = await client.GetAsync(
    "https://fhir-api.luxera.io/api/v1/vendors"
);

7. Paginate through all results

bash
# Page through all Epic endpoints
for page in 1 2 3 4 5; do
  curl "https://fhir-api.luxera.io/api/v1/endpoints?vendor=epic&limit=100&page=$page"
done
python
import requests

page = 1
all_endpoints = []

while True:
    response = requests.get("https://fhir-api.luxera.io/api/v1/endpoints", params={
        "vendor": "epic",
        "limit": 100,
        "page": page
    })
    result = response.json()
    all_endpoints.extend(result["data"])

    if page * 100 >= result["meta"]["total"]:
        break
    page += 1

print(f"Fetched {len(all_endpoints)} Epic endpoints")
typescript
const allEndpoints = [];
let page = 1;

while (true) {
  const response = await fetch(
    `https://fhir-api.luxera.io/api/v1/endpoints?vendor=epic&limit=100&page=${page}`
  );
  const result = await response.json();
  allEndpoints.push(...result.data);

  if (page * 100 >= result.meta.total) break;
  page++;
}

console.log(`Fetched ${allEndpoints.length} Epic endpoints`);
csharp
var allEndpoints = new List<Endpoint>();
var page = 1;

while (true)
{
    var response = await client.GetAsync(
        $"https://fhir-api.luxera.io/api/v1/endpoints?vendor=epic&limit=100&page={page}"
    );
    var result = JsonSerializer.Deserialize<ApiResponse>(
        await response.Content.ReadAsStringAsync()
    );
    allEndpoints.AddRange(result.Data);

    if (page * 100 >= result.Meta.Total) break;
    page++;
}

Console.WriteLine($"Fetched {allEndpoints.Count} Epic endpoints");

Use cases

  • Health tech developers — Find FHIR endpoints to integrate with, without maintaining your own scraper
  • AI agents & LLM tools — Programmatic discovery of FHIR endpoints for automated workflows
  • Compliance teams — Verify endpoint availability across your vendor network
  • Researchers — Analyze the US FHIR endpoint landscape

Rate limits

Requests are rate limited to protect the infrastructure. Check the RateLimit-* response headers on every response and back off as your quota approaches zero. See the Rate Limits guide for details.

Next steps

Built by Luxera Software