https://auth1.openbanking.zopa.com/.well-known/openid-configurationhttps://auth1.openbanking.zopa.com/We currently only support redirect via a deeplink to the Zopa mobile app. Unlike most ASPSPs which use a standard HTTPS authorisation endpoint, our authorisation URLs use a custom zopa:// deeplink scheme to redirect the PSU into the Zopa mobile app.
Note: The
/o3/v1.0/auth-code-urlendpoint is a convenience helper available on sandbox only to assist with testing. 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 deeplink format differs by consent type:
zopa://consent-access-request?client_id=<client_id>&response_type=code&scope=openid%20accounts&request=<signed_JWT>zopa://open-banking/pis-single-payment-consent?client_id=<client_id>&response_type=code&scope=openid%20payments&request=<signed_JWT>zopa://open-banking/pis-standing-order-consent?client_id=<client_id>&response_type=code&scope=openid%20payments&request=<signed_JWT>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",
"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",
"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- Including a
userinfoclaims block oracr— these are not required
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 allows dynamic client registration in order to create a valid client that is able to use our Authorisation Server. 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 (as discussed in more detail below).
The url of the registration endpoint is advertised on our OIDC Discovery Endpoints using the registration_endpoint claim.
The aud claim used in the outer JWT of a Dynamic Client Registration request is the Open Banking Limited issued org_id (as documented in the Open Banking Limited DCR v3.1 standard).
As defined further in the Zopa Open Banking API Specification
PS256code id_tokenPS256PS256private_key_jwt, tls_client_authFor private_key_jwt - the
audclaim is the url of the token endpoint as specified in OIDC client authentication.
The request object used in OIDC flows the aud claim is the issuer url from the Zopa ASPSP .wellknown endpoint:
https://auth1.openbanking.zopa.com/.well-known/openid-configuration- though please see above for details of our authorisation URLs which require TPPs to construct deeplinks.
Note: Our Sandbox API also offers less strict profiles to assist with integration testing.
We support the use of OBWAC and OBSeal on our production and sandbox environments. TPPs can use their QWACs and QSeals to onboard to the OBL directory and generate these certificates.
We support the use of QWACs, but this is not our recommended approach. TPPs facing issues onboarding with QWACs should contact our support desk. Please attach a pem file of the certificate to your support ticket.
We support the use of QSeals that have been attached to your software statement in the OB Directory.
Our refresh tokens last one year, after this TPPs will need to generate a new consent in order to get a new refresh token.