{"activeVersionTag":"latest","latestAvailableVersionTag":"latest","collection":{"info":{"_postman_id":"d717ad75-d293-4d28-bcd4-a61dd0513c2b","name":"Current RMS","description":"The Current RMS API allows you read/write access to your system.\n\n### Beta Release\n\nThe Current RMS API is currently being made available as a supported beta release. You are encouraged to use the API and will receive support when doing so, however, while the the API remains in beta status it may change without notice as a result of product updates. The temporary beta status of the API will remain in place while it matures. In a future release, the beta status will be removed, at which point changes to existing APIs will be limited and documented.\n\n### API Endpoint\n\nThe Current RMS API endpoint is at: -\n\n```\nhttps://api.current-rms.com/api/v1\n```\n\n### Authentication\n\nYou can authenticate to the Current RMS using either OAuth2 or API keys. API keys are deemed less secure so you should consider OAuth2 whenever possible.\n\n#### OAuth2\n\nTo use OAuth2 authentication you will first need to create a Custom Application to generate a Client ID and Secret. You can manage your Custom OAuth2 Applications from within the API Integration setup (System Setup > Integrations > API).\n\nWe use the \"Authorization Code\" grant flow in OAuth2, this follows the process: -\n\n1. Request authorization (requires user interaction)\n\n2. Receive authorization\n\n3. Use authorization to obtain refresh and access tokens\n\n4. Use the access token for all API requests until it expires\n\n5. Use the refresh token to obtain new refresh and access tokens\n\n6. Repeat steps #4 and #5\n\n__OAuth2 URLs__\n\n```\nhttps://[subdomain].current-rms.com/oauth2/authorize\nhttps://[subdomain].current-rms.com/oauth2/token\n```\n\nAt present access tokens survive for 2 hours after being issued, after which time you will need to request a new one using your refresh token before making further API requests.\n\nDeleting the Custom Application entry in Current-RMS will immediately revoke any issued refresh & access tokens and block all further access.\n\nWhen sending requests to the Current-RMS API you will need to include your access token in the `Authorization` request header and you should always include your subdomain; this is the first part of the URL you use to access Current RMS. For example if your Current RMS URL is `abcproductions.current-rms.com` your subdomain would be `abcproductions`. The subdomain can be provided as part of the request parameters `subdomain=YOUR_SUBDOMAIN`, or within the request headers using the `X-SUBDOMAIN` attribute.\n\nIt is highly recommended that you use a well supported OAuth2 client library, there are many for Java, Ruby, C#, PHP, Javascript etc.\n\nSee https://oauth.net/2/ for further information regarding OAuth2 and the Authorization Code grant type.\n\n#### API Keys\n\nYou authenticate to the Current RMS API by providing one of your API keys in the request parameters `apikey=YOUR_API_KEY`, or within the request headers using the `X-AUTH-TOKEN` attribute. You can manage your API keys from within the API Integration setup (System Setup > Integrations > API). You can have multiple API keys active at one time, each key allows full read and write access to your system - revoke API keys that are no longer in use to ensure unauthorised access is not permitted. It is good security practice to recycle API keys periodically - use the 'Refresh' button next to each key to do this. All API requests must be made over HTTPS, any HTTP request will be automatically redirected.\n\nYou will also need to provide your Current RMS subdomain; this is the first part of the URL you use to access Current RMS. For example if your Current RMS URL is `abcproductions.current-rms.com` your subdomain would be `abcproductions`. The subdomain can be provided as part of the request parameters `subdomain=YOUR_SUBDOMAIN`, or within the request headers using the `X-SUBDOMAIN` attribute.\n\nYou can test your credentials using the command line utility 'curl', for example: -\n\n```\ncurl --header \"X-SUBDOMAIN:yoursubdomain\" --header \"X-AUTH-TOKEN:yourapikey\" \"https://api.current-rms.com/api/v1/members/1\"\n```\n\ncURL is installed by default on Mac OS and Linux, if you are using Windows you will need to install it from https://curl.haxx.se/download.html - select Win32 Generic or Win64 Generic according to your Windows version. You will also need to download the certificate bundle 'cacert.pem' from https://curl.haxx.se/docs/caextract.html, this file should be stored in the same folder as the `curl.exe` file.\n\nNote: When using cURL on the command line with search or sort parameters, you will need to encode the square brackets ([ and ]) to %5B and %5D respectively.\n\n### Rate Limits\n\nRequests to the API are rate limited, typically you will be limited to a maximum of 60 requests over any 60 second period. If you send through too many requests you will receive a 429 response code. The headers of this response will give information regarding the rate limit, including `X-RateLimit-Reset` that contains a time stamp of when the limit expires and you can retry your request.\n\nIt is not considered good practice to continuously send requests in a loop as this will make your solution perform poorly and run the risk of being rate limited.\n\n### Errors\n\nOur API methods can raise errors for many reasons, such as invalid parameters, authentication errors, or incompatible actions. When an error occurs a 4xx response code will be given and you should check for the presence of an `errors` object in the response. The `errors` object will give you further information on the exact nature of the error.\n\n### Return status codes\n\nCurrent RMS API uses the standard HTML status codes as follows: -\n\n**200 OK**\n\nStandard response for successful HTTP requests. The actual response will depend on the request method used. In a GET request, the response will contain an entity corresponding to the requested resource. In a POST request, the response will contain an entity describing or containing the result of the action.\n\n**204 No Content**\n\nThe server successfully processed the request, but is not returning any content.\n\n**400 Bad Request**\n\nYour request was badly formed - this is usually an error in your JSON formatting\n\n**401 Unauthorized**\n\nSpecifically used when authentication is required and has failed or has not been provided.\n\n**404 Not Found**\n\nYou requested a record that does not exist or used a URL that is not recognised.\n\n**422 Unprocessable Entity**\n\nThe request was well-formed but was unable to be followed due to semantic errors.\n\n### Date/Time values\n\n#### Times\n\nAll date/time values must be provided as UTC in the YYYY-MM-DDTHH:MM:SS.HHHZ format: -\n\n```\n2015-06-28T23:00:00.000Z\n```\n\n#### Dates\n\nDate values should be provided in the YYYY-MM-DD format: -\n\n```\n2015-06-28\n```\n\n### Decimal Values\n\nWhen providing numeric values with decimal places, the full stop character `.` must be used as the decimal separator and you should not include a thousands separator. For example: -\n\n````\n1234567.89\n````\n\n### Pagination\n\nRequests that return a lot of data, such as GET /members or GET /products are paginated. To get to the next page use the ?page parameter. To change the number of items per page, use the ?per_page parameter. Pages can have up to 100 items. Example:\n\nhttps://api.current-rms.com/products/?page=2&per_page=100\n\n### Item Counts\n\nIf you’re curious about the count of members or products you have in the system, you can look at the meta object for GET /members or GET /products. Within the `meta` object there are a number of attributes about the data collection you have requested, `total_row_count` contains the total number of respective items that are in the API.\n\n### Default scope\n\nThe index end points for Members, Products, Opportunities, Invoices, Projects and Quarantines will default to returning only active records. Records that are inactive/completed/posted/cancelled will not be returned by default. If you wish to return a complete listing of all records you should include the `filtermode` parameter with a value of `all`, e.g. `filtermode=all`. Please refer to the `filtermode` parameters in each end point for possible values.\n\n### Searching with the query engine\n\nThe primary method of searching via the Current API is by using what is known as predicates.\n\nPredicates are used within Current API search queries to determine what information to match. For instance, the `cont` predicate will check to see if an attribute contains a value using a wildcard query: -\n\n```\n/api/v1/members?q[name_cont]=Ryan\n```\n\nYou can also combine attributes for OR queries: -\n\n```\n/api/v1/members?q[name_or_description_cont]=Ryan\n```\n\nAnd also for AND queries: -\n\n```\n/api/v1/members?q[name_and_description_cont]=Ryan\n```\n\nPlease note: any attempt to use an attribute or predicate in a search query that does not exist or is invalid will silently fail.\n\n### Groupings\n\nYou can use groupings to build complex criteria, this is helpful where you need to query the same and/or multiple fields using AND / OR logic.\n\nThe syntax structure is as follows: -\n\n```\ngrouping\n  |_ modifier\n  |_ conditions\n      |_ attributes\n          |_ attribute name\n      |_ predicate\n      |_ values\n          |_ search value\n```\n\nFor example, this query will look for member records where the name contains either 'Bill' or 'Fred': -\n\n```\n/api/v1/members?q[g][0][m]=or&q[g][0][c][0][a][0][name]=name&q[g][0][c][0][p]=cont&q[g][0][c][0][v][0][value]=Bill&q[g][0][c][1][a][0][name]=name&q[g][0][c][1][p]=cont&q[g][0][c][1][v][0][value]=Fred\n```\n\nThis translates to: -\n\n```\ng[0]\n  |_ [m]=or\n  |_ c[0]\n      |_ a[0]\n          |_ [name]=name\n      |_ [p]=cont\n      |_ v[0]\n          |_ value=Bill\n  |_ c[1]\n      |_ a[0]\n          |_ [name]=name\n      |_ [p]=cont\n      |_ v[0]\n          |_ value=Fred\n```\n\nYou can add further groupings with different modifiers to build complex search criteria.\n\nA simpler version of this query can be constructed as follows: -\n\n```\n/api/v1/members?q[g][0][name_cont]=Bill&q[g][1][name_cont]=Fred&q[m]=or\n```\n\nHowever, this does not allow for multiple groups with different modifiers.\n\n#### eq (equals)\n\nThe eq predicate returns all records where a field is exactly equal to a given value: -\n\n```\n/api/v1/members?q[name_eq]=Ryan\n```\n\n**Opposite: not_eq**\n\n#### matches\n\nThe matches predicate returns all records where a field is like a given value: -\n\n```\n/api/v1/members?q[name_matches]=Ryan\n```\n\n**Opposite: does_not_match**\n\n*Note: If you want to do wildcard matching, you may be looking for the cont/not_cont predicates instead.*\n\n#### lt (less than)\n\nThe lt predicate returns all records where a field is less than a given value: -\n\n```\n/api/v1/members?q[rating_lt]=3\n```\n\n**Opposite: gt (greater than)**\n\n#### lteq (less than or equal to)\n\nThe lteq predicate returns all records where a field is less than or equal to a given value:\n\n```\n/api/v1/members?q[rating_lteq]=3\n```\n\n**Opposite: gteq (greater than or equal to)**\n\n#### in\n\nThe in predicate returns all records where a field is within a specified list: -\n\n```\n/api/v1/members?q[rating_in][]=2&q[rating_in][]=3&q[rating_in][]=4\n```\n\n**Opposite: not_in**\n\n#### cont\n\nThe cont predicate returns all records where a field contains a given value: -\n\n```\n/api/v1/members?q[name_cont]=Ryan\n```\n\n**Opposite: not_cont**\n\n#### cont_any (contains any)\n\nThe cont_any predicate returns all records where a field contains any of the given values: -\n\n```\n/api/v1/members?q[name_cont_any][]=Ryan&q[name_cont_any][]=Bill&q[name_cont_any][]=Fred\n```\n\n**Opposite: not_cont_any**\n\n#### cont_all (contains all)\n\nThe cont_all predicate returns all records where a field contains all of the given values: -\n\n```\n/api/v1/members?q[name_cont_all][]=Ryan&q[name_cont_all][]=Bill&q[name_cont_all][]=Fred\n```\n\n**Opposite: not_cont_all**\n\n#### start (starts with)\n\nThe start predicate returns all records where a field begins with a given value: -\n\n```\n/api/v1/members?q[name_start]=Ryan\n```\n\n**Opposite: not_start**\n\n#### end (ends with)\n\nThe end predicate returns all records where a field ends with a given value: -\n\n```\n/api/v1/members?q[name_end]=Ryan\n```\n\n**Opposite: not_end**\n\n#### true\n\nThe true predicate returns all records where a field is true. The '1' indicates that to Ransack that you indeed want to check the truthiness of this field. The other truthy values are 'true', 'TRUE', 't' or 'T'.\n\n```\n/api/v1/members?q[active_true]=1\n```\n\n**Opposite: not_true**\n\n#### false\n\nThe false predicate returns all records where a field is false: -\n\n```\n/api/v1/members?q[active_false]=1\n```\n\n**Opposite: not_false**\n\n*Note: the false predicate may be considered the opposite of the true predicate if the field does not contain null values. Otherwise, use not_false.*\n\n#### present\n\nThe present predicate returns all records where a field is present (not null and not a blank string): -\n\n```\n/api/v1/members?q[name_present]=1\n```\n\n**Opposite: blank**\n\n#### null\n\nThe null predicate returns all records where a field is null: -\n\n```\n/api/v1/members?q[name_null]=1\n```\n\n**Opposite: not_null**\n\n### Sorting\n\nThe query engine can also sort the results of your search, for example to sort by the 'name' attribute in ascending order: -\n\n```\n/api/v1/members?q[s][]=name+asc\n```\n\nOr, in descending order: -\n\n```\n/api/v1/members?q[s][]=name+desc\n```\n\nYou can also sort on multiple attributes, for example to sort by membership type, then by name: -\n\n```\n/api/v1/members?q[s][]=membership_type+asc&q[s][]=name+asc\n```","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","isPublicCollection":false,"owner":"4811107","collectionId":"d717ad75-d293-4d28-bcd4-a61dd0513c2b","publishedId":"SzS5wSad","public":true,"publicUrl":"https://documenter-api.postman.tech/view/4811107/SzS5wSad","privateUrl":"https://go.postman.co/documentation/4811107-d717ad75-d293-4d28-bcd4-a61dd0513c2b","customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"EF5B25"},"documentationLayout":"classic-double-column","version":"8.10.1","publishDate":"2020-03-19T09:56:15.000Z","activeVersionTag":"latest","documentationTheme":"light","metaTags":{},"logos":{}},"statusCode":200},"environments":[],"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/768118b36f06c94b0306958b980558e6915839447e859fe16906e29d683976f0","favicon":""},"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"}],"canonicalUrl":"https://documenter.gw.postman.com/view/metadata/SzS5wSad"}