{"info":{"_postman_id":"ff2cdced-2c35-4b2d-ab68-f890977c793e","name":"Localyser API Documentation","description":"<html><head></head><body><p>The Localyser API is designed for clients and partners to leverage the different functionality of our Online Reputation Management tool. </p>\n<p><strong>For Clients,</strong> you can pull all of your review data into your own CRM system or BI tool.</p>\n<p><strong>For Partners,</strong> you can deliver different review management functionality into your own dashboard.</p>\n<p><strong>Authentication:</strong> you will be provided with an API Key when an account is created for you.</p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"owner":"3481387","collectionId":"ff2cdced-2c35-4b2d-ab68-f890977c793e","publishedId":"SzzoavV2","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"EF5B25"},"publishDate":"2020-06-26T10:04:45.000Z"},"item":[{"name":"Partner API Documentation","item":[{"name":"company","item":[{"name":"POST company","id":"fca8fda9-cb26-4d13-a6ef-e4046ecfb34d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"companyName\": \"Acme Cafes\",\n  \"companyType\": \"Cafes\",\n  \"status\": \"Active\",\n  \"package\": \"Free trial\",\n  \"locationsLimit\": 5,\n  \"address1\": \"12 Main St.\",\n  \"address2\": \"Suite 4\",\n  \"city\": \"Dubai\",\n  \"state\": \"Dubai\",\n  \"country\": \"United Arab Emirates\",\n  \"zip\": \"12345\",\n  \"website\": \"https://acmecafes.com\"\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/company","description":"<p>Create a new company under the authenticated partner. Seeds the new client with a fresh access token, default sources for the chosen <code>companyType</code>, default review categories and response templates (based on the country-inferred response languages), and the feature set tied to the chosen <code>package</code>. When <code>package</code> is <code>Free trial</code>, also creates a 30-day trial period record. The whole creation runs in a single DB transaction.</p>\n<p>Fields:</p>\n<ul>\n<li><p><strong>companyName</strong> field is required, type 'string';</p>\n</li>\n<li><p><strong>companyType</strong> field is  required, type 'string', acceptable values are      \"Automotive\", \"Banks\", \"Cafes\", \"Business Services\", \"Education\", \"Electronics\", \"Fashion\", \"Fitness\", \"Healthcare\", \"Home Services\", \"Hotels\", \"Pharmacies\", \"Restaurants\", \"Spas\", \"Wellness\";</p>\n</li>\n<li><p><strong>status</strong> field is optional, type 'string', acceptable values are \"Active\" or \"Inactive\", default value is \"Active\";</p>\n</li>\n<li><p><strong>package</strong> field is optional, type 'string', acceptable values are \"Analyzer\", \"Lite\", \"Standard\", \"Premium\",\"Custom\",\"Free trial\", default value is \"Free trial\";</p>\n</li>\n<li><p><strong>locationsLimit</strong> field is optional, type 'integer';</p>\n</li>\n<li><p><strong>address1</strong> field is optional, type 'string';</p>\n</li>\n<li><p><strong>address2</strong> field is optional, type 'string';</p>\n</li>\n<li><p><strong>city</strong> field is optional, type 'string';</p>\n</li>\n<li><p><strong>state</strong> field is optional, type 'string';</p>\n</li>\n<li><p><strong>country</strong> field is optional, type 'string';</p>\n</li>\n<li><p><strong>zip</strong> field is optional, type 'int';</p>\n</li>\n<li><p><strong>website</strong> field is optional, type 'string', max length 255 characters;</p>\n</li>\n</ul>\n","urlObject":{"path":["v3","api","company"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"af70e4b9-fc17-4367-b3a7-651a3cdd112a","name":"Company created successfully. Returns the new client record.","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"companyName\": \"Acme Cafes\",\n  \"companyType\": \"Cafes\",\n  \"status\": \"Active\",\n  \"package\": \"Free trial\",\n  \"locationsLimit\": 5,\n  \"address1\": \"12 Main St.\",\n  \"address2\": \"Suite 4\",\n  \"city\": \"Dubai\",\n  \"state\": \"Dubai\",\n  \"country\": \"United Arab Emirates\",\n  \"zip\": \"12345\",\n  \"website\": \"https://acmecafes.com\"\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/company"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 1842,\n  \"createdAt\": 1748275200000,\n  \"updatedAt\": 1748275200000,\n  \"companyName\": \"Acme Cafes\",\n  \"companyType\": \"Cafes\",\n  \"website\": \"https://acmecafes.com\",\n  \"partner\": 7,\n  \"sources\": [\n    \"Google\",\n    \"Facebook\",\n    \"TripAdvisor\",\n    \"Zomato\"\n  ],\n  \"competitorsSources\": [\n    \"Google\",\n    \"Facebook\",\n    \"TripAdvisor\"\n  ],\n  \"sourcesCount\": 12,\n  \"accessToken\": \"a1b2c3d4e5f6g7h8\",\n  \"notificationTime\": \"18:00\",\n  \"parsingFromDate\": 1748275200000,\n  \"packageChangeDate\": \"2026-05-26\",\n  \"period\": \"2026-06-25\",\n  \"package\": \"Free trial\",\n  \"locationsLimit\": 5,\n  \"status\": \"Active\",\n  \"isParsingEnabled\": true,\n  \"address1\": \"12 Main St.\",\n  \"address2\": \"Suite 4\",\n  \"city\": \"Dubai\",\n  \"state\": \"Dubai\",\n  \"country\": \"United Arab Emirates\",\n  \"zip\": \"12345\",\n  \"isArchived\": false,\n  \"settings\": {\n    \"defaultLanguage\": \"ar\",\n    \"responseLanguages\": [\n      \"en\",\n      \"ar\"\n    ],\n    \"hasLocation\": false\n  },\n  \"features\": \"REVIEWS,RESPONSES,AUTORESPONSE\"\n}"},{"id":"fd58dd55-a444-4487-a2ca-dd09467df994","name":"Validation or processing error.","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"companyName\": \"Acme Cafes\",\n  \"companyType\": \"Cafes\",\n  \"status\": \"Active\",\n  \"package\": \"Free trial\",\n  \"locationsLimit\": 5,\n  \"address1\": \"12 Main St.\",\n  \"address2\": \"Suite 4\",\n  \"city\": \"Dubai\",\n  \"state\": \"Dubai\",\n  \"country\": \"United Arab Emirates\",\n  \"zip\": \"12345\",\n  \"website\": \"https://acmecafes.com\"\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/company"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Company name parameter missing\"\n}"},{"id":"e6fb397d-0f03-4b1e-9edf-ae3c9c33aaac","name":"Missing or invalid `Authorization` header, or partner is archived / not in `Active` status.","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"companyName\": \"Acme Cafes\",\n  \"companyType\": \"Cafes\",\n  \"status\": \"Active\",\n  \"package\": \"Free trial\",\n  \"locationsLimit\": 5,\n  \"address1\": \"12 Main St.\",\n  \"address2\": \"Suite 4\",\n  \"city\": \"Dubai\",\n  \"state\": \"Dubai\",\n  \"country\": \"United Arab Emirates\",\n  \"zip\": \"12345\",\n  \"website\": \"https://acmecafes.com\"\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/company"},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"fca8fda9-cb26-4d13-a6ef-e4046ecfb34d"},{"name":"PATCH company","id":"1ce81833-6cde-45c7-b7a2-d1abf1b7f194","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 1842,\n  \"companyName\": \"Acme Cafes\",\n  \"companyType\": \"Cafes\",\n  \"sources\": [\n    \"Google\",\n    \"Facebook\",\n    \"TripAdvisor\",\n    \"Zomato\"\n  ],\n  \"status\": \"Active\",\n  \"package\": \"Premium\",\n  \"locationsLimit\": 25,\n  \"address1\": \"12 Main St.\",\n  \"address2\": \"Suite 4\",\n  \"city\": \"Abu Dhabi\",\n  \"state\": \"Abu Dhabi\",\n  \"country\": \"United Arab Emirates\",\n  \"zip\": \"12345\",\n  \"website\": \"https://acmecafes.com\",\n  \"isArchived\": false\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/company","description":"<p>Update an existing company that belongs to the authenticated partner. Any field except <code>id</code> is optional; omitted fields keep their current values. Validates that <code>companyName</code> is not already taken, that <code>locationsLimit</code> is not lower than the company's in-use locations, and that <code>country</code> is in the supported country list.</p>\n<p>Fields:</p>\n<ul>\n<li><p><strong>id</strong> field is required, type 'int';</p>\n</li>\n<li><p><strong>companyName</strong> field is optional, type 'string';</p>\n</li>\n<li><p><strong>companyType</strong> field is  optional, type 'string', acceptable values are      \"Automotive\", \"Banks\", \"Cafes\", \"Business Services\", \"Education\", \"Electronics\", \"Fashion\", \"Fitness\", \"Healthcare\", \"Home Services\", \"Hotels\", \"Pharmacies\", \"Restaurants\", \"Spas\", \"Wellness\";</p>\n</li>\n<li><p><strong>sources</strong> field is optional, type 'array', array of sources names;</p>\n</li>\n<li><p><strong>status</strong> field is optional, type 'string', acceptable values are \"Active\" or \"Inactive\", default value is \"Active\";</p>\n</li>\n<li><p><strong>package</strong> field is optional, type 'string', acceptable values are \"Analyzer\", \"Lite\", \"Standard\", \"Premium\",\"Custom\",\"Free trial\", default value is \"Free trial\";</p>\n</li>\n<li><p><strong>locationsLimit</strong> field is optional, type 'integer';</p>\n</li>\n<li><p><strong>address1</strong> field is optional, type 'string';</p>\n</li>\n<li><p><strong>address2</strong> field is optional, type 'string';</p>\n</li>\n<li><p><strong>city</strong> field is optional, type 'string';</p>\n</li>\n<li><p><strong>state</strong> field is optional, type 'string';</p>\n</li>\n<li><p><strong>country</strong> field is optional, type 'string';</p>\n</li>\n<li><p><strong>zip</strong> field is optional, type 'int';</p>\n</li>\n<li><p><strong>website</strong> field is optional, type 'string', max length 255 characters;</p>\n</li>\n<li><p><strong>isArchived</strong> field is optional, type 'boolean';</p>\n</li>\n</ul>\n","urlObject":{"path":["v3","api","company"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"0c4d9d7a-a197-4940-9cc8-36970ad8e6a5","name":"Company updated successfully. Returns the updated client record.","originalRequest":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 1842,\n  \"companyName\": \"Acme Cafes\",\n  \"companyType\": \"Cafes\",\n  \"sources\": [\n    \"Google\",\n    \"Facebook\",\n    \"TripAdvisor\",\n    \"Zomato\"\n  ],\n  \"status\": \"Active\",\n  \"package\": \"Premium\",\n  \"locationsLimit\": 25,\n  \"address1\": \"12 Main St.\",\n  \"address2\": \"Suite 4\",\n  \"city\": \"Abu Dhabi\",\n  \"state\": \"Abu Dhabi\",\n  \"country\": \"United Arab Emirates\",\n  \"zip\": \"12345\",\n  \"website\": \"https://acmecafes.com\",\n  \"isArchived\": false\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/company"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 1842,\n  \"companyName\": \"Acme Cafes\",\n  \"companyType\": \"Cafes\",\n  \"website\": \"https://acmecafes.com\",\n  \"partner\": 7,\n  \"status\": \"Active\",\n  \"package\": \"Premium\",\n  \"locationsLimit\": 25,\n  \"sources\": [\n    \"Google\",\n    \"Facebook\",\n    \"TripAdvisor\",\n    \"Zomato\"\n  ],\n  \"competitorsSources\": [\n    \"Google\",\n    \"Facebook\",\n    \"TripAdvisor\"\n  ],\n  \"address1\": \"12 Main St.\",\n  \"address2\": \"Suite 4\",\n  \"city\": \"Abu Dhabi\",\n  \"state\": \"Abu Dhabi\",\n  \"country\": \"United Arab Emirates\",\n  \"zip\": \"12345\",\n  \"isArchived\": false,\n  \"settings\": {\n    \"defaultLanguage\": \"ar\",\n    \"responseLanguages\": [\n      \"en\",\n      \"ar\"\n    ],\n    \"hasLocation\": false\n  }\n}"},{"id":"b1bcb9c9-83a3-4d7b-af92-9656894777a6","name":"Validation or processing error.","originalRequest":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 1842,\n  \"companyName\": \"Acme Cafes\",\n  \"companyType\": \"Cafes\",\n  \"sources\": [\n    \"Google\",\n    \"Facebook\",\n    \"TripAdvisor\",\n    \"Zomato\"\n  ],\n  \"status\": \"Active\",\n  \"package\": \"Premium\",\n  \"locationsLimit\": 25,\n  \"address1\": \"12 Main St.\",\n  \"address2\": \"Suite 4\",\n  \"city\": \"Abu Dhabi\",\n  \"state\": \"Abu Dhabi\",\n  \"country\": \"United Arab Emirates\",\n  \"zip\": \"12345\",\n  \"website\": \"https://acmecafes.com\",\n  \"isArchived\": false\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/company"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Id parameter missing\"\n}"},{"id":"d65329e8-b916-4665-a1ec-e62e3b3c2e91","name":"Missing or invalid `Authorization` header, or partner is archived / not in `Active` status.","originalRequest":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 1842,\n  \"companyName\": \"Acme Cafes\",\n  \"companyType\": \"Cafes\",\n  \"sources\": [\n    \"Google\",\n    \"Facebook\",\n    \"TripAdvisor\",\n    \"Zomato\"\n  ],\n  \"status\": \"Active\",\n  \"package\": \"Premium\",\n  \"locationsLimit\": 25,\n  \"address1\": \"12 Main St.\",\n  \"address2\": \"Suite 4\",\n  \"city\": \"Abu Dhabi\",\n  \"state\": \"Abu Dhabi\",\n  \"country\": \"United Arab Emirates\",\n  \"zip\": \"12345\",\n  \"website\": \"https://acmecafes.com\",\n  \"isArchived\": false\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/company"},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"1ce81833-6cde-45c7-b7a2-d1abf1b7f194"},{"name":"DELETE company","id":"df163075-a3e0-4d11-9dd9-61450f500c4a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 1842\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/company","description":"<p>Archive an existing company (soft delete) by setting <code>isArchived = true</code>.\nThe company must currently be non-archived and must belong to the\nauthenticated partner. Returns the updated client record(s).</p>\n<p>Fields:</p>\n<ul>\n<li><strong>id</strong> field is required, type 'int';</li>\n</ul>\n<p>Id parameter can be added either to request body or request url.</p>\n","urlObject":{"path":["v3","api","company"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"6d74d0a6-0971-4526-be50-8d68a1166896","name":"Company archived successfully. Returns the updated client record(s).","originalRequest":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 1842\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/company"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"id\": 1842,\n    \"companyName\": \"Acme Cafes\",\n    \"companyType\": \"Cafes\",\n    \"partner\": 7,\n    \"isArchived\": true,\n    \"updatedAt\": 1748275200000\n  }\n]"},{"id":"f158956a-1d4e-473d-a3d3-3a7f42bb083d","name":"Validation or processing error.","originalRequest":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 1842\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/company"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Id parameter missing\"\n}"},{"id":"950a042f-8b09-4651-a7b2-ba1ccf36950b","name":"Missing or invalid `Authorization` header, or partner is archived / not in `Active` status.","originalRequest":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 1842\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/company"},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"df163075-a3e0-4d11-9dd9-61450f500c4a"},{"name":"GET companies","id":"94d06627-09ac-44a4-91cc-41a8763ddc54","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/v3/api/company","description":"<p>List every non-archived company belonging to the authenticated partner.\nEach entry is enriched with the company's brands and the regions\n(\"states\") under each brand. Throws a 400 with <code>\"No companies found\"</code>\nif the partner has no companies.</p>\n<p>Params:</p>\n<ul>\n<li><strong>search</strong> parameter is optional</li>\n</ul>\n","urlObject":{"path":["v3","api","company"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"0b538512-f332-4a6e-b37a-f112d3a04c17","name":"List of companies belonging to the partner.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/v3/api/company"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"id\": 150,\n    \"createdAt\": 1704067200000,\n    \"updatedAt\": 1704153600000,\n    \"companyName\": \"Gourmet Delights Restaurant Group\",\n    \"email\": \"admin@gourmetdelights.com\",\n    \"notificationTime\": \"18:00\",\n    \"accessToken\": \"a1b2c3d4e5f67890\",\n    \"status\": \"Active\",\n    \"period\": \"2026-02-15\",\n    \"companyType\": \"Restaurants\",\n    \"website\": \"https://gourmetdelights.com\",\n    \"address1\": \"123 Business Bay Tower\",\n    \"address2\": \"Suite 450\",\n    \"city\": \"Dubai\",\n    \"state\": \"Dubai\",\n    \"country\": \"United Arab Emirates\",\n    \"timeZone\": \"Asia/Dubai\",\n    \"zip\": \"12345\",\n    \"sourcesCount\": 9,\n    \"sources\": [\n      \"Google\",\n      \"Facebook\",\n      \"Foursquare\",\n      \"Zomato\",\n      \"TripAdvisor\",\n      \"Talabat\",\n      \"HungerStation\",\n      \"ReserveOut\",\n      \"Deliveroo\"\n    ],\n    \"competitorsSources\": [\n      \"Google\",\n      \"Facebook\",\n      \"TripAdvisor\"\n    ],\n    \"isArchived\": false,\n    \"parsingFromDate\": 1704067200000,\n    \"locationsLimit\": 50,\n    \"packageChangeDate\": \"2026-01-01\",\n    \"isParsingEnabled\": true,\n    \"package\": \"Premium\",\n    \"settings\": {\n      \"hasLocation\": true,\n      \"defaultLanguage\": \"en\",\n      \"responseLanguages\": [\n        \"en\",\n        \"ar\"\n      ]\n    },\n    \"partner\": 5,\n    \"brands\": [\n      {\n        \"id\": 301,\n        \"title\": \"Gourmet Kitchen\",\n        \"isDefault\": false,\n        \"photoUrl\": \"https://cdn.localyser.com/brands/gourmet-kitchen.png\",\n        \"locationsCount\": 12,\n        \"states\": [\n          {\n            \"id\": 501,\n            \"title\": \"Dubai\",\n            \"isDefault\": false\n          },\n          {\n            \"id\": 502,\n            \"title\": \"Abu Dhabi\",\n            \"isDefault\": false\n          }\n        ]\n      },\n      {\n        \"id\": 303,\n        \"title\": \"Other\",\n        \"isDefault\": true,\n        \"photoUrl\": null,\n        \"locationsCount\": 2,\n        \"states\": [\n          {\n            \"id\": 506,\n            \"title\": \"Other\",\n            \"isDefault\": true\n          }\n        ]\n      }\n    ]\n  }\n]"},{"id":"4cf34f0a-f806-42f2-b11c-362b3a78e489","name":"Processing error or no companies found.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/v3/api/company"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"No companies found\"\n}"},{"id":"5d3d4411-fc2b-4737-9ef8-00d66b55fe70","name":"Missing or invalid `Authorization` header, or partner is archived / not in `Active` status.","originalRequest":{"method":"GET","header":[],"url":"{{baseUrl}}/v3/api/company"},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"94d06627-09ac-44a4-91cc-41a8763ddc54"},{"name":"request to Localyser owner create company and admin user","id":"79d54814-8b3d-44d0-bd43-9a0b0fdfdcd6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"companyName\": \"Acme Cafes\",\n  \"package\": \"Standard\",\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"locationsLimit\": 5,\n  \"email\": \"jane@acme.com\",\n  \"mobile\": \"+971501234567\",\n  \"website\": \"https://acmecafes.com\"\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/company/byOwner","description":"<p>Create a company and its first admin user in one call. The company is provisioned as <code>Cafes</code>, <code>Inactive</code>, with English-only defaults; the admin user is created with <code>Master Admin</code> role and <code>isTotalGrant</code> and receives an invitation email. An internal \"Create company request\" notification email is also sent to the Localyser team.</p>\n<p>Fields:</p>\n<ul>\n<li><strong>companyName</strong> field is required, type 'string', value limit to 100 characters;</li>\n<li><strong>package</strong> field is required, type 'string', acceptable values are \"Analyzer\", \"Lite\", \"Standard\", \"Premium\",\"Custom\",\"Free trial\", default value is \"Free trial\";</li>\n<li><strong>firstName</strong> field is required, type 'string', value limit to 100 characters;</li>\n<li><strong>lastName</strong> field is required, type 'string', value limit to 100 characters;</li>\n<li><strong>locationsLimit</strong> field is required, type 'integer';</li>\n<li><strong>email</strong> field is required, type 'string';</li>\n<li><strong>mobile</strong> field is required, type 'string';</li>\n<li><strong>website</strong> field is optional, type 'string', max length 255 characters;</li>\n</ul>\n<p>The system validates the company user email, check the value uniqueness.</p>\n","urlObject":{"path":["v3","api","company","byOwner"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"e166f839-275e-4665-be98-bd80c33c33b2","name":"Company and admin user created successfully.","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"companyName\": \"Acme Cafes\",\n  \"package\": \"Standard\",\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"locationsLimit\": 5,\n  \"email\": \"jane@acme.com\",\n  \"mobile\": \"+971501234567\",\n  \"website\": \"https://acmecafes.com\"\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/company/byOwner"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 1842,\n  \"companyName\": \"Acme Cafes\",\n  \"package\": \"Standard\"\n}"},{"id":"c65d921e-990f-489c-9a11-9102c610ce2e","name":"Validation error or user-email collision.","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"companyName\": \"Acme Cafes\",\n  \"package\": \"Standard\",\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"locationsLimit\": 5,\n  \"email\": \"jane@acme.com\",\n  \"mobile\": \"+971501234567\",\n  \"website\": \"https://acmecafes.com\"\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/company/byOwner"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Company name parameter missing\"\n}"},{"id":"b22caa83-f3c2-4611-88de-635e41c155ba","name":"Missing or invalid `Authorization` header, or partner is archived / not in `Active` status.","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"companyName\": \"Acme Cafes\",\n  \"package\": \"Standard\",\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"locationsLimit\": 5,\n  \"email\": \"jane@acme.com\",\n  \"mobile\": \"+971501234567\",\n  \"website\": \"https://acmecafes.com\"\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/company/byOwner"},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"79d54814-8b3d-44d0-bd43-9a0b0fdfdcd6"},{"name":"GET company by id","id":"97d2079c-fcba-4aca-85af-214565c4d75e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/v3/api/company/:id","description":"<p>Fetch one company that belongs to the authenticated partner, enriched\nwith the count of in-use locations, the company's users, and the\nper-brand list of regions (\"states\"). Returns 400 if the id is missing\nor does not belong to the partner.</p>\n","urlObject":{"path":["v3","api","company",":id"],"host":["{{baseUrl}}"],"query":[],"variable":[{"id":"bfcba13d-ff0a-4936-8a79-83e3f2695f00","type":"any","value":"1842","key":"id"}]}},"response":[{"id":"bf86cb97-7a85-4464-ac1e-989547ff9158","name":"Company found.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v3/api/company/:id","host":["{{baseUrl}}"],"path":["v3","api","company",":id"],"variable":[{"key":"id","value":"1842"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"},{"disabled":false,"description":{"content":"","type":"text/plain"},"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 1842,\n  \"companyName\": \"Acme Cafes\",\n  \"accessToken\": \"a1b2c3d4e5f6g7h8\",\n  \"status\": \"Active\",\n  \"companyType\": \"Cafes\",\n  \"website\": \"https://acmecafes.com\",\n  \"address1\": \"12 Main St.\",\n  \"address2\": \"Suite 4\",\n  \"city\": \"Dubai\",\n  \"state\": \"Dubai\",\n  \"country\": \"United Arab Emirates\",\n  \"timeZone\": \"Asia/Dubai\",\n  \"zip\": \"12345\",\n  \"sources\": [\n    \"Google\",\n    \"Facebook\",\n    \"TripAdvisor\"\n  ],\n  \"competitorsSources\": [\n    \"Google\",\n    \"Facebook\",\n    \"TripAdvisor\"\n  ],\n  \"isArchived\": false,\n  \"package\": \"Standard\",\n  \"locationsLimit\": 50,\n  \"locationsInUse\": 10,\n  \"createdAt\": 1748275200000,\n  \"updatedAt\": 1748275200000,\n  \"users\": [\n    {\n      \"id\": 5501,\n      \"firstName\": \"Jane\",\n      \"lastName\": \"Doe\",\n      \"email\": \"jane@acme.com\",\n      \"mobile\": \"+971501234567\",\n      \"role\": \"Master Admin\"\n    }\n  ],\n  \"brands\": [\n    {\n      \"id\": 901,\n      \"title\": \"Acme\",\n      \"isDefault\": true,\n      \"photoUrl\": \"https://cdn.localyser.com/brands/acme.png\",\n      \"locationsCount\": 3,\n      \"states\": [\n        {\n          \"id\": 11,\n          \"title\": \"Dubai\",\n          \"isDefault\": false\n        },\n        {\n          \"id\": 12,\n          \"title\": \"Abu Dhabi\",\n          \"isDefault\": false\n        }\n      ]\n    }\n  ]\n}"},{"id":"7d7d47c1-a7e7-4d00-80b9-b49c6a359f70","name":"Validation error or company not owned by this partner.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v3/api/company/:id","host":["{{baseUrl}}"],"path":["v3","api","company",":id"],"variable":[{"key":"id","value":"1842"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Id parameter missing\"\n}"},{"id":"1830f517-1a00-49ed-aa6d-a985af0cdd01","name":"Missing or invalid `Authorization` header, or partner is archived / not in `Active` status.","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v3/api/company/:id","host":["{{baseUrl}}"],"path":["v3","api","company",":id"],"variable":[{"key":"id","value":"1842"}]}},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"97d2079c-fcba-4aca-85af-214565c4d75e"}],"id":"f47c1513-b022-4c66-88bb-3aa7071ec510","_postman_id":"f47c1513-b022-4c66-88bb-3aa7071ec510","description":""}],"id":"7484a4c4-6591-4bf5-ae2c-a432ef36789f","description":"<h3 id=\"localyser-partner-api\">Localyser Partner API</h3>\n<p>The Partner API is used exclusively for managing partner companies.</p>\n<p>Use this API only for partner-level company management operations, including creating, updating, listing, retrieving, and archiving companies associated with a partner.</p>\n<p>For all other functionality, such as iframe token generation, reviews, brands, locations, users, states, insights, and other company-level endpoints, use the Company API.</p>\n<p>Summary:</p>\n<ul>\n<li><p>Partner API: company management for partners</p>\n</li>\n<li><p>Company API: all other operational endpoints</p>\n</li>\n</ul>\n<p>Use it to:</p>\n<ul>\n<li><p>Provision new clients</p>\n</li>\n<li><p>Update company configuration</p>\n</li>\n<li><p>Retrieve company structure (brands, states, users, locations in use)</p>\n</li>\n<li><p>Archive companies that are no longer active</p>\n</li>\n</ul>\n<p>All endpoints are available under the <code>/v3/api</code> prefix and are scoped to a single partner. Every request can only read and modify data belonging to the partner associated with the API key used for authentication.</p>\n<hr />\n<h2 id=\"authentication\">Authentication</h2>\n<p>Every request must include the partner API token in the <code>Authorization</code> header:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>Authorization: &lt;partner_api_token&gt;\n\n</code></pre><p>The token is issued through the Localyser admin panel and identifies the partner making the request.</p>\n<p>Requests will return <strong>403 Forbidden</strong> if:</p>\n<ul>\n<li><p>The token is missing</p>\n</li>\n<li><p>The token is malformed</p>\n</li>\n<li><p>The token is invalid or unrecognized</p>\n</li>\n<li><p>The partner account is archived</p>\n</li>\n<li><p>The partner account is not in <strong>Active</strong> status</p>\n</li>\n</ul>\n<blockquote>\n<p>&lt;p &gt;Treat API tokens like passwords. If a token is exposed, rotate it immediately.&lt;/p&gt; </p>\n</blockquote>\n<hr />\n<h2 id=\"what-you-can-do\">What You Can Do</h2>\n<p>The <code>/v3/api/company</code> endpoints cover the complete company lifecycle.</p>\n<h3 id=\"create-a-company\">Create a Company</h3>\n<h4 id=\"post-v3apicompany\"><code>POST /v3/api/company</code></h4>\n<p>Create a new company under the authenticated partner.</p>\n<p>Optional fields include:</p>\n<ul>\n<li><p>Package</p>\n</li>\n<li><p>Status</p>\n</li>\n<li><p>Address</p>\n</li>\n<li><p>Locations limit</p>\n</li>\n</ul>\n<hr />\n<h3 id=\"create-a-company-and-admin-user\">Create a Company and Admin User</h3>\n<h4 id=\"post-v3apicompanybyowner\"><code>POST /v3/api/company/byOwner</code></h4>\n<p>Create a company together with its first administrator.</p>\n<p>Features:</p>\n<ul>\n<li><p>Creates both the company and admin user in a single request</p>\n</li>\n<li><p>Automatically sends an invitation email to the new administrator</p>\n</li>\n</ul>\n<hr />\n<h3 id=\"update-a-company\">Update a Company</h3>\n<h4 id=\"patch-v3apicompany\"><code>PATCH /v3/api/company</code></h4>\n<p>Update company-level settings, including:</p>\n<ul>\n<li><p>Company name</p>\n</li>\n<li><p>Address</p>\n</li>\n<li><p>Package</p>\n</li>\n<li><p>Status</p>\n</li>\n<li><p>Locations limit</p>\n</li>\n<li><p>Website</p>\n</li>\n<li><p>Other company configuration settings</p>\n</li>\n</ul>\n<hr />\n<h3 id=\"archive-a-company\">Archive a Company</h3>\n<h4 id=\"delete-v3apicompany\"><code>DELETE /v3/api/company</code></h4>\n<p>Soft-deletes a company by setting:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{  \"isArchived\": true}\n\n</code></pre><p>The company is preserved in the database but no longer appears in active company listings.</p>\n<hr />\n<h3 id=\"list-companies\">List Companies</h3>\n<h4 id=\"get-v3apicompany\"><code>GET /v3/api/company</code></h4>\n<p>Returns all non-archived companies belonging to the authenticated partner.</p>\n<p>Each company is enriched with:</p>\n<ul>\n<li><p>Brand structure</p>\n</li>\n<li><p>State structure</p>\n</li>\n</ul>\n<hr />\n<h3 id=\"get-company-details\">Get Company Details</h3>\n<h4 id=\"get-v3apicompanyid\"><code>GET /v3/api/company/{id}</code></h4>\n<p>Returns detailed information for a single company, including:</p>\n<ul>\n<li><p>Admin users</p>\n</li>\n<li><p>Locations currently in use</p>\n</li>\n<li><p>Complete brand hierarchy</p>\n</li>\n<li><p>Complete state hierarchy</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"conventions\">Conventions</h2>\n<h3 id=\"transport\">Transport</h3>\n<p>All endpoints use:</p>\n<ul>\n<li><p>JSON request bodies</p>\n</li>\n<li><p>JSON responses</p>\n</li>\n</ul>\n<hr />\n<h3 id=\"status-codes\">Status Codes</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status Code</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200 OK</code></td>\n<td>Request completed successfully</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td>Validation or business-rule error</td>\n</tr>\n<tr>\n<td><code>403 Forbidden</code></td>\n<td>Authentication failure or inactive partner</td>\n</tr>\n</tbody>\n</table>\n</div><p>Example <code>400</code> response:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{  \"details\": \"Description of the validation failure\"}\n\n</code></pre><hr />\n<h3 id=\"field-validation\">Field Validation</h3>\n<p>Server-side validation includes:</p>\n<ul>\n<li><p>String length limits</p>\n</li>\n<li><p>Supported country values</p>\n</li>\n<li><p>Uniqueness constraints (e.g. <code>companyName</code>, <code>locationId</code>, etc.)</p>\n</li>\n</ul>\n<p>Refer to the endpoint documentation for complete validation rules.</p>\n<hr />\n<h3 id=\"idempotency\">Idempotency</h3>\n<p><code>PATCH</code> requests support partial updates.</p>\n<p>Any field omitted from the request body retains its existing value.</p>\n<hr />\n<h1 id=\"embeddable-reviews-view\">Embeddable Reviews View</h1>\n<h2 id=\"generate-iframe-token\">Generate Iframe Token</h2>\n<p>Must be called using the Partner API Key</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>POST /v3/api/iframe-token\n\n</code></pre><p>Creates a short-lived JWT that allows an iframe to display company reviews for a specific location.</p>\n<h3 id=\"characteristics\">Characteristics</h3>\n<ul>\n<li><p><strong>Valid for 24 hours</strong> — the generated JWT expires 24 hours after issuance.</p>\n</li>\n<li><p><strong>No additional authentication required</strong> — once the token is embedded in the iframe URL, the embedded page can access and display the authorized reviews without requiring the end user to log in or provide additional credentials.</p>\n</li>\n</ul>\n<h2 id=\"must-be-called-using-the-partner-api-key\">Must be called using the Partner API Key</h2>\n<p>Additional Documentation</p>\n<p>For complete request and response schemas, validation rules, error catalogs, and implementation examples, refer to the documentation for each endpoint.</p>\n","_postman_id":"7484a4c4-6591-4bf5-ae2c-a432ef36789f"},{"name":"White Label Solution","item":[{"name":"iframe-token","item":[{"name":"POST IframeToken","id":"7b7d1f72-8f27-4861-ae67-ad64d314cf8c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"api-token","value":"api_key_value"},{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"text/plain"}],"body":{"mode":"raw","raw":"{\n  \"locationId\": 12425\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/iframe-token?location_id=string","description":"<p>Generate a secure JWT token for iframe integration that allows external applications to embed Localyser reviews with limited, location-specific access.</p>\n<p><strong>Authentication:</strong> your partner api-key must be provided in the request headers (see the <code>api-token</code> header parameter below).</p>\n<p><strong>Token Validity:</strong></p>\n<ul>\n<li>Duration: 24 hours (86400 seconds)</li>\n<li>Refresh: Tokens cannot be refreshed - new token generation required</li>\n<li>Single Use: Each token is tied to a specific location and optionally a review</li>\n</ul>\n<p><strong>Token Payload:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{\n  \"locationId\": \"9650\",\n  \"clientId\": 570,\n  \"iat\": 1757512711,\n  \"exp\": 1757599111\n}\n\n</code></pre><p>FIelds:</p>\n<ul>\n<li>location_id field is required, type 'string';</li>\n</ul>\n","urlObject":{"path":["v3","api","iframe-token"],"host":["{{baseUrl}}"],"query":[{"description":{"content":"<p>Location identifier - must be a valid location ID that belongs to the authenticated client. This location will be the only one accessible through the generated token.</p>\n","type":"text/plain"},"key":"location_id","value":"string"}],"variable":[]}},"response":[{"id":"bbf6e2c8-1677-4e9e-a9a1-80eb3ab8f3ab","name":"OK","originalRequest":{"method":"POST","header":[{"key":"api-token","value":"api_key_value"},{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"text/plain"}],"body":{"mode":"raw","raw":"{\n  \"locationId\": 12425\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":{"raw":"{{baseUrl}}/v3/api/iframe-token?location_id=string","host":["{{baseUrl}}"],"path":["v3","api","iframe-token"],"query":[{"description":"Location identifier - must be a valid location ID that belongs to the authenticated client. This location will be the only one accessible through the generated token.","key":"location_id","value":"string"}]}},"status":"OK","code":200,"_postman_previewlanguage":"text","header":[{"key":"Content-Type","value":"text/plain"}],"cookie":[],"responseTime":null,"body":"{\r\n  \"authToken\": \"{{vault:json-web-token}}\",\r\n  \"expiresIn\": 86400,\r\n  \"locationId\": \"9650\",\r\n  \"clientId\": 570\r\n}"}],"_postman_id":"7b7d1f72-8f27-4861-ae67-ad64d314cf8c"},{"name":"GET IFrame Reviews","id":"8d2c39b5-2972-4467-a2ae-93f956a89ded","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{baseUrl}}/reviews?locations=location_id_value&view=[2,3]&auth_token=token_value","description":"<h2 id=\"custom-styling--theming---query-parameters\">Custom Styling &amp; Theming - Query Parameters</h2>\n<h3 id=\"overview\">Overview</h3>\n<p>The iframe integration supports extensive visual customization through URL query parameters, allowing you to seamlessly integrate Localyser reviews with your application's design.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n<th>Example Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>theme</td>\n<td>string</td>\n<td>Enables dark mode theme</td>\n<td>dark</td>\n</tr>\n<tr>\n<td>fnColor</td>\n<td>string</td>\n<td>Font/text color</td>\n<td>#ffffff</td>\n</tr>\n<tr>\n<td>bgColor</td>\n<td>string</td>\n<td>Background color</td>\n<td>#1a1a1a</td>\n</tr>\n<tr>\n<td>bgFnColor</td>\n<td>string</td>\n<td>Background font color</td>\n<td>#e0e0e0</td>\n</tr>\n<tr>\n<td>btnBgColor</td>\n<td>string</td>\n<td>Button background color</td>\n<td>#007bff</td>\n</tr>\n<tr>\n<td>btnFnColor</td>\n<td>string</td>\n<td>Button font color</td>\n<td>#ffffff</td>\n</tr>\n<tr>\n<td>btnBgColorHover</td>\n<td>string</td>\n<td>Button hover background color</td>\n<td>#0056b3</td>\n</tr>\n<tr>\n<td>company</td>\n<td>string</td>\n<td>Your company name on Localyser lower case</td>\n<td>wateen</td>\n</tr>\n<tr>\n<td>fontFamily</td>\n<td>string</td>\n<td>Custom font family</td>\n<td>Roboto</td>\n</tr>\n<tr>\n<td>primaryColor</td>\n<td>string</td>\n<td>Color which will be applied on elements hover, focus, select</td>\n<td>0056b3</td>\n</tr>\n<tr>\n<td>tableHeaderFnColor</td>\n<td>string</td>\n<td>Color which will be applied for font in all table headers</td>\n<td>0056b3</td>\n</tr>\n<tr>\n<td>tableHeaderBgColor</td>\n<td>string</td>\n<td>Color which will be applied for all table headers background</td>\n<td>0056b3</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>fontFamily</strong> — Use a URL-encoded value (e.g., font stacks with commas or spaces). To apply a non-default browser font, please contact support.</p>\n<p><strong>company</strong> — Only required if a custom loader needs to be applied across the application. Before enabling this, please contact support and provide your logo in <code>.gif</code> format.</p>\n<p>Usage Examples</p>\n<p>Basic Dark Mode:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>.../reviews?locations=location_value&amp;view=[2,3]&amp;auth_token=auth_token_value&amp;theme=dark\n\n</code></pre><p>Custom Brand Color:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>.../reviews?locations=location_value&amp;view=[2,3]&amp;auth_token=auth_token_value&amp;bgColor=f8f9fa&amp;fnColor=212529&amp;btnBgColor=007bff&amp;btnFnColor=ffffff\n\n</code></pre><h3 id=\"color-format\">Color Format</h3>\n<ul>\n<li><p>Format: Hex color codes WITH the # symbol</p>\n</li>\n<li><p>Example: Use #ffffff or ffffff (both supported)</p>\n</li>\n<li><p>URL Encoding: The # symbol should be URL-encoded as # in URLs</p>\n</li>\n<li><p>Auto-handling: The system handles both formats automatically</p>\n</li>\n</ul>\n<h3 id=\"dark-mode\">Dark Mode</h3>\n<ul>\n<li><p>Parameter: theme=dark</p>\n</li>\n<li><p>Description: Applies a predefined dark theme with dark backgrounds and light text</p>\n</li>\n<li><p>Combination: Can be combined with custom colors to override specific elements</p>\n</li>\n<li><p>Priority: Custom color parameters take precedence over dark theme defaults</p>\n</li>\n</ul>\n<h3 id=\"view-modes\">View Modes</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>View Mode</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>view=2</td>\n<td>Hides filters</td>\n</tr>\n<tr>\n<td>view=3</td>\n<td>With filter controls</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"complete-example\">Complete Example</h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>.../reviews?auth_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...&amp;view=3&amp;theme=dark&amp;bgColor=2d3748&amp;fnColor=e2e8f0&amp;btnBgColor=4299e1&amp;btnFnColor=ffffff&amp;btnBgColorHover=3182ce\n\n</code></pre><p>This example creates a dark-themed iframe with:</p>\n<ul>\n<li><p>Dark blue-gray background (#2d3748)</p>\n</li>\n<li><p>Light gray text (#e2e8f0)</p>\n</li>\n<li><p>Blue buttons (#4299e1) with white text</p>\n</li>\n<li><p>Darker blue button hover effect (#3182ce)</p>\n</li>\n<li><p>Hidden filters (view=3)</p>\n</li>\n</ul>\n<p>Example:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>.../reviews?locations=...&amp;view=3&amp;auth_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...&amp;btnBgColor=ff6b35&amp;btnFnColor=fff&amp;btnBgColorHover=ff5722&amp;bgColor=2C2C2C&amp;fnColor=f8fafc&amp;bgFnColor=cbd5e1\n\n</code></pre><p>**<br />Important note:** If you are using more than one page within an iframe during a single session, make sure to clear any query parameters that do not belong to the iframe before navigating to another page.</p>\n","urlObject":{"path":["reviews"],"host":["{{baseUrl}}"],"query":[{"key":"locations","value":"location_id_value"},{"key":"view","value":"[2,3]"},{"key":"auth_token","value":"token_value"}],"variable":[]}},"response":[],"_postman_id":"8d2c39b5-2972-4467-a2ae-93f956a89ded"},{"name":"GET third party login data","id":"5568f3bd-142e-48f2-8406-fe812dd5806a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{baseUrl}}/","description":"<p>The <strong>Third-Party Login</strong> page can be embedded into external applications via an <strong>iframe</strong>.<br />On that page you may add new Google connection or other accounts</p>\n<p>The page is hosted on Localyser and supports:</p>\n<ul>\n<li><p>authentication via token</p>\n</li>\n<li><p>UI customization through query parameters</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"iframe-url\">Iframe URL</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>https://app.localyser.com/settings/other/thirdPartyLogin\n\n</code></pre><hr />\n<h2 id=\"required-parameters\">Required Parameters</h2>\n<h3 id=\"🔐-auth_token-required\">🔐 <code>auth_token</code> (required)</h3>\n<p>Authentication token used to authorize the user inside the iframe.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>auth_token=&lt;JWT&gt;\n\n</code></pre><ul>\n<li>Must be a <strong>valid access token</strong></li>\n</ul>\n<p>Iframe embedding example</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>&lt;/div&gt;&lt;div&gt;width=\"500px\" height=\"500px\" \n&lt;br&gt;&lt;/div&gt;&lt;div&gt;src=\"https://app.localyser.com/settings/other/thirdPartyLogin?locations=11047&amp;view=2&amp;auth_token=YOUR_TOKEN&amp;theme=dark\" \n&lt;br&gt;&lt;/div&gt;&lt;div&gt;title=\"Thrid party login\"&gt;\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;/iframe&amp;gt;\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;  src: https://app.localyser.com/settings/other/thirdPartyLogin\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;  params:\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;    - auth_token=YOUR_TOKEN\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;    - locations=11047\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;    - view=2\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;    - theme=dark\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;  width: 500px\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;  height: 500px\n&lt;br&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p &gt;&lt;/p&gt;&lt;/x-turndown&gt;\n</code></pre>","urlObject":{"path":[""],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"5568f3bd-142e-48f2-8406-fe812dd5806a"},{"name":"Get Dashboard data","id":"c3d184b6-da56-4e99-8ac2-654f5ded0a15","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"description":"<p>The Dashboard page can be embedded into external applications via an <strong>iframe</strong>.<br />On that page you may see Reputation Score and Net Promoter Score sections.<br />Filters and PDF export is available is view Mode - 3 and hidden is viewMode - 2.</p>\n<p>The page is hosted on Localyser and supports:</p>\n<ul>\n<li><p>authentication via token</p>\n</li>\n<li><p>UI customization through query parameters</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"iframe-url\">Iframe URL</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>https://app.localyser.com/dashboard\n\n</code></pre><hr />\n<h2 id=\"required-parameters\">Required Parameters</h2>\n<h3 id=\"🔐-auth_token-required\">🔐 <code>auth_token</code> (required)</h3>\n<p>Authentication token used to authorize the user inside the iframe.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>auth_token=&lt;JWT&gt;\n\n</code></pre><ul>\n<li>Must be a <strong>valid access token</strong></li>\n</ul>\n<p>Iframe embedding example</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>&lt;/div&gt;&lt;div&gt;width=\"500px\" height=\"500px\" \n&lt;br&gt;&lt;/div&gt;&lt;div&gt;src=\"https://app.localyser.com/dashboard?locations=11047&amp;view=2&amp;auth_token=YOUR_TOKEN&amp;theme=dark\" \n&lt;br&gt;&lt;/div&gt;&lt;div&gt;title=\"Dashboard\"&gt;\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;/iframe&amp;gt;\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;  src: https://app.localyser.com/dashboard\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;  params:\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;    - auth_token=YOUR_TOKEN\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;    - locations=11047\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;    - view=2\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;    - theme=dark\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;  width: 500px\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;  height: 500px\n&lt;br&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p &gt;&lt;/p&gt;&lt;/x-turndown&gt;\n</code></pre>","urlObject":{"query":[],"variable":[]},"url":""},"response":[],"_postman_id":"c3d184b6-da56-4e99-8ac2-654f5ded0a15"},{"name":"Reporting Pages","id":"b756c6a1-ca04-4088-886a-a1cea094f82c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"","description":"<h3 id=\"reporting-pages-overview--insights\">Reporting Pages (Overview &amp; Insights):</h3>\n<p>These pages support additional query parameters for data filtering:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parameter</th>\n<th>Type</th>\n<th>Description</th>\n<th>Example</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>date_from</td>\n<td>string</td>\n<td>Start date (YYYY-MM-DD)</td>\n<td>2025-08-13</td>\n</tr>\n<tr>\n<td>date_to</td>\n<td>string</td>\n<td>End date (YYYY-MM-DD)</td>\n<td>2025-09-12</td>\n</tr>\n<tr>\n<td>categories</td>\n<td>string</td>\n<td>Comma-separated categories</td>\n<td>Food,Delivery,Service,Price,Atmosphere,Recommend</td>\n</tr>\n<tr>\n<td>locations</td>\n<td>string</td>\n<td>Comma-separated location IDs</td>\n<td>123,456,789</td>\n</tr>\n<tr>\n<td>source</td>\n<td>string</td>\n<td>Review source filter</td>\n<td>google,facebook,tripadvisor</td>\n</tr>\n</tbody>\n</table>\n</div><p>Example Insights with Custom Styling + Filtering:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>.../reporting/insights?auth_token=YOUR_TOKEN&amp;view=3&amp;date_from=2025-08-13&amp;date_to=2025-09-12&amp;categories=Food,Delivery,Service,Price,Atmosphere,Recommend&amp;locations=123,456&amp;source=google,facebook\n\n</code></pre><p>Example Overview with Multiple Filters:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>.../reporting/overview?auth_token=YOUR_TOKEN&amp;view=3&amp;date_from=2025-08-13&amp;date_to=2025-09-12&amp;categories=Food,Delivery,Service,Price,Atmosphere,Recommend&amp;locations=123,456&amp;source=google,facebook\n\n</code></pre><p>Embedding iframe example:<br />Report overview</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>&lt;/div&gt;&lt;div&gt;width=\"500px\" height=\"500px\" \n&lt;br&gt;&lt;/div&gt;&lt;div&gt;src=\"https://app.localyser.com/reporting/overview?locations=11047&amp;view=2&amp;auth_token=YOUR_TOKEN&amp;theme=dark\" \n&lt;br&gt;&lt;/div&gt;&lt;div&gt;title=\"Overview report\"&gt;\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;/iframe&amp;gt;\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;  src: https://app.localyser.com/reporting/insights\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;  params:\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;    - auth_token=YOUR_TOKEN\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;    - locations=11047\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;    - view=2\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;    - theme=dark\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;  width: 500px\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;  height: 500px\n&lt;br&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p &gt;Report insights&lt;/p&gt;&lt;pre class=plain&gt;&lt;code&gt;&lt;div&gt;&lt;iframe \n&lt;br&gt;&lt;/div&gt;&lt;div&gt;width=\"500px\" height=\"500px\" \n&lt;br&gt;&lt;/div&gt;&lt;div&gt;src=\"https://app.localyser.com/reporting/insights?locations=11047&amp;view=2&amp;auth_token=YOUR_TOKEN&amp;theme=dark\" \n&lt;br&gt;&lt;/div&gt;&lt;div&gt;title=\"Overview report\"&gt;\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;lt;/iframe&amp;gt;\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;  src: https://app.localyser.com/reporting/insights\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;  params:\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;    - auth_token=YOUR_TOKEN\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;    - locations=11047\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;    - view=2\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;    - theme=dark\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;  width: 500px\n&lt;br&gt;&lt;/div&gt;&lt;div&gt;  height: 500px\n&lt;br&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p &gt;&lt;/p&gt;&lt;/x-turndown&gt;\n</code></pre>","urlObject":{"query":[],"variable":[]}},"response":[],"_postman_id":"b756c6a1-ca04-4088-886a-a1cea094f82c"}],"id":"48035e96-141d-46d5-b22a-b31a9356015b","description":"<p>The <strong>Iframe</strong> module allows you to securely embed Localyser pages (such as Reviews, Dashboard, or Reporting pages) into your own website or application using an .</p>\n<p>Authentication is handled through a short-lived JWT token, so your users can access the embedded Localyser content without logging in separately.</p>\n<h2 id=\"how-it-works\">How it works</h2>\n<p>Embedding Localyser content requires only three steps:</p>\n<ol>\n<li><p>Get an IFrame token using your <strong>Company API Token</strong>.</p>\n</li>\n<li><p><strong>Include the returned token in the iframe URL</strong> and use that URL as the <code>src</code> attribute of your iframe.</p>\n</li>\n</ol>\n<p>The authentication token is valid for <strong>24 hours</strong>. For security reasons, your backend should request a new token whenever you generate an iframe URL for your users.</p>\n<h2 id=\"authentication\">Authentication</h2>\n<p>The endpoint that generates the iframe authentication token is protected.</p>\n<p>To call it, you must include a valid <strong>Company API Token</strong> in the request.</p>\n<p>Without a valid API token, the iframe authentication token cannot be generated and the embedded content will not be accessible.</p>\n<h2 id=\"embedding-the-iframe\">Embedding the iframe</h2>\n<p>After receiving the authentication token, construct the iframe URL by adding it as the <code>auth_token</code> query parameter.</p>\n<p>Example:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-preserveHtml\">https://app.localyser.com/reviews?view=2&amp;auth_token=YOUR_AUTH_TOKEN \n\n</code></pre>\n<p>Then use that URL as the <code>src</code> of your iframe.</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-html\">&lt;iframe\n  src=\"https://app.localyser.com/reviews?view=2&amp;auth_token=YOUR_AUTH_TOKEN\"\n  width=\"100%\"\n  height=\"600\"\n  frameborder=\"0\"\n  allowfullscreen&gt;\n&lt;/iframe&gt;\n\n</code></pre>\n","_postman_id":"48035e96-141d-46d5-b22a-b31a9356015b"}],"id":"ecb06e0e-5da0-47b6-8962-04170a585c40","description":"<h1 id=\"iframe-widget-setup\"><strong>iFrame Widget Setup</strong></h1>\n<p><strong>Localyser offers an iFrame Reviews Widget that allows you to embed review content on your dashboard or app. There are three types of iframe integrations available:</strong></p>\n<ol>\n<li><p><strong>View2 - Reviews Only: Displays a list of reviews.</strong></p>\n</li>\n<li><p><strong>View3 - Reviews Filtering: Displays reviews with filtering options.</strong></p>\n</li>\n<li><p><strong>View 2&amp;id - Single Review: Displays a specific review by its ID (see Webhook below).</strong></p>\n</li>\n</ol>\n<h3 id=\"reviews-only-view2\"><strong>Reviews Only View2:</strong></h3>\n<img src=\"https://content.pstmn.io/d3bfb5c7-b47e-4846-ad05-17e3dce4a57d/M2FjZGJlMzAtYzA4Yy00YTZlLWIwMDItNDYzOGU0YWRkODA2LnBuZw==\" />\n\n<p><strong>Reviews with Filter Pane View3:</strong></p>\n<img src=\"https://content.pstmn.io/fca396e9-29ef-4ab4-be30-c52a323523f7/Mi5wbmc=\" />\n\n<p><strong>Individual Review View2&amp;id:</strong></p>\n<img src=\"https://content.pstmn.io/6a451860-5e92-4adf-ac3c-b3f6c115c403/My5wbmc=\" />\n\n<h2 id=\"using-the-iframe\"><strong>Using the iFrame</strong></h2>\n<p><strong>To use the iframe, you will need to append specific View parameters to the primary /reviews URL:</strong> <a href=\"https://app.localyser.com/reviews\"><b>https://app.localyser.com/reviews</b></a><strong>.</strong></p>\n<p><strong>The following parameters are accepted:</strong></p>\n<ol>\n<li><p><strong>view=2 (Review without filter)</strong></p>\n</li>\n<li><p><strong>view=3 (Review with filter)</strong></p>\n</li>\n<li><p><strong>view=2&amp;id=reviewId (Single review, replace reviewId with the actual review ID)</strong></p>\n</li>\n</ol>\n<h2 id=\"iframe-embedding\"><strong>iFrame Embedding</strong></h2>\n<p><strong>The tag is used to embed the content. Here are examples of the iframe code:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>&lt;iframe src=\"https://app.localyser.com/reviews?id=9508041&amp;view=2\" style=\"width: 100%; height: 100%; overflow: scroll;\" id=\"MyFrame\"&gt;&lt;/iframe&gt;\n&lt;iframe src=\"https://app.localyser.com/reviews?view=2\" style=\"width: 100%; height: 100%; overflow: scroll;\" id=\"MyFrame\"&gt;&lt;/iframe&gt;\n&lt;iframe src=\"https://app.localyser.com/reviews?view=3\" style=\"width: 100%; height: 100%; overflow: scroll;\" id=\"MyFrame\"&gt;&lt;/iframe&gt;\n\n</code></pre><img src=\"https://content.pstmn.io/a1c4abff-80c6-4f4b-afbc-9fbaf6f2e5ab/0JfQvdGW0LzQvtC6INC10LrRgNCw0L3QsCAyMDI2LTA3LTI5INC+IDEyLjIyLjAwLnBuZw==\" />\n\n<h1 id=\"partner-webhook-setup-optional\"><strong>Partner Webhook Setup (optional)</strong></h1>\n<p><strong>The Partner Webhook allows you to receive review data directly from Localyser whenever a new review is posted. Here’s more</strong> <a href=\"https://docs.google.com/document/d/1eldRmYL20D4qMakjfgs4tRPuk3xJQh7hIVIdCrSnbdU/edit?usp=sharing\"><b>details</b></a><strong>.</strong></p>\n<h2 id=\"webhook-setup-steps\"><strong>Webhook Setup Steps</strong></h2>\n<ol>\n<li><p><strong>Navigate to the app dashboard:</strong> <a href=\"https://app.localyser.com/\"><b>https://app.localyser.com</b></a></p>\n</li>\n<li><p><strong>Log in as a valid user.</strong></p>\n</li>\n<li><p><strong>Navigate to Settings - Other.</strong></p>\n</li>\n<li><p><strong>Choose Webhook API.</strong></p>\n</li>\n<li><p><strong>Under Webhook URL, specify the desired URL that Localyser will send reviews to.</strong></p>\n</li>\n<li><p><strong>Once saved, you will be provided with a token used for URL verification. Copy this token.</strong></p>\n</li>\n<li><p><strong>Make your endpoint return this token as plain text (content-type: text/plain). Click the Verify button to establish verification.</strong></p>\n</li>\n</ol>\n<img src=\"https://content.pstmn.io/32921403-dc8f-4053-9815-f3fb664bf96e/NC5wbmc=\" />\n\n<p><strong>Note: This verification is a one-time operation. You do not need to return the token after verification is complete.</strong></p>\n<ol>\n<li><strong>Once verified, you will see a Send Test button. This will trigger a sample POST request with a specified body to your webhook URL.</strong></li>\n</ol>\n<p><strong>After successful setup and verification, the system will automatically send reviews to the specified URL whenever new reviews appear in Localyser.</strong></p>\n<h1 id=\"user-authentication\"><strong>User Authentication</strong></h1>\n<p><strong>Since you’d obtain a per-client API key, you could use it to get the iFrame authentication JWT token per location.</strong></p>\n<h3 id=\"location-signup\"><strong>Location Signup</strong></h3>\n<p><strong>Before accessing the iFrame (or displaying it to your users), you’d have to execute an API call to the Localyser API to get a fresh iFrame Authentication JWT token by sending a POST request to /v3/api/company/iframe-token (payload details will be provided later, the payload will include locationId field to identify the location).</strong></p>\n<p><strong>This token will have a TTL of 24 hours, which ensures that it can’t be used in a harmful way. You need to make sure that you execute an API call every time you display the iFrame content.</strong></p>\n<h3 id=\"iframe-authentication\"><strong>iFrame Authentication</strong></h3>\n<p><strong>To enable automatic authentication of the iframe page with Localyser, include the auth_token={authentication_token} parameter in the page URL. For example: reviews?view=2&amp;auth_token={authentication_token}. This allows users to access the Localyser web application without being prompted to log in manually.</strong></p>\n<p><strong>We will send you steps on how to add CNAME, MX and TXT on your DNS in order to have all Localyser email notifications sent from</strong> <a href=\"https://mailto:notifications@ordercounter.com\"><b>notifications@yourdomain.com</b></a> <strong>instead of</strong> <a href=\"https://mailto:notifications@localyser.com\"><b>notifications@localyser.com</b></a></p>\n<p><strong>GET IFrame Reviews</strong></p>\n<h1 id=\"custom-styling--theming---query-parameters\"><strong>Custom Styling &amp; Theming - Query Parameters</strong></h1>\n<h3 id=\"overview\"><strong>Overview</strong></h3>\n<p><strong>The iframe integration supports extensive visual customization through URL query parameters, allowing you to seamlessly integrate Localyser reviews with your application's design.</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>Parametr</strong></th>\n<th>Type</th>\n<th>Description</th>\n<th>Example Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>theme</td>\n<td>string</td>\n<td>Enables dark mode theme</td>\n<td>dark</td>\n</tr>\n<tr>\n<td>fnColor</td>\n<td>string</td>\n<td>Font/text color</td>\n<td>#ffffff</td>\n</tr>\n<tr>\n<td>bgColor</td>\n<td>string</td>\n<td>Background color</td>\n<td><strong>#1a1a1a</strong></td>\n</tr>\n<tr>\n<td>bgFnColor</td>\n<td>string</td>\n<td>Background font color</td>\n<td>#e0e0e0</td>\n</tr>\n<tr>\n<td>btnBgColor</td>\n<td>string</td>\n<td>Button background color</td>\n<td>#007bff</td>\n</tr>\n<tr>\n<td>btnFnColor</td>\n<td>string</td>\n<td>Button font color</td>\n<td>#ffffff</td>\n</tr>\n<tr>\n<td>btnBgColorHover</td>\n<td>string</td>\n<td>Button hover background color</td>\n<td>#0056b3</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"usage-examples\"><strong>Usage Examples</strong></h3>\n<p><strong>Basic Dark Mode:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>.../reviews?locations=location_value&amp;view=[2,3]&amp;auth_token=auth_token_val\n\n</code></pre><img src=\"https://content.pstmn.io/7bf35ec9-655f-492d-8d83-782defac188e/0JfQvdGW0LzQvtC6INC10LrRgNCw0L3QsCAyMDI2LTA3LTIxINC+IDEzLjA3LjU1LnBuZw==\" />\n\n<img src=\"https://content.pstmn.io/f74ea4ff-0396-46ba-946e-49c0c5a67178/0JfQvdGW0LzQvtC6INC10LrRgNCw0L3QsCAyMDI2LTA3LTI5INC+IDEyLjIwLjQ2LnBuZw==\" />\n\n<p><strong>Custom Brand Color:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>.../reviews?locations=location_value&amp;view=[2,3]&amp;auth_token=auth_token_value&amp;bgColor=f8f9fa&amp;fnColor=212529&amp;btnBgColor=007bff&amp;btnFnColor=ffffff\n\n</code></pre><img src=\"https://content.pstmn.io/7bf35ec9-655f-492d-8d83-782defac188e/0JfQvdGW0LzQvtC6INC10LrRgNCw0L3QsCAyMDI2LTA3LTIxINC+IDEzLjA3LjU1LnBuZw==\" />\n\n<h3 id=\"color-format\"><strong>Color Format</strong></h3>\n<ul>\n<li><p><strong>Format: Hex color codes WITH the # symbol</strong></p>\n</li>\n<li><p><strong>Example: Use #ffffff or ffffff (both supported)</strong></p>\n</li>\n<li><p><strong>URL Encoding: The # symbol should be URL-encoded as # in URLs</strong></p>\n</li>\n<li><p><strong>Auto-handling: The system handles both formats automatically</strong></p>\n</li>\n</ul>\n<h3 id=\"dark-mode\"><strong>Dark Mode</strong></h3>\n<ul>\n<li><p><strong>Parameter: theme=dark</strong></p>\n</li>\n<li><p><strong>Description: Applies a predefined dark theme with dark backgrounds and light text</strong></p>\n</li>\n<li><p><strong>Combination: Can be combined with custom colors to override specific elements</strong></p>\n</li>\n<li><p><strong>Priority: Custom color parameters take precedence over dark theme defaults</strong></p>\n</li>\n</ul>\n<h3 id=\"view-modes\"><strong>View Modes</strong></h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>View mode</strong></th>\n<th><strong>Description</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>view=2</td>\n<td>Hides filters</td>\n</tr>\n<tr>\n<td>view=3</td>\n<td>With filter controls</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"complete-example\"><strong>Complete Example</strong></h3>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>.../reviews?auth_token=your_token&amp;view=3&amp;theme=dark&amp;bgColor=2d3748&amp;fnColor=e2e8f0&amp;btnBgColor=4299e1&amp;btnFnColor=ffffff&amp;btnBgColorHover=3182ce\n\n</code></pre><img src=\"https://content.pstmn.io/7bf35ec9-655f-492d-8d83-782defac188e/0JfQvdGW0LzQvtC6INC10LrRgNCw0L3QsCAyMDI2LTA3LTIxINC+IDEzLjA3LjU1LnBuZw==\" />\n\n<p><strong>This example creates a dark-themed iframe with:</strong></p>\n<ul>\n<li><p><strong>Dark blue-gray background (#2d3748)</strong></p>\n</li>\n<li><p><strong>Light gray text (#e2e8f0)</strong></p>\n</li>\n<li><p><strong>Blue buttons (#4299e1) with white text</strong></p>\n</li>\n<li><p><strong>Darker blue button hover effect (#3182ce)</strong></p>\n</li>\n<li><p><strong>Hidden filters (view=3)</strong></p>\n</li>\n</ul>\n<p><strong>Example:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>.../reviews?locations=...&amp;view=3&amp;btnBgColor=ff6b35&amp;btnFnColor=fff&amp;btnBgColorHover=ff5722&amp;bgColor=2C2C2C&amp;fnColor=f8fafc&amp;bgFnColor=cbd5e1\n\n</code></pre><img src=\"https://content.pstmn.io/7bf35ec9-655f-492d-8d83-782defac188e/0JfQvdGW0LzQvtC6INC10LrRgNCw0L3QsCAyMDI2LTA3LTIxINC+IDEzLjA3LjU1LnBuZw==\" />\n\n<p><strong>Reporting Pages</strong></p>\n<h3 id=\"reporting-pages-overview--insights\"><strong>Reporting Pages (Overview &amp; Insights):</strong></h3>\n<p><strong>These pages support additional query parameters for data filtering:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>Parameter</strong></th>\n<th><strong>Type</strong></th>\n<th><strong>Description</strong></th>\n<th><strong>Example</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>date_from</td>\n<td>string</td>\n<td>Start date (YYYY-MM-DD)</td>\n<td>2025-08-13</td>\n</tr>\n<tr>\n<td>date_to</td>\n<td>string</td>\n<td>End date (YYYY-MM-DD)</td>\n<td>2025-09-12</td>\n</tr>\n<tr>\n<td>categories</td>\n<td>string</td>\n<td>Comma-separated categories</td>\n<td>Food,Delivery,Service,Price,Atmosphere,Recommend</td>\n</tr>\n<tr>\n<td>locations</td>\n<td>string</td>\n<td>Comma-separated location IDs</td>\n<td>123,456,789</td>\n</tr>\n<tr>\n<td>source</td>\n<td>string</td>\n<td>Review source filter</td>\n<td>google,facebook,tripadvisor</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Example Insights with Custom Styling + Filtering:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>.../reporting/overview?auth_token=YOUR_TOKEN&amp;view=3&amp;date_from=2025-08-13&amp;date_to=2025-09-12&amp;categories=Food,Delivery,Service,Price,Atmosphere,Recommend&amp;locations=123,456&amp;source=google,facebook\n\n</code></pre><img src=\"https://content.pstmn.io/7bf35ec9-655f-492d-8d83-782defac188e/0JfQvdGW0LzQvtC6INC10LrRgNCw0L3QsCAyMDI2LTA3LTIxINC+IDEzLjA3LjU1LnBuZw==\" />\n\n<p><strong>Example Overview with Multiple Filters:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>.../reporting/overview?auth_token=YOUR_TOKEN&amp;view=3&amp;date_from=2025-08-13&amp;date_to=2025-09-12&amp;categories=Food,Delivery,Service,Price,Atmosphere,Recommend&amp;locations=123,456&amp;source=google,facebook\n\n</code></pre><img src=\"https://content.pstmn.io/7bf35ec9-655f-492d-8d83-782defac188e/0JfQvdGW0LzQvtC6INC10LrRgNCw0L3QsCAyMDI2LTA3LTIxINC+IDEzLjA3LjU1LnBuZw==\" />\n\n<h3 id=\"dashboard-page\"><strong>Dashboard page</strong></h3>\n<p><strong>On that page you might access reputation score and net promoter score widgets via iframe access.</strong></p>\n<p><strong>This page support additional query parameters for data filtering:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>Parameter</strong></th>\n<th><strong>Type</strong></th>\n<th><strong>Description</strong></th>\n<th><strong>Example</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>date_from</td>\n<td>string</td>\n<td>Start date (YYYY-MM-DD)</td>\n<td>2025-08-13</td>\n</tr>\n<tr>\n<td>date_to</td>\n<td>string</td>\n<td>End date (YYYY-MM-DD)</td>\n<td><strong>2025-09-12</strong></td>\n</tr>\n<tr>\n<td><strong>locations</strong></td>\n<td>string</td>\n<td>Comma-separated location IDs</td>\n<td>123,456,789</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Example Insights with Custom Styling + Filtering:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>.../dashboard?locations=11046&amp;view=3&amp;auth_token=YOUR_TOKEN&amp;theme=dark&amp;date_from=2026-01-12&amp;date_to=2026-02-10\n\n</code></pre><img src=\"https://content.pstmn.io/7bf35ec9-655f-492d-8d83-782defac188e/0JfQvdGW0LzQvtC6INC10LrRgNCw0L3QsCAyMDI2LTA3LTIxINC+IDEzLjA3LjU1LnBuZw==\" />\n\n<img src=\"https://content.pstmn.io/b1dfa0a2-dc3a-41a9-9768-1b67ff568c03/NS5wbmc=\" />\n\n<img src=\"https://content.pstmn.io/2ad0180b-e8c8-4ebc-918c-29d6c691b091/Ni5wbmc=\" />","_postman_id":"ecb06e0e-5da0-47b6-8962-04170a585c40"},{"name":"Client API Documentation","item":[{"name":"location","item":[{"name":"POST location","id":"5ec0130a-3227-41b6-8464-37a4ca363dd3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"title\": \"Acme Cafe — Dubai Marina\",\n  \"locationId\": \"ACME-DXB-MAR-001\",\n  \"state\": 11,\n  \"locationAddress\": \"Marina Walk, Dubai Marina\",\n  \"phoneNumber\": \"+97141234567\",\n  \"websiteAddress\": \"https://acme.com/dubai-marina\",\n  \"sources\": [\n    {\n      \"title\": \"Google\",\n      \"url\": \"https://www.google.com/maps/place/acme-dubai-marina\"\n    },\n    {\n      \"title\": \"Zomato\",\n      \"url\": \"https://www.zomato.com/dubai/acme-dubai-marina\"\n    },\n    {\n      \"title\": \"Agoda\",\n      \"url\": \"https://www.agoda.com/acme-dubai-marina.html\"\n    }\n  ]\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/location","description":"<p>Create a new location under the authenticated company. Enforces the company's <code>locationsLimit</code>, validates that <code>(title, locationId)</code> is unique system-wide, that the <code>state</code> belongs to the same company, and that every source the company is allowed to use.</p>\n<p>Fields:</p>\n<ul>\n<li><strong>title</strong> field is required, type 'string';</li>\n<li><strong>locationId</strong> field is required, type 'string';</li>\n<li><strong>state</strong> field is required, it's state id value, type 'int';</li>\n<li><strong>sources</strong> field is required, type 'array', array of objects with title and url values, acceptable title values are \"Agoda, Airbnb, AliExpress...\";</li>\n<li><strong>locationAddress</strong> field is optional, type 'string';</li>\n<li><strong>phoneNumber</strong> field is optional, type 'string';</li>\n<li><strong>websiteAddress</strong> field is optional, type 'string';</li>\n</ul>\n","urlObject":{"path":["v3","api","location"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"06da55fc-4f69-4e89-9f18-006a53c179cc","name":"Location created successfully.","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"title\": \"Acme Cafe — Dubai Marina\",\n  \"locationId\": \"ACME-DXB-MAR-001\",\n  \"state\": 11,\n  \"locationAddress\": \"Marina Walk, Dubai Marina\",\n  \"phoneNumber\": \"+97141234567\",\n  \"websiteAddress\": \"https://acme.com/dubai-marina\",\n  \"sources\": [\n    {\n      \"title\": \"Google\",\n      \"url\": \"https://www.google.com/maps/place/acme-dubai-marina\"\n    },\n    {\n      \"title\": \"Zomato\",\n      \"url\": \"https://www.zomato.com/dubai/acme-dubai-marina\"\n    },\n    {\n      \"title\": \"Agoda\",\n      \"url\": \"https://www.agoda.com/acme-dubai-marina.html\"\n    }\n  ]\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/location"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 7741,\n  \"title\": \"Acme Cafe — Dubai Marina\",\n  \"locationId\": \"ACME-DXB-MAR-001\",\n  \"state\": 11,\n  \"brand\": 901,\n  \"client\": 1842,\n  \"brandTitle\": \"Acme Dubai\",\n  \"isHidden\": false,\n  \"isProcessed\": true,\n  \"profilesCount\": 0,\n  \"reviewsCount\": 0,\n  \"locationAddress\": \"Marina Walk, Dubai Marina\",\n  \"phoneNumber\": \"+97141234567\",\n  \"websiteAddress\": \"https://acme.com/dubai-marina\",\n  \"google\": \"https://www.google.com/maps/place/acme-dubai-marina\",\n  \"zomato\": \"https://www.zomato.com/dubai/acme-dubai-marina\",\n  \"facebook\": null,\n  \"tripadvisor\": null,\n  \"foursquare\": null,\n  \"talabat\": null,\n  \"hungerStation\": null,\n  \"booking\": null,\n  \"expedia\": null,\n  \"reserveOut\": null,\n  \"deliveroo\": null,\n  \"deliverooOrgId\": null,\n  \"deliverooBranchId\": null,\n  \"doordashStoreId\": null,\n  \"countryCode\": \"AE\",\n  \"posId\": null,\n  \"ccSupportEmail\": null,\n  \"serviceCredentials\": null,\n  \"createdAt\": 1748275200000,\n  \"updatedAt\": 1748275200000,\n  \"additionalSources\": [\n    {\n      \"title\": \"Agoda\",\n      \"url\": \"https://www.agoda.com/acme-dubai-marina.html\"\n    }\n  ]\n}"},{"id":"6d6e3912-7079-46c2-85f0-c45e5174ad1c","name":"Validation, ownership, or limit error.","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"title\": \"Acme Cafe — Dubai Marina\",\n  \"locationId\": \"ACME-DXB-MAR-001\",\n  \"state\": 11,\n  \"locationAddress\": \"Marina Walk, Dubai Marina\",\n  \"phoneNumber\": \"+97141234567\",\n  \"websiteAddress\": \"https://acme.com/dubai-marina\",\n  \"sources\": [\n    {\n      \"title\": \"Google\",\n      \"url\": \"https://www.google.com/maps/place/acme-dubai-marina\"\n    },\n    {\n      \"title\": \"Zomato\",\n      \"url\": \"https://www.zomato.com/dubai/acme-dubai-marina\"\n    },\n    {\n      \"title\": \"Agoda\",\n      \"url\": \"https://www.agoda.com/acme-dubai-marina.html\"\n    }\n  ]\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/location"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Title or locationId parameter missing\"\n}"},{"id":"9f4fb1b4-cecb-4f92-8bbf-7873de0e751c","name":"Missing or invalid `Authorization` header, or the access token does not match an active, non-archived company.","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"title\": \"Acme Cafe — Dubai Marina\",\n  \"locationId\": \"ACME-DXB-MAR-001\",\n  \"state\": 11,\n  \"locationAddress\": \"Marina Walk, Dubai Marina\",\n  \"phoneNumber\": \"+97141234567\",\n  \"websiteAddress\": \"https://acme.com/dubai-marina\",\n  \"sources\": [\n    {\n      \"title\": \"Google\",\n      \"url\": \"https://www.google.com/maps/place/acme-dubai-marina\"\n    },\n    {\n      \"title\": \"Zomato\",\n      \"url\": \"https://www.zomato.com/dubai/acme-dubai-marina\"\n    },\n    {\n      \"title\": \"Agoda\",\n      \"url\": \"https://www.agoda.com/acme-dubai-marina.html\"\n    }\n  ]\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/location"},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"5ec0130a-3227-41b6-8464-37a4ca363dd3"},{"name":"PATCH location","id":"d57cf360-727e-4d6f-bef0-e98b50196be5","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 7741,\n  \"title\": \"Acme Cafe — Dubai Marina (renamed)\",\n  \"locationId\": \"ACME-DXB-MAR-001\",\n  \"state\": 11,\n  \"locationAddress\": \"Marina Walk, Dubai Marina\",\n  \"phoneNumber\": \"+97141234567\",\n  \"websiteAddress\": \"https://acme.com/dubai-marina\",\n  \"sources\": [\n    {\n      \"title\": \"Google\",\n      \"url\": \"https://www.google.com/maps/place/acme-dubai-marina\"\n    },\n    {\n      \"title\": \"Zomato\",\n      \"url\": \"https://www.zomato.com/dubai/acme-dubai-marina\"\n    },\n    {\n      \"title\": \"Agoda\",\n      \"url\": \"https://www.agoda.com/acme-dubai-marina.html\"\n    }\n  ]\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/location","description":"<p>Update an existing location belonging to the authenticated company. Any combination of fields can be passed; omitted fields keep their current values. If <code>state</code> is changed the brand title is recomputed.</p>\n<p>Fields:</p>\n<ul>\n<li><strong>id</strong> filed is required, type 'int';</li>\n<li><strong>title</strong> field is optional, type 'string';</li>\n<li><strong>locationId</strong> field is optional, type 'string';</li>\n<li><strong>state</strong> field is optional, it's state id value, type 'int';</li>\n<li><strong>locationAddress</strong> field is optional, type 'string';</li>\n<li><strong>phoneNumber</strong> field is optional, type 'string';</li>\n<li><strong>websiteAddress</strong> field is optional, type 'string';</li>\n<li><strong>sources</strong> field is optional, type 'array', array of objects with title and url values, acceptable title values are \"Agoda, Airbnb, AliExpress...\";</li>\n</ul>\n","urlObject":{"path":["v3","api","location"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"c0ae3453-2668-4e4d-91ec-c81d7bac6694","name":"Location updated successfully.","originalRequest":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 7741,\n  \"title\": \"Acme Cafe — Dubai Marina (renamed)\",\n  \"locationId\": \"ACME-DXB-MAR-001\",\n  \"state\": 11,\n  \"locationAddress\": \"Marina Walk, Dubai Marina\",\n  \"phoneNumber\": \"+97141234567\",\n  \"websiteAddress\": \"https://acme.com/dubai-marina\",\n  \"sources\": [\n    {\n      \"title\": \"Google\",\n      \"url\": \"https://www.google.com/maps/place/acme-dubai-marina\"\n    },\n    {\n      \"title\": \"Zomato\",\n      \"url\": \"https://www.zomato.com/dubai/acme-dubai-marina\"\n    },\n    {\n      \"title\": \"Agoda\",\n      \"url\": \"https://www.agoda.com/acme-dubai-marina.html\"\n    }\n  ]\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/location"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 7741,\n  \"title\": \"Acme Cafe — Dubai Marina (renamed)\",\n  \"locationId\": \"ACME-DXB-MAR-001\",\n  \"state\": 11,\n  \"brand\": 901,\n  \"client\": 1842,\n  \"brandTitle\": \"Acme Dubai\",\n  \"isHidden\": false,\n  \"locationAddress\": \"Marina Walk, Dubai Marina\",\n  \"phoneNumber\": \"+97141234567\",\n  \"websiteAddress\": \"https://acme.com/dubai-marina\",\n  \"google\": \"https://www.google.com/maps/place/acme-dubai-marina\",\n  \"zomato\": \"https://www.zomato.com/dubai/acme-dubai-marina\",\n  \"facebook\": null,\n  \"tripadvisor\": null,\n  \"foursquare\": null,\n  \"talabat\": null,\n  \"hungerStation\": null,\n  \"booking\": null,\n  \"expedia\": null,\n  \"reserveOut\": null,\n  \"deliveroo\": \"https://deliveroo.ae/menu/dubai/acme-dubai-marina\",\n  \"deliverooOrgId\": \"acme-restaurants\",\n  \"deliverooBranchId\": \"acme-marina-1\",\n  \"doordashStoreId\": \"doordash-987654\",\n  \"profilesCount\": 14,\n  \"reviewsCount\": 1287,\n  \"countryCode\": \"AE\",\n  \"posId\": \"POS-DXB-001\",\n  \"ccSupportEmail\": \"support+acme-marina@localyser.com\",\n  \"serviceCredentials\": [\n    {\n      \"id\": 412,\n      \"service\": \"google\"\n    }\n  ],\n  \"updatedAt\": 1748361600000,\n  \"additionalSources\": [\n    {\n      \"title\": \"Agoda\",\n      \"url\": \"https://www.agoda.com/acme-dubai-marina.html\"\n    }\n  ]\n}"},{"id":"96a8a69c-faec-4138-bc11-52cd90dd68f4","name":"Validation, ownership, or source-access error.","originalRequest":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 7741,\n  \"title\": \"Acme Cafe — Dubai Marina (renamed)\",\n  \"locationId\": \"ACME-DXB-MAR-001\",\n  \"state\": 11,\n  \"locationAddress\": \"Marina Walk, Dubai Marina\",\n  \"phoneNumber\": \"+97141234567\",\n  \"websiteAddress\": \"https://acme.com/dubai-marina\",\n  \"sources\": [\n    {\n      \"title\": \"Google\",\n      \"url\": \"https://www.google.com/maps/place/acme-dubai-marina\"\n    },\n    {\n      \"title\": \"Zomato\",\n      \"url\": \"https://www.zomato.com/dubai/acme-dubai-marina\"\n    },\n    {\n      \"title\": \"Agoda\",\n      \"url\": \"https://www.agoda.com/acme-dubai-marina.html\"\n    }\n  ]\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/location"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Id parameter missing\"\n}"},{"id":"d0c6ce1f-9465-4ea3-acc9-e78bba38c4a7","name":"Missing or invalid `Authorization` header, or the access token does not match an active, non-archived company.","originalRequest":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 7741,\n  \"title\": \"Acme Cafe — Dubai Marina (renamed)\",\n  \"locationId\": \"ACME-DXB-MAR-001\",\n  \"state\": 11,\n  \"locationAddress\": \"Marina Walk, Dubai Marina\",\n  \"phoneNumber\": \"+97141234567\",\n  \"websiteAddress\": \"https://acme.com/dubai-marina\",\n  \"sources\": [\n    {\n      \"title\": \"Google\",\n      \"url\": \"https://www.google.com/maps/place/acme-dubai-marina\"\n    },\n    {\n      \"title\": \"Zomato\",\n      \"url\": \"https://www.zomato.com/dubai/acme-dubai-marina\"\n    },\n    {\n      \"title\": \"Agoda\",\n      \"url\": \"https://www.agoda.com/acme-dubai-marina.html\"\n    }\n  ]\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/location"},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"d57cf360-727e-4d6f-bef0-e98b50196be5"},{"name":"DELETE location","id":"2175ed37-5762-4e41-b57e-0165cba36f0c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 7741\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/location","description":"<p>Hide an existing location belonging to the authenticated company (soft\ndelete — sets <code>isHidden = true</code>). The location must currently be\nvisible (<code>isHidden = false</code>). Returns the updated location record.</p>\n<p>Fields:</p>\n<ul>\n<li><strong>id</strong> field is required, type 'int';</li>\n</ul>\n","urlObject":{"path":["v3","api","location"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"12b2a8eb-52ce-480e-9ff5-4a956777b746","name":"Location hidden successfully.","originalRequest":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 7741\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/location"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 7741,\n  \"title\": \"Acme Cafe — Dubai Marina\",\n  \"locationId\": \"ACME-DXB-MAR-001\",\n  \"state\": 11,\n  \"brand\": 901,\n  \"client\": 1842,\n  \"isHidden\": true,\n  \"updatedAt\": 1748448000000\n}"},{"id":"f23ab4ac-5389-486d-baa4-6afde257c196","name":"Validation or ownership error.","originalRequest":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 7741\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/location"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Id parameter missing\"\n}"},{"id":"83c38021-05f8-48b1-8635-0bdd0678043e","name":"Missing or invalid `Authorization` header, or the access token does not match an active, non-archived company.","originalRequest":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 7741\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/location"},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"2175ed37-5762-4e41-b57e-0165cba36f0c"},{"name":"GET locations","id":"20f2c363-d9fd-4252-8572-ee4790764930","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/v3/api/location?page=1&search=dubai","description":"<p>List the authenticated company's visible (non-hidden) locations, paginated 20 per page. Supports a <code>search</code> query that matches both location title and locationId. Out-of-range <code>page</code> values return an empty <code>locations</code> array (not an error).</p>\n<p>Params:</p>\n<ul>\n<li><strong>page</strong> parameter is optional, by default page = 1;</li>\n<li><strong>search</strong> parameter is optional;</li>\n</ul>\n<p>Request return 20 locations per page.</p>\n<p>If you set page parameter to value that not exist, system return empty array.</p>\n","urlObject":{"path":["v3","api","location"],"host":["{{baseUrl}}"],"query":[{"key":"page","value":"1"},{"key":"search","value":"dubai"}],"variable":[]}},"response":[{"id":"8d59c604-eaef-439f-9787-96013a50b6f3","name":"Paginated list of locations.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v3/api/location?page=1&search=dubai","host":["{{baseUrl}}"],"path":["v3","api","location"],"query":[{"key":"page","value":"1"},{"key":"search","value":"dubai"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"page\": 1,\n  \"perPage\": 20,\n  \"totalPages\": 1,\n  \"locations\": [\n    {\n      \"id\": 7741,\n      \"title\": \"Acme Cafe — Dubai Marina\",\n      \"locationId\": \"ACME-DXB-MAR-001\",\n      \"state\": 11,\n      \"brand\": 901,\n      \"client\": 1842,\n      \"brandTitle\": \"Acme Dubai\",\n      \"isHidden\": false,\n      \"locationAddress\": \"Marina Walk, Dubai Marina\",\n      \"phoneNumber\": \"+97141234567\",\n      \"websiteAddress\": \"https://acme.com/dubai-marina\",\n      \"google\": \"https://www.google.com/maps/place/acme-dubai-marina\",\n      \"zomato\": \"https://www.zomato.com/dubai/acme-dubai-marina\",\n      \"facebook\": null,\n      \"tripadvisor\": null,\n      \"foursquare\": null,\n      \"talabat\": null,\n      \"hungerStation\": null,\n      \"booking\": null,\n      \"expedia\": null,\n      \"reserveOut\": null,\n      \"deliveroo\": \"https://deliveroo.ae/menu/dubai/acme-dubai-marina\",\n      \"deliverooOrgId\": \"acme-restaurants\",\n      \"deliverooBranchId\": \"acme-marina-1\",\n      \"doordashStoreId\": \"doordash-987654\",\n      \"profilesCount\": 14,\n      \"reviewsCount\": 1287,\n      \"countryCode\": \"AE\",\n      \"posId\": \"POS-DXB-001\",\n      \"ccSupportEmail\": \"support+acme-marina@localyser.com\",\n      \"serviceCredentials\": [\n        {\n          \"id\": 412,\n          \"service\": \"google\"\n        }\n      ],\n      \"additionalSources\": [\n        {\n          \"title\": \"Agoda\",\n          \"url\": \"https://www.agoda.com/acme-dubai-marina.html\"\n        }\n      ]\n    }\n  ]\n}"},{"id":"fa20ea43-438a-4723-aac7-bf3f9a4b726c","name":"Processing error.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v3/api/location?page=1&search=dubai","host":["{{baseUrl}}"],"path":["v3","api","location"],"query":[{"key":"page","value":"1"},{"key":"search","value":"dubai"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Some data base error\"\n}"},{"id":"bbbd9d88-887e-4938-913b-4a06c9560155","name":"Missing or invalid `Authorization` header, or the access token does not match an active, non-archived company.","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v3/api/location?page=1&search=dubai","host":["{{baseUrl}}"],"path":["v3","api","location"],"query":[{"key":"page","value":"1"},{"key":"search","value":"dubai"}]}},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"20f2c363-d9fd-4252-8572-ee4790764930"}],"id":"bc4b6875-4571-42a0-876f-d8265b66bd26","_postman_id":"bc4b6875-4571-42a0-876f-d8265b66bd26","description":""},{"name":"reviews","item":[{"name":"GET reviews","id":"bb444528-a782-4123-af4e-3412a99ad562","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/v3/api/reviews?page=1&reviewCountPerPage=20&services=google,facebook,tripadvisor&locations=7741,7742&states=11,12&brands=901,902&date_from=2026-01-01&date_to=2026-06-01&rating=4,5&direction=desc&order=date","description":"<p>Returns a paginated list of reviews for the authenticated company.\nSupports filtering by source, brand, state, location, star rating\nand date range, plus sorting by date, sentiment (rating value) or\nreview length, in either direction. Each review entry contains the\nfull underlying review record together with the parent\n<code>brandTitle</code> and <code>locationId</code> joined in from the state/location\ntables.</p>\n<p>Default page size is 20. If <code>page</code> points past the last page, the\n<code>reviews</code> array is empty (it is not an error).</p>\n<p>Params:</p>\n<ul>\n<li><p><strong>page</strong> parameter is optional, by default page = 1;</p>\n</li>\n<li><p><strong>reviewCountPerPage</strong> parameter is optional, page size, by\ndefault 20;</p>\n</li>\n<li><p><strong>services</strong> parameter is optional, comma separated source names\n(e.g. <code>google,zomato,facebook,tripadvisor</code>). Validated against the\nlist of supported sources; unknown values throw\n<code>Wrong source name &lt;name&gt;</code>;</p>\n</li>\n<li><p><strong>locations</strong> parameter is optional, comma separated location\nids. Each id must belong to the authenticated company; a foreign\nid throws <code>Location id &lt;X&gt; is not your location</code>;</p>\n</li>\n<li><p><strong>states</strong> parameter is optional, comma separated state ids.\nEach id must belong to the authenticated company; a foreign id\nthrows <code>State id &lt;X&gt; is not your state</code>;</p>\n</li>\n<li><p><strong>brands</strong> parameter is optional, comma separated brand ids.\nEach id must belong to the authenticated company; a foreign id\nthrows <code>Brand id &lt;X&gt; is not your brand</code>;</p>\n</li>\n<li><p><strong>date_from</strong> parameter is optional, format yyyy-mm-dd, lower\nbound on the review's <code>date</code>;</p>\n</li>\n<li><p><strong>date_to</strong> parameter is optional, format yyyy-mm-dd, upper\nbound on the review's <code>date</code>;</p>\n</li>\n<li><p><strong>rating</strong> parameter is optional, comma separated star values\nfrom 1 to 5; any other value throws\n<code>Wrong rating value &lt;X&gt; use 1,2,3,4,5</code>;</p>\n</li>\n<li><p><strong>direction</strong> parameter is optional, sort direction <code>asc</code> or\n<code>desc</code>, default <code>desc</code>;</p>\n</li>\n<li><p><strong>order</strong> parameter is optional, sort key — <code>date</code> (default),\n<code>sentiment</code> (= rating value) or <code>length</code> (= length of\n<code>reviewText</code>).</p>\n</li>\n</ul>\n","urlObject":{"path":["v3","api","reviews"],"host":["{{baseUrl}}"],"query":[{"key":"page","value":"1"},{"key":"reviewCountPerPage","value":"20"},{"key":"services","value":"google,facebook,tripadvisor"},{"key":"locations","value":"7741,7742"},{"key":"states","value":"11,12"},{"key":"brands","value":"901,902"},{"key":"date_from","value":"2026-01-01"},{"key":"date_to","value":"2026-06-01"},{"key":"rating","value":"4,5"},{"key":"direction","value":"desc"},{"key":"order","value":"date"}],"variable":[]}},"response":[{"id":"e197c497-47dd-4ae5-b090-bfb9ee8aedf9","name":"Paginated reviews for the authenticated company.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v3/api/reviews?page=1&reviewCountPerPage=20&services=google,facebook,tripadvisor&locations=7741,7742&states=11,12&brands=901,902&date_from=2026-01-01&date_to=2026-06-01&rating=4,5&direction=desc&order=date","host":["{{baseUrl}}"],"path":["v3","api","reviews"],"query":[{"key":"page","value":"1"},{"key":"reviewCountPerPage","value":"20"},{"key":"services","value":"google,facebook,tripadvisor"},{"key":"locations","value":"7741,7742"},{"key":"states","value":"11,12"},{"key":"brands","value":"901,902"},{"key":"date_from","value":"2026-01-01"},{"key":"date_to","value":"2026-06-01"},{"key":"rating","value":"4,5"},{"key":"direction","value":"desc"},{"key":"order","value":"date"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"page\": 1,\n  \"perPage\": 20,\n  \"totalPages\": 5,\n  \"reviews\": [\n    {\n      \"createdAt\": 1747267200000,\n      \"updatedAt\": 1747353600000,\n      \"id\": 1000123,\n      \"apiId\": \"APIID-AB12CDEFghij\",\n      \"serviceName\": \"google\",\n      \"name\": \"Jane Doe\",\n      \"date\": \"2026-05-15\",\n      \"ratingValue\": 5,\n      \"reviewText\": \"Lovely place — coffee was great and staff super friendly.\",\n      \"url\": \"https://www.google.com/maps/contrib/103450/place/ChIJabc\",\n      \"reviewTitle\": null,\n      \"verifiedOrder\": 0,\n      \"reviewerTitle\": null,\n      \"languageCode\": \"en\",\n      \"uniqueId\": \"google-Ch_AbCdEf12345abc\",\n      \"locationApi\": null,\n      \"price\": 1,\n      \"location\": 7741,\n      \"user\": null,\n      \"reviewLength\": 56,\n      \"isHidden\": 0,\n      \"replyText\": \"Thanks for the kind words!\",\n      \"isReplyConfirm\": 1,\n      \"replyDate\": 1747353600000,\n      \"replyUser\": null,\n      \"replyUserName\": \"Manager Acme\",\n      \"reviewType\": \"general\",\n      \"mobile\": \"+971501234567\",\n      \"email\": \"jane@example.com\",\n      \"action\": null,\n      \"alternate_name\": null,\n      \"oldReviewText\": null,\n      \"oldRatingValue\": null,\n      \"c_food\": null,\n      \"c_n_food\": null,\n      \"c_delivery\": null,\n      \"c_n_delivery\": null,\n      \"c_service\": null,\n      \"c_n_service\": null,\n      \"c_price\": null,\n      \"c_n_price\": null,\n      \"c_s_speed\": 0,\n      \"c_n_s_speed\": 0,\n      \"c_f_variety\": 0,\n      \"c_n_f_variety\": 0,\n      \"isExcluded\": 0,\n      \"c_n_recommend\": 0,\n      \"c_atmosphere\": null,\n      \"c_n_atmosphere\": null,\n      \"c_f_quality\": null,\n      \"c_n_f_quality\": null,\n      \"c_f_taste\": null,\n      \"c_n_f_taste\": null,\n      \"c_f_quantity\": null,\n      \"c_n_f_quantity\": null,\n      \"c_d_accuracy\": null,\n      \"c_n_d_accuracy\": null,\n      \"c_d_speed\": null,\n      \"c_n_d_speed\": null,\n      \"c_d_packaging\": null,\n      \"c_n_d_packaging\": null,\n      \"c_s_friendliness\": null,\n      \"c_n_s_friendliness\": null,\n      \"c_a_cleanliness\": null,\n      \"c_n_a_cleanliness\": null,\n      \"c_a_emotion\": null,\n      \"c_n_a_emotion\": null,\n      \"processed_reviewText\": null,\n      \"highlights\": \"{\\\"menu_items\\\":[],\\\"staff_names\\\":[],\\\"c_o_satisfaction\\\":[[0,11]]}\",\n      \"c_checked\": 1,\n      \"menu_items\": \"\",\n      \"staff_names\": null,\n      \"reviewTime\": \"12:58:00\",\n      \"resolveDate\": null,\n      \"reviewTextTranslation\": null,\n      \"ticketing_customer_id\": null,\n      \"brandTitle\": \"Acme\",\n      \"locationTitle\": \"Acme Cafe — Dubai Marina\",\n      \"stateTitle\": \"Dubai\"\n    }\n  ]\n}"},{"id":"5d1b04cd-b668-42c0-b7ee-cd79a43f0879","name":"Validation, ownership or processing error.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v3/api/reviews?page=1&reviewCountPerPage=20&services=google,facebook,tripadvisor&locations=7741,7742&states=11,12&brands=901,902&date_from=2026-01-01&date_to=2026-06-01&rating=4,5&direction=desc&order=date","host":["{{baseUrl}}"],"path":["v3","api","reviews"],"query":[{"key":"page","value":"1"},{"key":"reviewCountPerPage","value":"20"},{"key":"services","value":"google,facebook,tripadvisor"},{"key":"locations","value":"7741,7742"},{"key":"states","value":"11,12"},{"key":"brands","value":"901,902"},{"key":"date_from","value":"2026-01-01"},{"key":"date_to","value":"2026-06-01"},{"key":"rating","value":"4,5"},{"key":"direction","value":"desc"},{"key":"order","value":"date"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Wrong direction parameter it can be \\\"asc\\\" or \\\"desc\\\"\"\n}"},{"id":"c34e99cf-4a2e-4775-8cf6-4f6d0c0b2c7a","name":"Missing or invalid `Authorization` header, or the access token does not match an active, non-archived company.","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v3/api/reviews?page=1&reviewCountPerPage=20&services=google,facebook,tripadvisor&locations=7741,7742&states=11,12&brands=901,902&date_from=2026-01-01&date_to=2026-06-01&rating=4,5&direction=desc&order=date","host":["{{baseUrl}}"],"path":["v3","api","reviews"],"query":[{"key":"page","value":"1"},{"key":"reviewCountPerPage","value":"20"},{"key":"services","value":"google,facebook,tripadvisor"},{"key":"locations","value":"7741,7742"},{"key":"states","value":"11,12"},{"key":"brands","value":"901,902"},{"key":"date_from","value":"2026-01-01"},{"key":"date_to","value":"2026-06-01"},{"key":"rating","value":"4,5"},{"key":"direction","value":"desc"},{"key":"order","value":"date"}]}},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"bb444528-a782-4123-af4e-3412a99ad562"},{"name":"GET locations review stats","id":"7d226030-4f8e-4eb6-b34a-4fda37b224a5","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/v3/api/locations/reviews?page=1","description":"<p>Returns a paginated list of the authenticated company's visible\n(non-hidden) locations, each annotated with average star rating\nand total review count per source. Per-source stats are nested\nunder dynamic keys matching the source name (e.g. <code>google</code>,\n<code>facebook</code>, <code>zomato</code>, ...) — only sources with at least one\nreview for that location are present.</p>\n<p>Returns 20 locations per page. If <code>page</code> points past the last\npage, the <code>locations</code> array is empty (it is not an error).</p>\n<p>Params:</p>\n<ul>\n<li><strong>page</strong> parameter is optional, by default page = 1.</li>\n</ul>\n","urlObject":{"path":["v3","api","locations","reviews"],"host":["{{baseUrl}}"],"query":[{"key":"page","value":"1"}],"variable":[]}},"response":[{"id":"17c9339a-66cb-4e16-861e-312916caf00b","name":"Paginated locations with per-source rating and count.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v3/api/locations/reviews?page=1","host":["{{baseUrl}}"],"path":["v3","api","locations","reviews"],"query":[{"key":"page","value":"1"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"page\": 1,\n  \"perPage\": 20,\n  \"totalPages\": 3,\n  \"locations\": [\n    {\n      \"id\": 7741,\n      \"title\": \"Acme Cafe — Dubai Marina\",\n      \"locationId\": \"ACME-DXB-MAR-001\",\n      \"brand\": \"Acme Dubai\",\n      \"google\": {\n        \"avarageRating\": 4.6,\n        \"amount\": 312\n      },\n      \"facebook\": {\n        \"avarageRating\": 4.5,\n        \"amount\": 80\n      },\n      \"tripadvisor\": {\n        \"avarageRating\": 4.4,\n        \"amount\": 41\n      }\n    },\n    {\n      \"id\": 7742,\n      \"title\": \"Acme Cafe — Abu Dhabi Corniche\",\n      \"locationId\": \"ACME-AUH-COR-001\",\n      \"brand\": \"Acme Abu Dhabi\",\n      \"google\": {\n        \"avarageRating\": 4.7,\n        \"amount\": 198\n      }\n    }\n  ]\n}"},{"id":"492dcd37-b67d-4d0b-b3b0-d2febb3cc9eb","name":"Processing error.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v3/api/locations/reviews?page=1","host":["{{baseUrl}}"],"path":["v3","api","locations","reviews"],"query":[{"key":"page","value":"1"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Some data base error\"\n}"},{"id":"4ab01752-5897-439f-8e6c-6e686f139d4c","name":"Missing or invalid `Authorization` header, or the access token does not match an active, non-archived company.","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v3/api/locations/reviews?page=1","host":["{{baseUrl}}"],"path":["v3","api","locations","reviews"],"query":[{"key":"page","value":"1"}]}},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"7d226030-4f8e-4eb6-b34a-4fda37b224a5"}],"id":"51673df7-8b21-4033-a9cf-32b616e487b1","_postman_id":"51673df7-8b21-4033-a9cf-32b616e487b1","description":""},{"name":"user","item":[{"name":"POST user","id":"44800d77-9aee-495a-8273-cae4191e3757","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"email\": \"jane@acme.com\",\n  \"role\": \"Master Admin\",\n  \"companyId\": 1842\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/user","description":"<p>Create a new user under the authenticated company. The user is created\nwith isEnabled = true and isTotalGrant = true, and immediately receives\nan invitation email so they can set their own password. Accepts\ncompanyId body field that resolves to a company belonging to that\npartner.</p>\n<p>Fields:</p>\n<ul>\n<li><strong>firstName</strong> field is required, type 'string';</li>\n<li><strong>lastName</strong> field is required, type 'string';</li>\n<li><strong>email</strong> field is required, type 'string';</li>\n<li><strong>role</strong> field is required, type 'string', acceptable values are \"Analyst\", \"Manager\", \"Responder\", \"Master Admin\"</li>\n<li><strong>companyId</strong> field is optional, type 'integer'; required only when authenticating with a partner API key (resolves which company the user is created under)</li>\n</ul>\n","urlObject":{"path":["v3","api","user"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"16c2200a-fb2b-4b5c-9fa4-720144497578","name":"User created successfully. The user is also sent an invitation email.","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"email\": \"jane@acme.com\",\n  \"role\": \"Master Admin\",\n  \"companyId\": 1842\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/user"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 5501,\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"email\": \"jane@acme.com\",\n  \"role\": \"Master Admin\",\n  \"client\": 1842,\n  \"isEnabled\": true,\n  \"isTotalGrant\": true,\n  \"locationsCount\": 0,\n  \"statesCount\": 0,\n  \"lastLogin\": 1748275200000,\n  \"createdAt\": 1748275200000,\n  \"updatedAt\": 1748275200000\n}"},{"id":"42fe00c1-8d65-4002-9c72-461e48198683","name":"Validation or processing error.","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"email\": \"jane@acme.com\",\n  \"role\": \"Master Admin\",\n  \"companyId\": 1842\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/user"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Parameter missing check firstName and lastName\"\n}"},{"id":"45667090-9c57-4edd-9305-5e1aab8789a2","name":"Missing `Authorization` header, or neither the partner API key nor an active, non-archived company access token matches.","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"email\": \"jane@acme.com\",\n  \"role\": \"Master Admin\",\n  \"companyId\": 1842\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/user"},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"44800d77-9aee-495a-8273-cae4191e3757"},{"name":"PATCH user","id":"48381369-f1ea-483e-8c31-b34151569a89","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 5501,\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"email\": \"jane.doe@acme.com\",\n  \"role\": \"Manager\"\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/user","description":"<p>Update an existing user that belongs to the authenticated company. All\nbody fields except <code>id</code> are optional; omitted fields keep their\ncurrent values. If <code>email</code> is changed it must not collide with any\nexisting user.</p>\n<p>Fields:</p>\n<ul>\n<li><strong>id</strong> filed is required, type 'int';</li>\n<li><strong>firstName</strong> field is optional, type 'string';</li>\n<li><strong>lastName</strong> field is optional, type 'string';</li>\n<li><strong>email</strong> field is optional, type 'string';</li>\n<li><strong>role</strong> field is optional, type 'string', acceptable values are \"Analyst\", \"Manager\", \"Responder\", \"Master Admin\";</li>\n</ul>\n","urlObject":{"path":["v3","api","user"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"c27752c5-abf4-405f-8c73-1081a9197e46","name":"User updated successfully.","originalRequest":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 5501,\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"email\": \"jane.doe@acme.com\",\n  \"role\": \"Manager\"\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/user"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 5501,\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"email\": \"jane.doe@acme.com\",\n  \"role\": \"Manager\",\n  \"client\": 1842,\n  \"isEnabled\": true,\n  \"isTotalGrant\": true,\n  \"updatedAt\": 1748361600000\n}"},{"id":"ca06ea16-180b-46ff-bbf9-ac422313adda","name":"Validation or ownership error.","originalRequest":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 5501,\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"email\": \"jane.doe@acme.com\",\n  \"role\": \"Manager\"\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/user"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Id parameter missing\"\n}"},{"id":"83a80c2e-91e7-46d4-9278-97f9efaeaf14","name":"Missing or invalid `Authorization` header, or the access token does not match an active, non-archived company.","originalRequest":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 5501,\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"email\": \"jane.doe@acme.com\",\n  \"role\": \"Manager\"\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/user"},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"48381369-f1ea-483e-8c31-b34151569a89"},{"name":"DELETE user","id":"d00d0cfd-0b57-4d79-99e9-182fe6ea330b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 5501\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/user","description":"<p>Permanently delete a user that belongs to the authenticated company.\nReturns the deleted user record.</p>\n<p>Fields:</p>\n<ul>\n<li><strong>id</strong> field is required, type 'int';</li>\n</ul>\n","urlObject":{"path":["v3","api","user"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"6e8ae7d0-780b-4221-ad91-9fe2717433a7","name":"User deleted successfully. Returns the deleted user record.","originalRequest":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 5501\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/user"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 5501,\n  \"firstName\": \"Jane\",\n  \"lastName\": \"Doe\",\n  \"email\": \"jane@acme.com\",\n  \"role\": \"Master Admin\",\n  \"client\": 1842,\n  \"isEnabled\": true,\n  \"isTotalGrant\": true\n}"},{"id":"67169d25-214f-4b7e-b840-9d505b5a9984","name":"Validation or ownership error.","originalRequest":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 5501\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/user"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Id parameter missing\"\n}"},{"id":"5c179625-babc-4840-bac0-942bc3a6ccb5","name":"Missing or invalid `Authorization` header, or the access token does not match an active, non-archived company.","originalRequest":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 5501\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/user"},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"d00d0cfd-0b57-4d79-99e9-182fe6ea330b"},{"name":"GET users","id":"8f4b8f4f-3789-41e5-a706-105a29d8c3cc","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/v3/api/user?search=jane","description":"<p>List every user belonging to the authenticated company. Supports an\noptional <code>search</code> query that matches against the user's name and\nemail.</p>\n<p>Params:</p>\n<ul>\n<li><strong>search</strong> parameter is optional</li>\n</ul>\n","urlObject":{"path":["v3","api","user"],"host":["{{baseUrl}}"],"query":[{"key":"search","value":"jane"}],"variable":[]}},"response":[{"id":"74c5fba3-cae3-4f9f-b6f8-a98e6ce7ff60","name":"List of users belonging to the company.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v3/api/user?search=jane","host":["{{baseUrl}}"],"path":["v3","api","user"],"query":[{"key":"search","value":"jane"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"id\": 5501,\n    \"email\": \"jane@acme.com\",\n    \"client\": 1842,\n    \"firstName\": \"Jane\",\n    \"lastName\": \"Doe\",\n    \"role\": \"Master Admin\",\n    \"partner\": 7\n  },\n  {\n    \"id\": 5502,\n    \"email\": \"john@acme.com\",\n    \"client\": 1842,\n    \"firstName\": \"John\",\n    \"lastName\": \"Smith\",\n    \"role\": \"Manager\",\n    \"partner\": 7\n  }\n]"},{"id":"5d39bbbb-a19c-4a6e-aa32-c96932c99312","name":"Processing error.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v3/api/user?search=jane","host":["{{baseUrl}}"],"path":["v3","api","user"],"query":[{"key":"search","value":"jane"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Some data base error\"\n}"},{"id":"186683c1-f9d2-4516-b159-959fe16f1854","name":"Missing or invalid `Authorization` header, or the access token does not match an active, non-archived company.","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v3/api/user?search=jane","host":["{{baseUrl}}"],"path":["v3","api","user"],"query":[{"key":"search","value":"jane"}]}},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"8f4b8f4f-3789-41e5-a706-105a29d8c3cc"}],"id":"23e4bd5d-7c0e-4693-ba1d-10b200f174bf","_postman_id":"23e4bd5d-7c0e-4693-ba1d-10b200f174bf","description":""},{"name":"state","item":[{"name":"POST state","id":"74cfb891-c74a-4c62-879f-3b4389d0e5ea","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"title\": \"Dubai\",\n  \"brand\": 901\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/state","description":"<p>Create a new state (region) under an existing brand of the\nauthenticated company. The <code>(title, brand)</code> pair must be unique. The\nbrand must belong to the same company.</p>\n<p>Fields:</p>\n<ul>\n<li><strong>title</strong> field is required, type 'string';</li>\n<li><strong>brand</strong> field is required, type 'int';</li>\n</ul>\n","urlObject":{"path":["v3","api","state"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"d9184fe0-6ab8-4a3e-8b13-905a3c6c3352","name":"State created successfully.","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"title\": \"Dubai\",\n  \"brand\": 901\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/state"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 11,\n  \"title\": \"Dubai\",\n  \"brandTitle\": \"Acme\",\n  \"brand\": 901,\n  \"client\": 1842,\n  \"createdAt\": 1748275200000,\n  \"updatedAt\": 1748275200000,\n  \"isDefault\": false\n}"},{"id":"85bb38b4-920c-46a3-b705-f4d839644197","name":"Validation or processing error.","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"title\": \"Dubai\",\n  \"brand\": 901\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/state"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Title or brand parameter missing\"\n}"},{"id":"b9d11867-e6bc-469d-af53-cf44f11aad09","name":"Missing or invalid `Authorization` header, or the access token does not match an active, non-archived company.","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"title\": \"Dubai\",\n  \"brand\": 901\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/state"},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"74cfb891-c74a-4c62-879f-3b4389d0e5ea"},{"name":"PATCH state","id":"70c858e9-7a89-4222-b235-fd1156a6fd02","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 11,\n  \"title\": \"Dubai Marina\",\n  \"brand\": 901\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/state","description":"<p>Update a state's title and/or move it under a different brand. The\nstate and the target brand must both belong to the authenticated\ncompany. The resulting <code>(title, brand)</code> pair must remain unique.</p>\n<p>Fields:</p>\n<ul>\n<li><strong>id</strong> filed is required, type 'int';</li>\n<li><strong>title</strong> field is optional, type 'string';</li>\n<li><strong>brand</strong> field is optional, type 'int';</li>\n</ul>\n<p>One of the optional fields should be passed.</p>\n","urlObject":{"path":["v3","api","state"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"ee4e0d0f-0253-444b-af00-bee052af6ceb","name":"State updated successfully.","originalRequest":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 11,\n  \"title\": \"Dubai Marina\",\n  \"brand\": 901\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/state"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 11,\n  \"title\": \"Dubai Marina\",\n  \"brandTitle\": \"Acme\",\n  \"brand\": 901,\n  \"client\": 1842,\n  \"createdAt\": 1748275200000,\n  \"updatedAt\": 1748361600000,\n  \"isDefault\": false\n}"},{"id":"a3c4bc84-9af6-4653-b94c-05ab41875b6f","name":"Validation or processing error.","originalRequest":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 11,\n  \"title\": \"Dubai Marina\",\n  \"brand\": 901\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/state"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Id parameter missing\"\n}"},{"id":"edd48e38-f355-41a5-9e75-c2d8b2e76bf3","name":"Missing or invalid `Authorization` header, or the access token does not match an active, non-archived company.","originalRequest":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 11,\n  \"title\": \"Dubai Marina\",\n  \"brand\": 901\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/state"},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"70c858e9-7a89-4222-b235-fd1156a6fd02"},{"name":"DELETE state","id":"208d285d-0a8d-46c3-bdee-61be3dc5ad25","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 11\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/state","description":"<p>Delete a state belonging to the authenticated company. The state must\nbelong to the same company. Locations under this state will be\nreassigned to the brand's default state.</p>\n<p>Fields:</p>\n<ul>\n<li><strong>id</strong> filed is required, type 'int';</li>\n</ul>\n","urlObject":{"path":["v3","api","state"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"8285e7cb-9eeb-4752-a931-3050790aea92","name":"State deleted successfully.","originalRequest":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 11\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/state"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"id\": 11,\n    \"title\": \"Dubai\",\n    \"brandTitle\": \"Acme\",\n    \"brand\": 901,\n    \"client\": 1842,\n    \"isDefault\": false,\n    \"createdAt\": 1748275200000,\n    \"updatedAt\": 1748275200000\n  }\n]"},{"id":"4ca7d085-be61-4093-ac54-178bfade332d","name":"Validation or processing error.","originalRequest":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 11\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/state"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Id parameter missing\"\n}"},{"id":"38261a61-77f0-4822-98fa-e7e180beea6e","name":"Missing or invalid `Authorization` header, or the access token does not match an active, non-archived company.","originalRequest":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 11\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/state"},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"208d285d-0a8d-46c3-bdee-61be3dc5ad25"},{"name":"GET states","id":"5125388a-6991-4ace-8e3c-ebd764bf4ad4","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/v3/api/state","description":"<p>List every state belonging to the authenticated company. Returns only\nthe core fields: <code>id</code>, <code>title</code>, <code>brandTitle</code>, <code>client</code>, <code>brand</code>.</p>\n","urlObject":{"path":["v3","api","state"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"d747a72d-2380-477d-8252-6b68d9ff3412","name":"List of states belonging to the company.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/v3/api/state"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"id\": 11,\n    \"title\": \"Dubai\",\n    \"brandTitle\": \"Acme\",\n    \"client\": 1842,\n    \"brand\": 901\n  },\n  {\n    \"id\": 12,\n    \"title\": \"Abu Dhabi\",\n    \"brandTitle\": \"Acme\",\n    \"client\": 1842,\n    \"brand\": 901\n  }\n]"},{"id":"4cf2be02-d0ed-45ab-be49-3314c90cc2ed","name":"Processing error.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/v3/api/state"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Some data base error\"\n}"},{"id":"e2a6795b-249a-41c4-9928-1214ce379127","name":"Missing or invalid `Authorization` header, or the access token does not match an active, non-archived company.","originalRequest":{"method":"GET","header":[],"url":"{{baseUrl}}/v3/api/state"},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"5125388a-6991-4ace-8e3c-ebd764bf4ad4"}],"id":"44989481-4032-440e-a8a3-52745befb4bd","_postman_id":"44989481-4032-440e-a8a3-52745befb4bd","description":""},{"name":"insights","item":[{"name":"GET insight categories","id":"9d628ff4-4896-48c5-9a5d-192d3a167b3c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/v3/api/insights/categories","description":"<p>Returns the tree of sentiment insight categories applicable to the\nauthenticated client's <code>companyType</code>. Each top-level entry is a\nprimary category and may contain child secondary categories under\n<code>children</code>. A primary category that has no real children gets a\nsingle synthetic child titled <code>\"&lt;Category&gt; General\"</code> so that the\nclient always renders a leaf row.</p>\n<p>Used to populate filter selectors and chart legends. No filtering;\nthe response is fully determined by the client's company type.</p>\n","urlObject":{"path":["v3","api","insights","categories"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"68ab543b-3572-4690-84a3-fc9c3bffa804","name":"Category tree for the client's company type.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/v3/api/insights/categories"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"title\": \"Service\",\n    \"id\": 12,\n    \"shortName\": \"Serv\",\n    \"shortNegativeName\": \"Bad service\",\n    \"key\": 12,\n    \"color\": \"#FF6B6B\",\n    \"translations\": {\n      \"en\": \"Service\",\n      \"ar\": \"الخدمة\"\n    },\n    \"children\": [\n      {\n        \"id\": 22,\n        \"title\": \"Staff friendliness\",\n        \"shortName\": \"Staff\",\n        \"shortNegativeName\": \"Rude staff\",\n        \"key\": 22,\n        \"color\": null,\n        \"translations\": {\n          \"en\": \"Staff friendliness\",\n          \"ar\": \"مودة الموظفين\"\n        }\n      }\n    ]\n  },\n  {\n    \"title\": \"Food\",\n    \"id\": 13,\n    \"shortName\": \"Food\",\n    \"shortNegativeName\": \"Bad food\",\n    \"key\": 13,\n    \"color\": \"#4ECDC4\",\n    \"translations\": {\n      \"en\": \"Food\",\n      \"ar\": \"الطعام\"\n    },\n    \"children\": [\n      {\n        \"id\": 13,\n        \"title\": \"Food General\",\n        \"shortName\": \"Food\",\n        \"shortNegativeName\": \"Bad food\",\n        \"key\": 13,\n        \"color\": \"#4ECDC4\",\n        \"translations\": {\n          \"en\": \"Food\",\n          \"ar\": \"الطعام\"\n        }\n      }\n    ]\n  }\n]"},{"id":"c322e473-b035-44bd-81c4-b70c78c1dfd4","name":"Validation or processing error.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/v3/api/insights/categories"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Can't find type for company 1842\"\n}"},{"id":"1dbc792d-4ed3-4354-b017-57324b7a84a1","name":"Missing or invalid `Authorization` header, or the access token does not match an active, non-archived company.","originalRequest":{"method":"GET","header":[],"url":"{{baseUrl}}/v3/api/insights/categories"},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"9d628ff4-4896-48c5-9a5d-192d3a167b3c"},{"name":"GET sentiment words","id":"5386de04-1adc-4464-96ed-58e071692c9a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/v3/api/insights/words?services=Google,Facebook&locations=4501,4502&states=11,12&date_from=2026-01-01&date_to=2026-06-01&page=1","description":"<p>Extracts the per-review <code>menuItems</code> field across the filtered review\nset, splits each entry into individual words, and buckets them by\nthe review's <code>ratingValue</code> (≥ 3 ⇒ <code>positive</code>, otherwise ⇒\n<code>negative</code>). Words are normalised to lowercase for grouping but the\noriginal casing is preserved in the response.</p>\n<p>The response is always a single-element array; each side is an\nobject keyed by the normalised word, with the original <code>word</code> text\nand the number of occurrences.</p>\n<p>Params:</p>\n<ul>\n<li><p><strong>page</strong> parameter is optional, by default page = 1;</p>\n</li>\n<li><p><strong>services</strong> parameter is optional, comma separated service names;</p>\n</li>\n<li><p><strong>locations</strong> parameter is optional, comma separated location ids;</p>\n</li>\n<li><p><strong>states</strong> parameter is optional, comma separated state ids;</p>\n</li>\n<li><p><strong>date_from</strong> parameter is optional, format yyyy-mm-dd;</p>\n</li>\n<li><p><strong>date_to</strong> parameter is optional, format yyyy-mm-dd;</p>\n</li>\n</ul>\n","urlObject":{"path":["v3","api","insights","words"],"host":["{{baseUrl}}"],"query":[{"key":"services","value":"Google,Facebook"},{"key":"locations","value":"4501,4502"},{"key":"states","value":"11,12"},{"key":"date_from","value":"2026-01-01"},{"key":"date_to","value":"2026-06-01"},{"key":"page","value":"1"}],"variable":[]}},"response":[{"id":"449daedc-2579-46ce-94d3-af0216bbfe86","name":"Positive and negative word buckets with occurrence counts.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v3/api/insights/words?services=Google,Facebook&locations=4501,4502&states=11,12&date_from=2026-01-01&date_to=2026-06-01&page=1","host":["{{baseUrl}}"],"path":["v3","api","insights","words"],"query":[{"key":"services","value":"Google,Facebook"},{"key":"locations","value":"4501,4502"},{"key":"states","value":"11,12"},{"key":"date_from","value":"2026-01-01"},{"key":"date_to","value":"2026-06-01"},{"key":"page","value":"1"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"positive\": {\n      \"coffee\": {\n        \"word\": \"coffee\",\n        \"count\": 87\n      },\n      \"latte\": {\n        \"word\": \"latte\",\n        \"count\": 42\n      },\n      \"friendly\": {\n        \"word\": \"friendly\",\n        \"count\": 35\n      }\n    },\n    \"negative\": {\n      \"cold\": {\n        \"word\": \"cold\",\n        \"count\": 9\n      },\n      \"slow\": {\n        \"word\": \"slow\",\n        \"count\": 6\n      }\n    }\n  }\n]"},{"id":"bfc1319e-44cb-495b-b3ba-02ac7836d718","name":"Validation or processing error.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v3/api/insights/words?services=Google,Facebook&locations=4501,4502&states=11,12&date_from=2026-01-01&date_to=2026-06-01&page=1","host":["{{baseUrl}}"],"path":["v3","api","insights","words"],"query":[{"key":"services","value":"Google,Facebook"},{"key":"locations","value":"4501,4502"},{"key":"states","value":"11,12"},{"key":"date_from","value":"2026-01-01"},{"key":"date_to","value":"2026-06-01"},{"key":"page","value":"1"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Some data base error\"\n}"},{"id":"4be2519e-cfa4-4257-8901-06adee9badac","name":"Missing or invalid `Authorization` header, or the access token does not match an active, non-archived company.","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v3/api/insights/words?services=Google,Facebook&locations=4501,4502&states=11,12&date_from=2026-01-01&date_to=2026-06-01&page=1","host":["{{baseUrl}}"],"path":["v3","api","insights","words"],"query":[{"key":"services","value":"Google,Facebook"},{"key":"locations","value":"4501,4502"},{"key":"states","value":"11,12"},{"key":"date_from","value":"2026-01-01"},{"key":"date_to","value":"2026-06-01"},{"key":"page","value":"1"}]}},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"5386de04-1adc-4464-96ed-58e071692c9a"},{"name":"GET menu items dictionary","id":"5f12ab08-611f-4894-a5a8-b62ced4804c8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/v3/api/insights/menu","description":"<p>Returns the configured menu-item dictionary as a flat list of\nstrings. This is the dictionary used by the back-office word\nextractor to detect food / menu / product terms inside review text\nand tag them on each <code>Review.menuItems</code> field; the same list is\nuseful client-side as a hint dataset (e.g. autocomplete) when\nnavigating the words endpoint.</p>\n<p>Returns every dictionary entry. No filtering.</p>\n","urlObject":{"path":["v3","api","insights","menu"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"d83678c9-20e7-4cff-900c-70ec6d1f2a2f","name":"Menu-item dictionary (flat list of strings).","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/v3/api/insights/menu"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"[\n  \"latte\",\n  \"cappuccino\",\n  \"americano\",\n  \"cold brew\",\n  \"croissant\",\n  \"tiramisu\"\n]"},{"id":"b921b04e-0ba1-4ff6-96e6-d1a97a1c038d","name":"Processing error.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/v3/api/insights/menu"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Some data base error\"\n}"},{"id":"146ee483-dcb7-4f55-a305-ba12b2763aa6","name":"Missing or invalid `Authorization` header, or the access token does not match an active, non-archived company.","originalRequest":{"method":"GET","header":[],"url":"{{baseUrl}}/v3/api/insights/menu"},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"5f12ab08-611f-4894-a5a8-b62ced4804c8"},{"name":"GET secondary insights","id":"8a98765a-4efa-4787-8acb-2673ed2e2258","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/v3/api/insights/secondary?services=Google,Facebook&locations=4501,4502&states=11,12&date_from=2026-01-01&date_to=2026-06-01&page=1","description":"<p>Returns absolute positive and negative review counts per secondary\n(child) category for the filtered review set, plus the <code>parentId</code>\nlinking each secondary back to its primary. The <code>gap</code> field\n(<code>total / 500</code>) is a rendering hint used by the front-end radar\nchart to space points; <code>fullMark</code> is <code>(pos + neg) * 1.2</code> so the\nchart always has some headroom above the largest value.</p>\n<p>Params:</p>\n<ul>\n<li><p><strong>page</strong> parameter is optional, by default page = 1;</p>\n</li>\n<li><p><strong>services</strong> parameter is optional, comma separated service names;</p>\n</li>\n<li><p><strong>locations</strong> parameter is optional, comma separated location ids;</p>\n</li>\n<li><p><strong>states</strong> parameter is optional, comma separated state ids;</p>\n</li>\n<li><p><strong>date_from</strong> parameter is optional, format yyyy-mm-dd;</p>\n</li>\n<li><p><strong>date_to</strong> parameter is optional, format yyyy-mm-dd;</p>\n</li>\n</ul>\n","urlObject":{"path":["v3","api","insights","secondary"],"host":["{{baseUrl}}"],"query":[{"key":"services","value":"Google,Facebook"},{"key":"locations","value":"4501,4502"},{"key":"states","value":"11,12"},{"key":"date_from","value":"2026-01-01"},{"key":"date_to","value":"2026-06-01"},{"key":"page","value":"1"}],"variable":[]}},"response":[{"id":"2baa24df-b40f-4304-9ab0-e86b9052c653","name":"Per-secondary-category positive/negative counts.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v3/api/insights/secondary?services=Google,Facebook&locations=4501,4502&states=11,12&date_from=2026-01-01&date_to=2026-06-01&page=1","host":["{{baseUrl}}"],"path":["v3","api","insights","secondary"],"query":[{"key":"services","value":"Google,Facebook"},{"key":"locations","value":"4501,4502"},{"key":"states","value":"11,12"},{"key":"date_from","value":"2026-01-01"},{"key":"date_to","value":"2026-06-01"},{"key":"page","value":"1"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"categoryId\": 22,\n    \"parentId\": 12,\n    \"subject\": \"Staff friendliness\",\n    \"key\": \"Staff\",\n    \"fullMark\": 96,\n    \"pos\": 60,\n    \"neg\": 20,\n    \"gap\": 0.16\n  },\n  {\n    \"categoryId\": 23,\n    \"parentId\": 12,\n    \"subject\": \"Speed\",\n    \"key\": \"Speed\",\n    \"fullMark\": 36,\n    \"pos\": 18,\n    \"neg\": 12,\n    \"gap\": 0.06\n  }\n]"},{"id":"36e5dc0f-2269-4fc7-bf41-49c5017d584f","name":"Validation or processing error.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v3/api/insights/secondary?services=Google,Facebook&locations=4501,4502&states=11,12&date_from=2026-01-01&date_to=2026-06-01&page=1","host":["{{baseUrl}}"],"path":["v3","api","insights","secondary"],"query":[{"key":"services","value":"Google,Facebook"},{"key":"locations","value":"4501,4502"},{"key":"states","value":"11,12"},{"key":"date_from","value":"2026-01-01"},{"key":"date_to","value":"2026-06-01"},{"key":"page","value":"1"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Can not count reviews for primary categories\"\n}"},{"id":"3214cd7d-c691-4857-b264-5d83e1b93009","name":"Missing or invalid `Authorization` header, or the access token does not match an active, non-archived company.","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v3/api/insights/secondary?services=Google,Facebook&locations=4501,4502&states=11,12&date_from=2026-01-01&date_to=2026-06-01&page=1","host":["{{baseUrl}}"],"path":["v3","api","insights","secondary"],"query":[{"key":"services","value":"Google,Facebook"},{"key":"locations","value":"4501,4502"},{"key":"states","value":"11,12"},{"key":"date_from","value":"2026-01-01"},{"key":"date_to","value":"2026-06-01"},{"key":"page","value":"1"}]}},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"8a98765a-4efa-4787-8acb-2673ed2e2258"},{"name":"GET primary insights","id":"2782264f-6f57-4d33-ab94-8a0dd4305a46","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/v3/api/insights/primary?services=Google,Facebook,TripAdvisor&locations=4501,4502&states=11,12&date_from=2026-01-01&date_to=2026-06-01&page=1","description":"<p>Returns the positive/negative distribution (as percentages of total\ncategory-tagged reviews) for each primary insight category that\napplies to the client's company type, computed over the filtered\nreview set. Reviews tagged against a secondary category are rolled up\nto their primary parent. Designed to feed the primary radar chart.</p>\n<p>Params:</p>\n<ul>\n<li><p><strong>page</strong> parameter is optional, by default page = 1;</p>\n</li>\n<li><p><strong>services</strong> parameter is optional, comma separated service names;</p>\n</li>\n<li><p><strong>locations</strong> parameter is optional, comma separated location ids;</p>\n</li>\n<li><p><strong>states</strong> parameter is optional, comma separated state ids;</p>\n</li>\n<li><p><strong>date_from</strong> parameter is optional, format yyyy-mm-dd;</p>\n</li>\n<li><p><strong>date_to</strong> parameter is optional, format yyyy-mm-dd;</p>\n</li>\n</ul>\n","urlObject":{"path":["v3","api","insights","primary"],"host":["{{baseUrl}}"],"query":[{"key":"services","value":"Google,Facebook,TripAdvisor"},{"key":"locations","value":"4501,4502"},{"key":"states","value":"11,12"},{"key":"date_from","value":"2026-01-01"},{"key":"date_to","value":"2026-06-01"},{"key":"page","value":"1"}],"variable":[]}},"response":[{"id":"10d86e07-cf58-4cc2-8a66-9d8d95d5365c","name":"Per-primary-category positive/negative percentages.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v3/api/insights/primary?services=Google,Facebook,TripAdvisor&locations=4501,4502&states=11,12&date_from=2026-01-01&date_to=2026-06-01&page=1","host":["{{baseUrl}}"],"path":["v3","api","insights","primary"],"query":[{"key":"services","value":"Google,Facebook,TripAdvisor"},{"key":"locations","value":"4501,4502"},{"key":"states","value":"11,12"},{"key":"date_from","value":"2026-01-01"},{"key":"date_to","value":"2026-06-01"},{"key":"page","value":"1"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"id\": 12,\n    \"subject\": \"Service\",\n    \"fullMark\": 100,\n    \"pos\": \"76.42\",\n    \"neg\": \"23.58\"\n  },\n  {\n    \"id\": 13,\n    \"subject\": \"Food\",\n    \"fullMark\": 100,\n    \"pos\": \"81.00\",\n    \"neg\": \"19.00\"\n  },\n  {\n    \"id\": 14,\n    \"subject\": \"Ambience\",\n    \"fullMark\": 100,\n    \"pos\": 0,\n    \"neg\": 0\n  }\n]"},{"id":"6de44e0a-0a6b-48f6-9d03-b0f76cb539d5","name":"Validation or processing error.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v3/api/insights/primary?services=Google,Facebook,TripAdvisor&locations=4501,4502&states=11,12&date_from=2026-01-01&date_to=2026-06-01&page=1","host":["{{baseUrl}}"],"path":["v3","api","insights","primary"],"query":[{"key":"services","value":"Google,Facebook,TripAdvisor"},{"key":"locations","value":"4501,4502"},{"key":"states","value":"11,12"},{"key":"date_from","value":"2026-01-01"},{"key":"date_to","value":"2026-06-01"},{"key":"page","value":"1"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Wrong action parameter can be \\\"updated\\\" or \\\"deleted\\\"\"\n}"},{"id":"e456cb82-627e-43b7-9875-b37dbf2aa6fb","name":"Missing or invalid `Authorization` header, or the access token does not match an active, non-archived company.","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v3/api/insights/primary?services=Google,Facebook,TripAdvisor&locations=4501,4502&states=11,12&date_from=2026-01-01&date_to=2026-06-01&page=1","host":["{{baseUrl}}"],"path":["v3","api","insights","primary"],"query":[{"key":"services","value":"Google,Facebook,TripAdvisor"},{"key":"locations","value":"4501,4502"},{"key":"states","value":"11,12"},{"key":"date_from","value":"2026-01-01"},{"key":"date_to","value":"2026-06-01"},{"key":"page","value":"1"}]}},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"2782264f-6f57-4d33-ab94-8a0dd4305a46"}],"id":"245cfe25-141d-4cf9-81fa-4484ffb38f84","_postman_id":"245cfe25-141d-4cf9-81fa-4484ffb38f84","description":""},{"name":"brand","item":[{"name":"POST brand","id":"d8f24356-2c2c-48fb-ae4e-c3b8e5c80b7c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"title\": \"Acme\"\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/brand","description":"<p>Create a new brand under the authenticated company. The title must not\ncollide with any existing brand under the provided company.</p>\n<p>Fields:</p>\n<ul>\n<li><strong>title</strong> field is required, type 'string';</li>\n</ul>\n","urlObject":{"path":["v3","api","brand"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"67131e1b-aa09-4fce-b320-21f279a9b438","name":"Brand created successfully.","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"title\": \"Acme\"\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/brand"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 901,\n  \"title\": \"Acme\",\n  \"client\": 1842,\n  \"createdAt\": 1748275200000,\n  \"updatedAt\": 1748275200000,\n  \"isDefault\": false\n}"},{"id":"45b861f7-7d32-406b-9fd1-67aa66132022","name":"Validation or processing error.","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"title\": \"Acme\"\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/brand"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Title parameter missing\"\n}"},{"id":"c175f163-4108-4232-811d-cd4233198b74","name":"Missing or invalid `Authorization` header, the access token does not match a company, the company is archived / not in `Active` status, or the company's partner is not in `Active` status.","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"title\": \"Acme\"\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/brand"},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"d8f24356-2c2c-48fb-ae4e-c3b8e5c80b7c"},{"name":"PATCH brand","id":"18e08cb4-bf8f-4f72-bca7-d48a7f00e986","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 901,\n  \"title\": \"Acme Updated\"\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/brand","description":"<p>Update a brand's title. The brand must belong to the authenticated\ncompany, and the new title must not already be in use by another brand\nin that company.</p>\n<p>Fields:</p>\n<ul>\n<li><strong>id</strong> filed is required, type 'int';</li>\n<li><strong>title</strong> field is required, type 'string';</li>\n</ul>\n","urlObject":{"path":["v3","api","brand"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"542c08ec-ede0-477e-94fc-df980bbcfbd2","name":"Brand updated successfully.","originalRequest":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 901,\n  \"title\": \"Acme Updated\"\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/brand"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"id\": 901,\n  \"title\": \"Acme Updated\",\n  \"client\": 1842,\n  \"createdAt\": 1748275200000,\n  \"updatedAt\": 1748361600000,\n  \"isDefault\": false\n}"},{"id":"521db658-2705-4e28-b443-ddce83c71b33","name":"Validation or processing error.","originalRequest":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 901,\n  \"title\": \"Acme Updated\"\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/brand"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Id parameter missing\"\n}"},{"id":"5a634d36-c7c1-4fb2-9d6d-bb113bcf6091","name":"Missing or invalid `Authorization` header, or the access token does not match an active, non-archived company.","originalRequest":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 901,\n  \"title\": \"Acme Updated\"\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/brand"},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"18e08cb4-bf8f-4f72-bca7-d48a7f00e986"},{"name":"DELETE brand","id":"ed42a4aa-cce0-479e-ab82-cb5fe6d3c9ab","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 901\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/brand","description":"<p>Delete a brand belonging to the authenticated company. The brand must\nbelong to the same company. Any states and locations associated with\nthe brand will be reassigned or removed according to the cascade\nrules defined in the data model.</p>\n<p>Fields:</p>\n<ul>\n<li><strong>id</strong> filed is required, type 'int';</li>\n</ul>\n","urlObject":{"path":["v3","api","brand"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"0f0ce42d-3f45-40bd-b1c5-56887e6c54d6","name":"Brand deleted successfully.","originalRequest":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 901\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/brand"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"id\": 901,\n    \"title\": \"Acme\",\n    \"client\": 1842,\n    \"isDefault\": false,\n    \"createdAt\": 1748275200000,\n    \"updatedAt\": 1748275200000\n  }\n]"},{"id":"e991ebed-b768-44e6-aa85-1e62ac6c501f","name":"Validation or processing error.","originalRequest":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 901\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/brand"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Id parameter missing\"\n}"},{"id":"5de288d1-e4fd-4f53-a0d2-e44efd49cc47","name":"Missing or invalid `Authorization` header, or the access token does not match an active, non-archived company.","originalRequest":{"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"id\": 901\n}","options":{"raw":{"headerFamily":"json","language":"json"}}},"url":"{{baseUrl}}/v3/api/brand"},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"ed42a4aa-cce0-479e-ab82-cb5fe6d3c9ab"},{"name":"GET brands","id":"c537aeec-5916-4ada-8650-eb08515807c1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/v3/api/brand","description":"<p>List every brand belonging to the authenticated company. Returns the\nraw brand records (no nested states or locations).</p>\n","urlObject":{"path":["v3","api","brand"],"host":["{{baseUrl}}"],"query":[],"variable":[]}},"response":[{"id":"aa0ad507-3c03-4515-9593-400d4d2f2e77","name":"List of brands belonging to the company.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/v3/api/brand"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"[\n  {\n    \"id\": 901,\n    \"title\": \"Acme\",\n    \"client\": 1842,\n    \"isDefault\": false,\n    \"photoUrl\": \"https://cdn.localyser.com/brands/acme.png\",\n    \"createdAt\": 1748275200000,\n    \"updatedAt\": 1748275200000\n  },\n  {\n    \"id\": 903,\n    \"title\": \"Other\",\n    \"client\": 1842,\n    \"isDefault\": true,\n    \"photoUrl\": null,\n    \"createdAt\": 1748275200000,\n    \"updatedAt\": 1748275200000\n  }\n]"},{"id":"2c8c938b-ef46-45f4-ae2a-fb70f8018a9a","name":"Processing error.","originalRequest":{"method":"GET","header":[{"key":"Accept","value":"application/json"}],"url":"{{baseUrl}}/v3/api/brand"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"details\": \"Some data base error\"\n}"},{"id":"4571016a-8fdd-44f8-97d2-775dbe443b7d","name":"Missing or invalid `Authorization` header, or the access token does not match an active, non-archived company.","originalRequest":{"method":"GET","header":[],"url":"{{baseUrl}}/v3/api/brand"},"status":"Forbidden","code":403,"_postman_previewlanguage":"text","header":[],"cookie":[],"responseTime":null,"body":""}],"_postman_id":"c537aeec-5916-4ada-8650-eb08515807c1"}],"id":"5a0a5344-87de-469a-b351-9df3bc70b70d","_postman_id":"5a0a5344-87de-469a-b351-9df3bc70b70d","description":""}],"id":"94190766-da02-4973-b6c5-1e89d2d32856","description":"<h3 id=\"localyser-company-api\">Localyser Company API</h3>\n<p>The <strong>Localyser Company API</strong> gives a connected business programmatic access to everything needed to manage its review presence:</p>\n<ul>\n<li><p>Brand and region structure</p>\n</li>\n<li><p>Physical locations</p>\n</li>\n<li><p>Team members and permissions</p>\n</li>\n<li><p>Reviews and replies</p>\n</li>\n<li><p>Review analytics and insights</p>\n</li>\n</ul>\n<p>All endpoints are available under the <code>/v3/api</code> prefix and are automatically scoped to the company associated with the access token used for authentication.</p>\n<hr />\n<h2 id=\"authentication\">Authentication</h2>\n<p>Every request must include a company access token in the <code>Authorization</code> header:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>Authorization: &lt;your-company-access-token&gt;\n\n</code></pre><p>The token is issued when the company is provisioned and uniquely identifies that company.</p>\n<p>Requests return <strong>403 Forbidden</strong> if:</p>\n<ul>\n<li><p>The token is missing</p>\n</li>\n<li><p>The token is invalid or unknown</p>\n</li>\n<li><p>The company is archived</p>\n</li>\n<li><p>The company is not in <strong>Active</strong> status</p>\n</li>\n<li><p>The partner associated with the company is not in <strong>Active</strong> status</p>\n</li>\n</ul>\n<blockquote>\n<p>&lt;p &gt;Treat access tokens like passwords. Rotate them immediately if they become exposed.&lt;/p&gt; </p>\n</blockquote>\n<hr />\n<h1 id=\"resources\">Resources</h1>\n<h2 id=\"brands\">Brands</h2>\n<p><strong>Endpoint:</strong> <code>/v3/api/brand</code></p>\n<p>Brands are used to group locations within a company and support multi-brand organizations.</p>\n<h3 id=\"available-operations\">Available Operations</h3>\n<h4 id=\"create-a-brand\">Create a Brand</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>POST /v3/api/brand\n\n</code></pre><p>Creates a new brand.</p>\n<p>Requirements:</p>\n<ul>\n<li>Brand title must be unique within the company.</li>\n</ul>\n<h4 id=\"update-a-brand\">Update a Brand</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>PATCH /v3/api/brand\n\n</code></pre><p>Renames an existing brand.</p>\n<h4 id=\"delete-a-brand\">Delete a Brand</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>DELETE /v3/api/brand\n\n</code></pre><p>Deletes a brand.</p>\n<p>Associated states and locations are handled according to the platform's cascade rules.</p>\n<h4 id=\"list-brands\">List Brands</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET /v3/api/brand\n\n</code></pre><p>Returns all brands belonging to the company.</p>\n<hr />\n<h2 id=\"states-regions\">States (Regions)</h2>\n<p><strong>Endpoint:</strong> <code>/v3/api/state</code></p>\n<p>States (regions) belong to a brand and group locations within that brand.</p>\n<p>Uniqueness rule:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>(title, brand)\n\n</code></pre><p>must be unique.</p>\n<h3 id=\"available-operations-1\">Available Operations</h3>\n<h4 id=\"create-a-state\">Create a State</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>POST /v3/api/state\n\n</code></pre><p>Creates a state under a specified brand.</p>\n<h4 id=\"update-a-state\">Update a State</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>PATCH /v3/api/state\n\n</code></pre><p>Allows:</p>\n<ul>\n<li><p>Renaming a state</p>\n</li>\n<li><p>Moving a state to another brand</p>\n</li>\n</ul>\n<h4 id=\"delete-a-state\">Delete a State</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>DELETE /v3/api/state\n\n</code></pre><p>Deletes a state.</p>\n<p>Any child locations are reassigned to the brand's default state.</p>\n<h4 id=\"list-states\">List States</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET /v3/api/state\n\n</code></pre><p>Returns all states belonging to the company.</p>\n<hr />\n<h2 id=\"locations\">Locations</h2>\n<p><strong>Endpoint:</strong> <code>/v3/api/location</code></p>\n<p>Locations represent the physical places whose reviews are tracked.</p>\n<p>Each location:</p>\n<ul>\n<li><p>Belongs to a state</p>\n</li>\n<li><p>Inherits its brand through the state</p>\n</li>\n<li><p>Can be connected to multiple review platforms</p>\n</li>\n</ul>\n<p>Supported sources include:</p>\n<ul>\n<li><p>Google</p>\n</li>\n<li><p>Facebook</p>\n</li>\n<li><p>TripAdvisor</p>\n</li>\n<li><p>Zomato</p>\n</li>\n<li><p>Booking</p>\n</li>\n<li><p>Talabat</p>\n</li>\n<li><p>HungerStation</p>\n</li>\n<li><p>Expedia</p>\n</li>\n<li><p>Deliveroo</p>\n</li>\n<li><p>DoorDash</p>\n</li>\n<li><p>Other supported review services</p>\n</li>\n</ul>\n<h3 id=\"available-operations-2\">Available Operations</h3>\n<h4 id=\"create-a-location\">Create a Location</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>POST /v3/api/location\n\n</code></pre><p>Creates a location with:</p>\n<ul>\n<li><p>Source URLs</p>\n</li>\n<li><p>Contact information</p>\n</li>\n<li><p>Location metadata</p>\n</li>\n</ul>\n<p>The endpoint enforces the company's <code>locationsLimit</code>.</p>\n<h4 id=\"update-a-location\">Update a Location</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>PATCH /v3/api/location\n\n</code></pre><p>Allows updates to:</p>\n<ul>\n<li><p>Title</p>\n</li>\n<li><p>Address</p>\n</li>\n<li><p>Contact details</p>\n</li>\n<li><p>Source connections</p>\n</li>\n<li><p>State assignment</p>\n</li>\n</ul>\n<h4 id=\"delete-a-location\">Delete a Location</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>DELETE /v3/api/location\n\n</code></pre><p>Soft-deletes a location:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{  \"isHidden\": true}\n\n</code></pre><h4 id=\"list-locations\">List Locations</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET /v3/api/location\n\n</code></pre><p>Returns a paginated list of visible locations with full configuration details, including:</p>\n<ul>\n<li><p>Primary review sources</p>\n</li>\n<li><p>Additional review sources</p>\n</li>\n<li><p>Delivery integration IDs</p>\n</li>\n<li><p>Country code</p>\n</li>\n<li><p>Service credentials</p>\n</li>\n<li><p>Customer support email</p>\n</li>\n<li><p>POS ID</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"users\">Users</h2>\n<p><strong>Endpoint:</strong> <code>/v3/api/user</code></p>\n<p>Manage users who have access to company data.</p>\n<h3 id=\"available-operations-3\">Available Operations</h3>\n<h4 id=\"invite-a-user\">Invite a User</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>POST /v3/api/user\n\n</code></pre><p>Creates a new user invitation with a specified role.</p>\n<h4 id=\"update-a-user\">Update a User</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>PATCH /v3/api/user\n\n</code></pre><p>Allows updates to:</p>\n<ul>\n<li><p>Name</p>\n</li>\n<li><p>Role</p>\n</li>\n<li><p>Access scope</p>\n</li>\n</ul>\n<h4 id=\"delete-a-user\">Delete a User</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>DELETE /v3/api/user\n\n</code></pre><p>Removes a user from the company.</p>\n<h4 id=\"list-users\">List Users</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET /v3/api/user\n\n</code></pre><p>Returns all users belonging to the company.</p>\n<hr />\n<h1 id=\"reviews\">Reviews</h1>\n<h2 id=\"review-feed\">Review Feed</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET /v3/api/reviews\n\n</code></pre><p>Returns a paginated feed of reviews.</p>\n<h3 id=\"supported-filters\">Supported Filters</h3>\n<ul>\n<li><p>Services (review sources)</p>\n</li>\n<li><p>Brands</p>\n</li>\n<li><p>States</p>\n</li>\n<li><p>Locations</p>\n</li>\n<li><p>Star ratings</p>\n</li>\n<li><p>Date ranges</p>\n</li>\n</ul>\n<h3 id=\"supported-sorting\">Supported Sorting</h3>\n<ul>\n<li><p>Review date</p>\n</li>\n<li><p>Sentiment score</p>\n</li>\n<li><p>Review length</p>\n</li>\n</ul>\n<p>Sorting can be performed in ascending or descending order.</p>\n<p>Each review includes:</p>\n<ul>\n<li><p>Full review data</p>\n</li>\n<li><p><code>brandTitle</code></p>\n</li>\n<li><p><code>locationId</code></p>\n</li>\n</ul>\n<hr />\n<h2 id=\"review-summary-by-location\">Review Summary by Location</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET /v3/api/locations/reviews\n\n</code></pre><p>Returns per-location review statistics:</p>\n<ul>\n<li><p>Average rating</p>\n</li>\n<li><p>Review count</p>\n</li>\n<li><p>Breakdown by source</p>\n</li>\n</ul>\n<p>Useful for dashboards and overview pages.</p>\n<hr />\n<h1 id=\"insights\">Insights</h1>\n<p><strong>Endpoint:</strong> <code>/v3/api/insights/\\\\*</code></p>\n<p>Insights are analytics generated from the review dataset.</p>\n<p>All insight endpoints support the same filtering model:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>serviceslocationsstatesdate_fromdate_topage\n\n</code></pre><p>Results are automatically restricted to locations owned by the authenticated company.</p>\n<hr />\n<h2 id=\"categories\">Categories</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET /v3/api/insights/categories\n\n</code></pre><p>Returns the sentiment-category hierarchy configured for the company's <code>companyType</code>.</p>\n<hr />\n<h2 id=\"primary-insights\">Primary Insights</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET /v3/api/insights/primary\n\n</code></pre><p>Returns positive and negative sentiment percentages grouped by primary insight categories.</p>\n<hr />\n<h2 id=\"secondary-insights\">Secondary Insights</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET /v3/api/insights/secondary\n\n</code></pre><p>Returns:</p>\n<ul>\n<li><p>Positive review counts</p>\n</li>\n<li><p>Negative review counts</p>\n</li>\n<li><p>Parent category relationships</p>\n</li>\n<li><p>Radar-chart rendering metadata</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"menu-dictionary\">Menu Dictionary</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET /v3/api/insights/menu\n\n</code></pre><p>Returns the configured menu-item dictionary used by the word extraction engine.</p>\n<hr />\n<h2 id=\"word-analysis\">Word Analysis</h2>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET /v3/api/insights/words\n\n</code></pre><p>Returns extracted words grouped by sentiment.</p>\n<p>Each word includes:</p>\n<ul>\n<li><p>Sentiment bucket</p>\n</li>\n<li><p>Occurrence count</p>\n</li>\n</ul>\n<p>The data is generated from review menu-item content.</p>\n<hr />\n<h1 id=\"api-conventions\">API Conventions</h1>\n<h2 id=\"transport\">Transport</h2>\n<ul>\n<li><p>JSON request bodies</p>\n</li>\n<li><p>JSON responses</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"status-codes\">Status Codes</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Status</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>200 OK</code></td>\n<td>Request completed successfully</td>\n</tr>\n<tr>\n<td><code>400 Bad Request</code></td>\n<td>Validation or business-rule error</td>\n</tr>\n<tr>\n<td><code>403 Forbidden</code></td>\n<td>Authentication or account-status error</td>\n</tr>\n</tbody>\n</table>\n</div><p>Example validation error:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{  \"details\": \"Validation error description\"}\n\n</code></pre><hr />\n<h2 id=\"pagination\">Pagination</h2>\n<ul>\n<li><p>Default page size: <strong>20 items</strong></p>\n</li>\n<li><p>Out-of-range pages return an empty array</p>\n</li>\n<li><p>No error is generated for empty pages</p>\n</li>\n</ul>\n<hr />\n<h2 id=\"multi-value-filters\">Multi-Value Filters</h2>\n<p>Multiple values are provided as comma-separated strings:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>services=google,facebook,tripadvisorrating=4,5\n\n</code></pre><hr />\n<h2 id=\"scope-safety\">Scope Safety</h2>\n<p>All endpoints automatically scope data to the authenticated company.</p>\n<p>Requests that reference resources belonging to another company (brands, states, locations, etc.) are rejected with:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>400 Bad Request\n\n</code></pre><hr />\n<h2 id=\"idempotency\">Idempotency</h2>\n<p><code>PATCH</code> endpoints support partial updates.</p>\n<p>Any omitted field preserves its current value.</p>\n<hr />\n<h2 id=\"additional-documentation\">Additional Documentation</h2>\n<p>For complete request and response schemas, validation rules, parameter catalogs, error examples, and sample payloads, refer to the individual endpoint reference documentation.</p>\n","_postman_id":"94190766-da02-4973-b6c5-1e89d2d32856"}]}