4 out of 5 Stars on
Top Brands Compared
100% Free Service
Quotes in Seconds

Provider integration

API documentation

Technical reference for travel insurance providers integrating real-time quote APIs with Compare Travel Insurance New Zealand. Use this guide alongside your provider dashboard to go live on the comparison platform.

Overview

Compare Travel Insurance (CTI) aggregates quotes from participating insurers and displays them in a single comparison flow. When a traveller requests quotes, CTI forwards a QuoteRequestV2 payload to each enabled provider API and streams results back to the browser as they arrive.

You implement a REST endpoint that accepts trip details and returns priced products. CTI provides the comparison website, quote orchestration, provider portal, outbound click tracking, and review management tools.

Architecture

Each role in the integration and what it is responsible for.

RoleResponsibility
Your APIAccept QuoteRequestV2 and return QuoteResponseV2 with one or more priced products
CTI backendFan-out quote requests, rewrite hand-off URLs for click tracking, stream SSE responses
CTI websiteCollect trip details, display comparison results, redirect travellers to your purchase flow

Integration checklist

Production site: https://www.comparetravelinsurance.co.nz. All CTI platform paths below are relative to this host (e.g. /api/v1/quote/stream).

  1. 1 Create a provider account and complete your company profile.
  2. 2 Implement the Partner Quote API v2 (POST /v2/quotes) on your infrastructure.
  3. 3 In the provider dashboard API integration tab, enter your endpoint URL and bearer token.
  4. 4 Run Test integration in the dashboard to verify connectivity.
  5. 5 Contact CTI to enable your provider for production quote traffic.
POST

/v2/quotes

This is the API you must implement. CTI calls the URL configured in your provider dashboard whenever a consumer requests quotes. Configure the full URL including path — CTI posts to exactly the URL you supply.

Body

application/json
  • quoteTransactionId required

    string · example: Q-CTI-2026-00142

    Unique identifier for the quote transaction. Include in logs and hand-off URLs.

  • policyType required

    string · enum: SINGLE, ANNUAL

    Whether the traveller is requesting a single trip or annual multi-trip policy.

  • travellerAges required

    integer[] · example: [35, 32]

    Ages of adult travellers at the start of the trip.

  • singleJourneyDetails optional

    object · example: {"fromDate":"15/08/2026","toDate":"29/08/2026"}

    Required for SINGLE policies. Contains the trip departure and return dates.

  • annualMultiTripDetails optional

    object · example: {"fromDate":"15/08/2026"}

    Required for ANNUAL policies. Contains the annual cover start date.

  • destinations required

    string[] · example: ["FRA"]

    Destination country codes (IATA or ISO where applicable).

  • dependants optional

    integer · default: 0 · example: 1

    Number of dependant travellers (0–10).

  • cruiseCover optional

    boolean · default: false

    Whether cruise cover was selected on the comparison form.

  • skiCover optional

    boolean · default: false

    Whether ski or snow sports cover was selected.

  • allowsMedicalAssessment optional

    boolean · default: false

    Whether the traveller may complete a medical assessment for specialised cover.

  • coverLevels optional

    object

    Optional cover filters: cancellation, luggage, medical, excess, carRental. Use -1 or omit for unlimited where supported.

HTTP POST /v2/quotes
POST /v2/quotes HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: Bearer {apiToken}

{
  "quoteTransactionId": "Q-CTI-2026-00142",
  "policyType": "SINGLE",
  "travellerAges": [35, 32],
  "destinations": ["FRA"],
  "dependants": 0,
  "cruiseCover": false,
  "skiCover": false,
  "coverLevels": {
    "cancellation": 10000,
    "luggage": 5000,
    "medical": -1,
    "excess": 200,
    "carRental": 0
  },
  "singleJourneyDetails": {
    "fromDate": "15/08/2026",
    "toDate": "29/08/2026"
  },
  "allowsMedicalAssessment": true
}
200 Successful response containing a list of quotes.
{
  "companyInfo": "Example Travel Insurance is an Australian general insurer offering single-trip and annual travel cover.",
  "quotes": [
    {
      "quoteReference": "TRS-88291",
      "handOffUrl": "https://partner.example.com/purchase?qr=TRS-88291",
      "pdsUrl": "https://partner.example.com/pds/comprehensive.pdf",
      "tmdUrl": "https://partner.example.com/tmd/comprehensive.pdf",
      "premium": 189.5,
      "excess": 200,
      "underwriter": "Example Underwriters Ltd",
      "productCode": "INT-COMP",
      "productName": "International Comprehensive",
      "cancellationCover": 20000,
      "medicalCover": 5000000,
      "luggageCover": 8000,
      "allowsMedicalAssessment": true,
      "benefits": {
        "medical": {
          "overseasEmergencyMedical": {
            "covered": true,
            "value": 5000000,
            "unlimitedCover": false
          },
          "emergencyAssistance": {
            "covered": true,
            "unlimitedCover": true
          }
        },
        "tripDisruptionAndCancellation": {
          "cancellationsOrLostDeposits": {
            "covered": true,
            "value": 20000,
            "unlimitedCover": false
          }
        },
        "luggageAndBelongings": {
          "luggageAndPersonalBelongings": {
            "covered": true,
            "value": 8000,
            "unlimitedCover": false
          }
        }
      }
    }
  ]
}

