Home
Arazzo
The Co-operators
Duuo tenant insurance — quote and bind
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
Insurance Canada Property and Casualty Life Insurance Group Benefits Embedded Insurance Cooperative Wealth Management Partner API Arazzo Workflows
Provider
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
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
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.