{"activeVersionTag":"latest","latestAvailableVersionTag":"latest","collection":{"info":{"_postman_id":"2839bff1-4395-4298-86a8-ab8e5e6c8977","name":"Eye Cloud Pro API","description":"<img src=\"https://content.pstmn.io/c7b4b627-e7e4-4130-8400-4c9b30602884/ZWNwX2Z1bGwtY29sb3Itd2lkZS5wbmc=\">\n\n# Eye Cloud Pro API Documentation\n\n## Overview\n\nWelcome to the EyeCloud Pro API documentation. This guide outlines the common patterns, requirements, and features implemented across our API endpoints to help you integrate with our system efficiently.\n\n## Authentication and Authorization\n\nAll API requests require authentication using OAuth 2.0 with JWT tokens. Your access token must be included in the Authorization header using the Bearer scheme.\n\n```\nAuthorization: Bearer {your_access_token}\n\n ```\n\n### Permission Scopes\n\nEach endpoint requires specific OAuth scopes that determine which operations your token can perform. If your token lacks the required scope, you'll receive a 403 Forbidden response:\n\n``` json\n{\n  \"message\": \"Insufficient permissions. The scope 'read:patients' is required for this operation.\",\n  \"required_scope\": \"read:patients\",\n  \"available_scopes\": [\n    \"create:patients\",\n    \"read:stores\",\n    \"read:orders\",\n    \"create:orders\",\n    \"read:employees\",\n    \"read:pricebooks:lenses\",\n    \"read:pricebooks:frames\",\n    \"create:pricebooks:frames\",\n    \"read:pricebooks:contactlenses\",\n    \"read:appointments\",\n    \"read:pricebooks:proffees\",\n    \"read:pricebooks:merchandise\",\n    \"read:pricebooks:addons\",\n    \"read:pricebooks:misc\",\n    \"read:invoices\",\n    \"read:pricebooks:tierprices\",\n    \"read:configurations:pricetiers\",\n    \"create:configurations:pricetiers\",\n    \"update:configurations:pricetiers\",\n    \"update:pricebooks:frames\",\n    \"delete:configurations:pricetiers\"\n  ]\n}\n\n ```\n\n## Client Access Control\n\nAll endpoints (GET, POST, PATCH, DELETE) require a valid client_id in the URL path following the version number: `/v2/{client_id}/...`\n\nThis client_id represents the practice or organization you're accessing. Your access token determines which clients you can access:\n\n- Your token grants access to specific client IDs only\n    \n- The client_id must be an integer; if not properly formatted, you'll receive:\n    \n\n``` json\n{\n  \"status\": \"ERROR\",\n  \"message\": \"The client_id must be provided as an integer in the URL path. Example: /v2/123/resource/... instead of /v2/resource?client_id=123\",\n  \"error\": {\n    \"statusCode\": 400,\n    \"isOperational\": true\n  }\n}\n\n ```\n\n- Unauthorized client_id requests will return a 403 Forbidden error with an example response:\n    \n\n``` json\n{\n  \"status\": \"ERROR\",\n  \"message\": \"You are not authorized to access client_id 1234567890\",\n  \"error\": {\n    \"statusCode\": 403,\n    \"isOperational\": true\n  }\n}\n\n ```\n\nExample URL: `/v2/123/patients` (where 123 is the client_id)\n\n## Rate Limiting\n\nTo ensure optimal performance for all users, our API implements rate limiting:\n\n- Default limit: 100 requests per minute per API module\n    \n- Modules: Each major resource path (e.g., `/v2/{client_id}/patients`, `/v2/{client_id}/invoices`, `/v2/{client_id}/pricebooks`) has its own rate limit\n    \n- Rate limits are tracked by OAuth Client ID when authenticated, or by IP address for unauthenticated requests\n    \n- When exceeded, requests return a 429 Too Many Requests status code\n    \n\nFor high-volume integrations, custom rate limits can be configured. Please contact support for adjustments.\n\n## Common Request Parameters\n\n### GET Requests\n\n#### Sorting\n\nSort results by specifying the sort parameter:\n\n- Format: `sort=field1,field2,-field3`\n    \n- Multiple fields are separated by commas\n    \n- Prefix a field with - for descending order (default is ascending)\n    \n- Example: `sort=last_name,-create_date` sorts by last name ascending, then create date descending\n    \n\n#### Pagination\n\nAll list (GET) endpoints support pagination:\n\n- page (default: 1): The page number to retrieve (must be ≥ 1)\n    \n- page_size (default: 10): Number of records per page (must be between 5-250)\n    \n\nResponse includes pagination metadata:\n\n``` json\n{\n  \"data\": [...],\n  \"pagination\": {\n    \"page\": 1,\n    \"page_size\": 10,\n    \"total_pages\": 5,\n    \"total_count\": 48,\n    \"sort\": \"last_name,-create_date\"\n  }\n}\n\n ```\n\n### POST Requests\n\nFor creating and updating resources:\n\n- All POST endpoints validate data types and required fields\n    \n- When creating multiple resources in a bulk operation, the transaction is atomic — all records succeed or all fail\n    \n- When a validation error occurs, the response includes details about which record failed and why\n    \n\n## Error Handling\n\nOur API returns consistent error responses:\n\n- HTTP status codes indicate the error category (400, 403, 404, 429, 500)\n    \n- Response body includes message and sometimes details properties\n    \n- Validation errors include field-specific information\n    \n\nExample of a single validation error:\n\n``` json\n{\n  \"status\": \"ERROR\",\n  \"message\": \"\\\"email\\\" must be a valid email\",\n  \"error\": {\n    \"statusCode\": 400,\n    \"isOperational\": true\n  }\n}\n\n ```\n\nExample of multiple validation errors from a request:\n\n```\ncurl --location 'https://api-staging.eyecloudpro.com/v2/2/patients?email=gordon@eyecloudpro&phone=XXX&dob=2000-JAN-01&page=0&page_size=500&sort=invalid_sort_field' \\\n--header 'Accept: application/json' \\\n--header 'Authorization: {{vault:bearer-token}}'\n\n ```\n\nResponse:\n\n``` json\n{\n  \"status\": \"ERROR\",\n  \"message\": \"\\\"email\\\" must be a valid email,\\\"phone\\\" with value \\\"XXX\\\" fails to match the required pattern: /^\\\\d{10}$/,dob must be YYYY-MM-DD or YYYY-MM-DDTHH:mm:ss,\\\"page\\\" must be greater than or equal to 1,\\\"page_size\\\" must be less than or equal to 250,\\\"sort\\\" with value \\\"invalid_sort_field\\\" fails to match the required pattern: /^(-?(patient_id|name_first|name_last|email|dob|create_date)(,-?(patient_id|name_first|name_last|email|dob|create_date))*$)/\",\n  \"error\": {\n    \"statusCode\": 400,\n    \"isOperational\": true\n  }\n}\n\n ```\n\n## Need Help?\n\nFor additional assistance or to request modifications to rate limits or permissions, please [contact our support team](https://saas-saas-2612.my.site.com/EyeCloudPro/s/supportform).","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","isPublicCollection":false,"owner":"25152367","team":6530895,"collectionId":"2839bff1-4395-4298-86a8-ab8e5e6c8977","publishedId":"2sB2qWFiYg","public":true,"publicUrl":"https://api-docs.eyecloudpro.com","privateUrl":"https://go.postman.co/documentation/25152367-2839bff1-4395-4298-86a8-ab8e5e6c8977","customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"documentationLayout":"classic-double-column","customisation":{"metaTags":[{"name":"description","value":""},{"name":"title","value":""}],"appearance":{"default":"light","themes":[{"name":"dark","logo":null,"colors":{"top-bar":"212121","right-sidebar":"303030","highlight":"FF6C37"}},{"name":"light","logo":null,"colors":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"}}]}},"version":"8.10.1","publishDate":"2025-11-05T20:14:25.000Z","activeVersionTag":"latest","documentationTheme":"light","metaTags":{"title":"","description":""},"logos":{"logoLight":null,"logoDark":null}},"statusCode":200},"environments":[{"name":"Production","id":"851055c0-a3e1-4ee1-bfb0-f85a8c96958e","owner":"25152367","values":[{"key":"domain","value":"api.eyecloudpro.com","enabled":true,"type":"default"},{"key":"audience","value":"https://api.eyecloudpro.com","enabled":true,"type":"default"},{"key":"auth_server","value":"auth.eyecloudpro.com","enabled":true,"type":"default"},{"key":"access_token","value":"","enabled":true,"type":"any"},{"key":"created_appt_id","value":"","enabled":true,"type":"any"},{"key":"clientP","value":"","enabled":true,"type":"default"}],"published":true}],"user":{"authenticated":false,"permissions":{"publish":false}},"run":{"button":{"js":"https://run.pstmn.io/button.js","css":"https://run.pstmn.io/button.css"}},"web":"https://www.getpostman.com/","team":{"logo":"https://res.cloudinary.com/postman/image/upload/t_team_logo_pubdoc/v1/team/a194c94edfa56a71e9bfe40ae5c0adef06539d93b43128d0ae911dc5fef6ff8b","favicon":"https://eyecloudpro.com/favicon.ico"},"isEnvFetchError":false,"languages":"[{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"HttpClient\"},{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"RestSharp\"},{\"key\":\"curl\",\"label\":\"cURL\",\"variant\":\"cURL\"},{\"key\":\"dart\",\"label\":\"Dart\",\"variant\":\"http\"},{\"key\":\"go\",\"label\":\"Go\",\"variant\":\"Native\"},{\"key\":\"http\",\"label\":\"HTTP\",\"variant\":\"HTTP\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"OkHttp\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"Unirest\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"Fetch\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"jQuery\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"XHR\"},{\"key\":\"c\",\"label\":\"C\",\"variant\":\"libcurl\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Axios\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Native\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Request\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Unirest\"},{\"key\":\"objective-c\",\"label\":\"Objective-C\",\"variant\":\"NSURLSession\"},{\"key\":\"ocaml\",\"label\":\"OCaml\",\"variant\":\"Cohttp\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"cURL\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"Guzzle\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"HTTP_Request2\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"pecl_http\"},{\"key\":\"powershell\",\"label\":\"PowerShell\",\"variant\":\"RestMethod\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"http.client\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"Requests\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"httr\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"RCurl\"},{\"key\":\"ruby\",\"label\":\"Ruby\",\"variant\":\"Net::HTTP\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"Httpie\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"wget\"},{\"key\":\"swift\",\"label\":\"Swift\",\"variant\":\"URLSession\"}]","languageSettings":[{"key":"csharp","label":"C#","variant":"HttpClient"},{"key":"csharp","label":"C#","variant":"RestSharp"},{"key":"curl","label":"cURL","variant":"cURL"},{"key":"dart","label":"Dart","variant":"http"},{"key":"go","label":"Go","variant":"Native"},{"key":"http","label":"HTTP","variant":"HTTP"},{"key":"java","label":"Java","variant":"OkHttp"},{"key":"java","label":"Java","variant":"Unirest"},{"key":"javascript","label":"JavaScript","variant":"Fetch"},{"key":"javascript","label":"JavaScript","variant":"jQuery"},{"key":"javascript","label":"JavaScript","variant":"XHR"},{"key":"c","label":"C","variant":"libcurl"},{"key":"nodejs","label":"NodeJs","variant":"Axios"},{"key":"nodejs","label":"NodeJs","variant":"Native"},{"key":"nodejs","label":"NodeJs","variant":"Request"},{"key":"nodejs","label":"NodeJs","variant":"Unirest"},{"key":"objective-c","label":"Objective-C","variant":"NSURLSession"},{"key":"ocaml","label":"OCaml","variant":"Cohttp"},{"key":"php","label":"PHP","variant":"cURL"},{"key":"php","label":"PHP","variant":"Guzzle"},{"key":"php","label":"PHP","variant":"HTTP_Request2"},{"key":"php","label":"PHP","variant":"pecl_http"},{"key":"powershell","label":"PowerShell","variant":"RestMethod"},{"key":"python","label":"Python","variant":"http.client"},{"key":"python","label":"Python","variant":"Requests"},{"key":"r","label":"R","variant":"httr"},{"key":"r","label":"R","variant":"RCurl"},{"key":"ruby","label":"Ruby","variant":"Net::HTTP"},{"key":"shell","label":"Shell","variant":"Httpie"},{"key":"shell","label":"Shell","variant":"wget"},{"key":"swift","label":"Swift","variant":"URLSession"}],"languageOptions":[{"label":"C# - HttpClient","value":"csharp - HttpClient - C#"},{"label":"C# - RestSharp","value":"csharp - RestSharp - C#"},{"label":"cURL - cURL","value":"curl - cURL - cURL"},{"label":"Dart - http","value":"dart - http - Dart"},{"label":"Go - Native","value":"go - Native - Go"},{"label":"HTTP - HTTP","value":"http - HTTP - HTTP"},{"label":"Java - OkHttp","value":"java - OkHttp - Java"},{"label":"Java - Unirest","value":"java - Unirest - Java"},{"label":"JavaScript - Fetch","value":"javascript - Fetch - JavaScript"},{"label":"JavaScript - jQuery","value":"javascript - jQuery - JavaScript"},{"label":"JavaScript - XHR","value":"javascript - XHR - JavaScript"},{"label":"C - libcurl","value":"c - libcurl - C"},{"label":"NodeJs - Axios","value":"nodejs - Axios - NodeJs"},{"label":"NodeJs - Native","value":"nodejs - Native - NodeJs"},{"label":"NodeJs - Request","value":"nodejs - Request - NodeJs"},{"label":"NodeJs - Unirest","value":"nodejs - Unirest - NodeJs"},{"label":"Objective-C - NSURLSession","value":"objective-c - NSURLSession - Objective-C"},{"label":"OCaml - Cohttp","value":"ocaml - Cohttp - OCaml"},{"label":"PHP - cURL","value":"php - cURL - PHP"},{"label":"PHP - Guzzle","value":"php - Guzzle - PHP"},{"label":"PHP - HTTP_Request2","value":"php - HTTP_Request2 - PHP"},{"label":"PHP - pecl_http","value":"php - pecl_http - PHP"},{"label":"PowerShell - RestMethod","value":"powershell - RestMethod - PowerShell"},{"label":"Python - http.client","value":"python - http.client - Python"},{"label":"Python - Requests","value":"python - Requests - Python"},{"label":"R - httr","value":"r - httr - R"},{"label":"R - RCurl","value":"r - RCurl - R"},{"label":"Ruby - Net::HTTP","value":"ruby - Net::HTTP - Ruby"},{"label":"Shell - Httpie","value":"shell - Httpie - Shell"},{"label":"Shell - wget","value":"shell - wget - Shell"},{"label":"Swift - URLSession","value":"swift - URLSession - Swift"}],"layoutOptions":[{"value":"classic-single-column","label":"Single Column"},{"value":"classic-double-column","label":"Double Column"}],"versionOptions":[],"environmentOptions":[{"value":"0","label":"No Environment"},{"label":"Production","value":"25152367-851055c0-a3e1-4ee1-bfb0-f85a8c96958e"}],"canonicalUrl":"https://api-docs.eyecloudpro.com/view/metadata/2sB2qWFiYg"}