Reference

Payment Certification Levels

A practical guide to EMVCo L1 / L2 / L3 terminal certifications, PCI DSS merchant compliance tiers, and the standards that govern every card-present transaction.

FAPI — Financial-grade API Security Profiles

The OpenID Foundation's hardened profile of OAuth 2.0 / OpenID Connect for APIs that move money or expose regulated data. FAPI picks the secure option for every choice OAuth leaves open and adds hard limits; open-banking ecosystems mandate it and require certification before onboarding. Cheatsheet below — the full walkthrough is in the FAPI guide.

Profiles at a glance

DocumentStatusScopeSignature features
FAPI 1.0 Part 1: BaselineFinal · Mar 2021Read-only APIsConfidential clients, TLS 1.2+, PKCE, code flow, x-fapi-* headers
FAPI 1.0 Part 2: AdvancedFinal · Mar 2021Read-write APIsSigned request objects (JAR), hybrid code id_token or JARM, mTLS / private_key_jwt, certificate-bound tokens, PS256 / ES256
FAPI 2.0 Security ProfileFinal · Feb 2025One read-write profilePAR + PKCE S256, response_type=code only, iss in response, tokens bound by mTLS or DPoP, formally analysed against the Attacker Model
FAPI 2.0 Attacker ModelFinal · Feb 2025CompanionSecurity goals and attackers A1, A1a, A2, A3a, A5 (A4 informative)
FAPI 2.0 Message SigningFinal · Sep 2025Non-repudiation add-onJAR at the PAR endpoint, JARM responses, RFC 9701 signed introspection, signed ID tokens — each certifiable separately
FAPI-CIBAImplementer's DraftDecoupled flowsSigned backchannel requests, poll and ping modes only
FAPI 2.0 HTTP SigningDraftResource requests / responsesRFC 9421 HTTP Message Signatures with Content-Digest
ISO/IEC 26083-1 / -2DIS ballot closed Jan 2026ISO track for FAPI 2.0Security Profile and Attacker Model as international standards (publication pending)

FAPI 2.0 building blocks

SpecRoleMandatory?
RFC 9126 PARAll authorization parameters server-to-server; browser carries client_id + request_uri onlyYes
RFC 7636 PKCES256, fresh per request; CSRF and code-injection defenceYes
RFC 9207iss in the authorization response; client checks it (mix-up defence)Yes
RFC 8705 mTLSClient authentication and certificate-bound tokens (cnf.x5t#S256)One of mTLS / DPoP for binding; one of mTLS / private_key_jwt for client auth
RFC 9449 DPoPProof-of-possession JWT per request; tokens bound to cnf.jkt; server nonces; dpop_jkt code bindingAlternative to mTLS binding
OIDC Core §9 private_key_jwtClient assertion, aud = issuer identifier as a stringAlternative to mTLS client auth
RFC 8414 / OIDC DiscoveryOnly source of endpoint URLs; issuer must match the URLYes
RFC 9700 (BCP 240)OAuth 2.0 Security BCP: no open redirectors, no 307 with credentials, one-time codesYes
RFC 8725JWT BCP for every JWT handledYes
RFC 9396 RARauthorization_details for payments and fine-grained consentRecommended
RFC 9101 JAR · JARM · RFC 9701Signed requests, responses, introspectionOnly with Message Signing

Authorization server: the "shall" list (FAPI 2.0)

Clients, grants, tokens

  • Confidential clients only; password grant rejected
  • Only sender-constrained access tokens (mTLS or DPoP)
  • Client auth: mTLS or private_key_jwt only
  • No refresh-token rotation (except migrations, with retry)
  • Metadata published; no open redirectors
  • JWT iat/nbf: accept ≤ 10 s future, reject > 60 s

Authorization endpoint

  • response_type=code only
  • PAR required and authenticated; non-PAR requests rejected
  • PKCE S256 required; redirect_uri required in PAR
  • iss returned in every response
  • No http redirect URIs (loopback excepted); codes single-use
  • No HTTP 307; 303 recommended; no CORS on /authorize

Clients & resource servers

  • Client: PAR always, fresh PKCE bound to the user agent, check iss, endpoints from metadata only
  • Client: support refresh tokens, mtls_endpoint_aliases, DPoP nonces
  • RS: tokens in the Authorization header only, never query strings
  • RS: verify validity, expiry, revocation, scope and the sender constraint

Numbers & algorithms

ItemValue
Authorization code lifetime≤ 60 s, single use
PAR request_uriexpires_in< 600 s, single use enforced at authorization
Clock skew on iat / nbfMust accept 0–10 s in the future; must reject > 60 s
Signed request object (Message Signing)nbf ≤ 60 min old; exp ≤ 60 min after nbf; typ=oauth-authz-req+jwt; aud = issuer
OIDC nonceServers support ≤ 64 characters
JWS algorithmsPS256, ES256, EdDSA (Ed25519); never none, RS256 or HS256
Key sizesRSA ≥ 2048 bits · EC ≥ 224 bits
Token / code entropy≥ 128 bits
TLS1.2+, BCP 195, RFC 9525 certificate checks; server-to-server endpoints use only recommended cipher suites; preloaded HSTS for browser endpoints
Access tokenShort-lived (minutes) with refresh tokens for long grants (recommendation)

FAPI 1.0 Advanced → 2.0 in one table

FAPI 1.0 AdvancedFAPI 2.0Reason
JARPARRequest integrity without a front-channel signature
JARM / hybrid flowcode onlyNothing left in the response worth signing
s_hash + statePKCEPKCE carries the CSRF protection
Pre-registered redirect URIsRedirect URI in PARAuthenticated PAR makes pre-registration unnecessary
ID token as detached signaturePKCEID token no longer doubles as a signature
exp/nbf in request objectShort-lived request_uriStops pre-generated requests
mTLS-bound tokensmTLS or DPoPDPoP deploys behind any TLS terminator
x-fapi-* headersImplementation & Deployment AdviceNot part of the security core

The x-fapi-* headers

HeaderDirectionMeaning
x-fapi-interaction-idRequest and responseUUID correlating one API interaction across client and server logs; the server echoes the client's value or mints one
x-fapi-auth-dateRequestWhen the user last authenticated at the client (RFC 7231 date), for risk decisions
x-fapi-customer-ip-addressRequestThe user's IP when the user is present; its absence marks an unattended (batch) call, which ecosystems rate-limit

Ecosystems & certification

EcosystemProfile (Oct 2026)
UK Open BankingFAPI 1.0 Advanced + FAPI-CIBA
Open Finance BrasilFAPI 1.0 Advanced (FAPI-BR), migrating to 2.0
Australia CDRFAPI 1.0 Advanced; 2.0 under consultation
ConnectID (AU) · UAE Open Finance · US FDXFAPI 2.0
Saudi Arabia (SAMA)FAPI 1.0 Advanced
EU PSD2 (Berlin Group / STET)No FAPI mandate; eIDAS QWAC / QSealC; openFinance framework references FAPI 2.0
Certification. The OpenID Foundation's open-source conformance suite tests authorization servers and clients against FAPI 1.0 Advanced, FAPI 2.0 Security Profile (with mTLS / private_key_jwt × mTLS / DPoP variants), FAPI 2.0 Message Signing and FAPI-CIBA; passing results are self-certified and published. Ecosystems generally require a current certificate for onboarding. Deep dive: who mandates which profile · the flow message by message.

Related Tools

Use these tools to work with the cryptographic primitives that underpin terminal and card security.