Switchfly Machine to Machine (OAuth2 & Refund) API

Describes authentication required (`client_credentials` OAuth 2) and refund requests performed by Switchfly application to 3rd party service to cancel redemption components.

OpenAPI Specification

switchfly-machine-to-machine-oauth2-refund-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Switchfly Loyalty Machine to Machine (OAuth2 & Refund) Machine to Machine (OAuth2 & Refund) Machine to Machine (OAuth2 & Refund) API
  description: "Switchfly uses **OAuth 2** for the SSO authentication required to communicate with any 3rd party API in order to perform loyalty account actions.\nThe grant types supported are:\n\n- **client_credentials**\n- **authorization_code (with PKCE)**\n\nThis flexibility allows clients to seamlessly integrate with our platform. For instance, some clients may already possess\na form of Single Sign-On (SSO) \"token\" utilized internally for various actions concerning loyalty users,\nsuch as fetching profiles, redeeming rewards.\n\nIn such scenarios, adopting the `client_credentials` **grant type** flow could be a more logical choice for initiating Single Sign-On (SSO).\nThis approach enables third parties to consolidate authorization by leveraging parameters such as **client_id** and **client_secret** to acquire an access token.\nThis token operating as a Bearer token, can then be utilized alongside the internal \"token\" within any requests.\n\nFor this flow it will be required for the client to pass that token as a `UserToken` param into Switchfly's SSO endpoint. \n\nIf there is no such thing as a user `token` in the client internal SSO implementation `authorization_code` **grant type** will be the other option for the SSO integration.\n\nAfter any of the OAuth2 flows is completed Switchfly will gain access to any the following credentials:\n- `access_token`\n- `refresh_token` (only required on **Authorization Code** grant type)\n- `UserToken` (only required on **Client Credentials Code** grant type, sent by 3rd party client in SSO request)\n\nOnce this SSO step is completed Switchfly will be able to communicate with a client hosted API capable providing traveler profile information and\nredeeming points.\n\n# Initiate SSO against Switchfly\nIn this section, we will outline the SSO shopping flow for each supported grant type, detailing the endpoints in place.\nAdditionally, we will specify the circumstances under which each API call mentioned in this documentation will be utilized.\n\n## Authorization Code SSO\n\nWhen a third party opts to integrate with Switchfly using the authorization code, our application must initially generate the `code_challenge` data to commence the OAuth2 flow.\nConsequently, it becomes necessary for the third party to initiate navigation to the Switchfly site.\n\nThis implies that within the third-party website, a redirect mechanism must be implemented. This implementation will initially transition the user to the Switchfly site at `https://[domain].switchfly.com/`.\n\nAfter this Switchfly will detect that there is no loyalty session established yet and will generate a `code_challenge` and redirect the user to the specified client provided\n`/authorize` endpoint specifying the `redirect_uri`.\n\nThis `redirect_uri` will be the endpoint capable of receiving the authorization code, that's `https://[domain].switchfly.com/apps/api/sso/oauth2` \n\nFollowing the user's login on the client login form, upon successful authentication, the third-party system is anticipated to send back the authorization code to the aforementioned `redirect_uri`.\n\nOnce Switchfly receives the authorization code it will be used to obtain `access_token` & `refresh_token`.\n\nAfter being able to fetch the tokens Switchfly will perform a request to the provided `/traveler-profile` using the `access_token` as a Authorization Bearer token, which will provide\nback a `TravelerProfile` response back to our system which then will be parsed to SSO the customer into our system.\n\nSwitchfly will present the customer a search form from which the customer can proceed to look for any desired products.\n\nDuring the checkout products process Switchfly will perform a request to the provided `/redeem` endpoint to send the 3rd party system the details about the points redemption\nperformed by the customer and the products being purchased.\n\nDuring the shopping flow on long sessions there will be some keep alive requests (`grant_type=refresh_token`) used to obtain new tokens to allow the user to book once they are ready.\n\n## Flow Steps\n\n- Navigate to the Switchfly site.\n- Redirect to the client's `/authorize` endpoint.\n- Log in with customer credentials.\n- Send the code to Switchfly's `/apps/api/sso/oauth2`.\n- Request a token from the client's `/token` endpoint.\n- Request a profile from the client's `/traveler-profile` endpoint.\n- During checkout, send a request to the client's `/redeem` endpoint.\n- Conditionally, refresh token requests to `/token`.\n\n## Client Credentials SSO\n\nWhen a 3rd party chooses to integrate with Switchfly using client credentials the 3rd party is only required to perform a request to Switchfly OAuth2 endpoint providing the \"**token**\" as a parameter\n\"**userToken**\".\n\n`https://[domain].switchfly.com/apps/api/sso/oauth2` post parameter `\"userToken\"=[internal_token]`\n\nOnce Switchfly receives this token from the 3rd party it will obtain an `access_token` using the provided `client_id` & `client_secret`.\n\nAfter being table to retrieve a token Switchfly will perform a request to the provided `/traveler-profile` endpoint sending the following headers:\n- Authorization: Bearer [`access_token`]\n- UserToken: [userToken send over to `/oauth2` endpoint]\n\nThis should provide back a `TravelerProfile` response back to our system which then will be parsed to SSO the customer into our system.\n\nSwitchfly will present the customer a search form from which the customer can proceed to look for any desired products.\n\nDuring the checkout products process Switchfly will perform a request to the provided `/redeem` endpoint to send the 3rd party system the details about the booking such as points\nused and products included.\n\n## Flow Steps:\n\n- The client submits the userToken to Switchfly's `/apps/api/sso/oauth2`.\n- A token is requested from the client's `/token` endpoint.\n- A profile is requested from the client's `/traveler-profile` endpoint.\n- During checkout, a request is sent to the client's `/redeem` endpoint.\n----"
  version: v3.4
