openapi: "3.0.0"
info:
  title: "Swift Missive API"
  version: "1.0.0"
  description: In Swift Missive, you log in first, then use the returned payload to determine the base url for your API calls.  See contextual or individual endpoint docs for more information.
servers:
  - url: To try out the demo account APIs, Authorize first >>
paths:
  /login:
    servers:
      - url:  https://avcs27n2kc.execute-api.us-east-1.amazonaws.com
    post:
      operationId: loginUser
      summary: Authenticate yourself with the API
      description: |
        Authenticates a user using email and password credentials, and returns your API key and API endpoints.

        Note: this endpoint is rate-limited, so you are going to need to cache your API key and endpoint information!

        The full url for this endpoint is https://avcs27n2kc.execute-api.us-east-1.amazonaws.com/login
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - email
                - password
              properties:
                email:
                  type: string
                  format: email
                  example: demouser@swiftmissive.com
                password:
                  type: string
                  format: password
                  example: demouserpassword@swiftmissive.com
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: Wrong email and/or password provided.
        '403':
          description: Wrong email and/or password provided.
        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully authenticated
          content:
            application/json:
              schema:
                type: object
                properties:
                  api_client_key:
                    description: The API key you'll need to use to call the API for your account.
                    type: string
                    format: uuid
                  endpoints:
                    description: A list of endpoints that you will need to use when calling the API for your account.
                    type: object
                    additionalProperties:
                      type: string
                      format: uri
                  integration_key:
                    description: A key that can be used for integration with Make.com.
                    type: string
                  integration_key2:
                    description: A key that can be used for integration with Zapier.
                    type: string
                  user:
                    $ref: '#/components/schemas/User'
                  errors:
                    type: array
                    items:
                      type: string
                  not_in_sandbox:
                    type: boolean
              example:
                api_client_key: d0bcefa7-c3f7-3b65-3fda-b5b50f208552
                integration_key: Icfb818e4-7bff-4f7b-34b2-20b294124663
                integration_key2: Ia1d5737c-957d-4ec6-951e-ad803b2727ad
                user: {}
                endpoints:
                  api_campaign_gateway: https://0tizjlg161.execute-api.us-east-1.amazonaws.com
                  api_companyauthwrapper_gateway: https://vpvnqvk5l5.execute-api.us-east-1.amazonaws.com
                  # ... (other gateways omitted for brevity)
                errors: []
                not_in_sandbox: false
  /all_events:
    servers:
      - url: https://eelyk87zzb.execute-api.us-east-1.amazonaws.com
    get:
      operationId: getEvents
      summary: Get a list of events
      description: |
        Returns a list of events with optional filtering, sorting, and search parameters.  Please set either include_system_events and/or include_events to true.

        If include_system_events is true, the response will include Swift Missive internal events.

        If include_events is true, the response will include events you've sent to our API.

        If you can, you should also use the 'interval' parameter to tell the API how far back to look.  For instance if you are querying information on an email blast and the blast was created 2 days ago, you can pass in 48h for the interval parameter to speed up the query.

        The base url for this endpoint is {api_event_gateway} in the login response payload.
      parameters:
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
          description: Maximum number of events to return.
        - name: sort_columns
          in: query
          required: false
          schema:
            type: string
            example: emitted_at DESC
          description: Columns and sort order.
        - name: interval
          in: query
          required: false
          schema:
            type: string
            example: 1d
          description: A time interval that will be parsed by golang's time.ParseDuration() function to tell the query how far back to look for events.  Use some combination of hours (h), minutes (m), and/or seconds (s).  e.g. 24h or 1h30m59s or 5m, etc.
        - name: search_field
          in: query
          required: false
          schema:
            type: string
            example: name
          description: Field to search on.
        - name: search_value
          in: query
          required: false
          schema:
            type: string
            example: email_send_result_success
          description: Value to search for in the specified field.
        - name: include_system_events
          in: query
          required: false
          schema:
            type: boolean
            example: true
          description: Whether to include system events in the results.
        - name: include_events
          in: query
          required: false
          schema:
            type: boolean
            example: true
          description: Whether to include your api-driven events in the results.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          format: uuid
                        name:
                          type: string
                        user_id:
                          type: string
                          format: uuid
                        email:
                          type: string
                          format: email
                        user:
                          type: object
                          $ref: "#/components/schemas/User"
                          nullable: true
                        json:
                          type: object
                        metric1:
                          type: integer
                        metric2:
                          type: integer
                        metric3:
                          type: integer
                        emitted_at:
                          type: string
                          format: date-time
                        created_at:
                          type: string
                          format: date-time
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data:
                  - id: "463af440-8f0b-cb78-8358-1d0065d941d7"
                    name: "email_send_result_success"
                    user_id: "561c21fd-5da6-4cc8-8824-3fdaecf28329"
                    email: "success+chicago@simulator.amazonses.com"
                    user: {}
                    json: {}
                    metric1: 0
                    metric2: 0
                    metric3: 0
                    emitted_at: "2026-09-12T17:00:06Z"
                    created_at: "2026-09-12T17:00:06Z"
                errors: []
  /all_events/count:
    servers:
      - url: https://eelyk87zzb.execute-api.us-east-1.amazonaws.com
    get:
      operationId: getEventCount
      summary: Get count of events
      description: |
        Returns the total number of events matching the given filters.

        If you can, you should also use the 'interval' parameter to tell the API how far back to look.  For instance if you are querying information on an email blast and the blast was created 2 days ago, you can pass in 48h for the interval parameter to speed up the query.

        The base url for this endpoint is {api_event_gateway} in the login response payload.
      parameters:
        - name: search_field
          in: query
          required: false
          schema:
            type: string
            example: name
          description: Field to search on.
        - name: search_value
          in: query
          required: false
          schema:
            type: string
            example: email_send_result_success
          description: Value to search for in the specified field.
        - name: interval
          in: query
          required: false
          schema:
            type: string
            example: 1d
          description: A time interval that will be parsed by golang's time.ParseDuration() function to tell the query how far back to look for events.    Use some combination of hours (h), minutes (m), and/or seconds (s).  e.g. 24h or 1h30m59s or 5m, etc.
        - name: include_system_events
          in: query
          required: false
          schema:
            type: boolean
            example: true
          description: Whether to include system events in the count.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  num_events:
                    type: integer
                    description: Total number of matching events.
                    example: 19
                  errors:
                    type: array
                    items:
                      type: string
              example:
                num_events: 19
                errors: []
  /bulk_upload_status:
    servers:
      - url: https://t4oia5mt79.execute-api.us-east-1.amazonaws.com
    get:
      operationId: getBulkUploadStatus
      summary: Get processing status for a contacts file
      description: |
        Returns the processing status of a bulk contact upload by its S3 key.

        The base url for this endpoint is {api_joblog_gateway} in the login response payload.
      parameters:
        - name: s3_key
          in: query
          required: true
          schema:
            type: string
            example: abc.csv 2026-09-12-89cca5bd
          description: The S3 object key of the uploaded file.  This will be returned by the /segments/upload_url endpoint.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully retrieved bulk upload status
          content:
            application/json:
              schema:
                type: object
                properties:
                  s3_key:
                    type: string
                    description: The S3 object key of the uploaded file.
                  num_in_progress_jobs:
                    type: integer
                    description: Number of jobs still in progress for this upload.  When this is 0, processing is completed.
                  num_total_jobs:
                    type: integer
                    description: Total number of jobs for this upload.
                  processing_errors:
                    type: array
                    description: List of processing error messages, if any.
                    items:
                      type: string
                  errors:
                    type: array
                    description: List of general error messages, if any.
                    items:
                      type: string
              example:
                s3_key: im_50_percent_done_processing.csv 2026-09-12-89cca5bd
                num_in_progress_jobs: 1
                num_total_jobs: 2
                processing_errors: []
                errors: []
  /campaigns:
    description: Campaigns help you organize your stats.  They do not affect anything other than reporting.  Keep this in mind when deleting campaigns!
    servers:
      - url: https://0tizjlg161.execute-api.us-east-1.amazonaws.com
    post:
      operationId: createCampaign
      summary: Create a new campaign
      description: |
        Creates a new campaign resource and associates it with the given blasts, workflows, etc.

        The base url for this endpoint is {api_campaign_gateway} in the login response payload.
      security:
        - apiKeyAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                campaign:
                  type: object
                  properties:
                    id:
                      type: string
                      format: uuid
                    type:
                      type: enum
                      items:
                        - template
                        - workflow
                        - scheduled_email_group
                      example: template
                    name:
                      type: string
                      example: Coupon Campaign 11/22/2027
                    scheduled_email_blast_group_ids:
                      type: array
                      nullable: true
                      items:
                        type: string
                        format: uuid
                    workflow_ids:
                      type: array
                      items:
                        type: string
                        format: uuid
                      nullable: true
                    template_ids:
                      type: array
                      description: Any template ids associated with the campaign.  Weights for A/B tests are set up on the scheduled blast itself.
                      items:
                        nullable: true
                        type: string
                        format: uuid
            example:
              campaign:
                id: 12312312-1234-1234-1234-123123123456
                type: template
                name: my ab test campaign
                scheduled_email_blast_group_ids:
                  - 12312312-1234-1234-1234-123123123456
                workflow_ids: null
                template_ids:
                  - 12312312-1234-1234-1234-123123123456
                  - 12312312-1234-1234-1234-123123123456
      responses:
        '200':
          description: Successfully created campaign
          content:
            application/json:
              schema:
                type: object
                properties:
                  campaign_id:
                    type: string
                    format: uuid
                    description: The ID of the created campaign
                  errors:
                    type: array
                    items:
                      type: string
              example:
                campaign_id: 12312312-1234-1234-1234-123123123456
                errors: []
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: Authentication error, usually due to an invalid API key.
        '403':
          description: Authorization error, usually due to insufficient permissions.
        '429':
          description: Too many requests in a short amount of time.
        '500':
          description: The input seemed valid but something went wrong on the server side.
    get:
      operationId: getCampaigns
      summary: Get all campaigns
      description: |
        Returns a list of campaigns with their metadata.

        The base url for this endpoint is {api_campaign_gateway} in the login response payload.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  campaigns:
                    type: array
                    items:
                      $ref: '#/components/schemas/Campaign'
                  errors:
                    type: array
                    items:
                      type: string
              example:
                campaigns:
                  - id: "da7a43be-69c2-4e5d-aa18-469d429869ef"
                    name: "DEMO ACCOUNT campaign"
                    type: "scheduled_email_group"
                    workflow_ids: null
                    template_ids: null
                    scheduled_email_blast_group_ids:
                      - "cd758200-0a85-4d85-8aa5-407529347a12"
                    created_at: "2026-06-07T15:35:00Z"
                    updated_at: "2026-06-07T15:35:00Z"
                errors: []
  /campaigns/{id}:
    delete:
      servers:
        - url: https://0tizjlg161.execute-api.us-east-1.amazonaws.com
      operationId: deleteCampaign
      summary: Delete a campaign (for reporting purposes only!)
      description: |
        Deletes a campaign by its ID.  This will only affect reporting.

        This does not delete associated components such as email blasts.

        The base url for this endpoint is {api_campaign_gateway} in the login response payload.
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
            example: 6b0afb65-a408-462f-944f-022281c4ab15
          description: The UUID of the campaign to delete.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully deleted campaign(s).  This endpoint also returns 200 if there aren't any campaigns that match the given ids.
          content:
            application/json:
              schema:
                type: object
                properties:
                  campaign_id:
                    type: string
                    format: uuid
                    description: The ID of the deleted campaign.
                    example: 6b0afb65-a408-462f-944f-022281c4ab15
                  errors:
                    type: array
                    items:
                      type: string
              example:
                campaign_id: 6b0afb65-a408-462f-944f-022281c4ab15
                errors: []
  /campaign_metrics:
    servers:
      - url: https://0tizjlg161.execute-api.us-east-1.amazonaws.com
    get:
      operationId: getCampaignMetrics
      summary: Get campaign metrics
      description: |
        Returns a list of campaigns with associated performance metrics.

        If split_templates is true, metrics are split by template for A/B test campaigns.

        The base url for this endpoint is {api_campaign_gateway} in the login response payload.
      parameters:
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 5
          description: Maximum number of results to return.
        - name: sort_columns
          in: query
          required: false
          schema:
            type: string
            example: created_at DESC
          description: Columns and sort order.
        - name: split_templates
          in: query
          required: false
          schema:
            type: boolean
            example: true
          description: Whether to split metrics by template.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  campaigns_with_metrics:
                    type: array
                    items:
                      $ref: '#/components/schemas/CampaignWithMetrics'
                  errors:
                    type: array
                    items:
                      type: string
              example:
                campaigns_with_metrics:
                  - campaign:
                      id: 12345678-1234-1234-1234-123456789012
                      name: 11am chicago
                      type: scheduled_email_group
                      workflow_ids: null
                      template_ids: null
                      scheduled_email_blast_group_ids: []
                      created_at: "2026-09-06T16:03:38Z"
                      updated_at: "2026-09-06T16:03:38Z"
                    template_id: ""
                    template_name: ""
                    sends: 500
                    opens: 0
                    clicks: 0
                    bounces: 0
                    unsuccessful_sends: 0
                    unsubscribes: 0
                    complaints: 0
                errors: []
  /campaign_metrics/count:
    servers:
      - url: https://0tizjlg161.execute-api.us-east-1.amazonaws.com
    get:
      operationId: getCampaignMetricsCount
      summary: Get campaign count
      description: |
        Returns the total number of campaigns.

        If `split_templates` is true, counts are split by template for A/B test campaigns.

        The base url for this endpoint is {api_campaign_gateway} in the login response payload.
      parameters:
        - name: split_templates
          in: query
          required: false
          schema:
            type: boolean
            example: true
          description: Whether to split the count by template.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  num_campaigns:
                    type: integer
                    description: Total number of campaigns.
                    example: 14
                  errors:
                    type: array
                    items:
                      type: string
              example:
                num_campaigns: 14
                errors: []
  /company_users:
    servers:
      - url: https://vpvnqvk5l5.execute-api.us-east-1.amazonaws.com
    get:
      operationId: getCompanyUsers
      summary: Get users for your account.
      description: |
        Returns a list of admin users associated with your account.  All users are admin users, with anti-delete protections on the first user who signed up.

        The base url for this endpoint is {api_companyauthwrapper_gateway} in the login response payload.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully retrieved company users
          content:
            application/json:
              schema:
                type: object
                properties:
                  company_users:
                    type: array
                    items:
                      $ref: '#/components/schemas/CompanyUser'
                  errors:
                    type: array
                    items:
                      type: string
              example:
                company_users:
                  - id: 12312312-1234-1234-1234-123123123456
                    company_id: 12312312-1234-1234-1234-123123123456
                    project_id: 12312312-1234-1234-1234-123123123456
                    first_name: Demo
                    last_name: User
                    email: demouser@swiftmissive.com
                    password_reset_at: null
                    created_at: "2023-03-19T17:31:52.998906Z"
                    updated_at: "2023-03-19T17:31:52.998906Z"
                    json: {}
                errors: []
    delete:
      operationId: deleteCompanyUser
      summary: Delete a company user
      description: |
        Deletes a user from a specific company and project.

        The base url for this endpoint is {api_companyauthwrapper_gateway} in the login response payload.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                company_name:
                  type: string
                  description: Name of the company the user belongs to.
                  example: ""
                project_name:
                  type: string
                  description: Name of the project the user belongs to.
                  example: ""
                company_user:
                  $ref: '#/components/schemas/CompanyUser'
            example:
              company_name: ""
              project_name: ""
              company_user:
                id: 12312312-1234-1234-1234-123123123456
                company_id: 12312312-1234-1234-1234-123123123456
                project_id: 12312312-1234-1234-1234-123123123456
                first_name: newuserfirstname3
                last_name: newuserlastname3
                email: newuseremail3@email.com
                password_reset_at: null
                created_at: null
                updated_at: null
                json:
                  addedAt: "2026-09-13T18:43:06.357Z"
                  addedBy: yourteammate@yourcompany.com
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully deleted company user (no response body)
    post:
      operationId: createCompanyUser
      summary: |
        Create an admin user with full access to your account.

        The base url for this endpoint is {api_companyauthwrapper_gateway} in the login response payload.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                company_name:
                  description: "Use _, for now.  Will be removed in a future release."
                  type: string
                  example: "_"
                project_name:
                  description: "Use _, for now.  Will be removed in a future release."
                  type: string
                  example: "_"
                company_user:
                  $ref: '#/components/schemas/CompanyUserCreate'
                password:
                  type: string
                  description: Initial password for the new user.
                  example: newuserpassword
            example:
              company_name: _
              project_name: _
              company_user:
                first_name: newuserfirstname3
                last_name: newuserlastname3
                email: newuseremail3@email.com
                json:
                  addedBy: dave+testbiz6@swiftmissive.com
                  addedAt: "2026-09-13T18:43:06.357Z"
              password: newuserpassword
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully created company user
          content:
            application/json:
              schema:
                type: object
                properties:
                  company_user:
                    $ref: '#/components/schemas/CompanyUser'
                  errors:
                    type: array
                    items:
                      type: string
              example:
                company_user:
                  id: 12312312-1234-1234-1234-123123123456
                  company_id: 12312312-1234-1234-1234-123123123456
                  project_id: 12312312-1234-1234-1234-123123123456
                  first_name: newuserfirstname3
                  last_name: newuserlastname3
                  email: newuseremail3@email.com
                  password_reset_at: null
                  created_at: null
                  updated_at: null
                  json:
                    addedAt: "2026-09-13T18:43:06.357Z"
                    addedBy: dave+testbiz6@swiftmissive.com
                errors: []
  /domains:
    servers:
      - url: https://7wx01j0vlc.execute-api.us-east-1.amazonaws.com
    post:
      operationId: registerDomainWithSwiftMissive
      summary: Register the domain your sender personas will use.
      description: |
        This endpoint tells Swift Missive that you will be using a certain domain to send emails from.

        The base url for this endpoint is https://7wx01j0vlc.execute-api.us-east-1.amazonaws.com

        For example, if you are going to send emails as dave@mycompany.com, then you would tell us the domain mycompany.com using this endpoint.

        **Important**
        1. You will need to use the company_name and project_name that is in the response payload of the /login endpoint for this request.
        In other words, after you log in you need to parse the payload that is returned for those keys.  They may or may not match
        what you typed into the signup form.

        2. Once a domain is registered, you can get the setup keys that you will need to place in your DNS settings to
        prove ownership of you domains to the various anti-spam gatekeepers on the internet (ISPs, etc).

        See this page for more details as well as a list of links to provider-specific DNS settings instructions: https://swiftmissive.com/account/domains

        3. Setting up DNS keys for DKIM is important (which is why you want to use this endpoint to tell us a domain name), but so are DMARC keys in your DNS settings for your sending domain.  See this page for more info on setting up DMARC keys: https://swiftmissive.com/account/domains
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - domain
                - company_name
                - project_name
              properties:
                domain:
                  type: string
                  description: The domain name to register.
                  example: testingdomainsetup.com
                company_name:
                  type: string
                  description: |
                    Use the value of the company_name you receive in the response payload from the /login endpoint for this.
                  example: davestestcompanyr12
                project_name:
                  type: string
                  description: |
                    Use the value of the project_name you receive in the response payload from the /login endpoint for this.
                  example: default
            example:
              domain: testingdomainsetup.com
              company_name: davestestcompanyr12
              project_name: default
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully registered domain
          content:
            application/json:
              schema:
                type: object
                properties:
                  domains:
                    type: array
                    description: List of all domains currently registered for the company/project.
                    items:
                      type: string
                  errors:
                    type: array
                    items:
                      type: string
              example:
                domains:
                  - swiftmissive.com
                  - testingdomainsetup.com
                errors: []
  /dkim:
    servers:
      - url: https://7wx01j0vlc.execute-api.us-east-1.amazonaws.com
    get:
      summary: Get DKIM tokens and status
      description: |
        Returns DKIM tokens and verification status for domains associated with a specific company and project.

        The base url for this endpoint is https://7wx01j0vlc.execute-api.us-east-1.amazonaws.com

          **Important**
        You will need to use the company_name and project_name that is in the response payload of the /login endpoint for this request.
        In other words, after you log in you need to parse the payload that is returned for those keys.  They may or may not match
        what you typed into the signup form.
      operationId: getDkimStatus
      parameters:
        - name: company_name
          in: query
          required: true
          schema:
            type: string
          description: Name of the company to retrieve DKIM data for.
          example: davestestcompanyr12
        - name: project_name
          in: query
          required: true
          schema:
            type: string
          description: Name of the project to retrieve DKIM data for.
          example: default
      security:
        - apiKeyAuth: []
      responses:
        '200':
          description: Successfully retrieved DKIM tokens and status
          content:
            application/json:
              schema:
                type: object
                properties:
                  keys:
                    type: object
                    additionalProperties:
                      type: array
                      items:
                        type: string
                  domains:
                    type: object
                    additionalProperties:
                      type: object
                      properties:
                        DkimEnabled:
                          type: boolean
                        DkimTokens:
                          type: array
                          items:
                            type: string
                        DkimVerificationStatus:
                          type: string
                  errors:
                    type: array
                    items:
                      type: string
              example:
                keys:
                  testingdomain.com:
                    - abcdef
                    - bcdefg
                    - hijklm
                domains:
                  testingdomain.com:
                    DkimEnabled: true
                    DkimTokens:
                      - ijklmn
                      - jklmno
                      - klmnop
                    DkimVerificationStatus: Pending
                errors: []
  /emit_send_single_email_event:
    servers:
      - url: https://eelyk87zzb.execute-api.us-east-1.amazonaws.com
    post:
      operationId: sendTesterEmail
      summary: Sends a single email
      description: |
        Sends a single email to the specified address, for testing purposes.  If the user is in the sandbox,
        the "to address" must be "success@simulator.amazonses.com" or the address of a verified sender persona.

        From-address must always be a verified sender persona's email address.

        This endpoint should be used to send test email to verify the look of templates within a contact's actual inbox.

        If you need to send a lot of emails, schedule an email blast instead.

        Always send the entire html_body of the template for the body parameter.

        The base url for this endpoint is {api_event_gateway} in the login response payload.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                mailer_payload:
                  type: object
                  properties:
                    is_test_email:
                      type: boolean
                      description: "Must be 'true'"
                    template_type:
                      type: string
                      example: marketing
                    from:
                      type: object
                      properties:
                        email:
                          type: string
                          format: email
                          description: Must be the email address of a verified sender persona
                        name:
                          type: string
                        user_id:
                          type: string
                          format: uuid
                    to:
                      type: array
                      items:
                        type: object
                        properties:
                          email:
                            type: string
                            format: email
                            description: For users whose accounts are in the sandbox, must be the email address of a verified sender persona or success@simulator.amazonses.com, success+1@simulator.amazonses.com, etc.
                          user_id:
                            type: string
                            format: uuid
                          name:
                            type: string
                    body:
                      type: string
                      description: HTML body of the email
              required:
                - mailer_payload
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: Wrong email and/or password provided.
        '403':
          description: Wrong email and/or password provided.
        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  errors:
                    type: array
                    items:
                      type: string
                  not_in_sandbox:
                    type: boolean
              example:
                errors: []
  /events:
    servers:
      - url: https://eelyk87zzb.execute-api.us-east-1.amazonaws.com
    post:
      operationId: createEvent
      summary: Create events
      description: |
        Creates one or more events, optionally including associated user information and custom JSON metadata.

        The base url for this endpoint is {api_event_gateway} in the login response payload.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                events:
                  type: array
                  items:
                    $ref: '#/components/schemas/EventCreate'
            example:
              events:
                - name: event_name
                  email: success+new15536@simulator.amazonses.com
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully created event(s)
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Event'
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data:
                  - id: 12345678-1234-1234-1234-123456789012
                    name: event_name
                    user_id: 12345678-1234-1234-1234-123456789012
                    email: success+new15536@simulator.amazonses.com
                    user: {}
                    json: {}
                    metric1: 0
                    metric2: 0
                    metric3: 0
                    emitted_at: "2026-09-13T19:22:30.324685984Z"
                    created_at: "2026-09-13T19:22:30.324685905Z"
                errors: []
  /joblog:
    servers:
      - url: https://t4oia5mt79.execute-api.us-east-1.amazonaws.com
    get:
      operationId: getJobs
      summary: Get job log entries
      description: |
        Returns a list of job execution logs, including job details, worker information, and execution metadata.

        The base url for this endpoint is {api_joblog_gateway} in the login response payload.
      parameters:
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 100
          description: Maximum number of job log entries to return.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/JobLogEntry'
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data:
                  - id: 12345678-1234-1234-1234-123456789012
                    job_name: JOB_DISTRIBUTE_SCHEDULED_EMAIL_PART
                    worker_id: 12345678-1234-1234-1234-123456789012
                    worker_type: scheduled one-off email job distributor
                    success: true
                    start_details:
                      id_max: 7569279
                      id_min: 7569279
                      payload:
                        bcc_to_user_ids: null
                        cc_to_user_ids: null
                        sender_persona_id: 12345678-1234-1234-1234-123456789019
                        template_id: 12345678-1234-1234-1234-123456789012
                        template_ids_with_weights: null
                        timezone: America/Chicago
                        to_segment_ids:
                          - 12345678-1234-1234-1234-123456789012
                        to_user_emails: null
                        to_user_ids: null
                      scheduled_email_group_id: 12345678-1234-1234-1234-123456789012
                      scheduled_email_id: 12345678-1234-1234-1234-123456789012
                      segment_id: 12345678-1234-1234-1234-123456789012
                    end_details: null
                    started_at: "2026-09-06T21:00:31Z"
                    ended_at: "2026-09-06T21:00:31Z"
                errors: []
  /mostclickedlinks:
    get:
      operationId: getMostClickedLinksReportingData
      summary: Get most clicked links
      description: |
        Returns a list of the most clicked links for the specified campaign, including click counts and related metadata.

        The base url for this endpoint is {api_reporting_gateway} in the login response payload.
      parameters:
        - name: campaign_id
          in: query
          required: true
          schema:
            type: string
            example: all
          description: Campaign identifier or `all` for all campaigns.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/MostClickedLink'
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data:
                  - campaign_id: all
                    email_subject: this is a tester template
                    link_url: https://swiftmissive.com
                    num_clicks: 1
                    num_unique_clicks: 1
                    template_id: 12345678-1234-1234-1234-123456789012
                errors: []
  /mostopenedemails:
    servers:
      - url: https://j81hkcd9lh.execute-api.us-east-1.amazonaws.com
    get:
      operationId: getMostOpenedEmailsReportingData
      summary: Get most opened emails
      description: |
        Returns a list of the most opened emails for the specified campaign, grouped by the specified field.

        The base url for this endpoint is {api_reporting_gateway} in the login response payload.
      parameters:
        - name: campaign_id
          in: query
          required: true
          schema:
            type: string
            example: all
          description: Campaign identifier or `all` for all campaigns.
        - name: by
          in: query
          required: false
          schema:
            type: string
            example: subject
          description: Field to group results by (e.g., `subject`).
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
          description: Maximum number of results to return.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/MostOpenedEmail'
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data:
                  - campaign_id: all
                    email_subject: this is a tester template
                    num_opens: 6
                    num_unique_opens: 1
                    template_id: 12345678-1234-1234-1234-123456789012
                errors: []
  /opensbysource:
    servers:
      - url: https://j81hkcd9lh.execute-api.us-east-1.amazonaws.com
    get:
      operationId: getOpensBySourceReportingData
      summary: Get open statistics grouped by source
      description: |
        Returns aggregated open and click statistics grouped by the specified source type (e.g. domain).

        The base url for this endpoint is {api_reporting_gateway} in the login response payload.
      parameters:
        - name: campaign_id
          in: query
          required: true
          schema:
            type: string
            example: 12345678-1234-1234-1234-123456789012
          description: Campaign identifier or `all` for all campaigns.
        - name: by
          in: query
          required: true
          schema:
            type: string
            example: domain
          description: Field to group results by (e.g. `domain`).
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10000
          description: Maximum number of results to return.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/OpenBySource'
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data:
                  - campaign_id: all
                    num_clicks: 0
                    num_opens: 2
                    num_unique_clicks: 0
                    num_unique_opens: 1
                    to_domain: other
                  - campaign_id: 12345678-1234-1234-1234-123456789012
                    num_clicks: 3
                    num_opens: 14
                    num_unique_clicks: 1
                    num_unique_opens: 1
                    to_domain: gmail.com
                errors: []
  /quickstats:
    get:
      operationId: getQuickStatus
      summary: Get quick statistics for a campaign
      description: |
        Returns aggregated counts for various event types for the specified campaign.

        The base url for this endpoint is {api_reporting_gateway} in the login response payload.
      parameters:
        - name: campaign_id
          in: query
          required: true
          schema:
            type: string
            example: all
          description: Campaign identifier or `all` for all campaigns.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/QuickStat'
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data:
                  - campaign_id: all
                    name: email_send_result_success
                    num: 51549
                    num_unique: 32784
                  - campaign_id: all
                    name: ses_event_bounce
                    num: 4021
                    num_unique: 2001
                  - campaign_id: all
                    name: ses_event_click
                    num: 2
                    num_unique: 1
                  - campaign_id: 12345678-1234-1234-1234-123456789012
                    name: ses_event_open
                    num: 15
                    num_unique: 2
                  - campaign_id: 12345678-1234-1234-1234-123456789012
                    name: user_unsubscribed
                    num: 6
                    num_unique: 4
                errors: []
  /recentlyclickedlinks:
    servers:
      - url: https://j81hkcd9lh.execute-api.us-east-1.amazonaws.com
    get:
      operationId: getRecentlyClickedLinksReportingData
      summary: Get recently clicked links
      description: |
        Returns a list of the most recently clicked links for the specified campaign.

        The base url for this endpoint is {api_reporting_gateway} in the login response payload.
      parameters:
        - name: campaign_id
          in: query
          required: true
          schema:
            type: string
            example: all
          description: Campaign identifier or `all` for all campaigns.
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 5
          description: Maximum number of results to return.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/RecentlyClickedLink'
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data:
                  - campaign_id: all
                    email: myfromaddress@gmail.com
                    email_subject: this is a tester template
                    emitted_at: "2026-09-12T19:04:27Z"
                    link_url: https://swiftmissive.com
                    user_id: 4b55aad8-b4de-7d19-31ca-59c66fe636bb
                errors: []
  /recentlyopenedemails:
    servers:
      - url: https://j81hkcd9lh.execute-api.us-east-1.amazonaws.com
    get:
      summary: Get recently opened emails
      description: |
        Returns a list of recently opened emails across campaigns.

        The base url for this endpoint is {api_reporting_gateway} in the login response payload.
      operationId: getRecentlyOpenedEmails
      parameters:
        - name: campaign_id
          in: query
          required: true
          schema:
            type: string
          description: Campaign identifier to filter opened emails. Use "all" to include all campaigns.
          example: all
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
          description: Maximum number of opened email records to return.
          example: 10
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully retrieved recently opened emails
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/OpenedEmail'
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data:
                  - campaign_id: all
                    email: myfromaddress@gmail.com
                    email_subject: this is a tester template
                    emitted_at: "2025-09-12T19:04:26Z"
                    template_id: 12345678-1234-1234-1234-123456789012
                    user_id: 12345678-1234-1234-1234-123456789012
                errors: []
  /scheduler:
    servers:
      - url: https://qq4v4cfbq7.execute-api.us-east-1.amazonaws.com
    post:
      operationId: createEmailBlast
      summary: Create a scheduled email job
      description: |
        Creates a scheduled email job with the specified recipients, template, sender persona, and send time, and enabled it for automatic sending.

        The base url for this endpoint is {api_scheduler_gateway} in the login response payload.

        **Important**
        1. Email blasts can't be edited, only create and disabled.
        2. To create a blast, you must generate an ID for the scheduled email blast and pass it into the API.
        3. On the documentation page, the IDs provided are not associated with actual templates, etc, so you will have to find real IDs to pass in via the other endpoints.

      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SchedulerCreateRequest'
            example:
              id: 12345678-1234-1234-1234-123456789011
              name: new blast name
              template_ids_with_weights: []
              template_id: 12345678-1234-1234-1234-123456789012
              sender_persona_id: 12345678-1234-1234-1234-123456789012
              to_segment_ids:
                - 12345678-1234-1234-1234-123456789012
              to_user_ids:
                - 12345678-1234-1234-1234-123456789011
                - 12345678-1234-1234-1234-123456789012
              send_at: "2026-09-13T18:30:00.000Z"
              send_in_users_timezone: false
              timezone: America/Denver
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully created and enabled the scheduled email job.  It will now go out automatically as scheduled.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/ScheduledEmailJob'
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data:
                  id: 12345678-1234-1234-1234-123456789011
                  name: new blast name
                  enabled: false
                  created_at: "2026-09-13T16:25:14.218805697Z"
                  send_at: "2026-09-13T18:30:00Z"
                  send_in_users_timezone: false
                  sent_at_per_timezone: null
                  scheduled_emails:
                    - id: 12345678-1234-1234-1234-123456789011
                      group_id: 12345678-1234-1234-1234-123456789011
                      segment_id: 12345678-1234-1234-1234-123456789011
                      name: new blast name
                      created_at: "2026-09-13T16:25:14.363287753Z"
                      send_at: "2026-09-13T18:30:00Z"
                      send_in_users_timezone: false
                      sent_at_per_timezone: null
                      payload:
                        to_segment_ids:
                          - 12345678-1234-1234-1234-123456789011
                        to_user_ids: null
                        to_user_emails: null
                        cc_to_user_ids: null
                        bcc_to_user_ids: null
                        sender_persona_id: 12345678-1234-1234-1234-123456789012
                        template_id: 12345678-1234-1234-1234-123456789012
                        template_ids_with_weights: null
                        timezone: America/Denver
                      claimed_by: ""
                      claimed_at: "0001-01-01T00:00:00Z"
                  payload:
                    to_segment_ids:
                      - 12345678-1234-1234-1234-123456789011
                    to_user_ids:
                      - 12345678-1234-1234-1234-123456789011
                      - 12345678-1234-1234-1234-123456789012
                    to_user_emails: null
                    cc_to_user_ids: null
                    bcc_to_user_ids: null
                    sender_persona_id: 12345678-1234-1234-1234-123456789012
                    template_id: 12345678-1234-1234-1234-123456789012
                    template_ids_with_weights: []
                    timezone: America/Denver
                errors: []

    get:
      operationId: getEmailBlasts
      summary: Get scheduled email jobs
      description: |
        Returns a list of scheduled email jobs, including their configuration, payload, and associated scheduled emails.

        The base url for this endpoint is {api_scheduler_gateway} in the login response payload.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully retrieved scheduled jobs
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/ScheduledEmailJob'
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data:
                  - id: 12345678-1234-1234-1234-123456789011
                    name: 11am chi
                    enabled: true
                    created_at: "2026-09-06T16:03:38.410822Z"
                    send_at: "2026-09-06T11:00:00Z"
                    send_in_users_timezone: true
                    sent_at_per_timezone: null
                    scheduled_emails:
                      - id: 12345678-1234-1234-1234-123456789011
                        group_id: 12345678-1234-1234-1234-123456789011
                        segment_id: 12345678-1234-1234-1234-123456789011
                        name: 11am chi
                        created_at: "2026-09-06T16:03:38Z"
                        send_at: "2026-09-06T11:00:00Z"
                        send_in_users_timezone: true
                        sent_at_per_timezone: null
                        payload:
                          to_segment_ids:
                            - 12345678-1234-1234-1234-123456789011
                          to_user_ids: null
                          to_user_emails: null
                          cc_to_user_ids: null
                          bcc_to_user_ids: null
                          sender_persona_id: 12345678-1234-1234-1234-123456789012
                          template_id: 12345678-1234-1234-1234-123456789012
                          template_ids_with_weights: null
                          timezone: ""
                        claimed_by: ""
                        claimed_at: "0001-01-01T00:00:00Z"
                    payload:
                      to_segment_ids:
                        - 12345678-1234-1234-1234-123456789011
                      to_user_ids: null
                      to_user_emails: null
                      cc_to_user_ids: null
                      bcc_to_user_ids: null
                      sender_persona_id: 12345678-1234-1234-1234-123456789012
                      template_id: 12345678-1234-1234-1234-123456789012
                      template_ids_with_weights: []
                      timezone: "Contact’s local timezone"
                errors: []

  /scheduler/{id}:
    servers:
      - url: https://qq4v4cfbq7.execute-api.us-east-1.amazonaws.com
    delete:
      operationId: disableEmailBlast
      summary: Disables a scheduled email blast
      description: |
        Disables a scheduled email blast so that it won't send any emails.

        Scheduled email blasts can't be edited, so you will have to disable then recreate them if you want to make updates.

        The base url for this endpoint is {api_scheduler_gateway} in the login response payload.
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
            example: 12345678-1234-1234-1234-123456789012
          description: The id of the email blast to disable.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully disabled the email blast
          content:
            application/json:
              schema:
                type: object
                properties:
                  errors:
                    type: array
                    items:
                      type: string
              example:
                errors: []
  /segments:
    servers:
      - url: https://kic9awt2l8.execute-api.us-east-1.amazonaws.com
    post:
      operationId: createSegment
      summary: Create a new empty segment.
      description: |
        Creates a new segment with no contacts assigned to it, or updates an existing segment name.

        The base url for this endpoint is {api_segment_gateway} in the login response payload.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                segments:
                  type: array
                  items:
                    $ref: '#/components/schemas/SegmentCreate'
            example:
              segments:
                - name: empty segment name
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully created segment.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Segment'
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data:
                  - id: 761ff558-adc5-4a3b-9a0b-57c93dbe694b
                    name: empty segment name
                    user_ids: []
                    num_users: 0
                    version: "2026-09-12T19:42:00.629917429Z"
                    invisible: false
                    created_at: "2026-09-12T19:42:00.629917429Z"
                    updated_at: "2026-09-12T19:42:00.629917429Z"
                errors: []

    get:
      operationId: getSegments
      summary: Get segments
      description: |
        Returns a list of segments with optional pagination, sorting, and filtering.

        The base url for this endpoint is {api_segment_gateway} in the login response payload.
      parameters:
        - name: sort_columns
          in: query
          required: false
          schema:
            type: string
            example: created_at DESC
          description: Columns and sort order.
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
          description: Maximum number of results to return.
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            example: 10
          description: Number of results to skip before starting to collect the result set.
        - name: enabled
          in: query
          required: false
          schema:
            type: boolean
            example: true
          description: Set to true to only retrieve enabled segments, false to retrieve only disabled segments, and leave it blank to receive both.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Segment'
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data:
                  - id: ee9d4a89-138b-42b1-07a7-caaf42057d8a
                    name: filter tester segment
                    user_ids: null
                    num_users: 379
                    version: "2026-03-18T04:15:48Z"
                    invisible: false
                    created_at: "2026-03-18T04:15:48Z"
                    updated_at: "2026-06-09T21:44:28.061837Z"
                errors: []
  /segments/create_from_filters:
    servers:
      - url: https://epbvzjh61e.execute-api.us-east-1.amazonaws.com
    post:
      operationId: createSegmentFromFilters
      summary: Create a segment from filtered users
      description: |
        Filters users based on specified criteria and creates a new segment containing the matched users.

        The base url for this endpoint is {api_segmentwrapper_gateway} in the login response payload.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - conjunction
                - user_filters
                - name
              properties:
                conjunction:
                  type: string
                  enum: [and, or]
                  example: or
                  description: Logical operator to apply across filters.
                user_filters:
                  type: array
                  items:
                    $ref: '#/components/schemas/UserFilter'
                name:
                  type: string
                  example: new segment name
                  description: Name of the new segment to be created.
            example:
              conjunction: or
              user_filters:
                - attribute: contact_email
                  operator: contains
                  values:
                    - success+133241
                  nodeKey: 1bd1f717-377d-477c-8cab-b02ec3de19c2
              name: new segment name
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '201':
          description: Successfully scheduled create-segment-from-filters job.
          content:
            application/json:
              schema:
                type: object
                properties:
                  num_users:
                    type: integer
                    description: Number of users added to the new segment.
                    example: 11
                  errors:
                    type: array
                    items:
                      type: string
              example:
                num_users: 11
                errors: []
  /segments/filter_users:
    servers:
      - url: https://kic9awt2l8.execute-api.us-east-1.amazonaws.com
    post:
      operationId: previewFilteredUsers
      summary: Filter users by segment attributes
      description: |
        Returns users matching complex filter criteria, including segment membership and custom attributes.

        The base url for this endpoint is {api_segment_gateway} in the login response payload.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                conjunction:
                  type: string
                  enum: [and, or]
                  example: or
                  description: Logical operator to apply across filters.
                user_filters:
                  type: array
                  items:
                    $ref: '#/components/schemas/UserFilter'
                limit:
                  type: integer
                  example: 100
                  description: Maximum number of users to return.
                offset:
                  type: integer
                  example: 0
                  description: Number of users to skip before collecting results.
            example:
              conjunction: or
              user_filters:
                - attribute: num_in_segment
                  operator: greater_than
                  values:
                    - 0
                    - 12345678-1234-1234-1234-123456789012
                  nodeKey: 12345678-1234-1234-1234-123456789012
              limit: 100
              offset: 0
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully filtered users
          content:
            application/json:
              schema:
                type: object
                properties:
                  users:
                    type: array
                    items:
                      $ref: '#/components/schemas/User'
                  total_users:
                    type: integer
                    description: Total number of users matching the filter.
                  errors:
                    type: array
                    items:
                      type: string
              example:
                users:
                  - id: 23b2ef24-9018-11eb-dc05-f47896c46d3d
                    email: success+1187777@simulator.amazonses.com
                    first_name: FName
                    last_name: LName
                    date_of_birth: null
                    timezone: America/Chicago
                    json:
                      extrafield1: harrr
                      extrafield2: howdy
                    created_at: "2024-04-08T15:09:59Z"
                    unsubscribed_at: null
                    email_validated_at: null
                    email_validation_result_string: valid
                total_users: 750
                errors: []
  /segments/{id}/users:
    servers:
      - url: https://kic9awt2l8.execute-api.us-east-1.amazonaws.com
    post:
      operationId: addUserToSegment
      summary: Add users to a segment
      description: |
        Adds one or more users to the specified segment by user ID or email.

        The base url for this endpoint is {api_segment_gateway} in the login response payload.
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
            example: 761ff558-adc5-4a3b-9a0b-57c93dbe694b
          description: The UUID of the segment to which the users will be added.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                user_ids:
                  type: array
                  description: List of user UUIDs to add to the segment.
                  items:
                    type: string
                    format: uuid
                emails:
                  type: array
                  description: List of user email addresses to add to the segment.
                  items:
                    type: string
                    format: email
            example:
              user_ids:
                - 4eaaec96-da1a-a2d2-b1c7-41af14604082
              emails: []
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully added user(s) to the segment
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: boolean
                    description: Indicates whether the operation was successful.
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data: true
                errors: []
  /segments/{segment_id}/users/{user_id}:
    servers:
      - url: https://kic9awt2l8.execute-api.us-east-1.amazonaws.com
    delete:
      operationId: archiveUser
      summary: Remove a user from a segment
      description: |
        Removes a specific user from the specified segment.

        The base url for this endpoint is {api_segment_gateway} in the login response payload.
      parameters:
        - name: segment_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
            example: 761ff558-adc5-4a3b-9a0b-57c93dbe694b
          description: The UUID of the segment.
        - name: user_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
            example: 4eaaec96-da1a-a2d2-b1c7-41af14604082
          description: The UUID of the user to remove from the segment.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully removed the user from the segment
          content:
            application/json:
              schema:
                type: object
                properties:
                  user_id_to_segment_id:
                    type: object
                    additionalProperties:
                      type: string
                      format: uuid
                    description: Mapping of removed user IDs to the segment ID they were removed from.
                  errors:
                    type: array
                    items:
                      type: string
              example:
                user_id_to_segment_id:
                  "4eaaec96-da1a-a2d2-b1c7-41af14604082": "761ff558-adc5-4a3b-9a0b-57c93dbe694b"
                errors: []
  /segments/upload_url:
    servers:
      - url: https://epbvzjh61e.execute-api.us-east-1.amazonaws.com
    get:
      operationId: getSignedUploadURL
      summary: Get contact-file upload URL for bulk processing.
      description: |
        Returns a pre-signed S3 URL for uploading a contacts file to the system.  Once you receive a URL, you can upload a file to it using a PUT request to trigger bulk contact processing.  Filenames must match!

        You can check the status of your upload by querying the /bulk_upload_status endpoint.

        The base url for this endpoint is {api_segmentwrapper_gateway} in the login response payload.
      parameters:
        - name: filename
          in: query
          required: true
          schema:
            type: string
            example: abc.csv 2026-09-12-89cca5bd
          description: Name of the file to be uploaded.
        - name: type
          in: query
          required: true
          schema:
            type: string
            example: text/csv
          description: MIME type of the file to be uploaded.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully generated S3 upload URL
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: string
                    format: uri
                    description: Pre-signed S3 URL for uploading the file.
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data: "https://mycompanyname.s3.amazonaws.com/customer-uploads/abc.csv%202026-09-12-89cca5bd"
                errors: []
  /templates/images/upload_url:
    servers:
      - url: https://7wrt3amkq3.execute-api.us-east-1.amazonaws.com
    get:
      operationId: generateTemplateImageUploadURL
      summary: |
        Generates a signed upload url that you can send PUBLIC images to, for special use cases.  All email-embedded images
        must be public.  You should use an HTTP PUT with a payload of the image's bytes when uploading the image.

        Favor the one-shot putPublicTemplateImage operation when possible.

        The base url for this endpoint is {api_template_gateway} in the login response payload.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was probably caused by client input.
        '401':
          description: An authentication error occurred.  Usually this means the wrong API key was passed in.
        '403':
          description: An authentication error occurred.  Usually this means the wrong API key was passed in.
        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully generated a safe URL to upload images to.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: string
                    description: The url you can upload to.  This is probably a presigned amazon s3 url.
                    items:
                      type: string
                      format: url
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data: "https://swiftmissive.com/myuploadurl"
                errors: []
  /templates/images/upload:
    servers:
      - url: https://5g4hhc2dm9.execute-api.us-east-1.amazonaws.com
    put:
      operationId: putPublicTemplateImage
      summary: |
        Receives file uploads for use in email templates.  Images will be publicly hosted one Swift Missive's servers.  Returns the url of the public image.

        DO NOT use svg files as they do not show up in most email clients.

        The base url for this endpoint is {api_template_wrapper_gateway} in the login response payload.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                file_content_type:
                  type: string
                  example: image/png
                file_name:
                  type: string
                file_bytes_base64_encoded:
                  type: string
                  format: base64
      parameters:
        - name: X-File-Name
          in:  header
          required: true
          schema:
            type: string
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was probably caused by client input.
        '401':
          description: An authentication error occurred.  Usually this means the wrong API key was passed in.
        '403':
          description: An authentication error occurred.  Usually this means the wrong API key was passed in.
        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully generated a safe URL to upload images to.
          content:
            application/json:
              schema:
                type: object
                properties:
                  public_image_url:
                    type: string
                    description: The public url of the image that was uploaded.  This can be referenced in email templates.
                    items:
                      type: string
                      format: url
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data: "https://swiftmissive.com/logo.png"
                errors: []
  /templates/{id}:
    servers:
      - url: https://7wrt3amkq3.execute-api.us-east-1.amazonaws.com
    delete:
      summary: Delete a template
      description: |
        Deletes a specific email templates.

        The base url for this endpoint is {api_template_gateway} in the login response payload.
      operationId: deleteTemplateById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: Unique identifier of the template to delete.
          example: e65b8f42-cb55-4931-bbd9-89204798b08f
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was probably caused by client input.
        '401':
          description: An authentication error occurred.  Usually this means the wrong API key was passed in.
        '403':
          description: An authentication error occurred.  Usually this means the wrong API key was passed in.
        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully deleted template.  This endpoint will also return 200 if the template doesn't exist.
          content:
            application/json:
              schema:
                type: object
                properties:
                  ids:
                    type: array
                    items:
                      type: string
                      format: uuid
                  errors:
                    type: array
                    items:
                      type: string
              example:
                ids:
                  - e65b8f42-cb55-4931-bbd9-89204798b08f
                errors: []
  /sendslast24hours:
    servers:
      - url: https://j81hkcd9lh.execute-api.us-east-1.amazonaws.com
    get:
      operationId: getLast24HoursReportingData
      summary: Get send statistics for the last 24 hours
      description: |
        Returns hourly email campaign statistics for the last 24 hours.

        The base url for this endpoint is {api_reporting_gateway} in the login response payload.
      parameters:
        - name: campaign_id
          in: query
          required: true
          schema:
            type: string
            example: all
          description: Campaign identifier or `all` for all campaigns.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  Usually this means the wrong API key was passed in.
        '403':
          description: An authentication error occurred.  Usually this means the wrong API key was passed in.
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        bounces:
                          type: integer
                          example: 0
                        campaign_id:
                          type: string
                          example: all
                        campaign_name:
                          type: string
                          example: All
                        clicks:
                          type: integer
                          example: 0
                        complaints:
                          type: integer
                          example: 0
                        emitted_at_trunc:
                          type: string
                          format: date-time
                          example: 2026-09-11T17:00:00Z
                        opens:
                          type: integer
                          example: 0
                        sends:
                          type: integer
                          example: 3
                        unsubscribes:
                          type: integer
                          example: 0
                        unsuccessful_sends:
                          type: integer
                          example: 0
                  errors:
                    type: array
              example:
                data:
                  - bounces: 0
                    campaign_id: all
                    campaign_name: All
                    clicks: 0
                    complaints: 0
                    emitted_at_trunc: "2026-09-11T17:00:00Z"
                    opens: 0
                    sends: 0
                    unsubscribes: 0
                    unsuccessful_sends: 0
                  - bounces: 0
                    campaign_id: all
                    campaign_name: All
                    clicks: 0
                    complaints: 0
                    emitted_at_trunc: "2026-09-11T18:00:00Z"
                    opens: 0
                    sends: 3
                    unsubscribes: 0
                    unsuccessful_sends: 0
  /sendslast31days:
    servers:
      - url: https://j81hkcd9lh.execute-api.us-east-1.amazonaws.com
    get:
      operationId: getLast31DaysReportingData
      summary: Get email related statistics for the last 31 days
      description: |
        Returns daily statistics for the last 31 days.  Can handle campaign-related and non-campaign-related stats.

        The base url for this endpoint is {api_reporting_gateway} in the login response payload.
      parameters:
        - name: campaign_id
          in: query
          required: false
          schema:
            type: string
            example: all
          description: Campaign identifier or `all` for all campaigns.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  Usually this means the wrong API key was passed in.
        '403':
          description: An authentication error occurred.  Usually this means the wrong API key was passed in.
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        bounces:
                          type: integer
                          example: 0
                        campaign_id:
                          type: string
                          example: all
                        campaign_name:
                          type: string
                          example: All
                        clicks:
                          type: integer
                          example: 0
                        complaints:
                          type: integer
                          example: 0
                        emitted_at_trunc:
                          type: string
                          format: date-time
                          example: 2026-08-12T00:00:00Z
                        opens:
                          type: integer
                          example: 0
                        sends:
                          type: integer
                          example: 0
                        unsubscribes:
                          type: integer
                          example: 0
                        unsuccessful_sends:
                          type: integer
                          example: 0
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data:
                  - bounces: 0
                    campaign_id: all
                    campaign_name: All
                    clicks: 0
                    complaints: 0
                    emitted_at_trunc: "2026-08-12T00:00:00Z"
                    opens: 0
                    sends: 0
                    unsubscribes: 0
                    unsuccessful_sends: 0
                  - bounces: 0
                    campaign_id: all
                    campaign_name: All
                    clicks: 0
                    complaints: 0
                    emitted_at_trunc: "2026-08-13T00:00:00Z"
                    opens: 0
                    sends: 0
                    unsubscribes: 0
                    unsuccessful_sends: 0
  /sender_personas:
    servers:
      - url: https://nuwayagcj1.execute-api.us-east-1.amazonaws.com
    post:
      operationId: createSenderPersona
      summary: Create or update sender personas
      description: |
        Creates or updates sender personas and triggers an AWS SES email verification.

        The verification email must be confirmed before emails can be sent from the specified address.

        The base url for this endpoint is {api_senderpersonawrapper_gateway} in the login response payload.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                sender_personas:
                  type: array
                  items:
                    $ref: '#/components/schemas/SenderPersonaCreate'
            example:
              sender_personas:
                - id: 12345678-1234-1234-1234-123456789019
                  first_name: Dave
                  last_name: LastName
                  email: dave@fromaddress.com
                  json: {}
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully created or updated sender persona
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/SenderPersona'
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data:
                  - id: 12345678-1234-1234-1234-123456789019
                    first_name: Dave
                    last_name: LastName
                    email: dave@fromaddress.com
                    json: {}
                    version: "2026-09-12T19:59:49.887095197Z"
                    created_at: "2026-09-12T19:59:49.887095197Z"
                    updated_at: "2026-09-12T19:59:49.887095197Z"
                errors: []
    get:
      operationId: getSenderPersonas
      summary: Get sender personas
      description: |
        Returns a list of sender personas used as "from" addresses in email campaigns.

        The base url for this endpoint is {api_senderpersonawrapper_gateway} in the login response payload.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully retrieved sender personas
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/SenderPersona'
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data:
                  - id: 12345678-1234-1234-1234-123456789012
                    first_name: Demo
                    last_name: Sender
                    email: myfromaddress@gmail.com
                    json: {}
                    version: "2023-12-17T16:35:02Z"
                    created_at: "2023-12-17T16:35:02Z"
                    updated_at: "2023-12-17T16:35:02Z"
                errors: []
  /templates:
    servers:
      - url: https://7wrt3amkq3.execute-api.us-east-1.amazonaws.com
    get:
      operationId: getTemplates
      summary: Get templates
      description: |
        Returns a list of email templates.

        The base url for this endpoint is {api_template_gateway} in the login response payload.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully retrieved templates
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Template'
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data:
                  - id: 12345678-1234-1234-1234-123456789012
                    name: template 2000
                    subject: template test
                    type: TEMPLATE_MARKETING
                    enabled: false
                    html_body: HTML_CONTENT
                    plain_text_body: ""
                    channel_id: ""
                    json:
                      body: {}
                    version: "2024-06-14T17:43:06Z"
                    created_at: "2024-06-14T17:43:06Z"
                    updated_at: "2024-06-14T17:43:06Z"
                errors: []

    post:
      operationId: createTemplate
      summary: Create or update a template.
      description: |
        Creates or updates an email template.

        The base url for this endpoint is {api_template_gateway} in the login response payload.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                templates:
                  type: array
                  items:
                    $ref: '#/components/schemas/Template'

            example:
              templates:
                - name: first template name
                  subject: first template subject
                  type: TEMPLATE_MARKETING
                  enabled: true
                  html_body: This is my first template! <br><hr> <p style="color:#888"> If you’d prefer not to receive these emails, you can <a style="color:#787878" href="{{unsubscribe_link}}">unsubscribe here</a> </p>
                - name: second template name
                  subject: second template subject
                  type: TEMPLATE_MARKETING
                  enabled: true
                  html_body: This is my second template! <br><hr> <p style="color:#888"> If you’d prefer not to receive these emails, you can <a style="color:#787878" href="{{unsubscribe_link}}">unsubscribe here</a> </p>
                  json: {
                    "counters": {
                      "u_column": 1,
                      "u_row": 1,
                      "u_content_html": 1
                    },
                    "body": {
                      "id": "2wLeS1e-k_",
                      "rows": [
                        {
                          "id": "EbXHg-Mi_f",
                          "cells": [
                            1
                          ],
                          "columns": [
                            {
                              "id": "m49ruisgnb",
                              "contents": [
                                {
                                  "id": "dMWm_IZFxP",
                                  "type": "html",
                                  "values": {
                                    "html": "<hr> <p style=\"color:#888\"> If you’d prefer not to receive these emails, you can <a style=\"color:#787878\" href=\"{{unsubscribe_link}}\">unsubscribe here</a> </p>",
                                    "displayCondition": null,
                                    "_styleGuide": null,
                                    "containerPadding": "10px",
                                    "anchor": "",
                                    "_meta": {
                                      "htmlID": "u_content_html_1",
                                      "htmlClassNames": "u_content_html"
                                    },
                                    "selectable": true,
                                    "draggable": true,
                                    "duplicatable": true,
                                    "deletable": true,
                                    "hideable": true
                                  }
                                }
                              ],
                              "values": {
                                "backgroundColor": "",
                                "padding": "0px",
                                "border": {},
                                "borderRadius": "0px",
                                "_meta": {
                                  "htmlID": "u_column_1",
                                  "htmlClassNames": "u_column"
                                }
                              }
                            }
                          ],
                          "values": {
                            "displayCondition": null,
                            "columns": false,
                            "_styleGuide": null,
                            "backgroundColor": "",
                            "columnsBackgroundColor": "",
                            "backgroundImage": {
                              "url": "",
                              "fullWidth": true,
                              "repeat": "no-repeat",
                              "size": "custom",
                              "position": "center",
                              "customPosition": [
                                "50%",
                                "50%"
                              ]
                            },
                            "padding": "0px",
                            "anchor": "",
                            "hideDesktop": false,
                            "_meta": {
                              "htmlID": "u_row_1",
                              "htmlClassNames": "u_row"
                            },
                            "selectable": true,
                            "draggable": true,
                            "duplicatable": true,
                            "deletable": true,
                            "hideable": true
                          }
                        }
                      ],
                      "headers": [],
                      "footers": [],
                      "values": {
                        "_styleGuide": null,
                        "popupPosition": "center",
                        "popupWidth": "600px",
                        "popupHeight": "auto",
                        "borderRadius": "10px",
                        "contentAlign": "center",
                        "contentVerticalAlign": "center",
                        "contentWidth": "500px",
                        "fontFamily": {
                          "label": "Arial",
                          "value": "arial,helvetica,sans-serif"
                        },
                        "textColor": "#000000",
                        "popupBackgroundColor": "#FFFFFF",
                        "popupBackgroundImage": {
                          "url": "",
                          "fullWidth": true,
                          "repeat": "no-repeat",
                          "size": "cover",
                          "position": "center"
                        },
                        "popupOverlay_backgroundColor": "rgba(0, 0, 0, 0.1)",
                        "popupCloseButton_position": "top-right",
                        "popupCloseButton_backgroundColor": "#DDDDDD",
                        "popupCloseButton_iconColor": "#000000",
                        "popupCloseButton_borderRadius": "0px",
                        "popupCloseButton_margin": "0px",
                        "popupCloseButton_action": {
                          "name": "close_popup",
                          "attrs": {
                            "onClick": "document.querySelector('.u-popup-container').style.display = 'none';"
                          }
                        },
                        "language": {},
                        "backgroundColor": "#F7F8F9",
                        "preheaderText": "",
                        "linkStyle": {
                          "body": true,
                          "linkColor": "#0000ee",
                          "linkHoverColor": "#0000ee",
                          "linkUnderline": true,
                          "linkHoverUnderline": true
                        },
                        "backgroundImage": {
                          "url": "",
                          "fullWidth": true,
                          "repeat": "no-repeat",
                          "size": "custom",
                          "position": "center"
                        },
                        "_meta": {
                          "htmlID": "u_body",
                          "htmlClassNames": "u_body"
                        }
                      }
                    },
                    "schemaVersion": 17
                  }
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully created or updated template(s)
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Template'
                  errors:
                    type: array
                    items:
                      type: string

              example:
                data:
                  - name: new template name
                    subject: email subject
                    type: TEMPLATE_MARKETING
                    enabled: true
                    html_body: HTML_BODY
                    plain_text_body: PLAIN_TEXT_BODY
                    channel_id: ""
                    json: {}
                    version: "2026-09-13T17:59:00.148879426Z"
                    created_at: "2026-09-13T17:59:00.148879426Z"
                    updated_at: "2026-09-13T17:59:00.148879426Z"
                errors: []
  /users:
    servers:
      - url: https://dz58vjjvbe.execute-api.us-east-1.amazonaws.com
    post:
      operationId: createUser
      summary: |
        Create or update individual contacts by matching ID or email address.

        The base url for this endpoint is {api_user_gateway} in the login response payload.

        If you need to upload more than 10,000 contacts, please upload a CSV to https://swiftmissive.com/people/users/new/bulk instead.

        Or, do what the https://swiftmissive.com/people/users/new/bulk page does programatically by getting an upload url, then posting your csv file to that url.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                users:
                  type: array
                  items:
                    $ref: '#/components/schemas/UserCreate'
            example:
              users:
                - first_name: first
                  last_name: last
                  date_of_birth: "2026-09-10T05:00:00.000Z"
                  email: myemail@swiftmissive.com
                  timezone: America/Chicago
                  json: {}
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully created or updated user(s)
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/User'
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data:
                  - id: 12345678-1234-1234-1234-123456789012
                    email: yourcontactsemail@gmail.com
                    first_name: first
                    last_name: last
                    date_of_birth: "2026-09-10T05:00:00Z"
                    timezone: America/Chicago
                    json: {}
                    created_at: "2026-09-12T19:36:11.884477768Z"
                    unsubscribed_at: null
                    email_validated_at: null
                    email_validation_result_string: valid
                errors: []

    get:
      operationId: getUsers
      summary: Get users
      description: |
        Returns a list of users with optional pagination and sorting.

        The base url for this endpoint is {api_user_gateway} in the login response payload.
      parameters:
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            example: 10
          description: Maximum number of users to return.
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            example: 10
          description: Number of users to skip before starting to collect the result set.
        - name: sort_columns
          in: query
          required: false
          schema:
            type: string
            example: email ASC
          description: Columns and sort order.
        - name: in_segment_ids
          description: Causes the endpoint to include only users that are in the given segments
          in: query
          required: false
          schema:
            type: string
            example: 12345678-1234-1234-12345678901,12345678-1234-1234-12345678902
        - name: not_in_segment_ids
          description: Causes the endpoint to pull all users except for those that are in the given segments
          in: query
          required: false
          schema:
            type: string
            example: 12345678-1234-1234-12345678901,12345678-1234-1234-12345678902
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/User'
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data:
                  - id: 12345678-1234-1234-1234-123456789012
                    email: success+1007@simulator.amazonses.com
                    first_name: BFName
                    last_name: BLName
                    date_of_birth: null
                    timezone: America/New_York
                    json:
                      extrafield1: hi
                      extrafield2: hello
                    created_at: "2026-07-12T02:14:18Z"
                    unsubscribed_at: "2026-08-15T07:15:59.468692Z"
                    email_validated_at: "2026-07-12T02:19:46Z"
                    email_validation_result_string: valid
                errors: []
    delete:
      operationId: archiveUsersByEmail
      summary: Delete users by email
      description: |
        Deletes one or more users by their email addresses and returns the archived user records.

        The base url for this endpoint is {api_user_gateway} in the login response payload.
      parameters:
        - name: emails
          in: query
          required: true
          schema:
            type: string
            example: success+1009@simulator.amazonses.com
          description: Comma-separated list of email addresses to delete.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully deleted user(s), or no user was found with the given email.
          content:
            application/json:
              schema:
                type: object
                properties:
                  archived_email_to_user_map:
                    type: object
                    additionalProperties:
                      $ref: '#/components/schemas/User'
                  errors:
                    type: array
                    items:
                      type: string
              example:
                archived_email_to_user_map:
                  "success+1009@simulator.amazonses.com":
                    id: 12345678-1234-1234-1234-123456789012
                    email: success+1009@simulator.amazonses.com
                    first_name: BFName
                    last_name: BLName
                    date_of_birth: null
                    timezone: America/Chicago
                    json:
                      extrafield1: hi
                      extrafield2: hello
                    created_at: "2026-07-12T02:14:18Z"
                    unsubscribed_at: "2026-08-15T07:15:35.463126Z"
                    email_validated_at: "2026-07-12T02:19:50Z"
                    email_validation_result_string: valid
                errors: []
  /users/email_validation_counts:
    servers:
      - url: https://dz58vjjvbe.execute-api.us-east-1.amazonaws.com
    get:
      operationId: getEmailValidationStatus
      summary: |
        Fetches the state of email cleaning currently done by Swift Missive.

        Ideally, you should check your validation status after every contact list upload, and then don't send emails to
        contacts tht haven't had their emails validated yet.

        Swift Missive will do its best, but it is not going to catch all invalid email addresses,
        so be sure to upload a clean list to begin with.

        The base url for this endpoint is {api_user_gateway} in the login response payload.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully fetched validation status of contact lists
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                  errors:
                    type: array
                    items:
                      type: string
              example:
                data:
                  - domain_missing_mx_record: 11
                    invalid: 72
                    is_disposable: 470
                    valid: 153255
                errors: []
  /users/count:
    servers:
      - url: https://dz58vjjvbe.execute-api.us-east-1.amazonaws.com
    get:
      summary: Get total user count
      description: |
        Returns the total number of users in the system.

        The base url for this endpoint is {api_user_gateway} in the login response payload.
      operationId: getUserCount
      parameters:
        - name: search_field
          in: query
          required: false
          schema:
            type: string
          description: Field to search against (e.g. "email", "first_name", "last_name", or "timezone").
          example: email
        - name: search_value
          in: query
          required: false
          schema:
            type: string
          description: Value to match within the specified search field.
        - name: in_segment_ids
          description: Causes the endpoint to include only users that are in the given segments
          in: query
          required: false
          schema:
            type: string
            example: 12345678-1234-1234-12345678901,12345678-1234-1234-12345678902
        - name: not_in_segment_ids
          description: Causes the endpoint to pull all users except for those that are in the given segments
          in: query
          required: false
          schema:
            type: string
            example: 12345678-1234-1234-12345678901,12345678-1234-1234-12345678902
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully retrieved user count
          content:
            application/json:
              schema:
                type: object
                properties:
                  num_users:
                    type: integer
                    description: Total number of users.
                    example: 100000
                  errors:
                    type: array
                    items:
                      type: string
              example:
                num_users: 100000
                errors: []
  /workflows:
    servers:
      - url: https://n5bky6af3l.execute-api.us-east-1.amazonaws.com
    get:
      operationId: getWorkflows
      summary: Get workflows / drip campaigns / automations
      description: |
        Returns a list of workflows.

        The base url for this endpoint is {api_workflowwrapper_gateway} in the login response payload.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Successfully retrieved workflows
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Workflow'
                  errors:
                    type: array
                    items:
                      type: string
    post:
      operationId: createWorkflow
      summary: Create a workflow
      description: |
        Creates a new workflow.

        The base url for this endpoint is {api_workflowwrapper_gateway} in the login response payload.

        **Important:**
        - A `503` response **with no body** means the workflow creation job was successfully queued but is still in progress (this is the most common case).
        - A `200` or `201` response means the workflow creation job was successfully queued **and** has already completed.
        - API consumers should use a combination of:
          - `POST /workflows/validate` to validate the workflow definition before creation.
          - `POST /workflows` this endpoint to trigger the workflow creation job (this takes a while).
          - `GET /joblog` the job log endpoint to determine if the creation job is finished.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WorkflowCreateRequest'
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Workflow creation job queued and completed successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Workflow'
        '201':
          description: Workflow creation job queued and completed successfully (resource created)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Workflow'
        '503':
          description: Workflow creation job queued but still in progress (most common case). No body is returned.
  /workflows/{id}:
    servers:
      - url: https://n5bky6af3l.execute-api.us-east-1.amazonaws.com
    delete:
      operationId: archiveWorkflow
      summary: Archive a workflow
      description: |
        Disables and archives an existing workflow.

        The base url for this endpoint is {api_workflowwrapper_gateway} in the login response payload.

        **Important**
        1. This endpoint will only run for 30s before ending the connection with the caller.  If the job was enqueued successfully (usually a 503) then it will still run, though.
        2. A `503` response **with no body** means the workflow deletion job was successfully queued but is still in progress (most common case).
        3. A `200` or `201` response means the workflow deletion job was successfully queued **and** has already completed.
        4. You can use the `GET /joblog` endpoint to determine if the workflow archiving job is finished.
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
            example: 12345678-1234-1234-1234-123456789012
          description: The UUID of the workflow to delete.
      security:
        - apiKeyAuth: []
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Workflow archiving job queued and completed successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  errors:
                    type: array
                    items:
                      type: string
              example:
                errors: []
        '201':
          description: Workflow deletion job queued and completed successfully (resource deleted)
          content:
            application/json:
              schema:
                type: object
                properties:
                  errors:
                    type: array
                    items:
                      type: string
              example:
                errors: []
        '503':
          description: Workflow deletion job queued but still in progress (most common case). No body is returned.

  /workflows/validate:
    servers:
      - url: https://pho57gbtsb.execute-api.us-east-1.amazonaws.com
    post:
      operationId: validateWorkflow
      summary: Validate a workflow definition
      description: |
        Validates the structure and configuration of a workflow before saving or executing it.

        The base url for this endpoint is {api_workflow_gateway} in the login response payload.
      security:
        - apiKeyAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WorkflowValidationRequest'
      responses:
        '400':
          description: An error occurred that was caused by the request formatting.
        '401':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.
        '403':
          description: An authentication error occurred.  This usually happens when the wrong API key is passed in.

        '500':
          description: The input seemed valid but something went wrong on the server side.
        '429':
          description: Too many requests have been made in a short amount of time (usually too many within a second).  You can retry the call.
        '200':
          description: Workflow validation result
          content:
            application/json:
              schema:
                type: object
                properties:
                  errors:
                    type: array
                    items:
                      type: string
              example:
                errors: []
