https://auth1.openbanking.zopa.com/https://auth1.openbanking.zopa.com/.well-known/openid-configurationhttps://auth1.openbanking-sandbox.zopa.com/.well-known/openid-configurationThe discovery documents describe the supported parameters for each environment.
Our production environment conforms to FAPI 1.0 Advanced. Sandbox offers less strict profiles to assist with integration testing — always verify your integration against the production discovery document before going live.
The authorisation endpoint is the one parameter that cannot be derived from the discovery document. Zopa is an app-based bank — PSU authorisation is handled exclusively via the Zopa mobile app, which must be installed on the user's device. Rather than a standard HTTPS endpoint, we use zopa:// deeplinks to redirect the PSU into the app. The deeplink differs by consent type:
zopa://consent-access-request?client_id=<client_id>&response_type=code%20id_token&scope=openid%20accounts&request=<signed_JWT>zopa://open-banking/pis-single-payment-consent?client_id=<client_id>&response_type=code%20id_token&scope=openid%20payments&request=<signed_JWT>zopa://open-banking/pis-standing-order-consent?client_id=<client_id>&response_type=code%20id_token&scope=openid%20payments&request=<signed_JWT>Note: The
/o3/v1.0/auth-code-urlendpoint is a convenience helper available on sandbox only. It builds the request object server-side usingalg=noneand must not be used in production — it does not support PS256 and will return a 500 error if attempted.
The request parameter must be a PS256-signed JWT constructed using your registered private signing key.
The scope must include openid in both the deeplink URL and the JWT payload — the value depends on the consent type:
openid accountsopenid paymentsJWT Header:
{
"alg": "PS256",
"kid": "<your-signing-key-kid>",
"typ": "JWT"
}
JWT Payload — AIS example:
{
"iss": "<your_client_id>",
"aud": "https://auth1.openbanking.zopa.com",
"response_type": "code id_token",
"client_id": "<your_client_id>",
"redirect_uri": "<your_registered_redirect_uri>",
"scope": "openid accounts",
"state": "<unique_state>",
"nonce": "<unique_nonce>",
"nbf": <unix_timestamp_now>,
"exp": <unix_timestamp_now + 500>,
"claims": {
"id_token": {
"openbanking_intent_id": {
"value": "<your_ais_consent_id>",
"essential": true
}
}
}
}
JWT Payload — PIS example:
{
"iss": "<your_client_id>",
"aud": "https://auth1.openbanking.zopa.com",
"response_type": "code id_token",
"client_id": "<your_client_id>",
"redirect_uri": "<your_registered_redirect_uri>",
"scope": "openid payments",
"state": "<unique_state>",
"nonce": "<unique_nonce>",
"nbf": <unix_timestamp_now>,
"exp": <unix_timestamp_now + 500>,
"claims": {
"id_token": {
"openbanking_intent_id": {
"value": "<your_payment_consent_id>",
"essential": true
}
}
}
}
Common mistakes:
- Using
scope: "payments"orscope: "accounts"—openidmust always be included- Using
aud: "https://as1.openbanking.zopa.com"— the correct value ishttps://auth1.openbanking.zopa.com- Using
response_type: "code"— production only supportscode id_tokenas required by FAPI 1.0 Advanced. Sandbox accepts both, so this error only surfaces when moving to production.- Including a
userinfoclaims block oracr— these are not required
https://rs1.openbanking.zopa.com/open-banking/v4.0/aisp/**https://rs1.openbanking.zopa.com/open-banking/v4.0/pisp/**Note for PISPs: All payment initiation requests must include a detached JWS signature in the
x-jws-signatureheader. This is not required for AIS requests. See the PIS API Overview for full details.
Our API supports dynamic client registration. We only trust Software Statement Assertions (SSAs) issued by the Open Banking Directory provided by Open Banking Limited. eIDAS certificates are supported via onboarding to the Open Banking Directory.
The registration endpoint is advertised in the OIDC discovery document via the registration_endpoint claim.
The aud claim used in the outer JWT of a DCR request is the Open Banking Limited issued org_id (as documented in the OBL DCR v3.2 standard).
PS256code id_tokenPS256PS256private_key_jwt, tls_client_authFor private_key_jwt, the aud claim is the URL of the token endpoint as specified in OIDC client authentication.
For the request object, the aud claim is the issuer value from the OIDC discovery document (https://auth1.openbanking.zopa.com). See the Authorisation URL section above for details on constructing the deeplinks.
We support OBWAC and OBSeal on both production and sandbox. TPPs can use their QWACs and QSeals to onboard to the OBL directory and generate these certificates.
We support QWACs, but this is not our recommended approach. TPPs facing issues onboarding with QWACs should contact our support desk with a PEM file of the certificate attached.
We support QSeals that have been attached to your software statement in the OB Directory.
Refresh tokens are valid for one year. After expiry, TPPs will need to generate a new consent to obtain a new refresh token.