APOLLO Affiliates API

The current APOLLO Affiliate API. Two partner-scoped POST operations — quote an application and create an application — scoped by affiliateId (the partner's co-branded APOLLO subdomain) and insuranceType (currently only `tenant`). Creating an application returns a quoteLink into the affiliate's co-branded APOLLO launchpad with the customer's responses pre-filled. Authenticated with an x-api-key header token issued by an APOLLO contact; separate tokens for the test and production servers, plus a Stoplight mock server for prototyping.

OpenAPI Specification

apollo-insurance-affiliates.yml Raw ↑
openapi: 3.0.0
info:
  title: Affiliates API
  version: 1.0.0
  description: |

    ## The APOLLO Affiliates API

    The `Production Server` should only be used for live data.

    Feel free to test the API using rather the `Test Server` or `Mock Server` to test out any endpoints before moving to production.

    All endpoints require an `affiliateId` (provided by your APOLLO Contact) and a `insuranceType` in the path. Currently only the `tenant` insurance type is available.

    All endpoints require a `x-api-key` security token in the header. This token will be provided to you by APOLLO.
servers:
  - url: 'https://o73td82enk.execute-api.ca-central-1.amazonaws.com/1_0_0'
    description: Test Server
  - url: 'https://fpl95knwc1.execute-api.ca-central-1.amazonaws.com/1_0_0'
    description: Production Server
tags:
  - name: affiliates
    description: APOLLO affiliate
  - name: api
    description: APOLLO public API
  - name: application
    description: Insurance Application
  - name: quote
    description: Insurance Application Quote
security:
  - apiKeyAuth: []
paths:
  '/api/affiliates/{affiliateId}/{insuranceType}/application':
    post:
      tags:
        - api
        - affiliates
        - application
      summary: Create an application
      description: |-

        Create a pre-filled application based on the data provided in the payload.

        You MUST provide your `affiliateId` (provided by APOLLO) and the `insuranceType` in the path.

        You MUST provide the `x-api-key` security token in the header.
                
      operationId: public-api-affiliates-application-post
      responses:
        '200':
          description: A link to the generated application will be provided.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      quoteLink:
                        type: string
                        description: Link to the generated application.
                        example: 'https://apollo.securequotebotdev.com/tenant?quote=6fa455a8-8b11-4a6e-b7fa-80619f7d66e7'
                    additionalProperties: false
                additionalProperties: false
        '400':
          $ref: '#/components/responses/400InsuranceDataValidationError'
        '403':
          $ref: '#/components/responses/403'
        '404':
          $ref: '#/components/responses/404'
      parameters:
        - in: path
          name: affiliateId
          required: true
          description: 'Affiliate/Subdomain, provided by APOLLO'
          schema:
            type: string
            example: apollo
        - in: path
          name: insuranceType
          required: true
          description: 'Type of products: tenant, contractors, etc'
          schema:
            type: string
            enum:
              - tenant
            example: tenant
            default: tenant
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                insuranceData:
                  anyOf:
                    - $ref: '#/components/schemas/TenantInsuranceQuestions'
                  description: Contains application form question answers. The field is REQUIRED when creating non-embedded applications.
                embeddedOptions:
                  $ref: '#/components/schemas/EmbeddedOptions'
                paymentPeriod:
                  $ref: '#/components/schemas/PaymentPeriod'
                externalId:
                  $ref: '#/components/schemas/ExternalId'
                leadSource:
                  $ref: '#/components/schemas/LeadSource'
              additionalProperties: false
        description: |

          A typical payload MUST include `insuranceData`. The payload SHOULD also contain `paymentPeriod`, `externalId`, and `leadSource` if possible.

          An embedded flow payload MUST include `embeddedOptions`. The payload SHOULD also contain `paymentPeriod`, `externalId`, and `leadSource` if possible. The payload COULD also contain `insuranceData`.

          The fields provided for `insuranceData` WILL change based on the `insuranceType`.
  '/api/affiliates/{affiliateId}/{insuranceType}/quote':
    post:
      tags:
        - api
        - affiliates
        - quote
      summary: Quote an application
      description: |-

        Quote an application based on the data provided in the payload.

        You MUST provide your `affiliateId` (provided by APOLLO) and the `insuranceType` in the path.

        You MUST provide the `x-api-key` security token in the header.
                
      operationId: public-api-affiliates-quote-post
      responses:
        '200':
          description: Generated quote for based on the provided data.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      premiums:
                        type: object
                        properties:
                          contentsPremium:
                            type: number
                            format: double
                            example: 405
                          alePremium:
                            type: number
                            format: double
                            example: 26
                          liabilityPremium:
                            type: number
                            format: double
                            example: 178
                          addonPremium:
                            type: number
                            format: double
                            example: 0
                        additionalProperties: false
                      policyExpiryDate:
                        type: string
                        format: date-time
                        example: '2023-07-05T00:01:00-07:00'
                      subtotal:
                        type: object
                        properties:
                          annual:
                            type: number
                            format: double
                            example: 653.76
                          monthly:
                            type: number
                            format: double
                            example: 714.72
                          instalment:
                            type: number
                            format: double
                            example: 702.51
                        additionalProperties: false
                      stripeFees:
                        type: object
                        properties:
                          annual:
                            type: number
                            format: double
                            example: 19.84
                          monthly:
                            type: number
                            format: double
                            example: 25.08
                          instalment:
                            type: number
                            format: double
                            example: 24.1
                        additionalProperties: false
                      taxesAndFees:
                        type: object
                        properties:
                          annual:
                            type: number
                            format: double
                            example: 64.6
                          monthly:
                            type: number
                            format: double
                            example: 130.8
                          instalment:
                            type: number
                            format: double
                            example: 112.32
                        additionalProperties: false
                      total:
                        type: object
                        properties:
                          annual:
                            type: number
                            format: double
                            example: 673.6
                          monthly:
                            type: number
                            format: double
                            example: 739.8
                          monthlyPayment:
                            type: number
                            format: double
                            example: 61.65
                          instalment:
                            type: number
                            format: double
                            example: 726.61
                          instalmentDownPayment:
                            type: number
                            format: double
                            example: 171.85
                          instalmentMonthlyPayment:
                            type: number
                            format: double
                            example: 61.64
                          instalmentNumMonths:
                            type: integer
                            example: 9
                        additionalProperties: false
                    additionalProperties: false
                additionalProperties: false
        '400':
          $ref: '#/components/responses/400InsuranceDataValidationError'
        '403':
          $ref: '#/components/responses/403'
        '404':
          $ref: '#/components/responses/404'
      parameters:
        - in: path
          name: affiliateId
          required: true
          description: 'Affiliate/Subdomain, provided by APOLLO'
          schema:
            type: string
            example: apollo
        - in: path
          name: insuranceType
          required: true
          description: 'Type of products: tenant, contractors, etc'
          schema:
            type: string
            enum:
              - tenant
            example: tenant
            default: tenant
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                insuranceData:
                  anyOf:
                    - $ref: '#/components/schemas/TenantInsuranceQuoteQuestions'
                  description: Contains application form question answers.
              required:
                - insuranceData
components:
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      name: x-api-key
      in: header
  responses:
    '403':
      description: Forbidden
    '404':
      description: Not found
    400InsuranceDataValidationError:
      description: Validation error
      content:
        application/json:
          schema:
            type: object
            properties:
              message:
                type: object
                properties:
                  _original:
                    type: object
                    properties: {}
                    additionalProperties: false
                  details:
                    type: array
                    items:
                      type: object
                      properties:
                        message:
                          type: string
                          example: '"body.insuranceData.businessAddressPostal" is required'
                        path:
                          type: array
                          items:
                            type: string
                          example:
                            - body
                            - insuranceData
                            - businessAddressPostal
                        type:
                          type: string
                          example: any.required
                        context:
                          type: object
                          properties:
                            label:
                              type: string
                              example: body.insuranceData.businessAddressPostal
                            key:
                              type: string
                              example: businessAddressPostal
                          additionalProperties: false
                      additionalProperties: false
                additionalProperties: false
            additionalProperties: false
  schemas:
    TenantInsuranceQuestions:
      type: object
      properties:
        businessAddressPostal:
          type: string
          pattern: '([A-Za-z]\d){3}'
          minLength: 6
          maxLength: 6
          description: Applicant Postal Code
          example: L9Y3Z2
        businessAddressCity:
          type: string
          description: Applicant City
          example: Collingwood
        operations:
          type: string
          enum:
            - High Rise
            - Low Rise
            - Townhouse
            - Semi-Detached or Duplex or Triplex
            - Detached House
            - Other
          description: What type of home does applicant need insurance for
          example: Low Rise
        nonlistedOperation:
          type: string
          description: 'Describe the type of home if operations value is Other, the field is enabled if operations is Other'
          example: Combination high rise & townhouse complex
        businessAddressStreet:
          type: string
          description: Street Address - Includes street number and street name.
          example: 123 Main Street
        businessAddressUnit:
          type: string
          description: Unit number. The field is required if the operations is High Rise or Low Rise
          example: '456'
        businessAddressProvince:
          type: string
          minLength: 2
          maxLength: 2
          description: Province code in 2 letter format
          example: 'on'
        buildingAge:
          type: string
          enum:
            - Under 35 years
            - 35-70 years
            - Over 70 years
          description: 'How old is the building you reside at, approximately'
          example: Under 35 years
        birthdate:
          type: string
          format: date-time
          pattern: '\d{4}-\d{2}-\d{2}'
          description: The birth date of the applicant in yyyy-mm-dd format.
          example: '1985-03-20'
        firstName:
          type: string
          description: Applicant first name
          example: John
        lastName:
          type: string
          description: Applicant last name
          example: Doe
        email:
          type: string
          format: email
          description: Applicant email
          example: john.doe@gmail.com
        phoneNumber:
          type: string
          description: 'Applicant phone number ex. 6135550148, +16135550148, (613) 555-0148'
          example: (604) 789-2341
        ageApplicant:
          type: string
          enum:
            - Under 25
            - 25-50
            - Over 50
          description: Applicant age range
          example: Under 25
        personalLiability:
          type: number
          format: float
          enum:
            - 1000000
            - 2000000
          description: How much Personal Liability coverage would the applicant like
          example: 1000000
        deductible:
          type: number
          format: float
          enum:
            - 500
            - 1000
            - 2500
          description: Policy deductible
          example: 500
        propertyLimitApplicant:
          type: number
          format: float
          enum:
            - 10000
            - 20000
            - 30000
            - 40000
            - 60000
            - 80000
            - 100000
            - 125000
            - 150000
          description: Applicant personal Contents coverage limit
          example: 10000
        aleLimitApplicant:
          type: number
          format: float
          enum:
            - 5000
            - 10000
            - 15000
            - 20000
            - 30000
          description: |-
            Additional Living Expenses - This coverage pays for extra costs to live while your residence is uninhabitable due to an insured loss.
                 If propertyLimitApplicant is 10000, value should be 5000;
                 If propertyLimitApplicant is 20000 or 30000, value can be one of [5000, 10000, 15000];
                 Otherwise, can be any of the valid values
                
          example: 5000
        offPremisesLimitApplicant:
          type: number
          format: float
          enum:
            - 5000
            - 7500
            - 10000
          description: Contents stored off-premises
          example: 5000
        policyPackage:
          type: string
          enum:
            - Basic
            - Enhanced
            - Premium
          description: What type of Package would the applicant like to purchase
          example: Basic
        sewerDisclaimer:
          type: string
          enum:
            - I agree
          description: Agree to continue without Sewer Backup coverage - when policyPackage = Basic or Enhanced
          example: I agree
        specialLimitException:
          type: string
          enum:
            - 'Yes'
            - 'No'
          description: 'Default Jewelry - $2,000, Bicycles and eBikes - $1,000, Computer Coverage - $2,500, Portable Devices - $1,000, Fine Arts - $1,000. Wish to purchase a higher limit for any of the items?'
          example: 'Yes'
        jewelryLimit:
          type: number
          format: float
          enum:
            - 2000
            - 5000
            - 7500
            - 10000
          description: 'Jewelry limit, the field is enabled if specialLimitException is Yes.'
          example: 2000
        bicyclesLimit:
          type: number
          format: float
          enum:
            - 1000
            - 2000
            - 5000
          description: 'Bicycles and eBikes limit, the field is enabled if specialLimitException is Yes.'
          example: 1000
        computersLimit:
          type: number
          format: float
          enum:
            - 2500
            - 5000
            - 7500
            - 10000
          description: 'On-premises computers and digital media, the field is enabled if specialLimitException is Yes.'
          example: 2500
        portablesLimit:
          type: number
          format: float
          enum:
            - 1000
            - 2000
            - 5000
          description: 'Portable Electronic Devices - on and off premises, the field is enabled if specialLimitException is Yes.'
          example: 1000
        fineArtLimit:
          type: string
          enum:
            - '$1,000 Total / $250 per item'
            - '$5,000 Total / $500 per item'
            - '$7,500 Total / $1000 per item'
          description: 'Fine Arts limit, the field is enabled if specialLimitException is Yes.'
          example: '$1,000 Total / $250 per item'
        nearbyWaterbody:
          type: string
          enum:
            - 'Yes'
            - 'No'
          description: 'Is this residence located within 300 meters of a major body of water (river, lake etc) or a known flood plain'
          example: 'Yes'
        priorFlood:
          type: string
          enum:
            - 'Yes'
            - 'No'
          description: Has this property ever suffered a damage from flood (to the applicant knowledge)
          example: 'Yes'
        floodriskBelowGround:
          type: string
          enum:
            - 'Yes'
            - 'No'
          description: Are any of your personal belongings located or stored on the ground or below ground level of the building? The field is enabled if nearby-waterbody and prior-flood are Yes.
          example: 'Yes'
        sburiskBelowGround:
          type: string
          enum:
            - 'Yes'
            - 'No'
          description: Is your residence unit located on the Main Floor or in the basement
          example: 'Yes'
        claims:
          type: string
          enum:
            - No Claims
            - 1 Claim
            - 'Ineligible: More than 1 Claim'
          description: 'In the last 5 years, have the applicant made any claims under a Personal Property or Liability insurance'
          example: No Claims
        policyUTCOffset:
          type: number
          format: float
          description: 'UTC Offset for policy effective date. The number can be transformed from timezone. For ex, -07:00 => -420'
        policyStartDate:
          type: string
          format: date-time
          pattern: '\d{4}-\d{2}-\d{2}'
          description: 'The date that the policy starts to take effect in yyyy-mm-dd format, the date must be a future time including today.'
        unrelatedRoommates:
          type: string
          enum:
            - 'Yes'
            - 'No'
          description: Any roommates who are not related to the applicant
          example: 'Yes'
        totalRoommates:
          type: number
          format: float
          minimum: 0
          maximum: 3
          description: How many unrelated roommates or families the applicant lives with. The field is enabled only if unrelatedRoommates = Yes
          example: 1
        nameRoommate1:
          type: string
          description: 'Full Name of roommate 1, the field is enabled if unrelatedRoommates is Yes and totalRoommates >= 1'
          example: Jane Smith
        ageRoommate1:
          type: string
          enum:
            - Under 25
            - 25-50
            - Over 50
          description: 'Roommate 1 age range, the field is enabled if unrelatedRoommates is Yes and totalRoommates >= 1'
          example: Under 25
        propertyLimitRoommate1:
          type: number
          format: float
          enum:
            - 0
            - 10000
            - 20000
            - 30000
            - 40000
            - 60000
            - 80000
            - 100000
            - 125000
            - 150000
          description: 'Roommate 1 property limit, the field is enabled if unrelatedRoommates is Yes and totalRoommates >= 1'
          example: 10000
        aleLimitRoommate1:
          type: number
          format: float
          enum:
            - 5000
            - 10000
            - 15000
            - 20000
            - 30000
          description: |-
            Additional Living Expenses for roommates.
                 If the corresponding aleLimitRoommate is 0, this field should not be included.
                 If the corresponding aleLimitRoommate is 10000, value should be 5000;
                 If the corresponding aleLimitRoommate is 20000 or 30000, value can be one of [5000, 10000, 15000];
                 Otherwise, can be any of the valid values
                
          example: 5000
        nameRoommate2:
          type: string
          description: 'Full Name of roommate 2, the field is enabled if unrelatedRoommates is Yes and totalRoommates >= 2'
          example: Joe Schmoe
        ageRoommate2:
          type: string
          enum:
            - Under 25
            - 25-50
            - Over 50
          description: 'Roommate 2 age range, the field is enabled if unrelatedRoommates is Yes and totalRoommates >= 2'
          example: Under 25
        propertyLimitRoommate2:
          type: number
          format: float
          enum:
            - 0
            - 10000
            - 20000
            - 30000
            - 40000
            - 60000
            - 80000
            - 100000
            - 125000
            - 150000
          description: 'Roommate 2 property limit, the field is enabled if unrelatedRoommates is Yes and totalRoommates >= 2'
          example: 10000
        aleLimitRoommate2:
          type: number
          format: float
          enum:
            - 5000
            - 10000
            - 15000
            - 20000
            - 30000
          description: |-
            Additional Living Expenses for roommates.
                 If the corresponding aleLimitRoommate is 0, this field should not be included.
                 If the corresponding aleLimitRoommate is 10000, value should be 5000;
                 If the corresponding aleLimitRoommate is 20000 or 30000, value can be one of [5000, 10000, 15000];
                 Otherwise, can be any of the valid values
                
          example: 5000
        nameRoommate3:
          type: string
          description: 'Full Name of roommate 3, the field is enabled if unrelatedRoommates is Yes and totalRoommates >= 3'
          example: Joe Bloggs
        ageRoommate3:
          type: string
          enum:
            - Under 25
            - 25-50
            - Over 50
          description: 'Roommate 3 age range, the field is enabled if unrelatedRoommates is Yes and totalRoommates >= 3'
          example: Under 25
        propertyLimitRoommate3:
          type: number
          format: float
          enum:
            - 0
            - 10000
            - 20000
            - 30000
            - 40000
            - 60000
            - 80000
            - 100000
            - 125000
            - 150000
          description: 'Roommate 3 property limit, the field is enabled if unrelatedRoommates is Yes and totalRoommates >= 3'
          example: 10000
        aleLimitRoommate3:
          type: number
          format: float
          enum:
            - 5000
            - 10000
            - 15000
            - 20000
            - 30000
          description: |-
            Additional Living Expenses for roommates.
                 If the corresponding aleLimitRoommate is 0, this field should not be included.
                 If the corresponding aleLimitRoommate is 10000, value should be 5000;
                 If the corresponding aleLimitRoommate is 20000 or 30000, value can be one of [5000, 10000, 15000];
                 Otherwise, can be any of the valid values
                
          example: 5000
        totalSemesters:
          type: string
          enum:
            - 12 months
          description: How long would you like to purchase this policy for - should always be 12 months
          example: 12 months
      required:
        - businessAddressPostal
        - businessAddressCity
        - operations
        - businessAddressStreet
    EmbeddedOptions:
      type: object
      properties:
        embeddedPlatform:
          type: string
          enum:
            - yardi
          description: Embedded platform.
          example: yardi
        embeddedType:
          type: string
          enum:
            - start
          description: Embedded Type.
          example: start
          default: start
        tenantId:
          anyOf:
            - type: string
              description: The Yardi tcode / residentId.
              example: T12345678
              x-required: true
        propertyId:
          anyOf:
            - type: string
              description: The Yardi property code / propertyId.
              example: P12345678
              x-required: true
      required:
        - embeddedPlatform
      additionalProperties: false
      description: Embedded application creation options for the embedded workflows. This field is REQUIRED when creating an embedded application.
    PaymentPeriod:
      type: string
      enum:
        - annual
        - monthly
      description: Payment period for the application
      example: annual
      default: annual
    ExternalId:
      type: string
      description: Customer's own unique ID. This ID will be included in the APOLLO application to prevent duplicate applications from being created for the client.
      example: uniqueId_12345678
    LeadSource:
      type: object
      properties:
        partnerName:
          type: string
          description: 'The partner name, for example it can be the landlord name'
          example: APOLLO Insurance
        partnerSubdomain:
          type: string
          nullable: true
          description: 'The subdomain name under the partner Name. If this field is empty, will fallback to the partner default launchpad'
          example: apollo
      required:
        - partnerName
      additionalProperties: false
      description: Contains application form question answers for the specified type of insurance.
    TenantInsuranceQuoteQuestions:
      type: object
      properties:
        businessAddressPostal:
          type: string
          pattern: '([A-Za-z]\d){3}'
          minLength: 6
          maxLength: 6
          description: Applicant Postal Code
          example: L9Y3Z2
        businessAddressCity:
          type: string
          description: Applicant City
          example: Collingwood
        operations:
          type: string
          enum:
            - High Rise
            - Low Rise
            - Townhouse
            - Semi-Detached or Duplex or Triplex
            - Detached House
            - Other
          description: What type of home does applicant need insurance for
          example: Low Rise
        nonlistedOperation:
          type: string
          description: 'Describe the type of home if operations value is Other, the field is enabled if operations is Other'
          example: Combination high rise & townhouse complex
        businessAddressStreet:
          type: string
          description: Street Address - Includes street number and street name.
          example: 123 Main Street
        businessAddressUnit:
          type: string
          description: Unit number. The field is required if the operations is High Rise or Low Rise
          example: '456'
        businessAddressProvince:
          type: string
          minLength: 2
          maxLength: 2
          description: Province code in 2 letter format
          example: 'on'
        buildingAge:
          type: string
          enum:
            - Under 35 years
            - 35-70 years
            - Over 70 years
          description: 'How old is the building you reside at, approximately'
          example: Under 35 years
          default: Under 35 years
        birthdate:
          type: string
          format: date-time
          pattern: '\d{4}-\d{2}-\d{2}'
          description: The birth date of the applicant in yyyy-mm-dd format.
          example: '1985-03-20'
        firstName:
          type: string
          description: Applicant first name
          example: John
        lastName:
          type: string
          description: Applicant last name
          example: Doe
        email:
          type: string
          format: email
          description: Applicant email
          example: john.doe@gmail.com
        phoneNumber:
          type: string
          description: 'Applicant phone number ex. 6135550148, +16135550148, (613) 555-0148'
          example: (604) 789-2341
        ageApplicant:
          type: string
          enum:
            - Under 25
            - 25-50
            - Over 50
          description: Applicant age range
          example: Under 25
          default: 25-50
        personalLiability:
          type: number
          format: float
          enum:
            - 1000000
            - 2000000
          description: How much Personal Liability coverage would the applicant like
          example: 1000000
          default: 1000000
        deductible:
          type: number
          format: float
          enum:
            - 500
            - 1000
            - 2500
          description: Policy deductible
          example: 500
          default: 2500
        propertyLimitApplicant:
          type: number
          format: float
          enum:
            - 10000
            - 20000
            - 30000
            - 40000
            - 60000
            - 80000
            - 100000
            - 125000
            - 150000
          description: Applicant personal Contents coverage limit
          example: 10000
          default: 10000
        aleLimitApplicant:
          type: number
          format: float
          enum:
            - 5000
            - 10000
            - 15000
            - 20000
            - 30000
          description: |-
            Additional Living Expenses - This coverage pays for extra costs to live while your residence is uninhabitable due to an insured loss.
                 If propertyLimitApplicant is 10000, value should be 5000;
                 If propertyLimitAppli

# --- truncated at 32 KB (42 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/apollo-insurance/refs/heads/main/openapi/apollo-insurance-affiliates.yml