Integration Flow

AngleHealth Platforms API (1.1.2)

Getting Started

Welcome to the Angle Health API! This guide will help you get started with creating quotes, uploading necessary documents, and retrieving rates for medical plans. Follow the steps below to begin your integration. The Angle Health APIs enable you to create a quote by providing essential group-level data. Once the quote is initiated, you'll upload supporting documents such as:

  • Experience Information
  • Current Rates
  • Renewal Rates
  • High Cost Claimant Report

After processing, you'll receive rates for each plan included in your request!

Creating Quotes

In order to generate a quote we need to follow a full quoting workflow. This workflow consists of generating a draft quote, attaching experience documents to this quote, add past medical plans and finally poll for completion.

Auth and Drafts

Getting started is straightforward — all you need is an API Key to authenticate your requests. If you haven't received yours yet, reach out to platform_quoting@anglehealth.com and we'll get you set up.

Platform Quoting Workflow 1

Figure 1. The process starts by creating a draft quote. Then you're presented with two options.

Comprehensive Quoting

Now that we have a quote in place, we will now attach context to it in order to make the quote more accurate. For this purpose we allow uploads of two types of data: Experience Documents: such as renewals rates, high cost claimant reports and current rates; and Past Medical Plans, which allow us to understand the dynamics of group behaviors and choices.

Platform Quoting Workflow 2

Figure 2. Comprehensive quoting requires the addition of at least past plans or experience documents.

Available Quote Results

The final step of quoting with Angle Platforms is to poll our servers for rates generation completion; once completed, you will receive three items: a healthscore card, which will have important information for your quoters to understand this group and its behaviors; plan rates for plans selected for quoting; and a proposal document with all the information requested.

Platform Quoting Workflow 3

Figure 3. The three mains results are: rates, Angle's HealthScore Card and Angle Proposal.

Rate Delivery

Every quote goes through an underwriting review process. We carefully evaluate the group's census, experience documents, and past medical plans to ensure the rates we return are firm and sellable.

As of April 21, 2026, quotes in production that pass this review without manual escalation typically return rates within about 15 minutes to one hour. We are actively working to narrow that turnaround window so delivery becomes faster and more predictable.

The outcome of that review determines how quickly you receive rates:

  • Automated review — The majority of quotes are processed automatically, within the production timing above when no manual review is required.
  • Manual review — Some quotes require additional attention from our underwriting team, which can take a few business days. This review exists to uphold the accuracy and reliability of every set of rates we deliver.

Angle will always deliver rates once they are ready, regardless of how long the review takes. As a platform partner, you may define your own internal timeout threshold — if a quote exceeds your expected window, you can treat it as pending on your end. The rates-status endpoint will still reflect the final status once the quote is complete.

Angle Base Plans

Below is a list of our standard plans organized by year, each identified by a unique ID. You can access the Summary of Benefits (SOB) and Summary of Benefits and Coverage (SBC) for each plan by clicking the respective links. Please note that plans from different tiers cannot be included in the same quote request.

2026 Two Tier Plans (Click to expand/collapse)

If you provide the plan IDs exactly as listed, the network will default to CIGNA.

You cannot mix different networks in the same request — all plans must be quoted using the same network.

ANG HDHP 3400 3400 (BENLFUT4003400)
ANG HDHP 3400 5000 (BENLFUT4005000)
ANG HDHP 1700 1700 (BENLFUT7001700)
ANG HDHP 5000 5000 (BENLFUT9001003)
ANG HDHP 7000 7000 (BENLFUT9001004)
ANG HDHP 4000 7000 (BENLFUT9001006)
ANG TRAD 500 1500 (BENLFUT9001007)
ANG TRAD 1000 2000 (BENLFUT9001008)
ANG TRAD 2000 4000 (BENLFUT9001009)
ANG TRAD 3000 5000 (BENLFUT9001010)
ANG TRAD 4000 6000 (BENLFUT9001011)
ANG TRAD 5000 7000 (BENLFUT9001012)
ANG TRAD 7000 9200 (BENLFUT9001016)
ANG TRAD 8000 9200 (BENLFUT9001017)
ANG HDHP 8000 8000 (BENLFUT9001019)
ANG VALUE 9200 (BENLFUT9001020)
ANG TRAD 9200 9200 (BENLFUT9001117)
ANG VALUE 5000 (BENLFUT9005000)
ANG VALUE 7500 (BENLFUT9007500)
2026 Three Tier Plans (Click to expand/collapse)

