100 Apps / buildability audit
AI Product Ops — take-home

77 of 100 apps are agent-buildable today. The other 23 need a phone call, not code.

A research agent read the developer docs for 100 real apps and scored each one on auth, self-serve access, and API surface. Then a second, adversarial pass fact-checked a sample of the results against live docs — and caught a real mistake. Every dot below is one app.

77
self-serve today
21
gated / needs approval
2
no viable path
60%
use OAuth2 in some form
ALL 100 APPS · colored by buildability verdict hover a cell
01 — the patterns

Insight over raw table

The headline isn't the 100 rows — it's what clusters inside them. Four things stood out.

API key beats OAuth2 for the "just build it" apps. Every app scored buildable-with-no-caveats defaults to a plain API key or bearer token — DataForSEO, Stripe-style products, most of the scraping/data category. OAuth2 shows up constantly too (60% of all apps), but almost always adds a consent-screen or app-review step before an agent can act unattended.
Gating tracks money and identity, not company size. Finance/fintech and ecommerce have the highest gated rates — not because those APIs are poorly documented, but because moving money or acting as a business (Brex, Ramp, Amazon SP-API, Salesforce Commerce Cloud) requires proving who you are first. Documentation quality and access difficulty are almost unrelated.
The single most common blocker is "needs an approved account," not "no API." Of the 21 gated apps, 16 have a fully public, well-documented API — the wall is business verification, a paid tier, or a partner program, not a technical gap.
The easy wins cluster in Developer & Infra and Productivity & PM. 19 of 20 apps across those two categories are self-serve buildable with no qualifier — free tiers and token-based auth are the norm for tools built by developers, for developers.

Access model, by category

Auth method (apps can use more than one)

02 — the findings

All 100, filterable

Category, one-liner, auth, access, API surface, verdict, and the evidence URL behind every call.

App Category Auth Access Surface Verdict Evidence
03 — the agent

What actually did the research

Four steps, run per app. Source in agent/research_agent.py.

01

Search

Composio's SEARCH toolkit (or any web-search MCP) finds the app's real developer docs — not the marketing homepage.

02

Fetch

Top result gets pulled with a browser/fetch tool, handling JS-rendered doc sites (Mintlify, Docusaurus, Notion-hosted docs).

03

Extract

Claude reads the fetched text and returns the 7 fields as strict JSON — nothing invented, blockers stated explicitly when evidence is thin.

04

Verify

A second, adversarial Claude call re-reads the same source and is told to find what's wrong, not confirm it. Disagreements get written back, not averaged away.

# the extension point in research_agent.py — where Composio's own tools plug in
from composio import Composio
client = Composio(api_key=os.environ["COMPOSIO_API_KEY"])
session = client.create(user_id="research-agent")
results = session.execute_tool("COMPOSIO_SEARCH_SEARCH", {"query": f"{app_name} API auth docs"})
page = session.execute_tool("COMPOSIO_BROWSER_FETCH", {"url": results[0]["url"]})
# → fed into extract() and verify(), see the full file

Where a human was needed — by design

Disambiguation

When a name matches more than one real product (see iPayX in the matrix below), the agent is instructed to say so instead of guessing. A human picks the right one — this is not a case where more scraping helps.

Sales-gated dead ends

PitchBook, Gladly: no further public docs exist to scrape past "contact sales." The finding is "gated, no public path" — the assignment counts that as a correct answer, not a miss.

Spot-checking the verifier

The verify step catches disagreements automatically, but a human should skim the flagged rows before trusting them at scale — exactly what the verification pass below does on a 5-app sample.

Judgment calls on "gated"

Free-trial-but-time-limited, paid-tier-but-cheap, approval-that-takes-5-minutes — the agent defaults to the stricter label and a human can loosen it case by case.

04 — the verification loop

Sampled, not rubber-stamped

Per the brief: sample the 100, cross-check by hand, show hits and misses honestly. These 5 were picked adversarially — the least-familiar, most-likely-to-be-wrong apps — not at random, because a random sample of 100 mostly-standard SaaS APIs would have looked artificially clean.

80%
first-pass accuracy on the sample
100%
after verification (1 explicitly flagged unresolved, not guessed)
submission

Repo has the runnable agent, full README, and both raw JSON files.

This page reads data/apps.json and data/verification_sample.json directly — no build step.