<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sapnesh Naik</title>
    <description>The latest articles on DEV Community by Sapnesh Naik (@sapnesh_naik_ngo).</description>
    <link>https://dev.to/sapnesh_naik_ngo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3884423%2Fc3bfbfef-0232-466f-a751-248f0e01963d.jpg</url>
      <title>DEV Community: Sapnesh Naik</title>
      <link>https://dev.to/sapnesh_naik_ngo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sapnesh_naik_ngo"/>
    <language>en</language>
    <item>
      <title>How to sync large amounts of contacts from the HubSpot API</title>
      <dc:creator>Sapnesh Naik</dc:creator>
      <pubDate>Thu, 07 May 2026 16:36:49 +0000</pubDate>
      <link>https://dev.to/nangohq/how-to-sync-large-amounts-of-contacts-from-the-hubspot-api-2acm</link>
      <guid>https://dev.to/nangohq/how-to-sync-large-amounts-of-contacts-from-the-hubspot-api-2acm</guid>
      <description>&lt;p&gt;If you are building API integrations with HubSpot in your product, you will eventually need to sync more than 10,000 contacts from a customer's portal. That is not easy when you want a durable, resumable sync that fetches only new and changed records, instead of refetching everything on every run. You also need to think about managing the auth tokens for 100s of users, record storage, webhook updates, and more.&lt;/p&gt;

&lt;p&gt;This guide walks through how to build a production-ready HubSpot contacts sync using Claude Code, Cursor, Codex, or any other AI Coding Agent with the Nango &lt;a href="https://nango.dev/docs/implementation-guides/platform/functions/leverage-ai-agents" rel="noopener noreferrer"&gt;AI Function Builder&lt;/a&gt; skill.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhslvlwnj4zj8b40ns0z8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhslvlwnj4zj8b40ns0z8.gif" alt="hubspot-contacts-sync-demo-nango" width="560" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The full working demo, including the Nango sync, an Express backend, and an HTML dashboard for browsing synced contacts, is on GitHub at &lt;a href="https://github.com/NangoHQ/blog-demos/tree/main/how-to-sync-large-amounts-of-contacts-from-hubspot-api" rel="noopener noreferrer"&gt;NangoHQ/blog-demos/how-to-sync-large-amounts-of-contacts-from-hubspot-api&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The same steps can also be used for syncing HubSpot companies, deals, tickets, and any other CRM Nango &lt;a href="https://nango.dev/api-integrations" rel="noopener noreferrer"&gt;supports&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why syncing large amounts of contacts from HubSpot is hard
&lt;/h2&gt;

&lt;p&gt;HubSpot exposes contacts through two endpoints, and neither one is enough on its own:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Filter by &lt;code&gt;lastmodifieddate&lt;/code&gt;?&lt;/th&gt;
&lt;th&gt;10k total cap?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;GET /crm/v3/objects/contacts&lt;/code&gt; (basic list)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;POST /crm/v3/objects/contacts/search&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes (400 error past 10k)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;a href="https://developers.hubspot.com/docs/api-reference/latest/crm/search-the-crm#limits" rel="noopener noreferrer"&gt;search-the-crm guide&lt;/a&gt; confirms it: &lt;em&gt;"The search endpoints are limited to 10,000 total results for any given query. Attempting to page beyond 10,000 will result in a 400 error."&lt;/em&gt; Search is also rate-limited to five requests per second per account.&lt;/p&gt;

&lt;p&gt;So the search endpoint is the only one that filters by &lt;code&gt;lastmodifieddate&lt;/code&gt; (what you need for incremental syncs), but it walls off at 10k. The basic list endpoint has no cap but no filter. The HubSpot community forum is full of &lt;a href="https://community.hubspot.com/t5/APIs-Integrations/Contact-Search-API-400-Bad-Request-when-fetching-records-after/m-p/446340" rel="noopener noreferrer"&gt;400 reports from developers&lt;/a&gt; who only used search and assumed their code was broken.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution to sync large amounts of contacts from HubSpot
&lt;/h2&gt;

&lt;p&gt;Split the sync into two phases that share state via &lt;a href="https://nango.dev/docs/implementation-guides/use-cases/syncs/checkpoints" rel="noopener noreferrer"&gt;Nango checkpoints&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Initial phase.&lt;/strong&gt; Page through every contact using the basic list endpoint. No 10k cap. After each page, save a checkpoint with the &lt;code&gt;after&lt;/code&gt; cursor and the highest &lt;code&gt;lastmodifieddate&lt;/code&gt; seen so far.
&lt;strong&gt;Note:&lt;/strong&gt; while this endpoint does have &lt;code&gt;lastmodifieddate&lt;/code&gt; in its response, it does not support filtering by &lt;code&gt;lastmodifieddate&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incremental phase.&lt;/strong&gt; Switch to the search endpoint. Filter by &lt;code&gt;lastmodifieddate GT &amp;lt;watermark&amp;gt;&lt;/code&gt;, sort ascending by &lt;code&gt;lastmodifieddate&lt;/code&gt;, and page through. Each page advances the watermark. If a request 400s past the 10k cap, catch the error, save the latest watermark, and start a fresh search from it inside the same run. Repeat until a search returns fewer than 10k results, so no modified records are missed.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why building this from scratch is harder than it looks
&lt;/h2&gt;

&lt;p&gt;The two-phase pattern is the easy part. The infrastructure underneath is the hard part:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Durable checkpoints&lt;/strong&gt; that survive process restarts and store per-connection cursors and watermarks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resumable execution,&lt;/strong&gt; so a 200k-contact backfill can stop and pick up across multiple runs without skipping or duplicating records.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HubSpot OAuth lifecycle&lt;/strong&gt; with &lt;a href="https://www.nango.dev/blog/concurrency-with-oauth-token-refreshes" rel="noopener noreferrer"&gt;concurrent token refreshes&lt;/a&gt; and graceful handling of &lt;a href="https://www.nango.dev/blog/hubspot-oauth-bad-refresh-token" rel="noopener noreferrer"&gt;&lt;code&gt;BAD_REFRESH_TOKEN&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate-limit handling&lt;/strong&gt; with backoff and per-connection queuing for HubSpot's 5 req/s search cap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sync-completion webhooks&lt;/strong&gt; so your backend knows when new records landed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Nango provides for building API integrations
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.nango.dev/" rel="noopener noreferrer"&gt;Nango&lt;/a&gt; is an agentic API integrations platform. It gives you five building blocks that turn the two-phase pattern from a multi-week project into minutes of work with a coding agent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Wide API support with managed auth.&lt;/strong&gt; Pre-built auth for &lt;a href="https://nango.dev/api-integrations" rel="noopener noreferrer"&gt;700+ APIs,&lt;/a&gt; including HubSpot, with OAuth 2.0, API keys, basic auth, JWT, and other auth types. Token refresh, encryption, and revocation handling are managed for you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://nango.dev/docs/implementation-guides/platform/functions/leverage-ai-agents" rel="noopener noreferrer"&gt;AI Function Builder&lt;/a&gt; skill for coding agents.&lt;/strong&gt; Install once with &lt;code&gt;npx skills add NangoHQ/skills&lt;/code&gt; and your AI coding agent (Claude Code, Cursor, Codex, Gemini CLI, and others) gets the context to research the API, write a Nango sync or action in TypeScript, run dryruns against a real connection, and iterate until the integration works.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actions and tool calls.&lt;/strong&gt; Actions are functions written in TypeScript that run on Nango's infrastructure and are triggered from your app or by an AI agent. For example, a &lt;code&gt;create-contact&lt;/code&gt; action calls &lt;code&gt;POST /crm/v3/objects/contacts&lt;/code&gt; with the right token for the right connection, returning the created record.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data syncs with record storage.&lt;/strong&gt; Syncs run on Nango's serverless, tenant-isolated runtime. Synced records are stored in Nango's cache so your app can read them in a paginated manner with &lt;code&gt;nango.listRecords()&lt;/code&gt;. The sync handles retries, rate limits, and resumable execution automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhooks from external APIs.&lt;/strong&gt; Nango ingests webhooks from external providers like HubSpot (for example, &lt;code&gt;contact.deletion&lt;/code&gt; events), attributes each event to the right connection, and forwards a normalized payload to your backend. You write the handler once and Nango deals with provider-specific signing, retries, and routing.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Implementing a HubSpot contacts sync with Nango
&lt;/h2&gt;

&lt;p&gt;Follow the steps below to implement a durable HubSpot contacts sync using the Nango AI Function Builder skill.&lt;/p&gt;