The network for these plans will be NOMI.

Three-tier network availability has not yet launched nationwide. It is currently limited to specific zip codes, with coverage expanding each month. If a group you're quoting does not meet the eligibility criteria for a three-tier network, the quote creation endpoint will return a Bad Request with details about the exception.

ANG NOMI TRAD 1000 2000 (ANGNOMITRAD100020002026)
ANG NOMI TRAD 2000 4000 (ANGNOMITRAD200040002026)
ANG NOMI TRAD 3000 5000 (ANGNOMITRAD300050002026)
ANG NOMI TRAD 4000 6000 (ANGNOMITRAD400060002026)
ANG NOMI TRAD 5000 7000 (ANGNOMITRAD500070002026)
ANG NOMI TRAD 7000 9200 (ANGNOMITRAD700092002026)

Frequently Asked Questions (FAQ)

Below are some common questions and answers about the AngleHealth Platforms API to help you get started quickly.

What happens when my quote goes into Manual Review?

When a quote is flagged for manual review, it just means our underwriting team needs to take a closer look before we can release the final rates. This usually takes a couple of business days.

While it's under review, we recommend checking back for updated rates at least 2–3 times a day — midday, afternoon, and evening — as updates can happen asynchronously.

Manual review is expected to be rare; the majority of quotes should return rates automatically.

Why do I need to provide plan IDs?

We ask for plan IDs because different groups care about different benefit designs. What might be a perfect fit for one group could be less appealing to another.

By sending us the specific plan IDs you're interested in — or all of them, if you prefer — we can make sure to attach the right plan options to each quote. All our plans are eligible to be attached to any quote.

What if I am interested in obtaining rates for both 2-tier and 3-tier plans for the same group?

Separate quotes will need to be created. Plans from different tiers cannot be combined in the same request, so you will need to submit two individual quotes.

When can I move to the production environment?

We recommend starting in the test environment so you can safely explore the APIs, map responses, and understand the full flow.

Once your integration is stable, we can move to production for final testing. Just keep in mind that real data and real rates are only available in the production environment, so that step is essential for full validation.


Need help with something not covered here? Contact our engineering support team at platform_quoting@anglehealth.com.

Documentation Changelog

2026-05-02

  • POST /quotes: Added optional field sic_code (string, 4 characters) — Standard Industrial Classification code for the group's industry. This field will become mandatory in a future release; the exact date will be communicated. Partners are encouraged to start sending it now.

2026-04-26

  • POST /quotes/{quoteId}/past-medical-plans: Added validation constraints (min/max) to all numeric fields based on backend rules. coinsurance now explicitly documented as the member's cost share as a decimal (e.g. 0.1 = member pays 10%); sending plan cost share instead will produce incorrect results. Fixed required field list — singleEnrollmentCount, employeeSpouseEnrollmentCount, employeeChildrenEnrollmentCount, familyEnrollmentCount, singleCurrentRate, employeeSpouseCurrentRate, employeeChildrenCurrentRate, and familyCurrentRate are all required. Fixed response schema: added missing entryId and type fields; corrected rate fields to number type (response returns float values).
  • POST /quotes: Added optional quoteType field (level_funded).
  • GET /quotes: Added minimum: 1 and maximum: 75 constraints to limit parameter; added minimum: 0 to offset. Corrected effectiveDate response format to MM/DD/YYYY.
  • GET /quotes/{quoteId}: Corrected effective_date response format to MM-DD-YYYY.
  • Census gender field: Added m and f as accepted shorthand values alongside male and female.

2026-04-21

  • Added optional currentCarrier field to POST /quotes to indicate the group's current insurance carrier.

