> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cdp.coinbase.com/llms.txt
> Use this file to discover all available pages before exploring further.

# FAQ

> Common questions from partners integrating App2App.

Questions that come up most often when integrating App2App. For the full step-by-step, see [setup](/onramp/app2app/setup).

<AccordionGroup>
  <Accordion title="What happens if the user doesn't have the Coinbase app installed?">
    Check for the Coinbase app with `canOpenURL` before showing your buy button (see [Step 5](/onramp/app2app/setup#step-5-detect-the-coinbase-app-and-open-the-purchase)). If it isn't installed, fall back to [Coinbase-hosted Onramp](/onramp/coinbase-hosted-onramp/overview) so the user can still complete a purchase.
  </Accordion>

  <Accordion title="Does the user need an existing Coinbase account?">
    They need the Coinbase app installed, since that's what makes the deep-link handoff possible. They don't need an account beforehand: if they're not already signed in, Coinbase handles sign-in or account creation (including KYC for new users) inline, inside the Coinbase app, before the purchase continues. You don't need to build or trigger any of that yourself.
  </Accordion>

  <Accordion title="What payment methods and countries does App2App support?">
    Whatever the signed-in user's own Coinbase account already supports. App2App doesn't maintain a separate list of supported payment methods, countries, or limits; it hands off to the same eligibility and payment-method logic every other Coinbase purchase uses. `paymentMethod` and `paymentCurrency` on the purchase challenge are prefill hints, not restrictions. For a quick lookup by region, see the [Onramp Asset Availability tool](https://onramp-asset-availability.vercel.app/) or query [Buy Config](/api-reference/rest-api/onramp-offramp/get-buy-config) / [Buy Options](/api-reference/rest-api/onramp-offramp/get-buy-options) directly.
  </Accordion>

  <Accordion title="What do paymentMethod, paymentCurrency, country, and subdivision actually do?">
    They're UX hints, not restrictions. `paymentMethod` and `paymentCurrency` prefill the Coinbase app's funding-source selection; if you omit them, Coinbase lets the signed-in user pick from their own available sources instead. `country` and `subdivision` are accepted on the request but aren't currently used for anything: they're not validated, not forwarded to the Coinbase app, and don't gate eligibility. Actual eligibility, payment methods, and limits are always determined from the signed-in user's own Coinbase account after handoff, not from anything you send on the challenge.
  </Accordion>

  <Accordion title="What's the difference between paymentAmount and purchaseAmount?">
    `paymentAmount` is how much **fiat** the user spends (for example, `"25.00"` to spend \$25). `purchaseAmount` is how much **crypto** the user receives (for example, `"0.01"` to receive 0.01 ETH). Send exactly one; Coinbase computes the other side of the trade at purchase time.
  </Accordion>

  <Accordion title="Can I reuse a session URL?">
    Only before the Coinbase app opens it, and only within its 15-minute lifetime. Once opened, the session is consumed, so create a new challenge and session for any retry.
  </Accordion>

  <Accordion title="Is Android supported?">
    Not yet. Use [Coinbase-hosted Onramp](/onramp/coinbase-hosted-onramp/overview) for Android users.
  </Accordion>

  <Accordion title="Is there a Flutter or React Native SDK for App2App?">
    Not yet. App2App today is a native iOS integration built directly on Apple's `DeviceCheck` framework. A cross-platform SDK isn't currently available.
  </Accordion>

  <Accordion title="How do I confirm a purchase actually settled?">
    Subscribe to [onramp transaction webhooks](/webhooks/onramp) and watch for `onramp.transaction.success`, the primary way to know a purchase settled. You can also query the [transactions API](/onramp/app2app/setup#step-7-confirm-the-transaction) directly if you'd rather pull. Either way, don't rely on the redirect alone: it's for updating your UI, not for confirming that funds moved.
  </Accordion>

  <Accordion title="Do sandbox purchases generate a webhook or show up in the transactions API?">
    No. Sandbox (dry-run) sessions never move funds, so they never create a transaction record: no webhook fires and no row appears when you query the transactions API. The redirect (with its synthetic `transactionId`) is the only confirmation signal you get in sandbox. See [Sandbox testing](/onramp/app2app/setup#sandbox-testing).
  </Accordion>

  <Accordion title="Do I need a CDP API key for App2App?">
    Not for the attestation, challenge, or session requests: your app's App Attest signature is the credential there. You do need a CDP API key to set up a webhook subscription, and a CDP API key JWT if you query the transactions API directly instead of (or alongside) receiving webhooks.
  </Accordion>

  <Accordion title="Why did my purchase assertion fail after working before?">
    Your registered attestation key may no longer be valid. Clear your local registration, register a new key ([Step 1](/onramp/app2app/setup#step-1-register-your-apps-attestation-key)), and retry the purchase once.
  </Accordion>
</AccordionGroup>
