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 InsuranceCooperativeWealth 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
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
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
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
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: tenantInsuranceApi
  url: ../openapi/cooperators-tenant-insurance-api-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

Work with this as data

Every workflow here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for arazzo workflows

4 MCP tools reach this
  • find_arazzoBrowse and filter every workflow in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This workflow
curl "https://apis.io/api/v1/arazzo/cooperators-tenant-insurance-quote-and-bind"
All arazzo workflows
curl "https://apis.io/api/v1/arazzo?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.