2026-03-30

  • AETNA has been removed as a network option; it is no longer available.

2026-03-02

  • currentCoverageType is now a required field on POST /quotes (Create Draft Quote) for new integrations.
  • Added new currentCoverageType option: peo_association (PEO Association).

2026-01-28

  • Added POST /quotes/{quoteId}/mark-sold endpoint to allow marking a quote as sold.
  • Updated error response documentation to use the correct keys returned by the API:
    • GET /quotes/{quoteId} 403 now documents detail instead of message.
    • GET /quotes/{quoteId} 404 now documents description and requestId.
    • Quoting-related endpoints now consistently document detail as the error message field for 4xx responses.

2025-12-01

  • Removed 2025 plans as quoting for 2025 has ended.
  • Reorganized 2026 plans into Two Tier and Three Tier sections.

2025-11-19

POST /quote updates:

  • Changed member.gender field to required.
  • Removed member.enrolled. All members are assumed to be enrolled.
  • Removed quote_type. level_funded is the only choice, we will default to it.
  • Removed eligible_employees.

These changes are backward compatible.

Quotes

Set of API endpoints to manage quoting, this includes creation, rate generation.

Create a Draft Quote

Creates a draft quote. The basic information provided will be saved, an identifier will be returned which should be used in following requests.

Note: For the census, the minimum is 10 total members across all states. Additionally, a minimum number of subscribers applies per state — please inquire for more information.

💡 Testing Environment Tip:
For testing different scenarios in a test environment, include one of the following parameters in the group name:
desired_status=quoted
desired_status=need_review
desired_status=dtq
Example: "My Ideal Group desired_status=quoted".
This makes the GET rates-status endpoint (explained later) return the desired status. This is necessary because in a test environment, we can't guarantee accurate information based on the information provided. Real rates require real information, and PHI/PII information can't be provided in a test environment.

Authorizations:
APIKey
Request Body schema: application/json
groupName
required
string

The name of the group.

effectiveDate
required
string <date>

Effective date for the quote (format: YYYY-MM-DD).

sic_code
string = 4 characters

Standard Industrial Classification (SIC) code for the group's industry. Currently optional, but will become mandatory in a future release — date to be communicated. Partners are encouraged to start sending this field now.

employerZipCode
required
string

Employer's ZIP code.

required
Array of objects (Member)

List of members' census data.

planIds
required
Array of strings

List of plan IDs to associate with the quote.

object

Broker information.

prevMonthlyPremium
number <double>

Current monthly health plan spend.

renewalMonthlyPremium
number <double>

Renewal monthly health plan spend.

quoteType
string
Value: "level_funded"

Group's funding type.

currentCoverageType
required
string
Enum: "aca" "non_aca_fully_insured" "level_funded" "self_funded" "no_coverage" "peo_association"

Current coverage type.

  • aca - Affordable Care Act
  • non_aca_fully_insured - Non ACA Fully Insured
  • level_funded - Level Funded
  • self_funded - Self Funded
  • no_coverage - No Coverage
  • peo_association - PEO Association
currentCarrier
string

Name of the group's current insurance carrier.

Responses

Request samples

Content type
application/json
{
  • "groupName": "Platform Group, Inc.",
  • "effectiveDate": "2025-01-01",
  • "sic_code": "7372",
  • "employerZipCode": "84001",
  • "groupCensus": [
    ],
  • "planIds": [
    ],
  • "broker": {
    },
  • "prevMonthlyPremium": 0.1,
  • "renewalMonthlyPremium": 0.1,
  • "quoteType": "level_funded",
  • "currentCoverageType": "aca",
  • "currentCarrier": "Cigna"
}

Response samples

Content type
application/json
{
  • "quoteId": 1234,
  • "description": "Draft quote created successfully."
}

List all Quotes

Retrieve a paginated list of all quotes created by the platform.

Authorizations:
APIKey
query Parameters
limit
integer

The number of items to return. Max 75.

offset
integer

The number of items to skip before starting to collect the result set.

Responses

Response samples

Content type
application/json
{}

Get Quote

