openapi: 3.1.0

info:
  title: Dependal API
  version: 1.0.0
  description: |
    Dependal transactional email API.

    Response envelope standard:
    - Success: `{ "data": ... }`
    - Error: `{ "error": { "code": "...", "message": "..." } }`
  contact:
    name: Dependal Support
    url: https://dependal.com
    email: support@dependal.com

servers:
  - url: https://api.dependal.com
    description: Production

tags:
  - name: Domains
    description: Domain verification and DNS setup endpoints
  - name: Messages
    description: Message logs and event timeline endpoints
  - name: Tenant
    description: Tenant configuration endpoints

security:
  - ApiKeyAuth: []

components:
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key

  schemas:
    ErrorCode:
      type: string
      enum:
        - BAD_REQUEST
        - UNAUTHORIZED
        - FORBIDDEN
        - NOT_FOUND
        - VALIDATION_ERROR
        - CONFLICT
        - PAYLOAD_TOO_LARGE
        - SERVICE_UNAVAILABLE
        - DOMAIN_NOT_VERIFIED
        - SENDING_NOT_ENABLED
        - POLICY_NOT_ACCEPTED

    MessageStatusEnum:
      type: string
      enum:
        - ACCEPTED
        - QUEUED
        - SENDING
        - SENT
        - DELIVERED
        - FAILED
        - REJECTED
        - BOUNCED
        - COMPLAINT

    DomainStatusEnum:
      type: string
      enum:
        - PENDING
        - VERIFIED

    SesVerificationStatusEnum:
      type: string
      enum:
        - PENDING
        - SUCCESS
        - FAILED
        - TEMPORARY_FAILURE

    CallerTypeEnum:
      type: string
      enum:
        - public
        - smtp
        - admin

    SourceEnum:
      type: string
      enum:
        - api
        - worker
        - sns
        - provider

    EventGroupEnum:
      type: string
      enum:
        - internal
        - engagement

    StageEnum:
      type: string
      enum:
        - dev
        - prod

    DnsRecordTypeEnum:
      type: string
      enum:
        - CNAME
        - MX
        - TXT

    ProviderEnum:
      type: string
      enum:
        - SES

    ProviderEventTypeEnum:
      type: string
      enum:
        - Send
        - Delivery
        - Bounce
        - Complaint
        - Open
        - Click
        - Reject
        - RenderingFailure
        - DeliveryDelay
        - Subscription

    ErrorBody:
      type: object
      additionalProperties: false
      required:
        - code
        - message
      properties:
        code:
          $ref: '#/components/schemas/ErrorCode'
        message:
          type: string
          example: Request validation failed
        fields:
          type: object
          additionalProperties: true
          description: Optional field-level validation errors

    ErrorResponse:
      type: object
      additionalProperties: false
      required:
        - error
      properties:
        error:
          $ref: '#/components/schemas/ErrorBody'

    SendEmailRequest:
      type: object
      additionalProperties: false
      required:
        - from
        - to
        - subject
      properties:
        from:
          type: string
          example: Dependal <noreply@dependal.com>
          description: Sender in RFC 5322 mailbox format
        to:
          type: string
          example: user@example.com
          description: Recipient email address
        subject:
          type: string
          example: Welcome to Dependal
        text:
          type: string
          example: Thanks for signing up.
        html:
          type: string
          example: "<p>Thanks for signing up.</p>"
        tags:
          type: object
          additionalProperties:
            type: string
          description: Optional message tags

    SendEmailResult:
      type: object
      additionalProperties: false
      required:
        - messageId
        - status
      properties:
        messageId:
          type: string
          format: uuid
          example: 1a011c24-788e-4273-8c81-fd7d767bf0c0
        status:
          $ref: '#/components/schemas/MessageStatusEnum'

    SendEmailResponse:
      type: object
      additionalProperties: false
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/SendEmailResult'

    MessageStatus:
      type: object
      additionalProperties: false
      required:
        - messageId
        - status
        - reason
        - createdAt
        - updatedAt
        - to
        - from
        - subject
        - sendingMessageId
      properties:
        messageId:
          type: string
          format: uuid
          example: 1a011c24-788e-4273-8c81-fd7d767bf0c0
        status:
          $ref: '#/components/schemas/MessageStatusEnum'
        reason:
          type:
            - string
            - "null"
          description: Optional reason for failure, bounce, complaint, or rejection
          example: null
        createdAt:
          type: integer
          description: Unix timestamp in seconds
          example: 1773398594
        updatedAt:
          type: integer
          description: Unix timestamp in seconds
          example: 1773398596
        to:
          type: string
          example: developers@dependal.com
        from:
          type: string
          example: Dependal <noreply@dependal.com>
        subject:
          type: string
          example: Dependal test send
        sendingMessageId:
          type: 
            - string
            - "null"
          description: Provider message identifier
          example: 010b019ce6cb1552-32720d7c-a2cd-4716-a559-f587669ecacb-000000

    MessageStatusResponse:
      type: object
      additionalProperties: false
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/MessageStatus'

    TenantPoliciesAccept:
      type: object
      additionalProperties: false
      required:
        - ok
        - acceptedVersion
        - requiredPolicyVersion
      properties:
        ok:
          type: boolean
          example: true
        acceptedVersion:
          type: string
          example: "2026-02-22"
          description: Policy version the tenant just accepted
        requiredPolicyVersion:
          type: string
          example: "2026-02-22"
          description: Current policy version required by the platform

    TenantPoliciesAcceptResponse:
      type: object
      additionalProperties: false
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/TenantPoliciesAccept'

    TenantDomain:
      type: object
      additionalProperties: false
      required:
        - domain
        - status
        - createdAt
        - verifiedAt
        - updatedAt
      properties:
        domain:
          type: string
          example: example.com
        status:
          $ref: '#/components/schemas/DomainStatusEnum'
        createdAt:
          type: integer
          description: Unix timestamp in seconds
          example: 1773329146
        verifiedAt:
          type:
            - integer
            - "null"
          description: Unix timestamp in seconds when the domain was verified
          example: null
        updatedAt:
          type: string
          format: date-time
          example: "2026-03-12T15:25:46.312Z"

    TenantDomainsResponse:
      type: object
      additionalProperties: false
      required:
        - data
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/TenantDomain'

    TenantDomainCreateRequest:
      type: object
      additionalProperties: false
      required:
        - domain
      properties:
        domain:
          type: string
          example: yourdomain.com
          description: Domain to register for sending

    TenantDomainCreate:
      type: object
      additionalProperties: false
      required:
        - domain
        - status
      properties:
        domain:
          type: string
          example: yourdomain.com
        status:
          $ref: '#/components/schemas/DomainStatusEnum'

    TenantDomainCreateResponse:
      type: object
      additionalProperties: false
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/TenantDomainCreate'

    TenantDomainRecord:
      type: object
      additionalProperties: false
      required:
        - type
        - name
        - value
      properties:
        type:
          $ref: '#/components/schemas/DnsRecordTypeEnum'
        name:
          type: string
          example: cieoxyt4oxhvpr5zmdeqxoxzqgs6umsu._domainkey.yourdomain.com
        value:
          type: string
          example: cieoxyt4oxhvpr5zmdeqxoxzqgs6umsu.dkim.amazonses.com

    TenantDomainSesStatus:
      type: object
      additionalProperties: false
      required:
        - verificationStatus
        - dkimStatus
      properties:
        verificationStatus:
          $ref: '#/components/schemas/SesVerificationStatusEnum'
        dkimStatus:
          $ref: '#/components/schemas/SesVerificationStatusEnum'

    TenantDomainDetail:
      type: object
      additionalProperties: false
      required:
        - domain
        - mailFromDomain
        - status
        - ses
        - records
      properties:
        domain:
          type: string
          example: yourdomain.com
        mailFromDomain:
          type: string
          example: mail.yourdomain.com
        status:
          $ref: '#/components/schemas/DomainStatusEnum'
        ses:
          $ref: '#/components/schemas/TenantDomainSesStatus'
        records:
          type: array
          items:
            $ref: '#/components/schemas/TenantDomainRecord'

    TenantDomainDetailResponse:
      type: object
      additionalProperties: false
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/TenantDomainDetail'

    TenantDomainCheck:
      type: object
      additionalProperties: false
      required:
        - domain
        - status
        - ses
      properties:
        domain:
          type: string
          example: yourdomain.com
        status:
          $ref: '#/components/schemas/DomainStatusEnum'
        ses:
          $ref: '#/components/schemas/TenantDomainSesStatus'

    TenantDomainCheckResponse:
      type: object
      additionalProperties: false
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/TenantDomainCheck'

    TenantMessageMetaDelivery:
      type: object
      additionalProperties: false
      required:
        - processingTimeMillis
      properties:
        processingTimeMillis:
          type: integer
          example: 1371

    TenantMessageMeta:
      oneOf:
        - type: "null"
        - type: object
          additionalProperties: false
          required:
            - delivery
          properties:
            delivery:
              $ref: '#/components/schemas/TenantMessageMetaDelivery'

    TenantMessage:
      type: object
      additionalProperties: false
      required:
        - tenantId
        - requestId
        - status
        - reason
        - createdAt
        - updatedAt
        - lastEventAt
        - createdAtIso
        - updatedAtIso
        - lastEventAtIso
        - to
        - from
        - subject
        - sourceIp
        - stage
        - tag
        - keyId
        - callerType
        - lastSource
        - lastEventType
        - sesMessageId
        - idempotencyKey
        - metadata
        - meta
      properties:
        tenantId:
          type: string
          format: uuid
          example: af57c621-e979-4a8b-8415-7fdb7a07982c
        requestId:
          type: string
          format: uuid
          example: 1a011c24-788e-4273-8c81-fd7d767bf0c0
        status:
          $ref: '#/components/schemas/MessageStatusEnum'
        reason:
          type:
            - string
            - "null"
          example: null
        createdAt:
          type: integer
          description: Unix timestamp in seconds
          example: 1773398594
        updatedAt:
          type: integer
          description: Unix timestamp in seconds
          example: 1773398596
        lastEventAt:
          type:
            - integer
            - "null"
          description: Unix timestamp in seconds of the latest known event
          example: 1773398596
        createdAtIso:
          type: string
          format: date-time
          example: "2026-03-13T10:43:14.338Z"
        updatedAtIso:
          type: string
          format: date-time
          example: "2026-03-13T10:43:16.519Z"
        lastEventAtIso:
          type:
            - string
            - "null"
          format: date-time
          example: "2026-03-13T10:43:16.269Z"
        to:
          type: string
          example: developers@dependal.com
        from:
          type: string
          example: Dependal <noreply@dependal.com>
        subject:
          type: string
          example: Dependal test send
        sourceIp:
          type:
            - string
            - "null"
          example: 90.201.28.251
        stage:
          oneOf:
            - $ref: '#/components/schemas/StageEnum'
            - type: "null"
        tag:
          type:
            - string
            - "null"
          example: null
        keyId:
          type:
            - string
            - "null"
          example: ak-ez8lrxnZCi
        callerType:
          $ref: '#/components/schemas/CallerTypeEnum'
        lastSource:
          oneOf:
            - $ref: '#/components/schemas/SourceEnum'
            - type: "null"
        lastEventType:
          oneOf:
            - $ref: '#/components/schemas/MessageStatusEnum'
            - type: "null"
        sesMessageId:
          type:
            - string
            - "null"
          example: 010b019ce6cb1552-32720d7c-a2cd-4716-a559-f587669ecacb-000000
        idempotencyKey:
          type:
            - string
            - "null"
          example: 735c4c4f94e1d23e8c9686c5d92e52bcb19f3e91e02ddc42ee4387a6270a1907
        metadata:
          oneOf:
            - type: "null"
            - type: object
              additionalProperties: true
        meta:
          $ref: '#/components/schemas/TenantMessageMeta'

    TenantMessagesPage:
      type: object
      additionalProperties: false
      required:
        - items
        - cursor
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/TenantMessage'
        cursor:
          type:
            - string
            - "null"
          description: Opaque pagination cursor for the next page

    TenantMessagesResponse:
      type: object
      additionalProperties: false
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/TenantMessagesPage'

    TenantMessageResponse:
      type: object
      additionalProperties: false
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/TenantMessage'

    TenantMessageEventHeader:
      type: object
      additionalProperties: false
      required:
        - name
        - value
      properties:
        name:
          type: string
          example: From
        value:
          type: string
          example: Dependal <noreply@dependal.com>

    TenantMessageEventCommonHeaders:
      type: object
      additionalProperties: false
      required:
        - messageId
        - from
        - to
        - subject
      properties:
        messageId:
          type: string
          example: 010b019ce6cb1552-32720d7c-a2cd-4716-a559-f587669ecacb-000000
        from:
          type: array
          items:
            type: string
          example:
            - Dependal <noreply@dependal.com>
        to:
          type: array
          items:
            type: string
          example:
            - developers@dependal.com
        subject:
          type: string
          example: Dependal test send

    TenantMessageEventMail:
      type: object
      additionalProperties: true
      properties:
        sourceArn:
          type: string
          example: arn:aws:ses:eu-west-2:154673467564:identity/dependal.com
        headers:
          type: array
          items:
            $ref: '#/components/schemas/TenantMessageEventHeader'
        sendingAccountId:
          type: string
          example: "154673467564"
        destination:
          type: array
          items:
            type: string
          example:
            - developers@dependal.com
        headersTruncated:
          type: boolean
          example: false
        messageId:
          type: string
          example: 010b019ce6cb1552-32720d7c-a2cd-4716-a559-f587669ecacb-000000
        source:
          type: string
          example: "\"Dependal\" <noreply@dependal.com>"
        timestamp:
          type: string
          format: date-time
          example: "2026-03-13T10:43:14.898Z"
        commonHeaders:
          $ref: '#/components/schemas/TenantMessageEventCommonHeaders'
        tags:
          type: object
          additionalProperties:
            type: array
            items:
              type: string

    TenantMessageEventDelivery:
      type: object
      additionalProperties: true
      properties:
        smtpResponse:
          type: string
          example: "250 2.6.0 <010b019ce6cb1552-32720d7c-a2cd-4716-a559-f587669ecacb-000000@eu-west-2.amazonses.com> ..."
        processingTimeMillis:
          type: integer
          example: 1371
        reportingMTA:
          type: string
          example: d218-9.smtp-out.eu-west-2.amazonses.com
        remoteMtaIp:
          type: string
          example: 52.101.89.1
        recipients:
          type: array
          items:
            type: string
          example:
            - developers@dependal.com
        timestamp:
          type: string
          format: date-time
          example: "2026-03-13T10:43:16.269Z"

    TenantMessageProviderMeta:
      type: object
      additionalProperties: true
      properties:
        mail:
          $ref: '#/components/schemas/TenantMessageEventMail'
        send:
          type: object
          additionalProperties: true
        delivery:
          $ref: '#/components/schemas/TenantMessageEventDelivery'
        providerEventType:
          $ref: '#/components/schemas/ProviderEventTypeEnum'

    TenantMessageProviderEvent:
      type: object
      additionalProperties: false
      required:
        - eventAtIso
        - recipient
        - providerMessageId
        - messageId
        - meta
        - tenantId
        - eventAt
        - provider
        - eventType
        - eventGroup
      properties:
        eventAtIso:
          type: string
          format: date-time
          example: "2026-03-13T10:43:16.269Z"
        recipient:
          type: string
          example: developers@dependal.com
        providerMessageId:
          type:
            - string
            - "null"
          example: 010b019ce6cb1552-32720d7c-a2cd-4716-a559-f587669ecacb-000000
        messageId:
          type: string
          format: uuid
          example: 1a011c24-788e-4273-8c81-fd7d767bf0c0
        meta:
          $ref: '#/components/schemas/TenantMessageProviderMeta'
        tenantId:
          type: string
          format: uuid
          example: af57c621-e979-4a8b-8415-7fdb7a07982c
        eventAt:
          type: integer
          description: Unix timestamp in seconds
          example: 1773398596
        provider:
          $ref: '#/components/schemas/ProviderEnum'
        eventType:
          $ref: '#/components/schemas/MessageStatusEnum'
        eventGroup:
          $ref: '#/components/schemas/EventGroupEnum'

    TenantMessageInternalEvent:
      type: object
      additionalProperties: false
      required:
        - stage
        - detail
        - tenantId
        - callerType
        - status
        - source
        - createdAtIso
        - reason
        - requestId
        - eventAtIso
        - eventType
        - tag
        - eventGroup
      properties:
        stage:
          oneOf:
            - $ref: '#/components/schemas/StageEnum'
            - type: "null"
        detail:
          type: object
          additionalProperties: true
          example: {}
        tenantId:
          type: string
          format: uuid
          example: af57c621-e979-4a8b-8415-7fdb7a07982c
        callerType:
          $ref: '#/components/schemas/CallerTypeEnum'
        status:
          oneOf:
            - $ref: '#/components/schemas/MessageStatusEnum'
            - type: "null"
        source:
          $ref: '#/components/schemas/SourceEnum'
        createdAtIso:
          type: string
          format: date-time
          example: "2026-03-13T10:43:15.038Z"
        reason:
          type:
            - string
            - "null"
          example: null
        requestId:
          type: string
          format: uuid
          example: 1a011c24-788e-4273-8c81-fd7d767bf0c0
        eventAtIso:
          type: string
          format: date-time
          example: "2026-03-13T10:43:15.038Z"
        eventType:
          type: string
          example: provider.accepted
        tag:
          type:
            - string
            - "null"
          example: null
        eventGroup:
          $ref: '#/components/schemas/EventGroupEnum'

    TenantMessageEvent:
      oneOf:
        - $ref: '#/components/schemas/TenantMessageProviderEvent'
        - $ref: '#/components/schemas/TenantMessageInternalEvent'

    TenantMessageEventsPage:
      type: object
      additionalProperties: false
      required:
        - items
        - cursor
      properties:
        items:
          type: array
          items:
            $ref: '#/components/schemas/TenantMessageEvent'
        cursor:
          type:
            - string
            - "null"
          description: Opaque pagination cursor for the next page

    TenantMessageEventsResponse:
      type: object
      additionalProperties: false
      required:
        - data
      properties:
        data:
          $ref: '#/components/schemas/TenantMessageEventsPage'

  responses:
    BadRequest:
      description: Bad request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: BAD_REQUEST
              message: Bad request

    Unauthorized:
      description: Missing or invalid credentials
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: UNAUTHORIZED
              message: Missing or invalid credentials

    Forbidden:
      description: Forbidden
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: FORBIDDEN
              message: Forbidden

    NotFound:
      description: Not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: NOT_FOUND
              message: Not found

    ValidationError:
      description: Request validation failed
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: VALIDATION_ERROR
              message: Request validation failed
              fields:
                from: From address is required

    Conflict:
      description: Conflict
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: CONFLICT
              message: Conflict

    PayloadTooLarge:
      description: Payload too large
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: PAYLOAD_TOO_LARGE
              message: Payload too large

    ServiceUnavailable:
      description: Service unavailable
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: SERVICE_UNAVAILABLE
              message: Service unavailable

