> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.kota.io/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.kota.io/_mcp/server.

# Retrieve the quote for a group quote intent

GET https://test.api.kota.io/group_quote_intents/{group_quote_intent_id}/quote

Retrieves the quote details for a `group_quote_intent`. Returns pricing information and a fresh PDF URL. Only available when status is `quote_available`.

Reference: https://docs.kota.io/api-reference/group-quote-intents/get-group-quote-intent-quote

## Authentication

- `Authorization` header (bearer token, required) — Authorization header using the Bearer scheme

## Servers

- `https://test.api.kota.io` (test, default)
- `https://api.kota.io` (production)

## Request

### Path parameters

- `group_quote_intent_id` (string, required)

### Headers

- `X-Platform-Id` (string, optional) — The target platform id. Required only when calling with a dashboard (WorkOS AuthKit) access token instead of a platform API key — the token carries no platform claim, so the caller must say which platform it means. Ignored for platform API key / embed session token callers.

## Response

### 200

OK

- `employee_count` (integer, required) — Number of employees covered by the quote. On a multi-level quote, the sum across levels.
- `total_monthly_premium` (double, required) — Total monthly premium for the group, excluding any insurance premium tax. Tax is a separate line of `breakdown`.
- `total_annual_premium` (double, required) — Total annual premium for the group, excluding any insurance premium tax. Where the provider prices the year in its own right, this is that figure rather than twelve times the monthly premium.
- `currency` (string, required) — Currency of the premium (e.g. EUR, GBP). Every level of a quote is in one currency today; when a quote can span currencies, the totals and this field become null and `levels[].currency` is the only answer.
- `breakdown` (list of GroupQuoteBreakdownEntryResponse, required) — What makes up the annual cost: the premium, and the insurance premium tax charged on it when there is any. Amounts are annual and sum to what the employer pays.
- `quote_pdfs` (list of GroupQuoteDocumentResponse, required) — The documents the provider issued for the quote as a whole. Documents issued per level are on `levels[].quote_pdfs` instead, and never repeated here.
- `levels` (list of GroupQuoteLevelResponse, required) — The priced levels of the quote, one per level of the intent — match them up by `group_id` and `plan_id` rather than by position. Always present: a single quote returns one entry, so a consumer reads one shape for both.
- `generated_at` (datetime, required) — When the quote was generated
- `expires_at` (datetime, required) — When the quote expires
- `cost_sharing` (CostSharingConfigurationResponse, optional) — Cost sharing configuration for the quote. Null on a multi-level quote, whose cost sharing is per level — read it from `levels[].cost_sharing`.
- `pdf_url` (string, optional, nullable) — URL to download the quote PDF. The first whole-quote document, or the first level document when the provider issued none for the quote as a whole. Prefer `quote_pdfs`, which returns every document rather than one of them.
- `pdf_expires_at` (datetime, optional, nullable) — When the PDF URL expires
- `object` (string, optional) — Object type identifier

## Errors

### 400 Bad Request Error

Bad Request

- `type` (string, optional, nullable)
- `title` (string, optional, nullable)
- `status` (integer, optional, nullable)
- `detail` (string, optional, nullable)
- `instance` (string, optional, nullable)

### 404 Not Found Error

Not Found

- `type` (string, optional, nullable)
- `title` (string, optional, nullable)
- `status` (integer, optional, nullable)
- `detail` (string, optional, nullable)
- `instance` (string, optional, nullable)

## Types

### GroupQuoteBreakdownEntryResponse

- `type` (enum, required) — What this line is. New kinds may be added, so treat an unrecognised value as an additional cost rather than an error.
  - Allowed values: `premium`, `insurance_premium_tax`
- `currency` (string, required) — Currency of the amount (e.g. EUR, GBP).
- `amount` (double, required) — The annual amount of this line.

### GroupQuoteDocumentResponse

- `url` (string, required) — URL to download the document.
- `expires_at` (datetime, required) — When the URL expires.

### GroupQuoteLevelResponse

- `group_id` (string, required) — Unique identifier for the group this level covers.
- `plan_id` (string, required) — Unique identifier for the plan this level is priced on.
- `employee_count` (integer, required) — Number of employees of this group covered by this level.
- `currency` (string, required) — Currency of this level's premiums (e.g. EUR, GBP).
- `monthly_premium` (double, required) — This level's monthly premium, excluding any insurance premium tax.
- `annual_premium` (double, required) — This level's annual premium, excluding any insurance premium tax.
- `cost_sharing` (CostSharingConfigurationResponse, required) — Cost sharing configuration for this level.
- `quote_pdfs` (list of GroupQuoteDocumentResponse, required) — The documents the provider issued for this level specifically. Empty when it issued them for the quote as a whole instead — those are on the quote's `quote_pdfs`.

### CostSharingConfigurationResponse

- `type` (enum, required) — Cost sharing type. Determines which sub-object is populated.
  - Allowed values: `member_count`, `member_selection`, `member_selection_percentage_based`, `percentage`, `policyholder_only`, `family_type`, `fixed_amount`, `full_coverage`