The basic information provided will be retrieved. If the quote is processed it will return rates.

Authorizations:
APIKey
path Parameters
quoteId
required
integer

Unique identifier of the quote.

Responses

Response samples

Content type
application/json
{
  • "quote_id": 1234,
  • "effective_date": "01-01-2025",
  • "plan_tiers": [
    ]
}

Add Files To Quote

Attach documents to a draft quote. This is the main mechanism for comprehensive quoting. These files help in providing more accurate rates. Files must all be of the same type, with a limit of 10 files per request, and each file must not exceed 100 MiB.

Example cURL Request

Below is an example of how to use curl to attach files to a quote:

curl -X POST "https://api-test.anglewellness.com/quoting/v2/quotes/123/files" \
  -H "Authorization: YOUR_API_KEY" \
  -F "files=@/path/to/quote1.pdf" \
  -F "files=@/path/to/quote2.pdf"

Notes:

  • Replace YOUR_API_KEY with your actual API key.
  • Replace 123 with the target quote ID.
  • Provide valid file paths for each -F argument.
  • Ensure files are of the same type and do not exceed 100 MiB.
Authorizations:
APIKey
path Parameters
quoteId
required
integer

Unique identifier of the quote to which files will be attached.

Request Body schema: multipart/form-data
required
files
required
Array of strings <binary> [ items <binary > ]

Responses

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Add Past Plan to Draft Quote

Creates a past medical plan associated with a specific quote. The plan includes enrollment counts, rates, and cost-sharing details. It will automatically be linked to the provided quote.

Note

When submitting a past medical plan, please ensure that current and renewal rates are provided only for major medical plans. Rates for other types of coverage (such as vision, AD&D, or life insurance) should not be included.

The following fields must be provided at the same time depending on the information provided:

  • singleEnrollmentCount, employeeSpouseEnrollmentCount, employeeChildrenEnrollmentCount, and familyEnrollmentCount must be provided together.
  • singleCurrentRate, employeeSpouseCurrentRate, employeeChildrenCurrentRate, and familyCurrentRate must be provided together.
  • singleRenewalRate, employeeSpouseRenewalRate, employeeChildrenRenewalRate, and familyRenewalRate must be provided together.
Authorizations:
APIKey
path Parameters
quoteId
required
integer

Unique identifier of the quote.

Request Body schema: application/json
required
planName
required
string [ 1 .. 255 ] characters

Name of the past medical plan.

isHsa
required
boolean

Indicates if the plan is HSA (true) or Traditional (false).

individualInnDeductible
required
integer >= 0

Individual in-network deductible.

individualInnOopMax
required
integer [ 0 .. 9100 ]

Individual in-network out-of-pocket maximum.

coinsurance
required
number <double> [ 0 .. 0.5 ]

Member's coinsurance as a decimal representing the share of costs the member pays after the deductible (e.g. 0.1 = member pays 10%, plan covers 90%). A value of 0 means the plan covers 100% of costs after the deductible. Do not send the plan's cost share — if your system expresses this as plan coverage (e.g. 90% plan = 10% member), convert it before sending (member_coinsurance = 1 - plan_coverage).

singleEnrollmentCount
required
integer >= 0

Count of single enrollments.

employeeSpouseEnrollmentCount
required
integer >= 0

Count of employee + spouse enrollments.

employeeChildrenEnrollmentCount
required
integer >= 0

Count of employee + children enrollments.

familyEnrollmentCount
required
integer >= 0

Count of family enrollments.

singleCurrentRate
required
integer [ 200 .. 4000 ]

Current rate for single enrollments.

employeeSpouseCurrentRate
required
integer [ 420 .. 8400 ]

Current rate for employee + spouse enrollments.

employeeChildrenCurrentRate
required
integer [ 380 .. 7600 ]

Current rate for employee + children enrollments.

familyCurrentRate
required
integer [ 620 .. 12400 ]

Current rate for family enrollments.

singleRenewalRate
integer or null [ 200 .. 4000 ]

Renewal rate for single enrollments.