&lt;p&gt;By the end of this section, you will have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A customizable &lt;a href="https://nango.dev/docs/implementation-guides/platform/auth/implement-api-auth" rel="noopener noreferrer"&gt;auth UI&lt;/a&gt; in your product so customers can connect their HubSpot account.&lt;/li&gt;
&lt;li&gt;An initial backfill sync that fires the moment a new HubSpot connection is created and pulls all contacts.&lt;/li&gt;
&lt;li&gt;An incremental phase that picks up only modified contacts on every run (every hour, customizable) and slides past the 10k search cap automatically.&lt;/li&gt;
&lt;li&gt;Checkpoints that survive runtime restarts and rate limits.&lt;/li&gt;
&lt;li&gt;A backend that receives sync-completion webhooks and reads only the records that changed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;You will need a &lt;a href="https://nango.dev/" rel="noopener noreferrer"&gt;Nango account&lt;/a&gt; (the free tier is enough for development). Then &lt;a href="https://nango.dev/docs/api-integrations/hubspot#hubspot" rel="noopener noreferrer"&gt;register your own HubSpot OAuth app&lt;/a&gt; with the &lt;code&gt;crm.objects.contacts.read&lt;/code&gt; scope, set the OAuth callback URL to &lt;code&gt;https://api.nango.dev/oauth/callback&lt;/code&gt;, and &lt;a href="https://app.nango.dev/dev/integrations" rel="noopener noreferrer"&gt;configure HubSpot as an integration&lt;/a&gt; in the Nango dashboard.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6xstefvk3hs2dq60pg41.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6xstefvk3hs2dq60pg41.png" alt="Nango dashboard with HubSpot configured as an integration: client ID, client secret, callback URL, and the crm.objects.contacts.read scope" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you do not have your own HubSpot OAuth app yet, you can use Nango's pre-configured developer credentials to get going, then swap to your own credentials before going to production.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fer86uoxlr7fw20fuln9b.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fer86uoxlr7fw20fuln9b.jpg" alt="Nango dashboard offering pre-configured HubSpot developer credentials for a quick start" width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, install the &lt;a href="https://nango.dev/docs/reference/cli" rel="noopener noreferrer"&gt;Nango CLI&lt;/a&gt; and initialize an integrations project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; nango
nango init
&lt;span class="nb"&gt;cd &lt;/span&gt;nango-integrations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then install the &lt;a href="https://nango.dev/docs/implementation-guides/platform/functions/leverage-ai-agents#install-the-nango-function-builder-skill" rel="noopener noreferrer"&gt;AI Function Builder skill&lt;/a&gt;, so your coding agent has the context it needs to write Nango functions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add NangoHQ/skills &lt;span class="nt"&gt;-s&lt;/span&gt; building-nango-functions-locally
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This adds Nango's interface patterns, Zod schema conventions, dryrun testing flow, and CLI usage to whichever coding agent you use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; LLM training data on Nango is often stale. Add the &lt;a href="https://nango.dev/docs/mcp" rel="noopener noreferrer"&gt;Nango docs MCP server&lt;/a&gt; alongside the skill, so your agent can pull current API references during code generation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbdvjnslrlxuew8zny9t8.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbdvjnslrlxuew8zny9t8.gif" alt="Installing the Nango AI skill in Claude Code" width="560" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, set a Nango dev API key in a &lt;code&gt;.env&lt;/code&gt; file at the root of &lt;code&gt;nango-integrations&lt;/code&gt; so the CLI and dryrun commands can authenticate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# nango-integrations/.env&lt;/span&gt;
&lt;span class="nv"&gt;NANGO_SECRET_KEY_DEV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;your-dev-api-key&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can create or copy a dev API key from the &lt;a href="https://app.nango.dev/dev/environment-settings" rel="noopener noreferrer"&gt;Nango dashboard&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Add a HubSpot test connection
&lt;/h3&gt;

&lt;p&gt;Before generating the sync, create a real HubSpot connection in the Nango dashboard. The AI coding agent uses this connection to run &lt;code&gt;nango dryrun&lt;/code&gt; against the live HubSpot API while it iterates on the function, so the generated code is tested against real responses.&lt;/p&gt;

&lt;p&gt;In the &lt;a href="https://app.nango.dev/dev/connections" rel="noopener noreferrer"&gt;Nango dashboard&lt;/a&gt;, click &lt;strong&gt;Add Test Connection&lt;/strong&gt;, pick HubSpot, and complete the OAuth flow against a HubSpot developer account. Copy the connection ID from the connection details page; you will pass it into the prompt in the next step.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftxou4u3k1moderkpjqqr.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftxou4u3k1moderkpjqqr.gif" alt="Adding a HubSpot test connection from the Nango dashboard via the OAuth flow" width="600" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Generate the contacts sync
&lt;/h3&gt;

&lt;p&gt;Open your project in your AI coding agent and invoke the AI Function Builder skill with a prompt like the one below. Replace the connection ID with the one you just created.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Build a Nango sync for HubSpot contacts that runs every hour, handles
portals with more than 10,000 contacts reliably, and resumes cleanly
across runs without skipping or duplicating records.

Integration ID: hubspot
Connection ID: &lt;span class="nt"&gt;&amp;lt;your-connection-id&amp;gt;&lt;/span&gt;

Properties to sync: firstname, lastname, email, phone, jobtitle,
company, createdate, lastmodifieddate.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent figures out the rest from HubSpot's docs and the AI Function Builder skill: which endpoints to use, how to paginate, how to handle the 10k search cap, and how to checkpoint for resumability.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq6nxgtii62k355e7bpbx.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq6nxgtii62k355e7bpbx.gif" alt="Claude Code generating the HubSpot contacts sync function via the Nango AI Function Builder skill" width="600" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The agent researches both endpoints, writes the function, generates a test suite, runs &lt;code&gt;nango dryrun&lt;/code&gt; against your test connection, and iterates on real responses until everything passes. &lt;a href="https://nango.dev/docs/guides/functions/functions-guide#function-ai-builder" rel="noopener noreferrer"&gt;Here is what the agent does behind the scenes&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Review the generated sync
&lt;/h3&gt;