- `member_count` (MemberCountCostSharingConfigurationResponse, optional) — Numbers of additional members covered by the employer.
- `member_selection` (MemberSelectionCostSharingConfigurationResponse, optional) — Whether specific member types are covered by the employer.
- `member_selection_percentage_based` (MemberSelectionPercentageBasedCostSharingConfigurationResponse, optional) — Whether specific member types are covered by the employer, each at a percentage of their premium.
- `percentage` (PercentageCostSharingConfigurationResponse, optional) — Percentage of the premium the employer covers.
- `family_type` (FamilyTypeCostSharingConfigurationResponse, optional) — Type of the family covered by the employer.
- `fixed_amount` (FixedAmountCostSharingConfigurationResponse, optional) — Fixed monthly amount the employer covers.

### MemberCountCostSharingConfigurationResponse

- `adults` (integer, required) — Number of additional adults covered, including partner/spouse.
- `children` (integer, required) — Number of additional children covered.

### MemberSelectionCostSharingConfigurationResponse

- `partner` (boolean, required) — If a spouse/partner is covered.
- `children` (boolean, required) — If children are covered.

### MemberSelectionPercentageBasedCostSharingConfigurationResponse

- `partner` (boolean, required) — If a spouse/partner is covered.
- `children` (boolean, required) — If children are covered.
- `percentage` (integer, required) — Employer coverage percentage of each covered member's premium: For 40% send 40. For 100% send 100.

### PercentageCostSharingConfigurationResponse

- `percentage` (integer, required) — Employer coverage percentage: For 40% send 40. For 100% send 100.

### FamilyTypeCostSharingConfigurationResponse

- `type` (enum, required) — Employer coverage family type
  - Allowed values: `single`, `couple`, `single_with_children`, `family`

### FixedAmountCostSharingConfigurationResponse

- `monthly_amount` (double, required) — Monthly amount the employer covers, in the plan's currency. Must be positive.

## Examples

**Response**

```json
{
  "employee_count": 123,
  "total_monthly_premium": 123.45,
  "total_annual_premium": 123.45,
  "currency": "string",
  "breakdown": [
    {
      "type": "premium",
      "currency": "string",
      "amount": 123.45
    }
  ],
  "quote_pdfs": [
    {
      "url": "string",
      "expires_at": "2024-12-01T00:00:00Z"
    }
  ],
  "levels": [
    {
      "group_id": "gr_3b1333d87d9d4fd6ad83ba7f6b0e951a",
      "plan_id": "pl_3b1333d87d9d4fd6ad83ba7f6b0e951a",
      "employee_count": 123,
      "currency": "string",
      "monthly_premium": 123.45,
      "annual_premium": 123.45,
      "cost_sharing": {
        "type": "member_count",
        "member_count": null,
        "member_selection": null,
        "member_selection_percentage_based": null,
        "percentage": null,
        "family_type": null,
        "fixed_amount": null
      },
      "quote_pdfs": [
        {
          "url": "string",
          "expires_at": "2024-12-01T00:00:00Z"
        }
      ]
    }
  ],
  "generated_at": "2024-12-01T00:00:00Z",
  "expires_at": "2024-12-01T00:00:00Z",
  "cost_sharing": null,
  "pdf_url": null,
  "pdf_expires_at": "2024-12-01T00:00:00Z",
  "object": "string"
}
```

**SDK Code**

```python
import requests

url = "https://test.api.kota.io/group_quote_intents/gqi_3b1333d87d9d4fd6ad83ba7f6b0e951a/quote"

headers = {"Authorization": "Bearer <apiKey>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript
const url = 'https://test.api.kota.io/group_quote_intents/gqi_3b1333d87d9d4fd6ad83ba7f6b0e951a/quote';
const options = {method: 'GET', headers: {Authorization: 'Bearer <apiKey>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://test.api.kota.io/group_quote_intents/gqi_3b1333d87d9d4fd6ad83ba7f6b0e951a/quote"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Authorization", "Bearer <apiKey>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://test.api.kota.io/group_quote_intents/gqi_3b1333d87d9d4fd6ad83ba7f6b0e951a/quote")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <apiKey>'

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://test.api.kota.io/group_quote_intents/gqi_3b1333d87d9d4fd6ad83ba7f6b0e951a/quote")
  .header("Authorization", "Bearer <apiKey>")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://test.api.kota.io/group_quote_intents/gqi_3b1333d87d9d4fd6ad83ba7f6b0e951a/quote', [
  'headers' => [
    'Authorization' => 'Bearer <apiKey>',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://test.api.kota.io/group_quote_intents/gqi_3b1333d87d9d4fd6ad83ba7f6b0e951a/quote");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer <apiKey>");
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = ["Authorization": "Bearer <apiKey>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://test.api.kota.io/group_quote_intents/gqi_3b1333d87d9d4fd6ad83ba7f6b0e951a/quote")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```