{"activeVersionTag":"latest","latestAvailableVersionTag":"latest","collection":{"info":{"_postman_id":"0826454f-d5e1-4729-9020-b9dbdde3a2ed","name":"Emalify API Docs","description":"## **Usage Overview**\n\nHere are some information that should help you understand the basic usage of our RESTful API. \nIncluding info about authenticating users, making requests, responses, potential errors, rate limiting, pagination, query parameters and more. [Create an API Account](https://app.emalify.com/register) Verify your E-Mail and login.\n\n\n## **Headers**\n\nCertain API calls require you to send data in a particular format as part of the API call. \nBy default, all API calls expect input in `JSON` format, however you need to inform the server that you are sending a JSON-formatted payload.\nAnd to do that you must include the `Accept => application/json` HTTP header with every call.\n\n\n| Header        | Value Sample                        | When to send it                                                              |\n|---------------|-------------------------------------|------------------------------------------------------------------------------|\n| Accept        | `application/json`                  | MUST be sent with every endpoint.                                            |\n| Content-Type  | `application/json`                  | MUST be sent when passing Data.                                              |\n| Authorization | `Bearer {Access-Token-Here}`        | MUST be sent whenever the endpoint requires (Authenticated User).            |\n\n## **Rate limiting**\n\nAll REST API requests are throttled to prevent abuse and ensure stability. \nThe exact number of calls that your application can make per day varies based on the type of request you are making.\n\nThe rate limit window is `1` second per endpoint, with most individual calls allowing for `100` requests in each window.\n\n*In other words, each user is allowed to make `30` calls per endpoint every `1` minutes. (For each unique access token).*\n\nFor how many hits you can preform on an endpoint, you can always check the header:\n\n```\nX-RateLimit-Limit → 100\nX-RateLimit-Remaining → 99\n```\n\n## **Tokens**\n\nThe Access Token lives for `86400`. (equivalent to `24` hours).\n\n\n*You will need to fetch another access token when the token expires.*\n\n## **Pagination**\n\nBy default, all fetch requests return the first `30` items in the list. Check the **Query Parameters** for how to control the pagination.\n\n## **Limit:** \n\nThe `?limit=` parameter can be applied to define, how many record should be returned by the endpoint (see also `Pagination`!).\n\n**Usage:**\n\n```\nhttps://api.emalify.com/v1/endpoint?limit=100\n```\n\nThe above example returns 100 resources. \n\nThe `limit` and `page` query parameters can be combined in order to get the next 100 resources:\n\n```\nhttps://api.emalify.com/v1/endpoint?limit=100&page=2\n```\n\nYou can skip the pagination limit to get all the data, by adding `?limit=0`, this will only work if 'skip pagination' is enabled on the server.\n\n## **Responses**\n\nUnless otherwise specified, all of API endpoints will return the information that you request in the JSON data format.\n\n\n#### Standard Response Format\n\n```shell\n{\n  \"data\": {\n    \"object\": \"Role\",\n    \"id\": \"owpmaymq\",\n    \"name\": \"admin\",\n    \"description\": \"Administrator\",\n    \"display_name\": null,\n    \"permissions\": {\n      \"data\": [\n        {\n          \"object\": \"Permission\",\n          \"id\": \"wkxmdazl\",\n          \"name\": \"update-users\",\n          \"description\": \"Update a User.\",\n          \"display_name\": null\n        },\n        {\n          \"object\": \"Permission\",\n          \"id\": \"qrvzpjzb\",\n          \"name\": \"delete-users\",\n          \"description\": \"Delete a User.\",\n          \"display_name\": null\n        }\n      ]\n    }\n  }\n}\n```\n\n#### Header\n\nHeader Response:\n\n```\nContent-Type → application/json\nDate → Thu, 14 Nov 2018 22:33:55 GMT\nETag → \"9c83bf4cf0d09c34782572727281b85879dd4ff6\"\nServer → nginx\nTransfer-Encoding → chunked\nX-Powered-By → PHP/7.0.9\nX-RateLimit-Limit → 100\nX-RateLimit-Remaining → 99\n```\n\n## **Query Parameters**\n\nQuery parameters are optional, you can apply them to some endpoints whenever you need them.\n\n### Ordering\n\nThe `?orderBy=` parameter can be applied to any **`GET`** HTTP request responsible for ordering the listing of the records by a field.\n\n**Usage:**\n\n```\nhttps://api.emalify.com/v1/endpoint?orderBy=created_at\n```\n\n### Sorting\n\nThe `?sortedBy=` parameter is usually used with the `orderBy` parameter.\n\nBy default the `orderBy` sorts the data in **ascending** order, if you want the data sorted in **descending** order, you can add `&sortedBy=desc`.\n\n**Usage:**\n\n```\nhttps://api.emalify.com/v1/endpoint?orderBy=name&sortedBy=desc\n```\n\nOrder By Accepts:\n\n- `asc` for Ascending.\n- `desc` for Descending.\n\n### Searching\n\nThe `?search=` parameter can be applied to any **`GET`** HTTP request.\n\n**Usage:**\n\n#### Search any field:\n\n```\nhttps://api.emalify.com/v1/endpoint?search=keyword here\n```\n\n> Space should be replaced with `%20` (search=keyword%20here).\n\n#### Search any field for multiple keywords:\n\n```\napi.domain.dev/endpoint?search=first keyword;second keyword\n```\n\n#### Search in specific field:\n```\nhttps://api.emalify.com/v1/endpoint?search=field:keyword here\n```\n\n#### Search in specific fields for multiple keywords: \n```\nhttps://api.emalify.com/v1/endpoint?search=field1:first field keyword;field2:second field keyword\n```\n\n#### Define query condition:\n\n```\nhttps://api.emalify.com/v1/endpoint?search=field:keyword&searchFields=name:like\n```\n\nAvailable Conditions: \n\n- `like`: string like the field. (SQL query `%keyword%`).\n- `=`: string exact match.\n\n\n#### Define query condition for multiple fields:\n\n```\nhttps://api.emalify.com/v1/endpoint?search=field1:first keyword;field2:second keyword&searchFields=field1:like;field2:=;\n```\n\n### Filtering\n\nThe `?filter=` parameter can be applied to any HTTP request. And is used to control the response size, by defining what data you want back in the response.\n\n**Usage:**\n\nReturn only ID and Name from that Model, (everything else will be returned as `null`).\n\n```\nhttps://api.emalify.com/v1/endpoint?filter=id;status\n```\n\nExample Response, including only id and status:\n\n```json\n{\n  \"data\": [\n    {\n      \"id\": \"0one37vjk49rp5ym\",\n      \"status\": \"approved\",\n      \"products\": {\n        \"data\": [\n          {\n            \"id\": \"bmo7y84xpgeza06k\",\n            \"status\": \"pending\"\n          },\n          {\n            \"id\": \"o0wzxbg0q4k7jp9d\",\n            \"status\": \"fulfilled\"\n          }\n        ]\n      },\n      \"recipients\": {\n        \"data\": [\n          {\n            \"id\": \"r6lbekg8rv5ozyad\"\n          }\n        ]\n      },\n      \"store\": {\n        \"data\": {\n          \"id\": \"r6lbekg8rv5ozyad\"\n        }\n      }\n    }...\n```\n\n\n### Paginating\n\nThe `?page=` parameter can be applied to any **`GET`** HTTP request responsible for listing records (mainly for Paginated data).\n\n**Usage:**\n\n```\nhttps://api.emalify.com/v1/endpoint?page=200\n```\n\n*The pagination object is always returned in the **meta** when pagination is available on the endpoint.*\n\n```shell\n  \"data\": [...],\n  \"meta\": {\n    \"pagination\": {\n      \"total\": 2000,\n      \"count\": 30,\n      \"per_page\": 30,\n      \"current_page\": 22,\n      \"total_pages\": 1111,\n      \"links\": {\n        \"previous\": \"https://api.emalify.com/v1/endpoint?page=21\"\n      }\n    }\n  }\n```\n\n### Relationships\n\nThe `?include=` parameter can be used with any endpoint, only if it supports it. \n\nHow to use it: let's say there's a Driver object and Car object. And there's an endpoint `/cars` that returns all the cars objects. \nThe include allows getting the cars with their drivers `/cars?include=drivers`. \n\nHowever, for this parameter to work, the endpoint `/cars` should clearly define that it\naccepts `driver` as relationship (in the **Available Relationships** section).\n\n**Usage:**\n\n```\nhttps://api.emalify.com/v1/endpoint?include=relationship\n```\n\nEvery response contain an `include` in its `meta`  as follow:\n\n```\n   \"meta\":{\n      \"include\":[\n         \"relationship-1\",\n         \"relationship-2\",\n      ],\n```\n\n\n### Caching\n\nSome endpoints stores their response data in memory (caching) after querying them for the first time, to speed up the response time.\nThe `?skipCache=` parameter can be used to force skip loading the response data from the server cache and instead get a fresh data from the database upon the request.\n\n**Usage:**\n\n```\nhttps://api.emalify.com/v1/endpoint?skipCache=true\n```\n\n\n## **Errors** (Outdated)\n\n\nGeneral Errors:\n\n| Error Code | Message                                                                               | Reason                                              |\n|------------|---------------------------------------------------------------------------------------|-----------------------------------------------------|\n| 401        | Wrong number of segments.                                                             | Wrong Token.                                        |\n| 401        | Failed to authenticate because of bad credentials or an invalid authorization header. | Missing parts of the Token.                         |\n| 401        | Could not decode token: The token ... is an invalid JWS.                              | Missing Token.                                      |\n| 405        | Method Not Allowed.                                                                   | Wrong Endpoint URL.                                 |\n| 422        | Invalid Input.                                                                        | Validation Error.                                   |\n| 500        | Internal Server Error.                                                                | {Report this error as soon as you get it.}          |\n| 500        | This action is unauthorized.                                                          | Using wrong HTTP Verb. OR using unauthorized token. |","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","isPublicCollection":false,"owner":"6448600","collectionId":"0826454f-d5e1-4729-9020-b9dbdde3a2ed","publishedId":"S1TN8hBh","public":true,"publicUrl":"https://docs.emalify.com","privateUrl":"https://go.postman.co/documentation/6448600-0826454f-d5e1-4729-9020-b9dbdde3a2ed","customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"0665D0"},"documentationLayout":"classic-double-column","version":"8.10.1","publishDate":"2019-07-03T14:51:56.000Z","activeVersionTag":"latest","documentationTheme":"light","metaTags":{},"logos":{}},"statusCode":200},"environments":[{"name":"Emalify Api Prod","id":"30a84bd6-d419-47c7-b749-cd5673ed9a5a","owner":"6448600","values":[{"key":"baseUrl","value":"https://api.emalify.com/v1","enabled":true},{"key":"accessToken","value":"","enabled":true},{"key":"clientId","value":"","enabled":true},{"key":"projectId","value":"yourProjectId","enabled":true},{"key":"getAllResourcesTests","value":"() => {\n \n    pm.test(\"Request Content-Type has header as : Accept application/json\", function () {\n        pm.response.to.have.header(\"Content-Type\",\"application/json\");\n    });\n    \n    pm.test(\"Request must be GET,POST,PUT,PATCH or DELETE\", function () {\n        //  pm.request.method == 'GET' ? pm.response.to.be.ok : pm.response.to.be.notFound;\n          pm.expect(pm.request.method).to.be.oneOf([\"GET\",\"POST\",\"PUT\",\"PATCH\",\"DELETE\"]); \n        //   pm.expect(pm.request.method).to.be.equal(\"POST\")  \n        \n    });\n    \n    pm.test(\"Response must be valid and have a body\", function () {\n        pm.response.to.be.json;\n    });\n    \n    pm.test(\"Response time is less than 10000ms\", function () {\n        pm.expect(pm.response.responseTime).to.be.below(10000);\n    });\n    \n    pm.test(\"Response Content-Type is present and is json\", function () {\n        pm.response.to.have.header(\"Content-Type\",\"application/json\");\n    });\n    \n    pm.test(\"Status code is standard\", function () {\n          pm.expect(pm.response.code).to.be.oneOf([200,201,204,400,404]); \n    }); \n    \n   /* pm.test(\"Response data format is in json-api-standard\", () => {\n    var jsonData = pm.response.json()\n\n    //Check if all the keys exist\n    // pm.expect(jsonData).to.include.keys(\"data\",\"links\",\"meta\",\"included\")\n    pm.expect(jsonData).to.include.keys(\"data\",\"links\",\"meta\",\"included\")\n\n    // jsonData.data.forEach(function(element) {\n        //Check every object in data array for inclusion of the correct keys\n        // pm.expect(element).to.include.keys(\"type\",\"id\",\"attributes\",\"links\",\"relationships\")\n    // })\n\n    // Check the type are correct\n    // pm.expect(jsonData).to.be.an('object')\n    // pm.expect(jsonData.data).to.be.an('array')\n    jsonData.data.forEach(function(element) {\n        //Check every object in data array for the correct data type in the respective keys\n        element.type ? pm.expect(element.type).to.be.an('string') : \"\"\n        element.id ? pm.expect(element.id).to.be.an('string') : \"\"\n        element.attributes ? pm.expect(element.attributes).to.be.an('object') : \"\"\n        element.links ? pm.expect(element.links).to.be.an('object') : \"\"\n        element.relationships ? pm.expect(element.relationships).to.be.an('object') : \"\"\n    })\n    pm.expect(jsonData.links).to.be.an('object')\n    pm.expect(jsonData.meta).to.be.an('object')\n    pm.expect(jsonData.included).to.be.an('array')\n\n    })*/\n\n}","enabled":true}],"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/768118b36f06c94b0306958b980558e6915839447e859fe16906e29d683976f0","favicon":"https://emalify.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":"Emalify Api Prod","value":"6448600-30a84bd6-d419-47c7-b749-cd5673ed9a5a"}],"canonicalUrl":"https://docs.emalify.com/view/metadata/S1TN8hBh"}