Switchfly Shopping Flow API
Information about requests performed by Switchfly system to 3rd party service to fetch Loyalty profile data and redeem points from the customer account.
Information about requests performed by Switchfly system to 3rd party service to fetch Loyalty profile data and redeem points from the customer account.
openapi: 3.1.0
info:
title: Switchfly Loyalty Machine to Machine (OAuth2 & Refund) Machine to Machine (OAuth2 & Refund) Shopping Flow 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: Shopping Flow
description: Information about requests performed by Switchfly system to 3rd party service to fetch Loyalty profile data and redeem points from the customer account.
paths:
/traveler-profile:
get:
tags:
- Shopping Flow
summary: Retrieve Traveler Profile information
description: "Request performed to 3rd party endpoint to fetch Traveler Profile information such as `travelerProfileId`, `firstName`, `balancePoints`, `customerCurrency`\n- Supported Currencies:\n - USD\n - AED\n - AUD\n - BBD\n - BRL\n - BSD\n - CAD\n - COP\n - CRC\n - DOP\n - EUR\n - GBP\n - GTQ\n - HNL\n - IDR\n - ILS\n - INR\n - JMD\n - JOD\n - JPY\n - MXN\n - MYR\n - NOK\n - NZD\n - PAB\n - PEN\n - PHP\n - PLN\n - SGD\n - THB\n - TTD\n - UYU\n - VND\n - XCD\n - ZAR\n\n- Supported Languages:\n - English\n - French\n - Spanish\n - LA Spanish\n - Chinese_Simplified\n - Japanese\n - BR Portuguese\n - Thai\n - German\n"
operationId: TravelerProfile
security:
- bearerAuth: []
parameters:
- in: header
name: UserToken
description: Unique string token used to identify user session in case `client_credential` grant type was used for OAuth 2 SSO.
required: false
schema:
type: string
responses:
'200':
description: successful operation
content:
application/json:
schema:
$ref: '#/components/schemas/TravelerProfile'
examples:
TravelerProfile:
$ref: '#/components/examples/TravelerProfile'
/redeem:
post:
tags:
- Shopping Flow
summary: Redeem points from Traveler Points account
description: "This API will allow Switchfly the capability of redeeming points from a customer loyalty profile account.\n\nSwitchfly will send a request to this API endpoint using a JSON payload which will describe the products the customer (booking components) is redeeming points on.\n\nThis will include the points and cash used for each component and will also include information whether or not a credit card payment top up was needed to complete the booking.\n\nThe only requirement for this endpoint is to return Switchfly a unique transaction id that represents the redemption transaction for this customer `redemptionConfirmationId`\n\nThis is important since this `redemptionConfirmationId` will be used by Switchfly if a points refund request is needed later to cancel a booking or individual components of it.\n\n**Note:**\n\nIf a failure occurs after the redeem call is executed, the auto-cancel process will be activated to prevent the user from losing any points. Switchfly will then initiate a product cancellation and initiate a refund, as outlined in the following chart:\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=\"751px\" height=\"802px\" viewBox=\"-0.5 -0.5 751 802\" content=\"<mxfile host="app.diagrams.net" agent="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" version="26.1.3"> <diagram id="dWV0mfe5jx5J_lB2EB_P" name="Page-1"> <mxGraphModel dx="1085" dy="540" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> <mxCell id="YD2cjV0bOqWloPQhhFmI-1" value="User" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=0;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&quot;edgeStyle&quot;:&quot;elbowEdgeStyle&quot;,&quot;elbow&quot;:&quot;vertical&quot;,&quot;curved&quot;:0,&quot;rounded&quot;:0};" parent="1" vertex="1"> <mxGeometry x="60" y="40" width="100" height="800" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-2" value="Switchfly" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=0;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&quot;edgeStyle&quot;:&quot;elbowEdgeStyle&quot;,&quot;elbow&quot;:&quot;vertical&quot;,&quot;curved&quot;:0,&quot;rounded&quot;:0};" parent="1" vertex="1"> <mxGeometry x="280" y="40" width="100" height="800" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-4" value="" style="html=1;points=[];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;edgeStyle&quot;:&quot;elbowEdgeStyle&quot;,&quot;elbow&quot;:&quot;vertical&quot;,&quot;curved&quot;:0,&quot;rounded&quot;:0};" parent="YD2cjV0bOqWloPQhhFmI-2" vertex="1"> <mxGeometry x="45" y="70" width="10" height="320" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-5" value="" style="html=1;points=[];perimeter=orthogonalPerimeter;outlineConnect=0;targetShapes=umlLifeline;portConstraint=eastwest;newEdgeStyle={&quot;edgeStyle&quot;:&quot;elbowEdgeStyle&quot;,&quot;elbow&quot;:&quot;vertical&quot;,&quot;curved&quot;:0,&quot;rounded&quot;:0};" parent="YD2cjV0bOqWloPQhhFmI-2" vertex="1"> <mxGeometry x="46" y="500" width="10" height="182" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-6" value="&lt;font style=&quot;font-size: 11px;&quot;&gt;3rd party&lt;br&gt;Authorization service&lt;/font&gt;" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=0;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&quot;edgeStyle&quot;:&quot;elbowEdgeStyle&quot;,&quot;elbow&quot;:&quot;vertical&quot;,&quot;curved&quot;:0,&quot;rounded&quot;:0};" parent="1" vertex="1"> <mxGeometry x="520" y="40" width="100" height="800" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-8" value="3rd party&lt;br&gt;Redemption API" style="shape=umlLifeline;perimeter=lifelinePerimeter;whiteSpace=wrap;html=1;container=0;dropTarget=0;collapsible=0;recursiveResize=0;outlineConnect=0;portConstraint=eastwest;newEdgeStyle={&quot;edgeStyle&quot;:&quot;elbowEdgeStyle&quot;,&quot;elbow&quot;:&quot;vertical&quot;,&quot;curved&quot;:0,&quot;rounded&quot;:0};" parent="1" vertex="1"> <mxGeometry x="710" y="40" width="100" height="800" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-27" value="" style="endArrow=classic;html=1;rounded=0;" parent="1" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="340.5" y="256.9999999999998" as="sourcePoint" /> <mxPoint x="760" y="257" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-28" value="Redemption RQ + access_token" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> <mxGeometry x="340.5" y="227" width="200" height="30" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-29" value="" style="endArrow=classic;html=1;rounded=0;" parent="1" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="759.5" y="290.9999999999998" as="sourcePoint" /> <mxPoint x="340.5" y="290.9999999999998" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-30" value="Redemption Confirmation RS" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> <mxGeometry x="345.5" y="260" width="180" height="30" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-31" value="" style="endArrow=classic;html=1;rounded=0;" parent="1" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="109.38888888888891" y="258.89" as="sourcePoint" /> <mxPoint x="325" y="258.89" as="targetPoint" /> <Array as="points"> <mxPoint x="240" y="258.89" /> </Array> </mxGeometry> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-32" value="Checkout Redeem Product" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> <mxGeometry x="140" y="228.89" width="170" height="30" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-33" value="" style="endArrow=classic;html=1;rounded=0;" parent="1" source="YD2cjV0bOqWloPQhhFmI-5" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="335" y="662" as="sourcePoint" /> <mxPoint x="760" y="662" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-34" value="Refund RQ + access token" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> <mxGeometry x="355.5" y="630" width="170" height="30" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-35" value="" style="endArrow=classic;html=1;rounded=0;" parent="1" target="YD2cjV0bOqWloPQhhFmI-5" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="760" y="712" as="sourcePoint" /> <mxPoint x="340" y="712" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-36" value="Refund RS" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> <mxGeometry x="415" y="680" width="80" height="30" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-37" value="Refund autocancel" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> <mxGeometry x="205" y="660" width="120" height="30" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-51" value="1" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1"> <mxGeometry x="120" y="228.89" width="30" height="30" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-52" value="2" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1"> <mxGeometry x="775" y="131" width="30" height="30" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-53" value="8" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1"> <mxGeometry x="250" y="617" width="30" height="30" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-54" value="9" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1"> <mxGeometry x="775" y="647" width="30" height="30" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-55" value="" style="endArrow=classic;html=1;rounded=0;" parent="1" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="335" y="358" as="sourcePoint" /> <mxPoint x="759.5" y="358" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-56" value="Traveler Profile RQ + access_token" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> <mxGeometry x="340.5" y="325" width="210" height="30" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-57" value="" style="endArrow=classic;html=1;rounded=0;" parent="1" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="760" y="400" as="sourcePoint" /> <mxPoint x="335.5" y="400" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-58" value="Traveler Profile RS" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> <mxGeometry x="350.5" y="370" width="120" height="30" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-59" value="6" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1"> <mxGeometry x="775" y="343" width="30" height="30" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-60" value="" style="endArrow=classic;html=1;rounded=0;" parent="1" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="340" y="150" as="sourcePoint" /> <mxPoint x="760.25" y="150" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-61" value="Traveler Profile RQ + access_token" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> <mxGeometry x="340" y="118" width="210" height="30" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-62" value="" style="endArrow=classic;html=1;rounded=0;" parent="1" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="759.5" y="188" as="sourcePoint" /> <mxPoint x="335.5" y="188" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-63" value="Traveler Profile RS" style="text;html=1;align=left;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> <mxGeometry x="350.5" y="161" width="120" height="30" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-64" value="4" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1"> <mxGeometry x="775" y="240" width="30" height="30" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-65" value="3" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1"> <mxGeometry x="775" y="175" width="30" height="30" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-66" value="5" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1"> <mxGeometry x="775" y="280" width="30" height="30" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-67" value="7" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1"> <mxGeometry x="775" y="388" width="30" height="30" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-68" value="10" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1"> <mxGeometry x="775" y="700" width="30" height="30" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-70" value="" style="endArrow=classic;html=1;rounded=0;" parent="1" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="336" y="552" as="sourcePoint" /> <mxPoint x="760" y="552" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-71" value="Client credentials Grant RQ&amp;nbsp;&lt;div&gt;&lt;ul&gt;&lt;li style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;background-color: transparent; color: light-dark(rgb(0, 0, 0), rgb(255, 255, 255));&quot;&gt;client_id&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li style=&quot;text-align: left;&quot;&gt;secret&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> <mxGeometry x="360" y="480" width="170" height="80" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-72" value="" style="endArrow=classic;html=1;rounded=0;" parent="1" edge="1"> <mxGeometry width="50" height="50" relative="1" as="geometry"> <mxPoint x="760" y="602" as="sourcePoint" /> <mxPoint x="336" y="602" as="targetPoint" /> </mxGeometry> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-73" value="Client credentials Acces token RS" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=none;fillColor=none;" parent="1" vertex="1"> <mxGeometry x="355" y="570" width="200" height="30" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-76" value="9" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1"> <mxGeometry x="775" y="537" width="30" height="30" as="geometry" /> </mxCell> <mxCell id="YD2cjV0bOqWloPQhhFmI-77" value="10" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1"> <mxGeometry x="775" y="590" width="30" height="30" as="geometry" /> </mxCell> </root> </mxGraphModel> </diagram> </mxfile> \"><defs/><g><g data-cell-id=\"0\"><g data-cell-id=\"1\"><g data-cell-id=\"YD2cjV0bOqWloPQhhFmI-1\"><g><rect x=\"0\" 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 50 41 L 50 801\" 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: 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: "Helvetica"; 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=\"50\" y=\"25\" fill=\"light-dark(#000000, #ffffff)\" font-family=\""Helvetica"\" font-size=\"12px\" text-anchor=\"middle\">User</text></switch></g></g></g><g data-cell-id=\"YD2cjV0bOqWloPQhhFmI-2\"><g><rect x=\"220\" 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 270 41 L 270 801\" fill=\"none\" stroke=\"#000000\" stroke-miterlimit=\"10\" stroke-dasharray=\"3
# --- truncated at 32 KB (106 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/switchfly/refs/heads/main/openapi/switchfly-shopping-flow-api-openapi.yml