paths:

  /v1/send:
    post:
      tags: [Messages]
      operationId: sendEmail
      summary: Send an email
      description: Send a transactional email using the Dependal API.

      security:
        - ApiKeyAuth: []

      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SendEmailRequest'
            example:
              from: Dependal <noreply@dependal.com>
              to: developers@dependal.com
              subject: Dependal test send
              html: "<p>Hello 👋</p><p>This is a transactional test email from Dependal.</p>"
      responses:
        '202':
          description: Accepted for delivery
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SendEmailResponse'
              example:
                data:
                  messageId: 1a011c24-788e-4273-8c81-fd7d767bf0c0
                  status: QUEUED
        '400':
          $ref: '#/components/responses/ValidationError'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          description: Sending blocked
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                domainNotVerified:
                  value:
                    error:
                      code: DOMAIN_NOT_VERIFIED
                      message: Domain is not verified
                sendingNotEnabled:
                  value:
                    error:
                      code: SENDING_NOT_ENABLED
                      message: Sending is not enabled for this tenant
                policyNotAccepted:
                  value:
                    error:
                      code: POLICY_NOT_ACCEPTED
                      message: Policies must be accepted before sending
        '409':
          $ref: '#/components/responses/Conflict'
        '413':
          $ref: '#/components/responses/PayloadTooLarge'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'

      x-codeSamples:

        - lang: curl
          label: cURL
          source: |
            curl -X POST https://api.dependal.com/v1/send \
              -H "content-type: application/json" \
              -H "x-api-key: dp-xxxxxxxx" \
              -d '{
                "to": "user@example.com",
                "from": "Dependal <noreply@dependal.com>",
                "subject": "Dependal test send",
                "html": "<p>Hello 👋</p>"
              }'

        - lang: javascript
          label: Node.js
          source: |
            import Dependal from "@dependal/sdk";

            const config = new Dependal.Configuration({apiKey: "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"});

            const api = new Dependal.MessagesApi(config);

            const body = {
              // SendEmailRequest
              sendEmailRequest: {
                "from":"You <noreply@yourdomain.com>",
                "to":"user@example.com",
                "subject":"Dependal test send",
                "html":"<p>Hello 👋</p><p>This is a transactional test email from Dependal.</p>"
              },
            }

            try {
              const data = await api.sendEmail(body);
              console.log(data);
            } catch (error) {
              console.error(error);
            }

        - lang: python
          label: Python
          source: |
            import dependal
            from dependal.models.send_email_request import SendEmailRequest
            from dependal.models.send_email_response import SendEmailResponse
            from dependal.rest import ApiException
            from pprint import pprint

            configuration = dependal.Configuration(
                host = "https://api.dependal.com"
            )
            configuration.api_key['ApiKeyAuth'] = "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

            with dependal.ApiClient(configuration) as api_client:
                # Create an instance of the API class
                api_instance = dependal.MessagesApi(api_client)
                send_email_request = {
                    "from":"Dependal <noreply@dependal.com>",
                    "to":"developers@dependal.com",
                    "subject":"Dependal test send",
                    "html":"<p>Hello 👋</p><p>This is a transactional test email from Dependal.</p>"
                }

                try:
                    # Send an email
                    api_response = api_instance.send_email(send_email_request)
                    print("The response of MessagesApi->send_email:\n")
                    pprint(api_response)
                except Exception as e:
                    print("Exception when calling MessagesApi->send_email: %s\n" % e)

        - lang: php
          label: PHP
          source: |
            <?php

            require 'vendor/autoload.php';

            use Dependal\Configuration;
            use Dependal\Api\MessagesApi;
            use GuzzleHttp\Client;

            $config = new Configuration();
            $config->setHost("https://api.dependal.com");
            $config->setApiKey("x-api-key", "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

            $client = new Client();
            $api = new DefaultApi($client, $config);

            $api->sendEmail([
                "to" => "user@example.com",
                "from" => "Dependal <noreply@dependal.com>",
                "subject" => "Dependal test send",
                "html" => "<p>Hello 👋</p>"
            ]);

  /v1/status/{messageId}:
    get:
      tags: [Messages]
      operationId: getMessageStatus
      summary: Get message delivery status
      description: Returns the current delivery status for a message.
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |
            curl -X GET https://api.dependal.com/v1/status/1a011c24-788e-4273-8c81-fd7d767bf0c0 \
              -H 'content-type: application/json' \
              -H 'x-api-key: dp_your_api_key'
        - lang: javacript
          label: Node.js
          source: |
            import Dependal from '@dependal/sdk'

            const config = new Dependal.Configuration({apiKey: "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"});
            const api = new Dependal.MessagesApi(config);

            const messageId = "{messageId}";

            api.getMessageStatus({ messageId }).then((data) => {
              console.log(data);
            }, (error) => {
              console.error(error);
            });
        - lang: python
          label: Python
          source: |
            import dependal
            from pprint import pprint

            configuration = dependal.Configuration()
            configuration.api_key['ApiKeyAuth'] = "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

            with dependal.ApiClient(configuration) as api_client:
                api_instance = dependal.MessagesApi(api_client)
                message_id = "{messageId}"

                try:
                    api_response = api_instance.get_message_status(message_id)
                    print("The response of MessagesApi->get_message_status:\n")
                    pprint(api_response)
                except Exception as e:
                    print("Exception when calling MessagesApi->get_message_status: %s\n" % e)
        - lang: php
          label: PHP
          source: |
            <?php

            require 'vendor/autoload.php';

            use Dependal\Configuration;
            use Dependal\Api\MessagesApi;
            use GuzzleHttp\Client;

            $config = new Configuration();
            $config->setHost("https://api.dependal.com");
            $config->setApiKey("x-api-key", "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

            $client = new Client();
            $api = new DefaultApi($client, $config);

            $api->getMessageStatus("{messageId}");
      parameters:
        - in: path
          name: messageId
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Message status
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MessageStatusResponse'
              example:
                data:
                  messageId: 1a011c24-788e-4273-8c81-fd7d767bf0c0
                  status: DELIVERED
                  reason: null
                  createdAt: 1773398594
                  updatedAt: 1773398596
                  to: developers@dependal.com
                  from: Dependal <noreply@dependal.com>
                  subject: Dependal test send
                  sendingMessageId: 010b019ce6cb1552-32720d7c-a2cd-4716-a559-f587669ecacb-000000
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'

  /v1/tenant/policies/accept:
    post:
      tags: [Tenant]
      operationId: acceptTenantPolicies
      summary: Accept tenant policies
      description: Records acceptance of the current required policy version for the authenticated tenant.
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |
            curl -X POST https://api.dependal.com/v1/tenant/policies/accept \
              -H 'content-type: application/json' \
              -H 'x-api-key: dp_your_api_key'
        - lang: javascript
          label: Node.js
          source: |
            import Dependal from '@dependal/sdk'

            const config = new Dependal.Configuration({apiKey: "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"});
            const api = new Dependal.TenantApi(config);

            api.acceptTenantPolicies().then((data) => {
              console.log(data);
            }, (error) => {
              console.error(error);
            });
        - lang: python
          label: Python
          source: |
            import dependal
            from pprint import pprint

            configuration = dependal.Configuration()
            configuration.api_key['ApiKeyAuth'] = "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

            with dependal.ApiClient(configuration) as api_client:
                api_instance = dependal.TenantApi(api_client)

                try:
                    api_response = api_instance.accept_tenant_policies()
                    print("The response of TenantApi->accept_tenant_policies:\n")
                    pprint(api_response)
                except Exception as e:
                    print("Exception when calling TenantApi->accept_tenant_policies: %s\n" % e)

        - lang: php
          label: PHP
          source: |
            <?php

            require 'vendor/autoload.php';

            use Dependal\Configuration;
            use Dependal\Api\TenantApi;
            use GuzzleHttp\Client;

            $config = new Configuration();
            $config->setHost("https://api.dependal.com");
            $config->setApiKey("x-api-key", "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

            $client = new Client();
            $api = new DefaultApi($client, $config);

            $api->acceptTenantPolicies();

      responses:
        '200':
          description: Policies accepted successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TenantPoliciesAcceptResponse'
              example:
                data:
                  ok: true
                  acceptedVersion: "2026-02-22"
                  requiredPolicyVersion: "2026-02-22"
        '401':
          $ref: '#/components/responses/Unauthorized'

  /v1/tenant/domains:
    get:
      tags: [Domains]
      operationId: listTenantDomains
      summary: List tenant domains
      description: Returns the domains registered for the authenticated tenant.
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |
            curl -X GET https://api.dependal.com/v1/tenant/domains \
              -H 'content-type: application/json' \
              -H 'x-api-key: dp_your_api_key'
        - lang: javascript
          label: Node.js
          source: |
            import Dependal from '@dependal/sdk'

            const config = new Dependal.Configuration({apiKey: "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"});
            const api = new Dependal.TenantApi(config);

            api.listTenantDomains().then((data) => {
              console.log(data);
            }, (error) => {
              console.error(error);
            });
        - lang: python
          label: Python
          source: |
            import dependal
            from pprint import pprint

            configuration = dependal.Configuration()
            configuration.api_key['ApiKeyAuth'] = "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

            with dependal.ApiClient(configuration) as api_client:
                api_instance = dependal.TenantApi(api_client)

                try:
                    api_response = api_instance.list_tenant_domains()
                    print("The response of TenantApi->list_tenant_domains:\n")
                    pprint(api_response)
                except Exception as e:
                    print("Exception when calling TenantApi->list_tenant_domains: %s\n" % e)

        - lang: php
          label: PHP
          source: |
            <?php

            require 'vendor/autoload.php';

            use Dependal\Configuration;
            use Dependal\Api\TenantApi;
            use GuzzleHttp\Client;

            $config = new Configuration();
            $config->setHost("https://api.dependal.com");
            $config->setApiKey("x-api-key", "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

            $client = new Client();
            $api = new DefaultApi($client, $config);

            $api->listTenantDomains();

      responses:
        '200':
          description: Tenant domains
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TenantDomainsResponse'
              example:
                data:
                  - domain: example.com
                    status: PENDING
                    createdAt: 1773329146
                    verifiedAt: null
                    updatedAt: "2026-03-12T15:25:46.312Z"
                  - domain: test.com
                    status: PENDING
                    createdAt: 1773327820
                    verifiedAt: null
                    updatedAt: "2026-03-12T15:03:40.363Z"
                  - domain: dependal.com
                    status: VERIFIED
                    createdAt: 1773262486
                    verifiedAt: 1773262489
                    updatedAt: "2026-03-11T20:54:49.205Z"
        '401':
          $ref: '#/components/responses/Unauthorized'

    post:
      tags: [Domains]
      operationId: createTenantDomain
      summary: Add tenant domain
      description: Registers a domain for the authenticated tenant and begins the verification process.
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |
            curl -X POST https://api.dependal.com/v1/tenant/domains \
              -H 'content-type: application/json' \
              -H 'x-api-key: dp_your_api_key' \
              -d '{ "domain": "yourdomain.com" }'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TenantDomainCreateRequest'
            example:
              domain: yourdomain.com
      responses:
        '200':
          description: Domain created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TenantDomainCreateResponse'
              example:
                data:
                  domain: yourdomain.com
                  status: PENDING
        '400':
          $ref: '#/components/responses/ValidationError'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '409':
          $ref: '#/components/responses/Conflict'

  /v1/tenant/domains/{domain}:
    get:
      tags: [Domains]
      operationId: getTenantDomain
      summary: Get tenant domain details
      description: Returns details for a tenant domain, including SES verification status and required DNS records.
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |
            curl -X GET https://api.dependal.com/v1/tenant/domains/yourdomain.com \
              -H 'content-type: application/json' \
              -H 'x-api-key: dp_your_api_key'
        - lang: javascript
          label: Node.js
          source: |
            import Dependal from '@dependal/sdk'

            const config = new Dependal.Configuration({apiKey: "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"});
            const api = new Dependal.TenantApi(config);

            api.getTenantDomain("yourdomain.com").then((data) => {
              console.log(data);
            }, (error) => {
              console.error(error);
            });
        - lang: python
          label: Python
          source: |
            import dependal
            from pprint import pprint

            configuration = dependal.Configuration()
            configuration.api_key['ApiKeyAuth'] = "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

            with dependal.ApiClient(configuration) as api_client:
                api_instance = dependal.TenantApi(api_client)
                domain = "yourdomain.com"

                try:
                    api_response = api_instance.get_tenant_domain(domain)
                    print("The response of TenantApi->get_tenant_domain:\n")
                    pprint(api_response)
                except Exception as e:
                    print("Exception when calling TenantApi->get_tenant_domain: %s\n" % e)

        - lang: php
          label: PHP
          source: |
            <?php

            require 'vendor/autoload.php';

            use Dependal\Configuration;
            use Dependal\Api\TenantApi;
            use GuzzleHttp\Client;

            $config = new Configuration();
            $config->setHost("https://api.dependal.com");
            $config->setApiKey("x-api-key", "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

            $client = new Client();
            $api = new DefaultApi($client, $config);

            $api->getTenantDomain("yourdomain.com");

      parameters:
        - in: path
          name: domain
          required: true
          schema:
            type: string
          description: Domain name to retrieve
      responses:
        '200':
          description: Tenant domain details
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TenantDomainDetailResponse'
              example:
                data:
                  domain: yourdomain.com
                  mailFromDomain: mail.yourdomain.com
                  status: PENDING
                  ses:
                    verificationStatus: PENDING
                    dkimStatus: PENDING
                  records:
                    - type: CNAME
                      name: cieoxyt4oxhvpr5zmdeqxoxzqgs6umsu._domainkey.yourdomain.com
                      value: cieoxyt4oxhvpr5zmdeqxoxzqgs6umsu.dkim.amazonses.com
                    - type: CNAME
                      name: vnax6rpwbgmg7wnrsrdamqyfofsh4v55._domainkey.yourdomain.com
                      value: vnax6rpwbgmg7wnrsrdamqyfofsh4v55.dkim.amazonses.com
                    - type: CNAME
                      name: tv5dn334nofogzpzh6zgf6ngztk6p6zg._domainkey.yourdomain.com
                      value: tv5dn334nofogzpzh6zgf6ngztk6p6zg.dkim.amazonses.com
                    - type: MX
                      name: mail.yourdomain.com
                      value: 10 feedback-smtp.eu-west-2.amazonses.com
                    - type: TXT
                      name: mail.yourdomain.com
                      value: v=spf1 include:amazonses.com ~all
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'

  /v1/tenant/domains/{domain}/check:
    post:
      tags: [Domains]
      operationId: checkTenantDomain
      summary: Check tenant domain verification
      description: Re-checks the verification status of a tenant domain and returns the latest provider verification state.
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |
            curl -X POST https://api.dependal.com/v1/tenant/domains/yourdomain.com/check \
              -H 'content-type: application/json' \
              -H 'x-api-key: dp_your_api_key'
        - lang: javascript
          label: Node.js
          source: |
            import Dependal from '@dependal/sdk'

            const config = new Dependal.Configuration({apiKey: "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"});
            const api = new Dependal.TenantApi(config);

            api.checkTenantDomain("yourdomain.com").then((data) => {
              console.log(data);
            }, (error) => {
              console.error(error);
            });

        - lang: python
          label: Python
          source: |
            import dependal
            from pprint import pprint

            configuration = dependal.Configuration()
            configuration.api_key['ApiKeyAuth'] = "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

            with dependal.ApiClient(configuration) as api_client:
                api_instance = dependal.TenantApi(api_client)
                domain = "yourdomain.com"

                try:
                    api_response = api_instance.check_tenant_domain(domain)
                    print("The response of TenantApi->check_tenant_domain:\n")
                    pprint(api_response)
                except Exception as e:
                    print("Exception when calling TenantApi->check_tenant_domain: %s\n" % e)

        - lang: php
          label: PHP
          source: |
            <?php

            require 'vendor/autoload.php';

            use Dependal\Configuration;
            use Dependal\Api\TenantApi;
            use GuzzleHttp\Client;

            $config = new Configuration();
            $config->setHost("https://api.dependal.com");
            $config->setApiKey("x-api-key", "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

            $client = new Client();
            $api = new DefaultApi($client, $config);

            $api->checkTenantDomain("yourdomain.com");

      parameters:
        - in: path
          name: domain
          required: true
          schema:
            type: string
          description: Domain name to check
      responses:
        '200':
          description: Domain verification status
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TenantDomainCheckResponse'
              example:
                data:
                  domain: yourdomain.com
                  status: PENDING
                  ses:
                    verificationStatus: PENDING
                    dkimStatus: PENDING
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'

  /v1/tenant/messages:
    get:
      tags: [Messages]
      operationId: listTenantMessages
      summary: List tenant messages
      description: Returns paginated message logs for the authenticated tenant.
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |
            curl -X GET https://api.dependal.com/v1/tenant/messages \
              -H 'content-type: application/json' \
              -H 'x-api-key: dp_your_api_key'
        - lang: javascript
          label: Node.js
          source: |
            import Dependal from '@dependal/sdk'

            const config = new Dependal.Configuration({apiKey: "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"});
            const api = new Dependal.TenantApi(config);

            api.listTenantMessages().then((data) => {
              console.log(data);
            }, (error) => {
              console.error(error);
            });

        - lang: python
          label: Python
          source: |
            import dependal
            from pprint import pprint

            configuration = dependal.Configuration()
            configuration.api_key['ApiKeyAuth'] = "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

            with dependal.ApiClient(configuration) as api_client:
                api_instance = dependal.TenantApi(api_client)

                try:
                    api_response = api_instance.list_tenant_messages()
                    print("The response of TenantApi->list_tenant_messages:\n")
                    pprint(api_response)
                except Exception as e:
                    print("Exception when calling TenantApi->list_tenant_messages: %s\n" % e)

        - lang: php
          label: PHP
          source: |
            <?php

            require 'vendor/autoload.php';

            use Dependal\Configuration;
            use Dependal\Api\TenantApi;
            use GuzzleHttp\Client;

            $config = new Configuration();
            $config->setHost("https://api.dependal.com");
            $config->setApiKey("x-api-key", "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

            $client = new Client();
            $api = new DefaultApi($client, $config);

            $api->listTenantMessages();

      parameters:
        - in: query
          name: cursor
          required: false
          schema:
            type: string
          description: Opaque pagination cursor returned by a previous response
        - in: query
          name: limit
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
            default: 50
          description: Maximum number of messages to return
      responses:
        '200':
          description: Tenant messages
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TenantMessagesResponse'
              example:
                data:
                  items:
                    - tenantId: af57c621-e979-4a8b-8415-7fdb7a07982c
                      createdAt: 1773398594
                      reason: null
                      lastSource: sns
                      subject: Dependal test send
                      updatedAtIso: "2026-03-13T10:43:16.519Z"
                      createdAtIso: "2026-03-13T10:43:14.338Z"
                      sourceIp: 90.201.28.251
                      to: developers@dependal.com
                      from: Dependal <noreply@dependal.com>
                      requestId: 1a011c24-788e-4273-8c81-fd7d767bf0c0
                      stage: dev
                      tag: null
                      lastEventType: DELIVERED
                      metadata: null
                      sesMessageId: 010b019ce6cb1552-32720d7c-a2cd-4716-a559-f587669ecacb-000000
                      lastEventAt: 1773398596
                      idempotencyKey: 735c4c4f94e1d23e8c9686c5d92e52bcb19f3e91e02ddc42ee4387a6270a1907
                      status: DELIVERED
                      lastEventAtIso: "2026-03-13T10:43:16.269Z"
                      updatedAt: 1773398596
                      keyId: ak-ez8lrxnZCi
                      callerType: public
                      meta:
                        delivery:
                          processingTimeMillis: 1371
                  cursor: eyJnc2kxcGsiOiJURU5BTlQjYWY1N2M2MjEtZTk3OS00YThiLTg0MTUtN2ZkYjdhMDc5ODJjIiwiZ3NpMXNrIjoiQ1JFQVRFRCMxNzczMzkwNTI1I01TRyNmYTZjMmViNC0wYjE1LTQzZGItOGM4MC02MDg5NTBhOTY4ZTQiLCJwayI6IlRFTkFOVCNhZjU3YzYyMS1lOTc5LTRhOGItODQxNS03ZmRiN2EwNzk4MmMiLCJzayI6Ik1TRyNmYTZjMmViNC0wYjE1LTQzZGItOGM4MC02MDg5NTBhOTY4ZTQifQ==
        '401':
          $ref: '#/components/responses/Unauthorized'

  /v1/tenant/messages/{messageId}:
    get:
      tags: [Messages]
      operationId: getTenantMessage
      summary: Get tenant message
      description: Returns a single message record for the authenticated tenant.
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |
            curl -X GET https://api.dependal.com/v1/tenant/messages/1a011c24-788e-4273-8c81-fd7d767bf0c0 \
              -H 'content-type: application/json' \
              -H 'x-api-key: dp_your_api_key'
        - lang: javascript
          label: Node.js
          source: |
            import Dependal from '@dependal/sdk'

            const config = new Dependal.Configuration({apiKey: "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"});
            const api = new Dependal.TenantApi(config);

            api.getTenantMessage("1a011c24-788e-4273-8c81-fd7d767bf0c0").then((data) => {
              console.log(data);
            }, (error) => {
              console.error(error);
            });

        - lang: python
          label: Python
          source: |
            import dependal
            from pprint import pprint

            configuration = dependal.Configuration()
            configuration.api_key['ApiKeyAuth'] = "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

            with dependal.ApiClient(configuration) as api_client:
                api_instance = dependal.TenantApi(api_client)
                message_id = "1a011c24-788e-4273-8c81-fd7d767bf0c0"

                try:
                    api_response = api_instance.get_tenant_message(message_id)
                    print("The response of TenantApi->get_tenant_message:\n")
                    pprint(api_response)
                except Exception as e:
                    print("Exception when calling TenantApi->get_tenant_message: %s\n" % e)

        - lang: php
          label: PHP
          source: |
            <?php

            require 'vendor/autoload.php';

            use Dependal\Configuration;
            use Dependal\Api\TenantApi;
            use GuzzleHttp\Client;

            $config = new Configuration();
            $config->setHost("https://api.dependal.com");
            $config->setApiKey("x-api-key", "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

            $client = new Client();
            $api = new DefaultApi($client, $config);

            $api->getTenantMessage("1a011c24-788e-4273-8c81-fd7d767bf0c0");

      parameters:
        - in: path
          name: messageId
          required: true
          schema:
            type: string
            format: uuid
          description: Message request ID
      responses:
        '200':
          description: Tenant message
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TenantMessageResponse'
              example:
                data:
                  callerType: public
                  createdAt: 1773398594
                  createdAtIso: "2026-03-13T10:43:14.338Z"
                  from: Dependal <noreply@dependal.com>
                  idempotencyKey: 735c4c4f94e1d23e8c9686c5d92e52bcb19f3e91e02ddc42ee4387a6270a1907
                  keyId: ak-ez8lrxnZCi
                  lastEventAt: 1773398596
                  lastEventAtIso: "2026-03-13T10:43:16.269Z"
                  lastEventType: DELIVERED
                  lastSource: sns
                  meta:
                    delivery:
                      processingTimeMillis: 1371
                  metadata: null
                  reason: null
                  requestId: 1a011c24-788e-4273-8c81-fd7d767bf0c0
                  sesMessageId: 010b019ce6cb1552-32720d7c-a2cd-4716-a559-f587669ecacb-000000
                  sourceIp: 90.201.28.251
                  stage: dev
                  status: DELIVERED
                  subject: Dependal test send
                  tag: null
                  tenantId: af57c621-e979-4a8b-8415-7fdb7a07982c
                  to: developers@dependal.com
                  updatedAt: 1773398596
                  updatedAtIso: "2026-03-13T10:43:16.519Z"
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'

  /v1/tenant/messages/{messageId}/events:
    get:
      tags: [Messages]
      operationId: listTenantMessageEvents
      summary: List tenant message events
      description: Returns the event timeline for a single tenant message, including internal processing events and provider delivery events.
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |
            curl -X GET https://api.dependal.com/v1/tenant/messages/1a011c24-788e-4273-8c81-fd7d767bf0c0/events \
              -H 'content-type: application/json' \
              -H 'x-api-key: dp_your_api_key'
        - lang: javascript
          label: Node.js
          source: |
            import Dependal from '@dependal/sdk'

            const config = new Dependal.Configuration({apiKey: "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"});
            const api = new Dependal.TenantApi(config);

            api.listTenantMessageEvents("1a011c24-788e-4273-8c81-fd7d767bf0c0").then((data) => {
              console.log(data);
            }, (error) => {
              console.error(error);
            });

        - lang: python
          label: Python
          source: |
            import dependal
            from pprint import pprint

            configuration = dependal.Configuration()
            configuration.api_key['ApiKeyAuth'] = "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

            with dependal.ApiClient(configuration) as api_client:
                api_instance = dependal.TenantApi(api_client)
                message_id = "1a011c24-788e-4273-8c81-fd7d767bf0c0"

                try:
                    api_response = api_instance.list_tenant_message_events(message_id)
                    print("The response of TenantApi->list_tenant_message_events:\n")
                    pprint(api_response)
                except Exception as e:
                    print("Exception when calling TenantApi->list_tenant_message_events: %s\n" % e)

        - lang: php
          label: PHP
          source: |
            <?php

            require 'vendor/autoload.php';

            use Dependal\Configuration;
            use Dependal\Api\TenantApi;
            use GuzzleHttp\Client;

            $config = new Configuration();
            $config->setHost("https://api.dependal.com");
            $config->setApiKey("x-api-key", "dp-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

            $client = new Client();
            $api = new DefaultApi($client, $config);

            $api->listTenantMessageEvents("1a011c24-788e-4273-8c81-fd7d767bf0c0");    
        
      parameters:
        - in: path
          name: messageId
          required: true
          schema:
            type: string
            format: uuid
          description: Message request ID
        - in: query
          name: cursor
          required: false
          schema:
            type: string
          description: Opaque pagination cursor returned by a previous response
        - in: query
          name: limit
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 200
            default: 50
          description: Maximum number of events to return
      responses:
        '200':
          description: Message events
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TenantMessageEventsResponse'
              example:
                data:
                  items:
                    - eventAtIso: "2026-03-13T10:43:16.269Z"
                      recipient: developers@dependal.com
                      providerMessageId: 010b019ce6cb1552-32720d7c-a2cd-4716-a559-f587669ecacb-000000
                      messageId: 1a011c24-788e-4273-8c81-fd7d767bf0c0
                      meta:
                        mail:
                          sourceArn: arn:aws:ses:eu-west-2:154673467564:identity/dependal.com
                          headers:
                            - name: From
                              value: Dependal <noreply@dependal.com>
                            - name: To
                              value: developers@dependal.com
                            - name: Subject
                              value: Dependal test send
                          sendingAccountId: "154673467564"
                          destination:
                            - developers@dependal.com
                          headersTruncated: false
                          messageId: 010b019ce6cb1552-32720d7c-a2cd-4716-a559-f587669ecacb-000000
                          source: "\"Dependal\" <noreply@dependal.com>"
                          timestamp: "2026-03-13T10:43:14.898Z"
                          commonHeaders:
                            messageId: 010b019ce6cb1552-32720d7c-a2cd-4716-a559-f587669ecacb-000000
                            from:
                              - Dependal <noreply@dependal.com>
                            to:
                              - developers@dependal.com
                            subject: Dependal test send
                        delivery:
                          smtpResponse: "250 2.6.0 <010b019ce6cb1552-32720d7c-a2cd-4716-a559-f587669ecacb-000000@eu-west-2.amazonses.com> ..."
                          processingTimeMillis: 1371
                          reportingMTA: d218-9.smtp-out.eu-west-2.amazonses.com
                          remoteMtaIp: 52.101.89.1
                          recipients:
                            - developers@dependal.com
                          timestamp: "2026-03-13T10:43:16.269Z"
                        providerEventType: Delivery
                      tenantId: af57c621-e979-4a8b-8415-7fdb7a07982c
                      eventAt: 1773398596
                      provider: SES
                      eventType: DELIVERED
                      eventGroup: engagement
                    - stage: null
                      detail: {}
                      tenantId: af57c621-e979-4a8b-8415-7fdb7a07982c
                      callerType: public
                      status: null
                      source: worker
                      createdAtIso: "2026-03-13T10:43:15.038Z"
                      reason: null
                      requestId: 1a011c24-788e-4273-8c81-fd7d767bf0c0
                      eventAtIso: "2026-03-13T10:43:15.038Z"
                      eventType: provider.accepted
                      tag: null
                      eventGroup: internal
                  cursor: null
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
