This guide provides a comprehensive reference for the HTTP POST requests that initiate actions taken by your Payments app. The action flows begins with an HTTP POST request sent from Shopify to your payments app extension. Each request is different depending on the action flow you are trying to configure. ## Offsite payment The offsite payment flow begins with an HTTP POST request sent from Shopify to the **payment session URL** of your offsite payments app extension provided during app extension configuration. This request contains information about the customer and the order. <!-- Accepts include parameter payment_method with value(s): offsite, credit-card, 3ds Example: `payment_method="credit-card 3ds"` --> <p> <div class="react-stacked-code-block ThemeMode-dim" data-preset="stacked"> <script data-option="title" data-value="Start session"></script> <p> <div class="react-code-block" data-preset="basic"> <div class="react-code-block-preload ThemeMode-dim"> <div class="react-code-block-preload-bar basic-codeblock"></div> <div class="react-code-block-preload-placeholder-container"> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> </div> </div> <script data-option="title" data-value="Request header"></script> <script type="text/plain" data-language="http"> RAW_MD_CONTENTShopify-Shop-Domain: my-test-shop.myshopify.com Shopify-Request-Id: 94169f7e-ac8d-4ef4-9fd2-90f0791daddf Shopify-Api-Version: 2025-04 END_RAW_MD_CONTENT</script> </div> </p> <p> <div class="react-code-block" data-preset="basic"> <div class="react-code-block-preload ThemeMode-dim"> <div class="react-code-block-preload-bar basic-codeblock"></div> <div class="react-code-block-preload-placeholder-container"> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> </div> </div> <script data-option="title" data-value="Request body"></script> <script type="text/plain" data-language="json" data-title="Offsite"> RAW_MD_CONTENT{ "id": "u0nwmSrNntjIWozmNslK5Tlq", "gid": "gid://shopify/PaymentSession/u0nwmSrNntjIWozmNslK5Tlq", "group": "rZNvy+1jH6Z+BcPqA5U5BSIcnUavBha3C63xBalm+xE=", "session_id": "4B2dxmle3vGgimS4deUX3+2PgLF2+/0ZWnNsNSZcgdU=", "amount": "123.00", "currency": "CAD", "test": false, "merchant_locale": "en", "payment_method": { "type": "offsite", "data": { "cancel_url": "https://my-test-shop.com/1/checkouts/4c94d6f5b93f726a82dadfe45cdde432" } }, "proposed_at": "2020-07-13T00:00:00Z", "customer": { "email": "buyer@example.com", "phone_number": "5555555555", "locale": "fr", "billing_address": { "given_name": "Alice", "family_name": "Smith", "line1": "123 Street", "line2": "Suite B", "city": "Montreal", "postal_code": "H2Z 0B3", "province": "Quebec", "country_code": "CA", "phone_number": "5555555555", "company": "" }, "shipping_address": { "given_name": "Alice", "family_name": "Smith", "line1": "123 Street", "line2": "Suite B", "city": "Montreal", "postal_code": "H2Z 0B3", "province": "Quebec", "country_code": "CA", "phone_number": "5555555555", "company": "" } }, "kind": "sale" } END_RAW_MD_CONTENT</script> </div> </p> <p> <div class="react-code-block" data-preset="basic"> <div class="react-code-block-preload ThemeMode-dim"> <div class="react-code-block-preload-bar basic-codeblock"></div> <div class="react-code-block-preload-placeholder-container"> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> </div> </div> <script data-option="title" data-value="Response body"></script> <script type="text/plain" data-language="json" data-title="Offsite"> RAW_MD_CONTENT{ "redirect_url": "https://buyer-payment-page.com/12345" } END_RAW_MD_CONTENT</script> </div> </p> </div> </p> Shopify must receive an HTTP `2xx` response with `redirect_url` (URL for the Partner page where Shopify redirects the customer) for the payment session creation to be successful. The `redirect_url` response should be less than `8192 bytes` in length. If the request fails, then it's retried several times. If the request still fails, then the customer needs to retry their payment through Shopify checkout. If there's an error on the payments app's side, then don't respond with an HTTP `2xx`. Use an appropriate error status code instead. ### Request headers <table> <tr> <th>Header</th> <th>Description</th> </tr> <tr> <td><code>Shopify-Shop-Domain</code><span class="heading-flag">Required</span></td> <td>The permanent domain of the shop. Can be used to identify which shop is initiating the request.</td> </tr> <tr> <td><code>Shopify-Request-Id</code><span class="heading-flag">Required</span></td> <td>The unique request ID used to track specific requests for troubleshooting purposes.</td> </tr> <tr> <td><code>Shopify-Api-Version</code><span class="heading-flag">Required</span></td> <td>The API version selected in the payments app configuration. The version selected defines the <a href="#response">response</a> expected by the payments app.</td> </tr> </table> ### Request body <!-- Accepts include parameter payment_method with value(s): offsite, credit-card, 3ds Example: `payment_method="credit-card 3ds"` --> <table id="request-attributes"> <tr> <th>Attribute</th> <th>Description</th> <th>Type</th> </tr> <tr> <td><code>id</code><span class="heading-flag">Required</span></td> <td>Unique identifier for the payment attempt. Used as the <a href="/docs/apps/build/payments/considerations#idempotency">idempotency key</a>. It can be assumed that requests with a given ID are identical to any previously received requests with the same ID. This ID must be surfaced to the merchant so that they can correlate Shopify orders with payments managed by the Partner app.</td> <td><code>String</code></td> </tr> <tr> <td><code>gid</code><span class="heading-flag">Required</span></td> <td>Identifies the payment when communicating with Shopify (in GraphQL mutations, for example).</td> <td><code>String</code></td> </tr> <tr> <td><code>group</code><span class="heading-flag">Required</span></td> <td>The identifier that's shared across payment sessions, representing attempts to complete the same checkout or deferred payment capture.</td> <td><code>String</code></td> </tr> <tr> <td><code>session_id</code><span class="heading-flag">Required</span></td> <td>The identifier that's shared across payment sessions that belong to the same payment group, buyer session, and share payment details. Only available in API version 2024-10 and later.</td> <td><code>String</code></td> </tr> <tr> <td><code>amount</code><span class="heading-flag">Required</span></td> <td>The amount to be charged. The value is always sent using a decimal point as a separator, regardless of locale.</td> <td><code>String</code></td> </tr> <tr> <td><code>currency</code><span class="heading-flag">Required</span></td> <td>Three-letter ISO 4217 currency code.</td> <td><code>String</code></td> </tr> <tr> <td><code>test</code><span class="heading-flag">Required</span></td> <td>Indicates whether the payment is in test or live mode. Refer to <a href="https://help.shopify.com/partners/dashboard/managing-stores/test-orders-in-dev-stores#test-mode-for-third-party-payment-providers">Test mode</a> for more information.</td> <td><code>Boolean</code></td> </tr> <tr> <td><code>merchant_locale</code><span class="heading-flag">Required</span></td> <td>IETF BCP 47 language tag representing the language used by the merchant.</td> <td><code>String</code></td> </tr> <tr> <td><code>payment_method</code><span class="heading-flag">Required</span></td> <td>Hash giving details on the payment method used. Refer to <a href="#payment_method-hash">payment_method hash</a> for more information.</td> <td><code>Hash</code></td> </tr> <tr> <td><code>proposed_at</code><span class="heading-flag">Required</span></td> <td>Can be used to order payment attempts that are a part of the same group.</td> <td><code>String (ISO-8601)</code></td> </tr> <tr> <td><code>customer</code></td> <td>If customer is included, then at least one of <code>customer.email</code> or <code>customer.phone_number</code> is present. For more information on the <code>customer</code> field, refer to the <a href="#customer-hash">customer hash</a>.</td> <td><code>Hash</code></td> </tr> <tr> <td><code>kind</code><span class="heading-flag">Required</span></td> <td>Either <code>sale</code> or <code>authorization</code>. If you support payment authorization, then this value is set based on the merchant's configuration. If you don't support separate authorization and capture, then the value is always <code>sale</code>. For <code>sale</code> transactions, you need to capture the funds instantly with this request. For <code>authorization</code> transactions, you must place a hold on the funds and capture them later when Shopify sends a capture request.</td> <td><code>String</code></td> </tr> </table> > Note: > Shopify doesn't include an order ID in the payment session request. Instead, merchants can use the payment's `id` attribute to [search for the corresponding order in the Shopify admin](https://help.shopify.com/manual/orders/search-view-print-orders#match-third-party-payment-information-with-shopify-orders). > > The payment ID also appears in order data that's [exported from the Shopify admin](https://help.shopify.com/manual/orders/export-orders), in the exported CSV's **Payment References** column. #### <code>payment_method</code> hash <table id="payment-method-hash"> <tr> <th>Attribute</th> <th>Description</th> <th>Type</th> </tr> <tr> <td><code>type</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The type of payment method. Possible values: [<code>"offsite"</code>].</td> <td><code>String</code></td> </tr> <tr> <td><code>data</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>Contains data relevant for the chosen payment method. Refer to <a href="#payment_method-data-hash">payment_method.data hash</a> for more information.</td> <td><code>Hash</code></td> </tr> </table> #### <code>payment_method.data</code> hash <table id="payment-method-data-hash"> <tr> <th>Attribute</th> <th>Description</th> <th>Type</th> </tr> <tr> <td><code>cancel_url</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The URL to redirect the customer when the customer quits the payment flow and returns to the merchant's website. The <code>cancel_url</code> attribute should only be used when a customer is on the provider page and decides to cancel their payment and return to Shopify.</td> <td><code>String</code></td> </tr> </table> #### <code>customer</code> hash <table id="customer-hash"> <tr> <th>Attribute</th> <th>Description</th> <th>Type</th> </tr> <tr> <td><code>email</code></td> <td>The email of the customer. Required if <code>phone_number</code> isn't present.</td> <td><code>String</code></td> </tr> <tr> <td><code>phone_number</code></td> <td>The phone number of the customer. Required if <code>email</code> isn't present.</td> <td><code>String</code></td> </tr> <tr> <td><code>locale</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The language code as an ISO 639-1 string and the country code as an ISO 3166-1 Alpha-2 string, if available. For more information on the locale field, refer to the <a href="/changelog/locale-fields-are-now-appended-with-language-and-country-codes">locale fields changelog</a>.</td> <td><code>String</code></td> </tr> <tr> <td><code>billing_address</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The billing address of the customer. Refer to <a href="#shipping-billing_address-hash">shipping/billing_address hash</a> for more information.</td> <td><code>Hash</code></td> </tr> <tr> <td><code>shipping_address</code><br><span class="heading-flag heading-flag--new">Required*</span></td> <td><p>The shipping address for the order. Refer to <a href="#shipping-billing_address-hash">shipping/billing_address hash</a> for more information.</p><p>*A shipping address isn't sent for digital products.</p></td> <td><code>Hash</code></td> </tr> </table> #### <code>shipping/billing_address</code> hash <table id="shipping-billing-address-hash"> <tr> <th>Attribute</th> <th>Description</th> <th>Type</th> </tr> <tr> <td><code>given_name</code></td> <td>The given name or first name of the customer.</td> <td><code>String</code></td> </tr> <tr> <td><code>family_name</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The surname of the customer.</td> <td><code>String</code></td> </tr> <tr> <td><code>line1</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>First line of the customer's address (for example, the street or PO box).</td> <td><code>String</code></td> </tr> <tr> <td><code>line2</code></td> <td>Second line of the customer's address (for example, the apartment or suite).</td> <td><code>String</code></td> </tr> <tr> <td><code>city</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>Name of city or town.</td> <td><code>String</code></td> </tr> <tr> <td><code>postal_code</code></td> <td>Zip or postal code.</td> <td><code>String</code></td> </tr> <tr> <td><code>province</code></td> <td>Name of the province or state.</td> <td><code>String</code></td> </tr> <tr> <td><code>country_code</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The country code as an ISO 3166-1 Alpha-2 string.</td> <td><code>String</code></td> </tr> <tr> <td><code>phone_number</code></td> <td>The phone number of the customer.</td> <td><code>String</code></td> </tr> <tr> <td><code>company</code></td> <td>Name of company.</td> <td><code>String</code></td> </tr> </table> > Note: > The <code>given_name</code>, <code>line2</code>, <code>postal_code</code>, <code>province</code> and <code>company</code> fields are optional, depending on the customer's locality. ## Credit card payment The credit card payment flow begins with an HTTP POST request sent from Shopify to the **payment session URL** of your credit card payments app extension provided during app extension configuration. This request contains information about the customer and the order, and, for 3-D Secure, client details. <!-- Accepts include parameter payment_method with value(s): offsite, credit-card, 3ds Example: `payment_method="credit-card 3ds"` --> <p> <div class="react-stacked-code-block ThemeMode-dim" data-preset="stacked"> <script data-option="title" data-value="Start session"></script> <p> <div class="react-code-block" data-preset="basic"> <div class="react-code-block-preload ThemeMode-dim"> <div class="react-code-block-preload-bar basic-codeblock"></div> <div class="react-code-block-preload-placeholder-container"> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> </div> </div> <script data-option="title" data-value="Request header"></script> <script type="text/plain" data-language="http"> RAW_MD_CONTENTShopify-Shop-Domain: my-test-shop.myshopify.com Shopify-Request-Id: 94169f7e-ac8d-4ef4-9fd2-90f0791daddf Shopify-Api-Version: 2025-04 END_RAW_MD_CONTENT</script> </div> </p> <p> <div class="react-code-block" data-preset="basic"> <div class="react-code-block-preload ThemeMode-dim"> <div class="react-code-block-preload-bar basic-codeblock"></div> <div class="react-code-block-preload-placeholder-container"> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> </div> </div> <script data-option="title" data-value="Request body"></script> <script type="text/plain" data-language="json" data-title="API version 2024-07"> RAW_MD_CONTENT{ "id": "u0nwmSrNntjIWozmNslK5Tlq", "gid": "gid://shopify/PaymentSession/u0nwmSrNntjIWozmNslK5Tlq", "group": "rZNvy+1jH6Z+BcPqA5U5BSIcnUavBha3C63xBalm+xE=", "session_id": "4B2dxmle3vGgimS4deUX3+2PgLF2+/0ZWnNsNSZcgdU=", "amount": "123.00", "currency": "CAD", "test": false, "merchant_locale": "en", "payment_method": { "type": "credit_card", "data": { "fingerprint": "65b1ae1fe49ff9d23d80e4967d9147e64b2357c0b2291f4a8bf719cbde331b4c", "encrypted_message": "<ENCRYPTED_MESSAGE>", "ephemeral_public_key": "<EPHEMERAL_PUBLIC_KEY>", "tag": "TAG", "moto": true } }, "proposed_at": "2020-07-13T00:00:00Z", "customer": { "billing_address": { "given_name": "Alice", "family_name": "Smith", "line1": "123 Street", "line2": "Suite B", "city": "Montreal", "postal_code": "H2Z 0B3", "province": "Quebec", "country_code": "CA", "phone_number": "5555555555", "company": "" }, "shipping_address": { "given_name": "Alice", "family_name": "Smith", "line1": "123 Street", "line2": "Suite B", "city": "Montreal", "postal_code": "H2Z 0B3", "province": "Quebec", "country_code": "CA", "phone_number": "5555555555", "company": "" }, "email": "buyer@example.com", "phone_number": "5555555555", "locale": "fr" }, "kind": "sale" } END_RAW_MD_CONTENT</script> <script type="text/plain" data-language="json" data-title="API version 2024-04 and earlier"> RAW_MD_CONTENT{ "id": "u0nwmSrNntjIWozmNslK5Tlq", "gid": "gid://shopify/PaymentSession/u0nwmSrNntjIWozmNslK5Tlq", "group": "rZNvy+1jH6Z+BcPqA5U5BSIcnUavBha3C63xBalm+xE=", "session_id": "4B2dxmle3vGgimS4deUX3+2PgLF2+/0ZWnNsNSZcgdU=", "amount": "123.00", "currency": "CAD", "test": false, "merchant_locale": "en", "payment_method": { "type": "credit_card", "data": { "fingerprint": "65b1ae1fe49ff9d23d80e4967d9147e64b2357c0b2291f4a8bf719cbde331b4c", "encrypted_message": "<ENCRYPTED_MESSAGE>", "ephemeral_public_key": "<EPHEMERAL_PUBLIC_KEY>", "tag": "TAG" } }, "proposed_at": "2020-07-13T00:00:00Z", "customer": { "billing_address": { "given_name": "Alice", "family_name": "Smith", "line1": "123 Street", "line2": "Suite B", "city": "Montreal", "postal_code": "H2Z 0B3", "province": "Quebec", "country_code": "CA", "phone_number": "5555555555", "company": "" }, "shipping_address": { "given_name": "Alice", "family_name": "Smith", "line1": "123 Street", "line2": "Suite B", "city": "Montreal", "postal_code": "H2Z 0B3", "province": "Quebec", "country_code": "CA", "phone_number": "5555555555", "company": "" }, "email": "buyer@example.com", "phone_number": "5555555555", "locale": "fr" }, "kind": "sale" } END_RAW_MD_CONTENT</script> <script type="text/plain" data-language="json" data-title="Credit Card with 3-D Secure"> RAW_MD_CONTENT{ "id": "u0nwmSrNntjIWozmNslK5Tlq", "gid": "gid://shopify/PaymentSession/u0nwmSrNntjIWozmNslK5Tlq", "group": "rZNvy+1jH6Z+BcPqA5U5BSIcnUavBha3C63xBalm+xE=", "session_id": "4B2dxmle3vGgimS4deUX3+2PgLF2+/0ZWnNsNSZcgdU=", "amount": "123.00", "currency": "CAD", "test": false, "merchant_locale": "en", "payment_method": { "type": "credit_card", "data": { "fingerprint": "65b1ae1fe49ff9d23d80e4967d9147e64b2357c0b2291f4a8bf719cbde331b4c", "encrypted_message": "<ENCRYPTED_MESSAGE>", "ephemeral_public_key": "<EPHEMERAL_PUBLIC_KEY>", "tag": "TAG", "moto": true } }, "proposed_at": "2020-07-13T00:00:00Z", "customer": { "billing_address": { "given_name": "Alice", "family_name": "Smith", "line1": "123 Street", "line2": "Suite B", "city": "Montreal", "postal_code": "H2Z 0B3", "province": "Quebec", "country_code": "CA", "phone_number": "5555555555", "company": "" }, "shipping_address": { "given_name": "Alice", "family_name": "Smith", "line1": "123 Street", "line2": "Suite B", "city": "Montreal", "postal_code": "H2Z 0B3", "province": "Quebec", "country_code": "CA", "phone_number": "5555555555", "company": "" }, "email": "buyer@example.com", "phone_number": "5555555555", "locale": "fr" }, "kind": "sale", "client_details": { "ip_address": "192.168.0.1", "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36", "accept_language":"en-US" } } END_RAW_MD_CONTENT</script> </div> </p> <p> <div class="react-code-block" data-preset="basic"> <div class="react-code-block-preload ThemeMode-dim"> <div class="react-code-block-preload-bar basic-codeblock"></div> <div class="react-code-block-preload-placeholder-container"> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> </div> </div> <script data-option="title" data-value="Response body"></script> <script type="text/plain" data-language="text" data-title="Credit Card"> RAW_MD_CONTENTOur API expects an empty response body. END_RAW_MD_CONTENT</script> </div> </p> </div> </p> Shopify must receive an HTTP `2xx` response for the payment session creation to be successful. If the request fails, then it's retried several times. If the request still fails, then the customer needs to retry their payment through Shopify checkout. If there's an error on the payments app's side, then don't respond with an HTTP `2xx`. Use an appropriate error status code instead. ### Request headers <table> <tr> <th>Header</th> <th>Description</th> </tr> <tr> <td><code>Shopify-Shop-Domain</code><span class="heading-flag">Required</span></td> <td>The permanent domain of the shop. Can be used to identify which shop is initiating the request.</td> </tr> <tr> <td><code>Shopify-Request-Id</code><span class="heading-flag">Required</span></td> <td>The unique request ID used to track specific requests for troubleshooting purposes.</td> </tr> <tr> <td><code>Shopify-Api-Version</code><span class="heading-flag">Required</span></td> <td>The API version selected in the payments app configuration. The version selected defines the <a href="#response">response</a> expected by the payments app.</td> </tr> </table> ### Request body <!-- Accepts include parameter payment_method with value(s): offsite, credit-card, 3ds Example: `payment_method="credit-card 3ds"` --> <table id="request-attributes"> <tr> <th>Attribute</th> <th>Description</th> <th>Type</th> </tr> <tr> <td><code>id</code><span class="heading-flag">Required</span></td> <td>Unique identifier for the payment attempt. Used as the <a href="/docs/apps/build/payments/considerations#idempotency">idempotency key</a>. It can be assumed that requests with a given ID are identical to any previously received requests with the same ID. This ID must be surfaced to the merchant so that they can correlate Shopify orders with payments managed by the Partner app.</td> <td><code>String</code></td> </tr> <tr> <td><code>gid</code><span class="heading-flag">Required</span></td> <td>Identifies the payment when communicating with Shopify (in GraphQL mutations, for example).</td> <td><code>String</code></td> </tr> <tr> <td><code>group</code><span class="heading-flag">Required</span></td> <td>The identifier that's shared across payment sessions, representing attempts to complete the same checkout or deferred payment capture.</td> <td><code>String</code></td> </tr> <tr> <td><code>session_id</code><span class="heading-flag">Required</span></td> <td>The identifier that's shared across payment sessions that belong to the same payment group, buyer session, and share payment details. Only available in API version 2024-10 and later.</td> <td><code>String</code></td> </tr> <tr> <td><code>amount</code><span class="heading-flag">Required</span></td> <td>The amount to be charged. The value is always sent using a decimal point as a separator, regardless of locale.</td> <td><code>String</code></td> </tr> <tr> <td><code>currency</code><span class="heading-flag">Required</span></td> <td>Three-letter ISO 4217 currency code.</td> <td><code>String</code></td> </tr> <tr> <td><code>test</code><span class="heading-flag">Required</span></td> <td>Indicates whether the payment is in test or live mode. Refer to <a href="https://help.shopify.com/partners/dashboard/managing-stores/test-orders-in-dev-stores#test-mode-for-third-party-payment-providers">Test mode</a> for more information.</td> <td><code>Boolean</code></td> </tr> <tr> <td><code>merchant_locale</code><span class="heading-flag">Required</span></td> <td>IETF BCP 47 language tag representing the language used by the merchant.</td> <td><code>String</code></td> </tr> <tr> <td><code>payment_method</code><span class="heading-flag">Required</span></td> <td>Hash giving details on the payment method used. Refer to <a href="#payment_method-hash">payment_method hash</a> for more information.</td> <td><code>Hash</code></td> </tr> <tr> <td><code>proposed_at</code><span class="heading-flag">Required</span></td> <td>Can be used to order payment attempts that are a part of the same group.</td> <td><code>String (ISO-8601)</code></td> </tr> <tr> <td><code>customer</code></td> <td>If customer is included, then at least one of <code>customer.email</code> or <code>customer.phone_number</code> is present. For more information on the <code>customer</code> field, refer to the <a href="#customer-hash">customer hash</a>.</td> <td><code>Hash</code></td> </tr> <tr> <td><code>kind</code><span class="heading-flag">Required</span></td> <td>Either <code>sale</code> or <code>authorization</code>. For <code>sale</code> transactions, you need to capture the funds instantly with this request. For <code>authorization</code> transactions, you must place a hold on the funds and capture them later when Shopify sends a capture request.</td> <td><code>String</code></td> </tr> <tr> <td><code>client_details</code></td> <td>Details about the browser of the customer, if your <a href="/docs/apps/payments/create-a-payments-app#credit-card-payments-app-extension">credit card payments app extension</a> supports the 3-D Secure authentication customer feature. For more information on the <code>client_details</code> field, refer to the <a href="#client-details-hash">client_details hash</a>.</td> <td><code>Hash</code></td> </tr> </table> > Note: > Shopify doesn't include an order ID in the payment session request. Instead, merchants can use the payment's `id` attribute to [search for the corresponding order in the Shopify admin](https://help.shopify.com/manual/orders/search-view-print-orders#match-third-party-payment-information-with-shopify-orders). > > The payment ID also appears in order data that's [exported from the Shopify admin](https://help.shopify.com/manual/orders/export-orders), in the exported CSV's **Payment References** column. #### <code>payment_method</code> hash <table id="payment-method-hash"> <tr> <th>Attribute</th> <th>Description</th> <th>Type</th> </tr> <tr> <td><code>type</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The type of payment method. Possible values: [<code>"credit_card"</code>].</td> <td><code>String</code></td> </tr> <tr> <td><code>data</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>Contains data relevant for the chosen payment method. Refer to <a href="#payment_method-data-hash">payment_method.data hash</a> for more information.</td> <td><code>Hash</code></td> </tr> </table> #### <code>payment_method.data</code> hash <table id="payment-method-data-hash"> <tr> <th>Attribute</th> <th>Description</th> <th>Type</th> </tr> <tr> <td><code>fingerprint</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The fingerprint of the certificate that’s used to encrypt the credit card information of the customer.</td> <td><code>String</code></td> </tr> <tr> <td><code>encrypted_message</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The encrypted credit card information of the customer strictly encoded as Base64. Learn how to <a href="#decrypt-encrypted_message">decrypt encrypted_message</a> and the structure of decrypted data.</td> <td><code>String</code></td> </tr> <tr> <td><code>ephemeral_public_key</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The ephemeral public key that should be used with the private key to compute the shared secret, and to decrypt <code>encrypted_message</code>.</td> <td><code>String</code></td> </tr> <tr> <td><code>tag</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>HMAC digest of the <code>encrypted_message</code> strictly encoded as Base64.</td> <td><code>String</code></td> </tr> <tr> <td><code>moto</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>Whether the payment is Mail Order/Telephone Order. Only available in API version 2024-07 and later.</td> <td><code>Boolean</code></td> </tr> </table> #### Decrypt <code>encrypted_message</code> The credit card information of the customer is encrypted using ECIES hybrid encryption scheme. You can follow the following steps to decrypt the credit card information: 1. Decode the Base64 encoded `encrypted_message` and `tag`. 2. Use `fingerprint` to identify the certificate that's used for encryption. 3. Compute shared secret using the private key of the certificate and `ephemeral_public_key`. 4. Compute the hmac of decoded `encrypted_message` and ensure it matches the decoded value of `tag`. 5. Decrypt `encrypted_message`. > Caution: > The application or service that decrypts the value of the `encrypted_message` must be in a PCI DSS compliant environment. <p> <div class="react-stacked-code-block ThemeMode-dim" data-preset="stacked"> <script data-option="title" data-value="Example code for decrypting `encrypted_message`"></script> <p> <div class="react-code-block" data-preset="basic"> <div class="react-code-block-preload ThemeMode-dim"> <div class="react-code-block-preload-bar basic-codeblock"></div> <div class="react-code-block-preload-placeholder-container"> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> </div> </div> <script data-option="title" data-value="Function"></script> <script type="text/plain" data-language="ruby"> RAW_MD_CONTENTdef decrypt(key, encrypted_payload) # Decode the Base64 encoded `encrypted_message` and `tag` ciphertext = Base64.strict_decode64(encrypted_payload[:encrypted_message]) mac = Base64.strict_decode64(encrypted_payload[:tag]) # Compute shared secret using the private key of the certificate and `ephemeral_public_key` ephemeral_public_key_pem = encrypted_payload[:ephemeral_public_key] ephemeral_public_key = OpenSSL::PKey::EC.new(ephemeral_public_key_pem).public_key shared_secret = key.dh_compute_key(ephemeral_public_key) # Compute the hmac of decoded `encrypted_message` and ensure it matches the decoded value of `tag` cipher = OpenSSL::Cipher.new('AES-256-CTR') mac_digest = OpenSSL::Digest.new('SHA256') mac_length = mac_digest.digest_length / 2 key_pair = OpenSSL::KDF.hkdf( shared_secret, length: cipher.key_len + mac_length, hash: 'SHA256', salt: '', info: '' ) cipher_key = key_pair.byteslice(0, cipher.key_len) hmac_key = key_pair.byteslice(-mac_length, mac_length) computed_mac = OpenSSL::HMAC.digest(mac_digest, hmac_key, ciphertext).byteslice(0, mac_length) raise OpenSSL::PKey::ECError, "Invalid Message Authenticaton Code" unless OpenSSL.secure_compare(computed_mac, mac) # Decrypt `encrypted_message` cipher.decrypt cipher.iv = ("\x00" * 16).force_encoding(Encoding::BINARY) cipher.key = cipher_key cipher.update(ciphertext) + cipher.final end END_RAW_MD_CONTENT</script> </div> </p> <p> <div class="react-code-block" data-preset="basic"> <div class="react-code-block-preload ThemeMode-dim"> <div class="react-code-block-preload-bar basic-codeblock"></div> <div class="react-code-block-preload-placeholder-container"> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> </div> </div> <script data-option="title" data-value="Usage"></script> <script type="text/plain" data-language="ruby"> RAW_MD_CONTENT# payment_method.data from payload encrypted_payload = { encrypted_message: "7oeGaIk3Tja5fkyB3P[...]urLyxgW4J9lu2x769+", ephemeral_public_key: "-----BEGIN PUBLIC KEY-----\nMEB3wYo[...]HKFkwjQ==\n-----END PUBLIC KEY-----\n", tag: "LDCZ1tbHX8t+KPO9w==" } # Use `fingerprint` to identify the certificate that's used for encryption key = OpenSSL::PKey::EC.new(File.open('path/to/private-key.file').read) # decrypt decrypt(key, encrypted_payload) END_RAW_MD_CONTENT</script> </div> </p> <p> <div class="react-code-block" data-preset="basic"> <div class="react-code-block-preload ThemeMode-dim"> <div class="react-code-block-preload-bar basic-codeblock"></div> <div class="react-code-block-preload-placeholder-container"> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> </div> </div> <script data-option="title" data-value="Returns"></script> <script type="text/plain" data-language="json" data-title="API version 2024-04"> RAW_MD_CONTENT{ "type": "card", "data": { "full_name": "Percy Parker", "pan": "4242424242424242", "month": 12, "year": 2033, "verification_value": "122" } } END_RAW_MD_CONTENT</script> <script type="text/plain" data-language="json" data-title="API version 2024-07 and later"> RAW_MD_CONTENT{ "type": "card", "data": { "full_name": "Percy Parker", "pan": "4242424242424242", "month": 12, "year": 2033, "verification_value": "122", "network": "cartes_bancaires" } } END_RAW_MD_CONTENT</script> </div> </p> </div> </p> Returned hash in API version `2024-04` and later: <table id="encrypted-message-hash-2024-04"> <tr> <th>Attribute</th> <th>Description</th> <th>Type</th> </tr> <tr> <td><code>type</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The type of card.</td> <td><code>String</code></td> </tr> <tr> <td><code>data</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>Contains data relevant to the encrypted message. Refer to <a href="#encrypted-message-data-hash">encrypted_message_data hash</a> for more information.</td> <td><code>Hash</code></td> </tr> </table> #### <code>encrypted_message_data</code> hash Returned hash in API version `2024-04`: <table id="encrypted-message-data-hash-2024-04"> <tr> <th>Attribute</th> <th>Description</th> <th>Type</th> </tr> <tr> <td><code>full_name</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The full name of the card holder.</td> <td><code>String</code></td> </tr> <tr> <td><code>pan</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The card number used for payment.</td> <td><code>String</code></td> </tr> <tr> <td><code>month</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The card's month of expiry.</td> <td><code>Numeric</code></td> </tr> <tr> <td><code>year</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The card's year of expiry.</td> <td><code>Numeric</code></td> </tr> <tr> <td><code>verification_value</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The card's security code, for example CSC, CVC, CVV.</td> <td><code>String</code></td> </tr> </table> Returned hash in API version `2024-07` and later: <table id="encrypted-message-data-hash-2024-07"> <tr> <th>Attribute</th> <th>Description</th> <th>Type</th> </tr> <tr> <td><code>full_name</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The full name of the card holder.</td> <td><code>String</code></td> </tr> <tr> <td><code>pan</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The card number used for payment.</td> <td><code>String</code></td> </tr> <tr> <td><code>month</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The card's month of expiry.</td> <td><code>Numeric</code></td> </tr> <tr> <td><code>year</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The card's year of expiry.</td> <td><code>Numeric</code></td> </tr> <tr> <td><code>verification_value</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The card's security code, for example CSC, CVC, CVV.</td> <td><code>String</code></td> </tr> <tr> <td><code>network</code></td> <td>The customer's preferred processing network. <br/>In specific circumstances, customers using co-badged cards (for example Visa + Cartes Bancaires cards in the EU) are able to choose which network should be used to process the transaction. <br/>If the customer doesn't make a choice, the <code>network</code> field will be omitted.</td> <td><code>String</code></td> </tr> </table> #### <code>customer</code> hash <table id="customer-hash"> <tr> <th>Attribute</th> <th>Description</th> <th>Type</th> </tr> <tr> <td><code>email</code></td> <td>The email of the customer. Required if <code>phone_number</code> isn't present.</td> <td><code>String</code></td> </tr> <tr> <td><code>phone_number</code></td> <td>The phone number of the customer. Required if <code>email</code> isn't present.</td> <td><code>String</code></td> </tr> <tr> <td><code>locale</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The language code as an ISO 639-1 string and the country code as an ISO 3166-1 Alpha-2 string, if available. For more information on the locale field, refer to the <a href="/changelog/locale-fields-are-now-appended-with-language-and-country-codes">locale fields changelog</a>.</td> <td><code>String</code></td> </tr> <tr> <td><code>billing_address</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The billing address of the customer. Refer to <a href="#shipping-billing_address-hash">shipping/billing_address hash</a> for more information.</td> <td><code>Hash</code></td> </tr> <tr> <td><code>shipping_address</code><br><span class="heading-flag heading-flag--new">Required*</span></td> <td><p>The shipping address for the order. Refer to <a href="#shipping-billing_address-hash">shipping/billing_address hash</a> for more information.</p><p>*A shipping address isn't sent for digital products.</p></td> <td><code>Hash</code></td> </tr> </table> #### <code>shipping/billing_address</code> hash <table id="shipping-billing-address-hash"> <tr> <th>Attribute</th> <th>Description</th> <th>Type</th> </tr> <tr> <td><code>given_name</code></td> <td>The given name or first name of the customer.</td> <td><code>String</code></td> </tr> <tr> <td><code>family_name</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The surname of the customer.</td> <td><code>String</code></td> </tr> <tr> <td><code>line1</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>First line of the customer's address (for example, the street or PO box).</td> <td><code>String</code></td> </tr> <tr> <td><code>line2</code></td> <td>Second line of the customer's address (for example, the apartment or suite).</td> <td><code>String</code></td> </tr> <tr> <td><code>city</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>Name of city or town.</td> <td><code>String</code></td> </tr> <tr> <td><code>postal_code</code></td> <td>Zip or postal code.</td> <td><code>String</code></td> </tr> <tr> <td><code>province</code></td> <td>Name of the province or state.</td> <td><code>String</code></td> </tr> <tr> <td><code>country_code</code><br><span class="heading-flag heading-flag--new">Required</span></td> <td>The country code as an ISO 3166-1 Alpha-2 string.</td> <td><code>String</code></td> </tr> <tr> <td><code>phone_number</code></td> <td>The phone number of the customer.</td> <td><code>String</code></td> </tr> <tr> <td><code>company</code></td> <td>Name of company.</td> <td><code>String</code></td> </tr> </table> > Note: > The <code>given_name</code>, <code>line2</code>, <code>postal_code</code>, <code>province</code> and <code>company</code> fields are optional, depending on the customer's locality. #### <code>client_details</code> hash <table id="client-details-hash"> <tr> <th>Attribute</th> <th>Description</th> <th>Type</th> </tr> <tr> <td><code>ip_address</code><br/><span class="heading-flag">Required</span></td></td> <td>The IP address from the browser of the customer.</td> <td><code>String</code></td> </tr> <tr> <td><code>user_agent</code><br/><span class="heading-flag">Required</span></td></td> <td>The HTTP user-agent header from the browser of the customer.</td> <td><code>String</code></td> </tr> <tr> <td><code>accept_language</code><br/><span class="heading-flag">Required</span></td></td> <td>The HTTP accept-language header from the browser of the customer.</td> <td><code>String</code></td> </tr> </table> ## Refund The refund flow begins with an HTTP POST request sent from Shopify to the payments app's **refund session URL** provided during app extension configuration: <p> <div class="react-stacked-code-block ThemeMode-dim" data-preset="stacked"> <script data-option="title" data-value="Start session"></script> <p> <div class="react-code-block" data-preset="basic"> <div class="react-code-block-preload ThemeMode-dim"> <div class="react-code-block-preload-bar basic-codeblock"></div> <div class="react-code-block-preload-placeholder-container"> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> </div> </div> <script data-option="title" data-value="Request header"></script> <script type="text/plain" data-language="http"> RAW_MD_CONTENTShopify-Shop-Domain: my-test-shop.myshopify.com Shopify-Request-Id: afd2de66-cda5-4486-879f-6a2b0071293b Shopify-Api-Version: 2025-04 END_RAW_MD_CONTENT</script> </div> </p> <p> <div class="react-code-block" data-preset="basic"> <div class="react-code-block-preload ThemeMode-dim"> <div class="react-code-block-preload-bar basic-codeblock"></div> <div class="react-code-block-preload-placeholder-container"> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> </div> </div> <script data-option="title" data-value="Request body"></script> <script type="text/plain" data-language="json"> RAW_MD_CONTENT{ "id": "PJUG6iB0xU7czy1ZN3xEwn4o", "gid": "gid://shopify\/RefundSession/PJUG6iB0xU7czy1ZN3xEwn4o", "payment_id": "u0nwmSrNntjIWozmNslK5Tlq", "amount": "123.00", "currency": "CAD", "test": false, "merchant_locale": "en", "proposed_at": "2021-07-13T00:00:00Z" } END_RAW_MD_CONTENT</script> </div> </p> <p> <div class="react-code-block" data-preset="basic"> <div class="react-code-block-preload ThemeMode-dim"> <div class="react-code-block-preload-bar basic-codeblock"></div> <div class="react-code-block-preload-placeholder-container"> </div> </div> <script data-option="title" data-value="Response body"></script> <script type="text/plain" data-language="json"> RAW_MD_CONTENTEND_RAW_MD_CONTENT</script> </div> </p> </div> </p> Shopify must receive an HTTP `201` (Created) response for the refund session creation to be successful. If the request fails, then it's retried several times. If the request still fails, then the user needs to manually retry the refund in the Shopify admin. ### Request headers <table> <tr> <th>Header</th> <th>Description</th> </tr> <tr> <td><code>Shopify-Shop-Domain</code><span class="heading-flag">Required</span></td> <td>The permanent domain of the shop. Can be used to identify which shop is initiating the request.</td> </tr> <tr> <td><code>Shopify-Request-Id</code><span class="heading-flag">Required</span></td> <td>The unique request ID used to track specific requests for troubleshooting purposes.</td> </tr> <tr> <td><code>Shopify-Api-Version</code><span class="heading-flag">Required</span></td> <td>The API version selected in the payments app configuration. The version selected defines the <a href="#response">response</a> expected by the payments app.</td> </tr> </table> ### Request body <table> <tr> <th>Attribute</th> <th>Description</th> <th>Type</th> </tr> <tr> <td><code>id</code><span class="heading-flag">Required</span></td> <td>The unique identifier for the refund attempt. Used as the <a href="/docs/apps/build/payments">idempotency key</a>. It can be assumed that requests with a given ID are identical to any previously-received requests with the same ID.</td> <td><code>String</code></td> </tr> <tr> <td><code>gid</code><span class="heading-flag">Required</span></td> <td>Identifies the refund when communicating with Shopify (in GraphQL mutations, for example).</td> <td><code>String</code></td> </tr> <tr> <td><code>payment_id</code><span class="heading-flag">Required</span></td> <td>The ID of the original payment that is to be refunded. For captured payments, this ID corresponds to the original authorization ID rather than the capture ID.</td> <td><code>String</code></td> </tr> <tr> <td><code>amount</code><span class="heading-flag">Required</span></td> <td>The amount to be refunded. The amount is always sent using a decimal point as a separator, regardless of locale.</td> <td><code>String</code></td> </tr> <tr> <td><code>currency</code><span class="heading-flag">Required</span></td> <td>Three-letter ISO 4217 currency code.</td> <td><code>String</code></td> </tr> <tr> <td><code>test</code><span class="heading-flag">Required</span></td> <td>Indicates whether the refund is in test or live mode. The <code>test</code> field is only sent if you select API version <code>2022-01</code> or higher in the payments app extension configuration in Shopify CLI. For more information, refer to <a href="/docs/apps/build/payments">Test a payments app</a>. <td><code>Boolean</code></td> </tr> <tr> <td><code>merchant_locale</code><span class="heading-flag">Required</span></td> <td>The IETF BCP 47 language tag representing the language used by the merchant.</td> <td><code>String</code></td> </tr> <tr> <td><code>proposed_at</code><span class="heading-flag">Required</span></td> <td>A timestamp (ISO-8601) representing when the refund request was proposed.</td> <td><code>String</code></td> </tr> </table> ## Capture The capture flow begins with an HTTP POST request sent from Shopify to the payments app's [capture session URL](/docs/apps/build/payments) provided during app extension configuration: <p> <div class="react-stacked-code-block ThemeMode-dim" data-preset="stacked"> <script data-option="title" data-value="Start session"></script> <p> <div class="react-code-block" data-preset="basic"> <div class="react-code-block-preload ThemeMode-dim"> <div class="react-code-block-preload-bar basic-codeblock"></div> <div class="react-code-block-preload-placeholder-container"> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> </div> </div> <script data-option="title" data-value="Request header"></script> <script type="text/plain" data-language="http"> RAW_MD_CONTENTShopify-Shop-Domain: my-test-shop.myshopify.com Shopify-Request-Id: 70a330cc-8411-47ef-bcc3-650bc1acccf2 Shopify-Api-Version: 2025-04 END_RAW_MD_CONTENT</script> </div> </p> <p> <div class="react-code-block" data-preset="basic"> <div class="react-code-block-preload ThemeMode-dim"> <div class="react-code-block-preload-bar basic-codeblock"></div> <div class="react-code-block-preload-placeholder-container"> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> </div> </div> <script data-option="title" data-value="Request body"></script> <script type="text/plain" data-language="json"> RAW_MD_CONTENT{ "id": "GZl9N9ghFvUrYhVONQIj59Rj", "gid": "gid://shopify\/CaptureSession/GZl9N9ghFvUrYhVONQIj59Rj", "payment_id": "u0nwmSrNntjIWozmNslK5Tlq", "amount": "123.00", "currency": "CAD", "test": false, "merchant_locale": "en", "proposed_at": "2021-07-13T00:00:00Z" } END_RAW_MD_CONTENT</script> </div> </p> <p> <div class="react-code-block" data-preset="basic"> <div class="react-code-block-preload ThemeMode-dim"> <div class="react-code-block-preload-bar basic-codeblock"></div> <div class="react-code-block-preload-placeholder-container"> </div> </div> <script data-option="title" data-value="Response body"></script> <script type="text/plain" data-language="json"> RAW_MD_CONTENTEND_RAW_MD_CONTENT</script> </div> </p> </div> </p> Shopify must receive an HTTP `201` (Created) response for the capture session creation to be successful. If the request fails, then it's retried several times. If the request still fails, then the user needs to manually retry the capture in the Shopify admin. ### Request headers <table> <tr> <th>Header</th> <th>Description</th> </tr> <tr> <td><code>Shopify-Shop-Domain</code><span class="heading-flag">Required</span></td> <td>The permanent domain of the shop. Can be used to identify which shop is initiating the request.</td> </tr> <tr> <td><code>Shopify-Request-Id</code><span class="heading-flag">Required</span></td> <td>The unique request ID used to track specific requests for troubleshooting purposes.</td> </tr> <tr> <td><code>Shopify-Api-Version</code><span class="heading-flag">Required</span></td> <td>The API version selected in the payments app configuration. The version selected defines the <a href="#response">response</a> expected by the payments app.</td> </tr> </table> ### Request body <table> <tr> <th>Attribute</th> <th>Description</th> <th>Type</th> </tr> <tr> <td><code>id</code><span class="heading-flag">Required</span></td> <td>The unique identifier for the capture attempt. Used as the <a href="/docs/apps/build/payments">idempotency key</a>. Assume that requests with a given ID are identical to any previously-received requests with the same ID.</td> <td><code>String</code></td> </tr> <tr> <td><code>gid</code><span class="heading-flag">Required</span></td> <td>Identifies the capture when communicating with Shopify in GraphQL mutations, for example.</td> <td><code>String</code></td> </tr> <tr> <td><code>payment_id</code><span class="heading-flag">Required</span></td> <td>The ID of the authorized payment that is to be captured.</td> <td><code>String</code></td> </tr> <tr> <td><code>amount</code><span class="heading-flag">Required</span></td> <td>The amount to be captured. The value is always sent using a decimal point as a separator, regardless of locale.</td> <td><code>String</code></td> </tr> <tr> <td><code>currency</code><span class="heading-flag">Required</span></td> <td>The three-letter ISO 4217 currency code.</td> <td><code>String</code></td> </tr> <tr> <td><code>test</code><span class="heading-flag">Required</span></td> <td>Indicates whether the capture is in test or live mode. The <code>test</code> field is only sent if you select API version <code>2022-01</code> or higher in the payments app extension configuration in Shopify CLI. For more information, refer to <a href="/docs/apps/build/payments">Test a payments app</a>. <td><code>Boolean</code></td> </tr> <tr> <td><code>merchant_locale</code><span class="heading-flag">Required</span></td> <td>The IETF BCP 47 language tag representing the language used by the merchant.</td> <td><code>String</code></td> </tr> <tr> <td><code>proposed_at</code><span class="heading-flag">Required</span></td> <td>A timestamp representing when the capture request was proposed.</td> <td><code>String (ISO-8601)</code></td> </tr> </table> ## Void The void flow begins with an HTTP POST request sent from Shopify to the payments app's **void session URL** provided during app extension configuration: <p> <div class="react-stacked-code-block ThemeMode-dim" data-preset="stacked"> <script data-option="title" data-value="Start session"></script> <p> <div class="react-code-block" data-preset="basic"> <div class="react-code-block-preload ThemeMode-dim"> <div class="react-code-block-preload-bar basic-codeblock"></div> <div class="react-code-block-preload-placeholder-container"> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> </div> </div> <script data-option="title" data-value="Request header"></script> <script type="text/plain" data-language="http"> RAW_MD_CONTENTShopify-Shop-Domain: my-test-shop.myshopify.com Shopify-Request-Id: c42e7408-d87c-4048-a493-b941e4f8ae4f Shopify-Api-Version: 2025-04 END_RAW_MD_CONTENT</script> </div> </p> <p> <div class="react-code-block" data-preset="basic"> <div class="react-code-block-preload ThemeMode-dim"> <div class="react-code-block-preload-bar basic-codeblock"></div> <div class="react-code-block-preload-placeholder-container"> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> </div> </div> <script data-option="title" data-value="Request body"></script> <script type="text/plain" data-language="json"> RAW_MD_CONTENT{ "id": "rAQVz9SYrBs9RkEetRPKIqKfU", "gid": "gid://shopify\/VoidSession/rAQVz9SYrBs9RkEetRPKIqKfU", "payment_id": "u0nwmSrNntjIWozmNslK5Tlq", "test": false, "merchant_locale": "en", "proposed_at": "2021-07-13T00:00:00Z" } END_RAW_MD_CONTENT</script> </div> </p> <p> <div class="react-code-block" data-preset="basic"> <div class="react-code-block-preload ThemeMode-dim"> <div class="react-code-block-preload-bar basic-codeblock"></div> <div class="react-code-block-preload-placeholder-container"> </div> </div> <script data-option="title" data-value="Response body"></script> <script type="text/plain" data-language="json"> RAW_MD_CONTENTEND_RAW_MD_CONTENT</script> </div> </p> </div> </p> Shopify must receive an HTTP `201` (Created) response for the void session creation to be successful. If the request fails, then it's retried several times. If the request still fails, then the user needs to manually retry the void in the Shopify admin. ### Request headers <table> <tr> <th>Header</th> <th>Description</th> </tr> <tr> <td><code>Shopify-Shop-Domain</code><span class="heading-flag">Required</span></td> <td>The permanent domain of the shop. Can be used to identify which shop is initiating the request.</td> </tr> <tr> <td><code>Shopify-Request-Id</code><span class="heading-flag">Required</span></td> <td>The unique request ID used to track specific requests for troubleshooting purposes.</td> </tr> <tr> <td><code>Shopify-Api-Version</code><span class="heading-flag">Required</span></td> <td>The API version selected in the payments app configuration. The version selected defines the <a href="#response">response</a> expected by the payments app.</td> </tr> </table> ### Request body <table> <tr> <th>Attribute</th> <th>Description</th> <th>Type</th> </tr> <tr> <td><code>id</code><span class="heading-flag">Required</span></td> <td>The unique identifier for the void attempt. Used as the <a href="/docs/apps/build/payments">idempotency key</a>. It can be assumed that requests with a given ID are identical to any previously-received requests with the same ID.</td> <td><code>String</code></td> </tr> <tr> <td><code>gid</code><span class="heading-flag">Required</span></td> <td>Identifies the void when communicating with Shopify (in GraphQL mutations, for example).</td> <td><code>String</code></td> </tr> <tr> <td><code>payment_id</code><span class="heading-flag">Required</span></td> <td>The ID of the authorized payment that is to be voided.</td> <td><code>String</code></td> </tr> <tr> <td><code>test</code><span class="heading-flag">Required</span></td> <td>Indicates whether the void is in test or live mode. The <code>test</code> field is only sent if you select API version <code>2022-01</code> or higher in the payments app extension configuration in Shopify CLI. For more information, refer to <a href="/docs/apps/build/payments">Test a payments app</a>. <td><code>Boolean</code></td> </tr> <tr> <td><code>merchant_locale</code><span class="heading-flag">Required</span></td> <td>The IETF BCP 47 language tag representing the language used by the merchant.</td> <td><code>String</code></td> </tr> <tr> <td><code>proposed_at</code><span class="heading-flag">Required</span></td> <td>A timestamp (ISO-8601) representing when the void request was proposed.</td> <td><code>String </code></td> </tr> </table> ## Confirm a payment (3-D Secure and Inventory confirmation) When Shopify determines if the payment request can proceed, Shopify sends a POST request to the **confirm session URL** of the credit card payments app extension, delivering the confirmation result. ### Request headers <table> <tr> <th>Header</th> <th>Description</th> </tr> <tr> <td><code>Shopify-Shop-Domain</code><span class="heading-flag">Required</span></td> <td>The permanent domain of the shop. Can be used to identify which shop is initiating the request.</td> </tr> <tr> <td><code>Shopify-Request-Id</code><span class="heading-flag">Required</span></td> <td>The unique request ID used to track specific requests for troubleshooting purposes.</td> </tr> <tr> <td><code>Shopify-Api-Version</code><span class="heading-flag">Required</span></td> <td>The API version selected in the payments app configuration. The version selected defines the <a href="#response">response</a> expected by the payments app.</td> </tr> </table> ### Request body <table id="confirmation-request-attributes"> <tr> <th>Attribute</th> <th>Description</th> <th>Type</th> </tr> <tr> <td><code>id</code><span class="heading-flag">Required</span></td> <td>The unique identifier for the payment, as provided in the HTTP POST request sent from Shopify to the payment session URL. Used as the <a href="/docs/apps/payments/implementation#idempotency">idempotency key</a>. It can be assumed that requests with a given <code>id</code> are identical to any previously received requests with the same <code>id</code>.</td> </tr> <tr> <td><code>gid</code><span class="heading-flag">Required</span></td> <td>Identifies the payment when communicating with Shopify (in GraphQL mutations, for example).</td> <td><code>String</code></td> </tr> <tr> <td><code>confirmation_result</code><span class="heading-flag">Required</span></td> <td>Result of the payment confirmation initiated by the <code>paymentSessionConfirm</code> mutation. The payment app can proceed with the payment request if and only if <code>confirmation_result</code> is <code>true</code></td> <td><code>Boolean</code></td> </tr> <tr> </table>