<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>HTTP API | Electric</title>
    <meta name="description" content="The HTTP API is the primary, low level API for syncing data with Electric.">
    <meta name="generator" content="VitePress v1.5.0">
    <link rel="preload stylesheet" href="/assets/style.DmylcGW8.css" as="style">
    <link rel="preload stylesheet" href="/vp-icons.css" as="style">
    
    <script type="module" src="/assets/app.CGNGfchQ.js"></script>
    <link rel="modulepreload" href="/assets/src_partials_home-features-after.md.B1J3LLuX.js">
    <link rel="modulepreload" href="/assets/chunks/framework.BA3cFARW.js">
    <link rel="modulepreload" href="/assets/chunks/shape-log.sm.DNGHdijt.js">
    <link rel="modulepreload" href="/assets/docs_api_http.md.wkTa9jP7.lean.js">
    <link rel="icon" type="image/png" href="/img/brand/favicon.png">
    <link rel="icon" type="image/svg+xml" href="/img/brand/favicon.svg">
    <link rel="prerender" href="https://airtable.com/embed/appDitPIpjlAxK7CL/pagrWjq3qw5Fp68Wa/form">
    <script defer data-domain="electric-sql.com" src="https://plausible.io/js/script.js"></script>
    <script id="check-dark-mode">document.documentElement.classList.add("dark");</script>
    <script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
    <meta name="twitter:card" content="summary_large_image">
    <meta name="twitter:site" content="@ElectricSQL">
    <meta name="twitter:title" content="HTTP API | ElectricSQL">
    <meta name="twitter:description" content="The HTTP API is the primary, low level API for syncing data with Electric.">
    <meta name="twitter:image" content="https://electric-sql.com/.netlify/images?url=https%3A%2F%2Felectric-sql.com%2Fimg%2Fmeta%2Felectric-sync-primitives.jpg&amp;w=1200&amp;h=630&amp;fit=cover&amp;fm=jpg&amp;q=80">
    <meta property="og:title" content="HTTP API | ElectricSQL">
    <meta property="og:description" content="The HTTP API is the primary, low level API for syncing data with Electric.">
    <meta property="og:image" content="https://electric-sql.com/.netlify/images?url=https%3A%2F%2Felectric-sql.com%2Fimg%2Fmeta%2Felectric-sync-primitives.jpg&amp;w=1200&amp;h=630&amp;fit=cover&amp;fm=jpg&amp;q=80">
  </head>
  <body>
    <div id="app"><div class="Layout" data-v-a29e6ba2><!--[--><!--]--><!--[--><span tabindex="-1" data-v-c3906ed2></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-c3906ed2> Skip to content </a><!--]--><!----><header class="VPNav" data-v-a29e6ba2 data-v-388babf5><div class="VPNavBar" data-v-388babf5 data-v-5d557444><div class="wrapper" data-v-5d557444><div class="container" data-v-5d557444><div class="title" data-v-5d557444><div class="VPNavBarTitle has-sidebar" data-v-5d557444 data-v-ac766fc0><a class="title" href="/" data-v-ac766fc0><!--[--><!--]--><!--[--><img class="VPImage logo" src="/img/brand/logo.svg" alt data-v-2d46c176><!--]--><!----><!--[--><!--]--></a></div></div><div class="content" data-v-5d557444><div class="content-body" data-v-5d557444><!--[--><!--]--><div class="VPNavBarSearch search" data-v-5d557444><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-5d557444 data-v-e138a194><span id="main-nav-aria-label" class="visually-hidden" data-v-e138a194> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/sync" tabindex="0" data-v-e138a194 data-v-4ebd574a><!--[--><span data-v-4ebd574a>Sync</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/primitives" tabindex="0" data-v-e138a194 data-v-4ebd574a><!--[--><span data-v-4ebd574a>Primitives</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/cloud" tabindex="0" data-v-e138a194 data-v-4ebd574a><!--[--><span data-v-4ebd574a>Cloud</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/pricing" tabindex="0" data-v-e138a194 data-v-4ebd574a><!--[--><span data-v-4ebd574a>Pricing</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink active" href="/docs/intro" tabindex="0" data-v-e138a194 data-v-4ebd574a><!--[--><span data-v-4ebd574a>Docs</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/demos" tabindex="0" data-v-e138a194 data-v-4ebd574a><!--[--><span data-v-4ebd574a>Demos</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/blog" tabindex="0" data-v-e138a194 data-v-4ebd574a><!--[--><span data-v-4ebd574a>Blog</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/about/community" tabindex="0" data-v-e138a194 data-v-4ebd574a><!--[--><span data-v-4ebd574a>About</span><!--]--></a><!--]--><!--[--><div class="nav-item VPNavBarMenuLink VPNavBarCTA" data-v-e138a194 data-v-f78c127b><div class="cta-lg" data-v-f78c127b><a class="VPButton medium brand" href="https://dashboard.electric-sql.cloud/" target="_blank" rel="noreferrer" data-v-f78c127b data-v-c160c05e>Go to Cloud</a></div><div class="cta-md" data-v-f78c127b><a class="VPButton medium brand" href="https://dashboard.electric-sql.cloud/" target="_blank" rel="noreferrer" data-v-f78c127b data-v-c160c05e>Cloud</a></div><div class="cta-sm" data-v-f78c127b><a class="VPButton medium brand" href="https://dashboard.electric-sql.cloud/" target="_blank" rel="noreferrer" data-v-f78c127b data-v-c160c05e>Go to Cloud</a></div></div><!--]--><!--]--></nav><!----><!----><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-5d557444 data-v-c62242fd data-v-e5810ca3><!--[--><a class="VPSocialLink no-icon" href="https://durablestreams.com" aria-label="durable-streams" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-durable-streams"></span></a><a class="VPSocialLink no-icon" href="https://tanstack.com/db" aria-label="tanstack" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-tanstack"></span></a><a class="VPSocialLink no-icon" href="https://pglite.dev" aria-label="pglite" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-pglite"></span></a><a class="VPSocialLink no-icon" href="https://x.com/ElectricSQL" aria-label="x" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-x"></span></a><a class="VPSocialLink no-icon" href="https://discord.electric-sql.com" aria-label="discord" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-discord"></span></a><a class="VPSocialLink no-icon" href="https://github.com/electric-sql/electric" aria-label="github" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-github"></span></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-5d557444 data-v-73029a02 data-v-8015fcbb><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-8015fcbb><span class="vpi-more-horizontal icon" data-v-8015fcbb></span></button><div class="menu" data-v-8015fcbb><div class="VPMenu" data-v-8015fcbb data-v-cbddf0cc><!----><!--[--><!--[--><!----><!----><div class="group" data-v-73029a02><div class="item social-links" data-v-73029a02><div class="VPSocialLinks social-links-list" data-v-73029a02 data-v-e5810ca3><!--[--><a class="VPSocialLink no-icon" href="https://durablestreams.com" aria-label="durable-streams" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-durable-streams"></span></a><a class="VPSocialLink no-icon" href="https://tanstack.com/db" aria-label="tanstack" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-tanstack"></span></a><a class="VPSocialLink no-icon" href="https://pglite.dev" aria-label="pglite" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-pglite"></span></a><a class="VPSocialLink no-icon" href="https://x.com/ElectricSQL" aria-label="x" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-x"></span></a><a class="VPSocialLink no-icon" href="https://discord.electric-sql.com" aria-label="discord" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-discord"></span></a><a class="VPSocialLink no-icon" href="https://github.com/electric-sql/electric" aria-label="github" target="_blank" rel="noopener" data-v-e5810ca3 data-v-f0af069a><span class="vpi-social-github"></span></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--[--><!--[--><div class="nav-item VPNavBarMenuLink VPNavBarCTA" data-v-f78c127b><div class="cta-lg" data-v-f78c127b><a class="VPButton medium brand" href="https://dashboard.electric-sql.cloud/" target="_blank" rel="noreferrer" data-v-f78c127b data-v-c160c05e>Go to Cloud</a></div><div class="cta-md" data-v-f78c127b><a class="VPButton medium brand" href="https://dashboard.electric-sql.cloud/" target="_blank" rel="noreferrer" data-v-f78c127b data-v-c160c05e>Cloud</a></div><div class="cta-sm" data-v-f78c127b><a class="VPButton medium brand" href="https://dashboard.electric-sql.cloud/" target="_blank" rel="noreferrer" data-v-f78c127b data-v-c160c05e>Go to Cloud</a></div></div><!--]--><!--]--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-5d557444 data-v-998521f3><span class="container" data-v-998521f3><span class="top" data-v-998521f3></span><span class="middle" data-v-998521f3></span><span class="bottom" data-v-998521f3></span></span></button></div></div></div></div><div class="divider" data-v-5d557444><div class="divider-line" data-v-5d557444></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-a29e6ba2 data-v-c84339ae><div class="container" data-v-c84339ae><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-c84339ae><span class="vpi-align-left menu-icon" data-v-c84339ae></span><span class="menu-text" data-v-c84339ae>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-c84339ae data-v-91cce16e><button data-v-91cce16e>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-a29e6ba2 data-v-0a014151><div class="curtain" data-v-0a014151></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-0a014151><span class="visually-hidden" id="sidebar-aria-label" data-v-0a014151> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-665c6ffe><section class="VPSidebarItem level-0 collapsible" data-v-665c6ffe data-v-f65b8172><div class="item" role="button" tabindex="0" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><h2 class="text" data-v-f65b8172>Docs</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-f65b8172><span class="vpi-chevron-right caret-icon" data-v-f65b8172></span></div></div><div class="items" data-v-f65b8172><!--[--><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/intro" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Intro</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/quickstart" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Quickstart</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/stacks" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Stacks</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/agents" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>AGENTS.md</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-665c6ffe><section class="VPSidebarItem level-0 collapsible" data-v-665c6ffe data-v-f65b8172><div class="item" role="button" tabindex="0" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><h2 class="text" data-v-f65b8172>Guides</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-f65b8172><span class="vpi-chevron-right caret-icon" data-v-f65b8172></span></div></div><div class="items" data-v-f65b8172><!--[--><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/guides/auth" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Auth</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/guides/shapes" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Shapes</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/guides/writes" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Writes</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/guides/installation" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Installation</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/guides/postgres-permissions" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>PostgreSQL Permissions</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/guides/deployment" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Deployment</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/guides/upgrading" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Upgrading</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/guides/sharding" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Sharding</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/guides/security" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Security</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/guides/troubleshooting" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Troubleshooting</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/guides/client-development" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Client development</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-665c6ffe><section class="VPSidebarItem level-0 collapsible has-active" data-v-665c6ffe data-v-f65b8172><div class="item" role="button" tabindex="0" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><h2 class="text" data-v-f65b8172>API</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-f65b8172><span class="vpi-chevron-right caret-icon" data-v-f65b8172></span></div></div><div class="items" data-v-f65b8172><!--[--><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/api/http" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>HTTP</p><!--]--></a><!----></div><!----></div><section class="VPSidebarItem level-1 collapsible" data-v-f65b8172 data-v-f65b8172><div class="item" role="button" tabindex="0" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><h3 class="text" data-v-f65b8172>Clients</h3><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-f65b8172><span class="vpi-chevron-right caret-icon" data-v-f65b8172></span></div></div><div class="items" data-v-f65b8172><!--[--><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/api/clients/typescript" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>TypeScript</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/api/clients/elixir" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Elixir</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/api/config" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Config</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-665c6ffe><section class="VPSidebarItem level-0 collapsible" data-v-665c6ffe data-v-f65b8172><div class="item" role="button" tabindex="0" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><h2 class="text" data-v-f65b8172>Integrations</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-f65b8172><span class="vpi-chevron-right caret-icon" data-v-f65b8172></span></div></div><div class="items" data-v-f65b8172><!--[--><section class="VPSidebarItem level-1" data-v-f65b8172 data-v-f65b8172><div class="item" role="button" tabindex="0" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><h3 class="text" data-v-f65b8172>Frameworks</h3><!----></div><div class="items" data-v-f65b8172><!--[--><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/livestore" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>LiveStore</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/mobx" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>MobX</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/next" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Next.js</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/phoenix" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Phoenix</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/react" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>React</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/redis" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Redis</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/tanstack" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>TanStack</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/yjs" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Yjs</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1" data-v-f65b8172 data-v-f65b8172><div class="item" role="button" tabindex="0" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><h3 class="text" data-v-f65b8172>Platforms</h3><!----></div><div class="items" data-v-f65b8172><!--[--><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/aws" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>AWS</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/cloudflare" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Cloudflare</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/crunchy" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Crunchy</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/digital-ocean" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Digital Ocean</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/expo" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Expo</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/fly" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Fly.io</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/gcp" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>GCP</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/neon" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Neon</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/netlify" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Netlify</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/planetscale" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>PlanetScale</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/render" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Render</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/integrations/supabase" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Supabase</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section></div><div class="no-transition group" data-v-665c6ffe><section class="VPSidebarItem level-0 collapsible" data-v-665c6ffe data-v-f65b8172><div class="item" role="button" tabindex="0" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><h2 class="text" data-v-f65b8172>Reference</h2><div class="caret" role="button" aria-label="toggle section" tabindex="0" data-v-f65b8172><span class="vpi-chevron-right caret-icon" data-v-f65b8172></span></div></div><div class="items" data-v-f65b8172><!--[--><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/reference/alternatives" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Alternatives</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/reference/benchmarks" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Benchmarks</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/reference/literature" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Literature</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-f65b8172 data-v-f65b8172><div class="item" data-v-f65b8172><div class="indicator" data-v-f65b8172></div><a class="VPLink link link" href="/docs/reference/telemetry" data-v-f65b8172><!--[--><p class="text" data-v-f65b8172>Telemetry</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-a29e6ba2 data-v-93396c71><div class="VPDoc has-sidebar has-aside" data-v-93396c71 data-v-e5fa90be><!--[--><!--[--><!--[--><div class="markdown-link-local-nav-container"><a class="markdown-link-local-nav" href="/docs/api/http.md" target="_blank" rel="noopener" data-v-c9b8e4a6><span class="title" data-v-c9b8e4a6>✨ Markdown</span></a></div><div class="custom-local-nav-dropdown"><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-bf359f67><button data-v-bf359f67>Return to top</button><!----></div></div><!--]--><!--]--><!--]--><div class="container" data-v-e5fa90be><div class="aside" data-v-e5fa90be><div class="aside-curtain" data-v-e5fa90be></div><div class="aside-container" data-v-e5fa90be><div class="aside-content" data-v-e5fa90be><div class="VPDocAside" data-v-e5fa90be data-v-3e59a195><!--[--><!--]--><!--[--><!--[--><!--[--><!--[--><a class="markdown-link-aside pager-link" href="/docs/api/http.md" target="_blank" rel="noopener" data-v-c9b8e4a6><span class="title" data-v-c9b8e4a6>✨ Markdown</span></a><!--]--><!--]--><!--]--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-3e59a195 data-v-2fe00466><div class="content" data-v-2fe00466><div class="outline-marker" data-v-2fe00466></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-2fe00466>On this page</div><ul class="VPDocOutlineItem root" data-v-2fe00466 data-v-1c0671af><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-3e59a195></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-e5fa90be><div class="content-container" data-v-e5fa90be><!--[--><!--]--><main class="main" data-v-e5fa90be><div style="position:relative;" class="vp-doc _docs_api_http" data-v-e5fa90be><div><div style="display:none;" hidden="true" aria-hidden="true">Are you an LLM? You can read better optimized documentation at /docs/api/http.md for this page in Markdown format</div><h1 id="http-api" tabindex="-1">HTTP API <a class="header-anchor" href="#http-api" aria-label="Permalink to &quot;HTTP API&quot;">​</a></h1><p>The HTTP API is the primary, low level API for syncing data with Electric.</p><h2 id="http-api-specification" tabindex="-1">HTTP API specification <a class="header-anchor" href="#http-api-specification" aria-label="Permalink to &quot;HTTP API specification&quot;">​</a></h2><p>API documentation is published as an <a href="https://www.openapis.org/what-is-openapi" target="_blank" rel="noreferrer">OpenAPI</a> specification:</p><ul><li><a href="https://github.com/electric-sql/electric/blob/main/website/electric-api.yaml" target="_blank" rel="noreferrer">download the specification file</a> to view or use with other OpenAPI <a href="https://tools.openapis.org/" target="_blank" rel="noreferrer">tooling</a></li><li><a href='/openapi' target='_blank'>view the HTML documentation</a> generated using <a href="https://redocly.com" target="_blank" rel="noreferrer">Redocly</a></li></ul><p>The rest of this page will describe the features of the API.</p><div class="tip custom-block"><p class="custom-block-no-title">💡 If you haven&#39;t already, you may like to walkthrough the <a href="/docs/quickstart">Quickstart</a> to get a feel for using the HTTP API.</p></div><div class="warning custom-block"><p class="custom-block-title">Production Best Practice</p><p>While this page documents the HTTP API directly, <strong>production applications should proxy Electric requests through your backend API</strong> rather than exposing Electric directly to clients. This provides security, authorization, and a clean API interface. See the <a href="/docs/guides/auth">authentication guide</a> for implementation details.</p></div><h2 id="syncing-shapes" tabindex="-1">Syncing shapes <a class="header-anchor" href="#syncing-shapes" aria-label="Permalink to &quot;Syncing shapes&quot;">​</a></h2><p>The API allows you to sync <a href="/docs/guides/shapes">Shapes</a> of data out of Postgres using the <a href='/openapi#/paths/~1v1~1shape/get' target='_blank'><code>GET /v1/shape</code></a> endpoint. The pattern is as follows.</p><p>First you make an initial sync request to get the current data for the Shape, such as:</p><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span style="color:#B392F0;">curl</span><span style="color:#79B8FF;"> -i</span><span style="color:#9ECBFF;"> &#39;http://localhost:3000/v1/shape?table=foo&amp;offset=-1&#39;</span></span></code></pre></div><p>Then you switch into a live mode to use long-polling to receive real-time updates. We&#39;ll go over these steps in more detail below. First a note on the data that the endpoint returns.</p><h3 id="shape-log" tabindex="-1">Shape Log <a class="header-anchor" href="#shape-log" aria-label="Permalink to &quot;Shape Log&quot;">​</a></h3><p>When you sync a shape from Electric, you get the data in the form of a log of logical database operations. This is the <strong>Shape Log</strong>.</p><p>The <code>offset</code> that you see in the messages and provide as the <code>?offset=...</code> query parameter in your request identifies a position in the log. The messages you see in the response are shape log entries (the ones with <code>value</code>s and <code>action</code> headers) and control messages (the ones with <code>control</code> headers).</p><p>The Shape Log is similar conceptually to the logical replication stream from Postgres. Except that instead of getting all the database operations, you&#39;re getting the ones that affect the data in your Shape. It&#39;s then the responsibility of the client to consume the log and materialize out the current value of the shape.</p><figure><a href="/img/api/shape-log.jpg"><img srcset="/img/api/shape-log.sm.png 1064w, /img/api/shape-log.png 1396w" sizes="(max-width: 767px) 600px, 1396px" src="/img/api/shape-log.png" alt="Shape log flow diagram"></a><figcaption class="figure-caption text-end"> Shape log flow diagram. </figcaption></figure><p>The values included in the shape log are strings formatted according to Postgres&#39; display settings. The <a href='/openapi' target='_blank'>OpenAPI specification</a> defines the display settings the HTTP API adheres to.</p><h3 id="initial-sync-request" tabindex="-1">Initial sync request <a class="header-anchor" href="#initial-sync-request" aria-label="Permalink to &quot;Initial sync request&quot;">​</a></h3><p>When you make an initial sync request, with <code>offset=-1</code>, you&#39;re telling the server that you want the whole log, from the start for a given shape.</p><p>When a shape is first requested, Electric queries Postgres for the data and populates the log by turning the query results into insert operations. This allows you to sync shapes without having to pre-define them. Electric then streams out the log data in the response.</p><p>Sometimes a log can fit in a single response. Sometimes it&#39;s too big and requires multiple requests. In this case, the first request will return a batch of data and an <code>electric-offset</code> header. An HTTP client should then continue to make requests setting the <code>offset</code> parameter to this header value. This allows the client to paginate through the shape log until it has received all of the current data.</p><h3 id="control-messages" tabindex="-1">Control messages <a class="header-anchor" href="#control-messages" aria-label="Permalink to &quot;Control messages&quot;">​</a></h3><p>The client will then receive an <code>up-to-date</code> control message at the end of the response data:</p><div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span style="color:#E1E4E8;">{ </span><span style="color:#79B8FF;">&quot;headers&quot;</span><span style="color:#E1E4E8;">: { </span><span style="color:#79B8FF;">&quot;control&quot;</span><span style="color:#E1E4E8;">: </span><span style="color:#9ECBFF;">&quot;up-to-date&quot;</span><span style="color:#E1E4E8;"> } }</span></span></code></pre></div><p>This indicates that the client has all the data that the server was aware of when fulfilling the request. The client can then switch into live mode to receive real-time updates.</p><div class="info custom-block"><p class="custom-block-title">Must-refetch</p><p>Note that the other control message is <code>must-refetch</code> which indicates that the client must throw away their local shape data and re-sync from scratch:</p><div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span style="color:#E1E4E8;">{ </span><span style="color:#79B8FF;">&quot;headers&quot;</span><span style="color:#E1E4E8;">: { </span><span style="color:#79B8FF;">&quot;control&quot;</span><span style="color:#E1E4E8;">: </span><span style="color:#9ECBFF;">&quot;must-refetch&quot;</span><span style="color:#E1E4E8;"> } }</span></span></code></pre></div></div><div class="info custom-block"><p class="custom-block-title">Snapshot-end</p><p>A third control message is <code>snapshot-end</code>, which marks the end of a subset snapshot request. This message includes PostgreSQL snapshot metadata that allows clients to determine which changes have been incorporated into the snapshot:</p><div class="language-json"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span style="color:#E1E4E8;">{</span></span>
<span class="line"><span style="color:#79B8FF;">  &quot;headers&quot;</span><span style="color:#E1E4E8;">: {</span></span>
<span class="line"><span style="color:#79B8FF;">    &quot;control&quot;</span><span style="color:#E1E4E8;">: </span><span style="color:#9ECBFF;">&quot;snapshot-end&quot;</span><span style="color:#E1E4E8;">,</span></span>
<span class="line"><span style="color:#79B8FF;">    &quot;xmin&quot;</span><span style="color:#E1E4E8;">: </span><span style="color:#9ECBFF;">&quot;1234&quot;</span><span style="color:#E1E4E8;">,</span></span>
<span class="line"><span style="color:#79B8FF;">    &quot;xmax&quot;</span><span style="color:#E1E4E8;">: </span><span style="color:#9ECBFF;">&quot;1240&quot;</span><span style="color:#E1E4E8;">,</span></span>
<span class="line"><span style="color:#79B8FF;">    &quot;xip_list&quot;</span><span style="color:#E1E4E8;">: [</span><span style="color:#9ECBFF;">&quot;1235&quot;</span><span style="color:#E1E4E8;">, </span><span style="color:#9ECBFF;">&quot;1237&quot;</span><span style="color:#E1E4E8;">]</span></span>
<span class="line"><span style="color:#E1E4E8;">  }</span></span>
<span class="line"><span style="color:#E1E4E8;">}</span></span></code></pre></div></div><h3 id="live-mode" tabindex="-1">Live mode <a class="header-anchor" href="#live-mode" aria-label="Permalink to &quot;Live mode&quot;">​</a></h3><p>Once a client is up-to-date, it can switch to live mode to receive real-time updates, by making requests with <code>live=true</code>, an <code>offset</code> and a shape <code>handle</code>, e.g.:</p><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span style="color:#B392F0;">curl</span><span style="color:#79B8FF;"> -i</span><span style="color:#9ECBFF;"> &#39;http://localhost:3000/v1/shape?table=foo&amp;live=true&amp;handle=3833821-1721812114261&amp;offset=0_0&#39;</span></span></code></pre></div><p>The <code>live</code> parameter puts the server into live mode, where it will hold open the connection, waiting for new data arrive. This allows you to implement a long-polling strategy to consume real-time updates.</p><p>The server holds open the request until either a timeout (returning <code>200</code> with only an up-to-date message) or when new data is available, which it sends back as the response. The client then reconnects and the server blocks again for new content. This way the client is always updated as soon as new data is available.</p><h4 id="server-sent-events-sse" tabindex="-1">Server-Sent Events (SSE) <a class="header-anchor" href="#server-sent-events-sse" aria-label="Permalink to &quot;Server-Sent Events (SSE)&quot;">​</a></h4><p>Electric also supports Server-Sent Events (SSE) as a more efficient alternative to long polling for live mode. SSE provides a persistent connection that allows the server to push updates to the client as they happen, reducing request overhead and latency.</p><p>To use SSE for live updates, add the <code>live_sse=true</code> parameter along with <code>live=true</code>:</p><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span style="color:#B392F0;">curl</span><span style="color:#79B8FF;"> -i</span><span style="color:#9ECBFF;"> &#39;http://localhost:3000/v1/shape?table=foo&amp;live=true&amp;live_sse=true&amp;handle=3833821-1721812114261&amp;offset=0_0&#39;</span></span></code></pre></div><p><strong>SSE Message Format</strong></p><p>When using SSE, messages are sent in the standard SSE format with <code>data:</code> prefixes:</p><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span>data: {&quot;headers&quot;:{&quot;operation&quot;:&quot;insert&quot;},&quot;key&quot;:&quot;1&quot;,&quot;value&quot;:{&quot;id&quot;:&quot;1&quot;,&quot;title&quot;:&quot;Hello&quot;}}</span></span>
<span class="line"><span></span></span>
<span class="line"><span>data: {&quot;headers&quot;:{&quot;control&quot;:&quot;up-to-date&quot;,&quot;global_last_seen_lsn&quot;:&quot;0/1234567&quot;}}</span></span>
<span class="line"><span></span></span>
<span class="line"><span>: keep-alive</span></span></code></pre></div><p>The SSE stream includes:</p><ul><li><strong>Data messages</strong>: Shape log entries in JSON format, prefixed with <code>data:</code></li><li><strong>Control messages</strong>: Same format as long polling (up-to-date, must-refetch, etc.)</li><li><strong>Keep-alive comments</strong>: Sent as <code>: keep-alive</code> every 21 seconds to prevent connection timeout</li></ul><p><strong>When to use SSE vs Long Polling</strong></p><p>SSE advantages:</p><ul><li>Fewer HTTP requests - the client doesn&#39;t need to reconnect after each message</li><li>Lower latency for small messages arriving frequently (&lt;100ms apart, such as token streaming)</li><li>Reduced bandwidth (no request overhead per update)</li><li>Server can efficiently batch updates</li></ul><p>Long polling advantages:</p><ul><li>Works with more restrictive proxy configurations</li><li>Better for environments with aggressive caching</li><li>No persistent connection overhead</li></ul><p><strong>Important: Proxy Configuration</strong></p><p>SSE requires that reverse proxies and CDNs support streaming responses without buffering. If your proxy buffers the complete response before sending it to the client, SSE connections will fail.</p><p>Common proxy configurations:</p><ul><li><strong>Nginx</strong>: Add <code>proxy_buffering off;</code> for SSE endpoints</li><li><strong>Caddy</strong>: Add <code>flush_interval -1</code> to the reverse_proxy directive</li><li><strong>Apache</strong>: Ensure mod_proxy_http has <code>flushpackets=on</code></li></ul><p>The Electric TypeScript client automatically detects when SSE connections are being buffered (by checking if connections close immediately) and falls back to long polling after 3 consecutive quick-close attempts.</p><h3 id="log-modes" tabindex="-1">Log modes <a class="header-anchor" href="#log-modes" aria-label="Permalink to &quot;Log modes&quot;">​</a></h3><p>Electric supports two log modes for syncing shapes, controlled by the <code>log</code> query parameter:</p><h4 id="full-mode-default" tabindex="-1">Full mode (default) <a class="header-anchor" href="#full-mode-default" aria-label="Permalink to &quot;Full mode (default)&quot;">​</a></h4><p>When using <code>log=full</code> (the default), the server creates an initial snapshot of all data matching the shape definition and streams it to the client before delivering real-time updates. This is the standard mode where you get the complete current state followed by live changes.</p><h4 id="changes-only-mode" tabindex="-1">Changes-only mode <a class="header-anchor" href="#changes-only-mode" aria-label="Permalink to &quot;Changes-only mode&quot;">​</a></h4><p>When using <code>log=changes_only</code>, the server skips creating an initial snapshot. The client will only receive changes that occur after the shape is established, without seeing the base data. This mode is useful for:</p><ul><li>Places where historical data isn&#39;t needed</li><li>Applications that fetch their initial state through other means</li><li>Reducing initial sync time when you don&#39;t need historical data</li></ul><p>In <code>changes_only</code> mode, you can use subset snapshots (see below) to fetch specific portions of data on-demand while tracking which changes to skip.</p><h3 id="starting-from-now" tabindex="-1">Starting from &#39;now&#39; <a class="header-anchor" href="#starting-from-now" aria-label="Permalink to &quot;Starting from &#39;now&#39;&quot;">​</a></h3><p>You can use <code>offset=now</code> to skip all historical data and receive an immediate up-to-date response with the latest continuation offset. This allows applications to start &quot;from scratch&quot; without processing historical data.</p><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span style="color:#B392F0;">curl</span><span style="color:#79B8FF;"> -i</span><span style="color:#9ECBFF;"> &#39;http://localhost:3000/v1/shape?table=foo&amp;offset=now&#39;</span></span></code></pre></div><p>This is particularly useful when combined with <code>log=changes_only</code> mode and <code>replica=full</code> for applications that don&#39;t keep state and need to start fresh upon reload without historical data.</p><h3 id="subset-snapshots" tabindex="-1">Subset snapshots <a class="header-anchor" href="#subset-snapshots" aria-label="Permalink to &quot;Subset snapshots&quot;">​</a></h3><p>When using <code>changes_only</code> mode, you can request subset snapshots to fetch specific portions of data on-demand.</p><h4 id="using-post-recommended" tabindex="-1">Using POST (recommended) <a class="header-anchor" href="#using-post-recommended" aria-label="Permalink to &quot;Using POST (recommended)&quot;">​</a></h4><p><strong>We strongly recommend using POST requests for subset snapshots.</strong> POST requests send subset parameters in the request body as JSON, avoiding URL length limits that can occur with complex WHERE clauses or many parameters.</p><div class="warning custom-block"><p class="custom-block-title">URL Length Limits</p><p>GET requests with subset parameters in the URL can fail with <code>414 Request-URI Too Long</code> errors when queries involve many parameters (e.g., <code>WHERE id = ANY($1)</code> with hundreds of IDs). This is a common issue with join queries that generate large filter lists. <strong>Use POST to avoid this limitation.</strong></p><p>In Electric 2.0, GET requests for subset snapshots will be deprecated. Only POST will be supported.</p></div><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span style="color:#B392F0;">curl</span><span style="color:#79B8FF;"> -i</span><span style="color:#79B8FF;"> -X</span><span style="color:#9ECBFF;"> POST</span><span style="color:#9ECBFF;"> &#39;http://localhost:3000/v1/shape?table=foo&amp;offset=123_4&amp;handle=abc-123&#39;</span><span style="color:#79B8FF;"> \</span></span>
<span class="line"><span style="color:#79B8FF;">  -H</span><span style="color:#9ECBFF;"> &#39;Content-Type: application/json&#39;</span><span style="color:#79B8FF;"> \</span></span>
<span class="line"><span style="color:#79B8FF;">  -d</span><span style="color:#9ECBFF;"> &#39;{</span></span>
<span class="line"><span style="color:#9ECBFF;">    &quot;where&quot;: &quot;priority = $1&quot;,</span></span>
<span class="line"><span style="color:#9ECBFF;">    &quot;params&quot;: {&quot;1&quot;: &quot;high&quot;},</span></span>
<span class="line"><span style="color:#9ECBFF;">    &quot;order_by&quot;: &quot;created_at&quot;,</span></span>
<span class="line"><span style="color:#9ECBFF;">    &quot;limit&quot;: 10</span></span>
<span class="line"><span style="color:#9ECBFF;">  }&#39;</span></span></code></pre></div><p>The POST body accepts these parameters:</p><ul><li><code>where</code> - WHERE clause to filter the subset</li><li><code>params</code> - Parameters for the WHERE clause as an object (e.g., <code>{&quot;1&quot;:&quot;value1&quot;,&quot;2&quot;:&quot;value2&quot;}</code> for <code>$1</code> and <code>$2</code>)</li><li><code>limit</code> - Maximum number of rows to return</li><li><code>offset</code> - Number of rows to skip (for pagination)</li><li><code>order_by</code> - ORDER BY clause (required when using limit/offset)</li></ul><h4 id="using-get-legacy" tabindex="-1">Using GET (legacy) <a class="header-anchor" href="#using-get-legacy" aria-label="Permalink to &quot;Using GET (legacy)&quot;">​</a></h4><p>GET requests are still supported for backwards compatibility, using <code>subset__*</code> query parameters:</p><div class="language-sh"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span style="color:#B392F0;">curl</span><span style="color:#79B8FF;"> -i</span><span style="color:#9ECBFF;"> &#39;http://localhost:3000/v1/shape?table=foo&amp;offset=123_4&amp;handle=abc-123&amp;subset__where=priority=high&amp;subset__order_by=created_at&amp;subset__limit=10&#39;</span></span></code></pre></div><p>The query parameters include:</p><ul><li><code>subset__where</code> - Additional WHERE clause to filter the subset</li><li><code>subset__params</code> - Parameters for the subset WHERE clause as a JSON-encoded object (e.g., <code>{&quot;1&quot;:&quot;value1&quot;,&quot;2&quot;:&quot;value2&quot;}</code> for <code>$1</code> and <code>$2</code>)</li><li><code>subset__limit</code> - Maximum number of rows to return</li><li><code>subset__offset</code> - Number of rows to skip (for pagination)</li><li><code>subset__order_by</code> - ORDER BY clause (required when using limit/offset)</li></ul><h4 id="response-format" tabindex="-1">Response format <a class="header-anchor" href="#response-format" aria-label="Permalink to &quot;Response format&quot;">​</a></h4><p>The response includes the requested data along with PostgreSQL snapshot metadata in a <code>snapshot-end</code> control message. This metadata allows clients to determine which subsequent changes have already been incorporated into the snapshot and should be skipped.</p><p>Response here has a different format from normal responses - instead of just an array of operations, we return an object with <code>data</code> and <code>metadata</code> keys, where <code>data</code> are insert operations (it&#39;s up to the client to treat them as upserts if needed) and <code>metadata</code> tells the client which transactions are part of the snapshot and thus must be skipped on the main shape stream.</p><p>The minimal request to get an equivalent of initial snapshot would be <code>where=TRUE</code> (POST) or <code>subset__where=TRUE</code> (GET)</p><h3 id="clients" tabindex="-1">Clients <a class="header-anchor" href="#clients" aria-label="Permalink to &quot;Clients&quot;">​</a></h3><p>The algorithm for consuming the HTTP API described above can be implemented from scratch for your application. However, it&#39;s typically implemented by clients that can be re-used and provide a simpler interface for application code.</p><p>There are a number of existing clients, such as the <a href="/docs/api/clients/typescript">TypeScript</a> and <a href="/docs/api/clients/elixir">Elixir</a> clients. If one doesn&#39;t exist for your language or environment, we hope that the pattern is simple enough that you should be able to <a href="/docs/guides/client-development">write your own client</a> relatively easily.</p><h2 id="caching" tabindex="-1">Caching <a class="header-anchor" href="#caching" aria-label="Permalink to &quot;Caching&quot;">​</a></h2><p>HTTP API responses contain cache headers, including <code>cache-control</code> with <code>max-age</code> and <code>stale-age</code> and <code>etag</code>. These work out-of-the-box with caching proxies, such as <a href="https://nginx.org/en" target="_blank" rel="noreferrer">Nginx</a>, <a href="https://caddyserver.com" target="_blank" rel="noreferrer">Caddy</a> or <a href="https://varnish-cache.org" target="_blank" rel="noreferrer">Varnish</a>, or a CDN like <a href="https://www.cloudflare.com/en-gb/application-services/products/cdn" target="_blank" rel="noreferrer">Cloudflare</a> or <a href="https://www.fastly.com/products/cdn" target="_blank" rel="noreferrer">Fastly</a>.</p><p>There are three aspects to caching:</p><ol><li><a href="#accelerating-initial-sync">accelerating initial sync</a></li><li><a href="#caching-in-the-browser">caching in the browser</a></li><li><a href="#collapsing-live-requests">collapsing live requests</a></li></ol><h3 id="accelerating-initial-sync" tabindex="-1">Accelerating initial sync <a class="header-anchor" href="#accelerating-initial-sync" aria-label="Permalink to &quot;Accelerating initial sync&quot;">​</a></h3><p>When a client makes a <code>GET</code> request to fetch shape data at a given <code>offset</code>, the response can be cached. Subsequent clients requesting the same data can be served from the proxy or CDN. This removes load from Electric (and from Postrgres) and allows data to be served extremely quickly, at the edge by an optimised CDN.</p><p>You can see an example Nginx config at <a href="https://github.com/electric-sql/electric/blob/main/packages/sync-service/dev/nginx.conf" target="_blank" rel="noreferrer">packages/sync-service/dev/nginx.conf</a>:</p><div class="language-nginx"><button title="Copy Code" class="copy"></button><span class="lang">nginx</span><pre class="shiki github-dark vp-code" tabindex="0"><code><span class="line"><span style="color:#F97583;">worker_processes </span><span style="color:#79B8FF;">1</span><span style="color:#E1E4E8;">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583;">events</span><span style="color:#E1E4E8;"> {</span></span>
<span class="line"><span style="color:#F97583;">    worker_connections </span><span style="color:#79B8FF;">1024</span><span style="color:#E1E4E8;">;</span></span>
<span class="line"><span style="color:#E1E4E8;">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583;">http</span><span style="color:#E1E4E8;"> {</span></span>
<span class="line"><span style="color:#F97583;">    include </span><span style="color:#E1E4E8;">      mime.types;</span></span>
<span class="line"><span style="color:#F97583;">    default_type </span><span style="color:#E1E4E8;"> application/octet-stream;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D;">    # Enable gzip</span></span>
<span class="line"><span style="color:#F97583;">    gzip </span><span style="color:#79B8FF;">on</span><span style="color:#E1E4E8;">;</span></span>
<span class="line"><span style="color:#F97583;">    gzip_types </span><span style="color:#E1E4E8;">text/plain text/css application/javascript image/svg+xml application/json;</span></span>
<span class="line"><span style="color:#F97583;">    gzip_min_length </span><span style="color:#79B8FF;">1000</span><span style="color:#E1E4E8;">;</span></span>
<span class="line"><span style="color:#F97583;">    gzip_vary </span><span style="color:#79B8FF;">on</span><span style="color:#E1E4E8;">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D;">    # Enable caching</span></span>
<span class="line"><span style="color:#F97583;">    proxy_cache_path </span><span style="color:#E1E4E8;">/var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583;">    server</span><span style="color:#E1E4E8;"> {</span></span>
<span class="line"><span style="color:#F97583;">        listen </span><span style="color:#79B8FF;">3002</span><span style="color:#E1E4E8;">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583;">        location</span><span style="color:#B392F0;"> / </span><span style="color:#E1E4E8;">{</span></span>
<span class="line"><span style="color:#F97583;">            proxy_pass </span><span style="color:#E1E4E8;">http://host.docker.internal:3000;</span></span>
<span class="line"><span style="color:#F97583;">            proxy_set_header </span><span style="color:#E1E4E8;">Host $host;</span></span>
<span class="line"><span style="color:#F97583;">            proxy_set_header </span><span style="color:#E1E4E8;">X-Real-IP $remote_addr;</span></span>
<span class="line"><span style="color:#F97583;">            proxy_set_header </span><span style="color:#E1E4E8;">X-Forwarded-For $proxy_add_x_forwarded_for;</span></span>
<span class="line"><span style="color:#F97583;">            proxy_set_header </span><span style="color:#E1E4E8;">X-Forwarded-Proto $scheme;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D;">            # Enable caching</span></span>
<span class="line"><span style="color:#F97583;">            proxy_cache </span><span style="color:#E1E4E8;">my_cache;</span></span>
<span class="line"><span style="color:#F97583;">            proxy_cache_revalidate </span><span style="color:#79B8FF;">on</span><span style="color:#E1E4E8;">;</span></span>
<span class="line"><span style="color:#F97583;">            proxy_cache_min_uses </span><span style="color:#79B8FF;">1</span><span style="color:#E1E4E8;">;</span></span>
<span class="line"><span style="color:#F97583;">            proxy_cache_methods </span><span style="color:#E1E4E8;">GET HEAD;</span></span>
<span class="line"><span style="color:#F97583;">            proxy_cache_use_stale </span><span style="color:#79B8FF;">error</span><span style="color:#E1E4E8;"> timeout;</span></span>
<span class="line"><span style="color:#F97583;">            proxy_cache_background_update </span><span style="color:#79B8FF;">on</span><span style="color:#E1E4E8;">;</span></span>
<span class="line"><span style="color:#F97583;">            proxy_cache_lock </span><span style="color:#79B8FF;">on</span><span style="color:#E1E4E8;">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D;">            # Add proxy cache status header</span></span>
<span class="line"><span style="color:#F97583;">            add_header </span><span style="color:#E1E4E8;">X-Proxy-Cache $upstream_cache_status;</span></span>
<span class="line"><span style="color:#F97583;">            add_header </span><span style="color:#E1E4E8;">X-Cache-Date $upstream_http_date;</span></span>
<span class="line"><span style="color:#E1E4E8;">        }</span></span>
<span class="line"><span style="color:#E1E4E8;">    }</span></span>
<span class="line"><span style="color:#E1E4E8;">}</span></span></code></pre></div><h3 id="caching-in-the-browser" tabindex="-1">Caching in the browser <a class="header-anchor" href="#caching-in-the-browser" aria-label="Permalink to &quot;Caching in the browser&quot;">​</a></h3><p>Requests are also designed to be cached by the browser. This allows apps to cache and avoid re-fetching data.</p><p>For example, say a page loads data by syncing a shape.</p><figure><a href="/assets/initial-request.BmdXXKqa.png" class="hidden-sm"><img src="/assets/initial-request.BmdXXKqa.png" alt="Console showing initial request loading from the network"></a><a href="/assets/initial-request.BmdXXKqa.png" class="block-sm"><img src="/assets/initial-request.sm.CFKXqfx3.png" alt="Console showing initial request loading from the network"></a></figure><p>The next time the user navigates to the same page, the data is in the browser file cache.</p><figure><a href="/assets/subsequent-request.c7HveaKo.png" class="hidden-sm"><img src="/assets/subsequent-request.c7HveaKo.png" alt="Console showing subsequent requests loading from the browser&#39;s file cache"></a><a href="/assets/subsequent-request.c7HveaKo.png" class="block-sm"><img src="/assets/subsequent-request.sm.TVSfJOK7.png" alt="Console showing subsequent requests loading from the browser&#39;s file cache"></a></figure><p>This can make data access instant and available offline, even without using a persistent local store.</p><h3 id="collapsing-live-requests" tabindex="-1">Collapsing live requests <a class="header-anchor" href="#collapsing-live-requests" aria-label="Permalink to &quot;Collapsing live requests&quot;">​</a></h3><p>Once a client has requested the initial data for a shape, it switches into <a href="#live-mode">live mode</a>, using long polling to wait for new data. When new data arrives, the client reconnects to wait for more data, and so on.</p><p>Most caching proxies and CDNs support a feature called <a href="https://info.varnish-software.com/blog/two-minutes-tech-tuesdays-request-coalescing" target="_blank" rel="noreferrer">request collapsing</a> (sometimes also called request coalescing). This identifies requests to the same resource, queues them on a waiting list, and only sends a single request to the origin.</p><div style="width:100%;max-width:512px;"><div class="embed-container"><iframe src="https://www.youtube-nocookie.com/embed/9G9ipVQCZ9w?rel=0" allow="encrypted-media; fullscreen; picture-in-picture" class="youtube-embed" sandbox="allow-presentation allow-same-origin allow-scripts"></iframe></div></div><p>Electric takes advantage of this to optimise realtime delivery to large numbers of concurrent clients. Instead of Electric holding open a connection per client, this is handled at the CDN level and allows us to coalesce concurrent long-polling requests in live mode.</p><p>This is how Electric can support millions of concurrent clients with minimal load on the sync service and no load on the source Postgres.</p></div></div></main><footer class="VPDocFooter" data-v-e5fa90be data-v-429f87a2><!--[--><!--[--><!--[--><!--[--><div class="markdown-link-footer-container"><a class="markdown-link-footer" href="/docs/api/http.md" target="_blank" rel="noopener" data-v-c9b8e4a6><span class="title" data-v-c9b8e4a6>✨ Markdown</span></a></div><!--]--><!--]--><!--]--><!--]--><div class="edit-info" data-v-429f87a2><div class="edit-link" data-v-429f87a2><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://github.com/electric-sql/electric/edit/main/website/docs/api/http.md" target="_blank" rel="noreferrer" data-v-429f87a2><!--[--><span class="vpi-square-pen edit-link-icon" data-v-429f87a2></span> Edit this page<!--]--></a></div><!----></div><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-429f87a2><span class="visually-hidden" id="doc-footer-aria-label" data-v-429f87a2>Pager</span><div class="pager" data-v-429f87a2><a class="VPLink link pager-link prev" href="/docs/guides/client-development" data-v-429f87a2><!--[--><span class="desc" data-v-429f87a2>Previous page</span><span class="title" data-v-429f87a2>Client development</span><!--]--></a></div><div class="pager" data-v-429f87a2><a class="VPLink link pager-link next" href="/docs/api/clients/typescript" data-v-429f87a2><!--[--><span class="desc" data-v-429f87a2>Next page</span><span class="title" data-v-429f87a2>TypeScript</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><!----><!--[--><!--]--></div></div>
    <script>window.__VP_HASH_MAP__=JSON.parse("{\"about_community.md\":\"DkXcHrz3\",\"about_contact.md\":\"D1Z0T3B4\",\"about_jobs_founders-associate.md\":\"CEhYG25F\",\"about_jobs_index.md\":\"CnSPlYLa\",\"about_jobs_pglite-engineer.md\":\"DHUex5Pp\",\"about_legal_dpa.md\":\"ZcGbK2iE\",\"about_legal_privacy.md\":\"EzicKNcp\",\"about_legal_subprocessors.md\":\"B1xvDMoL\",\"about_legal_terms.md\":\"CsMQCtRM\",\"about_team.md\":\"CqhEJRcL\",\"blog.md\":\"KdhMGKEs\",\"blog_2022_05_03_introducing-rich-crdts.md\":\"7NjRLaC6\",\"blog_2022_05_20_relativity-causal-consistency.md\":\"HqljpcFj\",\"blog_2022_12_16_evolution-state-transfer.md\":\"DYNCzQGf\",\"blog_2023_02_02_introducing-jose-kevin-garry.md\":\"BJc9XAJp\",\"blog_2023_02_09_developing-local-first-software.md\":\"B2EAZWVv\",\"blog_2023_05_10_welcome-andrei-oleksii.md\":\"72yrJrJL\",\"blog_2023_09_20_introducing-electricsql-v0.6.md\":\"BRa_ekbr\",\"blog_2023_10_10_welcome-sam.md\":\"DNoahiUK\",\"blog_2023_10_12_linerlite-local-first-with-react.md\":\"Bsmm1dyu\",\"blog_2023_10_26_local-first-software-london-meet-up.md\":\"BCAkrvmj\",\"blog_2023_11_02_electricsql-v0.7-released.md\":\"C_bmtElf\",\"blog_2023_11_02_using-electricsql-with-the-ionic-framework-and-capacitor.md\":\"BTcWisiY\",\"blog_2023_12_13_electricsql-v0.8-released.md\":\"CC61tMfx\",\"blog_2023_12_15_secure-transactions-with-local-first.md\":\"DFozV7SH\",\"blog_2024_01_24_electricsql-v0.9-released.md\":\"CxEw33iE\",\"blog_2024_02_05_local-first-ai-with-tauri-postgres-pgvector-llama.md\":\"A9HECT9g\",\"blog_2024_02_27_intel-ignite.md\":\"fUPMA9v3\",\"blog_2024_04_10_electricsql-v0.10-released.md\":\"DnJQ3LK8\",\"blog_2024_05_14_electricsql-postgres-client-support.md\":\"CqOaPJqA\",\"blog_2024_07_17_electric-next.md\":\"Bhsjzqpo\",\"blog_2024_11_21_local-first-with-your-existing-api.md\":\"3fm04QhZ\",\"blog_2024_12_10_electric-beta-release.md\":\"DRpH32aE\",\"blog_2025_03_17_electricsql-1.0-released.md\":\"DPPlz3rb\",\"blog_2025_04_07_electric-cloud-public-beta-release.md\":\"55BuppYh\",\"blog_2025_04_09_building-ai-apps-on-sync.md\":\"DbONQNuW\",\"blog_2025_04_22_untangling-llm-spaghetti.md\":\"ncZ5GvUM\",\"blog_2025_06_05_database-in-the-sandbox.md\":\"ErpbVK-2\",\"blog_2025_07_29_super-fast-apps-on-sync-with-tanstack-db.md\":\"CvDN18st\",\"blog_2025_08_04_reliability-sprint.md\":\"f0h8-Llq\",\"blog_2025_08_12_bringing-agents-back-down-to-earth.md\":\"CtLtTOel\",\"blog_2025_08_13_electricsql-v1.1-released.md\":\"CFAxKqRL\",\"blog_2025_12_09_announcing-durable-streams.md\":\"CdiO0bqx\",\"blog_2025_12_23_durable-streams-0.1.0.md\":\"Lf6RhY4K\",\"blog_2026_01_12_durable-sessions-for-collaborative-ai.md\":\"CVI5ofID\",\"blog_2026_01_20_from-science-fiction-to-reality-you-can-build-difficult-things-now.md\":\"CuZP5nOh\",\"blog_2026_01_22_announcing-hosted-durable-streams.md\":\"Bj63i7zl\",\"blog_2026_02_02_configurancy.md\":\"DpUs9sfc\",\"blog_2026_02_19_amdahls-law-for-ai-agents.md\":\"CMb1pN2w\",\"blog_2026_03_06_agent-skills-now-shipping.md\":\"Dpbg7Yx8\",\"blog_2026_03_24_durable-transport-ai-sdks.md\":\"Cl_nLur1\",\"blog_2026_03_25_announcing-pglite-v04.md\":\"DsBWo6nK\",\"blog_2026_03_25_tanstack-db-0.6-app-ready-with-persistence-and-includes.md\":\"i_EWRgfz\",\"blog_2026_03_26_stream-db.md\":\"BXs_bVv8\",\"blog_2026_04_02_electric-cloud-pricing.md\":\"CpMRjPVR\",\"blog_2026_04_07_yjs-durable-streams-on-electric-cloud.md\":\"Df6hZ1Gg\",\"blog_2026_04_08_ai-agents-as-crdt-peers-with-yjs.md\":\"CDajS4uv\",\"blog_2026_04_08_data-primitive-agent-loop.md\":\"DvGBDKwC\",\"changelog.md\":\"DZFYESSE\",\"cloud_cli.md\":\"CUvgvwLO\",\"cloud_index.md\":\"0orBKMd7\",\"cloud_protocols.md\":\"HAMlVtIi\",\"cloud_usage.md\":\"Djpz8pAq\",\"demos.md\":\"hBaGW3dN\",\"demos_ai-chat.md\":\"BDtx6VWl\",\"demos_bash.md\":\"BxJoJVkK\",\"demos_burn.md\":\"C4IB39M-\",\"demos_encryption.md\":\"BZVqobb6\",\"demos_gatekeeper-auth.md\":\"BEroW-oR\",\"demos_linearlite.md\":\"CYzN7bhJ\",\"demos_nextjs.md\":\"eUPFPju_\",\"demos_notes.md\":\"C5qomg2f\",\"demos_phoenix-liveview.md\":\"BzVHttzK\",\"demos_pixel-art.md\":\"zzOqrZLf\",\"demos_proxy-auth.md\":\"C2Xp2oc-\",\"demos_react.md\":\"C2oTXSWa\",\"demos_redis.md\":\"D2opU_eh\",\"demos_remix.md\":\"Dq9g4fxL\",\"demos_tanstack.md\":\"DCaSGgvM\",\"demos_territory-wars.md\":\"BnBi21L1\",\"demos_todo-app.md\":\"C77C9gxV\",\"demos_write-patterns.md\":\"DQu6XjyP\",\"demos_yjs.md\":\"BVPWaqCJ\",\"docs__tutorial.md\":\"Bt_HyPWt\",\"docs_agents.md\":\"C63HhO4J\",\"docs_api_clients_elixir.md\":\"DRAtKPp1\",\"docs_api_clients_typescript.md\":\"nPr519Co\",\"docs_api_config.md\":\"DM3OBJzK\",\"docs_api_http.md\":\"wkTa9jP7\",\"docs_guides_auth.md\":\"CVn776zf\",\"docs_guides_client-development.md\":\"-TNSorrO\",\"docs_guides_deployment.md\":\"DugB7AGM\",\"docs_guides_installation.md\":\"B73icwuO\",\"docs_guides_postgres-permissions.md\":\"DEXzxXTK\",\"docs_guides_security.md\":\"DH5Q0PCF\",\"docs_guides_shapes.md\":\"DzjuP2by\",\"docs_guides_sharding.md\":\"Ha02ADA2\",\"docs_guides_troubleshooting.md\":\"DIkzotyp\",\"docs_guides_upgrading.md\":\"YTaRTZQw\",\"docs_guides_writes.md\":\"BVIbCpC6\",\"docs_integrations_aws.md\":\"D6LyLp-H\",\"docs_integrations_cloudflare.md\":\"DdSv1LxJ\",\"docs_integrations_crunchy.md\":\"KrOdIsii\",\"docs_integrations_digital-ocean.md\":\"BcvfaTal\",\"docs_integrations_expo.md\":\"CWDj87iR\",\"docs_integrations_fly.md\":\"DJeuYF2U\",\"docs_integrations_gcp.md\":\"CVKnGCZM\",\"docs_integrations_livestore.md\":\"RZhq3Jcc\",\"docs_integrations_mobx.md\":\"L36r-jBK\",\"docs_integrations_neon.md\":\"6W7cZdo5\",\"docs_integrations_netlify.md\":\"Cp9iLNWS\",\"docs_integrations_next.md\":\"ufbxFbsg\",\"docs_integrations_phoenix.md\":\"CmfhCaXr\",\"docs_integrations_planetscale.md\":\"DUDVZa5s\",\"docs_integrations_react.md\":\"DpbsA6XE\",\"docs_integrations_redis.md\":\"BnVPrzHP\",\"docs_integrations_render.md\":\"lFPHnncC\",\"docs_integrations_supabase.md\":\"D4kjA_SY\",\"docs_integrations_tanstack.md\":\"MwjHZli8\",\"docs_integrations_vercel.md\":\"DtNb724y\",\"docs_integrations_yjs.md\":\"DIGLZnnG\",\"docs_intro.md\":\"B64qt4Jk\",\"docs_llms__intro_redux.md\":\"DuvAB73I\",\"docs_llms__quickstart_redux.md\":\"DWFS2D1M\",\"docs_quickstart.md\":\"UxpUOe89\",\"docs_reference_alternatives.md\":\"GZRICB0Z\",\"docs_reference_benchmarks.md\":\"BRp14-m3\",\"docs_reference_literature.md\":\"BjFJBb1X\",\"docs_reference_telemetry.md\":\"D2_sGRy3\",\"docs_stacks.md\":\"DGoxKnMl\",\"index.md\":\"D7M615R-\",\"old-index.md\":\"B7QI8d14\",\"pricing.md\":\"BOqszaiX\",\"primitives_durable-streams.md\":\"CvTYAk_c\",\"primitives_index.md\":\"hA1Q7gtC\",\"primitives_pglite.md\":\"Dkche911\",\"primitives_postgres-sync.md\":\"DJrIF6nd\",\"primitives_tanstack-db.md\":\"CJoln2nZ\",\"src_partials_home-cta.md\":\"DNfGgBnS\",\"src_partials_home-features-after.md\":\"B1J3LLuX\",\"src_partials_home-features-before.md\":\"DO7yDCi6\",\"src_partials_home-your-stack-simplified.md\":\"CaeEcvM3\",\"sync.md\":\"JhfwjcuQ\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en\",\"dir\":\"ltr\",\"title\":\"Electric\",\"description\":\"Electric provides the data primitives and infra to build collaborative, multi-agent systems. Including Postgres Sync, Durable Streams, TanStack DB and PGlite.\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":\"force-dark\",\"themeConfig\":{\"editLink\":{\"pattern\":\"https://github.com/electric-sql/electric/edit/main/website/:path\"},\"logo\":\"/img/brand/logo.svg\",\"nav\":[{\"text\":\"Sync\",\"link\":\"/sync\",\"activeMatch\":\"/sync\"},{\"text\":\"Primitives\",\"link\":\"/primitives\",\"activeMatch\":\"/primitives\"},{\"text\":\"Cloud\",\"link\":\"/cloud\",\"activeMatch\":\"/cloud\"},{\"text\":\"Pricing\",\"link\":\"/pricing\",\"activeMatch\":\"/pricing\"},{\"text\":\"Docs\",\"link\":\"/docs/intro\",\"activeMatch\":\"/docs/\"},{\"text\":\"Demos\",\"link\":\"/demos\",\"activeMatch\":\"/demos\"},{\"text\":\"Blog\",\"link\":\"/blog\",\"activeMatch\":\"/blog\"},{\"text\":\"About\",\"link\":\"/about/community\",\"activeMatch\":\"/about/\"},{\"component\":\"NavSignupButton\"}],\"search\":{\"provider\":\"local\"},\"sidebar\":{\"/primitives\":[{\"text\":\"Primitives\",\"items\":[{\"text\":\"Overview\",\"link\":\"/primitives/\"},{\"text\":\"Postgres Sync\",\"link\":\"/primitives/postgres-sync\"},{\"text\":\"Durable Streams\",\"link\":\"/primitives/durable-streams\"},{\"text\":\"TanStack DB\",\"link\":\"/primitives/tanstack-db\"},{\"text\":\"PGlite\",\"link\":\"/primitives/pglite\"}]}],\"/cloud\":[{\"text\":\"Electric Cloud\",\"items\":[{\"text\":\"Overview\",\"link\":\"/cloud/\"},{\"text\":\"Usage\",\"link\":\"/cloud/usage\"},{\"text\":\"Protocols\",\"link\":\"/cloud/protocols\"},{\"text\":\"Pricing\",\"link\":\"/pricing\"},{\"text\":\"CLI\",\"link\":\"/cloud/cli\"}]}],\"/docs\":[{\"text\":\"Docs\",\"collapsed\":false,\"items\":[{\"text\":\"Intro\",\"link\":\"/docs/intro\"},{\"text\":\"Quickstart\",\"link\":\"/docs/quickstart\"},{\"text\":\"Stacks\",\"link\":\"/docs/stacks\"},{\"text\":\"AGENTS.md\",\"link\":\"/docs/agents\"}]},{\"text\":\"Guides\",\"collapsed\":false,\"items\":[{\"text\":\"Auth\",\"link\":\"/docs/guides/auth\"},{\"text\":\"Shapes\",\"link\":\"/docs/guides/shapes\"},{\"text\":\"Writes\",\"link\":\"/docs/guides/writes\"},{\"text\":\"Installation\",\"link\":\"/docs/guides/installation\"},{\"text\":\"PostgreSQL Permissions\",\"link\":\"/docs/guides/postgres-permissions\"},{\"text\":\"Deployment\",\"link\":\"/docs/guides/deployment\"},{\"text\":\"Upgrading\",\"link\":\"/docs/guides/upgrading\"},{\"text\":\"Sharding\",\"link\":\"/docs/guides/sharding\"},{\"text\":\"Security\",\"link\":\"/docs/guides/security\"},{\"text\":\"Troubleshooting\",\"link\":\"/docs/guides/troubleshooting\"},{\"text\":\"Client development\",\"link\":\"/docs/guides/client-development\"}]},{\"text\":\"API\",\"collapsed\":false,\"items\":[{\"text\":\"HTTP\",\"link\":\"/docs/api/http\"},{\"text\":\"Clients\",\"items\":[{\"text\":\"TypeScript\",\"link\":\"/docs/api/clients/typescript\"},{\"text\":\"Elixir\",\"link\":\"/docs/api/clients/elixir\"}],\"collapsed\":false},{\"text\":\"Config\",\"link\":\"/docs/api/config\"}]},{\"text\":\"Integrations\",\"collapsed\":false,\"items\":[{\"text\":\"Frameworks\",\"items\":[{\"text\":\"LiveStore\",\"link\":\"/docs/integrations/livestore\"},{\"text\":\"MobX\",\"link\":\"/docs/integrations/mobx\"},{\"text\":\"Next.js\",\"link\":\"/docs/integrations/next\"},{\"text\":\"Phoenix\",\"link\":\"/docs/integrations/phoenix\"},{\"text\":\"React\",\"link\":\"/docs/integrations/react\"},{\"text\":\"Redis\",\"link\":\"/docs/integrations/redis\"},{\"text\":\"TanStack\",\"link\":\"/docs/integrations/tanstack\"},{\"text\":\"Yjs\",\"link\":\"/docs/integrations/yjs\"}]},{\"text\":\"Platforms\",\"items\":[{\"text\":\"AWS\",\"link\":\"/docs/integrations/aws\"},{\"text\":\"Cloudflare\",\"link\":\"/docs/integrations/cloudflare\"},{\"text\":\"Crunchy\",\"link\":\"/docs/integrations/crunchy\"},{\"text\":\"Digital Ocean\",\"link\":\"/docs/integrations/digital-ocean\"},{\"text\":\"Expo\",\"link\":\"/docs/integrations/expo\"},{\"text\":\"Fly.io\",\"link\":\"/docs/integrations/fly\"},{\"text\":\"GCP\",\"link\":\"/docs/integrations/gcp\"},{\"text\":\"Neon\",\"link\":\"/docs/integrations/neon\"},{\"text\":\"Netlify\",\"link\":\"/docs/integrations/netlify\"},{\"text\":\"PlanetScale\",\"link\":\"/docs/integrations/planetscale\"},{\"text\":\"Render\",\"link\":\"/docs/integrations/render\"},{\"text\":\"Supabase\",\"link\":\"/docs/integrations/supabase\"}]}]},{\"text\":\"Reference\",\"collapsed\":false,\"items\":[{\"text\":\"Alternatives\",\"link\":\"/docs/reference/alternatives\"},{\"text\":\"Benchmarks\",\"link\":\"/docs/reference/benchmarks\"},{\"text\":\"Literature\",\"link\":\"/docs/reference/literature\"},{\"text\":\"Telemetry\",\"link\":\"/docs/reference/telemetry\"}]}],\"/demos\":[{\"text\":\"Demos\",\"collapsed\":false,\"items\":[{\"text\":\"Burn\",\"link\":\"/demos/burn\"},{\"text\":\"AI Chat\",\"link\":\"/demos/ai-chat\"},{\"text\":\"Territory Wars\",\"link\":\"/demos/territory-wars\"},{\"text\":\"Linearlite\",\"link\":\"/demos/linearlite\"},{\"text\":\"Notes\",\"link\":\"/demos/notes\"},{\"text\":\"Pixel art\",\"link\":\"/demos/pixel-art\"}]},{\"text\":\"Examples\",\"collapsed\":false,\"items\":[{\"text\":\"Bash\",\"link\":\"/demos/bash\"},{\"text\":\"Encryption\",\"link\":\"/demos/encryption\"},{\"text\":\"Gatekeeper auth\",\"link\":\"/demos/gatekeeper-auth\"},{\"text\":\"Next.js\",\"link\":\"/demos/nextjs\"},{\"text\":\"Phoenix LiveView\",\"link\":\"/demos/phoenix-liveview\"},{\"text\":\"Proxy auth\",\"link\":\"/demos/proxy-auth\"},{\"text\":\"React\",\"link\":\"/demos/react\"},{\"text\":\"Redis\",\"link\":\"/demos/redis\"},{\"text\":\"Remix\",\"link\":\"/demos/remix\"},{\"text\":\"Tanstack\",\"link\":\"/demos/tanstack\"},{\"text\":\"Todo app\",\"link\":\"/demos/todo-app\"},{\"text\":\"Write patterns\",\"link\":\"/demos/write-patterns\"},{\"text\":\"Yjs\",\"link\":\"/demos/yjs\"}]}],\"/blog\":[{\"text\":\"Blog\",\"items\":[{\"text\":\"Durable Streams — the data primitive for the agent loop\",\"link\":\"/blog/2026/04/08/data-primitive-agent-loop\"},{\"text\":\"AI agents as CRDT peers — building collaborative AI with Yjs\",\"link\":\"/blog/2026/04/08/ai-agents-as-crdt-peers-with-yjs\"},{\"text\":\"Yjs over HTTP on Durable Streams\",\"link\":\"/blog/2026/04/07/yjs-durable-streams-on-electric-cloud\"},{\"text\":\"Electric Cloud pricing is live\",\"link\":\"/blog/2026/04/02/electric-cloud-pricing\"},{\"text\":\"StreamDB — a reactive database in a Durable Stream\",\"link\":\"/blog/2026/03/26/stream-db\"},{\"text\":\"Electric apps get persistence and includes with TanStack DB 0.6\",\"link\":\"/blog/2026/03/25/tanstack-db-0.6-app-ready-with-persistence-and-includes\"},{\"text\":\"Announcing PGlite v0.4: PostGIS, connection multiplexing, and a new architecture\",\"link\":\"/blog/2026/03/25/announcing-pglite-v04\"},{\"text\":\"Durable Transports for your AI SDK\",\"link\":\"/blog/2026/03/24/durable-transport-ai-sdks\"},{\"text\":\"Agent skills now shipping in our npm packages\",\"link\":\"/blog/2026/03/06/agent-skills-now-shipping\"},{\"text\":\"Amdahl's law for AI agents\",\"link\":\"/blog/2026/02/19/amdahls-law-for-ai-agents\"},{\"text\":\"Configurancy: keeping systems intelligible when agents write all the code\",\"link\":\"/blog/2026/02/02/configurancy\"},{\"text\":\"Announcing Hosted Durable Streams\",\"link\":\"/blog/2026/01/22/announcing-hosted-durable-streams\"},{\"text\":\"From fiction to reality, you can now build difficult things\",\"link\":\"/blog/2026/01/20/from-science-fiction-to-reality-you-can-build-difficult-things-now\"},{\"text\":\"Durable Sessions — the key pattern for collaborative AI\",\"link\":\"/blog/2026/01/12/durable-sessions-for-collaborative-ai\"},{\"text\":\"Durable Streams 0.1.0 and State Protocol\",\"link\":\"/blog/2025/12/23/durable-streams-0.1.0\"},{\"text\":\"Announcing Durable Streams\",\"link\":\"/blog/2025/12/09/announcing-durable-streams\"},{\"text\":\"Electric 1.1: new storage engine with 100x faster writes\",\"link\":\"/blog/2025/08/13/electricsql-v1.1-released\"},{\"text\":\"Bringing agents back down to earth\",\"link\":\"/blog/2025/08/12/bringing-agents-back-down-to-earth\"},{\"text\":\"120 days of hardening – the post‑1.0 reliability sprint\",\"link\":\"/blog/2025/08/04/reliability-sprint\"},{\"text\":\"Super-fast apps on sync with Electric and TanStack DB\",\"link\":\"/blog/2025/07/29/super-fast-apps-on-sync-with-tanstack-db\"},{\"text\":\"Vibe coding with a database in the sandbox\",\"link\":\"/blog/2025/06/05/database-in-the-sandbox\"},{\"text\":\"Untangling the LLM spaghetti\",\"link\":\"/blog/2025/04/22/untangling-llm-spaghetti\"},{\"text\":\"Building AI apps? You need sync\",\"link\":\"/blog/2025/04/09/building-ai-apps-on-sync\"},{\"text\":\"Electric Cloud public BETA: Sync in 30 seconds\",\"link\":\"/blog/2025/04/07/electric-cloud-public-beta-release\"},{\"text\":\"Electric 1.0 released\",\"link\":\"/blog/2025/03/17/electricsql-1.0-released\"},{\"text\":\"Electric BETA release\",\"link\":\"/blog/2024/12/10/electric-beta-release\"},{\"text\":\"Local-first with your existing API\",\"link\":\"/blog/2024/11/21/local-first-with-your-existing-api\"},{\"text\":\"A new approach to building Electric\",\"link\":\"/blog/2024/07/17/electric-next\"},{\"text\":\"Electric v0.11 released with support for Postgres in the client\",\"link\":\"/blog/2024/05/14/electricsql-postgres-client-support\"},{\"text\":\"Electric v0.10 released with shape filtering\",\"link\":\"/blog/2024/04/10/electricsql-v0.10-released\"},{\"text\":\"Electrify, Ignition, Liftoff!\",\"link\":\"/blog/2024/02/27/intel-ignite\"},{\"text\":\"Local AI with Postgres, pgvector and llama2, inside a Tauri app\",\"link\":\"/blog/2024/02/05/local-first-ai-with-tauri-postgres-pgvector-llama\"},{\"text\":\"ElectricSQL v0.9 released\",\"link\":\"/blog/2024/01/24/electricsql-v0.9-released\"},{\"text\":\"Secure transactions with local-first\",\"link\":\"/blog/2023/12/15/secure-transactions-with-local-first\"},{\"text\":\"ElectricSQL v0.8 released with JSON and Supabase support\",\"link\":\"/blog/2023/12/13/electricsql-v0.8-released\"},{\"text\":\"Use ElectricSQL with the Ionic Framework and Capacitor\",\"link\":\"/blog/2023/11/02/using-electricsql-with-the-ionic-framework-and-capacitor\"},{\"text\":\"ElectricSQL v0.7 released\",\"link\":\"/blog/2023/11/02/electricsql-v0.7-released\"},{\"text\":\"ElectricSQL hosted the first \\\"Local-first Software London\\\" meet-up\",\"link\":\"/blog/2023/10/26/local-first-software-London-meet-up\"},{\"text\":\"Linearlite - A local-first app built with ElectricSQL and React\",\"link\":\"/blog/2023/10/12/linerlite-local-first-with-react\"},{\"text\":\"Welcome Sam Willis!\",\"link\":\"/blog/2023/10/10/welcome-sam\"},{\"text\":\"Local-first sync for Postgres from the inventors of CRDTs\",\"link\":\"/blog/2023/09/20/introducing-electricsql-v0.6\"},{\"text\":\"Welcome Andrei and Oleksii!\",\"link\":\"/blog/2023/05/10/welcome-andrei-oleksii\"},{\"text\":\"Developing local-first software\",\"link\":\"/blog/2023/02/09/developing-local-first-software\"},{\"text\":\"Welcome José, Kevin and Garry!\",\"link\":\"/blog/2023/02/02/introducing-jose-kevin-garry\"},{\"text\":\"The evolution of state transfer\",\"link\":\"/blog/2022/12/16/evolution-state-transfer\"},{\"text\":\"Relativity and causal consistency\",\"link\":\"/blog/2022/05/20/relativity-causal-consistency\"},{\"text\":\"Introducing Rich-CRDTs\",\"link\":\"/blog/2022/05/03/introducing-rich-crdts\"}]}],\"/about\":[{\"text\":\"About\",\"items\":[{\"text\":\"Community\",\"link\":\"/about/community\"},{\"text\":\"Team\",\"link\":\"/about/team\"},{\"text\":\"Jobs\",\"link\":\"/about/jobs\",\"items\":[{\"text\":\"Founders Associate\",\"link\":\"/about/jobs/founders-associate\"}],\"collapsed\":false},{\"text\":\"Legal\",\"items\":[{\"text\":\"Terms\",\"link\":\"/about/legal/terms\"},{\"text\":\"Privacy\",\"link\":\"/about/legal/privacy\"}],\"collapsed\":false},{\"text\":\"Contact\",\"link\":\"/about/contact\"}]}]},\"siteTitle\":false,\"socialLinks\":[{\"icon\":\"durable-streams\",\"link\":\"https://durablestreams.com\"},{\"icon\":\"tanstack\",\"link\":\"https://tanstack.com/db\"},{\"icon\":\"pglite\",\"link\":\"https://pglite.dev\"},{\"icon\":\"x\",\"link\":\"https://x.com/ElectricSQL\"},{\"icon\":\"discord\",\"link\":\"https://discord.electric-sql.com\"},{\"icon\":\"github\",\"link\":\"https://github.com/electric-sql/electric\"}]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":true}");</script>
    
  </body>
</html>