tags:
- name: Machine to Machine (OAuth2 & Refund)
  description: Describes authentication required (`client_credentials` OAuth 2) and refund requests performed by Switchfly application to 3rd party service to cancel redemption components.
paths:
  /admin/token:
    post:
      tags:
      - Machine to Machine (OAuth2 & Refund)
      summary: Authentication Switchfly App against 3rd party API
      operationId: ClientCredentialAdminToken
      description: "This endpoint will be used to perform a OAuth 2 - client credentials token\nrequest.\n\nThe path in this endpoint can be the same as the `/token` path the only requirement is that a different set of \n`client_id` and `client_secret` credentials are shared by the 3rd party to Switchfly as this token request will\nbe triggered to perform a **machine to machine** authentication which will then allow Switchfly to perform API\nrequests to a secured `/refund` endpoint.\n\nThe generated token will be used by the `/refund` endpoint as a Bearer token.\n\n<div style='margin:14px'>\n          <svg xmlns=\"http://www.w3.org/2000/svg\"  xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" width=\"761px\" height=\"402px\" viewBox=\"-0.5 -0.5 761 402\" content=\"&lt;mxfile host=&quot;app.diagrams.net&quot; agent=&quot;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36&quot; version=&quot;26.1.3&quot;&gt;&#10;  &lt;diagram id=&quot;dWV0mfe5jx5J_lB2EB_P&quot; name=&quot;Page-1&quot;&gt;&#10;    &lt;mxGraphModel dx=&quot;1085&quot; dy=&quot;540&quot; grid=&quot;1&quot; gridSize=&quot;10&quot; guides=&quot;1&quot; tooltips=&quot;1&quot; connect=&quot;1&quot; arrows=&quot;1&quot; fold=&quot;1&quot; page=&quot;1&quot; pageScale=&quot;1&quot; pageWidth=&quot;850&quot; pageHeight=&quot;1100&quot; math=&quot;0&quot; shadow=&quot;0&quot;&gt;&#10;      &lt;root&gt;&#10;        &lt;mxCell id=&quot;0&quot; /&gt;&#10;        &lt;mxCell id=&quot;1&quot; parent=&quot;0&quot; /&gt;&#10;        &lt;mxCell id=&quot;YD2cjV0bOqWloPQhhFmI-1&quot; value=&quot;User&quot; style=&quot;shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=0;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&amp;quot;edgeStyle&amp;quot;:&amp;quot;elbowEdgeStyle&amp;quot;,&amp;quot;elbow&amp;quot;:&amp;quot;vertical&amp;quot;,&amp;quot;curved&amp;quot;:0,&amp;quot;rounded&amp;quot;:0};&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;60&quot; y=&quot;40&quot; width=&quot;100&quot; height=&quot;400&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;YD2cjV0bOqWloPQhhFmI-2&quot; value=&quot;Switchfly&quot; style=&quot;shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=0;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&amp;quot;edgeStyle&amp;quot;:&amp;quot;elbowEdgeStyle&amp;quot;,&amp;quot;elbow&amp;quot;:&amp;quot;vertical&amp;quot;,&amp;quot;curved&amp;quot;:0,&amp;quot;rounded&amp;quot;:0};&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;280&quot; y=&quot;40&quot; width=&quot;100&quot; height=&quot;400&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;YD2cjV0bOqWloPQhhFmI-5&quot; value=&quot;&quot; style=&quot;html=1;points=[];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&amp;quot;edgeStyle&amp;quot;:&amp;quot;elbowEdgeStyle&amp;quot;,&amp;quot;elbow&amp;quot;:&amp;quot;vertical&amp;quot;,&amp;quot;curved&amp;quot;:0,&amp;quot;rounded&amp;quot;:0};&quot; parent=&quot;YD2cjV0bOqWloPQhhFmI-2&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;46&quot; y=&quot;140&quot; width=&quot;10&quot; height=&quot;182&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;YD2cjV0bOqWloPQhhFmI-6&quot; value=&quot;&amp;lt;font style=&amp;quot;font-size: 11px;&amp;quot;&amp;gt;3rd party&amp;lt;br&amp;gt;Authorization service&amp;lt;/font&amp;gt;&quot; style=&quot;shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=0;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&amp;quot;edgeStyle&amp;quot;:&amp;quot;elbowEdgeStyle&amp;quot;,&amp;quot;elbow&amp;quot;:&amp;quot;vertical&amp;quot;,&amp;quot;curved&amp;quot;:0,&amp;quot;rounded&amp;quot;:0};&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;520&quot; y=&quot;40&quot; width=&quot;100&quot; height=&quot;400&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;YD2cjV0bOqWloPQhhFmI-8&quot; value=&quot;3rd party&amp;lt;br&amp;gt;Redemption API&quot; style=&quot;shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=0;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&amp;quot;edgeStyle&amp;quot;:&amp;quot;elbowEdgeStyle&amp;quot;,&amp;quot;elbow&amp;quot;:&amp;quot;vertical&amp;quot;,&amp;quot;curved&amp;quot;:0,&amp;quot;rounded&amp;quot;:0};&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;710&quot; y=&quot;40&quot; width=&quot;100&quot; height=&quot;400&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;YD2cjV0bOqWloPQhhFmI-33&quot; value=&quot;&quot; style=&quot;endArrow=classic;html=1;rounded=0;&quot; parent=&quot;1&quot; source=&quot;YD2cjV0bOqWloPQhhFmI-5&quot; edge=&quot;1&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;335&quot; y=&quot;302&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;760&quot; y=&quot;302&quot; as=&quot;targetPoint&quot; /&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;YD2cjV0bOqWloPQhhFmI-34&quot; value=&quot;Refund RQ + access token&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;355.5&quot; y=&quot;270&quot; width=&quot;170&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;YD2cjV0bOqWloPQhhFmI-35&quot; value=&quot;&quot; style=&quot;endArrow=classic;html=1;rounded=0;&quot; parent=&quot;1&quot; target=&quot;YD2cjV0bOqWloPQhhFmI-5&quot; edge=&quot;1&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;760&quot; y=&quot;352&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;340&quot; y=&quot;352&quot; as=&quot;targetPoint&quot; /&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;YD2cjV0bOqWloPQhhFmI-36&quot; value=&quot;Refund RS&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;415&quot; y=&quot;320&quot; width=&quot;80&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;YD2cjV0bOqWloPQhhFmI-37&quot; value=&quot;User cancels booking or &amp;lt;br&amp;gt;booking component&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;135&quot; y=&quot;225&quot; width=&quot;150&quot; height=&quot;40&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;YD2cjV0bOqWloPQhhFmI-53&quot; value=&quot;1&quot; style=&quot;ellipse;whiteSpace=wrap;html=1;aspect=fixed;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;50&quot; y=&quot;240&quot; width=&quot;30&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;YD2cjV0bOqWloPQhhFmI-54&quot; value=&quot;4&quot; style=&quot;ellipse;whiteSpace=wrap;html=1;aspect=fixed;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;775&quot; y=&quot;287&quot; width=&quot;30&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;YD2cjV0bOqWloPQhhFmI-68&quot; value=&quot;5&quot; style=&quot;ellipse;whiteSpace=wrap;html=1;aspect=fixed;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;775&quot; y=&quot;340&quot; width=&quot;30&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;YD2cjV0bOqWloPQhhFmI-70&quot; value=&quot;&quot; style=&quot;endArrow=classic;html=1;rounded=0;&quot; parent=&quot;1&quot; edge=&quot;1&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;336&quot; y=&quot;192&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;760&quot; y=&quot;192&quot; as=&quot;targetPoint&quot; /&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;YD2cjV0bOqWloPQhhFmI-71&quot; value=&quot;Client credentials Grant RQ&amp;amp;nbsp;&amp;lt;div&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;li style=&amp;quot;text-align: left;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&amp;quot;&amp;gt;client_id&amp;amp;nbsp;&amp;lt;/span&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li style=&amp;quot;text-align: left;&amp;quot;&amp;gt;secret&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;360&quot; y=&quot;120&quot; width=&quot;170&quot; height=&quot;80&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;YD2cjV0bOqWloPQhhFmI-72&quot; value=&quot;&quot; style=&quot;endArrow=classic;html=1;rounded=0;&quot; parent=&quot;1&quot; edge=&quot;1&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;760&quot; y=&quot;242&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;336&quot; y=&quot;242&quot; as=&quot;targetPoint&quot; /&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;YD2cjV0bOqWloPQhhFmI-73&quot; value=&quot;Client credentials Acces token RS&quot; style=&quot;text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;355&quot; y=&quot;210&quot; width=&quot;200&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;YD2cjV0bOqWloPQhhFmI-76&quot; value=&quot;2&quot; style=&quot;ellipse;whiteSpace=wrap;html=1;aspect=fixed;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;775&quot; y=&quot;177&quot; width=&quot;30&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;YD2cjV0bOqWloPQhhFmI-77&quot; value=&quot;3&quot; style=&quot;ellipse;whiteSpace=wrap;html=1;aspect=fixed;&quot; parent=&quot;1&quot; vertex=&quot;1&quot;&gt;&#10;          &lt;mxGeometry x=&quot;775&quot; y=&quot;230&quot; width=&quot;30&quot; height=&quot;30&quot; as=&quot;geometry&quot; /&gt;&#10;        &lt;/mxCell&gt;&#10;        &lt;mxCell id=&quot;_E26sfTQ7HFO4f8dlwLb-5&quot; value=&quot;&quot; style=&quot;endArrow=classic;html=1;rounded=0;&quot; edge=&quot;1&quot; parent=&quot;1&quot;&gt;&#10;          &lt;mxGeometry width=&quot;50&quot; height=&quot;50&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#10;            &lt;mxPoint x=&quot;109.5&quot; y=&quot;270&quot; as=&quot;sourcePoint&quot; /&gt;&#10;            &lt;mxPoint x=&quot;329.5&quot; y=&quot;270&quot; as=&quot;targetPoint&quot; /&gt;&#10;          &lt;/mxGeometry&gt;&#10;        &lt;/mxCell&gt;&#10;      &lt;/root&gt;&#10;    &lt;/mxGraphModel&gt;&#10;  &lt;/diagram&gt;&#10;&lt;/mxfile&gt;&#10;\"><defs/><g><g data-cell-id=\"0\"><g data-cell-id=\"1\"><g data-cell-id=\"YD2cjV0bOqWloPQhhFmI-1\"><g><rect x=\"10\" y=\"1\" width=\"100\" height=\"40\" fill=\"#ffffff\" stroke=\"#000000\" pointer-events=\"all\" style=\"fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));\"/><path d=\"M 60 41 L 60 401\" fill=\"none\" stroke=\"#000000\" stroke-miterlimit=\"10\" stroke-dasharray=\"3 3\" pointer-events=\"all\" style=\"stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));\"/></g><g><g transform=\"translate(-0.5 -0.5)\"><switch><foreignObject style=\"overflow: visible; text-align: left;\" pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 21px; margin-left: 11px;\"><div style=\"box-sizing: border-box; font-size: 0; text-align: center; color: #000000; \"><div style=\"display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; \">User</div></div></div></foreignObject><text x=\"60\" y=\"25\" fill=\"light-dark(#000000, #ffffff)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">User</text></switch></g></g></g><g data-cell-id=\"YD2cjV0bOqWloPQhhFmI-2\"><g><rect x=\"230\" y=\"1\" width=\"100\" height=\"40\" fill=\"#ffffff\" stroke=\"#000000\" pointer-events=\"all\" style=\"fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));\"/><path d=\"M 280 41 L 280 401\" fill=\"none\" stroke=\"#000000\" stroke-miterlimit=\"10\" stroke-dasharray=\"3 3\" pointer-events=\"all\" style=\"stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));\"/></g><g><g transform=\"translate(-0.5 -0.5)\"><switch><foreignObject style=\"overflow: visible; text-align: left;\" pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 21px; margin-left: 231px;\"><div style=\"box-sizing: border-box; font-size: 0; text-align: center; color: #000000; \"><div style=\"display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; \">Switchfly</div></div></div></foreignObject><text x=\"280\" y=\"25\" fill=\"light-dark(#000000, #ffffff)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Switchfly</text></switch></g></g><g data-cell-id=\"YD2cjV0bOqWloPQhhFmI-5\"><g><rect x=\"276\" y=\"141\" width=\"10\" height=\"182\" fill=\"#ffffff\" stroke=\"#000000\" pointer-events=\"all\" style=\"fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));\"/></g></g></g><g data-cell-id=\"YD2cjV0bOqWloPQhhFmI-6\"><g><rect x=\"470\" y=\"1\" width=\"100\" height=\"40\" fill=\"#ffffff\" stroke=\"#000000\" pointer-events=\"all\" style=\"fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));\"/><path d=\"M 520 41 L 520 401\" fill=\"none\" stroke=\"#000000\" stroke-miterlimit=\"10\" stroke-dasharray=\"3 3\" pointer-events=\"all\" style=\"stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));\"/></g><g><g transform=\"translate(-0.5 -0.5)\"><switch><foreignObject style=\"overflow: visible; text-align: left;\" pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 21px; margin-left: 471px;\"><div style=\"box-sizing: border-box; font-size: 0; text-align: center; color: #000000; \"><div style=\"display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; \"><font style=\"font-size: 11px;\">3rd party<br />Authorization service</font></div></div></div></foreignObject><text x=\"520\" y=\"25\" fill=\"light-dark(#000000, #ffffff)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">3rd party...</text></switch></g></g></g><g data-cell-id=\"YD2cjV0bOqWloPQhhFmI-8\"><g><rect x=\"660\" y=\"1\" width=\"100\" height=\"40\" fill=\"#ffffff\" stroke=\"#000000\" pointer-events=\"all\" style=\"fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));\"/><path d=\"M 710 41 L 710 401\" fill=\"none\" stroke=\"#000000\" stroke-miterlimit=\"10\" stroke-dasharray=\"3 3\" pointer-events=\"all\" style=\"stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));\"/></g><g><g transform=\"translate(-0.5 -0.5)\"><switch><foreignObject style=\"overflow: visible; text-align: left;\" pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 98px; height: 1px; padding-top: 21px; margin-left: 661px;\"><div style=\"box-sizing: border-box; font-size: 0; text-align: center; color: #000000; \"><div style=\"display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; \">3rd party<br />Redemption API</div></div></div></foreignObject><text x=\"710\" y=\"25\" fill=\"light-dark(#000000, #ffffff)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">3rd party...</text></switch></g></g></g><g data-cell-id=\"YD2cjV0bOqWloPQhhFmI-33\"><g><path d=\"M 286 263 L 703.63 263\" fill=\"none\" stroke=\"#000000\" stroke-miterlimit=\"10\" pointer-events=\"stroke\" style=\"stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));\"/><path d=\"M 708.88 263 L 701.88 266.5 L 703.63 263 L 701.88 259.5 Z\" fill=\"#000000\" stroke=\"#000000\" stroke-miterlimit=\"10\" pointer-events=\"all\" style=\"fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));\"/></g></g><g data-cell-id=\"YD2cjV0bOqWloPQhhFmI-34\"><g><rect x=\"305.5\" y=\"231\" width=\"170\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/></g><g><g transform=\"translate(-0.5 -0.5)\"><switch><foreignObject style=\"overflow: visible; text-align: left;\" pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 246px; margin-left: 391px;\"><div style=\"box-sizing: border-box; font-size: 0; text-align: center; color: #000000; \"><div style=\"display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; \">Refund RQ + access token</div></div></div></foreignObject><text x=\"391\" y=\"250\" fill=\"light-dark(#000000, #ffffff)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Refund RQ + access token</text></switch></g></g></g><g data-cell-id=\"YD2cjV0bOqWloPQhhFmI-35\"><g><path d=\"M 710 313 L 292.37 313\" fill=\"none\" stroke=\"#000000\" stroke-miterlimit=\"10\" pointer-events=\"stroke\" style=\"stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));\"/><path d=\"M 287.12 313 L 294.12 309.5 L 292.37 313 L 294.12 316.5 Z\" fill=\"#000000\" stroke=\"#000000\" stroke-miterlimit=\"10\" pointer-events=\"all\" style=\"fill: light-dark(rgb(0, 0, 0), rgb(255, 255, 255)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));\"/></g></g><g data-cell-id=\"YD2cjV0bOqWloPQhhFmI-36\"><g><rect x=\"365\" y=\"281\" width=\"80\" height=\"30\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/></g><g><g transform=\"translate(-0.5 -0.5)\"><switch><foreignObject style=\"overflow: visible; text-align: left;\" pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 296px; margin-left: 405px;\"><div style=\"box-sizing: border-box; font-size: 0; text-align: center; color: #000000; \"><div style=\"display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; \">Refund RS</div></div></div></foreignObject><text x=\"405\" y=\"300\" fill=\"light-dark(#000000, #ffffff)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">Refund RS</text></switch></g></g></g><g data-cell-id=\"YD2cjV0bOqWloPQhhFmI-37\"><g><rect x=\"85\" y=\"186\" width=\"150\" height=\"40\" fill=\"none\" stroke=\"none\" pointer-events=\"all\"/></g><g><g transform=\"translate(-0.5 -0.5)\"><switch><foreignObject style=\"overflow: visible; text-align: left;\" pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 206px; margin-left: 160px;\"><div style=\"box-sizing: border-box; font-size: 0; text-align: center; color: #000000; \"><div style=\"display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: nowrap; \">User cancels booking or <br />booking component</div></div></div></foreignObject><text x=\"160\" y=\"210\" fill=\"light-dark(#000000, #ffffff)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">User cancels booking or...</text></switch></g></g></g><g data-cell-id=\"YD2cjV0bOqWloPQhhFmI-53\"><g><ellipse cx=\"15\" cy=\"216\" rx=\"15\" ry=\"15\" fill=\"#ffffff\" stroke=\"#000000\" pointer-events=\"all\" style=\"fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));\"/></g><g><g transform=\"translate(-0.5 -0.5)\"><switch><foreignObject style=\"overflow: visible; text-align: left;\" pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 216px; margin-left: 1px;\"><div style=\"box-sizing: border-box; font-size: 0; text-align: center; color: #000000; \"><div style=\"display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; \">1</div></div></div></foreignObject><text x=\"15\" y=\"220\" fill=\"light-dark(#000000, #ffffff)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">1</text></switch></g></g></g><g data-cell-id=\"YD2cjV0bOqWloPQhhFmI-54\"><g><ellipse cx=\"740\" cy=\"263\" rx=\"15\" ry=\"15\" fill=\"#ffffff\" stroke=\"#000000\" pointer-events=\"all\" style=\"fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));\"/></g><g><g transform=\"translate(-0.5 -0.5)\"><switch><foreignObject style=\"overflow: visible; text-align: left;\" pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"><div xmlns=\"http://www.w3.org/1999/xhtml\" style=\"display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 263px; margin-left: 726px;\"><div style=\"box-sizing: border-box; font-size: 0; text-align: center; color: #000000; \"><div style=\"display: inline-block; font-size: 12px; font-family: &quot;Helvetica&quot;; color: light-dark(#000000, #ffffff); line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; \">4</div></div></div></foreignObject><text x=\"740\" y=\"267\" fill=\"light-dark(#000000, #ffffff)\" font-family=\"&quot;Helvetica&quot;\" font-size=\"12px\" text-anchor=\"middle\">4</text></switch></g></g></g><g data-cell-id=\"YD2cjV0bOqWloPQhhFmI-68\"><g><ellipse cx=\"740\" cy=\"316\" rx=\"15\" ry=\"15\" fill=\"#ffffff\" stroke=\"#000000\" pointer-events=\"all\" style=\"fill: light-dark(#ffffff, var(--ge-dark-color, #121212)); stroke: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));\"/></g><g><g transform=\"translate(-0.5 -0.5)\"><switch><foreignObject style=\"overflow: visible; text-align: left;\" pointer-events=\"none\" width=\"100%\" height=\"100%\" requiredFeatures=\"http://www.w3.org/TR/SVG11/feature#Extensibility\"><div xmlns=\"http://

# --- truncated at 32 KB (47 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/switchfly/refs/heads/main/openapi/switchfly-machine-to-machine-oauth2-refund-api-openapi.yml