{
  "openapi": "3.1.0",
  "info": {
    "version": "4.3.2",
    "title": "Trigg Integrations API",
    "contact": {
      "email": "hello@triggloyalty.com",
      "url": "https://triggloyalty.com/"
    },
    "x-logo": {
      "url": "https://oc-oip-api-v4-msc.azurewebsites.net/trigg-logo.svg"
    },
    "description": "This is the documentation for the current release of the Trigg Integrations API.\n\nCurrent release: 2026-03-16 (v.4.3.2) \n{% admonition type=\"info\" name=\"Moved documentation\" %} You are now viewing our new and improved API documentation.  </p> If you were redirected here from <a href=\"https://dev.oip.oculos.no\">https://dev.oip.oculos.no</a>, please update your bookmarks to this new URL.  {% /admonition %}\n# Overview\nWelcome to the Trigg Integrations API documentation, a resource for better understanding of our integration platform. \n\nThis documentation is designed to be accessible and informative for both technical and sales professionals, ensuring that you can fully explore the capabilities and benefits of our API.\n\nFor technical experts, this documentation provides in-depth insights into the API endpoints, data structures, and integration possibilities. You'll find detailed explanations, code examples, and best practices to help you integrate our API into your applications and systems.\n\nFor sales persons and other non-technical stakeholders, this documentation offers a overview of the API's features, use cases, and potential business advantages. \n\n\nAs the configuration of Trigg allows for a flexible request/reponse, only the standard data structures are displayed in this documentation.\n\nIf you have a customized configuration and need examples, please contact our support team or your sales person.\n\n\nThe API has two base URL's, one for production and one for testing.\n\n<b>Production:</b> <a href=\"https://api.oculos.no/v4\">https://api.oculos.no/v4</a>\n\n<b>Staging:</b> <a href=\"https://api.staging.oculos.no/v4\">https://api.staging.oculos.no/v4</a>\n\nWe are excited to announce that our API now has a sandbox environment available!  This allows you to test and integrate our features in a safe and controlled setting. \n\n\nTo get your sandbox key, please contact us at <a href=\"mailto:hello@triggloyalty.com\">hello@triggloyalty.com</a>.\n# Authentication\nOur API is designed to be secure and efficient, and it requires an API key to authenticate your requests. In this short documentation, we'll guide you on how to use our API with the x-api-key header to ensure successful integration.\n\n<h3>Step 1: Obtain Your API Key</h3>\nBefore you can start using our API, you'll need to obtain an API key. This key acts as your access pass and is typically provided to you by your contact person. If you haven't received your API key, please reach out to our support team or your sales person.\n<h3>Step 2: Include the x-api-key Header</h3>\nTo make authenticated requests to our API, you must include the API key in the header of your HTTP requests. Specifically, you should add the \"x-api-key\" header with your API key as its value. \n  \n  `x-api-key : <API KEY>`\n\n<h3>Step 3 [OPTIONAL]: White list your IP address(es) for your production environment </h3>\nAlthough this step is optional, we strongly encourage you to send us an list of your IP addresses that are in use in your production environment.\n\n\nThis lets us configure Trigg to only allow access to your API account from those IP's.\n\n# Error Messages\nThe Trigg API returns a standarized detailed error message where it's possible. The structure of the error message looks like this:\n\n  ```\n  {\n    \"code\" : \"409\",\n    \"message\" : \"Conflict\",\n    \"detailedErrorMessage\" : {\n\n    }\n  }\n  ```\n\n  The `detailedErrorMessage` is fully dynamic and can contain a simple string aswell as a list of errors'. \n\n# Terms Of Use\nBy accessing or using our API (the \"Service\"), you agree to comply with these Terms of Use. Please read them carefully, as they govern your usage of our API.\n\n<h3>API Usage</h3>\n\nYou are granted a non-exclusive, non-transferable, limited license to access and use our API in accordance with these terms. You may only use the API for its intended purpose and in compliance with our guidelines and documentation.\n\n<h3>API Key</h3>\n\nAccess to the API requires an API key. Keep your API key secure and do not share it with unauthorized parties. You are responsible for all actions performed using your API key. Ensure that the API key is not visible in any way in your application.\n\n<h3>Prohibited Actions</h3>\n\nYou may not use the API to engage in any illegal, harmful, or abusive activities. You may not decompile, reverse engineer, or attempt to gain unauthorized access to the API or our systems. You may not use the API in a way that could harm or interfere with our services, infrastructure, or other users.\n\n<h3>Data Privacy</h3>\n\nWhen using our API, you may have access to user data. Ensure you handle such data in compliance with applicable data protection laws and our privacy policy.\n\n\nBy using our API, you acknowledge that you have read, understood, and agreed to these Terms of Use. Failure to comply with these terms may result in the suspension or termination of your API access. \n<h3>Functionality in preview</h3>\nMethods marked with Preview in this API documentation are subject to change. \n\nThese methods are provided for early access to new features but may have limited support, and their behavior, parameters, or responses can be modified or deprecated without prior notice. \n\nUse these methods with caution in production environments, as changes may impact integration stability. \nIt is recommended to regularly check the documentation for updates when utilizing preview features.\n\n\nWe reserve the right to update these terms, so it is recommended to review them periodically for any changes.\n\n# Rate Limits\nTrigg API does not have any rate limits, but some external systems integrated with Trigg may have. \n\nExceeding these limits may result in temporary access restrictions.\n\nWe strongly recommend implementing a back-off strategy to handle rate limit exceeded responses. This strategy helps you avoid overloading our/external servers and ensures a smoother user experience.\n\n\nIf you are receving one of the following errors it's an indication of an issue with an external system.\n\n  ```\n  {\n    \"code\" : \"429\",\n    \"message\" : \"Too Many Requests\",\n    \"detailedErrorMessage\" : {\n    }\n  }\n  ```\n\n  ```\n  {\n    \"code\" : \"502\",\n    \"message\" : \"Bad Gateway\",\n    \"detailedErrorMessage\" : {\n      \"gateway\" : \"Connection to backend system failed. System: [system_name]\",\n      \"gatewayMessage\" : \"Detailed error message here\"\n    }\n  }\n  ```\n\n\n# Tutorials\nComing soon.\n# Webhooks\nA webhook is a way for two different software applications to communicate with each other in real-time. \nIt's like a notification system that triggers actions automatically when certain events occur.    \n\nOculos can configure webhooks on request, please contact our support team for more information.\n# Change Log\n<h3>March 2026</h3>\n<h4>2026-03-16</h4>\n\n* New Wallet endpoints available that generates authorized provisioning URLs for Apple Wallet and Google Wallet. This integration allows you to retrieve pass-links for promotions and memberships by passing a customer id, which can then be mapped directly to \"Add to Wallet\" buttons in your UI.\n\n* Added new integration against Agillic marketing automation platform.\n\n* Promotion definitions is out of preview\n* New endpoint added that allows to search customer by email [PREVIEW]  (https://dev.triggloyalty.com/openapi/customers/getcustomerbyemail)\n* Minor bugfixes in API and documentation\n\n<h3>March 2025</h3>\n<h4>2025-03-03</h4>\n\n* Added support for multi branding. This means that you can now run multiple brands on one account. \n* Added 422 quarantine status for the create customers method. This status is used when a customer is quarantined for a period of time.\n* Enable/disable promotions endpoints are now out of preview.\n* The property 'promotionDefinitionId' is now available on the promotion object. This property contains the id of the promotion definition that the promotion is based on.\n* New endpoint for listing all promotion definitions. [PREVIEW] (https://dev.triggloyalty.com/openapi/promotions/getpromotionsdefinitions)\n* New endpoint for listing of all active promotions thare are available to customers. [PREVIEW] (https://dev.triggloyalty.com/openapi/promotions/getpromotionscampaigns)\n* Added a module endpoint. This endpoint collects minor endpoints that are not directly related to the main endpoints.\n\nAvailable modules:\n\n  * /modules/vehicles - endpoint for fetching and adding vehicles [PREVIEW] (https://dev.triggloyalty.com/openapi/modules/getvehiclesbycustomeridd)\n\n\n<h3>November 2024</h3>\n<h4>2024-11-19</h4>\n\n* Added endpoints for enabling/disabling of promotions (in preview)\n* Added endpoint for transfering clips on loyalty cards between two existing customers (in preview)\n* Minor bugfixes\n* Minor bugfixes in documentation\n\n<h3>June 2024</h3>\n<h4>2024-06-18</h4>\n\n* Added endpoint for deleting a customer by external id\n* Minor bugfixes in documentation\n\n<h3>May 2024</h3>\n<h4>2024-05-22</h4>\n  \n* Added an endpoint for returning all transactions resulting in a bonus reward (https://dev.triggloyalty.com/openapi/loyalty/getbonustransactions)\n* Added a list of promotions on the customer object when applicable. Please note that this list only will contain active promotions.\n* Added information to the documentation on how to mark a transaction as a return (https://dev.triggloyalty.com/openapi/transactions/addtransactions)\n* Minor bugfixes\n* Improved performance\n\n<h4>2024-05-14</h4>\nAdded new methods\n\n* Get customer by externalId\n* Update customer by externalId\n* Minor bugfixes\n* Improved performance \n\n\n<h3>April 2024</h3>\n<h4>2024-04-17</h4>\nIntroduced dynamic methods on the customers and promotions endpoints\n<h3>March 2024</h3>\n<h4>2024-03-19</h4>\nRelease of v4\n"
  },
  "tags": [
    {
      "name": "Affiliates",
      "description": "Endpoints for managing affiliates. \n\nThe affiliate endpoints currenly allows you to retrieve information about affiliates.\n"
    },
    {
      "name": "Abandoned carts",
      "description": "Endpoints for managing abandoned carts\n\nAn abandoned cart function helps businesses track when online shoppers add items to their virtual shopping carts but leave the website or app without completing their purchase. \n\nIt captures data about these abandoned carts, including the specific products left behind and, when available, the customer's contact information.\n"
    },
    {
      "name": "Customers",
      "description": "The customers endpoint allows you to create, update or search for customers through various parameters depending on your configuration.\n\nDepending on your configuration, the API may take or return additional fields in the extendedProperties object. \n\nTo get an example of your specific integration, please contact our support team.\n"
    },
    {
      "name": "Consents",
      "description": "Endpoint that lists all available consents for a client.\n\nDepending on your configuration, the API may take or return additional fields in the extendedProperties object. \n\nTo get an example of your specific integration, please contact our support team.        \n"
    },
    {
      "name": "Data Enrichment",
      "description": "Endpoint that lets you enrich member data .      \n"
    },
    {
      "name": "Health",
      "description": "Endpoint for checking the Trigg API health status.\n\nWith these endpoint(s) you can make a request to Trigg to get a quick system status.\n"
    },
    {
      "name": "Import",
      "description": "Endpoint that provides methods for importing data, typically in batches into Trigg.\n\nIn this endpoint we can receive many formats and types, such as JSON and XML requests. \n\nTo get an example of your specific integration, please contact our support team.\n"
    },
    {
      "name": "Loyalty",
      "description": "Endpoints for manually managing different types of loyalty objects.\n\nMethods under this endpoint lets you view current campaigns, manually add bonus points, get balance of a customers loyalty card(s) etc.\n\nDepending on your configuration, the API may take or return additional fields in the extendedProperties object. \n\nTo get an example of your specific integration, please contact our support team.\n"
    },
    {
      "name": "Messaging",
      "description": "Endpoint that lets yoy send different types of messages and manually trigger automations that send SMS.\n\nIn this endpoint you will also find a complete set of methods to create a 2F verfication solution by SMS.\n"
    },
    {
      "name": "Modules",
      "description": "Endpoints for managing minor features that are not directly related to the main endpoints.\n\nAvailable modules:\n\n* Wishlist - Endpoints for managing wishlists\n* Vehicles - Endpoints for managing vehicles [PREVIEW]\n"
    },
    {
      "name": "Payment Cards",
      "description": "TODO"
    },
    {
      "name": "Plugins",
      "description": "TODO"
    },
    {
      "name": "Promotions",
      "description": "This API provides various methods for managing promotions. \n\nClients can retrieve available promotions id or phone number, redeem promotions, and view redeemed ones. \n"
    },
    {
      "name": "Reports",
      "description": "Endpoint that provides method(s) for returning various types of reports. Reports could be either of standard type or could be individually configured for clients. \n\nExamples of reports:\n* New customers last 24 hours\n* Deleted customers last 24 hours\n* Bonus transactions made by customer\n* +++\n\nSome reports that have a high volume response, may return the result in pages. This requires the client to iterate through each page to fetch the entire result.\n\nIn reports with paging functionality, a metaData object will contain paging information:\n\n```\n{\n  \"metaData\": {\n      \"reportType\": \"customers\",\n      \"totalRecords\": 12,\n      \"totalPages\": 1,\n      \"activePage\": 1\n    }  \n}\n```\n\n\n* `totalRecords` = Number of records available through all pages\n* `totalPages` = How many pages available containing data\n* `activePage` = Which page the client is on\n\nTo control wich page to fetch data from and how many records that should be return on each page use querystring parameters.\n\n* `page` = from wich page should the dataset be fetched from (default = 1)\n* `rowsPage` = how many results per page that should be returned (default = 25)\n\nPlease contact us for further information on your possiblites.\n"
    },
    {
      "name": "Stores",
      "description": "Endpoint for Stores"
    },
    {
      "name": "Transactions",
      "description": "Endpoint for transactions"
    },
    {
      "name": "Triggers",
      "description": "Endpoints that enables triggering automations through the API.\n\nAutomations is a feature that simplifies and speeds up repetitive tasks. It helps marketers send emails, post on social media, and manage customer data more efficiently\n"
    },
    {
      "name": "Vipps",
      "description": "Endpoint for Vipps integration"
    },
    {
      "name": "Wallets",
      "description": "The wallets endpoint provides methods for generating authorized provisioning URLs for Apple Wallet and Google Wallet. \n\nThis allows you to retrieve pass-links for promotions and memberships by passing a customer id, which can then be mapped directly to \"Add to Wallet\" buttons in your user interface.\n"
    }
  ],
  "servers": [
    {
      "url": "https://api.oculos.no/v4",
      "description": "Production"
    },
    {
      "url": "https://api.staging.oculos.no/v4",
      "description": "Staging"
    }
  ],
  "paths": {
    "/affiliates": {
      "get": {
        "tags": [
          "Affiliates"
        ],
        "summary": "Get affiliates [PREVIEW]",
        "description": "Returns a list of all available affiliates",
        "operationId": "getAffiliates",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AffiliatesResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          }
        }
      }
    },
    "/abandonedCarts": {
      "post": {
        "tags": [
          "Abandoned carts"
        ],
        "summary": "Create or update a cart",
        "description": "Creates or updates a cart. \n\nAs with many other endpoints, the payload is configurable and can contain additional data in the `extendedProperties` field.\n\nTo update a cart, use the same cartId as an existing cart.\n",
        "operationId": "createCart",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CartRequest"
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Abandoned carts"
        ],
        "summary": "Empty cart",
        "description": "Method that allows the client to empty a stored cart",
        "operationId": "emptyCart",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EmptyCartRequest"
              }
            }
          }
        }
      }
    },
    "/plugins/cart/price": {
      "post": {
        "tags": [
          "Plugins"
        ],
        "summary": "Calculate new price on cart",
        "description": "Endpoint used for calculating a new price on a cart based on current campaigns and/or a members available: \n\n* Bonus\n* Coupons\n* Vouchers\n\nAs both the request and response is fully dynamic, the format of the data exchanged has to be agreed upon before activating.\n",
        "operationId": "cartsCalculatePrice",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EmptyCartRequest"
              }
            }
          }
        }
      }
    },
    "/dataenrichment/forms/{clientName}/{id}": {
      "get": {
        "tags": [
          "Data Enrichment"
        ],
        "summary": "Enrich and redirect member",
        "description": "This endpoints automatically enriches a member by thats already stored in the MA-system. \n\nThe endpoints fetches the member from the MA-system, enriches it's data, updates and redirects back to a pre-configured URL.\n",
        "operationId": "enrichmentFromSchema",
        "parameters": [
          {
            "name": "clientName",
            "in": "path",
            "description": "Client identifier, provided by Oculos.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "description": "Id of member",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "302": {
            "description": "Found - the member is found and enriched, redirecting to pre-configured URL."
          },
          "400": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          },
          "404": {
            "description": "Member not found"
          }
        }
      }
    },
    "/triggers/{id}/customer/{customerId}": {
      "post": {
        "tags": [
          "Triggers"
        ],
        "summary": "Trigger automation by member id",
        "description": "Methods available to trigger automations. \n\nThe automation that should be triggered also has to be configured in the marketing automation system.\n\nAs the payload can vary between triggers, the request is fully dynamic and should be posted as dictionary with key/value. \n",
        "operationId": "triggerAutomationByMemberId",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "id of trigger",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "customerId",
            "in": "path",
            "description": "The members id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          },
          "404": {
            "description": "Trigger not found"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "data": {
                    "type": "string",
                    "example": "test data"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/triggers/{id}/customer/mobilePhone/{mobilePhone}": {
      "post": {
        "tags": [
          "Triggers"
        ],
        "summary": "Trigger automation by mobile phone number",
        "description": "Methods available to trigger automations by a configurable identificator, for example mobile phone.\n  \nThe automation that should be triggered also has to be configured in the marketing automation system.\n\nAs the payload can vary between triggers, the request is fully dynamic and should be posted as dictionary with key/value.   \n",
        "operationId": "triggerAutomationByMobilePhone",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Id of trigger",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "mobilePhone",
            "in": "path",
            "description": "Members mobile phone number",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          },
          "404": {
            "description": "Trigger not found"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "data": {
                    "type": "string",
                    "example": "test data"
                  }
                }
              }
            }
          }
        }
      }
    },
    "/loyalty/bonus/campaigns/{id}": {
      "get": {
        "tags": [
          "Loyalty"
        ],
        "summary": "Return all bonus campaigns",
        "description": "Methods that returns all current bonus campaigns. \n\nThe id parameters is optional and can be used to return\nall campaigns for a specific member.\n\nThe return object is dynamic and can vary between clients, the example below shows the most common types of fields.\n",
        "operationId": "getBonusCampaigns",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Id of member",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetBonusCampaignsResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          },
          "404": {
            "description": "Member not found"
          }
        }
      }
    },
    "/loyalty/bonus/import": {
      "post": {
        "tags": [
          "Loyalty"
        ],
        "summary": "Import activity bonus",
        "description": "Method that allows a third-party to manually import activities and update bonus amount for a member. \n\nAvailable activites that qualifies for bounus points can be found using the `/bonus/rules` endpoint.\n\nThe request and response can be customer specific and the example below shows only a common type of request body.\n",
        "operationId": "bonusImport",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BonusImportResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          },
          "404": {
            "description": "Customer or activity not found"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BonusImportRequest"
              }
            }
          }
        }
      }
    },
    "/loyalty/bonus/addRewardPoints": {
      "post": {
        "tags": [
          "Loyalty"
        ],
        "summary": "Add bonus points",
        "description": "Method that allows you to manually add points to specific member\n",
        "operationId": "bonusAddRewardPoints",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BonusImportRequest"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddRewardPointsRequest"
              }
            }
          }
        }
      }
    },
    "/loyalty/activity/{activityId}/customerId/{customerId}": {
      "post": {
        "tags": [
          "Loyalty"
        ],
        "summary": "Add bonus by activity id",
        "description": "This method allows you to add bonus points to a specific customer based on activity.\n\nThe activityId is the identifier of the activity that the customer has performed.\nThe customerId is the identifier of the customer that has performed the activity.\nThe request body is fully dynamic and can contain any number of properties depending on configuration. \n\nThe request sample is only an minimum required example and may have to be replaced with the actual request body if the configuration requires it.\n",
        "operationId": "addBonusPointsByActivity",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LoyaltyActivityRequest"
              }
            }
          }
        }
      }
    },
    "/loyalty/loyalty-cards/transfer-clips": {
      "post": {
        "tags": [
          "Loyalty"
        ],
        "summary": "Transfer clips [PREVIEW]",
        "description": "A method that allows the client to transfer clips on a loyalty card between two existing customers.\n\nDepending on your configuration, the API may take or return additional fields in the extendedProperties object.\n",
        "operationId": "transferClips",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos before usage."
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/transferClipsRequest"
              }
            }
          }
        }
      }
    },
    "/bonus/rules": {
      "get": {
        "tags": [
          "Loyalty"
        ],
        "summary": "Return all bonus rules",
        "description": "Methods that returns all the rules and activitys that qualifies to bonuses.\n",
        "operationId": "getBonusRules",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BonusRulesResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos before usage"
          }
        }
      }
    },
    "/consents": {
      "get": {
        "tags": [
          "Consents"
        ],
        "summary": "Get consents",
        "description": "Returns a list of all available consents",
        "operationId": "getConsents",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetConsentsReponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/promotions/customerId/{customerId}": {
      "get": {
        "tags": [
          "Promotions"
        ],
        "summary": "Get promotions",
        "description": "Returns a list of all available promotions for a member.\n",
        "operationId": "getCouponsByMemberId",
        "parameters": [
          {
            "name": "customerId",
            "in": "path",
            "description": "Id of member. \n\nThe type of id parameter is configurable where the most common types are id, mobile phone or an external id. \n",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PromotionResponse"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          },
          "404": {
            "description": "Not Found - no coupons available"
          }
        }
      }
    },
    "/promotions/mobilePhone": {
      "get": {
        "tags": [
          "Promotions"
        ],
        "summary": "Get promotions by phone number",
        "description": "Returns a list of all available promotions for a member by using the mobile phone number\n",
        "operationId": "getCouponsByMobilePhone",
        "parameters": [
          {
            "name": "mobilePhone",
            "in": "query",
            "description": "Customers mobile phone number\n\nThe type of id parameter is configurable where the most common types are id, mobile phone or an external id. \n",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/PromotionResponse"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          },
          "404": {
            "description": "Not Found - no coupons available"
          }
        }
      }
    },
    "/promotions/redeem": {
      "post": {
        "tags": [
          "Promotions"
        ],
        "summary": "Redeem promotion",
        "description": "Method that redeems a promotion for a customer. \n",
        "operationId": "redeemPromotion",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          },
          "404": {
            "description": "Not Found - promotion was not found"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RedeemPromotionRequest"
              }
            }
          }
        }
      }
    },
    "/promotions/redeem/history/customerId/{customerId}": {
      "get": {
        "tags": [
          "Promotions"
        ],
        "summary": "Get Redeemed Promotions",
        "description": "Method that returns a list of redeemed promotions for a customer. \n\nExample of usage; ??\n",
        "operationId": "getCouponHistory",
        "parameters": [
          {
            "name": "customerId",
            "in": "path",
            "description": "Id of customer",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          },
          "404": {
            "description": "Not Found - coupon was not found"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CouponHistoryResponse"
              }
            }
          }
        }
      }
    },
    "/promotions/cart": {
      "post": {
        "tags": [
          "Promotions"
        ],
        "summary": "Get promotions by cart",
        "description": "Return promotions based on shopping cart\n",
        "operationId": "postPromotionCart",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DynamicResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Function Not Found"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PromotionsByCartRequest"
              }
            }
          }
        }
      }
    },
    "/promotions/campaigns": {
      "get": {
        "tags": [
          "Promotions"
        ],
        "summary": "Get campaigns",
        "description": "This method allows the client to get a list of all active promotions.\n",
        "operationId": "getPromotionsCampaigns",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PromotionCampaignResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          },
          "404": {
            "description": "Not Found"
          }
        }
      }
    },
    "/promotions/definitions": {
      "get": {
        "tags": [
          "Promotions"
        ],
        "summary": "Get definitions",
        "description": "This method allows the client to list all promotion definitions\n",
        "operationId": "getPromotionsDefinitions",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PromotionDefintionsResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          },
          "404": {
            "description": "Not Found"
          }
        }
      }
    },
    "/promotions/dynamic/{function}": {
      "post": {
        "tags": [
          "Promotions"
        ],
        "summary": "Dynamic method",
        "description": "This method is fully dynamic both in request/response and is available for specific client customizations on the promotions endpoint.\n",
        "operationId": "postPromotionDynamic",
        "parameters": [
          {
            "name": "function",
            "in": "path",
            "description": "Your custom function name provided by Oculos",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DynamicResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Function Not Found"
          }
        }
      }
    },
    "/promotions/{promotionId}/enableUse/{customerId}": {
      "post": {
        "tags": [
          "Promotions"
        ],
        "summary": "Enable promotion use",
        "description": "This method allows a specific promotion to be used (redeemed) by a specific customer again, if it previously has been disabled using the  ```disableUse ``` method.\n\nAs default, promotions are set to available/enabled for use when assigned to a customer.\n",
        "operationId": "enableCustomerPromotionUse",
        "parameters": [
          {
            "name": "promotionId",
            "in": "path",
            "description": "Promotion identifier. (id property found on promotion object).",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "customerId",
            "in": "path",
            "description": "Customer identifier (id property on customer).",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos before usage."
          }
        }
      }
    },
    "/promotions/{promotionId}/disableUse/{customerId}": {
      "post": {
        "tags": [
          "Promotions"
        ],
        "summary": "Disable promotion use",
        "description": "Disable the possiblity for a specific promotion to be used (redeemed) by a specific customer.\n",
        "operationId": "disableCustomerPromotionUse",
        "parameters": [
          {
            "name": "promotionId",
            "in": "path",
            "description": "Promotion identifier. (id property found on promotion object).",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "customerId",
            "in": "path",
            "description": "Customer identifier (id property on customer).",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos before usage."
          }
        }
      }
    },
    "/health/ping": {
      "get": {
        "tags": [
          "Health"
        ],
        "summary": "Ping",
        "description": "Ping OIP with a 200 GET request to check system status. \n\nThis endpoint does not require authentication.\n",
        "operationId": "oipHealthPing",
        "security": [],
        "responses": {
          "200": {
            "description": "Success"
          },
          "404": {
            "description": "Not Found"
          }
        }
      }
    },
    "/import": {
      "post": {
        "tags": [
          "Import"
        ],
        "summary": "Import",
        "description": "Imports data into OIP by the body request, this method accepts various formats such as JSON, XML, CSV etc. \n\nThis method may have to be configured by Oculos before usage and the examples below is just an illustration of payload as the endpoint is fully dynamic.\n",
        "operationId": "import_data",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GenericImportRequest"
              }
            }
          }
        }
      }
    },
    "/import/form": {
      "post": {
        "tags": [
          "Import"
        ],
        "summary": "Form import",
        "description": "Imports data into OIP from a form using the `application/x-www-form-urlencoded` content type.\n\nThe endpoint may have to be configured by Oculos before usage.\n",
        "operationId": "import_form",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          }
        }
      }
    },
    "/import/file": {
      "post": {
        "tags": [
          "Import"
        ],
        "summary": "File import",
        "description": "Imports a file into OIP.\n\nUse multipart/form-data with a required field file (the file to upload).\n\nCurl example:\n\n```curl -X POST \"http://api.oculos.no/v4/import/file\" -F \"file=@path/to/your/file.txt\"```\n\nThis endpoint may have to be configured by Oculos before usage.\n",
        "operationId": "import_file",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "202": {
            "description": "Accepted"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          }
        }
      }
    },
    "/customers": {
      "get": {
        "tags": [
          "Customers"
        ],
        "summary": "Get customer by mobile phone",
        "description": "This method allows the client to search for a customer by a mobile phone number.\n\nExample: `+4712345678`\n\nThe response sample below shows the default response, but depending on your configuration the API may return additional fields in the extendedProperties object.\n",
        "operationId": "getCustomerByMobilePhone",
        "parameters": [
          {
            "name": "mobilePhone",
            "in": "query",
            "description": "The customers mobile phone number",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Customer Not Found"
          },
          "422": {
            "description": "Unprocessable Entity"
          }
        }
      },
      "post": {
        "tags": [
          "Customers"
        ],
        "summary": "Create customer",
        "description": "The request sample(s) below shows the default payload and one minimum required payload. \n\nDepending on your configuration, the API may take or return additional fields in the extendedProperties object. For specific examples reach out to your technical contact.\n",
        "operationId": "createMember",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "409": {
            "description": "Conflict"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/CustomerRequest"
                  },
                  {
                    "$ref": "#/components/schemas/MinimalCustomerRequest"
                  }
                ]
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Customers"
        ],
        "summary": "Update customer",
        "description": "The request sample(s) below shows the default payload and one minimum required payload. \n\nDepending on your configuration, the API may take or return additional fields in the extendedProperties object. For specific examples reach out to your technical contact.\n",
        "operationId": "updateMember",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "409": {
            "description": "Conflict"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/CustomerUpdateRequest"
                  },
                  {
                    "$ref": "#/components/schemas/MinimalCustomerUpdateRequest"
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/customers/externalId": {
      "put": {
        "tags": [
          "Customers"
        ],
        "summary": "Update customer by external id",
        "description": "The request sample(s) below shows the default payload and one minimum required payload. \n\nDepending on your configuration, the API may take or return additional fields in the extendedProperties object. For specific examples reach out to your technical contact.\n",
        "operationId": "updateCustomerByExternalId",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "409": {
            "description": "Conflict"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/CustomerUpdateRequest"
                  },
                  {
                    "$ref": "#/components/schemas/MinimalCustomerUpdateRequestByExternalId"
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/customers/id/{id}": {
      "get": {
        "tags": [
          "Customers"
        ],
        "summary": "Get customer by id",
        "description": "This method allows the client to search for a customer by a unique id\n\nExample: `226B14AF-18A6-44CF-834E-BE4BCA5D64B7`\n\nThe response sample below shows the default response, but depending on your configuration the API may return additional fields in the extendedProperties object.\n",
        "operationId": "getCustomerById",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "The customers id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Customer Not Found"
          }
        }
      }
    },
    "/customers/externalId/{id}": {
      "get": {
        "tags": [
          "Customers"
        ],
        "summary": "Get customer by external id",
        "description": "This method allows the client to search for a customer by an external Id\n\nExample: `B9012E40-1B08-4DC5-84F9-BB8E2653B2A6`\n\nThe response sample below shows the default response, but depending on your configuration the API may return additional fields in the extendedProperties object.\n",
        "operationId": "getCustomerByExternalId",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "The customers external id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Customer Not Found"
          }
        }
      }
    },
    "/customers/changed/{timestamp}": {
      "get": {
        "tags": [
          "Customers"
        ],
        "summary": "Get changed customers",
        "description": "Returns a list of changed customers since given timestamp. Default (empty parameter) is since last day.",
        "operationId": "getChangedCustomersList",
        "parameters": [
          {
            "name": "timestamp",
            "in": "path",
            "description": "Timestamp in format (TODO)",
            "example": "20240101T2210",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "409": {
            "description": "Conflict"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/CustomerRequest"
                  },
                  {
                    "$ref": "#/components/schemas/MinimalCustomerRequest"
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/customers/id/{id}/source/{source}": {
      "delete": {
        "tags": [
          "Customers"
        ],
        "summary": "Delete customer",
        "description": "Method that let's you delete a customer by Id",
        "operationId": "deleteMember",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Id of member",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "source",
            "in": "path",
            "description": "Description of origin for the request. \n\nExample values: ECOM, POS, MyPage etc.\n",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Member Not Found"
          }
        }
      }
    },
    "/customers/externalId/{externalId}/source/{source}": {
      "delete": {
        "tags": [
          "Customers"
        ],
        "summary": "Delete customer by external id",
        "description": "Method that let's you delete a customer by an external id",
        "operationId": "deleteMemberByExternalId",
        "parameters": [
          {
            "name": "externalId",
            "in": "path",
            "description": "External id of member",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "source",
            "in": "path",
            "description": "Description of origin for the request. \n\nExample values: ECOM, POS, MyPage etc.\n",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Member Not Found"
          }
        }
      }
    },
    "/customers/email/{email}": {
      "get": {
        "tags": [
          "Customers"
        ],
        "summary": "Get customer by email [PREVIEW]",
        "description": "This method allows the client to search for a customer by email address\n\n`Note: Special characters such as '+'' must be encoded. Example: +=%2B`\n\nThe response sample below shows the default response, but depending on your configuration the API may return additional fields in the extendedProperties object.\n",
        "operationId": "getCustomerByEmail",
        "parameters": [
          {
            "name": "email",
            "in": "path",
            "description": "The customers email address",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          },
          "404": {
            "description": "Customer Not Found"
          }
        }
      }
    },
    "/customers/prospects": {
      "post": {
        "tags": [
          "Customers"
        ],
        "summary": "Create prospect [PREVIEW ]",
        "description": "This endpoint creates a new customer prospect record in the system. It accepts either email or mobilePhone in the request body and returns the created customer id upon success.         \n\nDepending on your configuration, the API may take or return additional fields in the extendedProperties object. For specific examples reach out to your technical contact.\n",
        "operationId": "createProspect",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerProspectResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          },
          "409": {
            "description": "Conflict"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateProspectRequest"
              }
            }
          }
        }
      }
    },
    "/customers/dynamic/{function}": {
      "post": {
        "tags": [
          "Customers"
        ],
        "summary": "Dynamic method",
        "description": "This method is fully dynamic both in request/response and is available for specific client customizations on the customer endpoint.\n",
        "operationId": "postCustomerDynamic",
        "parameters": [
          {
            "name": "function",
            "in": "path",
            "description": "Your custom function name provided by Oculos",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DynamicResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "404": {
            "description": "Function Not Found"
          }
        }
      }
    },
    "/data-enrichment/mobilePhone/{mobilePhone}": {
      "get": {
        "tags": [
          "Data Enrichment"
        ],
        "summary": "Discover member by phone number",
        "description": "Looks up a mobile phone number and tries to discover owner data through 3rd party services.",
        "operationId": "discoverMemberByPhone",
        "parameters": [
          {
            "name": "mobilePhone",
            "in": "path",
            "description": "Phone number to lookup",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DiscoverMemberResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          }
        }
      }
    },
    "/data-enrichment/ssn/{ssn}": {
      "get": {
        "tags": [
          "Data Enrichment"
        ],
        "summary": "Discover member by social security number (SSN)",
        "description": "This method let's you retreive information on a member based on their SSN",
        "operationId": "discoverMemberBySSN",
        "parameters": [
          {
            "name": "ssn",
            "in": "path",
            "description": "SSN number to lookup",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DiscoverMemberResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          }
        }
      }
    },
    "/payment-cards": {
      "post": {
        "tags": [
          "Payment Cards"
        ],
        "summary": "Attach payment card token to member",
        "description": "Use this endpoint for adding a card token to an existing member. \n\nThis method requires an integration with a payment provider.\n",
        "operationId": "addPaymentCard",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos before usage"
          },
          "409": {
            "description": "Conflict"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MemberAddCardRequest"
              }
            }
          }
        }
      }
    },
    "/payment-cards/token/{token}": {
      "get": {
        "tags": [
          "Payment Cards"
        ],
        "summary": "Get member by payment card token",
        "description": "Retrives a member by card token\n\nThis method requires an integration with a payment provider.\n",
        "operationId": "getPaymentCards",
        "parameters": [
          {
            "name": "token",
            "in": "path",
            "description": "Card token",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos before usage"
          }
        }
      }
    },
    "/payment-cards/customerId/{customerId}": {
      "get": {
        "tags": [
          "Payment Cards"
        ],
        "summary": "Get all payment cards by customerId",
        "description": "Method that returns a list of all payment cards attached to a member. If there are no cards attached to the member, an empty list will be returned.\n\nThis method requires an integration with a payment provider.\n",
        "operationId": "getPaymentCardsByMemberId",
        "parameters": [
          {
            "name": "customerId",
            "in": "path",
            "description": "Id of member",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MemberCardListResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos before usage"
          }
        }
      }
    },
    "/payment-cards/{customerId}/{cardId}": {
      "delete": {
        "tags": [
          "Payment Cards"
        ],
        "summary": "Delete payment card",
        "description": "Method used for deleting card attached to member",
        "operationId": "deleteCard",
        "parameters": [
          {
            "name": "customerId",
            "in": "path",
            "description": "Id of member",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cardId",
            "in": "path",
            "description": "Id of card",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos before usage'"
          }
        }
      }
    },
    "/payment-cards/signature": {
      "post": {
        "tags": [
          "Payment Cards"
        ],
        "summary": "Create payment card signature",
        "description": "Method used to create a payload that can be used to trigger a new card registration process. \n\nThis metod requires addional services, please contact your advisor for more information.\n",
        "operationId": "createVerifoneSignature",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SignatureRequest"
              }
            }
          }
        }
      }
    },
    "/messaging/sms": {
      "post": {
        "tags": [
          "Messaging"
        ],
        "summary": "Send SMS",
        "description": "Sends an SMS with a given sender name.",
        "operationId": "sendSmsMessage",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MessagingSendSmsRequest"
              }
            }
          }
        }
      }
    },
    "/messaging/sms/code/create/{phoneNumber}": {
      "get": {
        "tags": [
          "Messaging"
        ],
        "summary": "Create Code",
        "description": "Creates and sends an SMS with a unique code that can be used in 2 factor logins or customer verification processes.\n\nThe sender, length and expiration time is configurable.\n",
        "operationId": "createSmsCode",
        "parameters": [
          {
            "name": "phoneNumber",
            "in": "path",
            "description": "Receivers mobile phone number. Must contain country code",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          }
        }
      }
    },
    "/messaging/sms/code/verify/{phoneNumber}/{code}": {
      "get": {
        "tags": [
          "Messaging"
        ],
        "summary": "Verify code",
        "description": "Verifies the SMS code recevied in the Create Code endpoint.",
        "operationId": "verifySmsCode",
        "parameters": [
          {
            "name": "phoneNumber",
            "in": "path",
            "description": "Mobile phone number to verify. Must contain country code prefix.",
            "example": "+4712345678",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "code",
            "in": "path",
            "description": "The verification code received from the create code endpoint.",
            "example": "123456",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          }
        }
      }
    },
    "/messaging/sms/trigger/{customerId}/{id}": {
      "get": {
        "tags": [
          "Messaging"
        ],
        "summary": "Trigger sms",
        "description": "Triggers the send out of a pre-defined message. This message has to be configured by Oculos in advance.",
        "operationId": "triggerSmsAutomation",
        "parameters": [
          {
            "name": "customerId",
            "in": "path",
            "description": "Member identifier, depending on your OIP configuration this can typically be a internal guid, mobile phone or other external id.",
            "example": "50EF2EA3-E804-404E-B65B-73AB6B9D7F05",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "id",
            "in": "path",
            "description": "Id of message to trigger",
            "example": "welcomeSMS",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/modules/vehicles/customerId/{customerId}": {
      "get": {
        "tags": [
          "Modules"
        ],
        "summary": "Get vehicles [PREVIEW]",
        "description": "This method allows the client to search for vehicles by a customer id\n\nExample: `B9012E40-1B08-4DC5-84F9-BB8E2653B2A6`\n\nThe response sample below shows the default response, but depending on your configuration the API may return additional fields in the extendedProperties object.\n",
        "operationId": "getVehiclesByCustomerId",
        "parameters": [
          {
            "name": "customerId",
            "in": "path",
            "description": "The customer id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VehicleResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          },
          "404": {
            "description": "Customer Not Found"
          }
        }
      },
      "post": {
        "tags": [
          "Modules"
        ],
        "summary": "Add vehicle [PREVIEW]",
        "description": "This method allows the client to add a new vehicle for a customer\n",
        "operationId": "addVehicle",
        "parameters": [
          {
            "name": "customerId",
            "in": "path",
            "description": "The customer id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "201": {
            "description": "Created"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          },
          "404": {
            "description": "Customer Not Found"
          },
          "409": {
            "description": "Conflict - the vehicle already exists"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PostVehicleRequest"
              }
            }
          }
        }
      }
    },
    "/modules/vehicles/vehicleId/{vehicleId}": {
      "put": {
        "tags": [
          "Modules"
        ],
        "summary": "Update vehicle [PREVIEW]",
        "description": "This method allows the client to update a vehicle\n",
        "operationId": "updateVehicle",
        "parameters": [
          {
            "name": "vehicleId",
            "in": "path",
            "description": "The vehicle id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "Updated"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          },
          "404": {
            "description": "Customer Not Found"
          },
          "409": {
            "description": "Conflict - the vehicle already exists"
          },
          "422": {
            "description": "Unprocessable Entity - Not self registered. This vehicle can not be updated by the client"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PutVehicleRequest"
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Modules"
        ],
        "summary": "Delete vehicle [PREVIEW]",
        "description": "This method allows the client to delete a vehicle\n",
        "operationId": "deleteVehicle",
        "parameters": [
          {
            "name": "vehicleId",
            "in": "path",
            "description": "The vehicle id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "Deleted"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          },
          "404": {
            "description": "Customer Not Found"
          },
          "409": {
            "description": "Conflict - the vehicle already exists"
          },
          "422": {
            "description": "Unprocessable Entity - Not self registered. This vehicle can not be deleted by the client"
          }
        }
      }
    },
    "/plugins/pos/extenda": {
      "post": {
        "tags": [
          "Plugins"
        ],
        "summary": "Extenda Plugin endpoint",
        "description": "Endpoint used for calculating a new price on a cart based on current campaigns and/or a members available: \n\n* Bonus\n* Coupons\n* Vouchers\n\nAs both the request and response is fully dynamic, the format of the data exchanged has to be agreed upon before activating.\n",
        "operationId": "extendaPluginGetCoupons",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EmptyCartRequest"
              }
            }
          }
        }
      }
    },
    "/reports/{reportType}": {
      "get": {
        "tags": [
          "Reports"
        ],
        "summary": "Get reports",
        "description": "Method that returns different types of reports based on input parameters and/or querys.\nInput parameters and/or querys are fully dynamic and can vary between clients. \n\nFor a complete list of parameters and example of response in your implemenation, please contact our support team.\n",
        "operationId": "report1",
        "parameters": [
          {
            "name": "reportType",
            "in": "path",
            "description": "Type (id) of report that should be returned\n",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          }
        }
      }
    },
    "/loyalty/loyalty-cards/{customerId}": {
      "get": {
        "tags": [
          "Loyalty"
        ],
        "summary": "Get loyalty cards",
        "description": "Endpoint that returns a list of active loyalty/stamp cards for a customer.\n",
        "operationId": "stampcard1",
        "parameters": [
          {
            "name": "customerId",
            "in": "path",
            "description": "Id of customer.\n",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GetStampcardResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          },
          "404": {
            "description": "Not Found"
          }
        }
      }
    },
    "/loyalty/achievements": {
      "put": {
        "tags": [
          "Loyalty"
        ],
        "summary": "Update achievement [PREVIEW]",
        "description": "A method that allows the client to manually add clips/stamps to a customers achievement card which can be useful i scenarions where live updates are not possible.\n\nDepending on your configuration, the API may take or return additional fields in the extendedProperties object.\n",
        "operationId": "updateAchivement",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          },
          "409": {
            "description": "Conflict"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AchivementUpdateRequest"
              }
            }
          }
        }
      }
    },
    "/loyalty/loyalty-cards/campaigns": {
      "get": {
        "tags": [
          "Loyalty"
        ],
        "summary": "Get loyalty card campaigns",
        "description": "Endpoint that return all products that qualifies for a count in each loyalty/stamp card.\n\nDepending on your OIP configuration, the API may return additional fields in the extendedProperties object.\n",
        "operationId": "stampcardCampaigns",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StampcardCampaignsResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          }
        }
      }
    },
    "/loyalty/transactions/customerId/{customerId}": {
      "post": {
        "tags": [
          "Loyalty"
        ],
        "summary": "Add bonus by activity id",
        "description": "This method allows you to add bonus points to a specific customer based on activity.\n\nThe activityId is the identifier of the activity that the customer has performed.\nThe customerId is the identifier of the customer that has performed the activity.\nThe request body is fully dynamic and can contain any number of properties depending on configuration. \n\nThe request sample is only an minimum required example and may have to be replaced with the actual request body if the configuration requires it.\n",
        "operationId": "addBonusPointsByActivity",
        "parameters": [
          {
            "name": "activityId",
            "in": "path",
            "description": "The identifier of the activity",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "customerId",
            "in": "path",
            "description": "The identifier of the customer",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "Success"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LoyaltyActivityRequest"
              }
            }
          }
        }
      }
    },
    "/stores": {
      "get": {
        "tags": [
          "Stores"
        ],
        "summary": "Get Stores",
        "description": "Endpoint for getting all client stores, both physical and online. \n\nDefault properties are id and name. \n\nDepending on the clients data, there may be additional data available under the extendedProperties object.\n",
        "operationId": "store1",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StoreResponse"
                }
              }
            }
          },
          "400": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/transactions/customerId/{customerId}": {
      "get": {
        "tags": [
          "Transactions"
        ],
        "summary": "Get Transactions",
        "description": "Returns all transactions for a member.\n",
        "operationId": "getTransactions",
        "parameters": [
          {
            "name": "customerId",
            "in": "path",
            "description": "Member identifier, depending on configuration one of the following identifers could be in use:\n  * Mobile phone\n  * Unique id (oipId or externalSystemId)\n",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransactionResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          },
          "404": {
            "description": "Member Not Found"
          }
        }
      }
    },
    "/transactions": {
      "post": {
        "tags": [
          "Transactions"
        ],
        "summary": "Create transaction",
        "description": "\nEndpoint used for inserting transactions into OIP. \n\nIt is recommended to send in a list/batch of transactions instead of sending multiple single transactions.\nThe maximum recommended items per batch is around 400 transactions/items.\n\n{% admonition type=\"info\" name=\"Returns\" %}\nTo make a transaction be processed as a return, you have to do the following:\n  * Set the transactionType field on item level to 'RETURN'\n  * Set the quantity value to a negative value.\n\n{% /admonition %}\n\n  Example of transaction flagged as a return:\n  ```\n  {\n  \"ReceiptRequests\": [\n    {\n      \"Header\": {\n        \"StoreId\": \"001\",\n        \"ReceiptId\": \"9999258836\",\n        \"TimeStamp\": \"2023-10-13T14:50:05\",\n        \"ConsumerId\": \"9ae37ad3-8a55-4bb5-81fd-b08f00b684ed\",\n        \"GrossAmount\": 1817.8,\n        \"Vat\": 363.56\n      },\n      \"Items\": [\n        {\n          \"ReceiptId\": \"Id of receipt\",\n          \"LineNo\": 1,\n          \"Quantity\": -1,\n          \"ProductId\": \"VR1722775\",\n          \"ProductName\": \"MINI CHRISTMAS TREE WITH LED LIGHTS\",\n          \"GrossAmount\": 1817.8,\n          \"Vat\": 363.56,\n          \"NetAmount\": 1454.24,\n          \"TransactionType\": \"RETURN\"\n        }\n      ]\n    }\n  ]\n}\n```\n",
        "operationId": "addTransactions",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/CustomTransactionRequest"
                  },
                  {
                    "$ref": "#/components/schemas/MinimumTransactionRequest"
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/vipps/codeword/{phone}": {
      "get": {
        "tags": [
          "Vipps"
        ],
        "summary": "Trigger recruitment by SMS",
        "description": "Starts the recruitment process from a code word",
        "operationId": "vippsRecruitByCodeWord",
        "parameters": [
          {
            "name": "phone",
            "in": "path",
            "description": "Customers mobile phone, only norwegian number without country code.",
            "example": "91234567",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          }
        }
      }
    },
    "/vipps": {
      "post": {
        "tags": [
          "Vipps"
        ],
        "summary": "Trigger recruitment from POS",
        "description": "This method allows POS to trigger the Vipps recruitment process and OIP to collect store recruitment statistics.            \n",
        "operationId": "vippsRecruitFromPos",
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          },
          "409": {
            "description": "Conflict"
          }
        },
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VippsTriggerByPosRequest"
              }
            }
          }
        }
      }
    },
    "/wallets": {
      "get": {
        "tags": [
          "Wallets"
        ],
        "summary": "Generate wallet links",
        "description": "This method allows the client to generate wallet links for Apple Wallet and Google Wallet.\n\nThis method allows you to retrieve pass-links for promotions and memberships by passing a customer id, which can then be mapped directly to \"Add to Wallet\" buttons in your UI.\n",
        "operationId": "generateWalletLinks",
        "parameters": [
          {
            "name": "customerId",
            "in": "path",
            "description": "The customers id",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "api_key": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WalletLinksReponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request"
          },
          "401": {
            "description": "Unauthorized"
          },
          "403": {
            "description": "Forbidden - this method requires activation and configuration from Oculos"
          },
          "404": {
            "description": "Customer Not Found"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "main_auth": {
        "type": "oauth2",
        "flows": {
          "implicit": {
            "authorizationUrl": "http://example.com/api/oauth/dialog",
            "scopes": {
              "read:users": "read users info",
              "write:users": "modify or remove users"
            }
          }
        }
      },
      "api_key": {
        "type": "apiKey",
        "in": "header",
        "name": "x-api-key"
      }
    },
    "schemas": {
      "AffiliatesResponse": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "example": "154831A5-7E2E-44D8-8F2B-FB0D33CAD941"
            },
            "name": {
              "type": "string",
              "example": "Sample Affiliate"
            },
            "description": {
              "type": "string",
              "example": "Affiliate agreement for Sample Affiliate"
            },
            "active": {
              "type": "boolean",
              "example": true
            },
            "store": {
              "type": "string",
              "nullable": true,
              "example": null
            },
            "storeId": {
              "type": "string",
              "nullable": true,
              "example": null
            },
            "contractType": {
              "type": "string",
              "example": "Central"
            },
            "contractTypeId": {
              "type": "integer",
              "example": 2
            },
            "partnerType": {
              "type": "string",
              "example": "eCom"
            },
            "partnerTypeId": {
              "type": "integer",
              "example": 2
            },
            "organizationNo": {
              "type": "string",
              "example": "0"
            },
            "validFrom": {
              "type": "string",
              "format": "date-time",
              "example": "2025-05-01T00:00:00"
            },
            "validTo": {
              "type": "string",
              "format": "date-time",
              "example": "2029-12-28T00:00:00"
            },
            "contactFirstName": {
              "type": "string",
              "example": "John"
            },
            "contactLastName": {
              "type": "string",
              "example": "Doe"
            },
            "contactEmail": {
              "type": "string",
              "example": "sample-affiliate@test.com"
            },
            "contactPhone": {
              "type": "string",
              "nullable": true,
              "example": null
            },
            "internalContact": {
              "type": "string",
              "example": "John Doe"
            },
            "extendedProperties": {
              "type": "object",
              "additionalProperties": true,
              "example": {}
            }
          }
        }
      },
      "EmptyCartRequest": {
        "type": "object",
        "properties": {
          "cartId": {
            "type": "string",
            "description": "Cart identifier",
            "example": "934E2183-5004-45B0-8E75-A5178F1DEEF1"
          }
        }
      },
      "CartRequest": {
        "type": "object",
        "required": [
          "cartId",
          "contactId"
        ],
        "properties": {
          "cartId": {
            "type": "string",
            "example": "934E2183-5004-45B0-8E75-A5178F1DEEF1",
            "description": "Unique identifier of cart"
          },
          "cartUrl": {
            "type": "string",
            "description": "URL to customers cart",
            "example": "http://mywebshop.com/cart/934E2183-5004-45B0-8E75-A5178F1DEEF1"
          },
          "contactId": {
            "type": "string",
            "description": "Customer identifer",
            "example": "F68438A9-800B-457D-81D5-952FCEB63D8C"
          },
          "externalId": {
            "type": "string",
            "description": "External customer identifer",
            "example": "100001111"
          },
          "extendedProperties": {
            "type": "object",
            "description": "Additional properties depending on configuration",
            "properties": {
              "additionalProp1": {
                "type": "string"
              },
              "additionalProp2": {
                "type": "string"
              },
              "additionalProp3": {
                "type": "string"
              }
            }
          },
          "items": {
            "type": "array",
            "description": "List of products/items",
            "items": {
              "type": "object",
              "properties": {
                "itemId": {
                  "type": "string",
                  "description": "Unique id of item",
                  "example": "1001"
                },
                "quantity": {
                  "type": "number",
                  "description": "Number of items",
                  "example": 2
                },
                "productUrl": {
                  "type": "string",
                  "description": "URL to product",
                  "example": "https://mywebshop.com/products/1001"
                },
                "imageUrl": {
                  "type": "string",
                  "description": "URL to an image of the product",
                  "example": "https://mywebshop.com/products/images/1001"
                },
                "name": {
                  "type": "string",
                  "description": "Name of product",
                  "example": "Product 1001"
                },
                "price": {
                  "type": "number",
                  "description": "TODO",
                  "example": 799.9
                },
                "salePrice": {
                  "type": "number",
                  "description": "TODO",
                  "example": 499.5
                },
                "currency": {
                  "type": "string",
                  "default": "Currency code",
                  "example": "NOK"
                }
              }
            }
          }
        }
      },
      "GetBonusCampaignsResponse": {
        "type": "array",
        "items": {
          "properties": {
            "id": {
              "type": "string",
              "example": "5",
              "description": "Id of campaign"
            },
            "campaignName": {
              "type": "string",
              "description": "Display name of campign",
              "example": "Double bonus on 5 for 300 (covering bark 40 liter)"
            },
            "campaignType": {
              "type": "string",
              "description": "Campaign type identificator",
              "example": "F"
            },
            "rewardType": {
              "type": "string",
              "description": "Type of reward. 'double' = double bonus",
              "example": "double"
            },
            "points": {
              "type": "integer",
              "description": "Points rewarded by purchasing a product included in this campaign. Depending on rewardType, this value is not always set.",
              "example": null
            },
            "campaignImageUrl": {
              "type": "string",
              "description": "URL to an image representing the campaign",
              "example": "https://cdn.oculos.no/images/test.png"
            },
            "validFrom": {
              "type": "string",
              "description": "The campaign is valid from",
              "example": "2022-05-29T00:00:00"
            },
            "validTo": {
              "type": "string",
              "description": "The campaign is valid to",
              "example": "2022-06-29T00:00:00"
            },
            "products": {
              "type": "array",
              "description": "List of products included in campaign",
              "items": {
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ProductId included in campaign",
                    "example": "AA-123456789"
                  }
                }
              }
            }
          }
        }
      },
      "BonusImportRequest": {
        "type": "object",
        "properties": {
          "externalId": {
            "type": "string",
            "example": "+4712345678",
            "description": "The external identifer, most common is the members mobile phone number."
          },
          "activity": {
            "type": "string",
            "description": "The id of the activity that the customer has performed.",
            "example": "20"
          },
          "activityDate": {
            "type": "string",
            "description": "When whas the activity done.",
            "example": "2022-07-01"
          },
          "activityValue": {
            "type": "integer",
            "description": "How many points is awarded for the activity.",
            "example": 10
          }
        }
      },
      "BonusImportResponse": {
        "type": "array",
        "items": {
          "properties": {
            "status": {
              "type": "string",
              "example": "1",
              "description": "Response status code"
            },
            "statusText": {
              "type": "string",
              "description": "Response status for the bonus import in text",
              "example": "OK"
            },
            "points": {
              "type": "string",
              "description": "Campaign type identificator",
              "example": "38"
            },
            "totaltPoints": {
              "type": "string",
              "description": "Total bonus amount",
              "example": "38"
            },
            "activityPoints": {
              "type": "string",
              "description": "Points rewarded by purchasing a product included in this campaign. Depending on rewardType, this value is not always set.",
              "example": "8"
            }
          }
        }
      },
      "AddRewardPointsRequest": {
        "type": "object",
        "required": [
          "points",
          "description"
        ],
        "properties": {
          "points": {
            "type": "number",
            "example": 1000,
            "description": "Number of points to add"
          },
          "description": {
            "type": "string",
            "description": "Description of points added",
            "example": "Extra bonus points due to delayed shipment"
          }
        }
      },
      "LoyaltyActivityRequest": {
        "type": "object",
        "description": "An empty payload",
        "properties": {}
      },
      "transferClipsRequest": {
        "type": "object",
        "required": [
          "fromCustomerId",
          "toCustomerId",
          "loyaltycardId",
          "clipCount"
        ],
        "properties": {
          "fromCustomerId": {
            "type": "string",
            "example": "15BE85AB-CD61-4A23-8C22-0981AD35DBD1S2010",
            "description": "The id of the customer that gives away the clips."
          },
          "toCustomerId": {
            "type": "string",
            "example": "2A9ACDD0-9113-4EF4-8EA9-FD343E040EE9",
            "description": "The customer that should receive clips. Target identifier can be either id property or mobile phone."
          },
          "loyaltycardId": {
            "type": "string",
            "example": "952841C1-4385-40B3-8B30-A65AAC66108E",
            "description": "From which loyalty card should the clips be transfered from."
          },
          "clipCount": {
            "type": "integer",
            "example": 1,
            "description": "Number of clips to give."
          },
          "extendedProperties": {
            "type": "object",
            "description": "Additional properties depending on configuration",
            "properties": {
              "additionalProp1": {
                "type": "string"
              },
              "additionalProp2": {
                "type": "string"
              },
              "additionalProp3": {
                "type": "string"
              }
            }
          }
        }
      },
      "BonusRulesResponse": {
        "type": "array",
        "items": {
          "properties": {
            "bonusRuleId": {
              "type": "string",
              "example": "2",
              "description": "Id of bonus rule"
            },
            "name": {
              "type": "string",
              "description": "Name of rule",
              "example": "Registrering"
            },
            "bonusRuleType": {
              "type": "string",
              "description": "Type of rule, for example a bonus rule that is triggered by customer registration",
              "example": "REGISTER"
            },
            "value": {
              "type": "string",
              "description": "Value of bonus rule",
              "example": "30"
            },
            "validFrom": {
              "type": "string",
              "description": "Start date for when the rule is active",
              "example": "2022-01-01T00:00:00"
            },
            "validTo": {
              "type": "string",
              "description": "End date for when the rule is set to inactive. null = no end date otherwise same format as validFrom",
              "example": null
            },
            "created": {
              "type": "string",
              "description": "Timestamp for when the rule was created",
              "example": "2021-01-01T00:00:00"
            }
          }
        }
      },
      "GetConsentsReponse": {
        "type": "array",
        "items": {
          "properties": {
            "name": {
              "type": "string",
              "example": "Medlemsvilkår",
              "description": "Display name of consent"
            },
            "id": {
              "type": "string",
              "description": "Id of consent, use this id when setting consents to true/false",
              "example": "acceptsTerms"
            },
            "metaData": {
              "type": "object"
            }
          }
        }
      },
      "PromotionResponse": {
        "properties": {
          "id": {
            "type": "string",
            "example": "2457B03E-9925-45E9-B551-25F10D7BD4F2",
            "description": "Generated unique promotion id"
          },
          "type": {
            "type": "string",
            "description": "Type of promotion",
            "example": "Promotion"
          },
          "name": {
            "type": "string",
            "example": "Welcome coupon",
            "description": "Name of promotion"
          },
          "available": {
            "type": "boolean",
            "example": true,
            "description": "Boolean that shows the promotions availabilty status"
          },
          "description": {
            "type": "string",
            "example": "This is a coupon that gives the customer 10% discount on any product"
          },
          "terms": {
            "type": "string",
            "example": "This promotion is valid for all products in the store",
            "description": "Terms and conditions of the promotion"
          },
          "urlLink": {
            "type": "string",
            "example": "Link to the promotion"
          },
          "urlImage": {
            "type": "string",
            "example": "https://cdn.oculos.no/img01.png",
            "description": "Link to promotion image"
          },
          "validFrom": {
            "type": "string",
            "example": "2024-04-03T07:38:32.495Z"
          },
          "validTo": {
            "type": "string",
            "example": "2024-04-03T07:38:32.495Z"
          },
          "validTimeFrom": {
            "type": "string",
            "example": "08:00:00",
            "description": "Time of day the promotion becomes valid. Note: This is only a description field that can be used to display information, the actual validity is determined by validFrom and validTo. Default value is 00:00:00"
          },
          "validTimeTo": {
            "type": "string",
            "example": "20:00:00",
            "description": "Time of day the promotion becomes invalid. Note: This is only a description field that can be used to display information, the actual validity is determined by validFrom and validTo. Default value is 00:00:00"
          },
          "unlimitedRedemption": {
            "type": "boolean",
            "example": false,
            "description": "Can the promotion be redeemed unlimited times"
          },
          "redemptionLimit": {
            "type": "integer",
            "example": 5,
            "description": "How many times can the promotion be redeemed?"
          },
          "redemptionCount": {
            "type": "integer",
            "example": 1,
            "description": "How many times has the promotion been redeem until now"
          },
          "sortOrder": {
            "type": "integer",
            "example": 1,
            "description": "Sort order of the promotion. The sort order is defined in the Trigg application"
          },
          "productsIncluded": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "example": 123,
                  "description": "Id of product"
                },
                "type": {
                  "type": "string",
                  "example": "description"
                }
              }
            }
          },
          "productsExcluded": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "example": 123,
                  "description": "Id of product"
                },
                "type": {
                  "type": "string",
                  "example": "description"
                }
              }
            }
          },
          "storesIncluded": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "example": "S-001",
                  "description": "Id of product"
                }
              }
            }
          },
          "affiliate": {
            "type": "object",
            "description": "Affiliate information",
            "properties": {
              "id": {
                "type": "string",
                "example": "154831A5-7E2E-44D8-8F2B-FB0D33CAD941",
                "description": "Id of affiliate"
              },
              "name": {
                "type": "string",
                "example": "Sample Affiliate",
                "description": "Name of affiliate"
              }
            }
          },
          "redemptionChannels": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "type": {
                  "type": "string",
                  "example": "POS",
                  "description": "Channel identifier. Can be ECOM, POS or ALL"
                },
                "valueType": {
                  "type": "string",
                  "example": "PERCENT",
                  "description": "PERCENT, AMOUNT or CODE"
                },
                "value": {
                  "type": "string",
                  "example": 10,
                  "description": "The value of the promotion"
                },
                "message": {
                  "type": "string",
                  "example": "Only applies to members",
                  "description": "Can contain a small message/instruction for coupon usage"
                }
              }
            }
          },
          "redemptionHistory": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "storeId": {
                  "type": "string",
                  "example": "S-1001",
                  "description": "Id of product"
                },
                "receiptId": {
                  "type": "string",
                  "example": "120C4CF0-1923-4737-8096-A6E8A89F9574",
                  "description": "Unique receiptId"
                },
                "redeemDateTime": {
                  "type": "string",
                  "example": "2024-04-03T07:38:32.495Z"
                }
              }
            }
          }
        }
      },
      "RedeemPromotionRequest": {
        "type": "object",
        "required": [
          "id",
          "storeId",
          "memberId"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "71E8AC01-152D-4B2E-956A-3656CD3396AE",
            "description": "Unique identifier of promotion"
          },
          "storeId": {
            "type": "string",
            "description": "Id of store that makes the redeem",
            "example": "STORE-001"
          },
          "cashRegisterId": {
            "type": "string",
            "description": "Id of cash register in store that makes the redeem",
            "example": "POS-001"
          },
          "cashierId": {
            "type": "string",
            "description": "Id of casher/employee that makes the redeem",
            "example": "123"
          },
          "customerId": {
            "type": "string",
            "description": "Id of customer to validate the promotion against. Depending on configuration in OIP, this can be a internalId, mobile phone, externalId etc.",
            "example": "3477B4C3-5E2E-4007-9C26-41E60FECB016"
          },
          "receiptId": {
            "type": "string",
            "description": "Id of reciept that the promotion i applied to. Should be the same Id as the receipt sent to OIP after the purchase.",
            "example": "RECEIPT_001"
          },
          "extendedProperties": {
            "type": "object",
            "description": "Additional properties depending on configuration",
            "properties": {
              "additionalProp1": {
                "type": "string"
              },
              "additionalProp2": {
                "type": "string"
              },
              "additionalProp3": {
                "type": "string"
              }
            }
          }
        }
      },
      "CouponHistoryResponse": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "couponId": {
              "type": "string",
              "example": "0D23E714-E09C-457E-8D4D-CC3DCCCC8698",
              "description": "Unique id of coupon"
            },
            "description": {
              "type": "string",
              "description": "Short description of coupon",
              "example": "20% member discount"
            }
          }
        }
      },
      "PromotionsByCartRequest": {
        "type": "object",
        "required": [
          "customerId",
          "articles"
        ],
        "properties": {
          "customerId": {
            "type": "string",
            "example": "15BE85AB-CD61-4A23-8C22-0981AD35DBD1S2010",
            "description": "customer id"
          },
          "storeId": {
            "type": "string",
            "description": "Id of store that sends the cart",
            "example": "STORE001"
          },
          "receiptId": {
            "type": "string",
            "description": "Unique id of receipt",
            "example": "08580DEE-C3B8-4808-8A9A-1CE9F8096B52"
          },
          "articles": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "List of articles in cart",
              "properties": {
                "articleId": {
                  "type": "string"
                },
                "price": {
                  "type": "number"
                },
                "quantity": {
                  "type": "number"
                }
              }
            }
          }
        }
      },
      "DynamicResponse": {
        "type": "object",
        "properties": {
          "field1": {
            "type": "string",
            "example": "This is a string"
          },
          "field2": {
            "type": "number",
            "example": 123
          },
          "field3": {
            "type": "string",
            "example": "Another string"
          }
        }
      },
      "PromotionCampaignResponse": {
        "type": "array",
        "description": "List of promotion campaigns",
        "items": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "example": "5A623177-9E15-4568-AC7F-851D36DB70A1",
              "description": "Id of the promotion campaign"
            },
            "name": {
              "type": "string",
              "example": "Velkomstkupong 10%",
              "description": "Name of the promotion campaign"
            },
            "description": {
              "type": "string",
              "example": "Velkomstkupong 10%",
              "description": "Description of the promotion campaign"
            },
            "redemptionChannel": {
              "type": "string",
              "example": "ALL",
              "description": "Redemption channel of the promotion campaign"
            },
            "type": {
              "type": "string",
              "example": "Promotion",
              "description": "Type of the promotion campaign"
            },
            "imageUrl": {
              "type": "string",
              "example": null,
              "description": "Image URL of the promotion campaign"
            },
            "linkUrl": {
              "type": "string",
              "example": null,
              "description": "Link URL of the promotion campaign"
            },
            "validFrom": {
              "type": "string",
              "format": "date-time",
              "example": "2025-03-01T00:00:00",
              "description": "Start date and time of the promotion campaign"
            },
            "validTo": {
              "type": "string",
              "format": "date-time",
              "example": null,
              "description": "End date and time of the promotion campaign"
            }
          }
        }
      },
      "PromotionDefintionsResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "example": "8F96A471-05F4-4A9B-8156-97BD35F6F29D"
          },
          "active": {
            "type": "boolean",
            "example": true
          },
          "name": {
            "type": "string",
            "example": "Voucher kr 100,-"
          },
          "description": {
            "type": "string",
            "example": "This is your welcome offer. Use it to get a discount on your next purchase."
          },
          "linkUrl": {
            "type": "string",
            "example": "https://cdn.oculos.no/8F96A471-05F4-4A9B-8156-97BD35F6F29D"
          },
          "imageUrl": {
            "type": "string",
            "example": "https://cdn.oculos.no/8F96A471-05F4-4A9B-8156-97BD35F6F29D.png"
          },
          "type": {
            "type": "string",
            "example": "Promotion"
          },
          "subType": {
            "type": "string",
            "example": null
          },
          "validFrom": {
            "type": "string",
            "format": "date-time",
            "example": "2025-03-01T00:00:00"
          },
          "validTo": {
            "type": "string",
            "format": "date-time",
            "example": null
          },
          "redemptionLimit": {
            "type": "integer",
            "example": 1
          },
          "unlimitedRedemption": {
            "type": "boolean",
            "example": false
          },
          "redemptionChannels": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "type": {
                  "type": "string",
                  "example": "eCom"
                },
                "valueType": {
                  "type": "string",
                  "example": "amount"
                },
                "value": {
                  "type": "string",
                  "example": "100"
                },
                "message": {
                  "type": "string",
                  "example": ""
                }
              }
            }
          },
          "productsIncluded": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "example": []
          },
          "productsExcluded": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "example": []
          },
          "storesIncluded": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "example": []
          },
          "tiersIncluded": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "example": []
          },
          "clientId": {
            "type": "string",
            "example": null
          },
          "created": {
            "type": "string",
            "format": "date-time",
            "example": "2025-03-06T13:11:25.233"
          },
          "createdBy": {
            "type": "string",
            "example": "no-reply@oculos.no"
          },
          "updated": {
            "type": "string",
            "format": "date-time",
            "example": "2025-03-06T13:11:25.233"
          },
          "updatedBy": {
            "type": "string",
            "example": "no-reply@oculos.no"
          }
        }
      },
      "GenericImportRequest": {
        "type": "object",
        "properties": {
          "members": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "example": "John Doe"
                },
                "age": {
                  "type": "integer",
                  "example": 30
                },
                "email": {
                  "type": "string",
                  "example": "john.doe@example.com"
                },
                "address": {
                  "type": "string",
                  "example": "Street 1"
                },
                "city": {
                  "type": "string",
                  "example": "Oslo"
                },
                "zip": {
                  "type": "string",
                  "example": 10
                },
                "metaData": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "isVip": {
                        "type": "boolean",
                        "example": true
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "GetStampcardResponse": {
        "type": "array",
        "description": "List of a customers stamp cards",
        "items": {
          "type": "object",
          "properties": {
            "id": {
              "type": "integer",
              "example": "4",
              "description": "Id of stamp card."
            },
            "namn": {
              "type": "string",
              "example": "Black coffee",
              "description": "Name of stamp card"
            },
            "total": {
              "type": "number",
              "example": 6,
              "description": "Total number of clips/stamps needed"
            },
            "count": {
              "type": "number",
              "example": 3,
              "description": "Current clip/stamp count"
            },
            "imageUrl": {
              "type": "string",
              "example": "cdn.oculos.no/coffee_clip3.png",
              "description": "Image for stamp card. Requires additional setup."
            },
            "sortOrder": {
              "type": "integer",
              "example": 1,
              "description": "Sort order of the promotion. The sort order is defined in the Trigg application"
            },
            "extendedProperties": {
              "type": "object",
              "description": "Additional properties depending on configuration",
              "properties": {
                "additionalProp1": {
                  "type": "object"
                },
                "additionalProp2": {
                  "type": "object"
                },
                "additionalProp3": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "LoyaltyResponse": {
        "properties": {
          "points": {
            "type": "number",
            "example": 500,
            "description": "Current point balance on customer. This property also contains points that may be pending. \n\nThe property ```pointsActive``` returns the current available balance.\n"
          },
          "pointsActive": {
            "type": "number",
            "description": "Totalt points active",
            "example": 300
          },
          "pointsPending": {
            "type": "number",
            "example": 200,
            "description": "Points that a user has earned but are not yet available for use due to pending validation or processing"
          },
          "pointsExpired": {
            "type": "number",
            "example": 100,
            "description": "Number of loyalty points that a user had but have since expired and are no longer available for use."
          },
          "pointsTotal": {
            "type": "number",
            "example": 600,
            "description": "Total points earned through history"
          },
          "tier": {
            "type": "string",
            "example": "Gold",
            "description": "The loyalty tier the customer is currently in, based on their points balance and the tier thresholds defined in the loyalty program. Tiers are typically used to provide different levels of rewards and benefits to customers based on their engagement and loyalty."
          },
          "loyaltyCards": {
            "$ref": "#/components/schemas/GetStampcardResponse"
          }
        }
      },
      "CustomerResponse": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "example": "2457B03E-9925-45E9-B551-25F10D7BD4F2",
                "description": "Generated unique customer id"
              },
              "externalId": {
                "type": "string",
                "description": "Secondary/external customer id"
              },
              "mobilePhone": {
                "type": "string",
                "example": "+4712345678"
              },
              "email": {
                "type": "string",
                "example": "test@test.com"
              },
              "firstName": {
                "type": "string"
              },
              "lastName": {
                "type": "string"
              },
              "address": {
                "type": "string",
                "example": "Kongens gate 21"
              },
              "zip": {
                "type": "string",
                "example": 1010
              },
              "city": {
                "type": "string",
                "example": "Oslo"
              },
              "country": {
                "type": "string",
                "example": "NO",
                "description": "Country code in 2 letters ISO 3166 standard"
              },
              "birthDate": {
                "type": "string",
                "example": "2007-01-01T00:00:00"
              },
              "gender": {
                "type": "string",
                "example": "Female",
                "description": "Default valid values are Female, Male or Unknown. Can be customized."
              },
              "favoriteStores": {
                "type": "array",
                "items": {
                  "type": "string",
                  "example": "S100"
                }
              },
              "interests": {
                "type": "array",
                "items": {
                  "type": "string",
                  "example": "Sports"
                }
              },
              "loyalty": {
                "type": "object",
                "$ref": "#/components/schemas/LoyaltyResponse"
              },
              "promotions": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/PromotionResponse"
                }
              },
              "consents": {
                "type": "object",
                "properties": {
                  "acceptsTerms": {
                    "type": "boolean"
                  },
                  "acceptsEmail": {
                    "type": "boolean"
                  },
                  "acceptsSms": {
                    "type": "boolean"
                  },
                  "extendedConsents": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        },
                        "value": {
                          "type": "boolean"
                        },
                        "name": {
                          "type": "string"
                        },
                        "description": {
                          "type": "string"
                        },
                        "consentDate": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              },
              "extendedProperties": {
                "type": "object",
                "properties": {
                  "additionalProp1": {
                    "type": "string"
                  },
                  "additionalProp2": {
                    "type": "string"
                  },
                  "additionalProp3": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "metaData": {
            "type": "object",
            "properties": {
              "CreatedAt": {
                "type": "string",
                "example": "2023-01-01 15:15:00"
              },
              "UpdatedAt": {
                "type": "string",
                "example": "2023-01-05 15:15:00"
              }
            }
          }
        }
      },
      "CustomerUpdateRequest": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "required": [
              "id"
            ],
            "properties": {
              "id": {
                "type": "string",
                "example": "2457B03E-9925-45E9-B551-25F10D7BD4F2"
              },
              "mobilePhone": {
                "type": "string",
                "example": "+4712345678",
                "description": "Contacts mobile phone"
              },
              "externalId": {
                "type": "string",
                "description": "Secondary/external member id"
              },
              "email": {
                "type": "string",
                "example": "test@test.com"
              },
              "firstName": {
                "type": "string"
              },
              "lastName": {
                "type": "string"
              },
              "address": {
                "type": "string",
                "example": "Kongens gate 21"
              },
              "zip": {
                "type": "string",
                "example": 1010
              },
              "city": {
                "type": "string",
                "example": "Oslo"
              },
              "country": {
                "type": "string",
                "example": "NO",
                "description": "Country code in 2 letters ISO 3166 standard"
              },
              "birthDate": {
                "type": "string",
                "example": "2007-01-01T00:00:00"
              },
              "gender": {
                "type": "string",
                "example": "Female",
                "description": "Default valid values are Female, Male or Unknown. Can be customized."
              },
              "favoriteStores": {
                "type": "array",
                "items": {
                  "type": "string",
                  "example": "S100"
                }
              },
              "interests": {
                "type": "array",
                "items": {
                  "type": "string",
                  "example": "Sports"
                }
              },
              "consents": {
                "type": "object",
                "properties": {
                  "acceptsTerms": {
                    "type": "boolean"
                  },
                  "acceptsEmail": {
                    "type": "boolean"
                  },
                  "acceptsSms": {
                    "type": "boolean"
                  },
                  "extendedConsents": {
                    "type": "array",
                    "description": "Additional consents depending on configuration",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "acceptsDigital"
                        },
                        "value": {
                          "type": "boolean",
                          "example": true
                        }
                      }
                    }
                  }
                }
              },
              "extendedProperties": {
                "type": "object",
                "description": "Additional properties depending on configuration",
                "properties": {
                  "additionalProp1": {
                    "type": "string"
                  },
                  "additionalProp2": {
                    "type": "string"
                  },
                  "additionalProp3": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "source": {
            "type": "object",
            "required": [
              "storeId",
              "sourceName"
            ],
            "properties": {
              "storeId": {
                "type": "string",
                "example": "S2010",
                "description": "Specifies from which store the request is from"
              },
              "cashRegisterId": {
                "type": "string",
                "example": "POS-123",
                "description": "Specifies from which cash register the request is from"
              },
              "cashierId": {
                "type": "string",
                "example": "ID-321",
                "description": "Specifies from which cashier the request is from"
              },
              "sourceName": {
                "type": "string"
              },
              "extendedSourceFields": {
                "type": "object",
                "properties": {
                  "additionalProp1": {
                    "type": "string"
                  },
                  "additionalProp2": {
                    "type": "string"
                  },
                  "additionalProp3": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      },
      "MinimalCustomerUpdateRequest": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "example": "2457B03E-9925-45E9-B551-25F10D7BD4F2"
              }
            }
          },
          "source": {
            "type": "object",
            "properties": {
              "storeId": {
                "type": "string"
              },
              "sourceName": {
                "type": "string"
              }
            }
          }
        }
      },
      "CustomerRequest": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "required": [
              "mobilePhone"
            ],
            "properties": {
              "mobilePhone": {
                "type": "string",
                "example": "+4712345678",
                "description": "Customers mobile phone"
              },
              "externalId": {
                "type": "string",
                "description": "Secondary/external customer id"
              },
              "email": {
                "type": "string",
                "example": "test@test.com"
              },
              "firstName": {
                "type": "string"
              },
              "lastName": {
                "type": "string"
              },
              "address": {
                "type": "string",
                "example": "Kongens gate 21"
              },
              "zip": {
                "type": "string",
                "example": 1010
              },
              "city": {
                "type": "string",
                "example": "Oslo"
              },
              "country": {
                "type": "string",
                "example": "NO",
                "description": "Country code in 2 letters ISO 3166 standard"
              },
              "birthDate": {
                "type": "string",
                "example": "2007-01-01T00:00:00"
              },
              "gender": {
                "type": "string",
                "example": "Female",
                "description": "Default valid values are Female, Male or Unknown. Can be customized."
              },
              "favoriteStores": {
                "type": "array",
                "items": {
                  "type": "string",
                  "example": "S100"
                }
              },
              "interests": {
                "type": "array",
                "items": {
                  "type": "string",
                  "example": "Sports"
                }
              },
              "consents": {
                "type": "object",
                "properties": {
                  "acceptsTerms": {
                    "type": "boolean"
                  },
                  "acceptsEmail": {
                    "type": "boolean"
                  },
                  "acceptsSms": {
                    "type": "boolean"
                  },
                  "extendedConsents": {
                    "type": "array",
                    "description": "Additional consents depending on configuration",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string",
                          "example": "acceptsDigital"
                        },
                        "value": {
                          "type": "boolean",
                          "example": true
                        }
                      }
                    }
                  }
                }
              },
              "extendedProperties": {
                "type": "object",
                "description": "Additional properties depending on configuration",
                "properties": {
                  "additionalProp1": {
                    "type": "string"
                  },
                  "additionalProp2": {
                    "type": "string"
                  },
                  "additionalProp3": {
                    "type": "string"
                  }
                }
              }
            }
          },
          "source": {
            "type": "object",
            "required": [
              "storeId",
              "sourceName"
            ],
            "properties": {
              "storeId": {
                "type": "string",
                "example": "S2010",
                "description": "Specifies from which store the request is from"
              },
              "cashRegisterId": {
                "type": "string",
                "example": "POS-123",
                "description": "Specifies from which cash register the request is from"
              },
              "cashierId": {
                "type": "string",
                "example": "ID-321",
                "description": "Specifies from which cashier the request is from"
              },
              "sourceName": {
                "type": "string"
              },
              "extendedSourceFields": {
                "type": "object",
                "properties": {
                  "additionalProp1": {
                    "type": "string"
                  },
                  "additionalProp2": {
                    "type": "string"
                  },
                  "additionalProp3": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      },
      "MinimalCustomerRequest": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "mobilePhone": {
                "type": "string",
                "example": "+4712345678"
              }
            }
          },
          "source": {
            "type": "object",
            "required": [
              "storeId",
              "sourceName"
            ],
            "properties": {
              "storeId": {
                "type": "string",
                "example": "S2010",
                "description": "Specifies from which store the request is from"
              },
              "sourceName": {
                "type": "string"
              },
              "extendedSourceFields": {
                "type": "object",
                "properties": {
                  "additionalProp1": {
                    "type": "string"
                  },
                  "additionalProp2": {
                    "type": "string"
                  },
                  "additionalProp3": {
                    "type": "string"
                  }
                }
              }
            }
          }
        }
      },
      "MinimalCustomerUpdateRequestByExternalId": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "externalId": {
                "type": "string",
                "example": "2457B03E-9925-45E9-B551-25F10D7BD4F2"
              }
            }
          },
          "source": {
            "type": "object",
            "properties": {
              "storeId": {
                "type": "string"
              },
              "sourceName": {
                "type": "string"
              }
            }
          }
        }
      },
      "CreateProspectRequest": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "email": {
                "type": "string",
                "example": "test@example.com"
              },
              "mobilePhone": {
                "type": "string",
                "example": "+47121212"
              }
            }
          },
          "source": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "example": "Newsletter"
              },
              "storeId": {
                "type": "string",
                "example": "ST-001"
              }
            }
          }
        }
      },
      "CustomerProspectResponse": {
        "type": "object",
        "properties": {
          "externalId": {
            "type": "string",
            "format": "uuid",
            "description": "The external identifier for the customer prospect."
          }
        },
        "required": [
          "externalId"
        ]
      },
      "DiscoverMemberResponse": {
        "type": "object",
        "properties": {
          "firstName": {
            "type": "string",
            "example": "firstName"
          },
          "lastName": {
            "type": "string",
            "example": "lastName"
          },
          "address": {
            "type": "string",
            "example": "Kongens gate 20"
          },
          "zip": {
            "type": "string",
            "example": "0010"
          },
          "city": {
            "type": "string",
            "example": "Oslo"
          },
          "gender": {
            "type": "string",
            "example": "Male"
          },
          "birthDate": {
            "type": "string",
            "example": "1955-12-16T00:00:00"
          },
          "extendedProperties": {
            "type": "object",
            "properties": {
              "additionalProp1": {
                "type": "string"
              },
              "additionalProp2": {
                "type": "string"
              },
              "additionalProp3": {
                "type": "string"
              }
            }
          }
        }
      },
      "MemberAddCardRequest": {
        "type": "object",
        "required": [
          "memberId",
          "token"
        ],
        "properties": {
          "memberId": {
            "type": "string",
            "example": "15BE85AB-CD61-4A23-8C22-0981AD35DBD1S2010",
            "description": "The members Id"
          },
          "token": {
            "type": "string",
            "description": "Card token to add to members list of payment cards",
            "example": "2A9ACDD0-9113-4EF4-8EA9-FD343E040EE9"
          }
        }
      },
      "MemberCardListResponse": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "properties": {
                "id": {
                  "type": "string",
                  "example": "2457B03E-9925-45E9-B551-25F10D7BD4F2",
                  "description": "Generated unique member id"
                },
                "cardId": {
                  "type": "string",
                  "example": "223b6c7f-0961-4efb-9a99-6e20f00a7897",
                  "description": ""
                },
                "token": {
                  "type": "string",
                  "example": "999999999999999999",
                  "description": ""
                },
                "cardName": {
                  "type": "string",
                  "example": "Visa",
                  "description": "Type of card. Depending on source of registration, this value can be empty"
                },
                "cardData": {
                  "type": "string",
                  "example": "05/2025",
                  "description": "Expiration date. Depending on source of registration, this value can be empty"
                },
                "maskedCardNo": {
                  "type": "string",
                  "example": "",
                  "description": "Masked card number. Depending on source of registration, this value can be empty"
                },
                "displayCardName": {
                  "type": "string",
                  "example": "DNB Visa",
                  "description": "Card name given by customer"
                },
                "displayCardData": {
                  "type": "string",
                  "example": "05/2025",
                  "description": "Expiration date given by customer"
                }
              }
            }
          },
          "metaData": {
            "type": "object",
            "properties": {
              "CreatedAt": {
                "type": "string",
                "example": "2023-01-01 15:15:00"
              },
              "UpdatedAt": {
                "type": "string",
                "example": "2023-01-05 15:15:00"
              }
            }
          }
        }
      },
      "SignatureRequest": {
        "type": "object",
        "required": [
          "source",
          "provider",
          "memberId"
        ],
        "properties": {
          "source": {
            "type": "string",
            "example": "ECOM",
            "description": "String that identifies the client by name that makes the request"
          },
          "provider": {
            "type": "string",
            "description": "Which provider should be used (default is Verifone)",
            "example": "Verifone"
          },
          "data": {
            "type": "object",
            "required": [
              "firstName",
              "lastName",
              "email",
              "mobilePhone"
            ],
            "properties": {
              "firstName": {
                "type": "string",
                "example": "John"
              },
              "lastName": {
                "type": "string",
                "example": "Doe"
              },
              "email": {
                "type": "string",
                "example": "test@test.com"
              },
              "mobilePhone": {
                "type": "string",
                "example": "+4712345678"
              }
            }
          }
        }
      },
      "MessagingSendSmsRequest": {
        "type": "object",
        "properties": {
          "phoneNumber": {
            "type": "string",
            "example": "+4712345678",
            "description": "The receivers phone number. Must contain country code prefix."
          },
          "message": {
            "type": "string",
            "example": "This is a text message",
            "description": "The message you want to send"
          },
          "sender": {
            "type": "string",
            "example": "Oculos",
            "description": "The name of sender"
          }
        }
      },
      "VehicleResponse": {
        "type": "array",
        "description": "List of customers vehicles",
        "items": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "example": "B4B8DB75-517F-464F-8E0A-E30E969BDA8B",
              "description": "Id of vehicle"
            },
            "registrationNumber": {
              "type": "string",
              "example": "AB12345",
              "description": "Registration number of the vehicle"
            },
            "vin": {
              "type": "string",
              "example": "TMBJC9NY3MF017111",
              "description": "Vehicle Identification Number"
            },
            "vehicleGroup": {
              "type": "string",
              "example": "PERSONBIL",
              "description": "Group of the vehicle"
            },
            "brand": {
              "type": "string",
              "example": "SKODA",
              "description": "Brand of the vehicle"
            },
            "lastInspectionDate": {
              "type": "string",
              "format": "date",
              "example": "2023-04-29",
              "description": "Date of the last inspection"
            },
            "nextInspectionDate": {
              "type": "string",
              "format": "date",
              "example": "2025-04-29",
              "description": "Date of the next inspection"
            },
            "lastOdometerStand": {
              "type": "number",
              "example": null,
              "description": "Last recorded odometer stand"
            },
            "lastRegistrationDate": {
              "type": "string",
              "format": "date",
              "example": "2024-03-27",
              "description": "Date of the last registration"
            },
            "firstRegistrationDate": {
              "type": "string",
              "format": "date",
              "example": "2021-04-29",
              "description": "Date of the first registration"
            },
            "extendedProperties": {
              "type": "object",
              "description": "Additional properties depending on configuration",
              "properties": {
                "additionalProp1": {
                  "type": "object"
                },
                "additionalProp2": {
                  "type": "object"
                },
                "additionalProp3": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "PostVehicleRequest": {
        "type": "object",
        "properties": {
          "registrationNumber": {
            "type": "string",
            "maxLength": 10,
            "description": "The registration number of the vehicle."
          },
          "vin": {
            "type": "string",
            "maxLength": 20,
            "description": "The Vehicle Identification Number (VIN)."
          },
          "modelYear": {
            "type": "integer",
            "format": "int32",
            "description": "The model year of the vehicle."
          },
          "brandCode": {
            "type": "integer",
            "format": "int32",
            "description": "The code representing the brand of the vehicle."
          },
          "brandName": {
            "type": "string",
            "maxLength": 30,
            "description": "The name of the brand."
          },
          "modelName": {
            "type": "string",
            "maxLength": 30,
            "description": "The name of the model."
          },
          "lastRegistrationDate": {
            "type": "string",
            "maxLength": 30,
            "description": "The date of the last registration."
          },
          "nextInspectionDate": {
            "type": "string",
            "maxLength": 30,
            "description": "The date of the next inspection."
          },
          "fuelCode": {
            "type": "integer",
            "format": "int32",
            "description": "The code representing the fuel type."
          },
          "fuelName": {
            "type": "string",
            "maxLength": 30,
            "description": "The name of the fuel type."
          },
          "colorCode": {
            "type": "integer",
            "format": "int32",
            "description": "The code representing the color of the vehicle."
          },
          "colorName": {
            "type": "string",
            "maxLength": 30,
            "description": "The name of the color."
          },
          "dealerId": {
            "type": "string",
            "maxLength": 30,
            "description": "The ID of the dealer."
          },
          "extendedProperties": {
            "type": "object",
            "additionalProperties": true,
            "description": "A dictionary of extended properties."
          }
        },
        "required": [
          "registrationNumber"
        ]
      },
      "PutVehicleRequest": {
        "type": "object",
        "required": [
          "registrationNumber"
        ],
        "properties": {
          "registrationNumber": {
            "type": "string",
            "maxLength": 10,
            "description": "The registration number of the vehicle."
          },
          "vin": {
            "type": "string",
            "description": "The Vehicle Identification Number (VIN)."
          },
          "brand": {
            "type": "string",
            "description": "The brand of the vehicle."
          },
          "extendedProperties": {
            "type": "object",
            "additionalProperties": true,
            "description": "A dictionary of extended properties."
          }
        }
      },
      "AchivementUpdateRequest": {
        "type": "object",
        "required": [
          "id",
          "customerId",
          "storeId"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "The id of the loyalty card.",
            "example": "2457B03E-9925-45E9-B551-25F10D7BD4F2"
          },
          "customerId": {
            "type": "string",
            "example": "D2CC3001-AE10-4FD2-85DD-E4F4CEAD3714",
            "description": "The customers unique id. \n"
          },
          "storeId": {
            "type": "string",
            "example": "STORE-001",
            "description": "The store id"
          },
          "adjustmentAmount": {
            "type": "integer",
            "example": 1,
            "description": "Number of clips/stamps to add to the customers loyalty card. \n\nDefault value are 1, but can be set higher or to a negative value to remove clips/stamps.\n"
          },
          "extendedProperties": {
            "type": "object",
            "description": "Additional properties depending on configuration",
            "properties": {
              "additionalProp1": {
                "type": "object"
              },
              "additionalProp2": {
                "type": "object"
              },
              "additionalProp3": {
                "type": "object"
              }
            }
          }
        }
      },
      "StampcardCampaignsResponse": {
        "type": "array",
        "description": "List of products / line items",
        "items": {
          "type": "object",
          "properties": {
            "stampCardId": {
              "type": "string",
              "example": "4",
              "description": "Id of stamp card."
            },
            "stampCard": {
              "type": "string",
              "example": "Black coffee",
              "description": "Name of stamp card"
            },
            "stampCardType": {
              "type": "string",
              "example": "Coffee",
              "description": "Type/category of stamp card"
            },
            "productId": {
              "type": "string",
              "example": "7049987090935",
              "description": "Product id that qualifies for a clip/stamp"
            },
            "extendedProperties": {
              "type": "object",
              "description": "Additional properties depending on configuration",
              "properties": {
                "additionalProp1": {
                  "type": "object"
                },
                "additionalProp2": {
                  "type": "object"
                },
                "additionalProp3": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "StoreResponse": {
        "type": "array",
        "items": {
          "properties": {
            "id": {
              "type": "string",
              "example": "STORE-001",
              "description": "StoreId"
            },
            "name": {
              "type": "string",
              "description": "Our main store"
            },
            "extendedProperties": {
              "type": "object",
              "properties": {
                "externalId": {
                  "type": "string",
                  "example": "10001"
                },
                "address": {
                  "type": "string",
                  "example": "Kongens gate 21"
                },
                "zip": {
                  "type": "string",
                  "example": "0153"
                },
                "city": {
                  "type": "string",
                  "example": "Oslo"
                }
              }
            }
          }
        }
      },
      "TransactionResponse": {
        "type": "array",
        "items": {
          "properties": {
            "receiptId": {
              "type": "string",
              "example": "122014",
              "description": "Unique id of receipt/transaction"
            },
            "receiptDate": {
              "type": "string",
              "example": "2023-10-03T19:00:53",
              "description": "Date of purchase"
            },
            "storeId": {
              "type": "string",
              "example": "332",
              "description": "Id of store"
            },
            "storeName": {
              "type": "string",
              "example": "Our main store",
              "description": "Name of store"
            },
            "grossAmount": {
              "type": "number",
              "example": 979.3,
              "description": "Total amount of transaction"
            },
            "vat": {
              "type": "number",
              "example": 195.86,
              "description": "Total VAT amount of transaction"
            },
            "netAmount": {
              "type": "number",
              "example": 783.44,
              "description": "Totalt amount of transction without VAT"
            },
            "discount": {
              "type": "number",
              "example": 0,
              "description": "Totalt discount given on transaction"
            },
            "rows": {
              "type": "array",
              "description": "List of products / line items",
              "items": {
                "type": "object",
                "properties": {
                  "lineNo": {
                    "type": "string",
                    "example": "1",
                    "description": "Items line number in transaction"
                  },
                  "productId": {
                    "type": "string",
                    "example": "7049987090935",
                    "description": "Product id"
                  },
                  "productName": {
                    "type": "string",
                    "example": "Black jacket",
                    "description": "Name of product"
                  },
                  "productGroupLevel1Name": {
                    "type": "string",
                    "example": "Clothes",
                    "description": "Upper level product category"
                  },
                  "productGroupLevel2Name": {
                    "type": "string",
                    "example": "Jackets",
                    "description": "Second level product category"
                  },
                  "quantity": {
                    "type": "number",
                    "example": 1,
                    "description": "Number of products purchased"
                  },
                  "grossAmount": {
                    "type": "number",
                    "example": 979.3,
                    "description": "Totalt amount of line"
                  },
                  "vat": {
                    "type": "number",
                    "example": 195.86,
                    "description": "Totalt amount of VAT of line"
                  },
                  "netAmount": {
                    "type": "number",
                    "example": 783.44,
                    "description": "Totalt amount of line without VAT"
                  },
                  "discount": {
                    "type": "number",
                    "example": 0,
                    "description": "Totalt amount of discount given on line"
                  },
                  "points": {
                    "type": "number",
                    "example": 98,
                    "description": "TNumber of points earned on this line item. 0 if no points are earned. Requires that earning of bonus points are enabled in Trigg application."
                  },
                  "transactionType": {
                    "type": "string",
                    "example": "PURCHASE",
                    "description": "Indicates which type of transaction. PURCHASE or RETURN"
                  }
                }
              }
            }
          }
        }
      },
      "CustomTransactionRequest": {
        "type": "object",
        "properties": {
          "ReceiptRequests": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "Header": {
                  "type": "object",
                  "properties": {
                    "StoreId": {
                      "type": "string",
                      "example": "001",
                      "description": "Id of store where the transaction was made"
                    },
                    "EcrId": {
                      "type": "string",
                      "example": "1",
                      "default": "Id of cash register where the transaction was made"
                    },
                    "ReceiptId": {
                      "type": "string",
                      "example": "9999258836",
                      "description": "Id of the reciept"
                    },
                    "TimeStamp": {
                      "type": "string",
                      "example": "2023-10-13T14:50:05",
                      "description": "Timestamp of the transaction in UTC time format"
                    },
                    "ConsumerId": {
                      "type": "string",
                      "example": "9ae37ad3-8a55-4bb5-81fd-b08f00b684ed",
                      "description": "Depending on configuration, this could be a unique id or the customers phone number."
                    },
                    "GrossAmount": {
                      "type": "number",
                      "example": 1817.8,
                      "description": "The total amount of the transaction"
                    },
                    "Vat": {
                      "type": "number",
                      "example": 363.56,
                      "description": "The totalt VAT amount of the transaction"
                    },
                    "NetAmount": {
                      "type": "number",
                      "example": 1454.24,
                      "description": "The total amount of the transaction without VAT"
                    },
                    "Discount": {
                      "type": "number",
                      "example": 0,
                      "default": "The total amount of discount given on the transaction"
                    },
                    "Currency": {
                      "type": "number",
                      "example": "NOK",
                      "description": "The currency used. Use currency code as described in https://www.iban.com/currency-codes"
                    },
                    "PaymentString": {
                      "type": "string",
                      "example": "Any type of string",
                      "description": "Can contain a string with payment data sent from POS. Max length 4000 chars"
                    },
                    "Ext1": {
                      "type": "string",
                      "example": "",
                      "description": "Extra field available for customizations"
                    },
                    "Ext2": {
                      "type": "string",
                      "example": "",
                      "description": "Extra field available for customizations"
                    },
                    "Ext3": {
                      "type": "string",
                      "example": "",
                      "description": "Extra field available for customizations"
                    },
                    "Ext4": {
                      "type": "string",
                      "example": "",
                      "description": "Extra field available for customizations"
                    },
                    "Ext5": {
                      "type": "string",
                      "example": "",
                      "description": "Extra field available for customizations"
                    }
                  }
                },
                "Items": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "ReceiptId": {
                        "type": "string",
                        "example": "Id of receipt"
                      },
                      "LineNo": {
                        "type": "string",
                        "example": 1,
                        "description": "Line number in transaction for item(s)"
                      },
                      "Quantity": {
                        "type": "number",
                        "example": 1,
                        "description": "Number of products purchased"
                      },
                      "ProductGroupLevel1Id": {
                        "type": "string",
                        "example": 45,
                        "description": "Id of top level product category"
                      },
                      "ProductGroupLevel1Name": {
                        "type": "string",
                        "example": "CHRISTMAS",
                        "description": "Name of top level product category"
                      },
                      "ProductGroupLevel2Id": {
                        "type": "string",
                        "example": 4545,
                        "description": "Id of second level product category where available"
                      },
                      "ProductGroupLevel2Name": {
                        "type": "string",
                        "example": "DECORACTIONS",
                        "description": "Name of second level product category where available"
                      },
                      "ProductGroupLevel3Id": {
                        "type": "string",
                        "example": 454545,
                        "description": "Id of third level product category where available"
                      },
                      "ProductGroupLevel3Name": {
                        "type": "string",
                        "example": "MINI TREES",
                        "description": "Name of third level product category where available"
                      },
                      "ProductId": {
                        "type": "string",
                        "example": "VR1722775",
                        "description": "Id of product"
                      },
                      "ProductName": {
                        "type": "string",
                        "example": "MINI CHRISTMAS TREE WITH LED LIGHTS",
                        "description": "Name of product"
                      },
                      "SupplierId": {
                        "type": "string",
                        "example": "9000",
                        "description": "Id of supplier"
                      },
                      "SupplierName": {
                        "type": "string",
                        "example": "The christmas company",
                        "default": "Name of supplier"
                      },
                      "GrossAmount": {
                        "type": "number",
                        "example": 1817.8,
                        "description": "Total amount of item(s)"
                      },
                      "Vat": {
                        "type": "number",
                        "example": 363.56,
                        "description": "The total VAT amount of item(s)"
                      },
                      "NetAmount": {
                        "type": "number",
                        "example": 1454.24,
                        "description": "The totalt amount item(s) without VAT"
                      },
                      "Discount": {
                        "type": "number",
                        "example": 0,
                        "description": "Totalt discount given on item(s)"
                      },
                      "Cost": {
                        "type": "number",
                        "example": 0,
                        "description": "The total cost of products where available"
                      },
                      "CampaignId": {
                        "type": "string",
                        "example": "EF5C352A-D8D8-431E-A8D6-22928F405F20",
                        "description": "Reference to campaign where available"
                      },
                      "TransactionType": {
                        "type": "string",
                        "example": "PURCHASE",
                        "description": "Type of transaction (PURCHASE or RETURN)"
                      },
                      "Ext1": {
                        "type": "string",
                        "example": "",
                        "description": "Extra field available for customizations"
                      },
                      "Ext2": {
                        "type": "string",
                        "example": "",
                        "description": "Extra field available for customizations"
                      },
                      "Ext3": {
                        "type": "string",
                        "example": "",
                        "description": "Extra field available for customizations"
                      },
                      "Ext4": {
                        "type": "string",
                        "example": "",
                        "description": "Extra field available for customizations"
                      },
                      "Ext5": {
                        "type": "string",
                        "example": "",
                        "description": "Extra field available for customizations"
                      },
                      "Ext6": {
                        "type": "string",
                        "example": "",
                        "description": "Extra field available for customizations"
                      },
                      "Ext7": {
                        "type": "string",
                        "example": "",
                        "description": "Extra field available for customizations"
                      },
                      "Ext8": {
                        "type": "string",
                        "example": "",
                        "description": "Extra field available for customizations"
                      },
                      "Ext9": {
                        "type": "string",
                        "example": "",
                        "description": "Extra field available for customizations"
                      },
                      "Ext10": {
                        "type": "string",
                        "example": "",
                        "description": "Extra field available for customizations"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "MinimumTransactionRequest": {
        "type": "object",
        "properties": {
          "ReceiptRequests": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "Header": {
                  "type": "object",
                  "properties": {
                    "StoreId": {
                      "type": "string",
                      "example": "001",
                      "description": "Id of store where the transaction was made"
                    },
                    "ReceiptId": {
                      "type": "string",
                      "example": "9999258836",
                      "description": "Id of the reciept"
                    },
                    "TimeStamp": {
                      "type": "string",
                      "example": "2023-10-13T14:50:05",
                      "description": "Timestamp of the transaction"
                    },
                    "ConsumerId": {
                      "type": "string",
                      "example": "9ae37ad3-8a55-4bb5-81fd-b08f00b684ed",
                      "description": "Depending on configuration, this could be a unique id or the customers phone number."
                    },
                    "GrossAmount": {
                      "type": "number",
                      "example": 1817.8,
                      "description": "The total amount of the transaction"
                    },
                    "Vat": {
                      "type": "number",
                      "example": 363.56,
                      "description": "The totalt VAT amount of the transaction"
                    }
                  }
                },
                "Items": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "ReceiptId": {
                        "type": "string",
                        "example": "Id of receipt"
                      },
                      "LineNo": {
                        "type": "string",
                        "example": 1,
                        "description": "Line number in transaction for item(s)"
                      },
                      "Quantity": {
                        "type": "number",
                        "example": 1,
                        "description": "Number of products purchased"
                      },
                      "ProductId": {
                        "type": "string",
                        "example": "VR1722775",
                        "description": "Id of product"
                      },
                      "ProductName": {
                        "type": "string",
                        "example": "MINI CHRISTMAS THREE WITH LED LIGHTS",
                        "description": "Name of product"
                      },
                      "GrossAmount": {
                        "type": "number",
                        "example": 1817.8,
                        "description": "Total amount of item(s)"
                      },
                      "Vat": {
                        "type": "number",
                        "example": 363.56,
                        "description": "The total VAT amount of item(s)"
                      },
                      "NetAmount": {
                        "type": "number",
                        "example": 1454.24,
                        "description": "The totalt amount item(s) without VAT"
                      },
                      "TransactionType": {
                        "type": "string",
                        "example": "PURCHASE",
                        "description": "Type of transaction (PURCHASE or RETURN)"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "VippsTriggerByPosRequest": {
        "type": "object",
        "properties": {
          "mobilePhone": {
            "type": "string",
            "example": "91345678"
          },
          "storeId": {
            "type": "string",
            "example": "STORE-001"
          },
          "sourceName": {
            "type": "string",
            "example": "POS"
          }
        }
      },
      "WalletLinksReponse": {
        "type": "object",
        "properties": {
          "promotions": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "promotionId": {
                  "type": "string",
                  "format": "uuid",
                  "example": "A7B1B490-85A9-45A5-A6DE-69064B943E08"
                },
                "promotionType": {
                  "type": "string",
                  "example": "PROMOTION"
                },
                "validTo": {
                  "type": "string",
                  "format": "date-time",
                  "example": "2025-12-20T22:59:59"
                },
                "lastActivated": {
                  "type": "string",
                  "format": "date-time",
                  "nullable": true,
                  "example": "2026-02-27T14:33:22.333"
                },
                "passDownloadUrl": {
                  "type": "string",
                  "format": "uri",
                  "example": "https://test-retail-as.triggloyalty.com/pass?t=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0ZW5hbnRZCI6IjQwMDEzMCIsImN1c3RvbWVySWQiOiJFMUI1OTc4RC1CNzQ2LTQ1RkUtOTFCRC1EMzlDQzdEMjBFMzEiLCJwcm9ncmFtSWQiOiIwZmU2NGY3ZC0yMjBmLTRhZDQtODViZi0xMzg1Njg5YjAzMjAiLCJqdGkiOiI5YzRjYWFlNS1kNDc0LTQzZDctOGU3Yi04MjA3NjVkN2YzMTQiLCJwcm9tb3Rpb25JZCI6IkE3QjFCNDkwLTg1QTktNDVBNS1BNkRFLTY5MDY0Qjk0M0UwOCIsInR5cGUiOiJQUk9NT1RJT04iLCJlbnRpdHlJZCI6IkE3QjFCNDkwLTg1QTktNDVBNS1BNkRFLTY5MDY0Qjk0M0UwOCIsImV4cCI6MTc2NjI2Nzk5OSwiaXNzIjoiVHJpZ2cgSW50ZWdyYXRpb25zIiwiYXVkIjoiU3RlbGwgSW50ZWdyYXRpb24ifQ.ZOtVQd7xzwFCI-6BOhuUJLmAPb--3AuRMhidVaH5gMM"
                }
              }
            }
          },
          "memberships": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "membershipId": {
                  "type": "string",
                  "format": "uuid",
                  "example": "B8C2C501-96BA-56B6-B7EF-70175C054F19"
                },
                "membershipType": {
                  "type": "string",
                  "example": "MEMBERSHIP"
                },
                "passDownloadUrl": {
                  "type": "string",
                  "format": "uri",
                  "example": "https://test-retail-as.triggloyalty.com/pass?t=..."
                }
              }
            }
          }
        }
      }
    }
  }
}