Documentation Index
Fetch the complete documentation index at: https://docs.wokelo.ai/llms.txt
Use this file to discover all available pages before exploring further.
1. Overview
The Peer Comparison API generates a comprehensive multi-dimensional benchmarking report for 2 to 5 companies simultaneously. Unlike Company Research (which covers a single company in depth), this API produces a purpose-built side-by-side analysis designed to surface competitive differentiation across every major dimension — from financials and product features to employee sentiment and hiring velocity. This is an asynchronous POST API — submitting a request returns areport_id immediately. You then poll for completion using the Report Status endpoint and retrieve the finished report using the Download Report endpoint.
The three-step workflow:
- Firmographics — one structured card per company: firmographic details (industry, HQ, headcount, funding stage, total funding), and a full financial suite including revenue, EBITDA, net income, EPS, market cap, and valuation multiples (EV/Sales, EV/EBITDA, P/E)
- Product offerings — two views of the competitive product landscape: a narrative
product_offeringsarray (one entry per product capability area per company) and akey_product_featuresfeature matrix (yes/no cells per company per feature category, with a structuredcompany_result_mapping) - Business model — structured area/details comparison across Revenue & Pricing, Operational Setup, Value Proposition, and Customer Segments — one entry per company per area
- Additional sections — depending on data availability, reports may also include Employee Reviews (sentiment and satisfaction data), Hiring Trends (role-level headcount and velocity signals), and Online Presence (SEO and web visibility metrics)
- Competitive diligence packages — compare a target company against 3–4 direct peers before an IC presentation, with a single report covering every relevant dimension
- Market map benchmarking — identify which players offer which product capabilities using the feature matrix, and surface white-space gaps
- Buy-side deal screening — compare multiple acquisition candidates side by side on financials, product scope, and headcount to quickly eliminate or prioritise targets
- Portfolio company positioning — benchmark a portfolio company against its peers on hiring velocity, employee satisfaction, and online visibility to identify operational underperformance
- Investor presentations — export as PPT or PDF to embed peer comparison tables directly in LP updates, conference decks, or deal memos
This API is asynchronous. The initial POST returns a
report_id only — not the report content. Report generation typically completes in 3–7 minutes for a 5-company comparison. See How Async APIs work for a full explanation of the polling lifecycle.2. Quick Start
Step 1 — Submit the report request3. Authentication
All requests must include a Bearer token in theAuthorization HTTP header.
4. Request Reference
Endpoint| Parameter | Type | Required | Description |
|---|---|---|---|
workflow | string | Required | Must always be "player_comparison". This is distinct from "company_primer" (Company Research) and "industry_primer" (Industry Research). Using the wrong value submits the wrong report type or returns a 400 error. |
websites | string[] | Required | Array of company website URLs to compare. Accepts 2–5 entries. Both bare domain format ("stripe.com") and full URL format ("https://www.stripe.com") are accepted. All companies must be web-resolvable — Wokelo uses the URL to identify each company in its knowledge base. |
workbook_name | string | Optional | Label for the generated report workbook. Defaults to a generic name if omitted. Using a descriptive name (e.g. "Payments Competitive Landscape Q2 2026") makes the report easier to identify in subsequent Report Status or Download calls. |
custom_files | object[] | Optional | Array of file references to include in the report alongside Wokelo’s synthesis. Each object should use the fileName value returned by the File Upload API. |
The minimum number of websites is 2 and the maximum is 5. Passing a single URL or more than 5 will return a
400 Bad Request. All URLs must be for different companies — duplicate entries will not produce meaningful comparisons.5. Response
Submission response
The initial POST returns immediately with a single field:| Field | Type | Description |
|---|---|---|
report_id | integer | Unique identifier for this report job. Store immediately — it is the only handle to your report and cannot be recovered if lost. |
Report status response
PollGET /api/assets/get_notebook_status/?report_id={report_id} until the status field is "Completed".
| Status value | Meaning |
|---|---|
"Pending" | Report is queued and waiting to start. |
"Processing" | Report generation is in progress. |
"Completed" | Report is ready to download. |
"Failed" | Report generation encountered an error. Retry the submission. |
Downloaded report structure
When you call Download Report with"file_type": "json", the response is a nested JSON object with section names as top-level keys. The primary sections are:
Firmographics
Path: report["Firmographics"]["Firmographic"]["firmographics"]["firmographics"]
An array of company objects, one per company in the same order as the submitted websites array. Each object contains:
organization—name,logo(URL),url(Wokelo dashboard link)details— firmographic fields:industry(string),product_category(string),founded_year(string),hq(string),company_type("public","private","startup")employees_in_crunchbase(string range, e.g."1001-5000"),website(string)total_funding(integer USD, e.g.2967000000for $2.97B) — may be0for unfunded/bootstrapped companieslast_funding_round— object withcurrency, optionalvalue(integer USD), optionaldate(YYYY-MM-DD), andround(e.g."Series E","Public","Acquired")financials— a dict of financial metric objects. Each metric (e.g."Total revenue","EBITDA","Market cap") containsperiod(YYYY-MM-DD),v(numeric value ornull), andcurrency. For public companies, this also includes"Ticker"(string),"EV/Sales","EV/EBITDA","P/E","EV/EBIT", margin fields, and EPS fields. Private companies typically have fewer or nofinancialsfields.
description— paragraph description of the company’s product and market positionsourcesarray — data attribution (Crunchbase, S&P CapIQ, Wokelo Synthesis)
report["Product offerings"]["Product offerings"]
Contains two parallel views of the competitive product landscape:
product_offerings — array of area objects, one per product capability area (e.g. “Expense Management & Reporting”, “Corporate Card & Payment Solutions”). Each area object has an area label and a details array with one entry per company, containing:
company_name,permalink,area_details(prose description of that company’s capability in this area), andsourcesarray
key_product_features — a structured feature matrix with:
rows— array of feature objects. Each object hascategory_name(the feature being compared),commentary(a sentence summarising the competitive picture), andcompany_names(array of{result, company_name, company_permalink}objects whereresultis"yes"or"no")company_result_mapping— dict keyed by permalink with"yes"/"no"values — useful for programmatic table generationcolumns— ordered list of permalinks matching the companies in the comparison
report["Business model"]["Business model"]["business_model"]
Array of area objects following the same area / details pattern as product offerings, covering: Revenue & Pricing, Operational Setup, Value Proposition, and Customer Segments.
The
financials dict in Firmographics uses "v" as the value key (not "value"). It can be null for metrics that are unavailable or not applicable (e.g. P/E for a company with negative earnings). Always check for null before performing arithmetic on financial fields.Financial field notes
Financial data in thedetails.financials dict uses a consistent structure:
EBITDA margin (%) and Net margin (%) store fractional values (e.g. 0.0675 = 6.75%), not percentage values. Multiply by 100 before displaying.
Download format options
file_type | Description |
|---|---|
"json" | Fully structured JSON — all sections, fields, and source citations. Best for programmatic processing, CRM enrichment, or pipeline ingestion. |
"pdf" | Formatted PDF with comparison tables and charts. Best for sharing with stakeholders. |
"docx" | Editable Word document. Best for analysts who customise reports before distribution. |
"ppt" | PowerPoint presentation. Best for IC decks, LP updates, and deal memos. |
6. Examples
Basic peer comparison — three companies
Extracting and displaying firmographic data
Parse the firmographics section to build a comparison table of key metrics across all companies.Comparing financial metrics across public and private companies
Financial data is only populated for public companies and well-covered private ones. Always guard againstnull values.
Reading the feature matrix
Thekey_product_features matrix is the most structured part of the report and is ideal for programmatic table generation.
Extracting business model comparison
Parse the Business model section to compare revenue models and customer segments across all peers.Batch comparisons across multiple competitive sets
Run comparisons for several competitive landscapes and collect all reports.Exporting a PPT for an IC deck
7. Error Handling
The API uses standard HTTP status codes. The submission endpoint returns errors synchronously; processing errors appear as"Failed" status when polling.
| Status | Meaning | Cause & Resolution |
|---|---|---|
200 OK | Request accepted | report_id returned. Proceed to polling. |
400 Bad Request | Invalid parameters | Missing workflow, missing or empty websites, fewer than 2 or more than 5 websites, wrong workflow value, or malformed URLs. Check the detail field. |
401 Unauthorized | Auth failed | The Authorization header is missing or contains an invalid token. Verify your key in Settings → API Keys. |
403 Forbidden | Insufficient access | Your plan does not include access to this endpoint. Contact support@wokelo.ai. |
429 Too Many Requests | Rate limit exceeded | Implement exponential back-off on submission. The response includes a Retry-After header. |
500 Internal Server Error | Server error | Retry the submission after a brief delay. If the issue persists, contact support@wokelo.ai. |
"Failed" report status:
8. Best Practices
workflow must always be "player_comparison" — distinct from all other Workflow APIs
The /api/workflow_manager/start/ endpoint is shared across Company Research ("company_primer"), Industry Research ("industry_primer"), Peer Comparison ("player_comparison"), and Custom Workflow. For Peer Comparison, the value must be exactly "player_comparison". Using any other value will produce the wrong report type or a 400 error.
Use website URLs, not permalinks
Peer Comparison identifies companies by website URL, not by Wokelo/Crunchbase permalink. Both bare domain ("stripe.com") and full URL ("https://www.stripe.com") formats are accepted. If Wokelo cannot resolve a URL to a known company, that company may be omitted or have incomplete data in the report. If resolution fails, try the company’s canonical homepage URL:
websites array must contain between 2 and 5 entries. Passing a single URL (not a comparison), an empty array, or more than 5 will return a 400 Bad Request.
Store report_id immediately
The submission response contains only report_id. There is no list-reports endpoint to recover lost IDs. Store it to a database or log immediately:
financials["v"] against null — private companies have sparse financial data
The financials object is populated from S&P CapIQ and is comprehensive for public companies. For private companies, most or all financial metrics will have "v": null. Always check before performing arithmetic:
EBITDA margin (%) and Net margin (%) are fractions, not percentages
These fields store values like 0.0675 (= 6.75%), not 6.75. Multiply by 100 before displaying. This is easy to miss when company_type is “public” and you’re cross-checking against other financial sources.
Use company_result_mapping for programmatic matrix generation
The key_product_features section includes a company_result_mapping dict keyed by permalink with "yes" / "no" values. This is the most ergonomic field for building comparison tables programmatically, as you can look up any company’s result by permalink without iterating the company_names array:
workbook_name to differentiate runs — especially in batch workflows
When running multiple concurrent comparisons, a descriptive workbook_name makes it easier to match report_id values to their intended use later. Include the date, the landscape name, and any versioning:
9. Related APIs
Company Research
Generate a single-company deep-dive report — same async workflow pattern, but one company covered in much greater depth.
Industry Research
Generate a sector-level intelligence report — covers market sizing, trends, and transaction activity across an entire industry.
Company Instant Enrichment
Synchronous firmographic enrichment for a single company — instant, no polling, useful for lightweight data needs.
Company News Monitoring
Fetch real-time news for any company — use alongside a Peer Comparison report to layer in the latest competitive developments.
Target Screening
Identify and score acquisition targets across a market — use before Peer Comparison to narrow down which companies to benchmark.
Supporting APIs
Report Status, Download Report, and File Upload — all used alongside Peer Comparison in the async workflow.