Skip to main content

Quickstart

This guide walks you through authenticating with the API and getting your first insurance quote.

Prerequisites

  • API credentials (username and password) from Cover Whale — request access if you don’t have them
  • A tool for making HTTP requests (cURL, Postman, or your preferred HTTP client)

Step 1: Authenticate

Exchange your credentials for an access token:
curl -X POST https://app.coverwhale.com/api/v1/authentication \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "username": "your-email@example.com",
    "password": "your-password"
  }'
Response:
{
  "AccessToken": "eyJraWQiOiJnRk5oTTh2RnRKWXVDVXU1S...",
  "RefreshToken": "eyJjdHkiOiJKV1QiLCJlbmMiOi...",
  "ExpiresIn": 3600
}
Save the AccessToken — you’ll include it in all subsequent requests. It expires after 3600 seconds (1 hour).

Step 2: Get an Indication

Submit basic information to get preliminary pricing. The request body is organized by section — insured info, coverage options, and addresses:
curl -X POST https://app.coverwhale.com/api/v1/getindication \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "AccessToken: YOUR_ACCESS_TOKEN" \
  -d '{
    "insuredInformation": {
      "dotNumber": 1234567,
      "legalName": "ACME TRUCKING LLC",
      "yearsInBusiness": 3
    },
    "coverage": {
      "requestAl": "Y",
      "requestApd": "Y",
      "requestMtc": "Y",
      "effectiveDate": "03/01/2026"
    },
    "garageAddress": {
      "garageState": "CA",
      "garageZip": "90016"
    },
    "mailingAddress": {
      "mailingState": "CA",
      "mailingZip": "90016"
    },
    "limits": {
      "nbrOfTrucks": 3,
      "valueOfTrucks": 150000
    }
  }'
Response:
{
  "status": "Indication",
  "submission_number": "2172961",
  "coverages": {
    "al": {
      "totalCost": 0,
      "premium": 20617.52,
      "limit": 1000000,
      "deductible": 0
    }
  }
}
The response includes preliminary pricing for each requested coverage line (AL, APD, MTC, etc.).
The submission_number in the response is your key identifier. Save it — you’ll use it for checking status, binding, endorsements, and every other operation on this submission.

Step 3: Get a Full Quote

For final pricing, submit the complete application with insured details, addresses, vehicles, and drivers:
curl -X POST https://app.coverwhale.com/api/v1/getquote \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "AccessToken: YOUR_ACCESS_TOKEN" \
  -d '{
    "insuredInformation": {
      "dotNumber": 1234567,
      "legalName": "ACME TRUCKING LLC",
      "yearsInBusiness": 3,
      "email": "insured@example.com"
    },
    "coverage": {
      "requestAl": "Y",
      "requestApd": "Y",
      "requestMtc": "Y",
      "effectiveDate": "03/01/2026"
    },
    "garageAddress": {
      "garageStreet": "123 Main St",
      "garageCity": "Los Angeles",
      "garageState": "CA",
      "garageZip": "90016",
      "garageCounty": "Los Angeles"
    },
    "mailingAddress": {
      "mailingStreet": "123 Main St",
      "mailingCity": "Los Angeles",
      "mailingState": "CA",
      "mailingZip": "90016",
      "mailingCounty": "Los Angeles"
    },
    "limits": {
      "nbrOfTrucks": 3,
      "valueOfTrucks": 150000,
      "limitAutoLiability": 1000000
    },
    "vehicles": [
      {
        "year": 2020,
        "make": "Freightliner",
        "model": "Cascadia",
        "vin": "1FUJGLDR0CLBK5432",
        "value": 55000,
        "classKey": "1"
      }
    ],
    "drivers": [
      {
        "firstName": "John",
        "lastName": "Doe",
        "dateOfBirth": "06/15/1985",
        "licenseState": "CA",
        "licenseNumber": "D1234567",
        "yearsExperience": 8
      }
    ]
  }'
Response:
{
  "status": "Quoted",
  "submission_number": "2172961",
  "coverages": {
    "al": {
      "totalCost": 20617.52,
      "premium": 20617.52,
      "limit": 1000000,
      "deductible": 0
    }
  }
}
The response includes final pricing with premiums, fees, limits, and deductibles for each coverage line.

Step 4: Check Submission Status

After submitting a quote, check its status. The submission moves through a lifecycle: Submitted → In Review → Quoted → Request to Bind → Bound.
curl -X GET https://app.coverwhale.com/api/v1/submission/2172961 \
  -H "Accept: application/json" \
  -H "AccessToken: YOUR_ACCESS_TOKEN"
Once the status is Quoted, you can proceed to bind.

Step 5: Bind the Quote

Binding converts the quote into an active insurance policy. You’ll select which coverage lines to include and provide binding details:
curl -X PUT https://app.coverwhale.com/api/v1/bind/2172961 \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "AccessToken: YOUR_ACCESS_TOKEN" \
  -d '{
    "coverage": {
      "includeAL": "Y",
      "includeAPD": "Y",
      "includeMTC": "Y",
      "brokerFeeAL": 10,
      "brokerFeeAPD": 10,
      "brokerFeeMTC": 10,
      "optInCWFinancing": "N",
      "electTRIA": "N",
      "effectiveDate": "03/01/2026"
    },
    "bindingMethod": {
      "signFirst": "N",
      "electronicSignature": "Y",
      "retailAgentEmail": "agent@example.com",
      "insuredEmail": "insured@example.com",
      "insuredFullName": "John Doe"
    },
    "shippingAddress": {
      "dashcam_shipping_address": "insured",
      "street": "123 Main St",
      "city": "Los Angeles",
      "state": "CA",
      "zip": "90016",
      "county": "Los Angeles"
    }
  }'
Response:
{
  "status": "success"
}
After binding, the submission status changes to Request to Bind. Cover Whale’s underwriting team reviews and finalizes the policy — the status then moves to Bound and policy documents are generated. That’s the complete flow: Authenticate → Get Pricing → Submit Quote → Bind Policy.

Next Steps