The Co-operators · Arazzo Workflow

Duuo tenant insurance — quote and bind

Version 1.0.0

The full Duuo tenant (renters) insurance partner flow in Duuo's mandatory order: check eligibility with consent, add the risk detail and price it into four options, record the selection and any additional insureds, then generate the Duuo-hosted payment redirect that binds the policy. Seed inputs from sandbox/cooperators-sandbox.yml (Partner Accepted Testing).

1 workflow 1 source API 1 provider
View Spec View on GitHub InsuranceCanadaProperty and CasualtyLife InsuranceGroup BenefitsEmbedded InsuranceCo-operativeWealth ManagementPartner APIArazzoWorkflows

Provider

cooperators

Workflows

duuo-tenant-quote-and-bind
Check eligibility, price the risk, add insureds, and redirect to payment.
Duuo states the tenant operations must be executed in this order or they will error. Eligibility runs a soft credit check on a real consumer, and the payment step moves money and binds a policy with no idempotency key — neither may be retried blindly. Every consent flag below must have been captured from the customer with Duuo's verbatim disclosure text.
4 steps inputs: claimsPriorHistory, contactInfoDOB, contactInfoEmail, contactInfoFirstName, contactInfoLastName, contactInfoPhone, deductibleLimit, insuredAddressCity, insuredAddressCountry, insuredAddressPostalCode, insuredAddressProvince, insuredAddressStreet, insuredAddressUnit, insuredBuildingType, landlordEmailAddress, landlordFirstName, landlordLastName, liabilityCoverageLimit, monitoredFireDetectionSystem, monitoredSecuritySystem, monitoredWaterLeakDetectionSystem, packageSelection, paymentFrequency, personalContentCoverageLimit, policyEffectiveDate outputs: paymentUrl, quoteId, quoteSubmissionId
1
check-eligibility
checkTenantEligibility
Confirm eligibility and create the initial quote. Runs a soft credit check; personalInfoConsent and creditScoreConsent must each have been captured on their own check box with Duuo's required text.
2
update-quote
updateTenantQuote
Add the full risk detail and price it. Returns the four options (standard/enhanced, monthly/annual). All four must be displayed with coverage limits and policy wordings.
3
add-insured
addTenantQuoteInsured
Record the customer's package and payment-frequency selection plus any landlord and additional insureds. thirdPartySharingConsent must have been captured with Duuo's verbatim check-box text.
4
make-payment
createTenantQuotePayment
Generate the Duuo-hosted payment redirect. Succeeds only when all four consents are true. On successful payment the policy binds and the certificate of insurance is emailed. Money-moving and policy-binding; not idempotent.

Source API Descriptions

Arazzo Workflow Specification

Raw ↑
arazzo: 1.0.1
info:
  title: Duuo tenant insurance — quote and bind
  version: 1.0.0
  description: >-
    The full Duuo tenant (renters) insurance partner flow in Duuo's mandatory order: check
    eligibility with consent, add the risk detail and price it into four options, record the
    selection and any additional insureds, then generate the Duuo-hosted payment redirect that
    binds the policy. Seed inputs from sandbox/cooperators-sandbox.yml (Partner Accepted Testing).
sourceDescriptions:
  - name: duuo
    url: ../openapi/cooperators-duuo-platform-openapi.yml
    type: openapi
