Skip to main content

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 a report_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:
Companies are identified by website URL rather than permalink. Up to 5 URLs can be passed in a single request. The completed report is structured into several named sections, each returned as a top-level key in the JSON output:
  • 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_offerings array (one entry per product capability area per company) and a key_product_features feature matrix (yes/no cells per company per feature category, with a structured company_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)
Common use cases:
  • 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 request
Step 2 — Poll for completion
Step 3 — Download the report

3. Authentication

All requests must include a Bearer token in the Authorization HTTP header.
API tokens are issued from your Wokelo account. Navigate to Account Details → API Credentials in the Wokelo dashboard to get your client id and client secret. Contact support@wokelo.ai if you do not yet have API access.
Never expose your token in client-side code, browser requests, or public repositories. A missing or invalid token returns 401 Unauthorized. A valid token without sufficient plan permissions returns 403 Forbidden.

4. Request Reference

Endpoint
All parameters are passed as JSON in the request body.
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.
Full request example:

5. Response

Submission response

The initial POST returns immediately with a single field:

Report status response

Poll GET /api/assets/get_notebook_status/?report_id={report_id} until the status field is "Completed".

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:
  • organizationname, 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. 2967000000 for $2.97B) — may be 0 for unfunded/bootstrapped companies
    • last_funding_round — object with currency, optional value (integer USD), optional date (YYYY-MM-DD), and round (e.g. "Series E", "Public", "Acquired")
    • financials — a dict of financial metric objects. Each metric (e.g. "Total revenue", "EBITDA", "Market cap") contains period (YYYY-MM-DD), v (numeric value or null), and currency. 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 no financials fields.
  • description — paragraph description of the company’s product and market position
  • sources array — data attribution (Crunchbase, S&P CapIQ, Wokelo Synthesis)
Product offerings Path: 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), and sources array
key_product_features — a structured feature matrix with:
  • rows — array of feature objects. Each object has category_name (the feature being compared), commentary (a sentence summarising the competitive picture), and company_names (array of {result, company_name, company_permalink} objects where result is "yes" or "no")
  • company_result_mapping — dict keyed by permalink with "yes" / "no" values — useful for programmatic table generation
  • columns — ordered list of permalinks matching the companies in the comparison
Business model Path: 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 the details.financials dict uses a consistent structure:
Raw values are in the base unit (USD, not millions). To convert:
Note that 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


6. Examples

Basic peer comparison — three companies

Sample submission response:

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 against null values.

Reading the feature matrix

The key_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. Handling a "Failed" report status:
Retry with exponential back-off:

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:
Pass 2–5 companies — the API does not accept fewer or more The 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:
Use 20-second polling intervals — comparisons take longer than single-company reports A 5-company comparison runs more research jobs in parallel than Company Research and typically takes 3–7 minutes. Poll every 20 seconds rather than every 15 to avoid unnecessary rate limit consumption:
Guard 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:
Use 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:

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.