&lt;p&gt;When the agent finishes, you will see three new files inside &lt;code&gt;nango-integrations/hubspot/&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/NangoHQ/blog-demos/blob/main/how-to-sync-large-amounts-of-contacts-from-hubspot-api/nango-integrations/hubspot/syncs/fetch-contacts.ts" rel="noopener noreferrer"&gt;&lt;code&gt;hubspot/syncs/fetch-contacts.ts&lt;/code&gt;&lt;/a&gt;: the sync function itself, with the two-phase logic, checkpoint schema, and Zod model.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hubspot/tests/fetch-contacts.test.json&lt;/code&gt;: a recorded HubSpot API response captured during the agent's dryrun, used as a deterministic fixture for unit tests.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hubspot/tests/hubspot-fetch-contacts.test.ts&lt;/code&gt;: the unit test that replays the fixture and asserts the sync produces the expected records.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's look at the important bits of the sync file. The full file with imports, schemas, helpers, and types is in &lt;a href="https://github.com/NangoHQ/blog-demos/blob/main/how-to-sync-large-amounts-of-contacts-from-hubspot-api/nango-integrations/hubspot/syncs/fetch-contacts.ts" rel="noopener noreferrer"&gt;the demo repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The &lt;code&gt;createSync&lt;/code&gt; declaration and phase dispatcher.&lt;/strong&gt; A string-only &lt;code&gt;CheckpointSchema&lt;/code&gt; carries the phase, the basic-list cursor, and the watermark across runs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;CheckpointSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;phase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;after&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;lastmodifieddate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sync&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createSync&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Two-phase HubSpot contacts sync that slides past the 10k search cap.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.0.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;frequency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;every hour&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;autoStart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;checkpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CheckpointSchema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;models&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;HubspotContact&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;HubspotContactSchema&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nango&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;checkpoint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;nango&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getCheckpoint&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;phase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;checkpoint&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;phase&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;incremental&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;incremental&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;initial&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;watermark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;checkpoint&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;lastmodifieddate&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;phase&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;initial&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;watermark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;runInitialPhase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nango&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;checkpoint&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;after&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;watermark&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;runIncrementalPhase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nango&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;watermark&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Initial phase: paginate through the basic list endpoint, save a checkpoint per page.&lt;/strong&gt; No 10k cap on this endpoint, so a 200k-contact portal flows through across however many runs are needed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;proxyConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/crm/v3/objects/contacts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PAGE_LIMIT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PROPERTIES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;paginate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cursor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;cursor_name_in_request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;after&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;cursor_path_in_response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;paging.next.after&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;response_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;results&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PAGE_LIMIT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;on_page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;nextPageParam&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;nextPageParam&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;nextPageParam&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;nango&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;saveCheckpoint&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;phase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;initial&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;after&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;nextPageParam&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;lastmodifieddate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;watermark&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;// Backfill done. Switch to incremental on the next run.&lt;/span&gt;
                &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;nango&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;saveCheckpoint&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;phase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;incremental&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;after&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;lastmodifieddate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;watermark&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;nango&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;paginate&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HubspotContactRaw&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;proxyConfig&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;contacts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toContact&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;nango&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;batchSave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;contacts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HubspotContact&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;watermark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;highestWatermark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;contacts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;watermark&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Incremental phase: search filtered by watermark, ascending, checkpointed per page.&lt;/strong&gt; This is the part that solves the 10k cap. &lt;code&gt;filterWatermark&lt;/code&gt; defines the search; &lt;code&gt;savedWatermark&lt;/code&gt; advances per page. When a paged request 400s past the 10k cap, catch the error, restart the search from the latest watermark, and continue inside the same run until a slice returns fewer than 10k results.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;filterWatermark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;savedWatermark&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filterGroups&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
        &lt;span class="na"&gt;filters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
            &lt;span class="na"&gt;propertyName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lastmodifieddate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;operator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;toMillisecondsString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;filterWatermark&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;// HubSpot wants Unix milliseconds&lt;/span&gt;
        &lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="p"&gt;}];&lt;/span&gt;

    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;after&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;hitTenKCap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;nango&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SearchResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="na"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/crm/v3/objects/contacts/search&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="nx"&gt;filterGroups&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="na"&gt;sorts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;propertyName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lastmodifieddate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;direction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ASCENDING&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
                    &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;PROPERTIES&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                    &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PAGE_LIMIT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="p"&gt;...(&lt;/span&gt;&lt;span class="nx"&gt;after&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;after&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
            &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Past the 10k cap, HubSpot returns a 400. Restart the search&lt;/span&gt;
            &lt;span class="c1"&gt;// from the latest watermark inside the same run.&lt;/span&gt;
            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isTenKCapError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;hitTenKCap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;contacts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toContact&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;contacts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;nango&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;batchSave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;contacts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HubspotContact&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;savedWatermark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;highestWatermark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;contacts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;savedWatermark&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;nango&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;saveCheckpoint&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;phase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;incremental&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;after&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;lastmodifieddate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;savedWatermark&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

        &lt;span class="nx"&gt;after&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;paging&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;after&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;after&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;hitTenKCap&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;filterWatermark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;savedWatermark&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Slide the search window forward and loop.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few design decisions worth calling out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Checkpoints saved per page.&lt;/strong&gt; The initial phase uses &lt;code&gt;nango.paginate&lt;/code&gt; with an &lt;code&gt;on_page&lt;/code&gt; callback; the incremental phase saves inline after each &lt;code&gt;batchSave&lt;/code&gt;. Either way, if the function is interrupted, the next run resumes from the saved state rather than starting over.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ascending sort on &lt;code&gt;lastmodifieddate&lt;/code&gt;.&lt;/strong&gt; Each search returns the lowest-watermark records first. When a request 400s past the 10k cap, the latest saved watermark is already past everything we just processed, so restarting the search from it picks up the next slice without gaps. The outer loop keeps sliding the window forward until a slice fits under 10k.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Milliseconds, not ISO, for the search filter.&lt;/strong&gt; HubSpot's search endpoint expects &lt;code&gt;lastmodifieddate&lt;/code&gt; as Unix milliseconds. &lt;code&gt;toMillisecondsString&lt;/code&gt; handles the conversion.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 4: Deploy
&lt;/h3&gt;

&lt;p&gt;Deploy just this sync to your Nango dev environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nango deploy &lt;span class="nt"&gt;--sync&lt;/span&gt; fetch-contacts dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4e2k62qm0nt40s2b6ybm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4e2k62qm0nt40s2b6ybm.jpg" alt="Nango CLI terminal output after deploying the fetch-contacts sync to the dev environment" width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The sync now runs every hour for every connected HubSpot portal, starting with the initial backfill and automatically transitioning to the incremental phase once the backfill catches up.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Handle sync-completion webhooks in your backend
&lt;/h3&gt;

&lt;p&gt;When a sync run finishes with new records, Nango sends a &lt;a href="https://nango.dev/docs/implementation-guides/platform/webhooks-from-nango#overview-of-nango-webhooks" rel="noopener noreferrer"&gt;sync-completion webhook&lt;/a&gt; to your backend with counts of added, updated, and deleted records, plus a &lt;code&gt;modifiedAfter&lt;/code&gt; timestamp. Set the webhook URL in the Nango dashboard under &lt;strong&gt;Environment Settings &amp;gt; Webhooks&lt;/strong&gt;. The &lt;a href="https://github.com/NangoHQ/blog-demos/tree/main/how-to-sync-large-amounts-of-contacts-from-hubspot-api/demo-app" rel="noopener noreferrer"&gt;demo app&lt;/a&gt; shows a working Express backend and an HTML dashboard that displays the synced contacts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F55590tjl3l9e2d39nm2g.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F55590tjl3l9e2d39nm2g.jpg" alt="Setting the sync-completion webhook URL in Nango Environment Settings" width="800" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then fetch only the records that changed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;records&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;nango&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listRecords&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;providerConfigKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hubspot&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;connectionId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HubspotContact&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;modifiedAfter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;webhookPayload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;modifiedAfter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Always &lt;a href="https://nango.dev/docs/implementation-guides/platform/webhooks-from-nango#verifying-webhooks-from-nango" rel="noopener noreferrer"&gt;verify the webhook signature&lt;/a&gt; before processing using &lt;code&gt;nango.verifyIncomingWebhookRequest()&lt;/code&gt;. Nango signs payloads with HMAC-SHA256, and verification requires the raw request body (before JSON parsing).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nango.listRecords&lt;/code&gt; is paginated. Loop through &lt;code&gt;next_cursor&lt;/code&gt; until it returns null, so you do not silently drop records on portals with very high modification rates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local testing tip:&lt;/strong&gt; To inspect webhooks during development, run &lt;a href="https://ngrok.com/" rel="noopener noreferrer"&gt;ngrok&lt;/a&gt; against your local backend and set the ngrok URL as the webhook target in Nango's environment settings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcak22w24fi2ja744m6wi.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcak22w24fi2ja744m6wi.jpg" alt="Pasting the ngrok URL as the webhook target in Nango environment settings for local development" width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Connect a new HubSpot account and test
&lt;/h3&gt;

&lt;p&gt;With the sync deployed, connect a new HubSpot portal through Nango's &lt;a href="https://nango.dev/docs/implementation-guides/platform/auth/implement-api-auth" rel="noopener noreferrer"&gt;auth UI&lt;/a&gt;. The sync starts immediately because of &lt;code&gt;autoStart: true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftfedmaz1peeqvw8063om.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftfedmaz1peeqvw8063om.gif" alt="nango-live-sync" width="600" height="223"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To verify the sync is doing the right thing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Check the dashboard.&lt;/strong&gt; The Nango dashboard shows per-run logs, record counts, current checkpoint, and durations. You should see an initial-phase run that each process all the contacts, then incremental runs that process only modified contacts.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1b8zknhf4g7n7vz7v1q1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1b8zknhf4g7n7vz7v1q1.jpg" alt="Nango sync logs" width="800" height="494"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Watch the checkpoint.&lt;/strong&gt; During the initial phase, the checkpoint shows &lt;code&gt;phase: "initial"&lt;/code&gt; with an advancing &lt;code&gt;after&lt;/code&gt; cursor. Once the backfill completes, the phase flips to &lt;code&gt;"incremental"&lt;/code&gt; and the &lt;code&gt;lastmodifieddate&lt;/code&gt; watermark starts moving forward.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Modify a contact in HubSpot.&lt;/strong&gt; Within the next hour, the incremental sync should pick it up, and your backend should receive a sync-completion webhook with &lt;code&gt;addedOrUpdated: 1&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Edge cases worth knowing about
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Custom properties.&lt;/strong&gt; Update the prompt with the custom property names and rerun the AI Function Builder skill. For per-customer property lists, store them in &lt;a href="https://nango.dev/docs/implementation-guides/use-cases/customer-configuration" rel="noopener noreferrer"&gt;connection metadata&lt;/a&gt; and read them during the sync.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deletes.&lt;/strong&gt; Search does not return deleted contacts. Subscribe to HubSpot's &lt;code&gt;contact.deletion&lt;/code&gt; &lt;a href="https://developers.hubspot.com/docs/guides/api/app-management/webhooks" rel="noopener noreferrer"&gt;webhook&lt;/a&gt;. Nango can &lt;a href="https://nango.dev/docs/implementation-guides/use-cases/webhooks-from-external-apis" rel="noopener noreferrer"&gt;forward those webhooks&lt;/a&gt; to your backend after attributing each event to the right connection.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Syncing large amounts of contacts from HubSpot requires both of HubSpot's contact endpoints. Search filters by &lt;code&gt;lastmodifieddate&lt;/code&gt; but caps at 10,000 results. The basic list endpoint has no cap but cannot filter. A reliable sync uses both, with checkpoints that resume cleanly across runs and durable infrastructure underneath: OAuth refresh, retries, rate limit handling, and webhook routing.&lt;/p&gt;

&lt;p&gt;With Nango, the sync logic is a code function your AI coding agent generates from a prompt, while the infrastructure is managed for you. The same approach works for HubSpot companies, deals, tickets, and any of Nango's &lt;a href="https://nango.dev/api-integrations" rel="noopener noreferrer"&gt;700+ supported APIs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Related reading:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.nango.dev/blog/hubspot-api-integration" rel="noopener noreferrer"&gt;Step by step guide to building a native HubSpot API integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nango.dev/blog/hubspot-oauth-bad-refresh-token" rel="noopener noreferrer"&gt;HubSpot OAuth BAD_REFRESH_TOKEN: what it means and how to fix it&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nango.dev/blog/how-to-build-a-real-time-google-calendar-api-integration" rel="noopener noreferrer"&gt;How to build a real-time Google Calendar API integration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nango.dev/blog/concurrency-with-oauth-token-refreshes" rel="noopener noreferrer"&gt;How to handle concurrency with OAuth token refreshes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nango.dev/blog/nango-api-integrations-builder-skill" rel="noopener noreferrer"&gt;Introducing the Nango API integrations builder skill&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>hubspot</category>
      <category>api</category>
      <category>claude</category>
      <category>agents</category>
    </item>
    <item>
      <title>Best agentic API integrations platform in 2026</title>
      <dc:creator>Sapnesh Naik</dc:creator>
      <pubDate>Fri, 24 Apr 2026 10:26:14 +0000</pubDate>
      <link>https://dev.to/nangohq/best-agentic-api-integrations-platform-in-2026-4ol2</link>
      <guid>https://dev.to/nangohq/best-agentic-api-integrations-platform-in-2026-4ol2</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;An agentic API integrations platform is where coding agents (like Claude, Cursor) build API integrations and AI agents in your product call them at runtime. The platform gives you three things in one stack: integrations-as-code (prompted by you and written by your coding agent), a secure, scalable runtime, and Managed Auth for external APIs with data sync. It is the successor to embedded iPaaS (2010s, low-code) and closed unified APIs (early 2020s, narrow scope). &lt;/p&gt;

&lt;p&gt;An agentic API integrations platform also enables you to set up &lt;a href="https://nango.dev/blog/just-in-time-integrations" rel="noopener noreferrer"&gt;just-in-time integrations&lt;/a&gt;, where integrations are generated on demand using an AI coding agent and consumed by other AI agents in production.&lt;/p&gt;

&lt;p&gt;Three platforms worth evaluating in 2026:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nango:&lt;/strong&gt; An agentic API integrations platform supporting 700+ APIs. Coding agents build integrations with the Nango AI builder skill, running against a secure and scalable runtime. AI agents consume those integrations through an MCP server, tool calls, webhooks, and data syncs. Open-source.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arcade:&lt;/strong&gt; An MCP-first runtime for agent tool calling with permission checks and evaluation testing. Catalog of 112 first-party integrations, focused on the run side only. Not fully agentic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composio:&lt;/strong&gt; A closed-source tool library for agent integrations across 500+ apps. No code-level customization, no data syncs or webhooks, limited observability. Not fully agentic.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Agentic API integrations: A new platform category
&lt;/h2&gt;

&lt;p&gt;For more than a decade, teams built product integrations by hand. Read the API docs, implement OAuth, handle pagination, write error handling, test, ship, and maintain. A typical team shipped 3 to 5 integrations per quarter. However, customers now ask for integrations with hundreds of tools. Engineering cannot pre-build every use case one at a time.&lt;/p&gt;

&lt;p&gt;Two things changed since October 2025:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;AI coding agents can build integrations autonomously:&lt;/strong&gt; Claude Code, Cursor, Codex, and Gemini CLI can read API docs, iterate on a failing request, and produce a working integration. We &lt;a href="https://www.nango.dev/blog/learned-building-200-api-integrations-with-opencode" rel="noopener noreferrer"&gt;built 200+ integrations in 15 minutes&lt;/a&gt; using OpenCode and the &lt;a href="https://nango.dev/docs/implementation-guides/platform/functions/leverage-ai-agents" rel="noopener noreferrer"&gt;Nango builder skill&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every AI agent needs API access at runtime:&lt;/strong&gt; Agents need to read context from external systems to understand the task and take action to complete it. Common examples include fetching a customer record from the CRM, sending a Slack message, drafting an email in Gmail, or updating a ticket in Linear.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These two shifts collapse into the same use case. The agent that uses the integration is increasingly likely to ask another agent to build what it needs. This is the idea behind &lt;a href="https://www.nango.dev/blog/just-in-time-integrations" rel="noopener noreferrer"&gt;just-in-time integrations&lt;/a&gt;: integrations generated on demand, prompted by an engineer, another agent, or an end customer, rather than pre-built by the platform for every use case. Instead of handcrafting each integration, teams build an integration factory. The more the coding agent does, the less human involvement is needed.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpp2r7s06k5o1kkosaa2n.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpp2r7s06k5o1kkosaa2n.jpg" alt="Agentic API integrations platform: the Build, Run, and Maintain loops" width="800" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is an agentic API integrations platform?
&lt;/h2&gt;

&lt;p&gt;An agentic API integrations platform lets engineers and coding agents build, run, and maintain integrations at scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. AI coding agents build integrations:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;The platform exposes skills, SDKs, and a testing loop (test runs against real APIs, real credentials, real logs) so a coding agent (like Claude, Cursor, Codex) can author, test, and deploy integrations end to end. Integrations are code in your repo, so your team keeps full version control, review, and audit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. AI agents in production consume integrations:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;The platform exposes the same integrations as typed tool calls, MCP servers, data syncs, and webhook triggers, so product-facing agents can reliably act on external systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Developers stay in control:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The integration is code that your engineers can read, review, and edit. Coding agents can write integrations end-to-end, or a human engineer can drive a coding agent with review on every change. The platform supports both modes, so teams move fast without losing control of what ships.&lt;/p&gt;

&lt;p&gt;As you can see, the word "agentic" has two implications. On the build side, agents produce the integration code. On the run side, agents consume the integration at runtime. An agentic API integrations platform supports both.&lt;/p&gt;

&lt;p&gt;Supporting both the run and the build side matters because platforms that do only one side of the job hit a wall quickly. A tool library without a build workflow cannot quickly scale API integrations, customize integrations for specific customers, or react to schema changes in the external API. A coding assistant without a runtime cannot ship anything to production.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agentic API integrations platform vs. earlier categories
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Era&lt;/th&gt;
&lt;th&gt;Builder&lt;/th&gt;
&lt;th&gt;Consumer&lt;/th&gt;
&lt;th&gt;Limitations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Embedded iPaaS&lt;/td&gt;
&lt;td&gt;2010s&lt;/td&gt;
&lt;td&gt;Human in a low-code editor&lt;/td&gt;
&lt;td&gt;Human end user&lt;/td&gt;
&lt;td&gt;Visual builders, AI coding agents cannot build using the platform, nor can AI agents consume integrations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unified API&lt;/td&gt;
&lt;td&gt;Early 2020s&lt;/td&gt;
&lt;td&gt;Platform vendor (fixed catalog)&lt;/td&gt;
&lt;td&gt;Backend engineers&lt;/td&gt;
&lt;td&gt;Constrained schemas, limited categories covered, no customization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agentic API integrations platform&lt;/td&gt;
&lt;td&gt;2026+&lt;/td&gt;
&lt;td&gt;AI coding agent or backend engineer in your repo&lt;/td&gt;
&lt;td&gt;AI agent in your product, or your SaaS&lt;/td&gt;
&lt;td&gt;Emerging category&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For deeper context on the older categories, see &lt;a href="https://www.nango.dev/blog/how-is-nango-different-from-embedded-ipaas-or-unified-api" rel="noopener noreferrer"&gt;how Nango differs from embedded iPaaS and unified APIs&lt;/a&gt;, &lt;a href="https://www.nango.dev/blog/what-is-an-embedded-ipaas" rel="noopener noreferrer"&gt;what is an embedded iPaaS&lt;/a&gt;, and &lt;a href="https://www.nango.dev/blog/what-is-a-unified-api" rel="noopener noreferrer"&gt;what is a unified API&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to look for in an agentic integrations platform
&lt;/h2&gt;

&lt;p&gt;Evaluate a platform against the build side, the run side, and the runtime that connects them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build side: Can AI coding agents build integrations on it?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A dedicated skill or SDK that encodes integration patterns (auth, pagination, delete detection, checkpoints, error handling) so the agent does not start from a blank file.&lt;/li&gt;
&lt;li&gt;Compatibility with the coding agents your team already uses: Claude Code, Cursor, Codex, Gemini CLI, GitHub Copilot, OpenCode.&lt;/li&gt;
&lt;li&gt;A testing command that executes generated code against a real connection and surfaces real API responses, so the agent can iterate on actual errors instead of hallucinating.&lt;/li&gt;
&lt;li&gt;Deployment through CI/CD with version control, unlimited environments, and no vendor-specific build pipeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Run side: Can AI agents consume integrations at runtime?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A built-in MCP server so agents speak a standard protocol.&lt;/li&gt;
&lt;li&gt;Typed tool calls with strict input and output schemas so the LLM does not guess parameters.&lt;/li&gt;
&lt;li&gt;Real-time triggers (webhooks, polling) so agents react to provider events, not just initiate requests.&lt;/li&gt;
&lt;li&gt;Data syncs to enhance the context of your agent (for example, RAG) and keep data fresh across millions of records.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Runtime and security:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Managed authentication across OAuth, API keys, JWT, basic auth, and &lt;a href="https://nango.dev/docs/updates/product#support-for-mcp-auth" rel="noopener noreferrer"&gt;MCP Auth&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;A white-label, drop-in auth UI so end users authorize under your brand, not the platform's.&lt;/li&gt;
&lt;li&gt;Tenant isolation and per-customer resource limits, since one customer's integration should never affect another's.&lt;/li&gt;
&lt;li&gt;Deep, real-time observability: full request and response logs, custom log messages, and OpenTelemetry export. Both agents and humans need to read failures.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nango.dev/docs/implementation-guides/use-cases/customer-configuration" rel="noopener noreferrer"&gt;Per-customer configuration&lt;/a&gt; for custom field mappings and tenant-specific behavior.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use this checklist when evaluating any platform in the category.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best agentic API integrations platforms
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Nango
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.nango.dev" rel="noopener noreferrer"&gt;Nango&lt;/a&gt; is an &lt;a href="https://github.com/NangoHQ/nango" rel="noopener noreferrer"&gt;open-source&lt;/a&gt; agentic API integrations platform. Coding agents can build and maintain integrations on it using the &lt;a href="https://nango.dev/docs/implementation-guides/platform/functions/leverage-ai-agents" rel="noopener noreferrer"&gt;Nango AI builder skill&lt;/a&gt;. AI agents inside your product call those integrations at runtime through an MCP server, tool calls, webhooks, and data syncs.&lt;/p&gt;

&lt;p&gt;Nango supports &lt;a href="https://nango.dev/api-integrations" rel="noopener noreferrer"&gt;700+ APIs&lt;/a&gt; out of the box and is used as core infrastructure by &lt;a href="https://www.nango.dev/customers" rel="noopener noreferrer"&gt;hundreds of fast-growing AI companies&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxstj222ohi4oab4muqw9.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxstj222ohi4oab4muqw9.gif" alt="NangoAPIsNew" width="720" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Teams building production AI agents that want coding agents to generate integrations on demand, with a secure and scalable runtime to execute them. Includes runtime primitives (MCP, tool calls, syncs, webhooks) to expose those integrations to the AI agents inside a SaaS product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI builder skill for 18+ coding agents:&lt;/strong&gt; Install with one command, and the skill gives Claude Code, Cursor, Codex, Gemini CLI, OpenCode, and others the context to research an API, write the integration, test it against a real connection, and iterate on real errors. See the walkthrough of &lt;a href="https://www.nango.dev/blog/how-to-build-a-real-time-google-calendar-api-integration" rel="noopener noreferrer"&gt;building a real-time Google Calendar API integration&lt;/a&gt; end-to-end with the Nango AI builder skill.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="c"&gt;# Install the Nango skills for your coding agent&lt;/span&gt;
  npx skills add NangoHQ/skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;  &lt;span class="c"&gt;&amp;lt;!-- Sample prompt --&amp;gt;&lt;/span&gt;

  Build a Nango sync that fetches events from the primary Google Calendar.

  Should run hourly, backfill on initial sync for the last 30 days and
  all future events. After the first run, only fetch future events
  incrementally.

  Return at least:
&lt;span class="p"&gt;  -&lt;/span&gt; Event title
&lt;span class="p"&gt;  -&lt;/span&gt; Start and end date
&lt;span class="p"&gt;  -&lt;/span&gt; Location
&lt;span class="p"&gt;  -&lt;/span&gt; RSVP status
&lt;span class="p"&gt;  -&lt;/span&gt; Attendees list (email, display name, response status)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbgwagsz736q2xu8i9q91.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbgwagsz736q2xu8i9q91.gif" alt="Claude Code building a Google Calendar sync using the Nango AI builder skill" width="560" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Test generated code against real APIs:&lt;/strong&gt; AI coding agents use the &lt;a href="https://nango.dev/docs/reference/cli" rel="noopener noreferrer"&gt;Nango CLI&lt;/a&gt;, which includes a &lt;code&gt;dryrun&lt;/code&gt; command that executes generated code against a real connection, returns real responses, and lets the agent iterate until tests pass. This closes the loop that most coding agents lack when building integrations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Built-in MCP server and typed tool calls:&lt;/strong&gt; Nango exposes every action as a typed, deterministic &lt;a href="https://nango.dev/docs/implementation-guides/use-cases/tool-calling/overview" rel="noopener noreferrer"&gt;tool call&lt;/a&gt; through a REST API or &lt;a href="https://nango.dev/docs/implementation-guides/use-cases/tool-calling/implement-mcp-server" rel="noopener noreferrer"&gt;MCP server&lt;/a&gt;. Agents see clear input and output schemas, reducing the risk of hallucinations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Beyond tool calls on the same platform:&lt;/strong&gt; Native &lt;a href="https://nango.dev/docs/implementation-guides/use-cases/syncs/implement-a-sync" rel="noopener noreferrer"&gt;data syncs for RAG&lt;/a&gt;, &lt;a href="https://nango.dev/docs/implementation-guides/use-cases/webhooks-from-external-apis" rel="noopener noreferrer"&gt;webhook processing&lt;/a&gt;, polling triggers, &lt;a href="https://nango.dev/docs/implementation-guides/use-cases/customer-configuration" rel="noopener noreferrer"&gt;per-customer configuration&lt;/a&gt;, and an extensible &lt;a href="https://www.nango.dev/blog/build-unified-api-for-product-integrations" rel="noopener noreferrer"&gt;unified API layer&lt;/a&gt;. Your agent can read context, react to events, and take actions all within the same platform.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;White-label auth across 700+ APIs:&lt;/strong&gt; A &lt;a href="https://nango.dev/docs/implementation-guides/platform/auth/implement-api-auth" rel="noopener noreferrer"&gt;drop-in UI component&lt;/a&gt; handles OAuth, API keys, JWT, basic auth, and MCP Auth. Custom credential validation and token refresh are built in. Your end users authorize under your brand.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9u89rt6u2jojrtvxmdhz.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9u89rt6u2jojrtvxmdhz.gif" alt="ConnectUICustom" width="600" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Low-overhead, tenant-isolated runtime:&lt;/strong&gt; Tool calls add less than 100ms of overhead. The &lt;a href="https://nango.dev/docs/updates/product#serverless-runtime-for-execution" rel="noopener noreferrer"&gt;serverless execution runtime&lt;/a&gt; automatically scales during traffic surges and isolates each customer. Syncs use &lt;a href="https://nango.dev/docs/implementation-guides/use-cases/syncs/checkpoints" rel="noopener noreferrer"&gt;durable checkpoints&lt;/a&gt; to resume across millions of records.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real-time observability with OpenTelemetry:&lt;/strong&gt; Every operation generates &lt;a href="https://nango.dev/docs/guides/platform/observability" rel="noopener noreferrer"&gt;structured logs&lt;/a&gt; with full request and response details. Custom log messages, full-text search, and export through OpenTelemetry. A coding agent can read a failing run, find the exception, and fix the code autonomously.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjz3ewrpmwhbtgdg5n3w2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjz3ewrpmwhbtgdg5n3w2.png" alt="Nango observability dashboard showing detailed API integration logs" width="800" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://nango.dev/docs/updates/product#playground" rel="noopener noreferrer"&gt;Playground&lt;/a&gt;:&lt;/strong&gt; Trigger syncs and actions from the dashboard to validate end-to-end behavior before wiring them into your product.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://nango.dev/docs/updates/product#role-based-access-control-rbac" rel="noopener noreferrer"&gt;Role-based access control&lt;/a&gt;:&lt;/strong&gt; Control who on your team can edit, deploy, or manage integrations and connections.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enterprise compliance and hosting:&lt;/strong&gt; &lt;a href="https://trust.nango.dev" rel="noopener noreferrer"&gt;SOC 2 Type II, GDPR, HIPAA&lt;/a&gt;. Enterprise self-hosting is available for teams that need full data isolation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Arcade
&lt;/h3&gt;

&lt;p&gt;Arcade is an MCP-native runtime for agent tool calling. It exposes a pre-built tool catalog, an SDK for custom MCP servers, and evaluation tools for testing agent behavior against scripted scenarios. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9xg19arcajickjutix33.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9xg19arcajickjutix33.png" alt="arcade-overview" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Teams building MCP-first agents focused on tool calling. Best suited if you don't need broader integration patterns like data syncs or webhooks, or AI coding agent support.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MCP-native: every tool runs through the Model Context Protocol, which standardizes how agents discover and call tools.&lt;/li&gt;
&lt;li&gt;Automatic user permission checks before tool execution.&lt;/li&gt;
&lt;li&gt;SDK to build custom MCP servers that run on Arcade's runtime.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Arcade's SDK targets human developers who write and package custom MCP servers locally. There is no dedicated skill for Claude Code, Cursor, or similar agents. No integrated testing loop against a real connection, and no path for a coding agent to author and deploy a new tool end-to-end inside Arcade.&lt;/li&gt;
&lt;li&gt;Tool calls are the only pattern. No data syncs to feed agent context, no webhook processing, no unified API layer.&lt;/li&gt;
&lt;li&gt;First-party integrations are approximately 112 as of March 2026 (48 hand-built, 57 auto-generated, plus community contributions).&lt;/li&gt;
&lt;li&gt;No per-customer configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Composio
&lt;/h3&gt;

&lt;p&gt;Composio is a developer-facing tool library for AI agents. It ships managed auth and a large catalog of pre-built tools wrapped in frameworks like LangChain, CrewAI, Autogen, and the OpenAI Agents SDK.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjcc8nypcv07n02pbel7o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjcc8nypcv07n02pbel7o.png" alt="composio-overview" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Teams that want an MCP server with a large pre-built catalog and managed auth. Best suited for internal productivity or personal automation agents rather than product teams needing custom tools or triggers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Catalog of 500+ apps accessible through one SDK.&lt;/li&gt;
&lt;li&gt;Managed authentication across supported APIs.&lt;/li&gt;
&lt;li&gt;Framework adapters for the most popular agent SDKs.&lt;/li&gt;
&lt;li&gt;SOC 2 and ISO certified.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No custom tools on the platform. You cannot deploy a tool you wrote yourself (or had a coding agent write) onto Composio's runtime. If a pre-built tool does not do what you need, you are blocked until Composio adds it.&lt;/li&gt;
&lt;li&gt;No custom triggers. Composio does not let you define webhook or schedule-based triggers for your integrations, so event-driven or scheduled work has to live elsewhere.&lt;/li&gt;
&lt;li&gt;There is no dedicated AI builder skill, no repo-level code-generation workflow, and no real API test loop to iterate on integration code.&lt;/li&gt;
&lt;li&gt;Tools are closed-source. You cannot inspect or modify the code of a pre-built tool.&lt;/li&gt;
&lt;li&gt;No data syncs to feed agent context, no webhook processing, no per-customer tool configuration.&lt;/li&gt;
&lt;li&gt;Observability is basic. You cannot add custom log messages, inspect full request and response details, or export traces via OpenTelemetry.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a deeper comparison, see our &lt;a href="https://www.nango.dev/blog/composio-alternatives" rel="noopener noreferrer"&gt;best Composio alternatives post&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparison table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Nango&lt;/th&gt;
&lt;th&gt;Arcade&lt;/th&gt;
&lt;th&gt;Composio&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AI coding agent skill (build-time)&lt;/td&gt;
&lt;td&gt;Yes, 18+ agents supported&lt;/td&gt;
&lt;td&gt;SDK only&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test against real API&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP server (runtime)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typed tool calls&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data syncs for agent context&lt;/td&gt;
&lt;td&gt;Yes (durable, incremental)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Webhook processing&lt;/td&gt;
&lt;td&gt;Yes (high-throughput)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-customer configuration&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Enterprise only&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;White-label auth UI&lt;/td&gt;
&lt;td&gt;Yes, drop-in&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open-source templates&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Partial (SDK)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-hosting&lt;/td&gt;
&lt;td&gt;Yes (Enterprise)&lt;/td&gt;
&lt;td&gt;VPC, on-prem&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Primary focus&lt;/td&gt;
&lt;td&gt;Full agentic platform (build + use)&lt;/td&gt;
&lt;td&gt;MCP runtime&lt;/td&gt;
&lt;td&gt;Tool library&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supported APIs&lt;/td&gt;
&lt;td&gt;700+&lt;/td&gt;
&lt;td&gt;~112 first-party&lt;/td&gt;
&lt;td&gt;500+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why AI coding agents change what "best" means
&lt;/h2&gt;

&lt;p&gt;The short answer is that "best" is no longer about who has the largest closed catalog. It is about the platform that lets your team ship integrations as fast as the coding agent can generate them, and exposes the result to AI agents reliably at runtime.&lt;/p&gt;

&lt;p&gt;Three loops compound here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Build loop:&lt;/strong&gt; An integration platform with good coding-agent skills, real-API testing, and secure, real-credential access lets an agent produce a working integration in under an hour. Without that loop, the agent hallucinates endpoints and ships non-working code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Run loop:&lt;/strong&gt; An agentic API integrations platform exposes every integration as a typed tool call or an MCP endpoint, with managed auth and observability, so the AI agent in your product can call it reliably in production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Maintain loop:&lt;/strong&gt; When an integration fails, the logs need to be accessible so that a coding agent, not just a human, can read the exception, trace the failing request, and ship a fix.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://nango.dev" rel="noopener noreferrer"&gt;Nango&lt;/a&gt; is the only platform in this comparison that treats all three loops as first-class, and the only one where the same code an agent builds today runs unmodified in a hardened tenant-isolated runtime tomorrow.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What makes a platform "agentic"?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A platform is agentic when AI agents are first-class on both sides. Coding agents can build and deploy integrations with a real testing loop. Product-facing AI agents can call those integrations as tool calls, MCP endpoints, or triggers at runtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is an agentic API integrations platform the same as a unified API?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. A unified API normalizes data from multiple providers into a single schema. It is built for backend engineers to query a fixed catalog. An agentic API integrations platform is built for AI agents on both sides: coding agents that produce integrations and product agents that consume them. Many agentic platforms can expose a unified API layer when needed, but that is one capability, not the whole category.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can AI coding agents like Claude Code or Cursor build integrations on these platforms?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Only where the platform ships a dedicated skill or harness. Nango's &lt;a href="https://nango.dev/docs/implementation-guides/platform/functions/leverage-ai-agents" rel="noopener noreferrer"&gt;AI builder skill&lt;/a&gt; works with 18+ coding agents and includes a test command that runs generated code against a real connection. Other platforms in this post provide SDKs but do not yet ship a production-grade coding-agent workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do AI agents need an MCP server?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not always. MCP is useful when the agent framework expects a standard protocol for discovering tools (for example, Claude Code or agents exposed through LangSmith). Many agent products also use REST APIs for integration, which is simpler and more deterministic. A good agentic platform supports both, so you pick per use case. See our note on &lt;a href="https://www.nango.dev/blog/build-reliable-tool-calls-for-ai-agents-integrating-with-external-apis#step-5-avoid-mcp-to-increase-control-and-reliability" rel="noopener noreferrer"&gt;avoiding MCP for production reliability&lt;/a&gt;, where custom tool calls are a better fit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How does an agentic integration platform help with just-in-time integrations?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.nango.dev/blog/just-in-time-integrations" rel="noopener noreferrer"&gt;Just-in-time integrations&lt;/a&gt; are generated on demand when a customer requests one in your product. The platform provides the sandbox where a coding agent writes the integration, the runtime that executes it with managed auth and tenant isolation, and the observability layer that lets agents read failures and fix themselves. Nango is the open-source factory for this pattern.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I use these platforms with LangChain, CrewAI, or the OpenAI Agents SDK?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. All three platforms in this post expose integrations via a combination of REST APIs, MCP servers, and native SDKs that work with LangChain, CrewAI, the OpenAI Agents SDK, the Vercel AI SDK, and the most popular agent frameworks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The "best agentic API integrations platform" is a simple question with a layered answer: the platform needs to serve AI coding agents that build integrations and AI agents that use them, on a runtime that a team can trust in production.&lt;/p&gt;

&lt;p&gt;Nango is the only platform in this comparison that treats both sides as first-class. Coding agents build and maintain integrations through the AI builder skill, testing generated code against real APIs end to end. Product-facing AI agents consume those integrations through an MCP server, tool calls, webhooks, and data syncs. Integrations are code in your repo, running on a secure and scalable runtime, so your team stays in control of every layer while AI agents do most of the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.nango.dev/blog/just-in-time-integrations" rel="noopener noreferrer"&gt;The emergence of just-in-time integrations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nango.dev/blog/using-ai-coding-agents-for-building-api-integrations" rel="noopener noreferrer"&gt;Using AI coding agents for building API integrations in 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nango.dev/blog/best-ai-agent-integration-platforms" rel="noopener noreferrer"&gt;Best AI agent integration platforms to consider in 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nango.dev/blog/best-ai-integration-platforms" rel="noopener noreferrer"&gt;Best AI integration platforms in 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nango.dev/blog/best-practices-for-building-api-integrations-with-ai-agents" rel="noopener noreferrer"&gt;Best practices for building API integrations with AI agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nango.dev/blog/best-ai-agent-authentication" rel="noopener noreferrer"&gt;Best AI agent authentication platforms in 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nango.dev/blog/why-ai-agents-meed-an-integrations-platform" rel="noopener noreferrer"&gt;Why AI agents need an integrations platform&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nango.dev/blog/how-is-nango-different-from-embedded-ipaas-or-unified-api" rel="noopener noreferrer"&gt;How is Nango different from embedded iPaaS or other unified APIs?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>agents</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Best Arcade.dev alternatives for AI agent integrations in 2026</title>
      <dc:creator>Sapnesh Naik</dc:creator>
      <pubDate>Tue, 21 Apr 2026 06:34:25 +0000</pubDate>
      <link>https://dev.to/nangohq/best-arcadedev-alternatives-for-ai-agent-integrations-in-2026-c1e</link>
      <guid>https://dev.to/nangohq/best-arcadedev-alternatives-for-ai-agent-integrations-in-2026-c1e</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Arcade.dev is an MCP runtime that executes authenticated tool calls for AI agents. It works well for MCP-first teams that need a hosted runtime and user-scoped auth. But production AI agents usually need more than tool calls: continuous data syncs for RAG, webhook ingestion, and deep observability across API integrations.&lt;/p&gt;

&lt;p&gt;If you are evaluating alternatives, pick the one that covers your full integration surface: not just the tool calls you need today, but the data syncs, webhooks, auth, and observability your agents will need once they ship to real customers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Top Arcade.dev alternatives for 2026:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nango:&lt;/strong&gt; Best for teams building production AI agent API integrations that need tool calls, data syncs, webhooks, and auth on a single code-first platform. Supports 700+ APIs with open-source tools and works with Claude Code, Cursor, and other AI coding agents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composio:&lt;/strong&gt; An MCP-native alternative aimed mainly at internal and personal automation agents. Larger pre-built catalog than Arcade (500+ apps), but closed-source tools and no data syncs, webhooks, or per-customer configuration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pipedream Connect:&lt;/strong&gt; Fits teams that prefer a low-code, UI-based workflow builder with a large action library.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Merge Agent Handler:&lt;/strong&gt; Fits teams that want pre-built MCP tool-packs for common SaaS actions and don't need custom tool logic or data syncs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why teams look for Arcade.dev alternatives
&lt;/h2&gt;

&lt;p&gt;Arcade.dev positions itself as the MCP runtime that makes AI agents production-ready. It handles OAuth, runs tool calls, and supports server-level and tool-level authorization.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmof8yo3das1eajabu46e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmof8yo3das1eajabu46e.png" alt="Arcade.dev platform overview" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That positioning works well for a specific profile: teams that are already committed to MCP, want a hosted runtime, and only need tool calls. But as teams move from prototyping to production API integrations, several limitations surface.&lt;/p&gt;

&lt;p&gt;Drawbacks of using Arcade for production AI agent integrations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tool calls only:&lt;/strong&gt; Arcade is a tool-calling runtime. It does not offer data syncs (for RAG pipelines), webhook ingestion, polling triggers, or unified APIs. If your AI product needs external data continuously kept up to date, or if it must react to events in Salesforce, HubSpot, or other systems, you need a separate platform.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Narrow first-party catalog:&lt;/strong&gt; Arcade lists around 24 &lt;a href="https://docs.arcade.dev/home/auth-providers" rel="noopener noreferrer"&gt;first-party OAuth providers&lt;/a&gt;, which is materially smaller than other platforms in this comparison. Many APIs are only reachable through community MCP servers of varying quality and maintenance.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx06cw172fsgz0zwu6xe1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx06cw172fsgz0zwu6xe1.png" alt="Arcade first-party OAuth provider list" width="800" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MCP-dependent architecture:&lt;/strong&gt; Every tool call flows through MCP. That is useful for prototyping, but &lt;a href="https://www.nango.dev/blog/build-reliable-tool-calls-for-ai-agents-integrating-with-external-apis#step-5-avoid-mcp-to-increase-control-and-reliability" rel="noopener noreferrer"&gt;generic MCP servers can reduce reliability&lt;/a&gt; in production: broad tool definitions inflate the LLM's context, and handing off multi-step logic to the agent increases hallucination risk.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Limited observability:&lt;/strong&gt; Arcade provides basic logs of tool executions. Teams that need full request and response payload inspection, custom log messages inside a tool, or OpenTelemetry export find the logging surface narrow.&lt;br&gt;
&lt;strong&gt;For example:&lt;/strong&gt; During our testing, we ran a suggested &lt;code&gt;/reddit&lt;/code&gt; tool call inside Arcade's Playground. It failed with an &lt;code&gt;invalid Client ID&lt;/code&gt; error, but the failed execution never showed up in the Audit Logs page. Small gaps like this point to a platform that is still maturing in production, where several features are described as aspirational or in progress.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzxt07k3sndx9qh540fgt.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzxt07k3sndx9qh540fgt.gif" alt="Arcade Playground failing a tool call with an invalid Client ID error" width="600" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7q6j78wwgjeg5bxalldo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7q6j78wwgjeg5bxalldo.png" alt="Arcade audit log missing the failed Playground execution" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No per-customer configuration:&lt;/strong&gt; Arcade tools are defined at the server level, not per tenant. There is no built-in support for tenant-specific custom field mappings, per-customer tool behavior, or custom auth validation. Every customer gets the same tool surface.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These constraints are manageable for chat assistants and prototypes. They become real limits when AI agents are a core product feature that must run reliably across customers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best Arcade.dev alternatives
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Nango
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.nango.dev" rel="noopener noreferrer"&gt;Nango&lt;/a&gt; is an open-source integration platform for AI agents and SaaS products. It provides a unified interface for &lt;a href="https://www.nango.dev/blog/best-ai-agent-authentication" rel="noopener noreferrer"&gt;API auth&lt;/a&gt;, custom tool calls, data syncs, webhooks, and an &lt;a href="https://nango.dev/docs/implementation-guides/use-cases/tool-calling/implement-mcp-server" rel="noopener noreferrer"&gt;MCP server&lt;/a&gt;, all on a single platform.&lt;/p&gt;

&lt;p&gt;Nango supports &lt;a href="https://www.nango.dev/api-integrations" rel="noopener noreferrer"&gt;700+ APIs&lt;/a&gt; out of the box and is used by &lt;a href="https://www.nango.dev/customers" rel="noopener noreferrer"&gt;hundreds of fast-growing AI agent companies&lt;/a&gt; as core infrastructure for their API integrations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fux79eej6utc5brqczrzt.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fux79eej6utc5brqczrzt.gif" alt="Nango pre-built integrations catalog" width="720" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Teams building production AI agent API integrations that need tool calls, data syncs for RAG, webhooks, and auth across a wide range of APIs on a single code-first platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Broad API coverage across 700+ APIs:&lt;/strong&gt; Pre-built auth for OAuth, API keys, JWT, basic auth, and the new &lt;a href="https://nango.dev/docs/updates/product#support-for-mcp-auth" rel="noopener noreferrer"&gt;MCP Auth&lt;/a&gt; standard. White-label by default, so end users authorize your app, not Nango. You can also contribute support for new APIs yourself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft3bz8nm2ot4quprf7tp1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft3bz8nm2ot4quprf7tp1.gif" alt="Nango white-label Connect UI for end-user authorization" width="600" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code-first with AI coding agent support:&lt;/strong&gt; Tool definitions are functions that live in your git repo and deploy through CI/CD. The &lt;a href="https://nango.dev/docs/implementation-guides/platform/functions/leverage-ai-agents" rel="noopener noreferrer"&gt;Nango AI Integration Builder&lt;/a&gt; works with Claude Code, Cursor, Codex, or any AI coding assistant, so you can generate and iterate on custom tools, syncs, and webhook handlers in minutes.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="c"&gt;# Install the Nango skills for your coding agent&lt;/span&gt;
  npx skills add NangoHQ/skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;  &lt;span class="c"&gt;&amp;lt;!-- Sample prompt --&amp;gt;&lt;/span&gt;

  Build a Nango sync that fetches events from the primary Google Calendar.

  Should run hourly, backfill on initial sync for the last 30 days and
  all future events. After the first run, only fetch future events
  incrementally.

  Return at least:
&lt;span class="p"&gt;  -&lt;/span&gt; Event title
&lt;span class="p"&gt;  -&lt;/span&gt; Start and end date
&lt;span class="p"&gt;  -&lt;/span&gt; Location
&lt;span class="p"&gt;  -&lt;/span&gt; RSVP status
&lt;span class="p"&gt;  -&lt;/span&gt; Attendees list (email, display name, response status)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fciasxlnsphj0z5cpvjzp.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fciasxlnsphj0z5cpvjzp.gif" alt="Building a Nango sync with an AI coding agent" width="600" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open-source, customizable tools:&lt;/strong&gt; Nango's &lt;a href="https://github.com/NangoHQ/integration-templates" rel="noopener noreferrer"&gt;pre-built integration templates&lt;/a&gt; are open source. You can clone an existing tool, modify it for your use case with a coding agent, and deploy it to your account. This is the opposite of the closed tool model used by many MCP-first platforms.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Built-in MCP server:&lt;/strong&gt; Nango exposes your custom tool calls through an &lt;a href="https://nango.dev/docs/implementation-guides/use-cases/tool-calling/implement-mcp-server" rel="noopener noreferrer"&gt;MCP server&lt;/a&gt;. The flow is Agent to Nango MCP to your own custom tools. That keeps the agent's context focused on the specific tools you have built instead of flooding it with hundreds of generic ones.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Beyond tool calls, on the same platform:&lt;/strong&gt; Native &lt;a href="https://nango.dev/docs/implementation-guides/use-cases/syncs/implement-a-sync" rel="noopener noreferrer"&gt;resumable data syncs&lt;/a&gt; (for RAG), &lt;a href="https://nango.dev/docs/implementation-guides/use-cases/webhooks-from-external-apis" rel="noopener noreferrer"&gt;webhook processing&lt;/a&gt;, polling triggers, and per-customer configuration. A built-in &lt;a href="https://nango.dev/docs/updates/product#playground" rel="noopener noreferrer"&gt;Playground&lt;/a&gt; lets you test tool calls, syncs, and triggers interactively before wiring them into your agent, and &lt;a href="https://nango.dev/docs/updates/product#role-based-access-control-rbac" rel="noopener noreferrer"&gt;role-based access control (RBAC)&lt;/a&gt; scopes access across teammates.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmoo96jidca9ccsxgwqin.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmoo96jidca9ccsxgwqin.gif" alt="Nango Playground for interactively testing tool calls, syncs, and triggers" width="560" height="320"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deep real-time observability:&lt;/strong&gt; Every operation generates &lt;a href="https://nango.dev/docs/guides/platform/observability" rel="noopener noreferrer"&gt;detailed logs&lt;/a&gt; with full API request and response details, error messages, and custom log messages. Everything exports via OpenTelemetry.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjfsp2ggd5mt2xytu8cih.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjfsp2ggd5mt2xytu8cih.png" alt="Nango logs dashboard with full request and response details" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scalable runtime with low overhead:&lt;/strong&gt; Nango adds less than 100ms overhead on tool calls, isolates each customer's executions with tenant-level fairness, and auto-scales under webhook bursts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enterprise-grade compliance:&lt;/strong&gt; &lt;a href="https://trust.nango.dev" rel="noopener noreferrer"&gt;SOC 2 Type II, GDPR, and HIPAA compliant&lt;/a&gt;. Enterprise self-hosting and VPC deployments available.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Composio
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Composio is an AI agent integration platform with a catalog of 500+ apps. It acts as an MCP gateway: every integration is automatically exposed through a standardized MCP interface, on top of managed OAuth and pre-built tool definitions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fca43ntx3bfmw0uy4dzmo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fca43ntx3bfmw0uy4dzmo.png" alt="Composio MCP platform overview" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Teams building internal or personal automation agents that want an MCP-native alternative to Arcade with a larger pre-built catalog and managed auth, and that do not need data syncs, webhooks, or per-customer configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Larger catalog than Arcade:&lt;/strong&gt; Pre-built tool definitions across 500+ apps, covering Slack, GitHub, Notion, Gmail, Salesforce, and more.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MCP gateway:&lt;/strong&gt; Every integration is auto-exposed through MCP so you can expose tools to MCP-Compatible clients (like Claude Desktop, Cursor)&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzvxiozm9cw1um4ea0dt9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzvxiozm9cw1um4ea0dt9.png" alt="Composio MCP gateway exposing tools to MCP-compatible clients" width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Managed OAuth:&lt;/strong&gt; Handles token acquisition, refresh, and scope management out of the box.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Broad framework support:&lt;/strong&gt; Works with LangChain, CrewAI, OpenAI Agents SDK, and the Vercel AI SDK.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Closed-source tools:&lt;/strong&gt; You cannot inspect or modify the code of Composio's pre-built tools. If a tool does not match your requirements, you build a replacement from scratch outside the platform.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No data syncs or webhooks:&lt;/strong&gt; Composio focuses on tool calls. RAG pipelines that need continuously updated external data, or agents that react to real-time events, require a separate system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limited per-customer configuration:&lt;/strong&gt; Every customer gets the same tool behavior. Tenant-specific field mappings, custom auth validation, or per-customer tool logic are not supported.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability constraints:&lt;/strong&gt; Basic execution logs. Custom log messages inside tool code and OpenTelemetry export are limited compared to code-first platforms.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feorjb0biozstrvqhcgqg.png" alt="Composio execution logs view" width="800" height="305"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Pipedream Connect
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pipedream Connect is the embedded version of Pipedream's serverless integration platform. It exposes MCP servers per app and gives agents access to a large library of pre-built actions across 2,800+ apps.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwdbnqm2qldj8b3gsnqq6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwdbnqm2qldj8b3gsnqq6.png" alt="Pipedream Connect product overview" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Teams that prefer a low-code workflow builder and need wide catalog coverage for internal-facing or lightly customized agent use cases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Large action library:&lt;/strong&gt; 10,000+ pre-built actions across 2,800+ apps give agents a wide default surface area.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP server per app:&lt;/strong&gt; Dedicated MCP servers per supported app, so agents can discover and call tools through the protocol.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low-code workflow builder:&lt;/strong&gt; Useful for teams that want to assemble multi-step tool-call logic visually.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Acquired by Workday:&lt;/strong&gt; Pipedream was acquired by Workday (an Enterprise HR platform) in November 2025. You can read their announcement &lt;a href="https://pipedream.com/blog/pipedream-to-be-acquired-by-workday/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-standard action schemas:&lt;/strong&gt; Action inputs use Pipedream-specific types ("alert props," "dynamic props," "external props") that require a learning curve and limit compatibility with external tooling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complex action configuration:&lt;/strong&gt; Most actions must be "configured" before they can run, often requiring 2-5 additional API requests. That adds latency and friction for background agents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No data syncs:&lt;/strong&gt; Pipedream Connect does not offer scheduled or incremental data syncs, so RAG implementations need another platform for ongoing data ingestion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limited white-label auth:&lt;/strong&gt; End users see Pipedream branding and consent to Pipedream during OAuth, which is a problem for enterprise-facing products.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Merge Agent Handler
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Merge Agent Handler is a separate product from Merge's traditional unified API. It lets teams create custom MCP servers with specific pre-built Merge integrations enabled, giving an AI agent a defined set of capabilities.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe9ohvgctjiddnhabz8iq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe9ohvgctjiddnhabz8iq.png" alt="Merge Agent Handler MCP server configuration" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Teams that only need pre-built MCP tool-packs for common SaaS actions (for example, fetch tickets from Linear, create an issue in GitHub) and do not need custom tool calls, data syncs, or custom object and field support for CRM and ERP integrations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pre-built tool-packs:&lt;/strong&gt; Bundle relevant integrations for a specific agent and restrict the available tools, for example a read-only tool-pack for ticketing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Playground:&lt;/strong&gt; A testing environment to validate MCP behavior before deploying.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public MCP import:&lt;/strong&gt; You can import any public MCP server and edit tool schemas to fit your agent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Narrow connector library:&lt;/strong&gt; Merge Agent Handler supports around 110 pre-built connectors. If the API you need is not covered, you fall back to public MCP servers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No custom tool calls:&lt;/strong&gt; You cannot build custom tool logic on the platform. Agents are constrained to the pre-built surface, which can force the LLM to chain multiple tool calls for a single business action.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Custom fields support:&lt;/strong&gt; Pre-built tools do not handle custom fields or objects well, which is common in enterprise Salesforce or HubSpot deployments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No data syncs:&lt;/strong&gt; No support for continuous data syncs, so RAG pipelines need a second platform.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Auth gaps:&lt;/strong&gt; Some APIs, such as &lt;a href="https://developers.hubspot.com/docs/apps/developer-platform/build-apps/integrate-with-the-remote-hubspot-mcp-server#create-an-mcp-auth-app" rel="noopener noreferrer"&gt;HubSpot's remote MCP server&lt;/a&gt;, require MCP Auth. Merge Agent Handler currently supports standard (non-MCP) auth for most providers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comparison of Arcade.dev alternatives
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Nango&lt;/th&gt;
&lt;th&gt;Composio&lt;/th&gt;
&lt;th&gt;Pipedream Connect&lt;/th&gt;
&lt;th&gt;Merge Agent Handler&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Primary focus&lt;/td&gt;
&lt;td&gt;Agentic, code-first AI agent and product integrations&lt;/td&gt;
&lt;td&gt;MCP-first tool calling&lt;/td&gt;
&lt;td&gt;Low-code embedded workflows&lt;/td&gt;
&lt;td&gt;Pre-built MCP tool-packs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supported APIs&lt;/td&gt;
&lt;td&gt;700+&lt;/td&gt;
&lt;td&gt;500+&lt;/td&gt;
&lt;td&gt;2,800+&lt;/td&gt;
&lt;td&gt;~110&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool customization&lt;/td&gt;
&lt;td&gt;Full (code-first, open source)&lt;/td&gt;
&lt;td&gt;Limited (closed tools)&lt;/td&gt;
&lt;td&gt;Low-code workflows&lt;/td&gt;
&lt;td&gt;No custom tool code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI agent (LLM) tool calls&lt;/td&gt;
&lt;td&gt;Yes (custom, code-first)&lt;/td&gt;
&lt;td&gt;Yes (pre-built)&lt;/td&gt;
&lt;td&gt;Yes (pre-built actions)&lt;/td&gt;
&lt;td&gt;Yes (pre-built)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI coding agent support (Claude Code, Cursor)&lt;/td&gt;
&lt;td&gt;Yes (optimized tools and skills)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP server&lt;/td&gt;
&lt;td&gt;Yes (on your custom tools)&lt;/td&gt;
&lt;td&gt;Yes (auto on all tools)&lt;/td&gt;
&lt;td&gt;Yes (per app)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data syncs for RAG&lt;/td&gt;
&lt;td&gt;Yes (native, incremental)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Webhook processing&lt;/td&gt;
&lt;td&gt;Yes (high throughput)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Triggers only&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-customer configuration&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observability&lt;/td&gt;
&lt;td&gt;Deep (OpenTelemetry, custom logs)&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth model&lt;/td&gt;
&lt;td&gt;White-label (your brand)&lt;/td&gt;
&lt;td&gt;Managed&lt;/td&gt;
&lt;td&gt;Pipedream-branded&lt;/td&gt;
&lt;td&gt;Platform-managed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Partial (closed tools)&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-hosting&lt;/td&gt;
&lt;td&gt;Yes (Enterprise)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How we evaluated these platforms
&lt;/h2&gt;

&lt;p&gt;We assessed each Arcade.dev alternative across five dimensions that matter for production AI agent integrations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Catalog breadth and extensibility:&lt;/strong&gt; How many APIs are supported out of the box? Can you add new APIs yourself without waiting on the vendor?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool customization:&lt;/strong&gt; Can you build and modify tool logic in code? Can AI coding agents (Claude Code, Cursor, Codex) help generate or refactor tools?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration patterns beyond tool calls:&lt;/strong&gt; Does the platform support data syncs for RAG, webhooks, polling triggers, and per-customer configuration?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observability:&lt;/strong&gt; Are there full request and response logs, custom log messages inside tool code, and OpenTelemetry export?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment and auth model:&lt;/strong&gt; Is auth white-label and tenant-safe? Is self-hosting available for regulated workloads?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Which alternative should you choose?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;You are building production AI agent integrations with broad requirements:&lt;/strong&gt; Choose Nango. It is the only platform in this comparison that combines pre-built tool calls, data syncs, webhooks, and unified APIs on a single code-first platform, with 700+ APIs and AI coding agent support for building custom tools fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You want an MCP-native alternative to Arcade with a larger catalog:&lt;/strong&gt; Consider Nango or Composio. They both give you pre-built tools behind an MCP gateway.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You prefer a low-code workflow builder with a large catalog:&lt;/strong&gt; Pipedream Connect fits, especially for internal-facing agents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You only need standard, pre-built tool-packs:&lt;/strong&gt; Merge Agent Handler can work for ticketing, CRM reads, and other common SaaS actions. Confirm that your APIs are supported and that you do not need data syncs or deep customization.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is the best Arcade.dev alternative for production AI agents?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nango is a strong fit for teams building production AI agent API integrations. It supports 700+ APIs, code-first custom tool calls with AI coding agent support, data syncs for RAG, webhooks, and deep observability with OpenTelemetry. Unlike Arcade, it is not limited to tool calls and exposes an MCP server on top of your own custom tools instead of relying on public MCP servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Arcade.dev support data syncs or webhooks?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Arcade.dev is a tool-calling runtime. It does not provide scheduled or incremental data syncs, webhook ingestion, or polling triggers. If your AI agent needs continuously updated external data for a RAG pipeline, or must react to events in Salesforce or HubSpot, you need a separate platform. Nango supports all of these on a single platform alongside tool calls.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Arcade.dev open source?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Arcade.dev's SDK and MCP server framework are open source, so you can build custom MCP servers and self-host. The platform itself (runtime, catalog, managed auth) is a hosted product. Nango, by contrast, is fully &lt;a href="https://github.com/NangoHQ/nango" rel="noopener noreferrer"&gt;open source on GitHub&lt;/a&gt;, and all of its pre-built integration templates are open and editable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I use Arcade.dev alternatives with LangChain, CrewAI, or the OpenAI Agents SDK?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. Nango, Composio, Pipedream Connect, and Merge Agent Handler all expose tools through standard interfaces (REST APIs and/or MCP servers) that work with any agent framework. Nango's MCP server and REST API integrate with LangChain, CrewAI, OpenAI Agents SDK, Vercel AI SDK, and Mastra. Composio is MCP-native and works with any MCP-compatible client.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I build custom tools with Arcade.dev alternatives using AI coding agents?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No, not with Arcade itself. But Nango is designed for this: tool definitions are code, and the &lt;a href="https://nango.dev/docs/implementation-guides/platform/functions/leverage-ai-agents" rel="noopener noreferrer"&gt;Nango AI Integration Builder&lt;/a&gt; provides skills for Claude Code, Cursor, and other coding assistants to generate and refine tool calls, data syncs, and webhook handlers. Composio, Arcade, Pipedream Connect, and Merge Agent Handler do not ship dedicated AI coding agent integrations for building tools on their platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Arcade.dev is a focused MCP runtime that fits teams with strict MCP-first requirements and simple tool-calling workloads. Once AI agent integrations become a core product surface, the tool-calling-only scope, narrow first-party catalog, and basic observability start to matter.&lt;/p&gt;

&lt;p&gt;Nango covers the broadest set of production requirements on a single platform: 700+ APIs, custom tool calls, data syncs for RAG, webhooks, unified APIs, and deep observability, with AI coding agent support for building everything fast. Composio is a closer direct alternative to Arcade if your scope stays inside MCP tool calls. Pipedream Connect and Merge Agent Handler cover narrower low-code and pre-built use cases.&lt;/p&gt;

&lt;p&gt;Start with the hardest integration requirement in your product roadmap. The platform that handles it today will carry you further as your AI agents scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Related reading:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.nango.dev/blog/build-reliable-tool-calls-for-ai-agents-integrating-with-external-apis" rel="noopener noreferrer"&gt;How to build reliable tool calls for AI agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nango.dev/blog/best-practices-for-building-api-integrations-with-ai-agents" rel="noopener noreferrer"&gt;Best practices for building API integrations with AI agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nango.dev/blog/best-ai-agent-integration-platforms" rel="noopener noreferrer"&gt;Best AI agent integration platforms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nango.dev/blog/best-ai-agent-authentication" rel="noopener noreferrer"&gt;Best AI agent authentication platforms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nango.dev/blog/composio-alternatives" rel="noopener noreferrer"&gt;Best Composio alternatives for AI agent integrations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nango.dev/blog/pipedream-connect-alternatives" rel="noopener noreferrer"&gt;Best Pipedream Connect alternatives for AI integrations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>mcp</category>
      <category>api</category>
    </item>
  </channel>
</rss>
