> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://docs.termina.ai/api-reference/data/benchmark/get-account-quantiles/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.termina.ai/_mcp/server. # Account Benchmark Quantiles GET https://app.termina.ai/api/v1/group/{group_id}/data/benchmark/quantiles/{category} Get benchmark quantiles for a specific category at a given revenue scale (group-scoped). Returns quantile-based benchmarks for key SaaS metrics without requiring a deal context. Useful for headless benchmarking where the user wants group-level data. Reference: https://docs.termina.ai/api-reference/data/benchmark/get-account-quantiles ## Authentication - `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer `, where token is your auth token. ## Servers - `https://app.termina.ai` (Production server, default) - `https://app.termina.dev` (Development server) - `http://localhost:8000` (Local development server) ## Request ### Path parameters - `category` (string, required) - `group_id` (integer, required) ### Query parameters - `revenue` (double, required) — Annualized revenue scale for which to obtain benchmarks ## Response ### 200 Successful Response - `list of BenchmarkQuantile` ## Errors ### 422 Unprocessable Entity Error Validation Error - `detail` (list of ValidationError, optional) ## Types ### BenchmarkQuantile - `quantile` (double, required) — Quantile percentile (0.0-1.0) - `revenue` (double, optional, nullable) — Revenue - `rolling_3m_average_revenue` (double, optional, nullable) — Average Revenue (Rolling Q) - `annualized_revenue` (double, optional, nullable) — Annualized Revenue - `rolling_3m_annualized_revenue` (double, optional, nullable) — Annualized Revenue (Rolling Q) - `revenue_share_of_top_20_percent` (double, optional, nullable) — Revenue Share of Top 20% - `revenue_share_of_top_10_count` (double, optional, nullable) — Revenue Share of Top 10 Users - `average_to_median` (double, optional, nullable) — Average to Median Revenue - `gini_coefficient` (double, optional, nullable) — Gini Coefficient - `lifetime_quick_ratio` (double, optional, nullable) — Average Quick Ratio - `lifetime_gross_retention` (double, optional, nullable) — Average Gross Retention - `lifetime_net_churn` (double, optional, nullable) — Average Net Churn - `cmgr3` (double, optional, nullable) — CMGR3 - `cmgr6` (double, optional, nullable) — CMGR6 - `cmgr12` (double, optional, nullable) — CMGR12 - `yoy` (double, optional, nullable) — YoY Growth - `operating_margin` (double, optional, nullable) — Operating Margin - `quarterly_operating_margin` (double, optional, nullable) — Operating Margin (Rolling Q) - `ebitcac_margin` (double, optional, nullable) — EBITCAC Margin - `quarterly_ebitcac_margin` (double, optional, nullable) — EBITCAC Margin (Rolling Q) - `gross_margin` (double, optional, nullable) — Gross Margin - `quarterly_gross_margin` (double, optional, nullable) — Gross Margin (Rolling Q) - `magic_number` (double, optional, nullable) — Magic Number - `margin_magic_number` (double, optional, nullable) — Margin Magic Number - `rule_of_40` (double, optional, nullable) — Rule of 40 - `cac_of_40` (double, optional, nullable) — CAC of 40 - `burn_multiple` (double, optional, nullable) — Burn Multiple - `margin_burn_multiple` (double, optional, nullable) — Margin Burn Multiple - `roas` (double, optional, nullable) — Proxy for Return on Ad Spend (ROAS) - `margin_roas` (double, optional, nullable) — Gross Margin adjusted ROAS - `acquisition_spend` (double, optional, nullable) — Acquisition Spend - `total_opex` (double, optional, nullable) — Total OPEX - `logo_retention_6m` (double, optional, nullable) — Logo Retention (6M) - `logo_retention_12m` (double, optional, nullable) — Logo Retention (12M) - `revenue_retention_6m` (double, optional, nullable) — Revenue Retention (6M) - `revenue_retention_12m` (double, optional, nullable) — Revenue Retention (12M) - `ltv_6m` (double, optional, nullable) — LTV6 - `ltv_12m` (double, optional, nullable) — LTV12 - `ltv6_cac` (double, optional, nullable) — LTV6/CAC - `ltv12_cac` (double, optional, nullable) — LTV12/CAC - `gmltv6_cac` (double, optional, nullable) — gmLTV6/CAC - `gmltv12_cac` (double, optional, nullable) — gmLTV12/CAC - `lifetime_ltv6_cac` (double, optional, nullable) — Average LTV6/CAC - `lifetime_ltv12_cac` (double, optional, nullable) — Average LTV12/CAC - `lifetime_gmltv6_cac` (double, optional, nullable) — Average gmLTV6/CAC - `lifetime_gmltv12_cac` (double, optional, nullable) — Average gmLTV12/CAC - `cac` (double, optional, nullable) — CAC - `irr` (double, optional, nullable) — IRR - `periods_to_payback` (double, optional, nullable) — Months to Payback - `employee_count` (double, optional, nullable) — Number of Employees - `cumulative_person_years` (double, optional, nullable) — Cumulative Years of Effort - `employee_retention_1yr` (double, optional, nullable) — Employee Retention (1Y) - `employee_retention_2yr` (double, optional, nullable) — Employee Retention (2Y) - `average_years_of_experience` (double, optional, nullable) — Average Employee Experience (Years) - `lifetime_employee_retention` (double, optional, nullable) — Lifetime Employee Retention - `percent_employees_sales_and_marketing` (double, optional, nullable) — Sales + Marketing (% Employees) - `fully_loaded_employee_cost` (double, optional, nullable) — Fully-Loaded Employee Cost - `annualized_revenue_per_employee` (double, optional, nullable) — Annualized Revenue per Employee ### ValidationError - `loc` (list of ValidationErrorLocItems, required) - `msg` (string, required) - `type` (string, required) - `input` (any, optional) - `ctx` (ValidationErrorCtx, optional) ### ValidationErrorLocItems ### ValidationErrorCtx ## Examples **Response** ```json [ { "quantile": 0.25, "revenue": 100000, "rolling_3m_average_revenue": 100000, "annualized_revenue": 120000, "rolling_3m_annualized_revenue": 120000, "revenue_share_of_top_20_percent": 0.7, "revenue_share_of_top_10_count": 0.5, "average_to_median": 1.5, "gini_coefficient": 0.4, "lifetime_quick_ratio": 1.5, "lifetime_gross_retention": 0.85, "lifetime_net_churn": 0.05, "cmgr3": 0.05, "cmgr6": 0.1, "cmgr12": 0.2, "yoy": 1.5, "operating_margin": -0.1, "quarterly_operating_margin": -0.08, "ebitcac_margin": -0.05, "quarterly_ebitcac_margin": -0.04, "gross_margin": 0.6, "quarterly_gross_margin": 0.55, "magic_number": 1, "margin_magic_number": 0.6, "rule_of_40": 0.4, "cac_of_40": 0.35, "burn_multiple": 1, "margin_burn_multiple": 1, "roas": 1, "margin_roas": 0.6, "acquisition_spend": 10000, "total_opex": 50000, "logo_retention_6m": 0.9, "logo_retention_12m": 0.8, "revenue_retention_6m": 0.95, "revenue_retention_12m": 0.9, "ltv_6m": 5000, "ltv_12m": 10000, "ltv6_cac": 5, "ltv12_cac": 10, "gmltv6_cac": 4, "gmltv12_cac": 8, "lifetime_ltv6_cac": 5, "lifetime_ltv12_cac": 10, "lifetime_gmltv6_cac": 4, "lifetime_gmltv12_cac": 8, "cac": 1000, "irr": 0.15, "periods_to_payback": 12, "employee_count": 25, "cumulative_person_years": 50, "employee_retention_1yr": 0.85, "employee_retention_2yr": 0.75, "average_years_of_experience": 3, "lifetime_employee_retention": 0.8, "percent_employees_sales_and_marketing": 0.4, "fully_loaded_employee_cost": 100000, "annualized_revenue_per_employee": 80000 } ] ``` **SDK Code** ```python import requests url = "https://app.termina.ai/api/v1/group/1/data/benchmark/quantiles/category" querystring = {"revenue":"1.1"} headers = {"Authorization": "Bearer "} response = requests.get(url, headers=headers, params=querystring) print(response.json()) ``` ```javascript const url = 'https://app.termina.ai/api/v1/group/1/data/benchmark/quantiles/category?revenue=1.1'; const options = {method: 'GET', headers: {Authorization: 'Bearer '}}; 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://app.termina.ai/api/v1/group/1/data/benchmark/quantiles/category?revenue=1.1" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") 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://app.termina.ai/api/v1/group/1/data/benchmark/quantiles/category?revenue=1.1") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://app.termina.ai/api/v1/group/1/data/benchmark/quantiles/category?revenue=1.1") .header("Authorization", "Bearer ") .asString(); ``` ```php request('GET', 'https://app.termina.ai/api/v1/group/1/data/benchmark/quantiles/category?revenue=1.1', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp using RestSharp; var client = new RestClient("https://app.termina.ai/api/v1/group/1/data/benchmark/quantiles/category?revenue=1.1"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://app.termina.ai/api/v1/group/1/data/benchmark/quantiles/category?revenue=1.1")! 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() ```