# Home Source: /index.md ## What's Documented - **FirstCyber Quote Service** · RESTful API for commercial cyber insurance quoting and binding - **Partner Portal** · Credential management, webhook keys, and integration keys - **Webhook Management** · Event subscriptions, delivery logs, and signature verification ## Need Help? - Email [contactus@k2cyber.ai](mailto:contactus@k2cyber.ai) for integration questions. - Join the partner Slack workspace for real-time assistance. - Review the [Changelog](/changelog) for breaking changes and maintenance windows. --- # Quick Start Source: /quick-start.md # Quick Start Kick off your integration with K2 using the checklist below. Each step links to deeper guidance when you need it. ## 1. Request Access to the Partner Portal ::: info Onboarding Contact your K2 partner manager or email [contactus@k2cyber.ai](mailto:contactus@k2cyber.ai). Provide your organization name, primary technical contact, and target launch timeline. ::: - Receive Partner Portal invitations for your administrators. - Confirm who will own production cutover and 24/7 escalation duties. ## 2. Set Up Environments | Environment | Purpose | API Base URL | Partner Portal | |-------------|---------|--------------|----------------| | Sandbox | Integration development and testing | `https://api-sandbox.k2cyber.co` | `https://partners-sandbox.k2cyber.co` | | Production | Live traffic | `https://api.k2cyber.co` | `https://partners.k2cyber.co` | ::: tip Sandbox Environment The sandbox environment uses isolated synthetic data for integration development and testing. Use sandbox credentials to validate your integration before moving to production. ::: Store credentials securely in your secrets manager and rotate them according to your security policy. ### Choose Your Product Type During sandbox registration at [partners-sandbox.k2cyber.co](https://partners-sandbox.k2cyber.co/), you'll select a product type — **Broker Bill** or **Direct Bill**. This choice is associated with your API key for that account. ::: info Good to Know — Product Type and Sandbox Binding - **Direct Bill** supports the full quote-to-bind flow in the sandbox. When creating quotes, use `direct@k2cyber.ai` as the broker email. - **Broker Bill** supports quoting and rating in the sandbox. Binding is available in production only. If you'd like to test both, you can register a second account at [partners-sandbox.k2cyber.co](https://partners-sandbox.k2cyber.co/) with the other product type — it only takes a minute. ::: ### Check Eligibility Before submitting test quotes, use the [Appetite Checker](https://appetite-test.k2cyber.co/) to verify that your test business profile is within K2 Cyber's appetite. Enter a NAICS code and revenue to see whether the combination is eligible and what coverage limits are available. This can save time if you're seeing unexpected decline responses. ## 3. Configure Authentication for API Requests In order to integrate with K2 Cyber's API, each HTTP request must include the following headers: - `x-integration-key: ` - `authorization: Bearer ` These are configured via the [Partner Portal](/services/partner-portal). ## 4. Develop Your Integration - **Integration Walkthrough**: Follow a complete quote-to-policy lifecycle with copy-pasteable examples in the [Integration Walkthrough](/guides/integration-walkthrough). - **REST API**: For full endpoint reference, see the [Quote API](/services/firstcyber-quote-service). - **Webhook Portal**: For details on subscribing to real-time events, see the documentation for managing [Webhooks via our Portal](/services/webhook-portal). ::: tip Set Up Webhooks Early We recommend subscribing to webhook events before you begin testing so you can observe the full policy lifecycle. Events like `policy.created` notify your system when asynchronous processes complete — no polling needed. Visit the [Webhook Management Portal](/services/webhook-portal) to configure subscriptions. ::: ## 5. Build & Test 1. Develop and test your integration using the Partner Portal credentials. 2. Register a webhook endpoint and send test events to confirm signature validation. 3. Walk through the Partner Portal checklist until every item is flagged **Complete**. Capture screenshots or logs as evidence for your go-live review. ### Sandbox Reference Keep these in mind when working in the sandbox: | Area | Note | Details | |------|------|---------| | Product type | Selected at registration, tied to your API key | Register a second account at [partners-sandbox.k2cyber.co](https://partners-sandbox.k2cyber.co/) if you need a different product type | | Binding | Broker Bill accounts support quoting and rating only | Register a Direct Bill account to test the full bind flow | | Broker email | Direct Bill accounts use a designated test email | Use `direct@k2cyber.ai` as the broker email | | Declines | Quotes may be declined based on NAICS or revenue | Use the [Appetite Checker](https://appetite-test.k2cyber.co/) to verify eligibility | ## 6. Go Live - Submit the production access request inside the Partner Portal. - Confirm monitoring and on-call contacts using your internal runbook. - Review the [Changelog](/changelog) and subscribe to release notifications. Once approved, production credentials appear in the portal and the K2 support team coordinates your launch window. ## Support - Email: [contactus@k2cyber.ai](mailto:contactus@k2cyber.ai) - Slack: Invite-only partner workspace (request during onboarding) - Status Page: --- # Integration Walkthrough Source: /guides/integration-walkthrough.md # Integration Walkthrough Follow a complete FirstCyber quote from authentication through policy issuance. Each step shows a copy-pasteable request and response. For endpoint field reference, see the [FirstCyber Quote Service](/services/firstcyber-quote-service). ::: tip Sandbox first Run this walkthrough against `https://api-sandbox.k2cyber.co` with sandbox Partner Portal credentials. For Direct Bill bind testing, use `direct@k2cyber.ai` as the broker email. See [Quick Start](/quick-start) for environment setup. ::: ## 1. Authenticate Obtain a bearer token with your M2M client credentials (if not already exists). Bearer tokens last 1 hour and can be reused across multiple requests; refresh before `expires_in` elapses. **Request** ::: code-group ```bash [cURL] curl -X POST https://api-sandbox.k2cyber.co/auth/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "client_id=&client_secret=&grant_type=client_credentials&scope=quote" ``` ```javascript [JavaScript] const body = new URLSearchParams({ client_id: process.env.K2_CLIENT_ID, client_secret: process.env.K2_CLIENT_SECRET, grant_type: "client_credentials", scope: "quote", }); const response = await fetch("https://api-sandbox.k2cyber.co/auth/token", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body, }); const { access_token, expires_in } = await response.json(); ``` ```python [Python] import os import requests response = requests.post( "https://api-sandbox.k2cyber.co/auth/token", data={ "client_id": os.environ["K2_CLIENT_ID"], "client_secret": os.environ["K2_CLIENT_SECRET"], "grant_type": "client_credentials", "scope": "quote", }, ) token = response.json() ``` ::: **Response** ```json { "access_token": "eyJhbGc...", "token_type": "bearer", "expires_in": 3600 } ``` Every subsequent request needs both: - `Authorization: Bearer ` - `x-integration-key: ` Credentials come from the [Partner Portal](/services/partner-portal). ## 2. Submit a quote Send underwriting information to create a quote. The response includes a `quote_id` and an initial `quote_status`. **Request** ::: code-group ```bash [cURL] curl -X POST https://api-sandbox.k2cyber.co/quote/firstcyber/submit \ -H "x-integration-key: " \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{ "broker_email": "broker@example.com", "insured_name": "Acme Widgets LLC", "insured_location": { "address_line1": "510 Meadowmont Village Circle #142", "address_city": "Chapel Hill", "address_state": "NC", "address_zip": "27514" }, "claims": { "claims_count": 0, "claims_amount": 0 }, "effective_date": "2025-11-01", "revenue": 5000000, "naics": 722515, "question_highrisk": false, "agg_limit": 1000000, "retention": 2500 }' ``` ```javascript [JavaScript] const response = await fetch("https://api-sandbox.k2cyber.co/quote/firstcyber/submit", { method: "POST", headers: { "x-integration-key": process.env.K2_INTEGRATION_KEY, Authorization: `Bearer ${access_token}`, "Content-Type": "application/json", }, body: JSON.stringify({ broker_email: "broker@example.com", insured_name: "Acme Widgets LLC", insured_location: { address_line1: "510 Meadowmont Village Circle #142", address_city: "Chapel Hill", address_state: "NC", address_zip: "27514", }, claims: { claims_count: 0, claims_amount: 0 }, effective_date: "2025-11-01", revenue: 5000000, naics: 722515, question_highrisk: false, agg_limit: 1000000, retention: 2500, }), }); const result = await response.json(); ``` ```python [Python] import os import requests response = requests.post( "https://api-sandbox.k2cyber.co/quote/firstcyber/submit", headers={ "x-integration-key": os.environ["K2_INTEGRATION_KEY"], "Authorization": f"Bearer {access_token}", "Content-Type": "application/json", }, json={ "broker_email": "broker@example.com", "insured_name": "Acme Widgets LLC", "insured_location": { "address_line1": "510 Meadowmont Village Circle #142", "address_city": "Chapel Hill", "address_state": "NC", "address_zip": "27514", }, "claims": {"claims_count": 0, "claims_amount": 0}, "effective_date": "2025-11-01", "revenue": 5000000, "naics": 722515, "question_highrisk": False, "agg_limit": 1000000, "retention": 2500, }, ) result = response.json() ``` ::: **Response** ::: code-group ```json [200 Success] { "status": "approved", "data": { "created_at": "2025-10-14T12:00:00.000Z", "message": "Please note that the minimum retention is $2,500 based on the information provided.", "quote_id": "123e4567-e89b-12d3-a456-426614174000", "quote_status": "ready_to_bind", "checkout_link": "https://checkout.k2cyber.co/...", "product_details": { "product_name": "FirstCyber Standard" }, "policy_term": { "premium_only": "$5,000.00", "policy_fee": "$300.00", "agg_limit": "$1,000,000.00", "retention": "$2,500.00", "effective_date": "2025-11-01", "expiration_date": "2026-11-01", "include_tria": true, "prior_acts": "None" }, "personal_cyber": { "premium": "$500.00", "count": 1, "limit": "$25,000.00", "retention": "$250.00" }, "coverage_details": { "info_privacy_network_limit": "$1,000,000.00", "regulatory_limit": "$1,000,000.00", "pci_dss_limit": "$100,000.00", "business_interruption_limit": "$500,000.00", "vendor_bi_limit": "$250,000.00", "cyber_extortion_limit": "$500,000.00", "funds_transfer_limit": "$100,000.00", "fraudulent_instruction_limit": "$100,000.00", "invoice_manipulation_limit": "$100,000.00", "media_liability_limit": "$1,000,000.00", "system_failure_limit": "$500,000.00", "vendor_system_failure_limit": "$250,000.00", "incident_response_limit": "$50,000.00", "data_recovery_limit": "$50,000.00", "utility_fraud_limit": "$25,000.00", "reputational_harm_limit": "$25,000.00", "business_interruption_restoration_period": 30, "business_interruption_waiting_period": 8, "vendor_bi_restoration_period": 30, "vendor_bi_waiting_period": 8, "vendor_system_failure_restoration_period": 30, "vendor_system_failure_waiting_period": 8, "system_failure_restoration_period": 30, "system_failure_waiting_period": 8 } } } ``` ```json [400 Declined] { "status": "declined", "error": { "message": "Risk does not meet underwriting guidelines" } } ``` ```json [400 Validation] { "status": "error", "error": { "message": "Validation error details" } } ``` ::: Save `data.quote_id` — every later step uses it. Rating may still be in progress when submit returns with `quote_status: "pending"`; poll or wait for webhooks until the quote is ready. ## 3. Wait for rating (poll or webhook) Choose one approach based on your architecture. ### Option A — Poll status Call `GET /status/{id}` every 5–10 seconds until `quote_status` is `ready_to_bind` (or another terminal / decision state). **Request** ::: code-group ```bash [cURL] curl -X GET "https://api-sandbox.k2cyber.co/quote/firstcyber/status/123e4567-e89b-12d3-a456-426614174000" \ -H "x-integration-key: " \ -H "Authorization: Bearer " ``` ```javascript [JavaScript] const response = await fetch( "https://api-sandbox.k2cyber.co/quote/firstcyber/status/123e4567-e89b-12d3-a456-426614174000", { method: "GET", headers: { "x-integration-key": process.env.K2_INTEGRATION_KEY, Authorization: `Bearer ${access_token}`, }, }, ); const status = await response.json(); ``` ```python [Python] import os import requests response = requests.get( "https://api-sandbox.k2cyber.co/quote/firstcyber/status/123e4567-e89b-12d3-a456-426614174000", headers={ "x-integration-key": os.environ["K2_INTEGRATION_KEY"], "Authorization": f"Bearer {access_token}", }, ) status = response.json() ``` ::: **Response** ```json { "status": "approved", "data": { "quote_id": "123e4567-e89b-12d3-a456-426614174000", "quote_status": "ready_to_bind" } } ``` Stop polling once status is `ready_to_bind`, `approved_rate`, `underwriter_review`, `declined`, or `failed`. See [Quote Status Values](/services/firstcyber-quote-service#quote-status-values) and the [Quote Status Flow](/reference/quote-status-flow). ### Option B — Subscribe to webhooks Subscribe early in the [Webhook Portal](/services/webhook-portal) so you receive lifecycle events without polling: | Event | Meaning | | --------------------------------------------------------------------- | ------------------------------------------ | | [`quote.created`](/services/webhook-portal#quote-created) | Quote finished rating; status is available | | [`quote.proposalReady`](/services/webhook-portal#quote-proposalready) | Quote proposal PDF is ready to download | | [`policy.created`](/services/webhook-portal#policy-created) | Policy issued after bind | ## 4. Download the quote proposal (optional) Once rating completes and the proposal is available (`quote.proposalReady`, or status `ready_to_bind` / `approved_rate` / `underwriter_review`), download the PDF. **Request** ::: code-group ```bash [cURL] curl -X GET "https://api-sandbox.k2cyber.co/quote/firstcyber/document/quote-proposal/stream/123e4567-e89b-12d3-a456-426614174000" \ -H "x-integration-key: " \ -H "Authorization: Bearer " \ -o quote-proposal.pdf ``` ```javascript [JavaScript] const response = await fetch( "https://api-sandbox.k2cyber.co/quote/firstcyber/document/quote-proposal/stream/123e4567-e89b-12d3-a456-426614174000", { method: "GET", headers: { "x-integration-key": process.env.K2_INTEGRATION_KEY, Authorization: `Bearer ${access_token}`, }, }, ); const buffer = Buffer.from(await response.arrayBuffer()); require("fs").writeFileSync("quote-proposal.pdf", buffer); ``` ```python [Python] import os import requests response = requests.get( "https://api-sandbox.k2cyber.co/quote/firstcyber/document/quote-proposal/stream/123e4567-e89b-12d3-a456-426614174000", headers={ "x-integration-key": os.environ["K2_INTEGRATION_KEY"], "Authorization": f"Bearer {access_token}", }, ) with open("quote-proposal.pdf", "wb") as f: f.write(response.content) ``` ::: **Response** ::: code-group ```text [200 PDF] Binary PDF stream (Content-Type: application/pdf) ``` ```text [409 Not Ready] Quote proposal document is not ready yet ``` ::: A `409` means the PDF is not ready yet — wait for the webhook or poll status, then retry. Full availability rules are in [`GET /document/quote-proposal/stream/{id}`](/services/firstcyber-quote-service#get-document-quote-proposal-stream-id). ## 5. Bind the quote When status is `ready_to_bind`, you may initiate a bind. The API returns `202 Accepted` immediately; issuance continues asynchronously. **Request** ::: code-group ```bash [cURL] curl -X PUT "https://api-sandbox.k2cyber.co/quote/firstcyber/bind/123e4567-e89b-12d3-a456-426614174000" \ -H "x-integration-key: " \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{}' ``` ```javascript [JavaScript] const response = await fetch( "https://api-sandbox.k2cyber.co/quote/firstcyber/bind/123e4567-e89b-12d3-a456-426614174000", { method: "PUT", headers: { "x-integration-key": process.env.K2_INTEGRATION_KEY, Authorization: `Bearer ${access_token}`, "Content-Type": "application/json", }, body: JSON.stringify({}), }, ); const result = await response.json(); ``` ```python [Python] import os import requests response = requests.put( "https://api-sandbox.k2cyber.co/quote/firstcyber/bind/123e4567-e89b-12d3-a456-426614174000", headers={ "x-integration-key": os.environ["K2_INTEGRATION_KEY"], "Authorization": f"Bearer {access_token}", "Content-Type": "application/json", }, json={}, ) result = response.json() ``` ::: **Response** ```json [202 Accepted] { "status": "accepted", "data": { "id": "123e4567-e89b-12d3-a456-426614174000" } } ``` ## 6. Get the policy document After [`policy.created`](/services/webhook-portal#policy-created) fires — or `GET /status/{id}` returns `issued` — download the policy PDF. **Request** ::: code-group ```bash [cURL] curl -X GET "https://api-sandbox.k2cyber.co/quote/firstcyber/document/policy/stream/123e4567-e89b-12d3-a456-426614174000" \ -H "x-integration-key: " \ -H "Authorization: Bearer " \ -o policy.pdf ``` ```javascript [JavaScript] const response = await fetch( "https://api-sandbox.k2cyber.co/quote/firstcyber/document/policy/stream/123e4567-e89b-12d3-a456-426614174000", { method: "GET", headers: { "x-integration-key": process.env.K2_INTEGRATION_KEY, Authorization: `Bearer ${access_token}`, }, }, ); const buffer = Buffer.from(await response.arrayBuffer()); require("fs").writeFileSync("policy.pdf", buffer); ``` ```python [Python] import os import requests response = requests.get( "https://api-sandbox.k2cyber.co/quote/firstcyber/document/policy/stream/123e4567-e89b-12d3-a456-426614174000", headers={ "x-integration-key": os.environ["K2_INTEGRATION_KEY"], "Authorization": f"Bearer {access_token}", }, ) with open("policy.pdf", "wb") as f: f.write(response.content) ``` ::: **Response** ::: code-group ```text [200 PDF] Binary PDF stream (Content-Type: application/pdf) ``` ```text [409 Not Ready] Policy document is not ready yet ``` ::: ## Next steps - Full endpoint reference: [FirstCyber Quote Service](/services/firstcyber-quote-service) - Status transitions and document matrix: [Quote Status Flow](/reference/quote-status-flow) - Webhook delivery and signatures: [Webhook Portal](/services/webhook-portal) - Specs and Postman: [Downloads](/resources/downloads) --- # FirstCyber Quote Service Source: /services/firstcyber-quote-service.md # FirstCyber Quote Service ## Service Snapshot | Item | Sandbox | Production | | --------- | ------------------------------------------------- | ----------------------------------------------- | | Base URL | `https://api-sandbox.k2cyber.co/quote/firstcyber` | `https://api.k2cyber.co/quote/firstcyber` | | Auth | OAuth 2.0 bearer token + Integration key header | OAuth 2.0 bearer token + Integration key header | | Token URL | `https://api-sandbox.k2cyber.co/auth/token` | `https://api.k2cyber.co/auth/token` | | Scope | `quote` | `quote` | | Formats | JSON UTF-8 | JSON UTF-8 | ::: tip Credentials Both client credentials and integration keys are generated via the Partner Portal. Use the client credentials flow with your `client_id` and `client_secret` to obtain bearer tokens. Tokens should be cached and refreshed before expiry. Integration keys should be attached in an `x-integration-key` header with every request. ::: ::: tip Sandbox Environment The sandbox environment is available for integration development and testing with isolated synthetic data. Start your integration in sandbox and validate thoroughly before moving to production. ::: ### Authentication Every public FirstCyber Quote endpoint requires both headers below on every request. | Header | Value | Description | | ------------------- | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `Authorization` | `Bearer ` | OAuth 2.0 client-credentials bearer token. Token URL: `https://api-sandbox.k2cyber.co/auth/token` (sandbox) or `https://api.k2cyber.co/auth/token` (production). Scope: `quote`. | | `x-integration-key` | `` | Integration key issued via the Partner Portal. Required on every request alongside the bearer token. | ::: tip Cache Your Bearer Tokens Bearer Tokens last for 1 hour. We encourage you to cache your Bearer token and reuse it across multiple requests. ::: For each HTTP request to any K2 Cyber API endpoint: 1. Generate a bearer token (if not already exists) **Request** ::: code-group ```bash [cURL] curl -X POST https://api.k2cyber.co/auth/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "client_id=&client_secret=&grant_type=client_credentials&scope=quote" ``` ```javascript [JavaScript] const body = new URLSearchParams({ client_id: process.env.K2_CLIENT_ID, client_secret: process.env.K2_CLIENT_SECRET, grant_type: "client_credentials", scope: "quote", }); const response = await fetch("https://api.k2cyber.co/auth/token", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body, }); const { access_token, expires_in } = await response.json(); ``` ```python [Python] import os import requests response = requests.post( "https://api.k2cyber.co/auth/token", data={ "client_id": os.environ["K2_CLIENT_ID"], "client_secret": os.environ["K2_CLIENT_SECRET"], "grant_type": "client_credentials", "scope": "quote", }, ) token = response.json() ``` ::: **Response** ```json { "access_token": "eyJhbGc...", "token_type": "bearer", "expires_in": 3600 } ``` 2. Make an API Request with an integration key and the `access_token` **Request** ::: code-group ```bash [cURL] curl -X POST https://api.k2cyber.co/quote/firstcyber/submit \ -H "x-integration-key: " \ -H "Authorization: Bearer eyJhbGc..." \ -H "Content-Type: application/json" \ -d '{...}' ``` ```javascript [JavaScript] const response = await fetch("https://api.k2cyber.co/quote/firstcyber/submit", { method: "POST", headers: { "x-integration-key": process.env.K2_INTEGRATION_KEY, Authorization: `Bearer ${access_token}`, "Content-Type": "application/json", }, body: JSON.stringify({ /* underwriting fields — see POST /submit */ }), }); const result = await response.json(); ``` ```python [Python] import os import requests response = requests.post( "https://api.k2cyber.co/quote/firstcyber/submit", headers={ "x-integration-key": os.environ["K2_INTEGRATION_KEY"], "Authorization": f"Bearer {access_token}", "Content-Type": "application/json", }, json={ # underwriting fields — see POST /submit }, ) result = response.json() ``` ::: See our [Partner Portal](/services/partner-portal) section for information on how to obtain these credentials. ### Downloads | Resource | Description | | --------------------------------------------------------------------------- | ------------------------------------------------------------- | | [OpenAPI Spec (YAML)](/specs/firstcyber-quote.yaml) | OpenAPI 3.1 specification for code generation and API clients | | [Postman Collection](/specs/K2-Cyber-Quote-Service.postman_collection.json) | Pre-configured Postman collection with example requests | ::: info Using the Postman Collection 1. Import the collection into Postman 2. Set the `base_url` variable to `https://api-sandbox.k2cyber.co/quote/firstcyber` 3. Set the `integration-key` variable to your integration key from the Partner Portal (sent as `x-integration-key` on every request) 4. Set the `access_token` variable with your OAuth token, or use Postman's Get New Access Token — the collection is preconfigured for OAuth 2.0 client credentials (`scope=quote`, token URL `https://api-sandbox.k2cyber.co/auth/token`) with your `client_id` and `client_secret` 5. Start testing endpoints immediately ::: ## Endpoints ### POST /submit {#post-submit} ::: details High risk operations If the insured derives revenue from any of the operations listed below, set `question_highrisk` to `true`: - Pornography - Gambling - Cannabis - Cryptocurrency or Blockchain Technology - Debt Collection - Professional Data Processing / Aggregation, Storage, or Hosting - Digital Tracking or Surveillance Services - Managed Service or Security Service Provider (MSP or MSSP) - Cyber Security Products or Services - Managed, Accountable Care, or Nursing Care - Sale of Firearms and Ammunition ::: A `quote.created` event will be emitted with the quote ID once the quote has finished rating. The quote proposal PDF becomes available to download from [`GET /document/quote-proposal/stream/{id}`](#get-document-quote-proposal-stream-id) once the [`quote.proposalReady`](/services/webhook-portal#quote-proposalready) webhook event has been emitted for the same quote ID. See the [webhook documentation](/services/webhook-portal#quote-created) for more details on these events. **Request** ::: code-group ```bash [cURL] curl -X POST https://api.k2cyber.co/quote/firstcyber/submit \ -H "x-integration-key: " \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{ "broker_email": "broker@example.com", "insured_name": "Acme Widgets LLC", "insured_location": { "address_line1": "510 Meadowmont Village Circle #142", "address_line2": "Suite 200", "address_city": "Chapel Hill", "address_state": "NC", "address_zip": "27514" }, "insured_taxid": "12-3456789", "claims": { "claims_count": 0, "claims_amount": 0 }, "year_founded": 2018, "effective_date": "2025-11-01", "revenue": 5000000, "naics": 722515, "question_highrisk": false, "agg_limit": 1000000, "retention": 2500, "website": { "has_website": true, "domainName": "https://example.com" }, "insured_contact": { "first_name": "John", "last_name": "Doe", "email": "john.doe@example.com", "phone": "123-456-7890", "preferred_method": "Email" } }' ``` ```javascript [JavaScript] const response = await fetch("https://api.k2cyber.co/quote/firstcyber/submit", { method: "POST", headers: { "x-integration-key": process.env.K2_INTEGRATION_KEY, Authorization: `Bearer ${access_token}`, "Content-Type": "application/json", }, body: JSON.stringify({ broker_email: "broker@example.com", insured_name: "Acme Widgets LLC", insured_location: { address_line1: "510 Meadowmont Village Circle #142", address_line2: "Suite 200", address_city: "Chapel Hill", address_state: "NC", address_zip: "27514", }, insured_taxid: "12-3456789", claims: { claims_count: 0, claims_amount: 0, }, year_founded: 2018, effective_date: "2025-11-01", revenue: 5000000, naics: 722515, question_highrisk: false, agg_limit: 1000000, retention: 2500, website: { has_website: true, domainName: "https://example.com", }, insured_contact: { first_name: "John", last_name: "Doe", email: "john.doe@example.com", phone: "123-456-7890", preferred_method: "Email", }, }), }); const result = await response.json(); ``` ```python [Python] import os import requests response = requests.post( "https://api.k2cyber.co/quote/firstcyber/submit", headers={ "x-integration-key": os.environ["K2_INTEGRATION_KEY"], "Authorization": f"Bearer {access_token}", "Content-Type": "application/json", }, json={ "broker_email": "broker@example.com", "insured_name": "Acme Widgets LLC", "insured_location": { "address_line1": "510 Meadowmont Village Circle #142", "address_line2": "Suite 200", "address_city": "Chapel Hill", "address_state": "NC", "address_zip": "27514", }, "insured_taxid": "12-3456789", "claims": { "claims_count": 0, "claims_amount": 0, }, "year_founded": 2018, "effective_date": "2025-11-01", "revenue": 5000000, "naics": 722515, "question_highrisk": False, "agg_limit": 1000000, "retention": 2500, "website": { "has_website": True, "domainName": "https://example.com", }, "insured_contact": { "first_name": "John", "last_name": "Doe", "email": "john.doe@example.com", "phone": "123-456-7890", "preferred_method": "Email", }, }, ) result = response.json() ``` ::: **Response** ::: code-group ```json [200 Approved] { "status": "approved", "data": { "created_at": "2025-10-14T12:00:00.000Z", "message": "Please note that the minimum retention is $2,500 based on the information provided.", "quote_id": "123e4567-e89b-12d3-a456-426614174000", "quote_status": "ready_to_bind", "checkout_link": "https://checkout.k2cyber.co/...", "product_details": { "product_name": "FirstCyber Standard" }, "policy_term": { "premium_only": "$5,000.00", "policy_fee": "$300.00", "agg_limit": "$1,000,000.00", "retention": "$2,500.00", "effective_date": "2025-11-01", "expiration_date": "2026-11-01", "include_tria": true, "prior_acts": "None" }, "personal_cyber": { "premium": "$500.00", "count": 1, "limit": "$25,000.00", "retention": "$250.00" }, "coverage_details": { "info_privacy_network_limit": "$1,000,000.00", "regulatory_limit": "$1,000,000.00", "pci_dss_limit": "$100,000.00", "business_interruption_limit": "$500,000.00", "vendor_bi_limit": "$250,000.00", "cyber_extortion_limit": "$500,000.00", "funds_transfer_limit": "$100,000.00", "fraudulent_instruction_limit": "$100,000.00", "invoice_manipulation_limit": "$100,000.00", "media_liability_limit": "$1,000,000.00", "system_failure_limit": "$500,000.00", "vendor_system_failure_limit": "$250,000.00", "incident_response_limit": "$50,000.00", "data_recovery_limit": "$50,000.00", "utility_fraud_limit": "$25,000.00", "reputational_harm_limit": "$25,000.00", "business_interruption_restoration_period": 30, "business_interruption_waiting_period": 8, "vendor_bi_restoration_period": 30, "vendor_bi_waiting_period": 8, "vendor_system_failure_restoration_period": 30, "vendor_system_failure_waiting_period": 8, "system_failure_restoration_period": 30, "system_failure_waiting_period": 8 } } } ``` ```json [400 Validation] { "status": "error", "error": { "message": "Validation error details" } } ``` ```json [400 Declined] { "status": "declined", "error": { "message": "Risk does not meet underwriting guidelines" } } ``` :::