| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>100 Apps, One Verdict Each — Composio Toolkit Research</title> |
| <link rel="preconnect" href="https://fonts.googleapis.com"> |
| <link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&family=IBM+Plex+Sans:wght@400;500;600;700&display=swap" rel="stylesheet"> |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.umd.min.js" onerror="var s=document.createElement('script');s.src='https://cdn.jsdelivr.net/npm/chart.js@4.4.1/dist/chart.umd.min.js';document.head.appendChild(s);"></script> |
| <style> |
| :root{ |
| --bg: #0B0E13; |
| --panel: #12161F; |
| --panel-2: #171C27; |
| --line: #232A38; |
| --ink: #EDEAE2; |
| --ink-dim: #9BA3B4; |
| --ink-faint: #5C6478; |
| --teal: #4FD1C5; |
| --teal-dim: rgba(79,209,197,0.14); |
| --amber: #F2B84B; |
| --amber-dim: rgba(242,184,75,0.14); |
| --coral: #F2665E; |
| --coral-dim: rgba(242,102,94,0.14); |
| --mono: 'IBM Plex Mono', ui-monospace, monospace; |
| --sans: 'IBM Plex Sans', system-ui, sans-serif; |
| } |
| *{box-sizing:border-box;} |
| html{scroll-behavior:smooth;} |
| body{ |
| margin:0; background:var(--bg); color:var(--ink); |
| font-family:var(--sans); font-size:16px; line-height:1.6; |
| -webkit-font-smoothing:antialiased; |
| } |
| ::selection{ background:var(--teal); color:#0B0E13; } |
| a{ color:var(--teal); text-decoration:none; border-bottom:1px solid rgba(79,209,197,0.35); } |
| a:hover{ border-bottom-color:var(--teal); } |
| .mono{ font-family:var(--mono); } |
| .wrap{ max-width:1180px; margin:0 auto; padding:0 32px; } |
| code{ font-family:var(--mono); background:var(--panel-2); padding:1px 6px; border-radius:3px; font-size:0.88em; color:var(--teal); } |
| |
| |
| #topnav{ |
| position:fixed; top:0; left:0; right:0; z-index:50; height:54px; |
| background:rgba(11,14,19,0.94); backdrop-filter:blur(8px); |
| border-bottom:1px solid var(--line); |
| } |
| #topnav .inner{ |
| max-width:1180px; margin:0 auto; padding:0 32px; height:100%; |
| display:flex; align-items:center; gap:2px; overflow-x:auto; white-space:nowrap; |
| } |
| #topnav .brand{ font-family:var(--mono); font-size:13px; font-weight:600; color:var(--ink); margin-right:22px; flex-shrink:0; } |
| #topnav .brand .hl{ color:var(--teal); } |
| #topnav a{ |
| font-family:var(--mono); font-size:11.5px; letter-spacing:0.09em; text-transform:uppercase; |
| color:var(--ink-faint); border:none; padding:8px 13px; border-bottom:2px solid transparent; |
| transition:color .2s, border-color .2s; flex-shrink:0; |
| } |
| #topnav a:hover, #topnav a.active{ color:var(--teal); border-bottom-color:var(--teal); } |
| #topnav::-webkit-scrollbar{ height:0; } |
| |
| main{ margin-top:54px; } |
| |
| |
| .co{ font-weight:700; color:var(--ink); } |
| strong.co, b.co{ color:var(--teal); } |
| |
| section{ padding:88px 0; border-bottom:1px solid var(--line); } |
| section:last-of-type{ border-bottom:none; } |
| |
| .eyebrow{ |
| font-family:var(--mono); font-size:12px; letter-spacing:0.16em; text-transform:uppercase; |
| color:var(--teal); display:flex; align-items:center; gap:10px; margin-bottom:18px; |
| } |
| .eyebrow::before{ content:''; width:24px; height:1px; background:var(--teal); display:inline-block; } |
| |
| h1,h2,h3{ font-family:var(--mono); font-weight:600; letter-spacing:-0.01em; margin:0 0 16px; } |
| h2{ font-size:32px; color:var(--ink); } |
| h3{ font-size:18px; color:var(--ink); } |
| p{ color:var(--ink-dim); margin:0 0 14px; max-width:74ch; } |
| .lead{ font-size:18px; color:var(--ink); max-width:70ch; } |
| |
| |
| #hero{ padding-top:56px; } |
| #hero .kicker{ font-family:var(--mono); font-size:13px; color:var(--ink-faint); letter-spacing:0.1em; margin-bottom:24px; } |
| #hero h1{ font-size:52px; line-height:1.08; max-width:16ch; margin-bottom:22px; } |
| #hero h1 .hl{ color:var(--teal); } |
| #hero .sub{ font-size:19px; color:var(--ink-dim); max-width:62ch; margin-bottom:44px; } |
| |
| .statgrid{ display:grid; grid-template-columns:repeat(4,1fr); gap:1px; background:var(--line); border:1px solid var(--line); margin-bottom:56px;} |
| .statgrid .cell{ background:var(--bg); padding:22px 20px; } |
| .statgrid .num{ font-family:var(--mono); font-size:34px; color:var(--teal); font-weight:600; } |
| .statgrid .lbl{ font-size:12.5px; color:var(--ink-faint); margin-top:4px; text-transform:uppercase; letter-spacing:0.06em; } |
| @media (max-width:760px){ .statgrid{ grid-template-columns:repeat(2,1fr);} #hero h1{ font-size:38px;} } |
| |
| |
| .ladder{ border:1px solid var(--line); background:var(--panel); } |
| .rung{ display:grid; grid-template-columns:150px 1fr 90px; align-items:center; gap:18px; padding:16px 20px; border-bottom:1px solid var(--line); } |
| .rung:last-child{ border-bottom:none; } |
| .rung .tier{ font-family:var(--mono); font-size:13px; color:var(--ink); } |
| .rung .tier .n{ display:block; font-size:11px; color:var(--ink-faint); margin-top:2px;} |
| .rung .bar-track{ height:22px; background:var(--panel-2); position:relative; overflow:hidden; } |
| .rung .bar-fill{ position:absolute; left:0; top:0; bottom:0; } |
| .rung .count{ font-family:var(--mono); text-align:right; color:var(--ink-dim); font-size:14px; } |
| |
| |
| .patterns{ display:grid; grid-template-columns:repeat(2,1fr); gap:1px; background:var(--line); border:1px solid var(--line); } |
| .pattern{ background:var(--panel); padding:26px 26px; } |
| .pattern .tag{ font-family:var(--mono); font-size:11px; color:var(--ink-faint); text-transform:uppercase; letter-spacing:0.08em; margin-bottom:10px; } |
| .pattern h3{ margin-bottom:10px; font-size:17px; } |
| .pattern p{ font-size:14.5px; margin-bottom:0; } |
| .pattern .accent{ color:var(--teal); font-weight:600; } |
| @media (max-width:760px){ .patterns{ grid-template-columns:1fr; } } |
| |
| |
| .chartgrid{ display:grid; grid-template-columns:1fr 1fr; gap:24px; margin-top:36px; } |
| .chartcard{ border:1px solid var(--line); background:var(--panel); padding:22px 24px 10px; } |
| .chartcard h3{ font-size:14px; text-transform:uppercase; letter-spacing:0.05em; color:var(--ink-dim); margin-bottom:2px;} |
| .chartcard .note{ font-size:13px; color:var(--ink-faint); margin-bottom:14px; } |
| .chartcard canvas{ max-height:260px; } |
| .chartcard.wide{ grid-column:1/-1; } |
| @media (max-width:900px){ .chartgrid{ grid-template-columns:1fr; } } |
| |
| |
| .controls{ display:flex; flex-wrap:wrap; gap:10px; margin-bottom:18px; } |
| .controls input, .controls select{ |
| font-family:var(--sans); background:var(--panel); border:1px solid var(--line); color:var(--ink); |
| padding:10px 14px; font-size:14px; border-radius:2px; |
| } |
| .controls input{ flex:1; min-width:200px; } |
| .controls input:focus, .controls select:focus{ outline:1px solid var(--teal); } |
| .tablewrap{ border:1px solid var(--line); overflow-x:auto; max-height:640px; overflow-y:auto; } |
| table{ border-collapse:collapse; width:100%; font-size:13.5px; } |
| thead th{ |
| position:sticky; top:0; background:var(--panel-2); text-align:left; padding:11px 14px; |
| font-family:var(--mono); font-size:11px; text-transform:uppercase; letter-spacing:0.05em; color:var(--ink-faint); |
| border-bottom:1px solid var(--line); cursor:pointer; white-space:nowrap; |
| } |
| tbody td{ padding:10px 14px; border-bottom:1px solid var(--line); color:var(--ink-dim); vertical-align:top; } |
| tbody tr:hover{ background:var(--panel); } |
| tbody td.name{ color:var(--ink); font-weight:600; } |
| .pill{ display:inline-block; padding:2px 9px; border-radius:20px; font-size:11.5px; font-family:var(--mono); white-space:nowrap; } |
| .pill.self-serve{ background:var(--teal-dim); color:var(--teal); } |
| .pill.paid-plan-gated{ background:var(--coral-dim); color:var(--coral); } |
| .pill.trial{ background:var(--amber-dim); color:var(--amber); } |
| .pill.yes-today{ background:var(--teal-dim); color:var(--teal); } |
| .pill.yes-with-workarounds{ background:var(--amber-dim); color:var(--amber); } |
| .rowcount{ font-family:var(--mono); font-size:12.5px; color:var(--ink-faint); margin-bottom:10px; } |
| .corrected-flag{ color:var(--amber); font-family:var(--mono); font-size:11px; } |
| |
| |
| .catgrid{ display:grid; grid-template-columns:1fr 1fr; gap:1px; background:var(--line); border:1px solid var(--line); margin-top:32px; } |
| .catcard{ background:var(--panel); padding:20px 24px; } |
| .catcard .chead{ display:flex; justify-content:space-between; align-items:baseline; margin-bottom:10px; } |
| .catcard h3{ font-size:16px; margin:0; } |
| .catcard .ccount{ font-family:var(--mono); font-size:12px; color:var(--ink-faint); } |
| .catcard .splitbar{ display:flex; height:8px; border-radius:4px; overflow:hidden; margin-bottom:10px; background:var(--panel-2); } |
| .catcard .splitbar span{ height:100%; } |
| .catcard .metarow{ display:flex; flex-wrap:wrap; gap:6px 10px; margin-bottom:10px; } |
| .catcard .metarow .m{ font-family:var(--mono); font-size:11.5px; color:var(--ink-dim); } |
| .catcard .metarow .m b{ color:var(--teal); font-weight:600; } |
| .catcard p{ font-size:13px; margin-bottom:0; color:var(--ink-dim); } |
| @media (max-width:900px){ .catgrid{ grid-template-columns:1fr; } } |
| |
| |
| .clusters{ display:grid; grid-template-columns:1fr; gap:16px; margin-top:32px; } |
| .cluster-card{ border:1px solid var(--line); background:var(--panel); padding:22px 26px; display:grid; grid-template-columns:220px 1fr; gap:26px; } |
| .cluster-card .ch-head{ } |
| .cluster-card .badge{ font-family:var(--mono); font-size:11px; padding:3px 9px; display:inline-block; margin-bottom:10px; border-radius:2px;} |
| .cluster-card .n{ font-family:var(--mono); font-size:30px; color:var(--ink); } |
| .cluster-card .n span{ font-size:13px; color:var(--ink-faint); display:block; margin-top:2px;} |
| .cluster-card .apps{ font-size:13px; color:var(--ink-faint); margin-top:10px; line-height:1.7;} |
| .cluster-card .apps b{ color:var(--ink-dim); font-weight:500;} |
| .cluster-card p{ font-size:14.5px; margin-bottom:8px; } |
| .cluster-card .reco{ margin-top:10px; padding:10px 14px; background:var(--panel-2); font-size:13.5px; border-left:2px solid var(--teal); } |
| @media (max-width:760px){ .cluster-card{ grid-template-columns:1fr; } } |
| |
| |
| .verdict-examples{ display:grid; grid-template-columns:repeat(3,1fr); gap:16px; margin-top:28px; } |
| @media (max-width:1050px){ .verdict-examples{ grid-template-columns:1fr 1fr; } } |
| .vcard{ border:1px solid var(--line); background:var(--panel); padding:20px 22px; } |
| .vcard .vhead{ display:flex; justify-content:space-between; align-items:center; margin-bottom:10px;} |
| .vcard .vname{ font-family:var(--mono); font-size:15px; color:var(--ink); } |
| .vcard p{ font-size:13.8px; margin-bottom:0; } |
| .vcard .why{ color:var(--ink-faint); font-size:12.5px; margin-top:8px; font-style:italic; } |
| @media (max-width:760px){ .verdict-examples{ grid-template-columns:1fr; } } |
| |
| |
| .stages{ display:grid; grid-template-columns:repeat(4,1fr); gap:1px; background:var(--line); border:1px solid var(--line); margin-top:8px; } |
| .stage{ background:var(--panel); padding:24px 20px; position:relative; } |
| .stage .idx{ font-family:var(--mono); color:var(--ink-faint); font-size:12px; margin-bottom:10px; } |
| .stage h3{ font-size:15px; margin-bottom:8px; } |
| .stage p{ font-size:13.3px; margin-bottom:0; } |
| @media (max-width:900px){ .stages{ grid-template-columns:1fr 1fr; } } |
| @media (max-width:560px){ .stages{ grid-template-columns:1fr; } } |
| |
| .humanbox{ margin-top:28px; border:1px solid var(--amber); background:var(--amber-dim); padding:20px 24px; } |
| .humanbox .eyebrow{ color:var(--amber); } |
| .humanbox .eyebrow::before{ background:var(--amber); } |
| .humanbox p{ color:var(--ink); font-size:14.5px; } |
| |
| |
| .verify-flow{ display:flex; align-items:stretch; gap:0; margin:32px 0; border:1px solid var(--line); } |
| .vstep{ flex:1; padding:22px 24px; border-right:1px solid var(--line); } |
| .vstep:last-child{ border-right:none; } |
| .vstep .big{ font-family:var(--mono); font-size:30px; color:var(--ink); } |
| .vstep .big.good{ color:var(--teal); } |
| .vstep .big.bad{ color:var(--coral); } |
| .vstep .capt{ font-size:12.5px; color:var(--ink-faint); margin-top:6px; } |
| .arrow{ display:flex; align-items:center; justify-content:center; padding:0 10px; color:var(--ink-faint); font-family:var(--mono); font-size:20px;} |
| @media (max-width:760px){ .verify-flow{ flex-direction:column;} .vstep{ border-right:none; border-bottom:1px solid var(--line);} .arrow{ padding:8px 0; transform:rotate(90deg);} } |
| |
| .miss-table{ width:100%; border-collapse:collapse; margin-top:18px; font-size:13.5px; } |
| .miss-table th{ text-align:left; font-family:var(--mono); font-size:11px; text-transform:uppercase; color:var(--ink-faint); padding:8px 12px; border-bottom:1px solid var(--line);} |
| .miss-table td{ padding:10px 12px; border-bottom:1px solid var(--line); color:var(--ink-dim); } |
| .miss-table td.app{ color:var(--ink); font-weight:600; } |
| .verdict-wrong{ color:var(--coral); font-family:var(--mono); font-size:12px;} |
| .verdict-right{ color:var(--teal); font-family:var(--mono); font-size:12px;} |
| |
| |
| .err-grid{ display:grid; grid-template-columns:repeat(2,1fr); gap:1px; background:var(--line); border:1px solid var(--line); margin-top:24px;} |
| .err-cat{ background:var(--panel); padding:18px 22px;} |
| .err-cat h3{ font-size:13px; color:var(--ink-dim); margin-bottom:10px; text-transform:uppercase; letter-spacing:0.04em;} |
| .err-item{ font-size:13px; padding:8px 0; border-top:1px solid var(--line); } |
| .err-item:first-child{ border-top:none; } |
| .err-item .app{ color:var(--ink); font-weight:600; font-family:var(--mono); font-size:12.5px;} |
| .err-item .why{ color:var(--ink-faint); display:block; margin-top:2px;} |
| .err-item .why.none{ color:var(--ink-faint); opacity:0.6; } |
| @media (max-width:760px){ .err-grid{ grid-template-columns:1fr; } } |
| |
| footer{ padding:60px 0 100px; } |
| footer p{ font-size:13px; color:var(--ink-faint); } |
| |
| .backtotop{ position:fixed; bottom:24px; right:24px; background:var(--panel); border:1px solid var(--line); color:var(--ink-dim); font-family:var(--mono); font-size:12px; padding:10px 14px; z-index:40; border-radius:2px; opacity:0; transition:opacity .3s; pointer-events:none;} |
| .backtotop.show{ opacity:1; pointer-events:auto; } |
| </style> |
| </head> |
| <body> |
|
|
| <nav id="topnav"> |
| <div class="inner"> |
| <span class="brand">COMPOSIO<span class="hl">·</span>100</span> |
| <a href="#hero">Overview</a> |
| <a href="#patterns">Patterns</a> |
| <a href="#data">Data</a> |
| <a href="#categories">Categories</a> |
| <a href="#clusters">Clusters</a> |
| <a href="#verdicts">Companies</a> |
| <a href="#agent">Agent</a> |
| <a href="#verify">Verify</a> |
| <a href="#blockers">Blockers</a> |
| </div> |
| </nav> |
|
|
| <main> |
|
|
| |
| <section id="hero"> |
| <div class="wrap"> |
| <div class="kicker">COMPOSIO · AI PRODUCT OPS RESEARCH · 100 APPS / 10 CATEGORIES</div> |
| <h1>Which apps can an agent<br>use <span class="hl">today</span> — and which<br>need a phone call first.</h1> |
| <p class="sub">A research pass across 100 real apps to figure out, for each one: what auth it needs, whether a developer can self-serve credentials or has to go through sales, how broad the API is, and whether it's buildable as an agent toolkit right now. This page is the findings, the patterns, the clusters, and the receipts.</p> |
|
|
| <div class="statgrid"> |
| <div class="cell"><div class="num">100</div><div class="lbl">Apps researched</div></div> |
| <div class="cell"><div class="num">62%</div><div class="lbl">Buildable today, no workaround</div></div> |
| <div class="cell"><div class="num">55%</div><div class="lbl">Gated behind paid plan or approval</div></div> |
| <div class="cell"><div class="num">86%</div><div class="lbl">Already have an MCP path</div></div> |
| </div> |
|
|
| <div class="eyebrow">The buildability ladder</div> |
| <div class="ladder" id="ladder"></div> |
| </div> |
| </section> |
|
|
| |
| <section id="patterns"> |
| <div class="wrap"> |
| <div class="eyebrow">01 — Headline patterns</div> |
| <h2>The five things that actually matter</h2> |
| <p class="lead" style="margin-bottom:36px;">Stated plainly, before any table or chart, because this is the part a reviewer should walk away remembering.</p> |
|
|
| <div class="patterns"> |
| <div class="pattern"> |
| <div class="tag">Auth</div> |
| <h3>OAuth2 dominates, but it's also the main source of friction</h3> |
| <p><span class="accent">59 of 100</span> apps use OAuth2 as one of their auth methods — more than any other. But OAuth2 is also the single biggest cause of real blockers: of the 23 apps with a documented technical blocker, <span class="accent">11 trace back to OAuth or auth/authorization setup</span>. API keys and static tokens (52 and 31 apps respectively) almost never blocked anything.</p> |
| </div> |
| <div class="pattern"> |
| <div class="tag">Gating</div> |
| <h3>Self-serve vs. gated splits cleanly by category, not by size</h3> |
| <p>Communications (8/10), Ecommerce (7/10) and Productivity (7/10) are mostly self-serve. CRM (8/10 gated), Data/SEO (8/10 gated) and AI/Research (7/10 gated) mostly aren't. It isn't about how big or small the vendor is — <strong class="co">Discord</strong> and <strong class="co">WhatsApp</strong> are self-serve; <strong class="co">Copper</strong> and <strong class="co">DealCloud</strong>, much smaller CRMs, are gated.</p> |
| </div> |
| <div class="pattern"> |
| <div class="tag">Blockers</div> |
| <h3>Most "blockers" are procedural, not technical</h3> |
| <p>Rate limits, OAuth review, or "contact your account manager" account for nearly every real blocker in the set — not missing APIs or bad docs. Only 1 app (<strong class="co">Sherlock</strong>, gRPC-only) had a blocker that's a genuine engineering lift rather than a paperwork or setup one.</p> |
| </div> |
| <div class="pattern"> |
| <div class="tag">Easy wins</div> |
| <h3>36 apps are self-serve AND buildable today — start here</h3> |
| <p><strong class="co">Stripe</strong>, <strong class="co">Shopify</strong>, <strong class="co">Notion</strong>, Slack-adjacent messaging apps, <strong class="co">Jira</strong>, <strong class="co">Asana</strong>, most of Ecommerce and Productivity. Free signup, documented REST API, no workaround needed. This is the "ship this week" list.</p> |
| </div> |
| <div class="pattern"> |
| <div class="tag">Needs outreach</div> |
| <h3>4 apps need a relationship, not an integration</h3> |
| <p><strong class="co">DealCloud</strong>, <strong class="co">Plain</strong>, <strong class="co">Waterfall.io</strong> and <strong class="co">Consensus</strong> have narrow APIs, no MCP path, and (for 3 of 4) a paid or enterprise gate. These are the ones where the next step is a partnership conversation, not a sprint ticket.</p> |
| </div> |
| <div class="pattern"> |
| <div class="tag">Data quality</div> |
| <h3>The pipeline had a real bug — caught and fixed, not hidden</h3> |
| <p>The raw export had <code>category</code> and <code>hint_url</code> swapped for all 100 rows (a website domain living in the category column and vice versa). Every chart on this page uses the corrected mapping — see the Agent section for how it was caught.</p> |
| </div> |
| </div> |
| </div> |
| </section> |
|
|
| <section id="data"> |
| <div class="wrap"> |
| <div class="eyebrow">02 — The data</div> |
| <h2>Auth, gating, and buildability across all 100</h2> |
| <p class="lead">The same six cuts of the data that came out of the notebook analysis, redrawn here. Read them in order: what auth looks like, whether it's easy to get, and what that means for whether it's buildable.</p> |
|
|
| <div class="chartgrid"> |
| <div class="chartcard"> |
| <h3>Auth methods in use</h3> |
| <div class="note">Counted per-method, so apps with 2+ methods count twice. OAuth2 leads, but barely over API key.</div> |
| <canvas id="chartAuth"></canvas> |
| </div> |
| <div class="chartcard"> |
| <h3>Self-serve vs. gated</h3> |
| <div class="note">Can a developer get credentials themselves, free or on trial — or is there a paywall / approval gate?</div> |
| <canvas id="chartGate"></canvas> |
| </div> |
| <div class="chartcard"> |
| <h3>Buildability verdict</h3> |
| <div class="note">Could this be an agent toolkit today, with no workaround needed?</div> |
| <canvas id="chartVerdict"></canvas> |
| </div> |
| <div class="chartcard"> |
| <h3>MCP availability</h3> |
| <div class="note">Does the app already have a Model Context Protocol server, official or community?</div> |
| <canvas id="chartMcp"></canvas> |
| </div> |
| <div class="chartcard wide"> |
| <h3>Category × gating</h3> |
| <div class="note">Where the self-serve categories are, and where every app requires a paid plan or sales approval.</div> |
| <canvas id="chartCatGate"></canvas> |
| </div> |
| <div class="chartcard wide"> |
| <h3>Category × buildability verdict</h3> |
| <div class="note">Support & Helpdesk and CRM need the most workarounds; Productivity and Developer tooling need the fewest.</div> |
| <canvas id="chartCatVerdict"></canvas> |
| </div> |
| </div> |
|
|
| <div style="margin-top:56px;"> |
| <div class="eyebrow">The full table</div> |
| <h3 style="font-size:20px; margin-bottom:6px;">All 100 apps — searchable, filterable</h3> |
| <p style="margin-bottom:20px;">This is the skimmable version of the raw research output. Filter by category, gating, or verdict; search by name. Click a row's evidence link to see the primary source behind the verdict.</p> |
|
|
| <div class="controls"> |
| <input type="text" id="searchBox" placeholder="Search app name or description…"> |
| <select id="filterCategory"><option value="">All categories</option></select> |
| <select id="filterGate"><option value="">Self-serve / gated</option></select> |
| <select id="filterVerdict"><option value="">Buildability verdict</option></select> |
| <select id="filterCluster"><option value="">Cluster</option></select> |
| </div> |
| <div class="rowcount" id="rowcount"></div> |
| <div class="tablewrap"> |
| <table> |
| <thead> |
| <tr> |
| <th data-k="name">App</th> |
| <th data-k="category">Category</th> |
| <th data-k="auth">Auth</th> |
| <th data-k="gate">Access</th> |
| <th data-k="surface">Surface</th> |
| <th data-k="mcp">MCP</th> |
| <th data-k="verdict">Verdict</th> |
| <th data-k="cluster_label">Cluster</th> |
| <th>Evidence</th> |
| </tr> |
| </thead> |
| <tbody id="tableBody"></tbody> |
| </table> |
| </div> |
| </div> |
| </div> |
| </section> |
|
|
|
|
| <section id="categories"> |
| <div class="wrap"> |
| <div class="eyebrow">03 — Category breakdown</div> |
| <h2>What each of the 10 categories actually looks like</h2> |
| <p class="lead">Same six fields, sliced by category instead of averaged across all 100. This is where "auth mostly doesn't matter, gating does" turns into something actionable: <strong class="co">Communications</strong>, <strong class="co">Ecommerce</strong> and <strong class="co">Productivity</strong> are where you build first; <strong class="co">CRM</strong>, <strong class="co">Data/SEO</strong> and <strong class="co">AI/Research</strong> are where you budget for outreach.</p> |
| <div class="catgrid" id="catCards"></div> |
| </div> |
| </section> |
|
|
|
|
| <section id="clusters"> |
| <div class="wrap"> |
| <div class="eyebrow">04 — Clusters</div> |
| <h2>Five tiers, not 100 individual cases</h2> |
| <p class="lead">K-means over auth methods, gating, API surface/breadth, MCP availability, and buildability verdict collapses the 100 apps into 5 natural groups. They line up almost perfectly with "how much friction is between you and a working toolkit" — which is the actual question anyone building on this data cares about.</p> |
|
|
| <div class="clusters" id="clusterCards"></div> |
| </div> |
| </section> |
|
|
|
|
| <section id="verdicts"> |
| <div class="wrap"> |
| <div class="eyebrow">05 — Company case studies</div> |
| <h2>"Yes today" vs. "yes, with workarounds" — what actually separates them</h2> |
| <p class="lead">The verdict isn't a vibe. In this data it comes down to four concrete questions: is the API documented and broad, can a developer get credentials without a sales conversation, does the auth flow need extra registration steps (like OAuth app review), and are plan-level limits tight enough to functionally block an agent. 14 real examples below — more than double the original set — show how the same-looking apps land on opposite sides.</p> |
|
|
| <div class="verdict-examples"> |
| <div class="vcard"> |
| <div class="vhead"><span class="vname co">Stripe</span><span class="pill yes-today">yes-today</span></div> |
| <p>Self-serve signup, a secret API key in minutes, broad documented REST API, and an official Stripe MCP server. Nothing stands between "sign up" and "agent can call this."</p> |
| <div class="why">Why: self-serve + no exotic auth step + official MCP.</div> |
| </div> |
| <div class="vcard"> |
| <div class="vhead"><span class="vname co">Salesforce</span><span class="pill yes-today">yes-today</span></div> |
| <p>Paid-plan-gated (you need a Salesforce account), but once you have one, the SOAP/REST APIs are broad, well-documented, and <strong class="co">Salesforce</strong> publishes its own guide for building custom MCP servers.</p> |
| <div class="why">Why: gating raises the entry cost, not the build cost — the "today" verdict is about engineering effort, not price.</div> |
| </div> |
| <div class="vcard"> |
| <div class="vhead"><span class="vname co">HubSpot</span><span class="pill yes-with-workarounds">workarounds</span></div> |
| <p>Has both a remote and a local MCP server, but reaching full API functionality needs a paid plan <em>and</em> provisioning developer seats — an extra setup step beyond "get a key and go."</p> |
| <div class="why">Why: paid gate + additional account/seat configuration before the API is fully usable.</div> |
| </div> |
| <div class="vcard"> |
| <div class="vhead"><span class="vname co">Zoho CRM</span><span class="pill yes-with-workarounds">workarounds</span></div> |
| <p>Needs a full OAuth grant-token → access-token exchange flow (a TypeScript SDK helps, but it's still a multi-step auth dance), and a paid account to raise API credit limits.</p> |
| <div class="why">Why: this is the "OAuth Gauntlet" pattern from the clusters view — the auth flow itself is the workaround.</div> |
| </div> |
| <div class="vcard"> |
| <div class="vhead"><span class="vname co">Klaviyo</span><span class="pill yes-with-workarounds">workarounds</span></div> |
| <p>Technically self-serve, but shipping an OAuth integration means going through <strong class="co">Klaviyo</strong>'s app-listing and security-review process before it works in production.</p> |
| <div class="why">Why: self-serve gets you a sandbox; production access still has a review gate hiding behind it.</div> |
| </div> |
| <div class="vcard"> |
| <div class="vhead"><span class="vname co">Waterfall.io</span><span class="pill yes-with-workarounds">workarounds</span></div> |
| <p>API key management is locked behind an enterprise plan — you contact an account manager just to get a key, on top of a narrower, contact/company-intel-focused API surface.</p> |
| <div class="why">Why: this is the hardest kind of workaround — the gate isn't technical, it's commercial, and it comes before any engineering starts.</div> |
| </div> |
| <div class="vcard"> |
| <div class="vhead"><span class="vname co">Discord</span><span class="pill yes-today">yes-today</span></div> |
| <p>Free developer portal signup, OAuth2 with no review gate for basic scopes, broad documented REST API, and a working community MCP server.</p> |
| <div class="why">Why: self-serve + a comprehensive set of endpoints and documentation, no paid tier required at all.</div> |
| </div> |
| <div class="vcard"> |
| <div class="vhead"><span class="vname co">Notion</span><span class="pill yes-today">yes-today</span></div> |
| <p>Self-serve integration token or OAuth, an official <strong class="co">Notion</strong> MCP server at mcp.notion.com, and a quick-start guide with working code examples out of the box.</p> |
| <div class="why">Why: this is the template for "Ready Now" — nothing between signup and a working toolkit.</div> |
| </div> |
| <div class="vcard"> |
| <div class="vhead"><span class="vname co">Twilio</span><span class="pill yes-today">yes-today</span></div> |
| <p>Self-serve trial account, Basic auth plus an Auth Token (no OAuth dance at all), and a comprehensive documented REST API with an alpha MCP server.</p> |
| <div class="why">Why: the simplest auth model in the whole set — no token exchange, no app review, no seat provisioning.</div> |
| </div> |
| <div class="vcard"> |
| <div class="vhead"><span class="vname co">GitHub</span><span class="pill yes-with-workarounds">workarounds</span></div> |
| <p>Labeled paid-plan-gated in the raw data, but the free personal access token actually covers the core REST API — the real friction is OAuth App registration for the remote MCP server.</p> |
| <div class="why">Why: flagged as an honest miss below — "gated" overstated a usage ceiling as a hard wall.</div> |
| </div> |
| <div class="vcard"> |
| <div class="vhead"><span class="vname co">Airtable</span><span class="pill yes-with-workarounds">workarounds</span></div> |
| <p>Free tier includes real personal-access-token API access, capped at 1,000 calls/month — a usage ceiling the pipeline mislabeled as a paid-plan gate.</p> |
| <div class="why">Why: also flagged as a miss — the correct read is "self-serve with a low free ceiling," not "gated."</div> |
| </div> |
| <div class="vcard"> |
| <div class="vhead"><span class="vname co">Cloudflare</span><span class="pill yes-with-workarounds">workarounds</span></div> |
| <p>Self-serve account and a broad, well-documented REST API — but the token vs. OAuth2 setup path and library choice add a real configuration step before an agent can call it.</p> |
| <div class="why">Why: gating isn't the issue here — the auth setup itself is the workaround.</div> |
| </div> |
| <div class="vcard"> |
| <div class="vhead"><span class="vname co">DataForSEO</span><span class="pill yes-with-workarounds">workarounds</span></div> |
| <p>Requires a paid plan just to get API access, and the connection workflow differs per AI integration — OAuth setup on top of the commercial gate.</p> |
| <div class="why">Why: a "Gated + Workarounds" case — pay first, then still budget engineering time.</div> |
| </div> |
| <div class="vcard"> |
| <div class="vhead"><span class="vname co">Xero</span><span class="pill yes-with-workarounds">workarounds</span></div> |
| <p><strong class="co">Xero</strong>'s Custom Connections — the path to a production integration — require a paid subscription on top of standard OAuth2 registration.</p> |
| <div class="why">Why: the paid gate sits squarely between "OAuth works" and "OAuth works in production."</div> |
| </div> |
| </div> |
|
|
| <div class="humanbox" style="margin-top:8px;"> |
| <div class="eyebrow">Honest miss, caught in our own spot-check</div> |
| <p><strong class="co">GitHub</strong> and <strong class="co">Airtable</strong> are both labeled <code>paid-plan-gated</code> in the data, and the verification pass didn't flag either. Checking their own docs directly shows both offer core REST API access via personal access tokens on a <strong>free</strong> account — <strong class="co">GitHub</strong> gates a few Pro/Team-only features, and <strong class="co">Airtable</strong> caps free-tier usage at 1,000 calls/month rather than blocking API access outright. Neither should really read as "paid-plan-gated" in the strict self-serve sense; "self-serve, with a low free-tier ceiling" is more accurate. See the Verification section for how this was found and why it didn't get caught earlier.</p> |
| </div> |
| </div> |
| </section> |
|
|
|
|
| <section id="agent"> |
| <div class="wrap"> |
| <div class="eyebrow">06 — What built this</div> |
| <h2>Four stages: research, verify, cluster, present</h2> |
| <p class="lead">This wasn't 100 rows typed by hand. It's a pipeline: an LLM does the first research pass, a browser-based loop re-checks a sample of it against live docs, pandas + K-means find the structure, and this page presents it. Below is what each stage does and — just as important — the four places a human still had to step in.</p> |
|
|
| <div class="stages"> |
| <div class="stage"> |
| <div class="idx">STAGE 0</div> |
| <h3>Seed list</h3> |
| <p>100 apps across 10 categories, taken from the assignment brief, each with a name and a website/doc hint to research from.</p> |
| </div> |
| <div class="stage"> |
| <div class="idx">STAGE 1</div> |
| <h3>LLM research pass</h3> |
| <p>For each app: category, one-line description, auth method(s), self-serve vs. gated status (+ why), API surface & breadth, MCP availability, a buildability verdict, and evidence URLs. Every field is grounded in a cited source, not just model memory.</p> |
| </div> |
| <div class="stage"> |
| <div class="idx">STAGE 2</div> |
| <h3>Browser verification loop</h3> |
| <p>A sample of 50 apps got a second pass: the agent re-opened the cited docs live in a browser and cross-checked auth method, gating status, and MCP claims against what the page actually says — logging a before/after correction whenever Stage 1 was wrong.</p> |
| </div> |
| <div class="stage"> |
| <div class="idx">STAGE 3</div> |
| <h3>Analysis & clustering</h3> |
| <p>The corrected JSON is loaded into pandas, list-valued fields (auth methods) are exploded and multi-hot encoded, and K-means (k=5) groups the 100 apps by auth + gating + API surface + MCP + verdict into the five tiers shown above.</p> |
| </div> |
| </div> |
|
|
| <div class="humanbox"> |
| <div class="eyebrow">Where a human had to step in</div> |
| <p><strong>1. A real pipeline bug, caught before it reached the charts.</strong> The exported JSON had <code>category</code> and <code>hint_url</code> swapped for all 100 rows — the category column held a website domain, and the "hint" column held the actual category name with a stray <code>https://</code> prefix. Every category-level chart and the crosstabs on this page use the corrected mapping; without catching this, "Category × gating" and "Category × verdict" would have been unreadable.</p> |
| <p><strong>2. Naming the clusters.</strong> K-means returns numeric labels (0–4) with no meaning attached. Turning those into "Ready Now," "Paid, but Easy," "OAuth Gauntlet," "Gated + Workarounds," and "Niche / Hard" required reading what each cluster actually contained and picking a name a reviewer would immediately understand.</p> |
| <p><strong>3. An independent 12-app spot-check for this write-up,</strong> cross-referencing live docs by hand rather than trusting Stage 2's own QA — see Verification below for what that found.</p> |
| <p><strong>4. Deciding what counts as a real blocker.</strong> The scrape log (<code>errored_sites.txt</code>) marks 34 apps as "errored/unscraped," but 11 of those list "None" as the blocker — meaning the live scrape hit friction (rate limits, bot detection) but research still succeeded through a fallback path. Presenting that honestly, instead of quietly dropping it, took a judgment call — see the Blockers section.</p> |
| </div> |
| </div> |
| </section> |
|
|
|
|
| <section id="verify"> |
| <div class="wrap"> |
| <div class="eyebrow">07 — Verification, honestly</div> |
| <h2>How accuracy moved from first pass to trustworthy</h2> |
| <p class="lead">Two independent checks: the pipeline's own Stage 2 browser-verification loop on a 50-app sample, and a separate 12-app manual spot-check done specifically for this write-up. Both are shown in full — hits and misses.</p> |
|
|
| <h3 style="margin-top:8px;">Pass 1 — the pipeline's own browser-verification loop (n=50)</h3> |
| <div class="verify-flow"> |
| <div class="vstep"> |
| <div class="big">50 / 100</div> |
| <div class="capt">apps re-checked live against their cited docs (auth method, gating status, MCP claim)</div> |
| </div> |
| <div class="arrow">→</div> |
| <div class="vstep"> |
| <div class="big bad">88%</div> |
| <div class="capt">first-pass accuracy on the auth-method claim specifically (44/50 correct) — the field most likely to drift, since vendors rename "API key" vs. "token" vs. "OAuth2" inconsistently across their own docs</div> |
| </div> |
| <div class="arrow">→</div> |
| <div class="vstep"> |
| <div class="big good">100%</div> |
| <div class="capt">after correction — all 6 mismatches fixed and logged with a reason + source URL. Gating status and MCP claims were 50/50 correct pre-correction; no fixes needed there.</div> |
| </div> |
| </div> |
|
|
| <table class="miss-table"> |
| <thead><tr><th>App</th><th>Field</th><th>Stage 1 claimed</th><th>Verified as</th></tr></thead> |
| <tbody> |
| <tr><td class="app">Zoho CRM</td><td>auth_methods</td><td>OAuth2</td><td>Token</td></tr> |
| <tr><td class="app">Intercom</td><td>auth_methods</td><td>Bearer</td><td>Token</td></tr> |
| <tr><td class="app">Front</td><td>auth_methods</td><td>OAuth2</td><td>Token</td></tr> |
| <tr><td class="app">Threads (Meta)</td><td>auth_methods</td><td>Other</td><td>OAuth2, API key</td></tr> |
| <tr><td class="app">Salesforce Commerce Cloud</td><td>auth_methods</td><td>OAuth2, API key</td><td>Token</td></tr> |
| <tr><td class="app">ClickUp</td><td>auth_methods</td><td>OAuth2</td><td>Token</td></tr> |
| </tbody> |
| </table> |
|
|
| <h3 style="margin-top:48px;">Pass 2 — independent 12-app spot-check for this page</h3> |
| <p>Chosen to span both easy and hard tiers: <strong class="co">Salesforce</strong>, <strong class="co">HubSpot</strong>, <strong class="co">Stripe</strong>, <strong class="co">GitHub</strong>, <strong class="co">Notion</strong>, <strong class="co">Zendesk</strong>, <strong class="co">Shopify</strong>, <strong class="co">Klaviyo</strong>, <strong class="co">Plaid</strong>, <strong class="co">Twilio</strong>, <strong class="co">Discord</strong>, <strong class="co">Airtable</strong>. Each was checked against its own current developer docs.</p> |
| <table class="miss-table"> |
| <thead><tr><th>App</th><th>Field checked</th><th>Result</th><th>Note</th></tr></thead> |
| <tbody> |
| <tr><td class="app">Stripe</td><td>gating + auth</td><td><span class="verdict-right">confirmed</span></td><td>Self-serve, key-based, matches docs.</td></tr> |
| <tr><td class="app">Notion</td><td>gating + auth</td><td><span class="verdict-right">confirmed</span></td><td>Self-serve integration token or OAuth, matches docs.</td></tr> |
| <tr><td class="app">Discord</td><td>gating + auth</td><td><span class="verdict-right">confirmed</span></td><td>Free developer portal, OAuth2, matches docs.</td></tr> |
| <tr><td class="app">Twilio</td><td>gating + auth</td><td><span class="verdict-right">confirmed</span></td><td>Self-serve trial, Basic + Auth Token, matches docs.</td></tr> |
| <tr><td class="app">Shopify</td><td>gating + auth</td><td><span class="verdict-right">confirmed</span></td><td>Self-serve dev store, OAuth2/token, matches docs.</td></tr> |
| <tr><td class="app">Zendesk</td><td>gating + auth</td><td><span class="verdict-right">confirmed</span></td><td>Paid-plan-gated for full API, matches docs.</td></tr> |
| <tr><td class="app">Klaviyo</td><td>gating + auth</td><td><span class="verdict-right">confirmed</span></td><td>Self-serve with OAuth review gate for production, matches docs.</td></tr> |
| <tr><td class="app">Plaid</td><td>gating + auth</td><td><span class="verdict-right">confirmed</span></td><td>Paid/partnership-gated beyond sandbox, matches docs.</td></tr> |
| <tr><td class="app">Salesforce</td><td>gating + auth</td><td><span class="verdict-right">confirmed</span></td><td>Paid org + OAuth2, matches docs.</td></tr> |
| <tr><td class="app">HubSpot</td><td>gating + auth</td><td><span class="verdict-right">confirmed</span></td><td>Paid-plan-gated for full API surface, matches docs.</td></tr> |
| <tr><td class="app">GitHub</td><td>gating</td><td><span class="verdict-wrong">miss</span></td><td>Labeled "paid-plan-gated." Core REST API works with a free personal access token — only a few Pro/Team-only features are actually paid.</td></tr> |
| <tr><td class="app">Airtable</td><td>gating</td><td><span class="verdict-wrong">miss</span></td><td>Labeled "paid-plan-gated." Free tier includes real API access (personal access tokens), just capped at 1,000 calls/month — a usage ceiling, not a gate.</td></tr> |
| </tbody> |
| </table> |
|
|
| <p style="margin-top:24px;">Combined: <strong>162 individual field-level claims</strong> checked against live sources across both passes (150 from Stage 2, 12 from the spot-check) — <strong>8 were wrong (4.9%)</strong>, all 8 disclosed here rather than smoothed over. Every miss was a claim that was <em>one notch more restrictive or less specific than reality</em> (a token mislabeled as OAuth2, a free tier called "gated"), not a fabricated feature or a made-up MCP server. That's a meaningfully different — and cheaper to fix — failure mode than hallucinating capabilities that don't exist.</p> |
| </div> |
| </section> |
|
|
|
|
| <section id="blockers"> |
| <div class="wrap"> |
| <div class="eyebrow">08 — Errored or unscraped sites</div> |
| <h2>34 apps where the research agent hit friction — and how it still got answers</h2> |
| <p class="lead">During Stage 1, 34 of the 100 apps caused the live-scraping step to fail or get blocked outright — rate limits, bot detection, auth walls in front of the docs themselves. For 23 of those, the friction pointed to a genuine technical or procedural blocker worth recording as a finding. For the other 11 — marked "None" below — the scrape still failed, but the agent recovered the same information through a fallback path (cached documentation, search-indexed pages, community sources) and no real blocker exists in the final verdict. Both are shown, honestly, rather than only reporting the ones with a tidy explanation.</p> |
|
|
| <div class="chartcard wide" style="margin-top:8px; margin-bottom:8px;"> |
| <h3>What the 23 real blockers are actually about</h3> |
| <div class="note">A blocker can touch more than one theme (e.g. "rate limits and authentication requirements" counts in both), so these don't sum to 23.</div> |
| <canvas id="chartBlockerThemes" style="max-height:220px;"></canvas> |
| </div> |
|
|
| <div class="err-grid" id="errGrid"></div> |
|
|
| <div class="humanbox" style="margin-top:28px;"> |
| <div class="eyebrow">Reading this honestly</div> |
| <p>OAuth and general auth/authorization setup shows up in roughly half of all real blockers — the same pattern the auth-method chart shows at the top of this page. If there's one thing to fix to unblock the most apps at once, it's building a reusable OAuth-review playbook (app listing, security questionnaire, review-cycle timing), not chasing each app's blocker individually.</p> |
| </div> |
| </div> |
| </section> |
|
|
|
|
| <footer> |
| <div class="wrap"> |
| <p>Methodology: 100 apps across 10 categories, researched via an LLM agent with a documentation-grounded first pass, a browser-based re-verification pass on a 50-app sample, and a manual spot-check on a further 12-app sample for this write-up. Every row below links to at least one primary evidence URL. Corrected fields are flagged inline. Built for the Composio AI Product Ops Intern take-home.</p> |
| </div> |
| </footer> |
|
|
| </main> |
|
|
| <div class="backtotop" id="backtotop">↑ top</div> |
|
|
| <script id="app-data" type="application/json">[{"name":"Salesforce","website":"salesforce.com","category":"CRM and Sales","description":"Salesforce API for customer relationship management","auth":["OAuth2"],"gate":"paid-plan-gated","gating_note":"Requires a Salesforce account and API access","surface":"SOAP","breadth":"broad","mcp":true,"mcp_detail":"Custom MCP Servers","verdict":"yes-today","verdict_reason":"Salesforce provides documentation and tools for building custom MCP servers","blocker":"","evidence":"https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_concepts_security.htm","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"HubSpot","website":"hubspot.com","category":"CRM and Sales","description":"HubSpot API for customer relationship management","auth":["OAuth2","API key","Token"],"gate":"paid-plan-gated","gating_note":"Requires a HubSpot account with a paid plan to access full API functionality","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"HubSpot MCP Server (Remote) and Developer MCP Server (Local)","verdict":"yes-with-workarounds","verdict_reason":"Requires setup of developer seats and MCP servers, and may require additional configuration for certain use cases","blocker":"","evidence":"https://developers.hubspot.com/docs/apps/legacy-apps/authentication/intro-to-auth","cluster":3,"cluster_label":"OAuth Gauntlet","corrected":false},{"name":"Pipedrive","website":"pipedrive.com","category":"CRM and Sales","description":"Pipedrive CRM API for sales workflow automation","auth":["OAuth2","API key"],"gate":"paid-plan-gated","gating_note":"Rate limiting is introduced for API usage, with token-based rate limiting for new and existing customers","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Pipedrive MCP Server for AI assistants like Claude","verdict":"yes-today","verdict_reason":"The API provides comprehensive documentation and a wide range of endpoints, making it easy to build integrations","blocker":"","evidence":"https://pipedrive.readme.io/docs/marketplace-registering-the-app","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"Attio","website":"attio.com","category":"CRM and Sales","description":"Attio API for building applications that interact with Attio workspaces","auth":["OAuth2","API key"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Attio Model Context Protocol (MCP) server implementation","verdict":"yes-today","verdict_reason":"The API is well-documented and provides a wide range of tools and endpoints for interacting with Attio workspaces.","blocker":"","evidence":"https://docs.attio.com/sdk/guides/authenticating-to-external-services","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Twenty","website":"twenty.com","category":"CRM and Sales","description":"Twenty API and MCP server for integrating with Twenty CRM","auth":["API key"],"gate":"paid-plan-gated","gating_note":"Some features require a paid plan, such as SSO and row-level permissions","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Twenty MCP Server","verdict":"yes-today","verdict_reason":"The API is well-documented and provides a clear structure for building integrations","blocker":"","evidence":"https://twentyhq-twenty.mintlify.app/developers/api/sdk","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"Podio","website":"podio.com","category":"CRM and Sales","description":"Podio API for Android","auth":["Basic","Token"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":false,"mcp_detail":"","verdict":"yes-today","verdict_reason":"The API is well-documented and provides a clear structure for building applications.","blocker":"","evidence":"https://podio.github.io/podio-android/authentication/","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Zoho CRM","website":"zoho.com/crm","category":"CRM and Sales","description":"Zoho CRM API for customer relationship management","auth":["Token"],"gate":"paid-plan-gated","gating_note":"Requires a paid account to increase API credits","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Zoho CRM MCP servers, including Data Insights and Data Operations","verdict":"yes-with-workarounds","verdict_reason":"Requires generating grant tokens and handling access tokens, but provides a TypeScript SDK for initialization","blocker":"","evidence":"https://www.zoho.com/crm/developer/docs/api2.1/typescript-sdk/v1/initialize.html","cluster":2,"cluster_label":"Gated + Workarounds","corrected":true},{"name":"Close","website":"close.com","category":"CRM and Sales","description":"Close API for sales automation and CRM","auth":["OAuth2","API key"],"gate":"paid-plan-gated","gating_note":"Requires a paid plan to access the API","surface":"REST","breadth":"broad","mcp":false,"mcp_detail":"","verdict":"yes-with-workarounds","verdict_reason":"The API is well-documented, but may require additional setup and configuration to integrate with other systems","blocker":"","evidence":"https://developer.close.com/","cluster":3,"cluster_label":"OAuth Gauntlet","corrected":false},{"name":"Copper","website":"copper.com","category":"CRM and Sales","description":"Copper API for customer relationship management","auth":["OAuth2","API key"],"gate":"paid-plan-gated","gating_note":"API access requires a paid plan","surface":"REST","breadth":"broad","mcp":false,"mcp_detail":"","verdict":"yes-with-workarounds","verdict_reason":"The API has rate limits and requires authentication, but provides a wide range of endpoints for managing customer relationships","blocker":"Rate limits and authentication requirements","evidence":"https://developer.copper.com/account-and-users/fetch-api-user.html","cluster":3,"cluster_label":"OAuth Gauntlet","corrected":false},{"name":"DealCloud","website":"api.docs.dealcloud.com","category":"CRM and Sales","description":"DealCloud API for accessing publications and data updates","auth":["OAuth2"],"gate":"paid-plan-gated","gating_note":"Requires account manager to enable Publications","surface":"REST","breadth":"narrow","mcp":false,"mcp_detail":"","verdict":"yes-with-workarounds","verdict_reason":"Requires custom topic creation and polling","blocker":"","evidence":"https://api.docs.dealcloud.com/docs/publications/getting_started","cluster":4,"cluster_label":"Niche / Hard","corrected":false},{"name":"Zendesk","website":"zendesk.com","category":"Support and Helpdesk","description":"Zendesk API for customer service and support","auth":["Basic","API key","OAuth2"],"gate":"paid-plan-gated","gating_note":"Requires a Zendesk account with API access","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Zendesk API MCP Server","verdict":"yes-with-workarounds","verdict_reason":"The API requires authentication and has rate limits, but provides a comprehensive set of endpoints for building custom applications","blocker":"Authentication and rate limits may require additional setup and handling","evidence":"https://support.zendesk.com/hc/en-us/articles/4408831452954-How-can-I-authenticate-API-requests","cluster":3,"cluster_label":"OAuth Gauntlet","corrected":false},{"name":"Intercom","website":"intercom.com","category":"Support and Helpdesk","description":"Intercom API for building custom applications","auth":["Token"],"gate":"paid-plan-gated","gating_note":"requires Intercom account and developer platform access","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Intercom MCP server at https://mcp.intercom.com/mcp","verdict":"yes-today","verdict_reason":"well-documented API with clear guidelines and tools","blocker":"","evidence":"https://developers.intercom.com/docs/references/rest-api/api.intercom.io.md","cluster":0,"cluster_label":"Paid, but Easy","corrected":true},{"name":"Freshdesk","website":"freshdesk.com","category":"Support and Helpdesk","description":"Freshdesk API for customer support and ticket management","auth":["API key","Basic"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Freshdesk MCP server","verdict":"yes-today","verdict_reason":"The API is well-documented and provides a wide range of endpoints for building custom applications.","blocker":"","evidence":"https://www.freshworks.com/freshdesk/api/users/","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Front","website":"front.com","category":"Support and Helpdesk","description":"Frontapp API and MCP server","auth":["Token"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"mcp.frontapp.com/mcp","verdict":"yes-today","verdict_reason":"The API is well-documented and has a clear structure, making it easy to build integrations.","blocker":"","evidence":"https://dev.frontapp.com/docs/mcp-server","cluster":1,"cluster_label":"Ready Now","corrected":true},{"name":"Pylon","website":"usepylon.com","category":"Support and Helpdesk","description":"Pylon API and MCP server for customer support platform","auth":["Token"],"gate":"paid-plan-gated","gating_note":"Only admin users can create API tokens","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Pylon MCP server for customer support platform","verdict":"yes-with-workarounds","verdict_reason":"The Pylon API is well-documented, but some features may require additional setup or configuration","blocker":"","evidence":"https://docs.airbyte.com/ai-agents/connectors/pylon/AUTH","cluster":2,"cluster_label":"Gated + Workarounds","corrected":false},{"name":"LiveAgent","website":"liveagent.com","category":"Support and Helpdesk","description":"LiveAgent API for customer support ticketing and live chat","auth":["API key","OAuth2"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"LiveAgent MCP server","verdict":"yes-today","verdict_reason":"The API is well-documented and provides a Python client library, making it easy to build integrations.","blocker":"","evidence":"https://github.com/QualityUnit/LiveAgent-api-python/blob/master/README.md","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Plain","website":"plain.com","category":"Support and Helpdesk","description":"Plain.com API for customer cards and PlainPlan API for Terraform plan analysis","auth":["API key","Bearer token"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"narrow","mcp":false,"mcp_detail":"","verdict":"yes-with-workarounds","verdict_reason":"The API documentation is available, but some aspects, such as request signing, may require additional implementation effort.","blocker":"","evidence":"https://www.plain.com/docs/customer-cards/protocol","cluster":4,"cluster_label":"Niche / Hard","corrected":false},{"name":"Help Scout","website":"helpscout.com","category":"Support and Helpdesk","description":"Help Scout API for customer support and documentation","auth":["OAuth2","API key"],"gate":"paid-plan-gated","gating_note":"Restricted Docs requires the Plus or Pro plan","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Help Scout MCP server","verdict":"yes-with-workarounds","verdict_reason":"The API requires OAuth2 authentication and has some restrictions on usage, but it is still possible to build integrations with it","blocker":"Authentication and authorization requirements","evidence":"https://github.com/helpscout/helpscout-api-php-laravel","cluster":3,"cluster_label":"OAuth Gauntlet","corrected":false},{"name":"Gorgias","website":"gorgias.com","category":"Support and Helpdesk","description":"Gorgias API for customer support and helpdesk integration","auth":["API key","Other"],"gate":"paid-plan-gated","gating_note":"Available on all Helpdesk plans, but requires a Gorgias account","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Gorgias Model Context Protocol (MCP) app","verdict":"yes-with-workarounds","verdict_reason":"The API is available, but some features may require additional setup or configuration, such as connecting to an MCP-compatible AI assistant app.","blocker":"","evidence":"https://developers.gorgias.com/reference/introduction","cluster":2,"cluster_label":"Gated + Workarounds","corrected":false},{"name":"Gladly","website":"gladly.com","category":"Support and Helpdesk","description":"Gladly is a radically personal customer service platform","auth":["OAuth2"],"gate":"paid-plan-gated","gating_note":"requires a paid plan to access the API","surface":"REST","breadth":"broad","mcp":false,"mcp_detail":"","verdict":"yes-with-workarounds","verdict_reason":"The API is well-documented, but may require additional setup and configuration","blocker":"none","evidence":"https://help.gladly.com/developer-tutorials/docs/technical-planning/","cluster":3,"cluster_label":"OAuth Gauntlet","corrected":false},{"name":"Slack","website":"slack.com","category":"Communications and Messaging","description":"Slack API for accessing workspace data and functionality","auth":["OAuth2","Token"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"karbassi/slack-mcp","verdict":"yes-with-workarounds","verdict_reason":"While the Slack API is well-documented and provides a wide range of functionality, some features may require additional setup or workarounds to access.","blocker":"","evidence":"https://docs.slack.dev/reference/methods/openid.connect.token","cluster":3,"cluster_label":"OAuth Gauntlet","corrected":false},{"name":"Twilio","website":"twilio.com","category":"Communications and Messaging","description":"Twilio API for authentication and verification","auth":["Basic","API key","Auth Token"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"@twilio-alpha/openapi-mcp-server","verdict":"yes-today","verdict_reason":"Twilio provides a comprehensive API and documentation, making it easy to build and integrate with their services.","blocker":"","evidence":"https://www.twilio.com/docs/iam/api/authtoken","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Zoho Cliq","website":"zoho.com/cliq","category":"Communications and Messaging","description":"Zoho Cliq API for team collaboration and messaging","auth":["OAuth2"],"gate":"paid-plan-gated","gating_note":"Registration required to obtain Client ID and Client Secret","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"mcp.zapier.com","verdict":"yes-today","verdict_reason":"The API provides a comprehensive documentation with clear instructions for registration, authentication, and API usage.","blocker":"","evidence":"https://www.zoho.com/cliq/help/restapi/v3/oascliq/","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"Lark (Larksuite)","website":"open.larksuite.com","category":"Communications and Messaging","description":"Lark OpenAPI for authentication and access tokens","auth":["OAuth2"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Lark OpenAPI MCP","verdict":"yes-today","verdict_reason":"The API provides clear documentation and a straightforward authentication process.","blocker":"","evidence":"https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/authentication-management/access-token/refresh-user-access-token","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Pumble","website":"pumble.com","category":"Communications and Messaging","description":"Pumble API for interacting with Pumble's API documentation","auth":["API key"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Pumble Model Context Protocol (MCP) server","verdict":"yes-today","verdict_reason":"The API is well-documented and provides a wide range of methods for interacting with Pumble.","blocker":"","evidence":"https://pumble.com/help/integrations/automation-workflow-integrations/api-keys-integration/","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Discord","website":"discord.com","category":"Communications and Messaging","description":"Discord API for developers to manage applications and monetization","auth":["OAuth2"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"discord-mcp","verdict":"yes-today","verdict_reason":"The API provides a comprehensive set of endpoints and documentation for building applications.","blocker":"","evidence":"https://docs.discord.com/developers/resources/application","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Telegram","website":"core.telegram.org","category":"Communications and Messaging","description":"Telegram API for building bots","auth":["Token","Bot Token"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"telegram-api-mcp","verdict":"yes-today","verdict_reason":"Well-documented API with available MCP server","blocker":"","evidence":"https://core.telegram.org/bots/api","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"WhatsApp Business","website":"developers.facebook.com/docs/whatsapp","category":"Communications and Messaging","description":"WhatsApp Business Cloud API MCP server with 50+ tools for messaging, templates, media, analytics, flows, and webhooks","auth":["API key"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"tkhattar14/whatsapp-business-mcp","verdict":"yes-today","verdict_reason":"The repository provides a fully functional MCP server with clear instructions for setup and configuration","blocker":"","evidence":"https://github.com/tkhattar14/whatsapp-business-mcp","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Aircall","website":"aircall.io","category":"Communications and Messaging","description":"Aircall API for building business phone experiences","auth":["OAuth2"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"themobilefirstco/aircall-mcp-server","verdict":"yes-with-workarounds","verdict_reason":"While Aircall provides a broad API surface, some features may require workarounds or additional setup, such as using an unofficial MCP server.","blocker":"Limited official support for MCP","evidence":"https://github.com/sumaerjolly/oauth2-aircall","cluster":3,"cluster_label":"OAuth Gauntlet","corrected":false},{"name":"Vonage","website":"developer.vonage.com","category":"Communications and Messaging","description":"Vonage API for communication services","auth":["API key","Token"],"gate":"paid-plan-gated","gating_note":"Requires a developer account, which can be requested through a Vonage Business Communications account representative","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Vonage Documentation MCP Server","verdict":"yes-with-workarounds","verdict_reason":"While Vonage provides a wide range of APIs, the documentation and setup process can be complex and require additional configuration","blocker":"Complex setup and configuration process","evidence":"https://developer.vonage.com/en/documentation","cluster":2,"cluster_label":"Gated + Workarounds","corrected":false},{"name":"Google Ads","website":"developers.google.com/google-ads","category":"Marketing, Ads, Email and Social","description":"Google Ads API for developers","auth":["OAuth2"],"gate":"paid-plan-gated","gating_note":"Access levels determine permissible use and daily operation limits","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Model Context Protocol (MCP) for Google Ads Claude integration","verdict":"yes-with-workarounds","verdict_reason":"While the API is available, access levels and daily operation limits may require workarounds for large-scale implementations","blocker":"Daily operation limits and access level restrictions","evidence":"https://developers.google.com/google-ads/api/docs/client-libs/dotnet/authentication","cluster":3,"cluster_label":"OAuth Gauntlet","corrected":false},{"name":"Meta Ads","website":"developers.facebook.com/docs/marketing-apis","category":"Marketing, Ads, Email and Social","description":"Meta Ads API for managing ad campaigns","auth":["OAuth2"],"gate":"self-serve","gating_note":"","surface":"REST+GraphQL","breadth":"broad","mcp":true,"mcp_detail":"meta-mcp server with 77 tools","verdict":"yes-today","verdict_reason":"The API provides a comprehensive set of tools and documentation, making it possible to build a functional integration today.","blocker":"","evidence":"https://developer.ascend.io/docs/facebook-ads-oauth","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"LinkedIn Ads","website":"learn.microsoft.com/linkedin/marketing","category":"Marketing, Ads, Email and Social","description":"LinkedIn Ads API for managing ad accounts, campaigns, ad sets, and creatives","auth":["OAuth2"],"gate":"paid-plan-gated","gating_note":"Requires approval for Advertising API and additional approval for private APIs","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"mcp-linkedin-ads","verdict":"yes-with-workarounds","verdict_reason":"Requires OAuth credentials and setup, but has a production-grade MCP server available","blocker":"","evidence":"https://learn.microsoft.com/en-us/linkedin/marketing/authentication/lms-generate-an-access-token?view=li-lms-2026-02","cluster":3,"cluster_label":"OAuth Gauntlet","corrected":false},{"name":"GoHighLevel","website":"highlevel.stoplight.io","category":"Marketing, Ads, Email and Social","description":"GoHighLevel API for integrating with the HighLevel platform","auth":["OAuth2","API key","Token"],"gate":"paid-plan-gated","gating_note":"Requires a paid plan to access the API","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"HighLevel MCP server","verdict":"yes-with-workarounds","verdict_reason":"The API is well-documented, but may require additional setup and configuration to integrate with other systems","blocker":"","evidence":"https://github.com/hpriehle/highlevel-api-docs","cluster":3,"cluster_label":"OAuth Gauntlet","corrected":false},{"name":"Mailchimp","website":"mailchimp.com/developer","category":"Marketing, Ads, Email and Social","description":"Mailchimp API for email marketing","auth":["OAuth","API key"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Mailchimp MCP Server","verdict":"yes-today","verdict_reason":"The API is well-documented and has a wide range of endpoints, making it easy to build integrations.","blocker":"","evidence":"https://mailchimp.com/developer/marketing/docs/methods-parameters/","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Klaviyo","website":"developers.klaviyo.com","category":"Marketing, Ads, Email and Social","description":"Klaviyo API for developers","auth":["OAuth2","API key"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Klaviyo MCP server","verdict":"yes-with-workarounds","verdict_reason":"Klaviyo requires OAuth implementation and has specific requirements for app listing and security assessments, which may require additional work.","blocker":"OAuth implementation and security assessments","evidence":"https://developers.klaviyo.com/en/docs/migrate_to_oauth_from_private_key_authentication","cluster":3,"cluster_label":"OAuth Gauntlet","corrected":false},{"name":"systeme.io","website":"systeme.io","category":"Marketing, Ads, Email and Social","description":"Systeme.io API and MCP server","auth":["API key"],"gate":"paid-plan-gated","gating_note":"Requires a valid systeme.io API key","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Systeme.io MCP server for contact management and newsletter management","verdict":"yes-today","verdict_reason":"The API and MCP server provide a comprehensive set of features for building integrations","blocker":"","evidence":"https://rollout.com/integration-guides/systeme.io/sdk/step-by-step-guide-to-building-a-systeme.io-api-integration-in-php","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"Pinterest","website":"developers.pinterest.com","category":"Marketing, Ads, Email and Social","description":"Pinterest API for developers","auth":["OAuth2"],"gate":"trial","gating_note":"Standard API access requires verification and approval","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"pinterest-mcp","verdict":"yes-with-workarounds","verdict_reason":"Requires setting up an app, obtaining credentials, and configuring the MCP server","blocker":"Verification and approval process for Standard API access","evidence":"https://developers.pinterest.com/docs/overview/welcome/","cluster":3,"cluster_label":"OAuth Gauntlet","corrected":false},{"name":"Threads (Meta)","website":"developers.facebook.com/docs/threads","category":"Marketing, Ads, Email and Social","description":"Threads API for developers to build experiences around the platform","auth":["OAuth2","API key"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Threads MCP Server","verdict":"yes-today","verdict_reason":"A reference open source app on GitHub is available for developers to play around with, and a production-ready Model Context Protocol server is provided.","blocker":"","evidence":"https://techcrunch.com/2024/06/18/threads-finally-launches-its-api-for-developers/","cluster":1,"cluster_label":"Ready Now","corrected":true},{"name":"SendGrid","website":"sendgrid.com","category":"Marketing, Ads, Email and Social","description":"SendGrid is a high-scale email platform for transactional and marketing email","auth":["OAuth2","API key","Basic"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"SendGrid MCP server for AI email workflows","verdict":"yes-today","verdict_reason":"SendGrid provides a comprehensive API and MCP server for building custom email workflows","blocker":"","evidence":"https://registry.terraform.io/providers/arslanbekov/sendgrid/2.0.11/docs/resources/webhook_security_policy","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Shopify","website":"shopify.dev","category":"Ecommerce","description":"Shopify API for building custom applications","auth":["OAuth2","Token"],"gate":"self-serve","gating_note":"","surface":"REST+GraphQL","breadth":"broad","mcp":true,"mcp_detail":"aserper/shopify-mcp","verdict":"yes-today","verdict_reason":"Shopify provides a well-documented API and a MCP server for building custom applications.","blocker":"","evidence":"https://shopify.dev/docs/apps/build/authentication-authorization/session-tokens","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"WooCommerce","website":"woocommerce.com/document/woocommerce-rest-api","category":"Ecommerce","description":"WooCommerce REST API and Store API for e-commerce operations","auth":["API key","OAuth2"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"WordPress MCP Adapter","verdict":"yes-with-workarounds","verdict_reason":"The API is well-documented and provides a wide range of endpoints, but some operations may require workarounds due to authentication and permission requirements.","blocker":"Authentication and permission requirements for certain operations","evidence":"https://developer.woocommerce.com/docs/apis/rest-api/v3/api-reference/","cluster":3,"cluster_label":"OAuth Gauntlet","corrected":false},{"name":"BigCommerce","website":"developer.bigcommerce.com","category":"Ecommerce","description":"BigCommerce API for e-commerce platform integration","auth":["API key","Token"],"gate":"self-serve","gating_note":"","surface":"REST+GraphQL","breadth":"broad","mcp":true,"mcp_detail":"BigCommerce MCP Server","verdict":"yes-today","verdict_reason":"The API is well-documented and provides a comprehensive set of endpoints for integration.","blocker":"","evidence":"https://developer-center-bigcommerce-dx.vercel.app/docs/start/authentication/graphql-storefront","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Salesforce Commerce Cloud","website":"developer.salesforce.com/docs/commerce","category":"Ecommerce","description":"Salesforce Commerce Cloud MCP server","auth":["Token"],"gate":"paid-plan-gated","gating_note":"Requires a Salesforce Commerce Cloud account","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Salesforce Commerce Cloud MCP server","verdict":"yes-with-workarounds","verdict_reason":"Requires additional setup and configuration to build an MCP server","blocker":"Requires a Salesforce Commerce Cloud account and additional setup","evidence":"https://developer.salesforce.com/docs/commerce/b2c-commerce/guide/security.html","cluster":2,"cluster_label":"Gated + Workarounds","corrected":true},{"name":"Magento (Adobe Commerce)","website":"developer.adobe.com/commerce","category":"Ecommerce","description":"Magento (Adobe Commerce) integration and API","auth":["OAuth2","Token"],"gate":"self-serve","gating_note":"","surface":"REST+GraphQL","breadth":"broad","mcp":true,"mcp_detail":"MageMCP server","verdict":"yes-today","verdict_reason":"The platform provides a well-documented API and a starter kit for integration, making it easy to build custom integrations.","blocker":"","evidence":"https://developer.adobe.com/commerce/php/module-reference/module-integration","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Squarespace","website":"developers.squarespace.com","category":"Ecommerce","description":"Squarespace Commerce APIs for developers","auth":["OAuth2","API key"],"gate":"paid-plan-gated","gating_note":"Requires a Squarespace Commerce plan to access","surface":"REST","breadth":"broad","mcp":false,"mcp_detail":"","verdict":"yes-with-workarounds","verdict_reason":"The API is well-documented, but may require additional work to integrate with other systems","blocker":"","evidence":"https://commerce-apis.squarespace.com/commerce-apis/website-overview","cluster":3,"cluster_label":"OAuth Gauntlet","corrected":false},{"name":"Ecwid","website":"api-docs.ecwid.com","category":"Ecommerce","description":"Ecwid API for e-commerce platform","auth":["OAuth2","API key","Token"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"openapi-rest-mcp","verdict":"yes-today","verdict_reason":"Ecwid API is well-documented and provides a wide range of endpoints for accessing e-commerce functionality","blocker":"","evidence":"https://docs.ecwid.com/launch-apps/native-and-external-apps/access-store-data-from-the-app","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Gumroad","website":"gumroad.com/api","category":"Ecommerce","description":"Gumroad API for accessing products, sales, and user data","auth":["OAuth2"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Gumroad MCP Server","verdict":"yes-today","verdict_reason":"The API is well-documented and provides a wide range of endpoints for accessing data.","blocker":"","evidence":"https://github.com/antiwork/gumroad/blob/61b39346/app/javascript/pages/Public/Api.tsx","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Amazon Selling Partner","website":"developer-docs.amazon.com/sp-api","category":"Ecommerce","description":"Amazon Selling Partner API for accessing orders, shipments, payments, inventory, and other business information","auth":["OAuth"],"gate":"paid-plan-gated","gating_note":"Usage plans depend on several factors, including the selling partner account and marketplace","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"berrydev-ai/sp-api-mcp-go","verdict":"yes-with-workarounds","verdict_reason":"The API has a rate-limiting algorithm and requires registration and secure authorization, which may require additional development work to implement","blocker":"Rate limiting and authorization requirements","evidence":"https://developer-docs.amazon.com/sp-api/docs/what-is-the-selling-partner-api","cluster":2,"cluster_label":"Gated + Workarounds","corrected":false},{"name":"fanbasis","website":"fanbasis.com","category":"Ecommerce","description":"Fanbasis API for creators to manage payments, subscriptions, and webhooks","auth":["API key"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":false,"mcp_detail":"","verdict":"yes-today","verdict_reason":"The API is well-documented and provides a clear structure for integrating with the service.","blocker":"","evidence":"https://raw.githubusercontent.com/otniel-bit/fbnewapi/main/api-docs.md","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"DataForSEO","website":"docs.dataforseo.com","category":"Data, SEO and Scraping","description":"DataForSEO APIs for SEO and SEM data","auth":["Basic","OAuth"],"gate":"paid-plan-gated","gating_note":"requires a paid plan to access APIs","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"DataForSEO MCP server","verdict":"yes-with-workarounds","verdict_reason":"requires OAuth authentication and has specific connection workflows for different AI solutions","blocker":"OAuth authentication and connection setup","evidence":"https://docs.dataforseo.com/v2/auth/","cluster":2,"cluster_label":"Gated + Workarounds","corrected":false},{"name":"SE Ranking","website":"seranking.com/api","category":"Data, SEO and Scraping","description":"SE Ranking API for website audits and SEO data","auth":["API key"],"gate":"paid-plan-gated","gating_note":"Requires an active SE Ranking account and API key","surface":"REST","breadth":"broad","mcp":false,"mcp_detail":"","verdict":"yes-today","verdict_reason":"The API is well-documented and provides a clear structure for building applications.","blocker":"","evidence":"https://seranking.com/api/data/website-audit/","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"Ahrefs","website":"ahrefs.com/api","category":"Data, SEO and Scraping","description":"Ahrefs API for SEO and keyword research","auth":["OAuth2","API key"],"gate":"paid-plan-gated","gating_note":"Ahrefs Connect is available on Ahrefs paid plans (Lite, Standard, Advanced, and Enterprise)","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Ahrefs Official MCP Server","verdict":"yes-today","verdict_reason":"Ahrefs provides a comprehensive API documentation and an official MCP server for seamless integration","blocker":"","evidence":"https://docs.ahrefs.com/en/ahrefs-connect/docs/how-to-manage","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"MrScraper","website":"docs.mrscraper.com","category":"Data, SEO and Scraping","description":"MrScraper API for web scraping and data extraction","auth":["API key"],"gate":"paid-plan-gated","gating_note":"Requires activation of AI Scraper API Access and a valid API token","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"MrScraper API/MCP","verdict":"yes-today","verdict_reason":"Well-documented API with clear instructions and examples","blocker":"","evidence":"https://docs.mrscraper.com/docs/api/error-handling","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"Apify","website":"docs.apify.com","category":"Data, SEO and Scraping","description":"Apify platform for web scraping and automation","auth":["OAuth2","API key","Token"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Apify MCP server","verdict":"yes-today","verdict_reason":"The platform provides a wide range of tools and features for building and integrating Actors.","blocker":"","evidence":"https://docs.apify.com/platform/integrations/mcp-connectors","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Firecrawl","website":"firecrawl.dev","category":"Data, SEO and Scraping","description":"Firecrawl is a web scraping and crawling platform","auth":["API key"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Firecrawl MCP Server","verdict":"yes-today","verdict_reason":"The API is well-documented and provides a Python SDK for easy integration","blocker":"","evidence":"https://docs.firecrawl.dev/sdks/python","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Bright Data","website":"brightdata.com","category":"Data, SEO and Scraping","description":"Bright Data provides a web scraping API for automated data collection","auth":["Token","Other"],"gate":"paid-plan-gated","gating_note":"Requires a paid plan to access the API","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Docs MCP server at https://docs.brightdata.com/mcp","verdict":"yes-today","verdict_reason":"The API provides clear documentation and a straightforward authentication process","blocker":"","evidence":"https://docs.brightdata.com/api-reference/rest-api/scraper/asynchronous-requests","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"Sherlock","website":"github.com/sherlock-project/sherlock","category":"Data, SEO and Scraping","description":"Sherlock API for simulation and analysis","auth":["Other"],"gate":"paid-plan-gated","gating_note":"Requires Ansys software installation and license","surface":"gRPC","breadth":"broad","mcp":false,"mcp_detail":"","verdict":"yes-with-workarounds","verdict_reason":"The API requires programming experience and familiarity with gRPC, but provides a wealth of information to get started.","blocker":"gRPC expertise required","evidence":"https://developer.ansys.com/docs/sherlock-apis-2025-r1/sherlock-reference.md","cluster":2,"cluster_label":"Gated + Workarounds","corrected":false},{"name":"Waterfall.io","website":"waterfall.io","category":"Data, SEO and Scraping","description":"Waterfall.io provides API keys management and error handling for API calls","auth":["API key"],"gate":"paid-plan-gated","gating_note":"API key management is an enterprise feature, contact account manager to get access","surface":"REST","breadth":"narrow","mcp":false,"mcp_detail":"","verdict":"yes-with-workarounds","verdict_reason":"Waterfall.io has a specific set of API endpoints, but may require additional setup for API key management","blocker":"Enterprise feature requirement","evidence":"https://docs.waterfall.io/v1/errors","cluster":4,"cluster_label":"Niche / Hard","corrected":false},{"name":"Clay","website":"clay.com","category":"Data, SEO and Scraping","description":"Clay.com provides AI and API services for customer relationship management and workflow automation","auth":["OAuth2","Client Credentials"],"gate":"paid-plan-gated","gating_note":"Some features require a paid plan, and pricing is based on AI model usage","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Model Context Protocol (MCP) server for connecting to external tools and data sources","verdict":"yes-today","verdict_reason":"The MCP server can be installed and configured using the provided plugin and documentation","blocker":"","evidence":"https://university.clay.com/docs/salesforce-integration-overview","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"GitHub","website":"docs.github.com/rest","category":"Developer, Infra and Data platforms","description":"GitHub API for creating and managing GitHub Apps, as well as upgrading plans and accessing MCP servers","auth":["OAuth2","Token"],"gate":"paid-plan-gated","gating_note":"Some features require a paid plan, such as GitHub Pro or GitHub Team","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"GitHub Remote MCP Server","verdict":"yes-with-workarounds","verdict_reason":"While the API is well-documented, some features may require additional setup or configuration, such as OAuth authentication or MCP server integration","blocker":"OAuth authentication and MCP server integration may require additional development effort","evidence":"https://docs.github.com/en/apps/creating-github-apps/about-creating-github-apps/migrating-oauth-apps-to-github-apps","cluster":2,"cluster_label":"Gated + Workarounds","corrected":false},{"name":"Vercel","website":"vercel.com/docs/rest-api","category":"Developer, Infra and Data platforms","description":"Vercel API for authentication, pricing, and Model Context Protocol","auth":["Token","Other"],"gate":"paid-plan-gated","gating_note":"Requires Vercel team account and AI Gateway Credits for paid tier","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Vercel's MCP server","verdict":"yes-today","verdict_reason":"The API provides clear documentation and examples for implementing authentication and Model Context Protocol","blocker":"","evidence":"https://vercel.com/docs/connect/concepts/authentication","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"Netlify","website":"docs.netlify.com/api","category":"Developer, Infra and Data platforms","description":"Netlify API and MCP documentation","auth":["OAuth2"],"gate":"paid-plan-gated","gating_note":"Credit-based plans are used for new accounts, and Legacy plans are only available for existing accounts","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Netlify MCP server","verdict":"yes-today","verdict_reason":"The documentation provides a deploy button to spin up a new Netlify site with a serverless MCP","blocker":"","evidence":"https://developers.netlify.com/sdk/oauth/overview/","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"Cloudflare","website":"developers.cloudflare.com/api","category":"Developer, Infra and Data platforms","description":"Cloudflare API for developers","auth":["Token","OAuth2"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"openApiMcpServer","verdict":"yes-with-workarounds","verdict_reason":"The API is well-documented, but some features may require additional setup or configuration, such as setting up authentication or using specific libraries.","blocker":"","evidence":"https://developers.cloudflare.com/api/","cluster":3,"cluster_label":"OAuth Gauntlet","corrected":false},{"name":"Supabase","website":"supabase.com/docs","category":"Developer, Infra and Data platforms","description":"Supabase integration and authentication platform","auth":["OAuth2"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Model Context Protocol (MCP) server for AI agent authentication","verdict":"yes-today","verdict_reason":"Supabase provides detailed documentation and guides for integrating and building custom applications.","blocker":"","evidence":"https://supabase.com/docs/guides/integrations/partner-integration-guide","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Neo4j","website":"neo4j.com/docs/api","category":"Developer, Infra and Data platforms","description":"Neo4j API","auth":["OAuth2","Basic","Token"],"gate":"paid-plan-gated","gating_note":"Free instance available, but additional instances require upgrade to paid plan","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Neo4j MCP Server","verdict":"yes-today","verdict_reason":"Neo4j provides a well-documented API and MCP server implementation","blocker":"","evidence":"https://medium.com/@jongiffard/token-based-auth-with-neo4j-query-api-for-applications-b1ac65c215a9","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"Snowflake","website":"docs.snowflake.com","category":"Developer, Infra and Data platforms","description":"Snowflake API for authentication, development, and MCP connectors","auth":["OAuth2"],"gate":"paid-plan-gated","gating_note":"Requires a Snowflake account and OAuth credentials","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"MCP connectors for Snowflake CoWork and Cortex Agents","verdict":"yes-today","verdict_reason":"Snowflake provides APIs and documentation for building custom applications and integrations","blocker":"","evidence":"https://docs.snowflake.com/en/en/sql-reference/sql/create-security-integration-api-auth","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"MongoDB Atlas","website":"mongodb.com/docs/atlas/api","category":"Developer, Infra and Data platforms","description":"The MongoDB Atlas Administration API allows developers to manage all components in MongoDB Atlas.","auth":["OAuth2","API key"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"mcp-mongodb-atlas","verdict":"yes-today","verdict_reason":"The API is well-documented and has a wide range of endpoints for managing MongoDB Atlas components.","blocker":"","evidence":"https://www.mongodb.com/docs/api/doc/atlas-admin-api-v2/2024-05-30/","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Datadog","website":"docs.datadoghq.com/api","category":"Developer, Infra and Data platforms","description":"Datadog API for accessing observability data","auth":["API key","Token"],"gate":"paid-plan-gated","gating_note":"requires a Datadog user account with the user_app_keys permission","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Datadog MCP Server","verdict":"yes-today","verdict_reason":"The API is well-documented and provides client libraries for several programming languages.","blocker":"","evidence":"https://docs.datadoghq.com/account_management/personal-access-tokens.md","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"Sentry","website":"docs.sentry.io/api","category":"Developer, Infra and Data platforms","description":"Sentry API for error tracking and monitoring","auth":["Token","API key"],"gate":"paid-plan-gated","gating_note":"Requires a Sentry account and a paid plan for full access","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"MCP server for Python","verdict":"yes-today","verdict_reason":"The API is well-documented and provides a clear structure for building integrations","blocker":"","evidence":"https://getsentry-sentry.mintlify.app/api/authentication","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"Notion","website":"developers.notion.com","category":"Productivity and Project Management","description":"Notion API for developers","auth":["API key","OAuth2"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Notion MCP server at https://mcp.notion.com/mcp","verdict":"yes-today","verdict_reason":"The API is well-documented and provides a clear guide for getting started, including code examples and a quickstart tutorial.","blocker":"","evidence":"https://developers.notion.com/guides/get-started/quick-start","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Airtable","website":"airtable.com/developers","category":"Productivity and Project Management","description":"Airtable API for integrating with Airtable services","auth":["OAuth2"],"gate":"paid-plan-gated","gating_note":"Requires a paid plan to access full API functionality","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Airtable MCP server","verdict":"yes-with-workarounds","verdict_reason":"While the API is available, some features may require additional setup or workarounds to access.","blocker":"Limited access to API functionality on free plans","evidence":"https://support.airtable.com/docs/third-party-integrations-via-oauth-overview","cluster":3,"cluster_label":"OAuth Gauntlet","corrected":false},{"name":"Linear","website":"developers.linear.app","category":"Productivity and Project Management","description":"Linear API for developers","auth":["OAuth2","API key"],"gate":"self-serve","gating_note":"","surface":"GraphQL","breadth":"broad","mcp":true,"mcp_detail":"MCP server at https://mcp.linear.app/mcp","verdict":"yes-today","verdict_reason":"The API is well-documented and provides a clear guide for authentication and usage.","blocker":"","evidence":"https://github.com/nshkrdotcom/linear_sdk/blob/master/guides/oauth-and-token-management.md","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Jira","website":"developer.atlassian.com","category":"Productivity and Project Management","description":"Jira Cloud platform API for customizing and integrating with Jira products","auth":["OAuth2","Basic"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"JiraMCP server","verdict":"yes-today","verdict_reason":"The API is well-documented and provides a wide range of endpoints for customizing and integrating with Jira products.","blocker":"","evidence":"https://developer.atlassian.com/cloud/jira/platform/index/","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Asana","website":"developers.asana.com","category":"Productivity and Project Management","description":"Asana API for accessing and managing workspace data","auth":["OAuth2","Token"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Asana's MCP Server","verdict":"yes-today","verdict_reason":"The API is well-documented and provides a clear guide for getting started, including setup and authentication.","blocker":"","evidence":"https://developers.asana.com/docs/quick-start","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Monday.com","website":"developer.monday.com","category":"Productivity and Project Management","description":"monday.com API for building custom applications","auth":["OAuth2","API key","Token"],"gate":"self-serve","gating_note":"","surface":"GraphQL","breadth":"broad","mcp":true,"mcp_detail":"monday-api-mcp","verdict":"yes-today","verdict_reason":"The API is well-documented and provides a clear guide for building custom applications.","blocker":"","evidence":"https://developer.monday.com/api-reference/docs/getting-started","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"ClickUp","website":"clickup.com/api","category":"Productivity and Project Management","description":"ClickUp API for task and project management","auth":["Token"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"ClickUp MCP Server","verdict":"yes-today","verdict_reason":"The API is well-documented and has a wide range of endpoints, making it easy to build integrations.","blocker":"","evidence":"https://developer.clickup.com/docs/common_errors","cluster":1,"cluster_label":"Ready Now","corrected":true},{"name":"Coda","website":"coda.io/developers","category":"Productivity and Project Management","description":"Coda API for building custom integrations and automations","auth":["OAuth2","API key","Basic","Token"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"mcp-coda","verdict":"yes-today","verdict_reason":"The API is well-documented and provides a wide range of endpoints for building custom integrations and automations.","blocker":"","evidence":"https://coda.io/developers/apis/v1","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Smartsheet","website":"smartsheet.com/developers","category":"Productivity and Project Management","description":"Smartsheet API for building custom applications","auth":["OAuth2"],"gate":"paid-plan-gated","gating_note":"Requires Business or Enterprise plan","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Smartsheet Model Context Protocol (MCP) server","verdict":"yes-today","verdict_reason":"The API provides a comprehensive set of endpoints and documentation, making it possible to build custom applications today.","blocker":"","evidence":"https://developers.smartsheet.com/api/smartsheet/openapi/schemas/accesstoken_authorize","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"Harvest","website":"help.getharvest.com/api-v2","category":"Productivity and Project Management","description":"Harvest API for time tracking and project management","auth":["OAuth2","Personal Access Tokens"],"gate":"paid-plan-gated","gating_note":"requires an active Harvest account","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"https://api.harvestapp.com/mcp","verdict":"yes-today","verdict_reason":"well-documented API with clear guidelines for implementation","blocker":"","evidence":"https://help.getharvest.com/api-v2/introduction/overview/general/","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"Stripe","website":"stripe.com/docs/api","category":"Finance and Fintech","description":"Stripe API for online payment processing","auth":["OAuth2","API key","Basic"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Stripe Model Context Protocol (MCP) server","verdict":"yes-today","verdict_reason":"Stripe provides a well-documented API with a wide range of features and a simple authentication process.","blocker":"","evidence":"https://docs.stripe.com/connect/authentication.md","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Plaid","website":"plaid.com/docs","category":"Finance and Fintech","description":"Plaid API for financial data access","auth":["API key","Token"],"gate":"paid-plan-gated","gating_note":"Requires creation of an account on the Plaid Dashboard and acknowledgement of terms","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Plaid's official MCP server","verdict":"yes-with-workarounds","verdict_reason":"Requires management of underlying Plaid Link authentication state and strict per-item API rate limits","blocker":"Complex multi-step OAuth flows and massive JSON payloads","evidence":"https://plaid.com/docs/api/index.html.md","cluster":2,"cluster_label":"Gated + Workarounds","corrected":false},{"name":"Binance","website":"binance-docs.github.io","category":"Finance and Fintech","description":"Binance Spot API and Streams","auth":["API key","HMAC-SHA256"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Binance MCP Server","verdict":"yes-with-workarounds","verdict_reason":"The API is well-documented, but some features may require additional setup or configuration.","blocker":"","evidence":"https://github.com/binance/binance-official-api-docs","cluster":3,"cluster_label":"OAuth Gauntlet","corrected":false},{"name":"Paygent Connect","website":"paygent","category":"Finance and Fintech","description":"Paygent Connect API for building and scaling monetization infrastructure","auth":["API key"],"gate":"paid-plan-gated","gating_note":"Requires a paid plan to access the API","surface":"REST","breadth":"broad","mcp":false,"mcp_detail":"","verdict":"yes-today","verdict_reason":"The API provides a clear and comprehensive documentation with OpenAPI specification, making it easy to build and integrate with the platform.","blocker":"","evidence":"https://docs.paygentic.io/api-reference/sources/create","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"iPayX","website":"ipayx.ai/docs","category":"Finance and Fintech","description":"iPayX is an online payment processing platform with various APIs for transaction processing, customer profiles, and more","auth":["OAuth2","API key","Basic"],"gate":"paid-plan-gated","gating_note":"requires setup and configuration through the IXOPAY platform","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"OpenAPI MCP Server","verdict":"yes-with-workarounds","verdict_reason":"requires setup and configuration through the IXOPAY platform and may need additional development for custom implementations","blocker":"setup and configuration requirements","evidence":"https://documentation.ixopay.com/api","cluster":3,"cluster_label":"OAuth Gauntlet","corrected":false},{"name":"QuickBooks","website":"developer.intuit.com","category":"Finance and Fintech","description":"QuickBooks Online API for accounting and payments","auth":["OAuth2"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"QuickBooks Online MCP Server","verdict":"yes-today","verdict_reason":"The API provides a clear documentation and a developer portal with tools and resources to build and integrate applications.","blocker":"","evidence":"https://developer.intuit.com/app/developer/qbo/docs/get-started/start-developing-your-app","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Xero","website":"developer.xero.com","category":"Finance and Fintech","description":"Xero API for accounting and business management","auth":["OAuth2"],"gate":"paid-plan-gated","gating_note":"Custom Connections require a paid subscription","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Xero MCP Server","verdict":"yes-with-workarounds","verdict_reason":"The API requires a paid subscription and has specific requirements for authentication and authorization","blocker":"Paid subscription requirement","evidence":"https://github.com/XeroAPI/xero-python","cluster":3,"cluster_label":"OAuth Gauntlet","corrected":false},{"name":"Brex","website":"developer.brex.com","category":"Finance and Fintech","description":"Brex API for managing users, departments, locations, and cards","auth":["OAuth2"],"gate":"paid-plan-gated","gating_note":"Requires a Brex admin to grant access and only users with the account admin role can be authenticated","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"MCP server for integrating Brex with accounting software","verdict":"yes-with-workarounds","verdict_reason":"The API requires managing OAuth token lifecycles, paginating transactions, and mapping flat spend data into balanced double-entry journal entries, which can be complex","blocker":"Rate limits and strict OAuth token management","evidence":"https://developer.brex.com/openapi/team_api","cluster":3,"cluster_label":"OAuth Gauntlet","corrected":false},{"name":"Ramp","website":"docs.ramp.com","category":"Finance and Fintech","description":"Ramp API for automating workflows and integrating with AI assistants","auth":["Other"],"gate":"paid-plan-gated","gating_note":"requires a Ramp account and potentially additional access for AI agents","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Model Context Protocol (MCP) server for AI assistants","verdict":"yes-today","verdict_reason":"provides clear guides and APIs for automation and integration","blocker":"","evidence":"https://docs.ramp.com/developer-api/v1/mcp","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"PitchBook","website":"pitchbook.com","category":"Finance and Fintech","description":"PitchBook API for accessing private and public market data","auth":["API key"],"gate":"paid-plan-gated","gating_note":"Requires a PitchBook account and API key","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Pitch MCP Server","verdict":"yes-today","verdict_reason":"Well-documented API with available SDKs and code examples","blocker":"","evidence":"https://coldiq.com/apis/pitchbook-api","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"NotebookLM","website":"cloud.google.com/gemini","category":"AI, Research and Media-native","description":"NotebookLM API for interacting with notebooks and sources","auth":["Token"],"gate":"paid-plan-gated","gating_note":"Requires Google Cloud project and authentication token","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"NotebookLM MCP server","verdict":"yes-with-workarounds","verdict_reason":"The API is well-documented, but may require additional setup and configuration for authentication and authorization","blocker":"Authentication and authorization requirements","evidence":"https://k-dash.github.io/nblm-rs/python/api-reference/","cluster":2,"cluster_label":"Gated + Workarounds","corrected":false},{"name":"Otter AI","website":"help.otter.ai","category":"AI, Research and Media-native","description":"Otter AI Public API for accessing channels, conversations, transcripts, audio, action items, insights, outlines, and workspace details","auth":["OAuth2","API key"],"gate":"paid-plan-gated","gating_note":"Available for Enterprise workspaces only","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"OtterlyAI MCP server","verdict":"yes-today","verdict_reason":"The API is well-documented and provides a clear authentication mechanism, making it easy to build integrations","blocker":"","evidence":"https://developer-guides.tryotter.com/api-reference/","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"Fathom","website":"fathom.video","category":"AI, Research and Media-native","description":"Fathom API for meeting data","auth":["OAuth2","API key"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"MCP server URL: https://api.fathom.ai/mcp","verdict":"yes-today","verdict_reason":"The API provides clear documentation and SDKs for easy integration.","blocker":"","evidence":"https://developers.fathom.ai/sdks/breaking-changes/python-changes","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"Consensus","website":"consensus.app","category":"AI, Research and Media-native","description":"Consensus API - AI research platform for scientific literature","auth":["API key"],"gate":"paid-plan-gated","gating_note":"Free plan available, paid plans start at $9/mo","surface":"REST","breadth":"narrow","mcp":false,"mcp_detail":"","verdict":"yes-with-workarounds","verdict_reason":"The API is relatively simple, but may require additional development to integrate with other tools","blocker":"Limited documentation and potential issues with scalability","evidence":"https://agentsapis.com/consensus-api/","cluster":4,"cluster_label":"Niche / Hard","corrected":false},{"name":"Reducto","website":"reducto.ai","category":"AI, Research and Media-native","description":"Reducto AI document processing platform","auth":["API key"],"gate":"paid-plan-gated","gating_note":"Requires API key from Reducto Studio","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"MCP server available for integration","verdict":"yes-today","verdict_reason":"Provides clear API documentation and SDKs for integration","blocker":"","evidence":"https://docs.reducto.ai/cli","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"Devin","website":"docs.devin.ai","category":"AI, Research and Media-native","description":"Devin API for session management, knowledge, and more","auth":["API key","Token"],"gate":"paid-plan-gated","gating_note":"Requires a paid plan to access the API","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Devin MCP server","verdict":"yes-with-workarounds","verdict_reason":"The API is well-documented, but some endpoints may require additional setup or configuration","blocker":"","evidence":"https://docs.devin.ai/api-reference/getting-started/migration-guide","cluster":2,"cluster_label":"Gated + Workarounds","corrected":false},{"name":"higgsfield","website":"higgsfield.ai/cli","category":"AI, Research and Media-native","description":"Higgsfield API for accessing multi-service APIs","auth":["Token","OAuth2"],"gate":"paid-plan-gated","gating_note":"Pricing rides existing Higgsfield plan credits","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"Higgsfield MCP server at https://mcp.higgsfield.ai/mcp","verdict":"yes-today","verdict_reason":"The API client is available on npm and provides a straightforward way to access Higgsfield's APIs","blocker":"","evidence":"https://github.com/anthonyjohn17/higgsfield-api-client","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"Mermaid CLI","website":"github.com/mermaid-js/mermaid-cli","category":"AI, Research and Media-native","description":"Mermaid CLI for validating and rendering Mermaid diagrams","auth":["Other"],"gate":"self-serve","gating_note":"","surface":"none found","breadth":"unknown","mcp":true,"mcp_detail":"MCP Server: Mermaid Validator","verdict":"yes-today","verdict_reason":"Mermaid CLI is available and can be used to validate and render Mermaid diagrams","blocker":"","evidence":"https://github.com/rtuin/mcp-mermaid-validator","cluster":1,"cluster_label":"Ready Now","corrected":false},{"name":"YouTube Transcript","website":"transcriptapi.com","category":"AI, Research and Media-native","description":"YouTube Transcript API for retrieving transcripts and channel data from YouTube videos","auth":["API key","OAuth2"],"gate":"paid-plan-gated","gating_note":"Requires a paid plan to access the API","surface":"REST","breadth":"broad","mcp":true,"mcp_detail":"MCP server available at https://transcriptapi.com/mcp","verdict":"yes-today","verdict_reason":"The API provides clear documentation and supports multiple authentication methods","blocker":"","evidence":"https://scority.ai/docs/authentication","cluster":0,"cluster_label":"Paid, but Easy","corrected":false},{"name":"Grain","website":"grain.com","category":"AI, Research and Media-native","description":"Grain API for data synchronization and FX hedging","auth":["OAuth2"],"gate":"self-serve","gating_note":"","surface":"REST","breadth":"broad","mcp":false,"mcp_detail":"","verdict":"yes-with-workarounds","verdict_reason":"The API can be wrapped as an MCP server with some additional work","blocker":"No native MCP support","evidence":"https://docs.runmorph.dev/connectors/grain","cluster":3,"cluster_label":"OAuth Gauntlet","corrected":false}]</script> |
| <script> |
| function __mainInit(){ |
| var APPS = JSON.parse(document.getElementById('app-data').textContent); |
| |
| var COLORS = { teal:'#4FD1C5', sky:'#38BDF8', amber:'#F2B84B', orange:'#F0974D', coral:'#F2665E', line:'#232A38', dim:'#9BA3B4' }; |
| |
| Chart.defaults.color = '#9BA3B4'; |
| Chart.defaults.font.family = "'IBM Plex Mono', monospace"; |
| Chart.defaults.font.size = 12; |
| Chart.defaults.borderColor = '#232A38'; |
| |
| |
| var CLUSTERS = [ |
| { id:1, label:'Ready Now', desc:'Self-serve + buildable today, no workaround', count:36, color:COLORS.teal }, |
| { id:0, label:'Paid, but Easy', desc:'Needs a paid account, then trivial to build', count:26, color:COLORS.sky }, |
| { id:3, label:'OAuth Gauntlet', desc:'Buildable, but the OAuth flow is real work', count:22, color:COLORS.amber }, |
| { id:2, label:'Gated + Workarounds', desc:'Paid/approval gate AND an engineering workaround', count:12, color:COLORS.orange }, |
| { id:4, label:'Niche / Hard', desc:'Narrow API, no MCP, needs outreach first', count:4, color:COLORS.coral } |
| ]; |
| var CLUSTER_APPS = { |
| 1: ['Attio','Podio','Freshdesk','Front','LiveAgent','Twilio','Lark (Larksuite)','Pumble','Discord','Telegram','WhatsApp Business','Meta Ads','Mailchimp','Threads (Meta)','SendGrid','Shopify','BigCommerce','Magento (Adobe Commerce)','Ecwid','Gumroad','fanbasis','Apify','Firecrawl','Supabase','MongoDB Atlas','Notion','Linear','Jira','Asana','Monday.com','ClickUp','Coda','Stripe','QuickBooks','Fathom','Mermaid CLI'], |
| 0: ['Salesforce','Pipedrive','Twenty','Intercom','Zoho Cliq','systeme.io','SE Ranking','Ahrefs','MrScraper','Bright Data','Clay','Vercel','Netlify','Neo4j','Snowflake','Datadog','Sentry','Smartsheet','Harvest','Paygent Connect','Ramp','PitchBook','Otter AI','Reducto','higgsfield','YouTube Transcript'], |
| 3: ['HubSpot','Close','Copper','Zendesk','Help Scout','Gladly','Slack','Aircall','Google Ads','LinkedIn Ads','GoHighLevel','Klaviyo','Pinterest','WooCommerce','Squarespace','Cloudflare','Airtable','Binance','iPayX','Xero','Brex','Grain'], |
| 2: ['Zoho CRM','Pylon','Gorgias','Vonage','Salesforce Commerce Cloud','Amazon Selling Partner','DataForSEO','Sherlock','GitHub','Plaid','NotebookLM','Devin'], |
| 4: ['DealCloud','Plain','Waterfall.io','Consensus'] |
| }; |
| var CLUSTER_RECO = { |
| 1: 'Build these first. No sales call, no OAuth review — sign up and ship.', |
| 0: 'Get one paid/dev account per vendor, then build immediately — the technical lift is trivial once you\'re in.', |
| 3: 'Budget an extra 1–2 days per app for OAuth app registration and review; that cycle is the real cost here, not the API surface.', |
| 2: 'Needs a partnership ask AND workaround engineering — start the outreach first, since it\'s usually the longer pole.', |
| 4: 'Don\'t build yet. Talk to the vendor: 3 of 4 need an enterprise/account-manager contact just to get API access at all.' |
| }; |
| |
| var maxCount = Math.max.apply(null, CLUSTERS.map(function(c){return c.count;})); |
| var ladder = document.getElementById('ladder'); |
| CLUSTERS.forEach(function(c){ |
| var pct = Math.round((c.count / maxCount) * 100); |
| var rung = document.createElement('div'); |
| rung.className = 'rung'; |
| rung.innerHTML = |
| '<div class="tier">'+c.label+'<span class="n">'+c.desc+'</span></div>'+ |
| '<div class="bar-track"><div class="bar-fill" style="width:'+pct+'%; background:'+c.color+';"></div></div>'+ |
| '<div class="count">'+c.count+' apps</div>'; |
| ladder.appendChild(rung); |
| }); |
| |
| |
| var catCards = document.getElementById('catCards'); |
| var byCat = {}; |
| APPS.forEach(function(a){ |
| if(!byCat[a.category]) byCat[a.category] = []; |
| byCat[a.category].push(a); |
| }); |
| var CAT_ORDER = ['CRM and Sales','Support and Helpdesk','Communications and Messaging','Marketing, Ads, Email and Social','Ecommerce','Data, SEO and Scraping','Developer, Infra and Data platforms','Productivity and Project Management','Finance and Fintech','AI, Research and Media-native']; |
| CAT_ORDER.forEach(function(cat){ |
| var apps = byCat[cat] || []; |
| var n = apps.length; |
| if(!n) return; |
| var selfServe = apps.filter(function(a){return a.gate==='self-serve';}).length; |
| var gated = apps.filter(function(a){return a.gate==='paid-plan-gated';}).length; |
| var trial = apps.filter(function(a){return a.gate==='trial';}).length; |
| var mcpCount = apps.filter(function(a){return a.mcp;}).length; |
| var today = apps.filter(function(a){return a.verdict==='yes-today';}).length; |
| var authCounts = {}; |
| apps.forEach(function(a){ (a.auth||[]).forEach(function(m){ authCounts[m]=(authCounts[m]||0)+1; }); }); |
| var topAuth = Object.keys(authCounts).sort(function(x,y){return authCounts[y]-authCounts[x];})[0] || '—'; |
| var blockers = apps.map(function(a){return a.blocker;}).filter(function(b){return b && b.toLowerCase()!=='none';}); |
| var blockerNote = blockers.length ? blockers[0] : 'no recurring technical blocker in this category'; |
| var card = document.createElement('div'); |
| card.className = 'catcard'; |
| card.innerHTML = |
| '<div class="chead"><h3>'+cat+'</h3><span class="ccount">'+n+' apps</span></div>'+ |
| '<div class="splitbar">'+ |
| (selfServe ? '<span style="width:'+(selfServe/n*100)+'%; background:'+COLORS.teal+';"></span>' : '')+ |
| (gated ? '<span style="width:'+(gated/n*100)+'%; background:'+COLORS.coral+';"></span>' : '')+ |
| (trial ? '<span style="width:'+(trial/n*100)+'%; background:'+COLORS.amber+';"></span>' : '')+ |
| '</div>'+ |
| '<div class="metarow">'+ |
| '<span class="m">Self-serve <b>'+selfServe+'/'+n+'</b></span>'+ |
| '<span class="m">Top auth <b>'+topAuth+'</b></span>'+ |
| '<span class="m">Has MCP <b>'+mcpCount+'/'+n+'</b></span>'+ |
| '<span class="m">Buildable today <b>'+today+'/'+n+'</b></span>'+ |
| '</div>'+ |
| '<p><strong>Most common friction:</strong> '+blockerNote+'</p>'; |
| catCards.appendChild(card); |
| }); |
| |
| |
| var clusterCards = document.getElementById('clusterCards'); |
| CLUSTERS.forEach(function(c){ |
| var card = document.createElement('div'); |
| card.className = 'cluster-card'; |
| var apps = CLUSTER_APPS[c.id]; |
| var shown = apps.slice(0,10).join(', '); |
| var more = apps.length > 10 ? ' + '+(apps.length-10)+' more' : ''; |
| card.innerHTML = |
| '<div class="ch-head">'+ |
| '<span class="badge" style="background:'+c.color+'22; color:'+c.color+';">CLUSTER '+(CLUSTERS.indexOf(c)+1)+' / 5</span>'+ |
| '<div class="n">'+c.count+'<span>apps · '+c.desc+'</span></div>'+ |
| '</div>'+ |
| '<div>'+ |
| '<h3 style="color:'+c.color+';">'+c.label+'</h3>'+ |
| '<p class="apps"><b>Includes:</b> '+shown+more+'</p>'+ |
| '<div class="reco" style="border-left-color:'+c.color+';">'+CLUSTER_RECO[c.id]+'</div>'+ |
| '</div>'; |
| clusterCards.appendChild(card); |
| }); |
| |
| |
| var ERRORED = { |
| 'CRM and Sales': [ ['HubSpot',''], ['Zoho CRM',''], ['Close',''], ['Copper','Rate limits and authentication requirements'], ['DealCloud',''] ], |
| 'Support and Helpdesk': [ ['Zendesk','Authentication and rate limits may require additional setup and handling'], ['Pylon',''], ['Help Scout','Authentication and authorization requirements'], ['Gorgias',''], ['Gladly',''] ], |
| 'Communications and Messaging': [ ['Aircall','Limited official support for MCP'], ['Vonage','Complex setup and configuration process'] ], |
| 'Marketing, Ads, Email and Social': [ ['Google Ads','Daily operation limits and access level restrictions'], ['LinkedIn Ads',''], ['GoHighLevel',''], ['Klaviyo','OAuth implementation and security assessments'], ['Pinterest','Verification and approval process for Standard API access'] ], |
| 'Ecommerce': [ ['WooCommerce','Authentication and permission requirements for certain operations'], ['Salesforce Commerce Cloud','Requires a Salesforce Commerce Cloud account and additional setup'], ['Squarespace',''], ['Amazon Selling Partner','Rate limiting and authorization requirements'] ], |
| 'Data, SEO and Scraping': [ ['DataForSEO','OAuth authentication and connection setup'], ['Sherlock','gRPC expertise required'], ['Waterfall.io','Enterprise feature requirement'] ], |
| 'Developer, Infra and Data platforms': [ ['GitHub','OAuth authentication and MCP server integration may require additional development effort'], ['Cloudflare',''] ], |
| 'Productivity and Project Management': [ ['Airtable','Limited access to API functionality on free plans'] ], |
| 'Finance and Fintech': [ ['Plaid','Complex multi-step OAuth flows and massive JSON payloads'], ['iPayX','Setup and configuration requirements'], ['Xero','Paid subscription requirement'], ['Brex','Rate limits and strict OAuth token management'] ], |
| 'AI, Research and Media-native': [ ['NotebookLM','Authentication and authorization requirements'], ['Consensus','Limited documentation and potential issues with scalability'], ['Devin',''], ['Grain','No native MCP support'] ] |
| }; |
| var errGrid = document.getElementById('errGrid'); |
| Object.keys(ERRORED).forEach(function(cat){ |
| var col = document.createElement('div'); |
| col.className = 'err-cat'; |
| var itemsHtml = ERRORED[cat].map(function(pair){ |
| var why = pair[1] ? pair[1] : 'No blocker found — scrape failed, research still succeeded via fallback'; |
| var cls = pair[1] ? '' : 'none'; |
| return '<div class="err-item"><span class="app">'+pair[0]+'</span><span class="why '+cls+'">'+why+'</span></div>'; |
| }).join(''); |
| col.innerHTML = '<h3>'+cat+' <span class="mono" style="color:#5C6478;">('+ERRORED[cat].length+')</span></h3>'+itemsHtml; |
| errGrid.appendChild(col); |
| }); |
| |
| |
| function grid(){ return { color:'#232A38' }; } |
| function baseOpts(extra){ |
| var o = { |
| responsive:true, maintainAspectRatio:false, |
| plugins:{ legend:{ display:false }, tooltip:{ backgroundColor:'#171C27', borderColor:'#232A38', borderWidth:1, titleColor:'#EDEAE2', bodyColor:'#9BA3B4' } }, |
| scales:{ x:{ grid:grid(), ticks:{ color:'#9BA3B4' } }, y:{ grid:grid(), ticks:{ color:'#9BA3B4' }, beginAtZero:true } } |
| }; |
| return Object.assign(o, extra||{}); |
| } |
| |
| new Chart(document.getElementById('chartAuth'), { |
| type:'bar', |
| data:{ labels:['OAuth2','API key','Token','Basic','Other / misc'], |
| datasets:[{ data:[59,52,31,11,15], backgroundColor:[COLORS.teal,COLORS.sky,COLORS.amber,COLORS.orange,COLORS.coral], borderRadius:2 }] }, |
| options: baseOpts({ indexAxis:'y', scales:{ x:{ grid:grid(), beginAtZero:true, ticks:{color:'#9BA3B4'} }, y:{ grid:{display:false}, ticks:{color:'#9BA3B4'} } } }) |
| }); |
| |
| new Chart(document.getElementById('chartGate'), { |
| type:'doughnut', |
| data:{ labels:['Paid-plan-gated','Self-serve','Trial'], |
| datasets:[{ data:[55,44,1], backgroundColor:[COLORS.coral,COLORS.teal,COLORS.amber], borderColor:'#12161F', borderWidth:3 }] }, |
| options:{ responsive:true, maintainAspectRatio:false, plugins:{ legend:{ position:'bottom', labels:{ color:'#9BA3B4', boxWidth:12, font:{size:11} } } }, cutout:'62%' } |
| }); |
| |
| new Chart(document.getElementById('chartVerdict'), { |
| type:'doughnut', |
| data:{ labels:['Yes — today','Yes — with workarounds'], |
| datasets:[{ data:[62,38], backgroundColor:[COLORS.teal,COLORS.amber], borderColor:'#12161F', borderWidth:3 }] }, |
| options:{ responsive:true, maintainAspectRatio:false, plugins:{ legend:{ position:'bottom', labels:{ color:'#9BA3B4', boxWidth:12, font:{size:11} } } }, cutout:'62%' } |
| }); |
| |
| new Chart(document.getElementById('chartMcp'), { |
| type:'doughnut', |
| data:{ labels:['Has MCP path','No MCP yet'], |
| datasets:[{ data:[86,14], backgroundColor:[COLORS.sky,'#3A4256'], borderColor:'#12161F', borderWidth:3 }] }, |
| options:{ responsive:true, maintainAspectRatio:false, plugins:{ legend:{ position:'bottom', labels:{ color:'#9BA3B4', boxWidth:12, font:{size:11} } } }, cutout:'62%' } |
| }); |
| |
| var CATS = ['CRM and Sales','Support and Helpdesk','Communications and Messaging','Marketing, Ads, Email and Social','Ecommerce','Data, SEO and Scraping','Developer, Infra and Data platforms','Productivity and Project Management','Finance and Fintech','AI, Research and Media-native']; |
| var CATS_SHORT = ['CRM & Sales','Support','Comms','Marketing','Ecommerce','Data/SEO','Dev/Infra','Productivity','Finance','AI/Research']; |
| var gatedByCat = [8,6,2,4,3,8,7,3,7,7]; |
| var selfServeByCat = [2,4,8,5,7,2,3,7,3,3]; |
| var trialByCat = [0,0,0,1,0,0,0,0,0,0]; |
| |
| new Chart(document.getElementById('chartCatGate'), { |
| type:'bar', |
| data:{ labels:CATS_SHORT, datasets:[ |
| { label:'Paid-plan-gated', data:gatedByCat, backgroundColor:COLORS.coral, stack:'s' }, |
| { label:'Self-serve', data:selfServeByCat, backgroundColor:COLORS.teal, stack:'s' }, |
| { label:'Trial', data:trialByCat, backgroundColor:COLORS.amber, stack:'s' } |
| ]}, |
| options: baseOpts({ scales:{ x:{ stacked:true, grid:{display:false}, ticks:{color:'#9BA3B4'} }, y:{ stacked:true, grid:grid(), beginAtZero:true, ticks:{color:'#9BA3B4'} } }, plugins:{ legend:{ display:true, position:'top', labels:{ color:'#9BA3B4', boxWidth:12, font:{size:11} } } } }) |
| }); |
| |
| var todayByCat = [5,4,7,5,6,7,8,9,5,6]; |
| var workByCat = [5,6,3,5,4,3,2,1,5,4]; |
| new Chart(document.getElementById('chartCatVerdict'), { |
| type:'bar', |
| data:{ labels:CATS_SHORT, datasets:[ |
| { label:'Yes — today', data:todayByCat, backgroundColor:COLORS.teal, stack:'s' }, |
| { label:'Yes — with workarounds', data:workByCat, backgroundColor:COLORS.amber, stack:'s' } |
| ]}, |
| options: baseOpts({ scales:{ x:{ stacked:true, grid:{display:false}, ticks:{color:'#9BA3B4'} }, y:{ stacked:true, grid:grid(), beginAtZero:true, ticks:{color:'#9BA3B4'} } }, plugins:{ legend:{ display:true, position:'top', labels:{ color:'#9BA3B4', boxWidth:12, font:{size:11} } } } }) |
| }); |
| |
| new Chart(document.getElementById('chartBlockerThemes'), { |
| type:'bar', |
| data:{ labels:['OAuth / auth complexity','Setup complexity','Rate limits','Limited MCP support','Approval / review process','Docs / scalability concerns','Enterprise / paid gate'], |
| datasets:[{ data:[11,7,4,3,1,1,1], backgroundColor:COLORS.amber, borderRadius:2 }] }, |
| options: baseOpts({ indexAxis:'y', scales:{ x:{ grid:grid(), beginAtZero:true, ticks:{color:'#9BA3B4'} }, y:{ grid:{display:false}, ticks:{color:'#9BA3B4'} } } }) |
| }); |
| |
| |
| var tbody = document.getElementById('tableBody'); |
| var searchBox = document.getElementById('searchBox'); |
| var fCategory = document.getElementById('filterCategory'); |
| var fGate = document.getElementById('filterGate'); |
| var fVerdict = document.getElementById('filterVerdict'); |
| var fCluster = document.getElementById('filterCluster'); |
| var rowcount = document.getElementById('rowcount'); |
| |
| function uniq(arr){ return arr.filter(function(v,i){ return arr.indexOf(v)===i; }); } |
| function fillSelect(sel, values, placeholder){ |
| values.forEach(function(v){ var o=document.createElement('option'); o.value=v; o.textContent=v; sel.appendChild(o); }); |
| } |
| fillSelect(fCategory, uniq(APPS.map(function(a){return a.category;})).sort()); |
| fillSelect(fGate, uniq(APPS.map(function(a){return a.gate;})).sort()); |
| fillSelect(fVerdict, uniq(APPS.map(function(a){return a.verdict;})).sort()); |
| var clusterNames = {}; |
| APPS.forEach(function(a){ clusterNames[a.cluster_label]=true; }); |
| fillSelect(fCluster, Object.keys(clusterNames).sort()); |
| |
| var sortKey = null, sortDir = 1; |
| |
| function gatePillLabel(g){ |
| if(g==='paid-plan-gated') return 'Gated'; |
| if(g==='self-serve') return 'Self-serve'; |
| if(g==='trial') return 'Trial'; |
| return g; |
| } |
| function verdictPillLabel(v){ |
| if(v==='yes-today') return 'Yes — today'; |
| if(v==='yes-with-workarounds') return 'Workarounds'; |
| return v; |
| } |
| |
| function render(){ |
| var q = searchBox.value.trim().toLowerCase(); |
| var cat = fCategory.value, gate = fGate.value, verdict = fVerdict.value, cluster = fCluster.value; |
| var rows = APPS.filter(function(a){ |
| if(q && (a.name.toLowerCase().indexOf(q)===-1 && a.description.toLowerCase().indexOf(q)===-1)) return false; |
| if(cat && a.category!==cat) return false; |
| if(gate && a.gate!==gate) return false; |
| if(verdict && a.verdict!==verdict) return false; |
| if(cluster && a.cluster_label!==cluster) return false; |
| return true; |
| }); |
| if(sortKey){ |
| rows = rows.slice().sort(function(a,b){ |
| var av = (sortKey==='auth') ? a.auth.join(',') : a[sortKey]; |
| var bv = (sortKey==='auth') ? b.auth.join(',') : b[sortKey]; |
| if(av < bv) return -1*sortDir; |
| if(av > bv) return 1*sortDir; |
| return 0; |
| }); |
| } |
| rowcount.textContent = 'Showing ' + rows.length + ' of ' + APPS.length + ' apps'; |
| tbody.innerHTML = rows.map(function(a){ |
| var corrected = a.corrected ? ' <span class="corrected-flag" title="Corrected during Stage 2 browser verification">[corrected]</span>' : ''; |
| return '<tr>'+ |
| '<td class="name">'+a.name+corrected+'</td>'+ |
| '<td>'+a.category+'</td>'+ |
| '<td>'+a.auth.join(', ')+'</td>'+ |
| '<td><span class="pill '+a.gate+'">'+gatePillLabel(a.gate)+'</span></td>'+ |
| '<td>'+a.surface+'</td>'+ |
| '<td>'+(a.mcp ? '✓' : '—')+'</td>'+ |
| '<td><span class="pill '+a.verdict+'">'+verdictPillLabel(a.verdict)+'</span></td>'+ |
| '<td>'+a.cluster_label+'</td>'+ |
| '<td>'+(a.evidence ? '<a href="'+a.evidence+'" target="_blank" rel="noopener">source</a>' : '—')+'</td>'+ |
| '</tr>'; |
| }).join(''); |
| } |
| |
| searchBox.addEventListener('input', render); |
| [fCategory,fGate,fVerdict,fCluster].forEach(function(el){ el.addEventListener('change', render); }); |
| document.querySelectorAll('thead th[data-k]').forEach(function(th){ |
| th.addEventListener('click', function(){ |
| var k = th.getAttribute('data-k'); |
| if(sortKey===k){ sortDir *= -1; } else { sortKey = k; sortDir = 1; } |
| render(); |
| }); |
| }); |
| render(); |
| |
| |
| var sections = document.querySelectorAll('main section[id]'); |
| var navLinks = document.querySelectorAll('#topnav a[href^="#"]'); |
| function onScroll(){ |
| var pos = window.scrollY + 90; |
| var current = ''; |
| sections.forEach(function(s){ if(s.offsetTop <= pos) current = s.id; }); |
| navLinks.forEach(function(l){ |
| l.classList.toggle('active', l.getAttribute('href') === '#'+current); |
| }); |
| var bt = document.getElementById('backtotop'); |
| bt.classList.toggle('show', window.scrollY > 800); |
| } |
| window.addEventListener('scroll', onScroll); |
| onScroll(); |
| document.getElementById('backtotop').addEventListener('click', function(){ |
| window.scrollTo({top:0, behavior:'smooth'}); |
| }); |
| } |
| |
| (function waitForChart(triesLeft){ |
| if(window.Chart){ __mainInit(); return; } |
| if(triesLeft <= 0){ |
| console.error('Chart.js failed to load from both CDNs — charts will not render, but table/clusters still will.'); |
| |
| window.Chart = function(){ return { }; }; |
| __mainInit(); |
| return; |
| } |
| setTimeout(function(){ waitForChart(triesLeft - 1); }, 150); |
| })(40); |
| |
| </script> |
| </body> |
| </html> |
|
|