{"activeVersionTag":"latest","latestAvailableVersionTag":"latest","collection":{"info":{"_postman_id":"5f46f56c-c559-40ad-9b94-e66bbc4f7168","name":"Meevo Public API","description":"Meevo Public APIs allow you to retrieve, post, update, and delete data in a Meevo location's environment.\n\n# What's New in the 2026 March Release\n\n## New Webhooks (MeevoEvents) now available\n- Client Communication Preferences Updated: Triggers when any of the client's contact information is updated.\n- Package Created: Triggers when a client purchases a package.\n- Package Updated: Triggers when a client package state is updated (for example, expires).\n- Package Used: Triggers when a package item is redeemed at the register.\n- Appointment Started (Checked In):  Triggers when an appointment status is updated to Checked In.\n- Appointment Completed (Checked Out): Triggers when an appointment status is updated to Checked Out.\n\n## Updated Webhooks (MeevoEvents) \n- The Appointment Created and Appointment Updated webhooks now return the servicing client's email and phone number, critical information for most integrations or \"Zaps.\" \n- The Client Deleted webhook now includes the client's email and phone number.\n- All Client webhooks now return source and date/time of the event, as well as Client IDs when appropriate.\n\n## \"Text Marketing\" field now included in Public API and DDS endpoints \n- The UseForTextMarketing field is now returned by all client Public API and DDS endpoints, and the UseForTextMarketing boolean now appears within the Phone Numbers array.\n- You are now able to view the status of and update the UseForTextMarketing checkbox on client profiles. \n\n## New \"Patch Client\" endpoint offers simplified way to update a client's communication preferences  \nThe new Patch Client endpoint provides a streamlined way to update a client’s communication preferences. You can now update communication preferences without submitting unnecessary client information, simplifying development and reducing integration overhead.\n\nPreviously, updating communication preferences required making a full Update call and including additional client profile data. This made the process more cumbersome and more complex to implement.\n\n## Bug Fixes\n- Bug 113778: \"Get a List of Available Add-Ons for a Service\" endpoint was not returning the correct number of required add-ons.\n- Bug 115931: Specific appointments could not be deleted via the \"Cancel an Appointment Book Service\" endpoint.\n\n# Getting Started\n## Public API Pricing Details\n\n$49 per month (includes Daily Data Stream solution)  \n$199 startup fee for Daily Data Stream starter files  \n1000 calls per location, per day  \n$.02 per overage call\n\n## Collection Details\n\nTo download the complete Meevo API Collection, click the **Run in Postman** button in the top-right corner of the page.\n\n# The Meevo Public API Test Bed\n\nThe Meevo Public API test bed is a working Meevo environment, complete with staged data, that you can use to become familiar with our endpoints. If you are developing an app, you should develop and test the app against this environment and its data. All credentials are provided in your \"Welcome Kit.\"\n\nYour Test Bed credentials will expire after 90 days if your app is not live in Production by then. Once your app is live in Production, you will be granted continued access to the Test Bed to allow for additional testing going forward.\n\n**Please note:** This environment is shared with other integrators and is not suitable for the entering of real data that may contain personally identifiable information.\n\nThe **Test Bed URL** is the base URL for API calls. See the Authentication section for details on authenticating to the test bed.\n\n> **Test Bed URL**: [https://d18devpub.meevodev.com](https://d18devpub.meevodev.com) \n  \n\n# Authentication\n\nAll API calls must be authenticated using a JSON Web Token (JWT). The JWT is a randomly-generated OAuth 2.0 token that should be passed as a Bearer Token in the header of all API calls.\n\nYou can obtain a JWT by passing in your unique **appId** and **appSecret**, which was provided to you in your \"Welcome\" package, to the access token endpoint. Make sure to include in the header **Accept: application/json**. Your JWT will appear in the response. Note these credentials are specific to an environment; your appId and appSecret for the test bed will not work in Production.\n\nBe sure to keep your app ID, app secret, and JWTs secure, as these are used to identify you and your actions in Meevo. The JWT is specific to your integration or app.\n\n## Requesting an Access Token\n\nTo request a JWT, **POST** to the Marketplace endpoint. Make sure to pass your **appId** and **appSecret** (as **client_id** and **client_secret**, respectively) in the body of the call and not as query parameters. Each time you make this call, you'll receive a new, updated token, and the validity counter will be reset.\n\nBelow is the Test Bed Marketplace URL for authenticating to the test bed. The Meevo Production Marketplace URL and updated credentials will be provided prior to going live with your integration or application.\n\n**Test Bed Authentication**\n\n> **POST** [https://d18devmarketplace.meevodev.com/oauth2/token](https://d18devmarketplace.meevodev.com/oauth2/token) \n  \n\n**Authentication Body**\n\n``` json\n\"client_id\":\"AppId\"\n\"client_secret\":\"AppSecret\"\n\n ```\n\n## Access Token Response\n\n``` json\n\"access_token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIm\",\n  \"token_type\": \"Bearer\",\n  \"expires_in\": 3600,\n       \"scope\": \"meevo:scope\"\n\n ```\n\n## JWT Validity Period\n\nThe JWT is valid for an hour from when the response is sent. When a token expires, you will need to make another call for another JWT. Calls sent with expired tokens will receive responses with a 401 Status (Token Exception).\n\nYou will not be notified by the system when a token expires, so take note of the time that you received the response, as well as the value of the **expires_in** field in the response, and prepare your code accordingly to renew expired JWTs.\n\n## Session Patching (Changing Locations)\n\nJWTs are location-specific. When you change locations within a tenant, the system will issue a new JWT specific to that new location. To prevent repeated authorization calls or session patch calls when switching between locations, MSI recommends caching each token you receive and ensuring that the cache expiration matches the expiration of the token.\n\n# Maintenance Windows\n\nMeevo maintenance runs every night from 12 midnight to 6 am. During this time there may be an interruption of service, but in most cases the system will just be slower than usual. Additional details can be found in the **Maintenance of Services** section of our [Terms of Service](https://www.millenniumsi.com/terms-of-service#maintenance).\n\nThe maintenance window start time is based on the time zone of your cluster (NA0, NA1, etc.):\n\nNA0: EST (Eastern Standard Time)  \nNA1: PST (Pacific Standard Time)  \nNA2: EST  \nCA0: EST  \nUK1: United Kingdom time\n\n# Overages and Rate Limiting\n\n**Overages**: Each location is allotted 1000 calls per day. Charges are incurred for each call beyond the initial 1000 per day. There is a maximum of 5000 calls permitted in a given day. Additional calls beyond the 5000 are rejected until the next day when the counter resets.\n\n**Rate Limiting**: The Meevo Public API rate limit is 60 calls per minute. For a higher call rate limit, contact your MSI representative for options and pricing. All Meevo API calls are subject to rate limits. MSI reserves the right to adjust the rate limit for a given endpoint to ensure a high quality service for all Meevo Public API users.\n\n## Best Practices to Avoid Rate Limiting\n\nIf you reach your rate limit, stop making calls for awhile. Continuing to make calls even after you've reached the rate limit will increase your call count and increase the time before calls will be successful again. Here are some tips on keeping your number of calls down:\n\n**Cache data that changes infrequently**: It's important to only make calls when data is needed. Relatively static data can be cached and referenced locally. If your system encounters a non-matching GUID for an item, _then_ you should make the appropriate call to retrieve the data in question. Make sure to cache that response as well.\n\nWe recommend caching Products, Product Categories, Services, Service Categories, Package and Membership definitions, Gift Card Types, Business Information, and location details. Employee profiles are usually cached as well, but this can vary by location.\n\n**Remove unnecessary API calls**: Optimize your code. Make sure each call is for relevant data you need immediately. Consider whether the data changes often enough to require a call as opposed to being cached.\n\n**Regulate your request rate**: Ideally your app would not have you regularly approaching or reaching your rate limit. If this is occurring, consider including a process in your code that regulates the rate of requests so that they are distributed more evenly over time (i.e. throttling/throttle controller).\n\n# Meevo Public API Endpoints\n\nThe collections below detail all Public API endpoints available in Meevo. Endpoints are grouped by Read (GET) and Write (PUT, UPDATE, DELETE).\n\nFor Pagination, each page displays the number of results (**ItemsPerPage**) starting on the defined **PageNumber**.","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","isPublicCollection":false,"owner":"12120297","team":738812,"collectionId":"5f46f56c-c559-40ad-9b94-e66bbc4f7168","publishedId":"2sBXcKBdPV","public":true,"publicUrl":"https://docs.meevoapi.com","privateUrl":"https://go.postman.co/documentation/12120297-5f46f56c-c559-40ad-9b94-e66bbc4f7168","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":"2026-03-03T19:14:11.000Z","activeVersionTag":"latest","documentationTheme":"light","metaTags":{"title":"","description":""},"logos":{"logoLight":null,"logoDark":null}},"statusCode":200},"environments":[{"name":"D18","id":"78c0b275-ccb6-425b-ab38-acf7a01b6e91","owner":"12120297","values":[{"key":"baseUrl","value":"https://d18devpub.meevodev.com/publicapi","enabled":true,"type":"default"},{"key":"MarketplaceUrl","value":"","enabled":true,"type":"any"},{"key":"access_token","value":"","enabled":true,"type":"any"},{"key":"clientId","value":"","enabled":true,"type":"any"},{"key":"startDate","value":"","enabled":true,"type":"any"},{"key":"endDate","value":"","enabled":true,"type":"any"},{"key":"marketplaceUrl","value":"","enabled":true,"type":"any"},{"key":"employeeId","value":"","enabled":true,"type":"any"},{"key":"serviceId","value":"","enabled":true,"type":"any"},{"key":"productCategoryId","value":"","enabled":true,"type":"any"},{"key":"productSubCategoryId","value":"","enabled":true,"type":"any"},{"key":"productId","value":"","enabled":true,"type":"any"}],"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/706067c1e5ec14d10542d0661fbc946278061096ecfe16fef11982d362d03b3c","favicon":"https://meevoapi.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":"D18","value":"12120297-78c0b275-ccb6-425b-ab38-acf7a01b6e91"}],"canonicalUrl":"https://docs.meevoapi.com/view/metadata/2sBXcKBdPV"}