Skip to content

Python Examples

Complete Python code examples for integrating with the Prospective API.

Setup

Install Required Libraries

pip install requests

Configure API Key

import os

API_KEY = os.environ.get("PROSPECTIVE_API_KEY", "sk_live_your_key_here")
BASE_URL = "https://api.bedrockbilling.com/api/v1"

HEADERS = {
    "Authorization": API_KEY,
    "Content-Type": "application/json"
}

Fee Schedule Lookups

Search Fee Schedules

import requests

def search_fee_schedules(code: str, fee_type: str = "OPPS"):
    """Search for fee schedule rates by HCPCS code."""
    response = requests.get(
        f"{BASE_URL}/fee-schedules/search",
        headers=HEADERS,
        params={
            "code": code,
            "fee_type": fee_type,
            "limit": 10
        }
    )
    response.raise_for_status()
    return response.json()

# Example usage
results = search_fee_schedules("99213")
for item in results["data"]:
    print(f"{item['code']}: ${item['rate']}")

Get Code Details

def get_fee_schedule_by_code(code: str, fee_type: str, effective_date: str):
    """Get specific fee schedule for a code."""
    response = requests.get(
        f"{BASE_URL}/fee-schedules/code/{code}",
        headers=HEADERS,
        params={
            "fee_type": fee_type,
            "effective_date": effective_date
        }
    )
    response.raise_for_status()
    return response.json()

# Example
rate = get_fee_schedule_by_code("99213", "OPPS", "2025-01-01")
print(f"Rate: ${rate['rate']}")

Claims Processing

Process a Single Claim

def process_claim(claim_data: dict):
    """Process a claim through the pricing engine."""
    response = requests.post(
        f"{BASE_URL}/claims/process",
        headers=HEADERS,
        json=claim_data
    )
    response.raise_for_status()
    return response.json()

# Example OPPS claim
claim = {
    "bill_type": "131",
    "from_date": "2025-01-15",
    "thru_date": "2025-01-15",
    "patient_status": "01",
    "billing_provider": {
        "npi": "1234567890"
    },
    "line_items": [
        {
            "hcpcs": "99213",
            "rev_code": "0510",
            "units": 1,
            "charges": 150.00
        }
    ],
    "diagnosis_codes": ["Z00.00"]
}

result = process_claim(claim)
print(f"Total Payment: ${result['total_payment']}")

MUE Data

Check MUE Limits

def get_mue(code: str, mue_type: str = "Practitioner"):
    """Get MUE limit for a code."""
    response = requests.get(
        f"{BASE_URL}/mue-data/code/{code}",
        headers=HEADERS,
        params={"mue_type": mue_type}
    )
    response.raise_for_status()
    return response.json()

# Example
mue = get_mue("99213", "Practitioner")
print(f"MUE Value: {mue['mue_value']} units")
print(f"MAI: {mue['mue_adjudication_indicator']}")

Handling Rate Limits

Exponential Backoff

import time

def make_request_with_retry(url: str, params: dict = None, max_retries: int = 3):
    """Make a request with automatic retry on rate limit."""
    for attempt in range(max_retries):
        response = requests.get(url, headers=HEADERS, params=params)

        if response.status_code == 429:
            retry_after = int(response.headers.get("Retry-After", 60))
            print(f"Rate limited. Waiting {retry_after} seconds...")
            time.sleep(retry_after)
            continue

        response.raise_for_status()
        return response.json()

    raise Exception("Max retries exceeded")

Pagination

Iterate Through All Results

def get_all_results(endpoint: str, params: dict = None):
    """Fetch all pages of a paginated endpoint."""
    params = params or {}
    params["skip"] = 0
    params["limit"] = 100

    all_results = []

    while True:
        response = requests.get(
            f"{BASE_URL}/{endpoint}",
            headers=HEADERS,
            params=params
        )
        response.raise_for_status()
        data = response.json()

        all_results.extend(data["data"])

        if len(data["data"]) < params["limit"]:
            break

        params["skip"] += params["limit"]

    return all_results

# Example: Get all fee schedules for a code prefix
all_opps = get_all_results("fee-schedules/search", {"code": "992", "fee_type": "OPPS"})
print(f"Found {len(all_opps)} records")

Error Handling

Robust API Client

class ProspectiveAPIError(Exception):
    def __init__(self, status_code: int, detail: str):
        self.status_code = status_code
        self.detail = detail
        super().__init__(f"API Error {status_code}: {detail}")

def api_request(method: str, endpoint: str, **kwargs):
    """Make an API request with proper error handling."""
    url = f"{BASE_URL}/{endpoint}"

    response = requests.request(method, url, headers=HEADERS, **kwargs)

    if response.status_code == 401:
        raise ProspectiveAPIError(401, "Invalid API key")
    elif response.status_code == 404:
        raise ProspectiveAPIError(404, "Resource not found")
    elif response.status_code == 429:
        retry_after = response.headers.get("Retry-After", "60")
        raise ProspectiveAPIError(429, f"Rate limited. Retry after {retry_after}s")
    elif response.status_code >= 400:
        detail = response.json().get("detail", "Unknown error")
        raise ProspectiveAPIError(response.status_code, detail)

    return response.json()

# Usage
try:
    data = api_request("GET", "fee-schedules/code/99213", params={"fee_type": "OPPS"})
except ProspectiveAPIError as e:
    print(f"Error: {e}")