Shopify APIs support idempotency, which allows you to safely retry API requests that might have failed due to connection issues, without causing duplication or conflicts. ## Idempotency keys An idempotency key (`idempotencyKey`) is a unique string identifier generated by your app. Shopify uses this identifier to recognize subsequent retries of the same request. ## How idempotent requests work If an API request is disrupted in transit, then you might not receive a response. By including an idempotency key in your request, repeated requests with the same parameters will be executed only once, no matter how many times the request is retried. For example, the [`subscriptionBillingAttemptCreate`](/docs/api/admin-graphql/latest/mutations/subscriptionBillingAttemptCreate) mutation supports idempotency. By including an idempotency key in your request, you ensure that repeated requests with the same parameters will be executed only once, regardless of how many times the request is retried: <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> </div> <script data-option="title" data-value="POST https://{shop}.myshopify.com/admin/api/{api_version}/graphql.json"></script> <script type="text/plain" data-language="graphql"> RAW_MD_CONTENTmutation { subscriptionBillingAttemptCreate(input: { subscriptionContractId: "gid://shopify/SubscriptionContract/123456789", idempotencyKey: "unique-idempotency-key" }) { subscriptionBillingAttempt { id status } userErrors { field message } } } END_RAW_MD_CONTENT</script> </div> </p> > Tip: > You can use any unique identifier for your idempotency key, but we recommend using a randomly generated universally unique identifier (UUID) to avoid collisions. ## Resources that accept idempotency keys Requests that process credit card payments, create billing attempts for subscriptions, or capture revenue details accept idempotency keys. Requests that update or delete objects are idempotent by definition, and don't require you to send an idempotency key as part of the request. Some examples of objects that accept an idempotency key include the following: **GraphQL Admin API** - [`AppRevenueAttributionRecord`](/docs/api/admin-graphql/latest/objects/apprevenueattributionrecord) - [`AppRevenueAttributionRecordInput`](/docs/api/admin-graphql/latest/input-objects/apprevenueattributionrecordinput) - [`SubscriptionBillingAttempt`](/docs/api/admin-graphql/latest/objects/subscriptionbillingattempt) - [`SubscriptionBillingAttemptInput`](/docs/api/admin-graphql/latest/input-objects/subscriptionbillingattemptinput) - [`subscriptionBillingAttemptCreate`](/docs/api/admin-graphql/latest/mutations/subscriptionbillingattemptcreate) **GraphQL Storefront API** - [`Payment`](/docs/api/storefront/reference/checkouts/payment) - [`CreditCardPaymentInputV2`](/docs/api/storefront/reference/checkouts/creditcardpaymentinputv2) - [`TokenizedPaymentInputV3`](/docs/api/storefront/reference/checkouts/tokenizedpaymentinputv3) - [`checkoutCompleteWithTokenizedPaymentV3`](/docs/api/storefront/reference/checkouts/checkoutcompletewithtokenizedpaymentv3)