Error responses

CTI skips providers that error or time out; other insurers still appear in the comparison.

StatusWhen
400Validation failure — return status, error, message, and validationErrors[] with field-level issue messages
401Invalid or missing bearer token
500Unexpected server error — include a safe message for logging

Quote streaming

Used by the comparison website. Request body is the same QuoteRequestV2 JSON sent to your API.

MethodPathDescription
POST/api/v1/quoteStream quotes as Server-Sent Events (WebFlux JSON stream)
POST/api/v1/quote/streamStream quotes as SSE (text/event-stream)

Outbound click tracking

When outbound tracking is enabled, CTI replaces your handOffUrl with a tracked redirect: GET /api/v1/outbound/{linkId} returns 302 to your original URL. Clicks are recorded for reporting.

Always return a valid handOffUrl in quote responses; CTI handles the rewrite in production.

Provider authentication

Authenticate with Authorization: Bearer {accessToken} or the cti HTTP-only session cookie.

MethodPathDescription
POST/api/auth/provider/signupRegister a new provider account
POST/api/auth/provider/loginLogin — returns JWT accessToken and sets cti cookie
GET/api/auth/meCurrent user profile (requires auth)

Partner portal API

Requires provider JWT. Base path: /api/v1/partner

MethodPathDescription
GET/detailsYour provider profile
PUT/detailsUpdate company details, logo, PDS link, API endpoint
PUT/api-tokenUpdate apiEndpoint and apiToken only
POST/test-connectivityTest your API from the dashboard
GET/reviewsReviews submitted for your brand
GET/invitesPending brand-representative invites
POST/invitesInvite a colleague — body { email }

Reviews & compare APIs

MethodPathDescription
GET/api/v1/reviewsPaginated reviews (providerName, page, size, moderationStatus)
GET/api/v1/reviews/provider-statsAggregate ratings for a provider
POST/api/v1/reviewsSubmit a review (authenticated consumers)
POST/api/v1/compareBenefit comparison table for selected brand/plan pairs

Performance expectations

  1. 1 Target under 5 seconds per provider response where possible; the UI streams results as they arrive.
  2. 2 Support concurrent requests — CTI fans out to all enabled providers in parallel.
  3. 3 Use quoteTransactionId in your logs to correlate CTI requests with your pricing engine.
  4. 4 Return JSON only with Content-Type: application/json.

OpenAPI specification

The canonical Partner Quote API is available on request as a YAML or JSON file. Please contact us directly if you would like a copy

Frequently asked questions

Do we need to implement exactly /v2/quotes?

The path is flexible — CTI posts to the full URL you configure in the provider dashboard. /v2/quotes is the convention in our OpenAPI spec, but your endpoint may use a different path if it accepts the same JSON shapes.

Should premiums be in dollars or cents?

Use dollars with decimal places (e.g. 189.50). New v2 integrations should use dollar amounts unless CTI advises otherwise during onboarding.

What date format should we use?

Use dd/MM/yyyy for dates nested under singleJourneyDetails or annualMultiTripDetails (e.g. 21/01/2026).

What happens if our API is slow or returns an error?

CTI streams quotes from other providers as they arrive. Your products will not appear for that comparison if your API errors or times out.

How is the handOffUrl used?

When a consumer selects your quote they are sent to handOffUrl to complete purchase. In production CTI may wrap this with /api/v1/outbound/{id} for click attribution.

How do we test before going live?

Sign in to the provider dashboard, open API integration, enter your staging endpoint and token, and run Test integration.

Ready to integrate?

Create a provider account, implement the Partner Quote API v2, and configure your endpoint in the dashboard.