PPL · Authentication Profile
Ppl London Market Authentication
Authentication
PPL secures its APIs with oauth2 and mutualTLS across 3 declared security schemes, as derived from its OpenAPI definitions. OAuth 2.0 is offered via the authorizationCode, clientCredentials, and on-behalf-of flow(s).
InsuranceUnited KingdomLondon MarketLloyd's of LondonReinsuranceCommercial InsuranceBrokerUnderwritingPlacementMarket InfrastructureACORDElectronic Placing
Methods: oauth2, mutualTLS
Schemes: 3
OAuth flows: authorizationCode, clientCredentials, on-behalf-of
API key in:
Security Schemes
entraIdBearer oauth2
· flows: authorizationCode, onBehalfOf, clientCredentials
clientCertificate mutualTLS
xAssertHeader apiKey
· in: header ()
Source
Authentication Profile
generated: '2026-07-25'
method: searched
source: openapi/ (5 OpenAPI 3.0.1 documents — none declares securitySchemes)
docs: https://developer.pplnextgen.com/Get-Started/Authentication-Information
also_documented_at:
- https://developer.pplnextgen.com/Get-Started/Base-API-Standard
- https://developer.pplnextgen.com/Get-Started/Registration-Onboarding
- https://developer.pplnextgen.com/Get-Started/Reference-Architecture
spec_gap: >-
None of the five published PPL OpenAPI documents declares components.securitySchemes and
none declares a security requirement. The entire auth contract lives in developer-portal
prose, not in the machine-readable artifacts. This profile is therefore SEARCHED from the
documentation, not derived from the specs. overlays/ppl-london-market-*-overlay.yaml carries
the securitySchemes PPL omits, as an OpenAPI Overlay over each original document.
summary:
types: [oauth2, mutualTLS]
api_keys: false
api_key_in: []
oauth2_flows: [authorizationCode, clientCredentials, on-behalf-of]
identity_provider: Microsoft Entra ID (Azure AD)
gateway: LIMOSS API Gateway
self_serve: false
anonymous_endpoints: [/health]
schemes:
- name: entraIdBearer
type: oauth2
description: >-
Every business call is fronted by the LIMOSS API Gateway and must present a Microsoft Entra
ID (Azure AD) JWT in the Authorization header as a bearer token. The Base API Standard states
the JWT "must be signed by a Security Token Service (STS)" and must carry the claim
"scp": "user_impersonation". Only identities that have been guested into the API Gateway
Azure AD tenant for that environment can obtain a usable token.
header: 'Authorization: Bearer {JWT}'
required_claims:
scp: user_impersonation
optional_claims:
amr: mfa # indicates the user completed multi-factor authentication
flows:
- flow: authorizationCode
description: >-
Browser sign-in for an application user. Configured in the portal's ASP.NET Core / MSAL
sample as OpenID Connect with ResponseType "code id_token" and CallbackPath /signin-oidc,
with the default authenticate scheme set to cookie authentication.
authorizationUrl: https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/authorize
tokenUrl: https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token
note: >-
The token produced by the initial sign-in does NOT carry the scopes the gateway requires.
The application must then request a second token directly from Azure AD on the user's
behalf (on-behalf-of) before any API call will pass the gateway.
- flow: onBehalfOf
description: >-
OAuth 2.0 on-behalf-of exchange. Required when the initial token lacks the scope claim, and
also when the downstream API validates the audience claim — "the gateway may also need to
obtain an on-behalf-of token with the correct audience set". PPL documents the TTL rule
explicitly: "Any token issued by the API Gateway must not have a TTL longer than that of the
token which called it", with nbf set to the current time and exp matched to the original.
tokenUrl: https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token
- flow: clientCredentials
description: >-
Service-account (headless) server-to-server token, used where no browser is involved. PPL
notes that service-account tokens carry a dummy email claim.
tokenUrl: https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token
configuration:
source: https://developer.pplnextgen.com/Get-Started/Authentication-Information
keys:
Instance: https://login.microsoftonline.com/
TenantId: environment specific (Sand, PreProd, Prod are separate tenanted environments)
ClientId: issued during onboarding
ClientSecret: issued during onboarding
CallbackPath: /signin-oidc
ResponseType: code id_token
- name: clientCertificate
type: mutualTLS
description: >-
Mutual HTTPS is mandatory. The Base API Standard requires an X.509 client certificate whose
CN identifies the calling application. A DIFFERENT certificate must be registered for each
API Gateway environment: "A different X.509 certificate should be used for each API Gateway
(Sand, PreProd and Prod)." The portal's sample loads the certificate from the Personal
certificate store by thumbprint, gated on a UseCertificate configuration flag, with a
one-hour sliding cache.
registration: https://admin.limoss.london/wp-content/uploads/2020/04/CS-Developers-On-Boarding-Guide-v1.1.pdf
per_environment: true
- name: xAssertHeader
type: apiKey
in: header
parameter_name: X-Assert
description: >-
Documented as an alternative header scheme for non-token scenarios, carrying the user's email
address. This is an internal/gateway construct, not a consumer credential — it does not
replace the Entra ID bearer token or the client certificate for external consumers.
consumer_facing: false
required_call_headers:
note: >-
Derived from the parameters declared on every business operation across the five OpenAPI
documents. These are transmitted in addition to Authorization.
headers:
- name: X-Auth-Impersonated-User
required: true
scope: every business operation in all five APIs
description: The market user the call is being made on behalf of.
- name: X-Auth-Team
required: true
scope: every business operation except the Organisations broker/carrier organisation lookups
description: The broker or carrier team context for the call.
- name: X-Last-Modified
required: true
scope: every PUT (and Negotiation_Send_v1)
description: >-
Optimistic-concurrency precondition. PPL's implementation of the Base API Standard rule that
"Resources must use optimistic concurrency control"; the standard names If-Match and
If-Unmodified-Since, the shipped APIs use the X-Last-Modified request header.
- name: X-Correlation-Id
required: false
scope: documented platform-wide for request tracing across the platform
onboarding:
self_serve: false
gates:
- stage: 1
name: Developer Portal onboarding
action: Contact the PPL team
contact: PPLEnquiries@placingplatformlimited.com
- stage: 2
name: LIMOSS API Common Services subscription
action: >-
Register with the LIMOSS API Gateway and request "Subscribe to PPL API". New LIMOSS SSO
users go through the LIMOSS Service Desk; existing users use the LIMOSS Self-Service Portal.
The account is then guested into the Azure AD tenant of ONE environment — Sand, PreProd or
Prod — and each environment requires separate guesting.
urls:
- https://limoss.london/limoss-sso-sde-and-api-gateway
- https://limoss.london/contact
- https://customer.hornbill.com/limoss/
- stage: 3
name: Application and certificate registration
action: >-
Register the application in the Common Services Azure Active Directory and register an X.509
certificate, per environment.
guide: https://admin.limoss.london/wp-content/uploads/2020/04/CS-Developers-On-Boarding-Guide-v1.1.pdf
discovery:
well_known: false
note: >-
No OpenID Connect discovery document and no RFC 8414 authorization-server metadata is served
on any PPL or LIMOSS gateway host — /.well-known/openid-configuration and
/.well-known/oauth-authorization-server return 404 on api.londonmarketgroup.co.uk,
sand-api.londonmarketgroup.co.uk, developer.pplnextgen.com, www.pplnextgen.com and
placingplatformlimited.com. Discovery happens through Microsoft's own tenant endpoints once a
TenantId has been issued during onboarding.
related:
scopes: scopes/ppl-london-market-scopes.yml
conventions: conventions/ppl-london-market-conventions.yml
well_known: well-known/ppl-london-market-well-known.yml