986 lines
28 KiB
YAML
986 lines
28 KiB
YAML
|
|
openapi: 3.0.3
|
||
|
|
info:
|
||
|
|
title: Messaging API
|
||
|
|
version: 1.0.0
|
||
|
|
description: |
|
||
|
|
REST API for messaging services including SMS, email, and portal notifications.
|
||
|
|
|
||
|
|
Supports multiple providers:
|
||
|
|
- SMS: Twilio
|
||
|
|
- Email: SendGrid, AWS SES, SMTP
|
||
|
|
- Portal: Internal notification system
|
||
|
|
|
||
|
|
Features:
|
||
|
|
- Template-based messaging with variable substitution
|
||
|
|
- Provider abstraction for multi-provider support
|
||
|
|
- Delivery status tracking
|
||
|
|
- Webhook support for delivery events
|
||
|
|
|
||
|
|
contact:
|
||
|
|
name: DBIS API Support
|
||
|
|
email: api-support@dbis.org
|
||
|
|
license:
|
||
|
|
name: MIT
|
||
|
|
url: https://opensource.org/licenses/MIT
|
||
|
|
|
||
|
|
servers:
|
||
|
|
- url: https://api.d-bis.org/api/v1/messaging
|
||
|
|
description: Production server
|
||
|
|
- url: https://sandbox.d-bis.org/api/v1/messaging
|
||
|
|
description: Sandbox server
|
||
|
|
- url: http://localhost:3000/api/v1/messaging
|
||
|
|
description: Development server
|
||
|
|
|
||
|
|
security:
|
||
|
|
- BearerAuth: []
|
||
|
|
- OAuth2MTLS: []
|
||
|
|
|
||
|
|
tags:
|
||
|
|
- name: SMS
|
||
|
|
description: SMS messaging operations
|
||
|
|
- name: Email
|
||
|
|
description: Email messaging operations
|
||
|
|
- name: Portal
|
||
|
|
description: Portal notification operations
|
||
|
|
- name: Templates
|
||
|
|
description: Message template management
|
||
|
|
- name: Providers
|
||
|
|
description: Provider configuration and management
|
||
|
|
- name: Webhooks
|
||
|
|
description: Webhook management for delivery status
|
||
|
|
- name: Health
|
||
|
|
description: Health check endpoints
|
||
|
|
|
||
|
|
paths:
|
||
|
|
/health:
|
||
|
|
get:
|
||
|
|
tags: [Health]
|
||
|
|
summary: Health check
|
||
|
|
description: Returns the health status of the Messaging API and provider connections
|
||
|
|
operationId: getHealth
|
||
|
|
security: []
|
||
|
|
responses:
|
||
|
|
'200':
|
||
|
|
description: Service is healthy
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
status:
|
||
|
|
type: string
|
||
|
|
example: "healthy"
|
||
|
|
providers:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
sms:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
twilio:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
status:
|
||
|
|
type: string
|
||
|
|
example: "connected"
|
||
|
|
accountSid:
|
||
|
|
type: string
|
||
|
|
email:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
sendgrid:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
status:
|
||
|
|
type: string
|
||
|
|
ses:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
status:
|
||
|
|
type: string
|
||
|
|
timestamp:
|
||
|
|
type: string
|
||
|
|
format: date-time
|
||
|
|
|
||
|
|
/sms/send:
|
||
|
|
post:
|
||
|
|
tags: [SMS]
|
||
|
|
summary: Send SMS message
|
||
|
|
description: Sends an SMS message using the configured SMS provider (default: Twilio)
|
||
|
|
operationId: sendSMS
|
||
|
|
requestBody:
|
||
|
|
required: true
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/SendSMSRequest'
|
||
|
|
examples:
|
||
|
|
simple:
|
||
|
|
value:
|
||
|
|
recipient: "+1234567890"
|
||
|
|
message: "Your verification code is 123456"
|
||
|
|
provider: "twilio"
|
||
|
|
template:
|
||
|
|
value:
|
||
|
|
recipient: "+1234567890"
|
||
|
|
template: "verification_code"
|
||
|
|
variables:
|
||
|
|
code: "123456"
|
||
|
|
expiresIn: "5 minutes"
|
||
|
|
provider: "twilio"
|
||
|
|
responses:
|
||
|
|
'200':
|
||
|
|
description: SMS sent successfully
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/MessageResponse'
|
||
|
|
example:
|
||
|
|
success: true
|
||
|
|
data:
|
||
|
|
messageId: "SM1234567890abcdef"
|
||
|
|
recipient: "+1234567890"
|
||
|
|
status: "queued"
|
||
|
|
provider: "twilio"
|
||
|
|
sentAt: "2024-01-01T00:00:00Z"
|
||
|
|
timestamp: "2024-01-01T00:00:00Z"
|
||
|
|
'400':
|
||
|
|
$ref: '#/components/responses/BadRequest'
|
||
|
|
'401':
|
||
|
|
$ref: '#/components/responses/Unauthorized'
|
||
|
|
'403':
|
||
|
|
$ref: '#/components/responses/Forbidden'
|
||
|
|
'500':
|
||
|
|
$ref: '#/components/responses/InternalServerError'
|
||
|
|
|
||
|
|
/sms/{messageId}/status:
|
||
|
|
get:
|
||
|
|
tags: [SMS]
|
||
|
|
summary: Get SMS message status
|
||
|
|
description: Returns the delivery status of an SMS message
|
||
|
|
operationId: getSMSStatus
|
||
|
|
parameters:
|
||
|
|
- $ref: '#/components/parameters/MessageId'
|
||
|
|
responses:
|
||
|
|
'200':
|
||
|
|
description: Message status
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/MessageStatusResponse'
|
||
|
|
'400':
|
||
|
|
$ref: '#/components/responses/BadRequest'
|
||
|
|
'401':
|
||
|
|
$ref: '#/components/responses/Unauthorized'
|
||
|
|
'404':
|
||
|
|
$ref: '#/components/responses/NotFound'
|
||
|
|
'500':
|
||
|
|
$ref: '#/components/responses/InternalServerError'
|
||
|
|
|
||
|
|
/email/send:
|
||
|
|
post:
|
||
|
|
tags: [Email]
|
||
|
|
summary: Send email message
|
||
|
|
description: Sends an email message using the configured email provider
|
||
|
|
operationId: sendEmail
|
||
|
|
requestBody:
|
||
|
|
required: true
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/SendEmailRequest'
|
||
|
|
examples:
|
||
|
|
simple:
|
||
|
|
value:
|
||
|
|
recipient: "user@example.com"
|
||
|
|
subject: "Welcome to DBIS"
|
||
|
|
body: "Welcome to DBIS! Your account has been created."
|
||
|
|
provider: "sendgrid"
|
||
|
|
template:
|
||
|
|
value:
|
||
|
|
recipient: "user@example.com"
|
||
|
|
template: "welcome_email"
|
||
|
|
variables:
|
||
|
|
name: "John Doe"
|
||
|
|
accountId: "ACC-123456"
|
||
|
|
provider: "sendgrid"
|
||
|
|
responses:
|
||
|
|
'200':
|
||
|
|
description: Email sent successfully
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/MessageResponse'
|
||
|
|
'400':
|
||
|
|
$ref: '#/components/responses/BadRequest'
|
||
|
|
'401':
|
||
|
|
$ref: '#/components/responses/Unauthorized'
|
||
|
|
'403':
|
||
|
|
$ref: '#/components/responses/Forbidden'
|
||
|
|
'500':
|
||
|
|
$ref: '#/components/responses/InternalServerError'
|
||
|
|
|
||
|
|
/email/{messageId}/status:
|
||
|
|
get:
|
||
|
|
tags: [Email]
|
||
|
|
summary: Get email message status
|
||
|
|
description: Returns the delivery status of an email message
|
||
|
|
operationId: getEmailStatus
|
||
|
|
parameters:
|
||
|
|
- $ref: '#/components/parameters/MessageId'
|
||
|
|
responses:
|
||
|
|
'200':
|
||
|
|
description: Message status
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/MessageStatusResponse'
|
||
|
|
'400':
|
||
|
|
$ref: '#/components/responses/BadRequest'
|
||
|
|
'401':
|
||
|
|
$ref: '#/components/responses/Unauthorized'
|
||
|
|
'404':
|
||
|
|
$ref: '#/components/responses/NotFound'
|
||
|
|
'500':
|
||
|
|
$ref: '#/components/responses/InternalServerError'
|
||
|
|
|
||
|
|
/portal/notifications:
|
||
|
|
post:
|
||
|
|
tags: [Portal]
|
||
|
|
summary: Create portal notification
|
||
|
|
description: Creates a portal notification for a user
|
||
|
|
operationId: createPortalNotification
|
||
|
|
requestBody:
|
||
|
|
required: true
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/CreatePortalNotificationRequest'
|
||
|
|
example:
|
||
|
|
recipientId: "user-123"
|
||
|
|
template: "account_approved"
|
||
|
|
variables:
|
||
|
|
accountType: "Tier 1"
|
||
|
|
approvedAt: "2024-01-01T00:00:00Z"
|
||
|
|
priority: "normal"
|
||
|
|
responses:
|
||
|
|
'201':
|
||
|
|
description: Portal notification created
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/MessageResponse'
|
||
|
|
'400':
|
||
|
|
$ref: '#/components/responses/BadRequest'
|
||
|
|
'401':
|
||
|
|
$ref: '#/components/responses/Unauthorized'
|
||
|
|
'500':
|
||
|
|
$ref: '#/components/responses/InternalServerError'
|
||
|
|
|
||
|
|
/templates:
|
||
|
|
get:
|
||
|
|
tags: [Templates]
|
||
|
|
summary: List message templates
|
||
|
|
description: Returns a list of available message templates
|
||
|
|
operationId: listTemplates
|
||
|
|
parameters:
|
||
|
|
- name: type
|
||
|
|
in: query
|
||
|
|
description: Filter by template type
|
||
|
|
required: false
|
||
|
|
schema:
|
||
|
|
type: string
|
||
|
|
enum: [sms, email, portal]
|
||
|
|
- name: page
|
||
|
|
in: query
|
||
|
|
schema:
|
||
|
|
type: integer
|
||
|
|
minimum: 1
|
||
|
|
default: 1
|
||
|
|
- name: pageSize
|
||
|
|
in: query
|
||
|
|
schema:
|
||
|
|
type: integer
|
||
|
|
minimum: 1
|
||
|
|
maximum: 100
|
||
|
|
default: 20
|
||
|
|
responses:
|
||
|
|
'200':
|
||
|
|
description: List of templates
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/TemplateListResponse'
|
||
|
|
'400':
|
||
|
|
$ref: '#/components/responses/BadRequest'
|
||
|
|
'401':
|
||
|
|
$ref: '#/components/responses/Unauthorized'
|
||
|
|
'500':
|
||
|
|
$ref: '#/components/responses/InternalServerError'
|
||
|
|
|
||
|
|
post:
|
||
|
|
tags: [Templates]
|
||
|
|
summary: Create message template
|
||
|
|
description: Creates a new message template
|
||
|
|
operationId: createTemplate
|
||
|
|
requestBody:
|
||
|
|
required: true
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/CreateTemplateRequest'
|
||
|
|
example:
|
||
|
|
name: "verification_code"
|
||
|
|
type: "sms"
|
||
|
|
subject: "Verification Code"
|
||
|
|
body: "Your verification code is {{code}}. It expires in {{expiresIn}}."
|
||
|
|
responses:
|
||
|
|
'201':
|
||
|
|
description: Template created
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/TemplateResponse'
|
||
|
|
'400':
|
||
|
|
$ref: '#/components/responses/BadRequest'
|
||
|
|
'401':
|
||
|
|
$ref: '#/components/responses/Unauthorized'
|
||
|
|
'403':
|
||
|
|
$ref: '#/components/responses/Forbidden'
|
||
|
|
'409':
|
||
|
|
$ref: '#/components/responses/Conflict'
|
||
|
|
'500':
|
||
|
|
$ref: '#/components/responses/InternalServerError'
|
||
|
|
|
||
|
|
/templates/{templateId}:
|
||
|
|
get:
|
||
|
|
tags: [Templates]
|
||
|
|
summary: Get message template
|
||
|
|
description: Returns details of a message template
|
||
|
|
operationId: getTemplate
|
||
|
|
parameters:
|
||
|
|
- $ref: '#/components/parameters/TemplateId'
|
||
|
|
responses:
|
||
|
|
'200':
|
||
|
|
description: Template details
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/TemplateResponse'
|
||
|
|
'401':
|
||
|
|
$ref: '#/components/responses/Unauthorized'
|
||
|
|
'404':
|
||
|
|
$ref: '#/components/responses/NotFound'
|
||
|
|
'500':
|
||
|
|
$ref: '#/components/responses/InternalServerError'
|
||
|
|
|
||
|
|
put:
|
||
|
|
tags: [Templates]
|
||
|
|
summary: Update message template
|
||
|
|
description: Updates an existing message template
|
||
|
|
operationId: updateTemplate
|
||
|
|
parameters:
|
||
|
|
- $ref: '#/components/parameters/TemplateId'
|
||
|
|
requestBody:
|
||
|
|
required: true
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/UpdateTemplateRequest'
|
||
|
|
responses:
|
||
|
|
'200':
|
||
|
|
description: Template updated
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/TemplateResponse'
|
||
|
|
'400':
|
||
|
|
$ref: '#/components/responses/BadRequest'
|
||
|
|
'401':
|
||
|
|
$ref: '#/components/responses/Unauthorized'
|
||
|
|
'403':
|
||
|
|
$ref: '#/components/responses/Forbidden'
|
||
|
|
'404':
|
||
|
|
$ref: '#/components/responses/NotFound'
|
||
|
|
'500':
|
||
|
|
$ref: '#/components/responses/InternalServerError'
|
||
|
|
|
||
|
|
delete:
|
||
|
|
tags: [Templates]
|
||
|
|
summary: Delete message template
|
||
|
|
description: Deletes a message template
|
||
|
|
operationId: deleteTemplate
|
||
|
|
parameters:
|
||
|
|
- $ref: '#/components/parameters/TemplateId'
|
||
|
|
responses:
|
||
|
|
'204':
|
||
|
|
description: Template deleted
|
||
|
|
'401':
|
||
|
|
$ref: '#/components/responses/Unauthorized'
|
||
|
|
'403':
|
||
|
|
$ref: '#/components/responses/Forbidden'
|
||
|
|
'404':
|
||
|
|
$ref: '#/components/responses/NotFound'
|
||
|
|
'500':
|
||
|
|
$ref: '#/components/responses/InternalServerError'
|
||
|
|
|
||
|
|
/providers:
|
||
|
|
get:
|
||
|
|
tags: [Providers]
|
||
|
|
summary: List available providers
|
||
|
|
description: Returns a list of available messaging providers and their status
|
||
|
|
operationId: listProviders
|
||
|
|
responses:
|
||
|
|
'200':
|
||
|
|
description: List of providers
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/ProviderListResponse'
|
||
|
|
'401':
|
||
|
|
$ref: '#/components/responses/Unauthorized'
|
||
|
|
'500':
|
||
|
|
$ref: '#/components/responses/InternalServerError'
|
||
|
|
|
||
|
|
/webhooks:
|
||
|
|
post:
|
||
|
|
tags: [Webhooks]
|
||
|
|
summary: Register webhook
|
||
|
|
description: Registers a webhook URL for delivery status events
|
||
|
|
operationId: registerWebhook
|
||
|
|
requestBody:
|
||
|
|
required: true
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/RegisterWebhookRequest'
|
||
|
|
example:
|
||
|
|
url: "https://api.example.com/webhooks/messaging"
|
||
|
|
events:
|
||
|
|
- "sms.delivered"
|
||
|
|
- "sms.failed"
|
||
|
|
- "email.delivered"
|
||
|
|
- "email.bounced"
|
||
|
|
secret: "webhook_secret_token"
|
||
|
|
responses:
|
||
|
|
'201':
|
||
|
|
description: Webhook registered
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/WebhookResponse'
|
||
|
|
'400':
|
||
|
|
$ref: '#/components/responses/BadRequest'
|
||
|
|
'401':
|
||
|
|
$ref: '#/components/responses/Unauthorized'
|
||
|
|
'403':
|
||
|
|
$ref: '#/components/responses/Forbidden'
|
||
|
|
'500':
|
||
|
|
$ref: '#/components/responses/InternalServerError'
|
||
|
|
|
||
|
|
get:
|
||
|
|
tags: [Webhooks]
|
||
|
|
summary: List registered webhooks
|
||
|
|
description: Returns a list of registered webhooks
|
||
|
|
operationId: listWebhooks
|
||
|
|
responses:
|
||
|
|
'200':
|
||
|
|
description: List of webhooks
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/WebhookListResponse'
|
||
|
|
'401':
|
||
|
|
$ref: '#/components/responses/Unauthorized'
|
||
|
|
'500':
|
||
|
|
$ref: '#/components/responses/InternalServerError'
|
||
|
|
|
||
|
|
/webhooks/{webhookId}:
|
||
|
|
delete:
|
||
|
|
tags: [Webhooks]
|
||
|
|
summary: Delete webhook
|
||
|
|
description: Deletes a registered webhook
|
||
|
|
operationId: deleteWebhook
|
||
|
|
parameters:
|
||
|
|
- name: webhookId
|
||
|
|
in: path
|
||
|
|
required: true
|
||
|
|
schema:
|
||
|
|
type: string
|
||
|
|
responses:
|
||
|
|
'204':
|
||
|
|
description: Webhook deleted
|
||
|
|
'401':
|
||
|
|
$ref: '#/components/responses/Unauthorized'
|
||
|
|
'403':
|
||
|
|
$ref: '#/components/responses/Forbidden'
|
||
|
|
'404':
|
||
|
|
$ref: '#/components/responses/NotFound'
|
||
|
|
'500':
|
||
|
|
$ref: '#/components/responses/InternalServerError'
|
||
|
|
|
||
|
|
components:
|
||
|
|
securitySchemes:
|
||
|
|
BearerAuth:
|
||
|
|
type: http
|
||
|
|
scheme: bearer
|
||
|
|
bearerFormat: JWT
|
||
|
|
description: JWT token for authentication
|
||
|
|
OAuth2MTLS:
|
||
|
|
type: oauth2
|
||
|
|
flows:
|
||
|
|
clientCredentials:
|
||
|
|
tokenUrl: https://auth.d-bis.org/oauth2/token
|
||
|
|
scopes:
|
||
|
|
messaging:read: Read access to messaging
|
||
|
|
messaging:write: Write access to messaging
|
||
|
|
|
||
|
|
parameters:
|
||
|
|
MessageId:
|
||
|
|
name: messageId
|
||
|
|
in: path
|
||
|
|
required: true
|
||
|
|
description: Message ID
|
||
|
|
schema:
|
||
|
|
type: string
|
||
|
|
example: "SM1234567890abcdef"
|
||
|
|
|
||
|
|
TemplateId:
|
||
|
|
name: templateId
|
||
|
|
in: path
|
||
|
|
required: true
|
||
|
|
description: Template ID or name
|
||
|
|
schema:
|
||
|
|
type: string
|
||
|
|
example: "verification_code"
|
||
|
|
|
||
|
|
schemas:
|
||
|
|
SendSMSRequest:
|
||
|
|
type: object
|
||
|
|
required:
|
||
|
|
- recipient
|
||
|
|
properties:
|
||
|
|
recipient:
|
||
|
|
type: string
|
||
|
|
description: Phone number in E.164 format
|
||
|
|
pattern: '^\+[1-9]\d{1,14}$'
|
||
|
|
example: "+1234567890"
|
||
|
|
message:
|
||
|
|
type: string
|
||
|
|
description: Message text (required if template not provided)
|
||
|
|
maxLength: 1600
|
||
|
|
example: "Your verification code is 123456"
|
||
|
|
template:
|
||
|
|
type: string
|
||
|
|
description: Template name (required if message not provided)
|
||
|
|
example: "verification_code"
|
||
|
|
variables:
|
||
|
|
type: object
|
||
|
|
description: Template variables
|
||
|
|
additionalProperties:
|
||
|
|
type: string
|
||
|
|
example:
|
||
|
|
code: "123456"
|
||
|
|
expiresIn: "5 minutes"
|
||
|
|
provider:
|
||
|
|
type: string
|
||
|
|
description: SMS provider to use
|
||
|
|
enum: [twilio, default]
|
||
|
|
default: "default"
|
||
|
|
example: "twilio"
|
||
|
|
priority:
|
||
|
|
type: string
|
||
|
|
enum: [low, normal, high, urgent]
|
||
|
|
default: "normal"
|
||
|
|
|
||
|
|
SendEmailRequest:
|
||
|
|
type: object
|
||
|
|
required:
|
||
|
|
- recipient
|
||
|
|
properties:
|
||
|
|
recipient:
|
||
|
|
type: string
|
||
|
|
format: email
|
||
|
|
example: "user@example.com"
|
||
|
|
subject:
|
||
|
|
type: string
|
||
|
|
description: Email subject (required if template not provided)
|
||
|
|
example: "Welcome to DBIS"
|
||
|
|
body:
|
||
|
|
type: string
|
||
|
|
description: Email body HTML or text (required if template not provided)
|
||
|
|
example: "<html><body><p>Welcome to DBIS!</p></body></html>"
|
||
|
|
template:
|
||
|
|
type: string
|
||
|
|
description: Template name (required if subject/body not provided)
|
||
|
|
example: "welcome_email"
|
||
|
|
variables:
|
||
|
|
type: object
|
||
|
|
description: Template variables
|
||
|
|
additionalProperties:
|
||
|
|
type: string
|
||
|
|
example:
|
||
|
|
name: "John Doe"
|
||
|
|
accountId: "ACC-123456"
|
||
|
|
provider:
|
||
|
|
type: string
|
||
|
|
description: Email provider to use
|
||
|
|
enum: [sendgrid, ses, smtp, default]
|
||
|
|
default: "default"
|
||
|
|
example: "sendgrid"
|
||
|
|
priority:
|
||
|
|
type: string
|
||
|
|
enum: [low, normal, high, urgent]
|
||
|
|
default: "normal"
|
||
|
|
from:
|
||
|
|
type: string
|
||
|
|
description: Sender email address (optional, uses default if not provided)
|
||
|
|
format: email
|
||
|
|
replyTo:
|
||
|
|
type: string
|
||
|
|
description: Reply-to email address
|
||
|
|
format: email
|
||
|
|
|
||
|
|
CreatePortalNotificationRequest:
|
||
|
|
type: object
|
||
|
|
required:
|
||
|
|
- recipientId
|
||
|
|
- template
|
||
|
|
properties:
|
||
|
|
recipientId:
|
||
|
|
type: string
|
||
|
|
description: User ID or account ID
|
||
|
|
example: "user-123"
|
||
|
|
template:
|
||
|
|
type: string
|
||
|
|
description: Template name
|
||
|
|
example: "account_approved"
|
||
|
|
variables:
|
||
|
|
type: object
|
||
|
|
description: Template variables
|
||
|
|
additionalProperties:
|
||
|
|
type: string
|
||
|
|
example:
|
||
|
|
accountType: "Tier 1"
|
||
|
|
priority:
|
||
|
|
type: string
|
||
|
|
enum: [low, normal, high, urgent]
|
||
|
|
default: "normal"
|
||
|
|
|
||
|
|
CreateTemplateRequest:
|
||
|
|
type: object
|
||
|
|
required:
|
||
|
|
- name
|
||
|
|
- type
|
||
|
|
- body
|
||
|
|
properties:
|
||
|
|
name:
|
||
|
|
type: string
|
||
|
|
description: Template name (unique identifier)
|
||
|
|
example: "verification_code"
|
||
|
|
type:
|
||
|
|
type: string
|
||
|
|
enum: [sms, email, portal]
|
||
|
|
example: "sms"
|
||
|
|
subject:
|
||
|
|
type: string
|
||
|
|
description: Email subject (required for email type)
|
||
|
|
example: "Verification Code"
|
||
|
|
body:
|
||
|
|
type: string
|
||
|
|
description: Message body with {{variable}} placeholders
|
||
|
|
example: "Your verification code is {{code}}. It expires in {{expiresIn}}."
|
||
|
|
description:
|
||
|
|
type: string
|
||
|
|
description: Template description
|
||
|
|
example: "SMS template for verification codes"
|
||
|
|
|
||
|
|
UpdateTemplateRequest:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
subject:
|
||
|
|
type: string
|
||
|
|
body:
|
||
|
|
type: string
|
||
|
|
description:
|
||
|
|
type: string
|
||
|
|
|
||
|
|
RegisterWebhookRequest:
|
||
|
|
type: object
|
||
|
|
required:
|
||
|
|
- url
|
||
|
|
- events
|
||
|
|
properties:
|
||
|
|
url:
|
||
|
|
type: string
|
||
|
|
format: uri
|
||
|
|
description: Webhook URL
|
||
|
|
example: "https://api.example.com/webhooks/messaging"
|
||
|
|
events:
|
||
|
|
type: array
|
||
|
|
description: Events to subscribe to
|
||
|
|
items:
|
||
|
|
type: string
|
||
|
|
enum: [sms.queued, sms.sent, sms.delivered, sms.failed, email.queued, email.sent, email.delivered, email.bounced, email.failed, portal.created]
|
||
|
|
example: ["sms.delivered", "sms.failed"]
|
||
|
|
secret:
|
||
|
|
type: string
|
||
|
|
description: Webhook secret for signature verification
|
||
|
|
example: "webhook_secret_token"
|
||
|
|
active:
|
||
|
|
type: boolean
|
||
|
|
default: true
|
||
|
|
|
||
|
|
MessageResponse:
|
||
|
|
allOf:
|
||
|
|
- $ref: '#/components/schemas/BaseResponse'
|
||
|
|
- type: object
|
||
|
|
properties:
|
||
|
|
data:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
messageId:
|
||
|
|
type: string
|
||
|
|
example: "SM1234567890abcdef"
|
||
|
|
recipient:
|
||
|
|
type: string
|
||
|
|
recipientType:
|
||
|
|
type: string
|
||
|
|
enum: [email, sms, portal]
|
||
|
|
status:
|
||
|
|
type: string
|
||
|
|
enum: [queued, sent, delivered, failed, bounced]
|
||
|
|
provider:
|
||
|
|
type: string
|
||
|
|
sentAt:
|
||
|
|
type: string
|
||
|
|
format: date-time
|
||
|
|
deliveredAt:
|
||
|
|
type: string
|
||
|
|
format: date-time
|
||
|
|
|
||
|
|
MessageStatusResponse:
|
||
|
|
allOf:
|
||
|
|
- $ref: '#/components/schemas/BaseResponse'
|
||
|
|
- type: object
|
||
|
|
properties:
|
||
|
|
data:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
messageId:
|
||
|
|
type: string
|
||
|
|
recipient:
|
||
|
|
type: string
|
||
|
|
status:
|
||
|
|
type: string
|
||
|
|
enum: [queued, sent, delivered, failed, bounced]
|
||
|
|
provider:
|
||
|
|
type: string
|
||
|
|
sentAt:
|
||
|
|
type: string
|
||
|
|
format: date-time
|
||
|
|
deliveredAt:
|
||
|
|
type: string
|
||
|
|
format: date-time
|
||
|
|
error:
|
||
|
|
type: string
|
||
|
|
description: Error message if status is failed
|
||
|
|
|
||
|
|
Template:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
templateId:
|
||
|
|
type: string
|
||
|
|
name:
|
||
|
|
type: string
|
||
|
|
type:
|
||
|
|
type: string
|
||
|
|
enum: [sms, email, portal]
|
||
|
|
subject:
|
||
|
|
type: string
|
||
|
|
body:
|
||
|
|
type: string
|
||
|
|
description:
|
||
|
|
type: string
|
||
|
|
createdAt:
|
||
|
|
type: string
|
||
|
|
format: date-time
|
||
|
|
updatedAt:
|
||
|
|
type: string
|
||
|
|
format: date-time
|
||
|
|
|
||
|
|
TemplateResponse:
|
||
|
|
allOf:
|
||
|
|
- $ref: '#/components/schemas/BaseResponse'
|
||
|
|
- type: object
|
||
|
|
properties:
|
||
|
|
data:
|
||
|
|
$ref: '#/components/schemas/Template'
|
||
|
|
|
||
|
|
TemplateListResponse:
|
||
|
|
allOf:
|
||
|
|
- $ref: '#/components/schemas/BaseResponse'
|
||
|
|
- type: object
|
||
|
|
properties:
|
||
|
|
data:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
templates:
|
||
|
|
type: array
|
||
|
|
items:
|
||
|
|
$ref: '#/components/schemas/Template'
|
||
|
|
pagination:
|
||
|
|
$ref: '#/components/schemas/Pagination'
|
||
|
|
|
||
|
|
Provider:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
id:
|
||
|
|
type: string
|
||
|
|
name:
|
||
|
|
type: string
|
||
|
|
type:
|
||
|
|
type: string
|
||
|
|
enum: [sms, email]
|
||
|
|
status:
|
||
|
|
type: string
|
||
|
|
enum: [connected, disconnected, error]
|
||
|
|
configured:
|
||
|
|
type: boolean
|
||
|
|
|
||
|
|
ProviderListResponse:
|
||
|
|
allOf:
|
||
|
|
- $ref: '#/components/schemas/BaseResponse'
|
||
|
|
- type: object
|
||
|
|
properties:
|
||
|
|
data:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
providers:
|
||
|
|
type: array
|
||
|
|
items:
|
||
|
|
$ref: '#/components/schemas/Provider'
|
||
|
|
|
||
|
|
Webhook:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
webhookId:
|
||
|
|
type: string
|
||
|
|
url:
|
||
|
|
type: string
|
||
|
|
events:
|
||
|
|
type: array
|
||
|
|
items:
|
||
|
|
type: string
|
||
|
|
active:
|
||
|
|
type: boolean
|
||
|
|
createdAt:
|
||
|
|
type: string
|
||
|
|
format: date-time
|
||
|
|
|
||
|
|
WebhookResponse:
|
||
|
|
allOf:
|
||
|
|
- $ref: '#/components/schemas/BaseResponse'
|
||
|
|
- type: object
|
||
|
|
properties:
|
||
|
|
data:
|
||
|
|
$ref: '#/components/schemas/Webhook'
|
||
|
|
|
||
|
|
WebhookListResponse:
|
||
|
|
allOf:
|
||
|
|
- $ref: '#/components/schemas/BaseResponse'
|
||
|
|
- type: object
|
||
|
|
properties:
|
||
|
|
data:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
webhooks:
|
||
|
|
type: array
|
||
|
|
items:
|
||
|
|
$ref: '#/components/schemas/Webhook'
|
||
|
|
|
||
|
|
BaseResponse:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
success:
|
||
|
|
type: boolean
|
||
|
|
example: true
|
||
|
|
timestamp:
|
||
|
|
type: string
|
||
|
|
format: date-time
|
||
|
|
|
||
|
|
Pagination:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
page:
|
||
|
|
type: integer
|
||
|
|
pageSize:
|
||
|
|
type: integer
|
||
|
|
total:
|
||
|
|
type: integer
|
||
|
|
totalPages:
|
||
|
|
type: integer
|
||
|
|
|
||
|
|
ErrorResponse:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
success:
|
||
|
|
type: boolean
|
||
|
|
example: false
|
||
|
|
error:
|
||
|
|
type: object
|
||
|
|
properties:
|
||
|
|
code:
|
||
|
|
type: string
|
||
|
|
example: "VALIDATION_ERROR"
|
||
|
|
message:
|
||
|
|
type: string
|
||
|
|
example: "Invalid request parameters"
|
||
|
|
details:
|
||
|
|
type: object
|
||
|
|
timestamp:
|
||
|
|
type: string
|
||
|
|
format: date-time
|
||
|
|
|
||
|
|
responses:
|
||
|
|
BadRequest:
|
||
|
|
description: Bad request - validation error
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/ErrorResponse'
|
||
|
|
|
||
|
|
Unauthorized:
|
||
|
|
description: Unauthorized - missing or invalid authentication
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/ErrorResponse'
|
||
|
|
|
||
|
|
Forbidden:
|
||
|
|
description: Forbidden - insufficient permissions
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/ErrorResponse'
|
||
|
|
|
||
|
|
NotFound:
|
||
|
|
description: Resource not found
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/ErrorResponse'
|
||
|
|
|
||
|
|
Conflict:
|
||
|
|
description: Conflict - resource already exists
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/ErrorResponse'
|
||
|
|
|
||
|
|
InternalServerError:
|
||
|
|
description: Internal server error
|
||
|
|
content:
|
||
|
|
application/json:
|
||
|
|
schema:
|
||
|
|
$ref: '#/components/schemas/ErrorResponse'
|