components:
  schemas:
    Campaign:
      description: An object used solely for reporting purposes.  Usually these are associated with email blasts, workflows, or a/b test campaigns.
      type: object
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        type:
          type: string
          description: Campaign type (e.g., `scheduled_email_group`).
        workflow_ids:
          type: array
          nullable: true
          items:
            type: string
            format: uuid
        template_ids:
          type: array
          nullable: true
          items:
            type: string
            format: uuid
        scheduled_email_blast_group_ids:
          type: array
          items:
            type: string
            format: uuid
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    CampaignWithMetrics:
      type: object
      properties:
        campaign:
          $ref: '#/components/schemas/Campaign'
        template_id:
          type: string
          description: Template ID associated with the metrics (empty string if not applicable).
        template_name:
          type: string
          description: Template name associated with the metrics (empty string if not applicable).
        sends:
          type: integer
        opens:
          type: integer
        clicks:
          type: integer
        bounces:
          type: integer
        unsuccessful_sends:
          type: integer
        unsubscribes:
          type: integer
        complaints:
          type: integer

    CompanyUser:
      type: object
      properties:
        id:
          type: string
          format: uuid
        company_id:
          type: string
          format: uuid
        project_id:
          type: string
          format: uuid
        first_name:
          type: string
        last_name:
          type: string
        email:
          type: string
          format: email
        password_reset_at:
          type: string
          format: date-time
          nullable: true
        created_at:
          type: string
          format: date-time
          nullable: true
        updated_at:
          type: string
          format: date-time
          nullable: true
        json:
          type: object
          additionalProperties: true
    CompanyUserCreate:
      type: object
      required:
        - email
      properties:
        first_name:
          type: string
        last_name:
          type: string
        email:
          type: string
          format: email
        json:
          type: object
          additionalProperties: true
    Event:
      type: object
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        user_id:
          type: string
          format: uuid
        email:
          type: string
          format: email
        user:
          type: object
          nullable: true
          properties:
            id:
              type: string
              format: uuid
            email:
              type: string
              format: email
            first_name:
              type: string
            last_name:
              type: string
            date_of_birth:
              type: string
              format: date
              nullable: true
            timezone:
              type: string
            json:
              type: object
              nullable: true
              additionalProperties: true
            created_at:
              type: string
              format: date-time
              nullable: true
            unsubscribed_at:
              type: string
              format: date-time
              nullable: true
            email_validated_at:
              type: string
              format: date-time
              nullable: true
            email_validation_result_string:
              type: string
              nullable: true
        json:
          type: object
          additionalProperties: true
        metric1:
          type: number
        metric2:
          type: number
        metric3:
          type: number
        emitted_at:
          type: string
          format: date-time
        created_at:
          type: string
          format: date-time
    EventCreate:
      type: object
      required:
        - name
        - email
      properties:
        name:
          type: string
          description:  A short event name.
          example: User Purchase
        email:
          type: string
          format: email
        user:
          description: An optional user object that can contain more information that just the email.  Emails must match!
          type: object
          properties:
            id:
              type: string
              format: uuid
            email:
              type: string
              format: email
            first_name:
              type: string
            last_name:
              type: string
            date_of_birth:
              type: string
              format: date
              nullable: true
            timezone:
              type: string
            json:
              type: object
              nullable: true
              additionalProperties: true
            created_at:
              type: string
              format: date-time
              nullable: true
            unsubscribed_at:
              type: string
              format: date-time
              nullable: true
        json:
          type: object
          additionalProperties: true
          description: Additional metadata to attach to the event.
        metric1:
          type: number
          description: Additional metadata to attach to the event.
        metric2:
          type: number
          description: Additional metadata to attach to the event.
        metric3:
          type: number
          description: Additional metadata to attach to the event.

    JobLogEntry:
      type: object
      properties:
        id:
          type: string
          format: uuid
        job_name:
          type: string
        worker_id:
          type: string
          format: uuid
        worker_type:
          type: string
        success:
          type: boolean
        start_details:
          type: object
          nullable: true
        end_details:
          type: object
          nullable: true
        started_at:
          type: string
          format: date-time
        ended_at:
          type: string
          format: date-time




    MostClickedLink:
      type: object
      properties:
        campaign_id:
          type: string
          example: all
        email_subject:
          type: string
          example: My email subject
        link_url:
          type: string
          format: uri
          example: https://swiftmissive.com
        num_clicks:
          type: integer
          example: 1
        num_unique_clicks:
          type: integer
          example: 1
        template_id:
          type: string
          format: uuid
          example: ce493132-b59a-4045-aaa5-cfb959ffcd90
    MostOpenedEmail:
      type: object
      properties:
        campaign_id:
          type: string
          example: all
        email_subject:
          type: string
          example: this is a tester template
        num_opens:
          type: integer
          example: 6
        num_unique_opens:
          type: integer
          example: 1
        template_id:
          type: string
          format: uuid
          example: ce493132-b59a-4045-aaa5-cfb959ffcd90
    OpenedEmail:
      type: object
      properties:
        campaign_id:
          type: string
        email:
          type: string
          format: email
        email_subject:
          type: string
        emitted_at:
          type: string
          format: date-time
        template_id:
          type: string
          format: uuid
        user_id:
          type: string
          format: uuid
    OpenBySource:
      type: object
      properties:
        campaign_id:
          type: string
          example: all
        num_clicks:
          type: integer
          example: 3
        num_opens:
          type: integer
          example: 14
        num_unique_clicks:
          type: integer
          example: 1
        num_unique_opens:
          type: integer
          example: 1
        to_domain:
          type: string
          example: gmail.com
    QuickStat:
      type: object
      properties:
        campaign_id:
          type: string
          example: all
        name:
          type: string
          description: Event type name.
          example: email_send_result_success
        num:
          type: integer
          description: Total count of events.
          example: 30000
        num_unique:
          type: integer
          description: Count of unique occurrences.
          example: 10000
    RecentlyClickedLink:
      type: object
      properties:
        campaign_id:
          type: string
          example: all
        email:
          type: string
          format: email
          example: myfromaddress@gmail.com
        email_subject:
          type: string
          example: this is a tester template
        emitted_at:
          type: string
          format: date-time
          example: "2026-09-12T19:04:27Z"
        link_url:
          type: string
          format: uri
          example: https://swiftmissive.com
        user_id:
          type: string
          format: uuid
          example: 4b55aad8-b4de-7d19-31ca-59c66fe636bb

    ScheduledEmail:
      type: object
      properties:
        id:
          type: string
          format: uuid
        group_id:
          type: string
          format: uuid
        segment_id:
          type: string
          format: uuid
        name:
          type: string
        created_at:
          type: string
          format: date-time
        send_at:
          type: string
          format: date-time
        send_in_users_timezone:
          type: boolean
        sent_at_per_timezone:
          type: string
          nullable: true
        payload:
          $ref: '#/components/schemas/SchedulerPayload'
        claimed_by:
          type: string
        claimed_at:
          type: string
          format: date-time
    ScheduledEmailJob:
      type: object
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        enabled:
          type: boolean
        created_at:
          type: string
          format: date-time
        send_at:
          type: string
          format: date-time
        send_in_users_timezone:
          type: boolean
        sent_at_per_timezone:
          type: string
          nullable: true
        scheduled_emails:
          type: array
          items:
            $ref: '#/components/schemas/ScheduledEmail'
        payload:
          $ref: '#/components/schemas/SchedulerPayload'
    SchedulerCreateRequest:
      type: object
      required:
        - id
        - name
        - sender_persona_id
        - send_at
        - send_in_users_timezone
        - timezone
      properties:
        id:
          type: string
          format: uuid
          description: This field must always be supplied, for new blasts please generate a new UUID and pass it in here.
        name:
          type: string
        template_ids_with_weights:
          description: Used when creating an A/B test campaign.  Either this field or template_id must be specified.
          type: array
          items:
            type: string
          format: object
        template_id:
          type: string
          format: uuid
          description: The singular template to send to contacts. Either this field or template_ids_with_weights must be specified.
        sender_persona_id:
          type: string
          format: uuid
        to_segment_ids:
          type: array
          nullable: true
          items:
            type: string
            format: uuid
        to_user_ids:
          type: array
          nullable: true
          items:
            type: string
            format: uuid
        send_at:
          type: string
          format: date-time
        send_in_users_timezone:
          type: boolean
        timezone:
          type: string
    SchedulerPayload:
      type: object
      properties:
        to_segment_ids:
          type: array
          items:
            type: string
            format: uuid
        to_user_ids:
          type: array
          nullable: true
          items:
            type: string
            format: uuid
        to_user_emails:
          type: array
          nullable: true
          items:
            type: string
            format: email
        cc_to_user_ids:
          type: array
          nullable: true
          items:
            type: string
            format: uuid
        bcc_to_user_ids:
          type: array
          nullable: true
          items:
            type: string
            format: uuid
        sender_persona_id:
          type: string
          format: uuid
        template_id:
          type: string
          format: uuid
        template_ids_with_weights:
          type: array
          nullable: true
          items:
                      type: string
        timezone:
          type: string
    Segment:
      type: object
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        user_ids:
          type: array
          nullable: true
          items:
            type: string
            format: uuid
        num_users:
          type: integer
        version:
          type: string
          format: date-time
        invisible:
          type: boolean
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    SegmentCreate:
      type: object
      required:
        - name
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        user_ids:
          type: array
          items:
            type: string
            format: uuid
        num_users:
          type: integer

    SenderPersona:
      type: object
      properties:
        id:
          type: string
          format: uuid
        first_name:
          type: string
        last_name:
          type: string
        email:
          type: string
          format: email
        json:
          type: object
          additionalProperties: true
        version:
          type: string
          format: date-time
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    SenderPersonaCreate:
      type: object
      required:
        - email
      properties:
        id:
          type: string
          format: uuid
        first_name:
          type: string
        last_name:
          type: string
        email:
          type: string
          format: email
        json:
          type: object
          additionalProperties: true

    Template:
      type: object
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        subject:
          type: string
        type:
          type: string
        enabled:
          type: boolean
        html_body:
          type: string
          description: |
            The HTML body of the email.

            Template variables in the form {{user.json.my_text}} (etc) are supported. See the template variables section of this page for more examples: https://swiftmissive.com/components/templates/new

            Make sure not to include newlines in this field, it must be one unbroken string.

            All marketing emails must include an unsubscribe template link.  Here is an example of the link:
            `<hr> <p style="color:#888"> If you’d prefer not to receive these emails, you can <a style="color:#787878" href="{{unsubscribe_link}}">unsubscribe here</a> </p>`

            The following is a good base for your template (including an unsubscribe link).  Make sure to replace HTML_CONTENT with your actual email content.
            <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office"> <head> <!--[if gte mso 9]> <xml>   <o:OfficeDocumentSettings>     <o:AllowPNG/>     <o:PixelsPerInch>96</o:PixelsPerInch>   </o:OfficeDocumentSettings> </xml> <![endif]-->   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">   <meta name="viewport" content="width=device-width, initial-scale=1.0">   <meta name="x-apple-disable-message-reformatting">   <!--[if !mso]><!--><meta http-equiv="X-UA-Compatible" content="IE=edge"><!--<![endif]-->   <title></title>        <style type="text/css">              @media only screen and (min-width: 520px) {         .u-row {           width: 500px !important;         }          .u-row .u-col {           vertical-align: top;         }                       .u-row .u-col-100 {               width: 500px !important;             }                  }        @media only screen and (max-width: 520px) {         .u-row-container {           max-width: 100% !important;           padding-left: 0px !important;           padding-right: 0px !important;         }          .u-row {           width: 100% !important;         }          .u-row .u-col {           display: block !important;           width: 100% !important;           min-width: 320px !important;           max-width: 100% !important;         }          .u-row .u-col > div {           margin: 0 auto;         }   }      body{margin:0;padding:0}table,td,tr{border-collapse:collapse;vertical-align:top}.ie-container table,.mso-container table{table-layout:fixed}*{line-height:inherit}a[x-apple-data-detectors=true]{color:inherit!important;text-decoration:none!important}   table, td { color: #000000; } #u_body a { color: #0000ee; text-decoration: underline; }     </style>        </head>  <body class="clean-body u_body" style="margin: 0;padding: 0;-webkit-text-size-adjust: 100%;background-color: #ffffff;color: #000000">   <!--[if IE]><div class="ie-container"><![endif]-->   <!--[if mso]><div class="mso-container"><![endif]-->   <table id="u_body" style="border-collapse: collapse;table-layout: fixed;border-spacing: 0;mso-table-lspace: 0pt;mso-table-rspace: 0pt;vertical-align: top;min-width: 320px;Margin: 0 auto;background-color: #ffffff;width:100%" cellpadding="0" cellspacing="0">   <tbody>   <tr style="vertical-align: top">     <td style="word-break: break-word;border-collapse: collapse !important;vertical-align: top">     <!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td align="center" style="background-color: #ffffff;"><![endif]-->            <div class="u-row-container" style="padding: 0px;background-color: transparent">   <div class="u-row" style="margin: 0 auto;min-width: 320px;max-width: 500px;overflow-wrap: break-word;word-wrap: break-word;word-break: break-word;background-color: transparent;">     <div style="border-collapse: collapse;display: table;width: 100%;height: 100%;background-color: transparent;">       <!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td style="padding: 0px;background-color: transparent;" align="center"><table cellpadding="0" cellspacing="0" border="0" style="width:500px;"><tr style="background-color: transparent;"><![endif]-->        <!--[if (mso)|(IE)]><td align="center" width="500" style="width: 500px;padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;" valign="top"><![endif]--> <div class="u-col u-col-100" style="max-width: 320px;min-width: 500px;display: table-cell;vertical-align: top;">   <div style="height: 100%;width: 100% !important;">   <!--[if (!mso)&(!IE)]><!--><div style="box-sizing: border-box; height: 100%; padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;"><!--<![endif]-->    <table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">   <tbody>     <tr>       <td style="overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;" align="left">            <div>     HTML_CONTENT   <hr> <div style="color:#888">If you’d prefer not to receive these emails, you can <a style="color:#787878" href="{{unsubscribe_link}}">unsubscribe here</a></div>   </div>        </td>     </tr>   </tbody> </table>    <!--[if (!mso)&(!IE)]><!--></div><!--<![endif]-->   </div> </div> <!--[if (mso)|(IE)]></td><![endif]-->       <!--[if (mso)|(IE)]></tr></table></td></tr></table><![endif]-->     </div>   </div>   </div>          <!--[if (mso)|(IE)]></td></tr></table><![endif]-->     </td>   </tr>   </tbody>   </table>   <!--[if mso]></div><![endif]-->   <!--[if IE]></div><![endif]--> </body>  </html>
        plain_text_body:
          description: DEPRECATED. Please use html_body instead.  If you need to send plain text emails, please contact us.
          type: string
        channel_id:
          type: string
        json:
          description: A JSON object that contains a lot of metadata that Swift Missive needs to display the template within its editor.
          type: object
          additionalProperties: true
        version:
          type: string
          format: date-time
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    TemplateCreate:
      type: object
      required:
        - html_body
        - name
        - subject
        - type
        - enabled
      properties:
        html_body:
          type: string
          description: |
            The HTML body of the email.

            Template variables in the form {{user.json.my_text}} (etc) are supported. See the template variables section of this page for more examples: https://swiftmissive.com/components/templates/new

            All marketing emails must include an unsubscribe template link.  Here is an example of the link:
            `<hr> <p style="color:#888"> If you’d prefer not to receive these emails, you can <a style="color:#787878" href="{{unsubscribe_link}}">unsubscribe here</a> </p>`

            The following is a good base for your template (including an unsubscribe link).  Make sure to replace HTML_CONTENT with your actual email content.
            <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office"> <head> <!--[if gte mso 9]> <xml>   <o:OfficeDocumentSettings>     <o:AllowPNG/>     <o:PixelsPerInch>96</o:PixelsPerInch>   </o:OfficeDocumentSettings> </xml> <![endif]-->   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">   <meta name="viewport" content="width=device-width, initial-scale=1.0">   <meta name="x-apple-disable-message-reformatting">   <!--[if !mso]><!--><meta http-equiv="X-UA-Compatible" content="IE=edge"><!--<![endif]-->   <title></title>        <style type="text/css">              @media only screen and (min-width: 520px) {         .u-row {           width: 500px !important;         }          .u-row .u-col {           vertical-align: top;         }                       .u-row .u-col-100 {               width: 500px !important;             }                  }        @media only screen and (max-width: 520px) {         .u-row-container {           max-width: 100% !important;           padding-left: 0px !important;           padding-right: 0px !important;         }          .u-row {           width: 100% !important;         }          .u-row .u-col {           display: block !important;           width: 100% !important;           min-width: 320px !important;           max-width: 100% !important;         }          .u-row .u-col > div {           margin: 0 auto;         }   }      body{margin:0;padding:0}table,td,tr{border-collapse:collapse;vertical-align:top}.ie-container table,.mso-container table{table-layout:fixed}*{line-height:inherit}a[x-apple-data-detectors=true]{color:inherit!important;text-decoration:none!important}   table, td { color: #000000; } #u_body a { color: #0000ee; text-decoration: underline; }     </style>        </head>  <body class="clean-body u_body" style="margin: 0;padding: 0;-webkit-text-size-adjust: 100%;background-color: #ffffff;color: #000000">   <!--[if IE]><div class="ie-container"><![endif]-->   <!--[if mso]><div class="mso-container"><![endif]-->   <table id="u_body" style="border-collapse: collapse;table-layout: fixed;border-spacing: 0;mso-table-lspace: 0pt;mso-table-rspace: 0pt;vertical-align: top;min-width: 320px;Margin: 0 auto;background-color: #ffffff;width:100%" cellpadding="0" cellspacing="0">   <tbody>   <tr style="vertical-align: top">     <td style="word-break: break-word;border-collapse: collapse !important;vertical-align: top">     <!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td align="center" style="background-color: #ffffff;"><![endif]-->            <div class="u-row-container" style="padding: 0px;background-color: transparent">   <div class="u-row" style="margin: 0 auto;min-width: 320px;max-width: 500px;overflow-wrap: break-word;word-wrap: break-word;word-break: break-word;background-color: transparent;">     <div style="border-collapse: collapse;display: table;width: 100%;height: 100%;background-color: transparent;">       <!--[if (mso)|(IE)]><table width="100%" cellpadding="0" cellspacing="0" border="0"><tr><td style="padding: 0px;background-color: transparent;" align="center"><table cellpadding="0" cellspacing="0" border="0" style="width:500px;"><tr style="background-color: transparent;"><![endif]-->        <!--[if (mso)|(IE)]><td align="center" width="500" style="width: 500px;padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;" valign="top"><![endif]--> <div class="u-col u-col-100" style="max-width: 320px;min-width: 500px;display: table-cell;vertical-align: top;">   <div style="height: 100%;width: 100% !important;">   <!--[if (!mso)&(!IE)]><!--><div style="box-sizing: border-box; height: 100%; padding: 0px;border-top: 0px solid transparent;border-left: 0px solid transparent;border-right: 0px solid transparent;border-bottom: 0px solid transparent;"><!--<![endif]-->    <table style="font-family:arial,helvetica,sans-serif;" role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0">   <tbody>     <tr>       <td style="overflow-wrap:break-word;word-break:break-word;padding:10px;font-family:arial,helvetica,sans-serif;" align="left">            <div>     HTML_CONTENT   <hr> <div style="color:#888">If you’d prefer not to receive these emails, you can <a style="color:#787878" href="{{unsubscribe_link}}">unsubscribe here</a></div>   </div>        </td>     </tr>   </tbody> </table>    <!--[if (!mso)&(!IE)]><!--></div><!--<![endif]-->   </div> </div> <!--[if (mso)|(IE)]></td><![endif]-->       <!--[if (mso)|(IE)]></tr></table></td></tr></table><![endif]-->     </div>   </div>   </div>          <!--[if (mso)|(IE)]></td></tr></table><![endif]-->     </td>   </tr>   </tbody>   </table>   <!--[if mso]></div><![endif]-->   <!--[if IE]></div><![endif]--> </body>  </html>
        plain_text_body:
          description: DEPRECATED. Please use html_body instead.  If you need to send plain text emails, please contact us.
          type: string
        name:
          type: string
        subject:
          type: string
        type:
          type: string
        enabled:
          type: boolean
    User:
      type: object
      properties:
        id:
          type: string
          format: uuid
        email:
          type: string
          format: email
        first_name:
          type: string
        last_name:
          type: string
        date_of_birth:
          type: string
          format: date-time
          nullable: true
        timezone:
          type: string
        json:
          type: object
          additionalProperties: true
          description:  Contains arbitrary metadata for a contact. DOES NOT contain timezone information.  Use the timezone field for that.
        created_at:
          type: string
          format: date-time
        unsubscribed_at:
          type: string
          format: date-time
          nullable: true
        email_validated_at:
          type: string
          format: date-time
          nullable: true
        email_validation_result_string:
          type: string
    UserCreate:
      type: object
      required:
        - email
      properties:
        id:
          description: Only needed for user updates (not for creation).
          type: string
          format: uuid
        first_name:
          type: string
        last_name:
          type: string
        date_of_birth:
          type: string
          format: date-time
          nullable: true
        email:
          type: string
          format: email
        timezone:
          type: string
        json:
          type: object
          additionalProperties: true
    UserFilter:
      type: object
      required:
        - attribute
        - operator
        - values
      properties:
        attribute:
          type: string
          enum:
            - contact_first_name
            - contact_last_name
            - contact_email
            - contact_timezone
            - contact_json
            - contact_date_of_birth
            - date_added
            - date_unsubscribed
            - date_bounced
            - num_opens
            - num_sends
            - num_clicks
            - num_opens_via_email_blast
            - num_sends_via_email_blast
            - num_clicks_via_email_blast
            - num_opens_via_campaign
            - num_sends_via_campaign
            - num_clicks_via_campaign
            - num_opens_via_workflow
            - num_sends_via_workflow
            - num_clicks_via_workflow
            - num_opens_with_template
            - num_sends_with_template
            - num_clicks_with_template
            - num_in_segment
          example: num_in_segment
        operator:
          type: string
          example: greater_than
        values:
          type: array
          items:
            oneOf:
              - type: integer
              - type: string
        nodeKey:
          type: string
          format: uuid
    Workflow:
      type: object
      properties:
        id:
          type: string
          format: uuid
        version:
          type: string
          format: date-time
        name:
          type: string
        json:
          type: object
          additionalProperties: true
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
    WorkflowCreateRequest:
      type: object
      required:
        - name
        - root_node
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        root_node:
          type: object
          additionalProperties: true
        job_log_id:
          type: string
        display:
          type: object
          additionalProperties: true
    WorkflowValidationRequest:
      type: object
      required:
        - id
        - name
        - root_node
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
        root_node:
          type: object
          additionalProperties: true
        job_log_id:
          type: string
        display:
          type: object
          additionalProperties: true

  securitySchemes:
    apiKeyAuth:
      description: The API key to make API calls with.  For the DEMO ACCOUNT (i.e. Authorization on this docs page) use d0bcefa7-c3f7-3b65-3fda-b5b50f208552
      type: apiKey
      in: header
      name: x-api-key