workflows:
  - workflowId: duuo-tenant-quote-and-bind
    summary: Check eligibility, price the risk, add insureds, and redirect to payment.
    description: >-
      Duuo states the tenant operations must be executed in this order or they will error.
      Eligibility runs a soft credit check on a real consumer, and the payment step moves money and
      binds a policy with no idempotency key — neither may be retried blindly. Every consent flag
      below must have been captured from the customer with Duuo's verbatim disclosure text.
    inputs:
      type: object
      required: [contactInfoEmail, insuredAddressPostalCode, insuredAddressProvince, policyEffectiveDate]
      properties:
        contactInfoEmail: {type: string, format: email}
        contactInfoFirstName: {type: string}
        contactInfoLastName: {type: string}
        contactInfoDOB: {type: string, format: date}
        contactInfoPhone: {type: string}
        insuredAddressProvince: {type: string, enum: [AB, BC, MB, NB, NS, ON, PE, SK]}
        insuredAddressPostalCode: {type: string, description: '"LNL NLN" format.'}
        insuredAddressUnit: {type: string}
        insuredAddressStreet: {type: string}
        insuredAddressCity: {type: string}
        insuredAddressCountry: {type: string}
        insuredBuildingType: {type: string}
        claimsPriorHistory: {type: boolean}
        monitoredSecuritySystem: {type: boolean}
        monitoredFireDetectionSystem: {type: boolean}
        monitoredWaterLeakDetectionSystem: {type: boolean}
        policyEffectiveDate: {type: string, format: date, description: Tomorrow up to 30 days out; never today.}
        personalContentCoverageLimit: {type: string, enum: ['10000', '25000', '50000', '75000', '100000', '150000']}
        liabilityCoverageLimit: {type: string, enum: ['1000000', '2000000']}
        deductibleLimit: {type: string, enum: ['1000', '2000', '3000', '5000']}
        packageSelection: {type: string, enum: [premium, standard]}
        paymentFrequency: {type: string, enum: [monthly, annually]}
        landlordFirstName: {type: string}
        landlordLastName: {type: string}
        landlordEmailAddress: {type: string, format: email}
    steps:
      - stepId: check-eligibility
        description: >-
          Confirm eligibility and create the initial quote. Runs a soft credit check;
          personalInfoConsent and creditScoreConsent must each have been captured on their own
          check box with Duuo's required text.
        operationId: checkTenantEligibility
        requestBody:
          contentType: application/json
          payload:
            personalInfoConsent: true
            creditScoreConsent: true
            insuredAddressProvince: $inputs.insuredAddressProvince
            contactInfoEmail: $inputs.contactInfoEmail
            languageLocal: en_US
            insuredAddressPostalCode: $inputs.insuredAddressPostalCode
        successCriteria:
          - condition: $statusCode == 200
        outputs:
          quoteId: $response.body#/data/resolved/message/quoteId
          quoteSubmissionId: $response.body#/data/resolved/message/quoteSubmissionId
          quoteExpirationDate: $response.body#/data/resolved/message/quoteExpirationDate
      - stepId: update-quote
        description: >-
          Add the full risk detail and price it. Returns the four options (standard/enhanced,
          monthly/annual). All four must be displayed with coverage limits and policy wordings.
        operationId: updateTenantQuote
        parameters:
          - name: quoteSubmissionId
            in: path
            value: $steps.check-eligibility.outputs.quoteSubmissionId
        requestBody:
          contentType: application/json
          payload:
            insuredAddressUnit: $inputs.insuredAddressUnit
            insuredAddressCity: $inputs.insuredAddressCity
            insuredAddressCountry: $inputs.insuredAddressCountry
            insuredAddressStreet: $inputs.insuredAddressStreet
            insuredAddressPostalCode: $inputs.insuredAddressPostalCode
            insuredBuildingType: $inputs.insuredBuildingType
            contactInfoFirstName: $inputs.contactInfoFirstName
            contactInfoLastName: $inputs.contactInfoLastName
            contactInfoDOB: $inputs.contactInfoDOB
            contactInfoEmail: $inputs.contactInfoEmail
            contactInfoPhone: $inputs.contactInfoPhone
            claimsPriorHistory: $inputs.claimsPriorHistory
            monitoredSecuritySystem: $inputs.monitoredSecuritySystem
            monitoredFireDetectionSystem: $inputs.monitoredFireDetectionSystem
            monitoredWaterLeakDetectionSystem: $inputs.monitoredWaterLeakDetectionSystem
            policyEffectiveDate: $inputs.policyEffectiveDate
            personalContentCoverageLimit: $inputs.personalContentCoverageLimit
            liabilityCoverageLimit: $inputs.liabilityCoverageLimit
            deductibleLimit: $inputs.deductibleLimit
        successCriteria:
          - condition: $statusCode == 200
        outputs:
          standardYearly: $response.body#/data/resolved/message/heChargedPremTotalStandardYearly
          premiumYearly: $response.body#/data/resolved/message/heChargedPremTotalPremiumYearly
          standardMonthly: $response.body#/data/resolved/message/heChargedPremTotalStandardMonthly
          premiumMonthly: $response.body#/data/resolved/message/heChargedPremTotalPremiumMonthly
      - stepId: add-insured
        description: >-
          Record the customer's package and payment-frequency selection plus any landlord and
          additional insureds. thirdPartySharingConsent must have been captured with Duuo's
          verbatim check-box text.
        operationId: addTenantQuoteInsured
        parameters:
          - name: quoteSubmissionId
            in: path
            value: $steps.check-eligibility.outputs.quoteSubmissionId
        requestBody:
          contentType: application/json
          payload:
            packageSelection: $inputs.packageSelection
            paymentFrequency: $inputs.paymentFrequency
            paymentMethod: credit
            languageLocal: en_US
            landlordFirstName: $inputs.landlordFirstName
            landlordLastName: $inputs.landlordLastName
            landlordEmailAddress: $inputs.landlordEmailAddress
            thirdPartySharingConsent: true
        successCriteria:
          - condition: $statusCode == 200
      - stepId: make-payment
        description: >-
          Generate the Duuo-hosted payment redirect. Succeeds only when all four consents are true.
          On successful payment the policy binds and the certificate of insurance is emailed.
          Money-moving and policy-binding; not idempotent.
        operationId: createTenantQuotePayment
        parameters:
          - name: quoteSubmissionId
            in: path
            value: $steps.check-eligibility.outputs.quoteSubmissionId
        requestBody:
          contentType: application/json
          payload:
            bindOnPayment: true
            paymentAndTermsOfUseConsent: true
        successCriteria:
          - condition: $statusCode == 200
        outputs:
          paymentUrl: $response.body#/data/resolved/message/url
          statusReferenceId: $response.body#/data/resolved/message/statusReferenceId
    outputs:
      quoteId: $steps.check-eligibility.outputs.quoteId
      quoteSubmissionId: $steps.check-eligibility.outputs.quoteSubmissionId
      paymentUrl: $steps.make-payment.outputs.paymentUrl