openapi: 3.1.0
info:
title: Notification Service [$]
description: |
The Push Notifications Service handles delivering notifications via webhook to subscribers and manages the registration of subscribers for specific events. This API caters to various functions including updating, deleting, and creating registration details, as well as rotating the shared secret for secure communication.
Pricing:
This API is a premium API service and usage of the API is billed. Please contact the API support team [here](mailto:apisupport@pexa.com.au) for more information.
This API uses the OAuth 2.0 protocol for authentication and authorization. It supports the following OAuth 2.0 flow:
- Client Credentials
Scopes are used to grant an application different levels of access to data. Each API endpoint will require specific scopes.
The scopes are listed against each API endpoint.
For more information, see the following guides:
- [PEXA Webhooks Guide](../../docs/definitions/webhooks/)
- [Authentication](../../../Exchange/docs/documentation/)
version: 1.0.0
contact:
email: 'apisupport@pexa.com.au'
servers:
- url: 'https://api.pexa.com.au'
description: Production server
- url: 'https://api-tst.pexalabs.com.au'
description: Non-Prod server
tags:
- name: NotificationRegistration
description: Registration related endpoints
paths:
/v3/notification-registrations:
post:
tags:
- NotificationRegistration
summary: Create registration details (V3)
description: Registers a webhook endpoint to start receiving PEXA event notifications, with support for enhanced authentication modes. Use authenticationMode HMAC for standard shared secret verification, or HMAC_OAUTH to additionally authenticate webhook delivery using OAuth 2.0 Client Credentials for integrators with strict inbound security requirements. Returns a system-generated shared secret that must be stored securely and used to verify the HMAC signature on all incoming webhook requests. The shared secret expires after 30 days and must be rotated before expiry.
Scopes:
create:notification_registrations (non-prod)
create:notification_registrations (prod)
operationId: createNotificationRegistrationV3
security:
- oauth2:
- create:notification_registrations
tags:
- Create registration V3
requestBody:
description: Registration details
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/WebhookNotificationRegistrationRequest'
examples:
hmacOnly:
summary: HMAC authentication
value:
notificationType: 'WEBHOOK'
eventTypes:
- 'WORKSPACE_PARTICIPANT_ADDED'
- 'SECRET_EXPIRY'
attributes:
webhookURI: 'https://example.com/webhook'
authenticationMode: 'HMAC'
hmacOauthPrivateKeyJwt:
summary: HMAC + OAuth (private_key_jwt)
value:
notificationType: 'WEBHOOK'
eventTypes:
- 'WORKSPACE_PARTICIPANT_ADDED'
- 'SECRET_EXPIRY'
attributes:
webhookURI: 'https://example.com/webhook'
authenticationMode: 'HMAC_OAUTH'
authConfig:
authUrl: 'https://auth.example.com/oauth/token'
clientId: 'client-12345'
clientAuthMethod: 'private_key_jwt'
audience: 'https://api.example.com'
scope: 'api.scope1 api.scope2'
hmacOauthClientSecret:
summary: HMAC + OAuth (client_secret)
value:
notificationType: 'WEBHOOK'
eventTypes:
- 'WORKSPACE_PARTICIPANT_ADDED'
- 'SECRET_EXPIRY'
attributes:
webhookURI: 'https://example.com/webhook'
authenticationMode: 'HMAC_OAUTH'
authConfig:
authUrl: 'https://auth.example.com/oauth/token'
clientId: 'client-12345'
clientAuthMethod: 'client_secret'
clientSecret: 'secret-67890'
scope: 'api.scope1 api.scope2'
responses:
'200':
description: SUCCESS
content:
application/json:
schema:
$ref: '#/components/schemas/WebhookNotificationRegistrationResponseV3'
examples:
createRegistrationWithHMAC:
value:
notificationType: 'WEBHOOK'
eventTypes:
- 'SECRET_EXPIRY'
- 'CHECKLIST_CHECKED'
sharedSecret: '38e5d78c-d642-42d1-8064-0082dc87c4e5'
sharedSecretExpiry: '2025-03-13 04:12:51.574000 +00:00'
webhookURI: 'https://example.com/webhook'
authenticationMode: 'HMAC'
registrationId: '28e5d78c-d642-42d1-8064-0082dc87c4e5'
subscriberId: '202'
createRegistrationWithHMACOAUTH:
value:
notificationType: 'WEBHOOK'
eventTypes:
- 'SECRET_EXPIRY'
- 'CHECKLIST_CHECKED'
sharedSecret: '38e5d78c-d642-42d1-8064-0082dc87c4e5'
sharedSecretExpiry: '2025-03-13 04:12:51.574000 +00:00'
webhookURI: 'https://example.com/webhook'
authenticationMode: 'HMAC_OAUTH'
authConfig:
authUrl: 'https://auth.example.com/oauth/token'
clientId: 'client-12345'
clientAuthMethod: 'private_key_jwt'
audience: 'https://api.example.com'
scope: 'api.scope1 api.scope2'
registrationId: '28e5d78c-d642-42d1-8064-0082dc87c4e5'
subscriberId: '202'
createRegistrationWithHMACOAUTHClientSecret:
value:
notificationType: 'WEBHOOK'
eventTypes:
- 'SECRET_EXPIRY'
- 'CHECKLIST_CHECKED'
sharedSecret: '38e5d78c-d642-42d1-8064-0082dc87c4e5'
sharedSecretExpiry: '2025-03-13 04:12:51.574000 +00:00'
webhookURI: 'https://example.com/webhook'
authenticationMode: 'HMAC_OAUTH'
authConfig:
authUrl: 'https://auth.example.com/oauth/token'
clientId: 'client-12345'
clientAuthMethod: 'client_secret'
scope: 'api.scope1 api.scope2'
registrationId: '28e5d78c-d642-42d1-8064-0082dc87c4e5'
subscriberId: '202'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
examples:
subscriberIdMissing:
summary: SubscriberId couldn't be fetched from token
value:
errors:
- code: 'GA.NOTIF.400009'
message: "SubscriberId couldn't be fetched from token"
field: null
webhookURIInvalid:
value:
errors:
- code: 'GA.NOTIF.400012'
message: 'Webhook URI is invalid'
field: 'webhookURI'
domainNotWhitelisted:
value:
errors:
- code: 'GA.NOTIF.400014'
message: 'The webhook domain has not been whitelisted'
field: 'webhookURI'
authenticationModeInvalid:
value:
errors:
- code: 'GA.NOTIF.400026'
message: 'Invalid authentication mode'
field: 'authenticationMode'
authConfigMissing:
summary: authConfig required for HMAC_OAUTH
value:
errors:
- code: 'GA.NOTIF.400027'
message: 'authConfig is required when authenticationMode is HMAC_OAUTH'
field: 'authConfig'
authUrlNotWhitelisted:
summary: Auth URL domain not whitelisted
value:
errors:
- code: 'GA.NOTIF.400029'
message: 'The auth URL domain has not been whitelisted'
field: 'authUrl'
clientIdInvalid:
summary: clientId is required
value:
errors:
- code: 'GA.NOTIF.400030'
message: 'clientId is required and must not be blank'
field: 'clientId'
clientAuthMethodInvalid:
summary: Invalid clientAuthMethod
value:
errors:
- code: 'GA.NOTIF.400031'
message: 'Invalid clientAuthMethod'
field: 'clientAuthMethod'
clientSecretMissing:
summary: clientSecret required for client_secret method
value:
errors:
- code: 'GA.NOTIF.400032'
message: 'clientSecret is required when clientAuthMethod is client_secret'
field: 'clientSecret'
authConfigNotAllowed:
summary: authConfig not allowed for HMAC mode
value:
errors:
- code: 'GA.NOTIF.400034'
message: 'authConfig must not be provided when authenticationMode is HMAC'
field: 'authConfig'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- code: 'GA.NOTIF.401004'
message: 'Unauthorized'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- code: 'GA.NOTIF.403003'
message: 'Forbidden'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- message: 'Internal Server Error'
/v3/notification-registrations/{registrationId}:
put:
tags:
- NotificationRegistration
summary: Update registration details (V3)
description: Updates the webhook URI, event types, or authentication configuration for an existing registration. Supports switching between HMAC and HMAC_OAUTH modes. Use HMAC_OAUTH to add OAuth 2.0 Client Credentials authentication on top of HMAC for enhanced security. The shared secret is unchanged and not returned in this response. Use the secret rotation endpoint if you need to renew it.
Scopes:
edit:notification_registrations (non-prod)
edit:notification_registrations (prod)
operationId: updateNotificationRegistrationV3
security:
- oauth2:
- edit:notification_registrations
tags:
- Update registration V3
parameters:
- in: path
name: registrationId
schema:
type: string
format: uuid
required: true
description: UUID of the registration to update
example: '28e5d78c-d642-42d1-8064-0082dc87c4e5'
requestBody:
description: Updated registration details
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/WebhookNotificationRegistrationRequest'
responses:
'200':
description: SUCCESS
content:
application/json:
schema:
$ref: '#/components/schemas/WebhookNotificationRegistrationUpdateResponseV3'
examples:
updateRegistrationWithHMAC:
value:
notificationType: 'WEBHOOK'
eventTypes:
- 'SECRET_EXPIRY'
- 'CHECKLIST_CHECKED'
webhookURI: 'https://example.com/webhook'
authenticationMode: 'HMAC'
registrationId: '28e5d78c-d642-42d1-8064-0082dc87c4e5'
subscriberId: '202'
updateRegistrationWithHMACOAUTH:
value:
notificationType: 'WEBHOOK'
eventTypes:
- 'SECRET_EXPIRY'
- 'CHECKLIST_CHECKED'
webhookURI: 'https://example.com/webhook'
authenticationMode: 'HMAC_OAUTH'
authConfig:
authUrl: 'https://auth.example.com/oauth/token'
clientId: 'client-12345'
clientAuthMethod: 'private_key_jwt'
audience: 'https://api.example.com'
scope: 'api.scope1 api.scope2'
registrationId: '28e5d78c-d642-42d1-8064-0082dc87c4e5'
subscriberId: '202'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
examples:
webhookURIInvalid:
value:
errors:
- code: 'GA.NOTIF.400012'
message: 'Webhook URI is invalid'
field: 'webhookURI'
authConfigMissing:
summary: authConfig required for HMAC_OAUTH
value:
errors:
- code: 'GA.NOTIF.400027'
message: 'authConfig is required when authenticationMode is HMAC_OAUTH'
field: 'authConfig'
authUrlNotWhitelisted:
value:
errors:
- code: 'GA.NOTIF.400029'
message: 'The auth URL domain has not been whitelisted'
field: 'authUrl'
clientSecretMissing:
value:
errors:
- code: 'GA.NOTIF.400032'
message: 'clientSecret is required when clientAuthMethod is client_secret'
field: 'clientSecret'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- code: 'GA.NOTIF.401004'
message: 'Unauthorized'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- code: 'GA.NOTIF.403003'
message: 'Forbidden'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- code: 'GA.NOTIF.404007'
message: 'Registration not found for given id: 091f7d22-88a9-4b64-bc51-e1ea8bb8dc42'
field: 'registrationId'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- message: 'Internal Server Error'
/v2/notification-registrations:
get:
tags:
- NotificationRegistration
summary: Get notification registrations
description: Retrieve registration details. If registrationId parameter is provided, returns specified registration details. If not provided, returns an array of all registrations ordered by updated_at timestamp in descending order
Scopes:
view:notification_registrations (non-prod)
view:notification_registrations (prod)
operationId: getNotificationRegistrationsV2
security:
- oauth2:
- view:notification_registrations
tags:
- Get registration V2
parameters:
- in: query
name: registrationId
schema:
type: string
format: uuid
required: false
description: Optional registration ID to filter results. If not provided, returns all registrations ordered by updated_at timestamp in descending order.
example: '28e5d78c-d642-42d1-8064-0082dc87c4e5'
- in: query
name: page
schema:
type: integer
default: 1
minimum: 1
required: false
description: Determines which page of registrations to retrieve
- in: query
name: limit
schema:
type: integer
default: 10
minimum: 1
maximum: 20
required: false
description: Number of records per page
responses:
'200':
description: SUCCESS
content:
application/json:
schema:
$ref: '#/components/schemas/PagedNotificationRegistrations'
examples:
registrationWithHMAC:
summary: Registration with HMAC authentication
value:
page:
page: 1
totalRecords: 1
pageRecords: 1
limit: 10
records:
- notificationType: 'WEBHOOK'
eventTypes:
- 'SECRET_EXPIRY'
- 'CHECKLIST_CHECKED'
integratorId: '344a6eb8-1201-4b80-a279-084713e300ef'
integratorType: 'BROKER'
registrationId: '28e5d78c-d642-42d1-8064-0082dc87c4e5'
subscriberId: '202'
sharedSecret: '38e5d78c-d642-42d1-8064-0082dc87c4e5'
sharedSecretExpiry: '2025-03-13 04:12:51.574000 +00:00'
webhookURI: 'https://push-notifications.pexa.com.au/notifications-webhook'
authenticationMode: 'HMAC'
registrationWithHMACOAUTH:
summary: Registration with HMAC + OAuth authentication
value:
page:
page: 1
totalRecords: 1
pageRecords: 1
limit: 10
records:
- notificationType: 'WEBHOOK'
eventTypes:
- 'SECRET_EXPIRY'
- 'CHECKLIST_CHECKED'
integratorId: '344a6eb8-1201-4b80-a279-084713e300ef'
integratorType: 'BROKER'
registrationId: '28e5d78c-d642-42d1-8064-0082dc87c4e5'
subscriberId: '202'
sharedSecret: '38e5d78c-d642-42d1-8064-0082dc87c4e5'
sharedSecretExpiry: '2025-03-13 04:12:51.574000 +00:00'
webhookURI: 'https://push-notifications.pexa.com.au/notifications-webhook'
authenticationMode: 'HMAC_OAUTH'
authConfig:
authUrl: 'https://auth.example.com/oauth/token'
clientId: 'client-12345'
clientAuthMethod: 'private_key_jwt'
audience: 'https://api.example.com'
scope: 'api.scope1 api.scope2'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
examples:
subscriberIdMissing:
summary: SubscriberId couldn't be fetched from token
value:
errors:
- code: 'GA.NOTIF.400009'
message: "SubscriberId couldn't be fetched from token"
field: null
invalidRegistrationId:
summary: Invalid registration ID format
value:
errors:
- code: 'GA.NOTIF.400000'
message: 'Invalid UUID string'
field: 'registrationId'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- code: 'GA.NOTIF.401004'
message: 'Unauthorized'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- code: 'GA.NOTIF.403003'
message: 'Forbidden'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- message: 'Internal Server Error'
/v1/notification-registrations:
post:
tags:
- NotificationRegistration
summary: Create registration details
description: Registers a webhook endpoint to start receiving PEXA event notifications. Returns a system-generated shared secret that must be stored securely and used to verify the HMAC signature on all incoming webhook requests. The shared secret expires after 30 days and must be rotated before expiry.
Scopes:
create:notification_registrations (non-prod)
create:notification_registrations (prod)
operationId: createNotificationRegistration
security:
- oauth2:
- create:notification_registrations
tags:
- Create registration
requestBody:
description: Registration details
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateNotificationRegistrationRequest'
responses:
'200':
description: SUCCESS
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationRegistrationCreateDto'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
examples:
subscriberIdMissing:
summary: Subscriber Id is missing
value:
errors:
- code: 'GA.NOTIF.400009'
message: "Subscriber Id is missing"
field: null
webhookURIInvalid:
summary: Invalid webhook URI
value:
errors:
- code: 'GA.NOTIF.400012'
message: 'Webhook URI is invalid'
field: 'webhookURI'
eventTypeListEmpty:
summary: Event type list is empty
value:
errors:
- code: 'GA.NOTIF.400013'
message: 'Must not be empty'
field: 'eventTypes'
domainNotWhitelisted:
summary: Domain not whitelisted
value:
errors:
- code: 'GA.NOTIF.400014'
message: 'The webhook domain has not been whitelisted'
field: 'webhookURI'
eventTypeListInvalid:
summary: Event type list is invalid
value:
errors:
- code: 'GA.NOTIF.400015'
message: 'Invalid eventTypes: ["Invalid_event1", "Invalid_event2"]'
field: 'eventTypes'
eventTypeListDuplicate:
summary: Event type list has duplicates
value:
errors:
- code: 'GA.NOTIF.400016'
message: 'Duplicate eventTypes: ["CHECKLIST_CHECKED", "CHECKLIST_UNCHECKED"]'
field: 'eventTypes'
invalidFormat:
summary: Invalid format provided
value:
errors:
- code: 'GA.NOTIF.400017'
message: 'Invalid format provided'
field: 'webhookURI'
invalidJson:
summary: Invalid JSON
value:
errors:
- code: 'GA.NOTIF.400018'
message: 'JSON parse error'
field: null
duplicateRegistration:
summary: Duplicate registration
value:
errors:
- code: 'GA.NOTIF.400019'
message: 'Registration already exists with this combination'
field: 'webhookURI'
mandatoryEventTypesMissing:
summary: Mandatory event types missing
value:
errors:
- code: 'GA.NOTIF.400020'
message: 'Mandatory event types are missing'
field: 'eventTypes'
additionalEventTypeMissing:
summary: An additional event type is required
value:
errors:
- code: 'GA.NOTIF.400021'
message: 'There should be at least one more event present apart from mandatory event(s)'
field: 'eventTypes'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- code: 'GA.NOTIF.401004'
message: 'Unauthorized'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- code: 'GA.NOTIF.403003'
message: 'Forbidden'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- message: 'Internal Server Error'
/v1/notification-registrations/{registrationId}:
put:
tags:
- NotificationRegistration
summary: Update registration details
description: Updates the webhook URI or event types for an existing registration. The shared secret is unchanged and not returned in this response. Use the secret rotation endpoint if you need to renew it.
Scopes:
edit:notification_registrations (non-prod)
edit:notification_registrations (prod)
operationId: updateNotificationRegistration
security:
- oauth2:
- edit:notification_registrations
tags:
- Update a subscriber's notification preference
parameters:
- in: path
name: registrationId
schema:
type: string
required: true
description: UUID of the registration
requestBody:
description: Registration details
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateNotificationRegistrationRequest'
responses:
'200':
description: SUCCESS
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationRegistrationDto'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
examples:
subscriberIdMissing:
summary: Subscriber Id is missing
value:
errors:
- code: 'GA.NOTIF.400009'
message: "Subscriber Id is missing"
field: null
webhookURIInvalid:
summary: Invalid webhook URI
value:
errors:
- code: 'GA.NOTIF.400012'
message: 'Webhook URI is invalid'
field: 'webhookURI'
eventTypeListEmpty:
summary: Event type list is empty
value:
errors:
- code: 'GA.NOTIF.400013'
message: 'Must not be empty'
field: 'eventTypes'
domainNotWhitelisted:
summary: Domain not whitelisted
value:
errors:
- code: 'GA.NOTIF.400014'
message: 'The webhook domain has not been whitelisted'
field: 'webhookURI'
eventTypeListInvalid:
summary: Event type list is invalid
value:
errors:
- code: 'GA.NOTIF.400015'
message: 'Invalid eventTypes: ["Invalid_event1", "Invalid_event2"]'
field: 'eventTypes'
eventTypeListDuplicate:
summary: Event type list has duplicates
value:
errors:
- code: 'GA.NOTIF.400016'
message: 'Duplicate eventTypes: ["CHECKLIST_CHECKED", "CHECKLIST_UNCHECKED"]'
field: 'eventTypes'
invalidFormat:
summary: Invalid format provided
value:
errors:
- code: 'GA.NOTIF.400017'
message: 'Invalid format provided'
field: 'webhookURI'
invalidJson:
summary: Invalid JSON
value:
errors:
- code: 'GA.NOTIF.400018'
message: 'JSON parse error'
field: null
duplicateRegistration:
summary: Duplicate registration
value:
errors:
- code: 'GA.NOTIF.400019'
message: 'Registration already exists with this combination'
field: 'webhookURI'
mandatoryEventTypesMissing:
summary: Mandatory event types missing
value:
errors:
- code: 'GA.NOTIF.400020'
message: 'Mandatory event types are missing'
field: 'eventTypes'
additionalEventTypeMissing:
summary: An additional event type is required
value:
errors:
- code: 'GA.NOTIF.400021'
message: 'There should be at least one more event present apart from mandatory event(s)'
field: 'eventTypes'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- code: 'GA.NOTIF.401004'
message: 'Unauthorized'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- code: 'GA.NOTIF.403003'
message: 'Forbidden'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- code: 'GA.NOTIF.404007'
message: 'Registration not found for given id: 091f7d22-88a9-4b64-bc51-e1ea8bb8dc42'
field: 'registrationId'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- message: 'Internal Server Error'
delete:
tags:
- NotificationRegistration
summary: Delete registration details
description: Deletes an existing webhook registration. Once deleted, PEXA will stop delivering event notifications to the associated webhook URI. This action cannot be undone; a new registration must be created to resume webhook delivery.
Scopes:
delete:notification_registrations (non-prod)
delete:notification_registrations (prod)
operationId: deleteNotificationRegistration
security:
- oauth2:
- delete:notification_registrations
tags:
- Delete a registration for a subscriber
parameters:
- in: path
name: registrationId
schema:
type: string
required: true
description: UUID of the registration.
responses:
'204':
description: The resource has been deleted.
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- code: 'GA.NOTIF.400000'
message: 'Invalid UUID string: 123'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- code: 'GA.NOTIF.401004'
message: 'Unauthorized'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- code: 'GA.NOTIF.403003'
message: 'Forbidden'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- code: 'GA.NOTIF.404007'
message: 'Registration not found for given id: 091f7d22-88a9-4b64-bc51-e1ea8bb8dc42'
field: 'registrationId'
'500':
description: Internal Server Error.
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- message: 'Internal Server Error'
/v1/notification-registrations/{registrationId}/secret-rotation:
post:
tags:
- NotificationRegistration
summary: Rotate Shared Secret
description: Rotates the shared secret for an existing webhook registration. The new secret is returned in the response and must be stored securely. The previous secret remains valid for 24 hours to allow a zero-downtime transition, after which only the new secret will be accepted for HMAC signature verification.
Scopes:
create:notification_registrations_secret_rotation (non-prod)
create:notification_registrations_secret_rotation (prod)
operationId: createNotificationSecretRotation
security:
- oauth2:
- create:notification_registrations_secret_rotation
tags:
- Rotates shared secret
parameters:
- in: path
name: registrationId
schema:
type: string
required: true
description: UUID of the registration
responses:
'200':
description: SUCCESS
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationSecretRotationDto'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- code: 'GA.NOTIF.400000'
message: 'Invalid UUID string: 123'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- code: 'GA.NOTIF.401004'
message: 'Unauthorized'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- code: 'GA.NOTIF.403003'
message: 'Forbidden'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- code: 'GA.NOTIF.404007'
message: 'Registration not found for given id: 091f7d22-88a9-4b64-bc51-e1ea8bb8dc42'
field: 'registrationId'
'500':
description: Internal Server Error.
content:
application/json:
schema:
$ref: '#/components/schemas/NotificationServiceErrorResponse'
example:
errors:
- message: 'Internal Server Error'
components:
schemas:
CreateNotificationRegistrationRequest:
description: Request body for creating a new webhook notification registration. Provide the webhook URI where PEXA will deliver events, and the list of event types you wish to subscribe to. The response will include a system-generated shared secret used to verify the authenticity of incoming webhook requests via HMAC signature validation.
type: object
required:
- webhookURI
- eventTypes
properties:
webhookURI:
type: string
description: The secure URI of the webhook to be called when an event occurs (supports only https protocol)
example: 'https://push-notifications.pexa.com.au/notifications-webhook'
eventTypes:
type: array
items:
type: string
description: Please refer to the API documentation for the list of allowed events
UpdateNotificationRegistrationRequest:
description: Update registration details
type: object
required:
- webhookURI
- eventTypes
properties:
webhookURI:
type: string
description: The secure URI of the webhook to be called when an event occurs (supports only https protocol)
example: 'https://push-notifications.pexa.com.au/notifications-webhook'
eventTypes:
type: array
items:
type: string
description: Please refer to the API documentation for the list of allowed events
NotificationRegistrationDto:
description: Response body returned after updating a webhook registration. Note that the shared secret is not returned on update. Ensure you have securely stored the sharedSecret from the original registration response, as it is required to verify the HMAC signature on all incoming webhook requests.
type: object
required:
- webhookURI
- registrationId
properties:
notificationType:
type: string
description: The type of notification
example: 'WEBHOOK'
webhookURI:
type: string
description: The secure URI of the webhook to be called when an event occurs (supports only https protocol)
example: 'https://push-notifications.pexa.com.au/notifications-webhook'
registrationId:
type: string
description: The registration ID returned by the POST /register endpoint
example: 'a12sd23sf4f5f6f9'
subscriberId:
type: string
description: The ID of the subscriber
example: '123456789'
integratorId:
type: string
description: The ID of the integrator
example: '344a6eb8-1201-4b80-a279-084713e300ef'
integratorType:
type: string
description: The type of the integrator
example: 'BROKER'
eventTypes:
type: array
description: The list of eventTypes that this registration will send notifications for
items:
type: string
example: [ "CHECKLIST_CHECKED" ]
NotificationRegistrationCreateDto:
description: Response body returned after successfully creating a webhook registration. Store the sharedSecret securely (e.g. in a secrets manager). It is used to verify the HMAC signature on all incoming webhook requests. The sharedSecret expires after 30 days; rotate it before expiry using the secret rotation endpoint to avoid interruption to webhook delivery.
type: object
required:
- webhookURI
- registrationId
properties:
notificationType:
type: string
example: 'WEBHOOK'
webhookURI:
type: string
example: 'https://push-notifications.pexa.com.au/notifications-webhook'
registrationId:
type: string
example: 'a12sd23sf4f5f6f9'
subscriberId:
type: string
example: '123456789'
sharedSecret:
type: string
description: The shared secret used to validate the webhook request
example: '38e5d78c-d642-42d1-8064-0082dc87c4e5'
sharedSecretExpiry:
type: string
description: The expiry time for current shared secret
example: '2025-03-13 04:12:51.574000 +00:00'
integratorId:
type: string
description: The ID of the integrator
example: '344a6eb8-1201-4b80-a279-084713e300ef'
integratorType:
type: string
description: The type of the integrator
example: 'BROKER'
eventTypes:
type: array
items:
type: string
description: The list of eventTypes that this registration will send notifications for
example: [ "CHECKLIST_CHECKED" ]
NotificationSecretRotationDto:
description: Response body returned after rotating the shared secret. The new sharedSecret must be stored securely and used immediately for HMAC signature verification. The previous secret remains valid for 24 hours after rotation to allow a zero-downtime transition, after which only the new secret will be accepted.
type: object
required:
- sharedSecret
- expiry
properties:
expiry:
type: string
description: The time until which the shared secret is valid
example: '2024-02-28T06:12:42Z'
sharedSecret:
type: string
description: The shared secret used to validate the webhook request
example: '38e5d78c-d642-42d1-8064-0082dc87c4e5'
AuthenticationMode:
type: string
description: |
Authentication mode for webhook notifications.
Allowed values: HMAC, HMAC_OAUTH
example: 'HMAC_OAUTH'
ClientAuthMethod:
type: string
description: |
OAuth 2.0 client authentication method.
Allowed values: private_key_jwt, client_secret
example: 'private_key_jwt'
AuthConfig:
type: object
required:
- authUrl
- clientId
- clientAuthMethod
properties:
authUrl:
type: string
format: uri
description: OAuth 2.0 token endpoint URL. The domain must be whitelisted.
example: 'https://auth.example.com/oauth/token'
clientId:
type: string
description: OAuth 2.0 client identifier
example: 'client-12345'
clientAuthMethod:
$ref: '#/components/schemas/ClientAuthMethod'
clientSecret:
type: string
description: OAuth 2.0 client secret (required only when clientAuthMethod is client_secret)
example: 'secret-67890'
audience:
type: string
description: OAuth 2.0 audience claim
example: 'https://api.example.com'
scope:
type: string
description: Space-delimited OAuth 2.0 scopes
example: 'api.scope1 api.scope2'
AuthConfigResponse:
type: object
description: OAuth configuration returned in registration responses.
properties:
authUrl:
type: string
format: uri
example: 'https://auth.example.com/oauth/token'
clientId:
type: string
example: 'client-12345'
clientAuthMethod:
$ref: '#/components/schemas/ClientAuthMethod'
audience:
type: string
example: 'https://api.example.com'
scope:
type: string
example: 'api.scope1 api.scope2'
WebhookNotificationRegistrationRequest:
description: V3 webhook registration request
type: object
required:
- notificationType
- eventTypes
- attributes
properties:
notificationType:
type: string
example: 'WEBHOOK'
eventTypes:
type: array
items:
type: string
description: Please refer to the API documentation for the list of allowed events
attributes:
type: object
required:
- webhookURI
- authenticationMode
properties:
webhookURI:
type: string
format: uri
description: The webhook URL. The domain must be whitelisted.
example: 'https://example.com/webhook'
authenticationMode:
$ref: '#/components/schemas/AuthenticationMode'
authConfig:
$ref: '#/components/schemas/AuthConfig'
WebhookNotificationRegistrationResponseV3:
description: Response body returned after successfully creating a V3 webhook registration. Store the sharedSecret securely. It is used to verify the HMAC signature on all incoming webhook requests. The sharedSecret expires after 30 days; rotate it before expiry using the secret rotation endpoint to avoid interruption to webhook delivery.
type: object
properties:
notificationType:
type: string
example: 'WEBHOOK'
eventTypes:
type: array
items:
type: string
example: [ "WORKSPACE_PARTICIPANT_ADDED", "SECRET_EXPIRY" ]
integratorId:
type: string
example: '344a6eb8-1201-4b80-a279-084713e300ef'
integratorType:
type: string
example: 'BROKER'
registrationId:
type: string
example: '28e5d78c-d642-42d1-8064-0082dc87c4e5'
subscriberId:
type: string
example: '202'
sharedSecret:
type: string
description: System-generated shared secret for HMAC validation
example: '38e5d78c-d642-42d1-8064-0082dc87c4e5'
sharedSecretExpiry:
type: string
example: '2025-03-13 04:12:51.574000 +00:00'
webhookURI:
type: string
format: uri
example: 'https://example.com/webhook'
authenticationMode:
$ref: '#/components/schemas/AuthenticationMode'
authConfig:
$ref: '#/components/schemas/AuthConfigResponse'
WebhookNotificationRegistrationUpdateResponseV3:
description: Response body returned after updating a V3 webhook registration. Note that the shared secret is not returned on update. Ensure you have securely stored the sharedSecret from the original registration response, as it is required to verify the HMAC signature on all incoming webhook requests.
type: object
properties:
notificationType:
type: string
example: 'WEBHOOK'
eventTypes:
type: array
items:
type: string
example: [ "WORKSPACE_PARTICIPANT_ADDED", "SECRET_EXPIRY" ]
integratorId:
type: string
example: '344a6eb8-1201-4b80-a279-084713e300ef'
integratorType:
type: string
example: 'BROKER'
registrationId:
type: string
example: '28e5d78c-d642-42d1-8064-0082dc87c4e5'
subscriberId:
type: string
example: '202'
webhookURI:
type: string
format: uri
example: 'https://example.com/webhook'
authenticationMode:
$ref: '#/components/schemas/AuthenticationMode'
authConfig:
$ref: '#/components/schemas/AuthConfigResponse'
NotificationRegistrationResponseV2:
description: A single registration record returned by the V2 GET endpoint.
type: object
properties:
notificationType:
type: string
example: 'WEBHOOK'
eventTypes:
type: array
items:
type: string
example: [ "WORKSPACE_PARTICIPANT_ADDED", "SECRET_EXPIRY" ]
integratorId:
type: string
example: '344a6eb8-1201-4b80-a279-084713e300ef'
integratorType:
type: string
example: 'BROKER'
registrationId:
type: string
example: '28e5d78c-d642-42d1-8064-0082dc87c4e5'
subscriberId:
type: string
example: '123456789'
webhookURI:
type: string
format: uri
example: 'https://push-notifications.pexa.com.au/notifications-webhook'
sharedSecret:
type: string
example: '38e5d78c-d642-42d1-8064-0082dc87c4e5'
sharedSecretExpiry:
type: string
example: '2025-03-13 04:12:51.574000 +00:00'
authenticationMode:
$ref: '#/components/schemas/AuthenticationMode'
authConfig:
$ref: '#/components/schemas/AuthConfigResponse'
PagedNotificationRegistrations:
type: object
description: A paginated list of notification registrations
required:
- page
- records
properties:
page:
$ref: '#/components/schemas/Page'
records:
type: array
items:
$ref: '#/components/schemas/NotificationRegistrationResponseV2'
Page:
type: object
required:
- page
- totalRecords
- pageRecords
- limit
properties:
page:
type: integer
description: The current page number
totalRecords:
type: integer
description: The total number of records available
pageRecords:
type: integer
description: The number of records on the current page
limit:
type: integer
description: The maximum number of records per page
Error:
description: Detailed error related to the API
type: object
properties:
code:
type: string
example: 'GA.NOTIF.403003'
message:
type: string
example: 'Forbidden'
field:
type: string
nullable: true
example: 'webhookURI'
NotificationServiceErrorResponse:
type: object
description: Response object of the service
properties:
errors:
default: [ ]
type: array
items:
$ref: '#/components/schemas/Error'
SubscriberNotificationPayload:
type: object
properties:
timestamp:
type: string
format: date-time
description: The date and time the event occurred
example: "2024-06-04T03:18:58Z"
type:
type: string
description: Specifies the category and the event type and follows the format of .
example: "Workspace.CHECKLIST_CHECKED"
data:
type: object
description: An object containing the details of the events that triggered the notification
properties:
workspaceId:
type: string
description: The PEXA Workspace Identifier
example: "PEXA000000000"
subscriberId:
type: string
description: The ID of the subscriber
example: "100"
subscriberReferences:
type: array
description: An array of subscriber references that are relevant to the event.
items:
type: object
description: Subscriber reference or identifier provided by third parties like financial institutions. Used to link a PEXA Workspace to an integrators system
properties:
subscriberReference:
type: string
description: The subscriber reference
example: "100"
workspaceRole:
type: string
description: The role of the subscriber in the workspace
example: "Incoming Mortgagee"
additionalReferences:
type: array
description: An array of additional references that are relevant to the event. For subscriber notifications, this will contain a single reference
items:
type: object
description: Additional reference or identifier provided by third parties like financial institutions. Used to link a PEXA Workspace to an integrators system
properties:
identifier:
type: string
description: The identifier
example: "51"
type:
type: string
description: The type of reference.
example: "CHECKLIST_ITEM_ID"
NonSubscriberNotificationPayload:
type: object
properties:
timestamp:
type: string
format: date-time
description: The date and time the event occurred
example: "2024-06-04T03:18:58Z"
type:
type: string
description: Specifies the category and the event type and follows the format of .
example: "Workspace.CHECKLIST_CHECKED"
data:
type: object
description: An object containing the details of the events that triggered the notification
properties:
workspaceId:
type: string
description: The PEXA Workspace Identifier
example: "PEXA000000000"
additionalReferences:
type: array
description: An array of additional references that are relevant to the event. For non-subscriber notifications, this will contain a single reference
items:
type: object
description: Additional references.
properties:
identifier:
type: string
description: The identifier
example: "51"
type:
type: string
description: The type of reference.
example: "CHECKLIST_ITEM_ID"
links:
type: array
description: A list of links to get further information about the workspace that triggered the notification
items:
type: object
description: A link to get further information about the workspace that triggered the notification. Each link follows the HATEOAS standard
properties:
href:
type: string
description: The URL to get the workspace details
example: "https://example.com/workspace123"
rel:
type: string
description: Provides context to the type of information that can be received from the href
example: "self"
type:
type: string
description: The type of HTTP request to be used for the href
example: "GET"
securitySchemes:
oauth2:
type: oauth2
flows:
clientCredentials:
tokenUrl: "https://auth.pexa.com.au/oauth/token"
scopes:
view:notification_registrations: View registrations
create:notification_registrations: Create registrations
edit:notification_registrations: Edit registrations
delete:notification_registrations: Delete registrations
create:notification_registrations_secret_rotation: Rotate shared secret
webhooks:
SubscriberNotification:
post:
description: Subscriber notification payload
operationId: SubscriberNotification
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/SubscriberNotificationPayload'
responses:
'200':
description: Callback successfully processed
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: "200"
message:
type:
- string
- "null"
example: "Callback successfully processed"
data:
type:
- string
- "null"
example: "Some data"
'400':
description: Bad Request
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: "400"
message:
type:
- string
- "null"
example: "Bad Request"
data:
type:
- string
- "null"
example: "Some data"
'404':
description: Not Found
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: "404"
message:
type:
- string
- "null"
example: "Not Found"
data:
type:
- string
- "null"
example: "Some data"
'408':
description: Request Timeout
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: "408"
message:
type:
- string
- "null"
example: "Request Timeout"
data:
type:
- string
- "null"
example: "Some data"
'418':
description: I'm a teapot
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: "418"
message:
type:
- string
- "null"
example: "I'm a teapot"
data:
type:
- string
- "null"
example: "Some data"
'429':
description: Too Many Requests
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: "429"
message:
type:
- string
- "null"
example: "Too Many Requests"
data:
type:
- string
- "null"
example: "Some data"
'500':
description: Internal Server Error
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: "500"
message:
type:
- string
- "null"
example: "Internal Server Error"
data:
type:
- string
- "null"
example: "Some data"
'502':
description: Bad Gateway
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: "502"
message:
type:
- string
- "null"
example: "Bad Gateway"
data:
type:
- string
- "null"
example: "Some data"
'503':
description: Service Unavailable
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: "503"
message:
type:
- string
- "null"
example: "Service Unavailable"
data:
type:
- string
- "null"
example: "Some data"
'504':
description: Gateway Timeout
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: "504"
message:
type:
- string
- "null"
example: "Gateway Timeout"
data:
type:
- string
- "null"
example: "Some data"
NonSubscriberNotification:
post:
description: Non-subscriber notification payload
operationId: nonSubscriberNotification
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/NonSubscriberNotificationPayload'
responses:
'200':
description: Callback successfully processed
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: "200"
message:
type:
- string
- "null"
example: "Callback successfully processed"
data:
type:
- string
- "null"
example: "Some data"
'400':
description: Bad Request
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: "400"
message:
type:
- string
- "null"
example: "Bad Request"
data:
type:
- string
- "null"
example: "Some data"
'404':
description: Not Found
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: "404"
message:
type:
- string
- "null"
example: "Not Found"
data:
type:
- string
- "null"
example: "Some data"
'408':
description: Request Timeout
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: "408"
message:
type:
- string
- "null"
example: "Request Timeout"
data:
type:
- string
- "null"
example: "Some data"
'418':
description: I'm a teapot
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: "418"
message:
type:
- string
- "null"
example: "I'm a teapot"
data:
type:
- string
- "null"
example: "Some data"
'429':
description: Too Many Requests
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: "429"
message:
type:
- string
- "null"
example: "Too Many Requests"
data:
type:
- string
- "null"
example: "Some data"
'500':
description: Internal Server Error
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: "500"
message:
type:
- string
- "null"
example: "Internal Server Error"
data:
type:
- string
- "null"
example: "Some data"
'502':
description: Bad Gateway
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: "502"
message:
type:
- string
- "null"
example: "Bad Gateway"
data:
type:
- string
- "null"
example: "Some data"
'503':
description: Service Unavailable
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: "503"
message:
type:
- string
- "null"
example: "Service Unavailable"
data:
type:
- string
- "null"
example: "Some data"
'504':
description: Gateway Timeout
content:
application/json:
schema:
type: object
properties:
status:
type: string
example: "504"
message:
type:
- string
- "null"
example: "Gateway Timeout"
data:
type:
- string
- "null"
example: "Some data"