employeeSpouseRenewalRate
integer or null [ 420 .. 8400 ]

Renewal rate for employee + spouse enrollments.

employeeChildrenRenewalRate
integer or null [ 380 .. 7600 ]

Renewal rate for employee + children enrollments.

familyRenewalRate
integer or null [ 620 .. 12400 ]

Renewal rate for family enrollments.

Responses

Request samples

Content type
application/json
{
  • "planName": "Gold Plan",
  • "isHsa": true,
  • "individualInnDeductible": 1050,
  • "individualInnOopMax": 2000,
  • "coinsurance": 0.1,
  • "singleEnrollmentCount": 1,
  • "employeeSpouseEnrollmentCount": 2,
  • "employeeChildrenEnrollmentCount": 3,
  • "familyEnrollmentCount": 4,
  • "singleCurrentRate": 500,
  • "employeeSpouseCurrentRate": 1050,
  • "employeeChildrenCurrentRate": 950,
  • "familyCurrentRate": 1550,
  • "singleRenewalRate": 200,
  • "employeeSpouseRenewalRate": 420,
  • "employeeChildrenRenewalRate": 380,
  • "familyRenewalRate": 620
}

Response samples

Content type
application/json
{
  • "entryId": 42,
  • "type": "traditional",
  • "planName": "Gold Plan",
  • "isHsa": true,
  • "individualInnDeductible": 1050,
  • "individualInnOopMax": 2000,
  • "coinsurance": 0.1,
  • "singleEnrollmentCount": 1,
  • "employeeSpouseEnrollmentCount": 2,
  • "employeeChildrenEnrollmentCount": 3,
  • "familyEnrollmentCount": 4,
  • "singleCurrentRate": 500,
  • "employeeSpouseCurrentRate": 1050,
  • "employeeChildrenCurrentRate": 950,
  • "familyCurrentRate": 1550,
  • "singleRenewalRate": 200,
  • "employeeSpouseRenewalRate": 420,
  • "employeeChildrenRenewalRate": 380,
  • "familyRenewalRate": 620
}

Get Rates from Quote

Retrieves the status of the rates calculation process for a specific quote. If it is the first call, the process will be initiated, and subsequent calls will return the status. If the status returned is need_review, it means the quote has been flagged for manual review.

Authorizations:
APIKey
path Parameters
quoteId
required
integer

Unique identifier of the quote.

Responses

Response samples

Content type
application/json
{
  • "status": "need_review",
  • "description": "The quote's rate calculation is in progress."
}

Mark Quote as Sold

Marks an existing quote as sold. This endpoint does not require a request body.

Authorizations:
APIKey
path Parameters
quoteId
required
integer

Unique identifier of the quote.

Responses

Response samples

Content type
application/json
{
  • "groupName": "Platform Group, Inc desired_status=quoted",
  • "effectiveDate": "2026-02-01",
  • "quoteType": "level_funded",
  • "planNames": [
    ],
  • "state": "UT",
  • "groupSize": 5,
  • "brokerFirstName": "Autogenerated",
  • "brokerLastName": "External Quoting",
  • "brokerAgency": "Agency Name Example",
  • "quoteId": "20362"
}

Proposal Documents

Set of API endpoints to get proposal documents such as proposal with rates and health scorecard. For the following endpoints, it is required that the GET /rates-status endpoint has returned completed; otherwise, these endpoints will fail to return results.

Get Proposal from Quote

Get a quote with rates. This endpoints returns a URL to your proposal with rates.

Authorizations:
APIKey
path Parameters
quoteId
required
integer

Unique identifier of the quote.

Responses

Response samples

Get Health Scorecard from Quote

Retrieves the public URL for the health scorecard document associated with a specific quote.

The quote must be in a terminal state: either rates are available or the quote has been declined to quote (DTQ). In those cases, this endpoint returns 200 with the PDF link. If the request is made before rates are ready (i.e. the quote is not yet in a terminal state), the API returns 400 Bad Request.

Authorizations:
APIKey
path Parameters
quoteId
required
integer

Unique identifier of the quote.

Responses

Response samples