Introduction
Welcome to the EMR API documentation. This API allows partners to integrate with our Electronic Medical Record system to manage prospects, tags, and view provider availability.
/v1/{PPass}
Authentication
Our API uses API Keys to generate temporary JWT Bearer tokens.
POST /v1/{PPass}/auth/token
Exchange your API key for an access token.
Request Body
{
"apiKey": "your_api_key_here"
}
Response
{
"accessToken": "eyJhbGciOiJIUzI1NiIs...",
"tokenType": "Bearer",
"expiresIn": "24h"
}
Include the token in all subsequent requests:
Authorization: Bearer YOUR_TOKEN
Prospects
GET /v1/{PPass}/prospects
List and search prospects.
Query params: search, page, limit, prospect=true
POST /v1/{PPass}/prospects
Create a new prospect.
Example Body
{
"FirstName": "John",
"LastName": "Doe",
"EMail": "john@example.com",
"Phone": "555-0123"
}
PUT /v1/{PPass}/prospects/{id}
Update an existing prospect. Fields: FirstName, MI, LastName, FullName, NickName, Gender (m,f,o,u), DOB, LifeStage (Infant,Toddler,Child,Adolescent,EarlyAdult,Adult,AllAdults,Senior), Pronouns, SexualIdentity, PrimaryLanguage, Type (Patient,Child,Cash,Insurance,Guarantor) , Phone, CellPhone, SMSPhone, EMail, Address, Unit, City, State, Zip, Country, ProviderID, Prospect (1,0), Sh_Name, Sh_Address, Sh_Unit, Sh_City, Sh_State, Sh_Zip, Sh_Country, PtImg, Notes
Providers
Requires Providers scope.
GET /v1/{PPass}/availability/providers
List all active providers.
GET /v1/{PPass}/availability/providers/{id}
Get specific provider details.
GET /v1/{PPass}/availability/providers/{id}/schedule
Get scheduled visits for a provider within a date range.
Query params: startDate, endDate, visitType
Example Request
GET /v1/DemoOffice/availability/providers/1/schedule?startDate=2026-03-09&endDate=2026-03-15
Example Response
{
"data": {
"provider": {
"id": 1,
"name": "Jane Smith",
"title": "PA-C",
"specialty": "Aesthetics"
},
"startDate": "2026-03-09",
"endDate": "2026-03-15",
"schedule": {
"2026-03-09": [
{ "VisitID": 101, "time": "09:00:00", "duration": 30, "type": "FOLLOWUP", "booked": true }
]
},
"totalVisits": 1
}
}
GET /v1/{PPass}/availability/providers/{id}/check
Check whether a specific date/time/duration slot is available.
Query params: date, time, duration
Example Request
GET /v1/DemoOffice/availability/providers/1/check?date=2026-03-09&time=10:15:00&duration=30
Example Response
{
"data": {
"ProviderID": 1,
"Date": "2026-03-09",
"Time": "10:15:00",
"Duration": 30,
"Available": true
}
}
GET /v1/{PPass}/availability/providers/{id}/slots
Get all available slots for a provider on a specific date.
Query params: date, duration
Example Request
GET /v1/DemoOffice/availability/providers/1/slots?date=2026-03-09&duration=30
Example Response
{
"data": {
"ProviderID": 1,
"Date": "2026-03-09",
"Duration": 30,
"Slots": ["09:00:00", "11:30:00", "14:00:00"],
"Count": 3
}
}
GET /v1/{PPass}/availability/providers/{id}/next-slot
Get the next available slot for a provider.
Query params: duration, maxDays (optional, default 365)
Example Request
GET /v1/DemoOffice/availability/providers/1/next-slot?duration=30&maxDays=30
Example Response
{
"data": {
"ProviderID": 1,
"Duration": 30,
"SearchWindowDays": 30,
"TheNextSlot": {
"ProviderID": "1",
"Date": "2026-03-10",
"Time": "09:00:00"
}
}
}
Visit Scheduling
Requires Scheduling scope.
GET /v1/{PPass}/visit-types
List visit types configured for the tenant, including allowed providers and resources.
Query params: includeInactive (optional, default false)
Example Request
GET /v1/DemoOffice/visit-types
Example Response
{
"data": [
{
"VisitType": "Consult",
"Active": true,
"Providers": [1, 2],
"Resources": [101, 102]
}
],
"count": 1
}
POST /v1/{PPass}/visits/book
Book a visit in the tenant Visits table with provider and resource availability checks.
Required: PatientID, ProviderID, VisitType, VisitDate, VisitTime, VisitDuration
Optional: VisitComplaint, ProviderTime, ProviderDuration, VisitNotes
Example Body
{
"PatientID": 1001,
"ProviderID": 2,
"VisitType": "Consult",
"VisitDate": "2026-03-12",
"VisitTime": "10:00:00",
"VisitDuration": 30,
"VisitComplaint": "Follow-up",
"ProviderTime": "10:00:00",
"ProviderDuration": 30,
"VisitNotes": "Booked via API"
}
Example Response
{
"message": "Visit booked successfully",
"data": {
"VisitID": 555,
"PatientID": 1001,
"ProviderID": 2,
"VisitType": "Consult",
"VisitDate": "2026-03-12",
"VisitTime": "10:00:00",
"VisitDuration": 30,
"ProviderTime": "10:00:00",
"ProviderDuration": 30,
"RoomID": 102
}
}
Products (ProductPro)
Requires ProductPro.Products scope. These endpoints are global (no {PPass} required).
GET /v1/products
List available products. Searchable via search and vendorCode query params.
POST /v1/products
Bulk update or create products.
{
"products": [
{
"VendorCode": "V001",
"ProductCode": "P001",
"Product": "Example Product",
"RetailPrice": 99.99
}
]
}
Knowledge Base
Requires KB scope. These endpoints are global.
GET /v1/kb
List KB articles. Searchable via search, category, and type query params.
GET /v1/kb/{id}
Get details for a specific KB article.
Example Request
GET /v1/kb/12
Example Response
{
"data": {
"KBID": 12,
"Title": "Insurance Verification Workflow",
"Article": "Step-by-step process...",
"Category": "Billing",
"Type": "HowTo",
"Tags": "insurance, verification",
"Active": true
}
}
PUT /v1/kb/{id}
Update a specific KB article.
Webhooks
Register a webhook endpoint for OfficePro events sourced from the log table.
POST /v1/webhooks/signup
Creates or updates the authenticated client webhook subscription.
Allowed scopes: Patients, Encounters, Claims, Payments, Documents
Delivery uses incremental log_id polling and includes headers X-OfficePro-Event and X-OfficePro-Event-Id.
Example Request
{
"hookUrl": "https://partner.example.com/officepro/webhooks",
"scopes": ["Patients", "Claims"]
}
Example Response
{
"message": "Webhook subscription created successfully",
"data": {
"id": 1,
"hookUrl": "https://partner.example.com/officepro/webhooks",
"scopes": ["Patients", "Claims"],
"status": "active"
}
}
GET /v1/admin/webhooks/monitor
Admin monitoring endpoint for webhook health and delivery activity.
Requires X-Admin-Secret. Optional query params: practicepass, success, limit, offset.
Example Request
GET /v1/admin/webhooks/monitor?practicepass=DemoOffice&success=false&limit=50&offset=0
Example Response
{
"summary": {
"totalSubscriptions": 3,
"activeSubscriptions": 2,
"totalDeliveries": 150,
"failedDeliveries": 4,
"successRate": 97.33
},
"dispatchStates": [
{ "practicepass": "DemoOffice", "lastLogId": 14656636 }
],
"recentDeliveries": [ ... ]
}
Tickets
Requires Tickets scope. These endpoints are tenant-specific.
GET /v1/{PPass}/tickets
List all tickets for the practice.
GET /v1/{PPass}/ticket/{id}
Get specific ticket details including comments.
PUT /v1/{PPass}/ticket/{id}
Update ticket status or other details.
POST /v1/{PPass}/tickets/{id}/comment
Add a comment to a ticket.
{
"Comment": "This is a new comment",
"Author": "Support Agent"
}
POST /v1/admin/webhooks/retry/{id}
Admin endpoint to retry a specific webhook delivery record.
Requires X-Admin-Secret.
Example Request
POST /v1/admin/webhooks/retry/10
Example Response
{
"message": "Webhook delivery retried successfully",
"data": {
"sourceDeliveryId": 10,
"retryDeliveryId": 11,
"success": true,
"statusCode": 200,
"attempts": 1,
"errorMessage": null
}
}
My Information
Read and update your own partner information. Global endpoint.
GET /v1/me
Get your partner profile details.
PATCH /v1/me
Update your partner profile.
Dashboard Overview
Multi-Tenant EnabledTotal Calls
0
Success Rate
0%
Avg Duration
0ms
Error Count
0
API Usage (Last 7 Days)
Partners
- Loading partners...
API Keys
| Name | Partner | PPass | Scopes | Last Used | Status |
|---|---|---|---|---|---|
| Loading keys... | |||||
API Access Requests
| Time | Company | Practice | Contact | Requested Scopes | Status | Action |
|---|---|---|---|---|---|---|
| Loading requests... | ||||||
Recent Activity
| Time | Method | Endpoint | Status | Duration | Partner | IP |
|---|---|---|---|---|---|---|
| Loading logs... | ||||||