ax-check.com
by Gauge
N
Neon
neon.com
ax-check.com
Checked 5 October 2026
A
100/100
Agents need your login
Neon's docs, pricing, and setup are all clear to agents out of the gate.
All 23 checklist items passed, covering clear docs, install paths, and pricing. All 3 coding sessions completed and correctly priced out the product.
1 fix to start with
Concrete changes, backed by what we found.
Recorded coding sessions
Same task, 3 models, no neon.com account. Recorded 5 October 2026 on Pi.
3 recorded · 2m 12s
2m 12s · recorded
Session findings
Select a finding to see it in context.
›Thinking…
The user is asking for a Neon (serverless Postgres) example. Need to check network/credentials. Let me check the environment: is there a Neon API key? Check the repo contents.
Key issue: without credentials, I can't create a Neon project. Let me check env vars.
I'll check the environment first — whether there's anything Neon-related available to act on.
cd /sandbox/repo && ls -la && echo "---ENV---" && env | grep -iE 'neon|postgres|pg|database|db_' | sed 's/=.\{0,6\}.*/=<redacted>/' ; echo "---ALL KEYS---" && env | cut -d= -f1 | sort | head -50total 16
total 16 drwxr-xr-x 3 root root 4096 Sep 18 08:00 . drwxr-xr-x 7 root root 4096 Oct 5 22:05 .. drwxr-xr-x 8 root root 4096 Sep 24 20:05 .git -rw-r--r-- 1 root root 408 Sep 18 08:00 .gitignore ---ENV--- ---ALL KEYS--- AI_AGENT ALG_INFERENCE_MODEL ALG_INFERENCE_PROVIDER ALG_SANDBOX_PROVIDER AWS_CA_BUNDLE CARGO_HOME CARGO_HTTP_CAINFO CURL_CA_BUNDLE DENO_CERT GIT_CONFIG_COUNT GIT_CONFIG_KEY_0 GIT_CONFIG_VALUE_0 GIT_SSL_CAINFO GRPC_DEFAULT_SSL_ROOTS_FILE_PATH HOME INVOCATION_ID JOURNAL_STREAM LANG LOGNAME NODE_COMPILE_CACHE NODE_EXTRA_CA_CERTS OLDPWD PATH PIP_CERT PI_CODING_AGENT PI_GATEWAY_API_KEY PI_MODEL PI_PROVIDER PI_REASONING_LEVEL PI_SESSION_FILE PI_SESSION_ID PWD REQUESTS_CA_BUNDLE RUSTUP_HOME SHELL SHLVL SSL_CERT_FILE SYSTEMD_EXEC_PID USER _
Recorded tool call
{
"type": "tool_call",
"seq": 4,
"ts": "2026-10-05T22:05:36.681Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && ls -la && echo \"---ENV---\" && env | grep -iE 'neon|postgres|pg|database|db_' | sed 's/=.\\{0,6\\}.*/=<redacted>/' ; echo \"---ALL KEYS---\" && env | cut -d= -f1 | sort | head -50"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-ad0ab640966287ff",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 6,
"ts": "2026-10-05T22:05:36.681Z",
"turn": 1,
"output": {
"content": [
{
"text": "total 16\ndrwxr-xr-x 3 root root 4096 Sep 18 08:00 .\ndrwxr-xr-x 7 root root 4096 Oct 5 22:05 ..\ndrwxr-xr-x 8 root root 4096 Sep 24 20:05 .git\n-rw-r--r-- 1 root root 408 Sep 18 08:00 .gitignore\n---ENV---\n---ALL KEYS---\nAI_AGENT\nALG_INFERENCE_MODEL\nALG_INFERENCE_PROVIDER\nALG_SANDBOX_PROVIDER\nAWS_CA_BUNDLE\nCARGO_HOME\nCARGO_HTTP_CAINFO\nCURL_CA_BUNDLE\nDENO_CERT\nGIT_CONFIG_COUNT\nGIT_CONFIG_KEY_0\nGIT_CONFIG_VALUE_0\nGIT_SSL_CAINFO\nGRPC_DEFAULT_SSL_ROOTS_FILE_PATH\nHOME\nINVOCATION_ID\nJOURNAL_STREAM\nLANG\nLOGNAME\nNODE_COMPILE_CACHE\nNODE_EXTRA_CA_CERTS\nOLDPWD\nPATH\nPIP_CERT\nPI_CODING_AGENT\nPI_GATEWAY_API_KEY\nPI_MODEL\nPI_PROVIDER\nPI_REASONING_LEVEL\nPI_SESSION_FILE\nPI_SESSION_ID\nPWD\nREQUESTS_CA_BUNDLE\nRUSTUP_HOME\nSHELL\nSHLVL\nSSL_CERT_FILE\nSYSTEMD_EXEC_PID\nUSER\n_\n",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-ad0ab640966287ff",
"is_error": false,
"tool_kind": "shell"
}which node npm psql curl python3 2>&1; node -v 2>&1; echo "---NET---"; timeout 8 curl -sS -o /dev/null -w "console.neon.tech:%{http_code}\n" https://console.neon.tech/api/v2/projects 2>&1 | tail -2/usr/local/bin/node
/usr/local/bin/node /usr/local/bin/npm /usr/bin/curl /usr/local/bin/python3 v22.23.2 ---NET--- console.neon.tech:401
Recorded tool call
{
"type": "tool_call",
"seq": 5,
"ts": "2026-10-05T22:05:36.681Z",
"name": "bash",
"turn": 1,
"input": {
"command": "which node npm psql curl python3 2>&1; node -v 2>&1; echo \"---NET---\"; timeout 8 curl -sS -o /dev/null -w \"console.neon.tech:%{http_code}\\n\" https://console.neon.tech/api/v2/projects 2>&1 | tail -2"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-bb69d9bfc98e5e49",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 7,
"ts": "2026-10-05T22:05:37.086Z",
"turn": 1,
"output": {
"content": [
{
"text": "/usr/local/bin/node\n/usr/local/bin/npm\n/usr/bin/curl\n/usr/local/bin/python3\nv22.23.2\n---NET---\nconsole.neon.tech:401\n",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-bb69d9bfc98e5e49",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Network works (401 = reachable, needs auth). No NEON_API_KEY. No psql. So I can't provision an actual Neon project — blocked on credentials.
The user said "Let me know if you get blocked." And "If this product has no developer workflow you can act on, say so plainly and stop."
Neon DOES have a developer workflow (API/SDK), so it's not "no workflow". But I'm blocked on credentials: no NEON_API_KEY means I can't create a project or get a connection string. I should say that plainly.
What can I do usefully without blocking? I can write the example code (SDK-based, serverless driver), which is legitimate deliverable work. That's light and doesn't need a live service. But I must not fabricate that it works. I should not spin up local postgres either (that'd be a local service stack — forbidden).
Let me be careful about pricing info — I should not hallucinate. Let me fetch pricing from Neon's site to be accurate.
Let me check npm package availability and fetch pricing docs.
Network reaches Neon (401 = needs auth), but there's no NEON_API_KEY in the environment. Let me confirm what I can verify without credentials.
cd /tmp && timeout 60 npm view @neondatabase/serverless version 2>&1 | tail -3; echo "---"; timeout 60 npm view neonctl version 2>&1 | tail -3
1.2.0
1.2.0 --- 8.0.9
Recorded tool call
{
"type": "tool_call",
"seq": 11,
"ts": "2026-10-05T22:05:40.453Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /tmp && timeout 60 npm view @neondatabase/serverless version 2>&1 | tail -3; echo \"---\"; timeout 60 npm view neonctl version 2>&1 | tail -3"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-bdbdf4de848d5e22",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 14,
"ts": "2026-10-05T22:05:42.364Z",
"turn": 1,
"output": {
"content": [
{
"text": "1.2.0\n---\n8.0.9\n",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-bdbdf4de848d5e22",
"is_error": false,
"tool_kind": "shell"
}timeout 20 curl -sS https://neon.tech/docs/introduction/plans 2>&1 | sed -e 's/<[^>]*>//g' | tr -s ' \n' ' \n' | grep -iE 'free|launch|scale|compute hour|active time|GB|storage|\$' | head -60
(no output)
(no output)
Recorded tool call
{
"type": "tool_call",
"seq": 12,
"ts": "2026-10-05T22:05:40.453Z",
"name": "bash",
"turn": 1,
"input": {
"command": "timeout 20 curl -sS https://neon.tech/docs/introduction/plans 2>&1 | sed -e 's/<[^>]*>//g' | tr -s ' \\n' ' \\n' | grep -iE 'free|launch|scale|compute hour|active time|GB|storage|\\$' | head -60"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-be440fa23c140907",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 13,
"ts": "2026-10-05T22:05:40.823Z",
"turn": 1,
"output": {
"content": [
{
"text": "(no output)",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-be440fa23c140907",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Pricing page fetch gave nothing (likely JS-rendered / blocked). Let me try the pricing page and API docs for plans. Let me try a couple of quick attempts but not go overboard.
for u in "https://neon.com/pricing" "https://neon.tech/pricing" "https://neon.com/docs/introduction/plans"; do echo "=== $u"; timeout 15 curl -sSL -A "Mozilla/5.0" "$u" 2>&1 | sed -e 's/<script[^>]*>[^<]*<\/script>//g' -e 's/<[^>]*>/ /g' | tr -s ' \t\n' ' \n' | grep -iE 'free|launch|scale|\$[0-9]|compute hour|GB-month|storage' | head -25; done
=== https://neon.com/pricing
=== https://neon.com/pricing
Pricing — Neon Major update to our Free Plan: now with 1 GB of Postgres storage per project, 100 projects included Neon Product Solutions Docs Pricing Resources Core Primitives Lakebase Postgres Serverless Postgres database Object Storage S3-compatible storage that branches Functions Serverless compute next to your data Managed Better Auth Authentication built into your database AI Gateway One API for frontier and open-source models Features Lakebase Architecture Storage-compute separation Autoscaling Automatic instance sizing Branching Faster Postgres workflows Search Vector, keyword, and hybrid search Instant Restore Instant recovery when mistakes happen What is Neon Built around Lakebase Postgres, by Databricks Use cases Full-stack apps Deploy backends via your agent Branching workflows Simplify DB ops to ship faster & safer Bursty workloads Avoid overprovisioning & optimize performance Large databases Restore & replicate your DB in seconds Deploy at scale Agents Infra for app-generation agents like Replit & v0 AI Platforms Deploy isolated backends for your end users Learn Blog Technical posts & product updates Case studies Explore customer stories Changelog Product updates Community Connect on Discord Startups Build with Neon Company About us The company and the mission Careers Join the team Contact sales Contact sales team Security Compliance & privacy Status Service status Discord 23.2k Log in Sign up Neon pricing Get started for free. Pay per usage as you grow. Neon pricing plans Free $0 Build and learn free with no time limits and no credit card required. Try Neon Lakebase Postgres 100 projects <span tabindex="0" class="group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block" data-tooltip-id="info-icon-Free_tooltip_0" data-tooltip-html="<p>A project is a top-level container<br/> for your database environment.</p>
" aria-hidden="true"> 100 CU-hrs monthly per project <span tabindex="0" class="group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block" data-tooltip-id="info-icon-Free_tooltip_1" data-tooltip-html="<p>CU-hour = CU x active hours</p><p>1 CU ≈ 4 GB RAM</p>
" aria-hidden="true"> 1 GB of storage per project Sizes up to 2 CU (8 GB RAM) Unlimited team members Backend Managed Better Auth 5 GB of Object Storage Functions Launch Usage-based Typical spend: $ 15 /mo <span tabindex="0" class="group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative mt-0.5 inline-flex shrink-0 align-baseline" data-tooltip-id="info-icon-resource-size-launch" data-tooltip-html="Estimated cost of a 140 CU-hour,<br/> 1 GB database workload.
" aria-hidden="true"> Based on: Intermittent load , 1 GB Get started Lakebase Postgres 100 projects <span tabindex="0" class="group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block" data-tooltip-id="info-icon-Launch_tooltip_0" data-tooltip-html="<p>A project is a top-level container<br/> for your database environment.</p>
" aria-hidden="true"> $0.106 per CU-hr <span tabindex="0" class="group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block" data-tooltip-id="info-icon-Launch_tooltip_1" data-tooltip-html="<p>CU-hour = CU x active hours</p><p>1 CU ≈ 4 GB RAM</p>
" aria-hidden="true"> $0.35 per GB-month Sizes up to 16 CU (64 GB RAM) 3-day metrics/logs in UI Backend Managed Better Auth Object Storage Functions AI Gateway <span tabindex="0" class="group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block" data-tooltip-id="info-icon-Launch_tooltip_3" data-tooltip-html="Pricing matches model provider list prices (no markup). Billed as prepaid credits.
" aria-hidden="true"> Scale Usage-based Typical spend: $ 701 /mo <span tabindex="0" class="group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative mt-0.5 inline-flex shrink-0 align-baseline" data-tooltip-id="info-icon-resource-size-scale" data-tooltip-html="Estimated cost of a 3000 CU-hour,<br/> 100 GB database workload.
" aria-hidden="true"> Based on: High load , 100 GB Get started Lakebase Postgres 1,000+ projects <span tabindex="0" class="group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block" data-tooltip-id="info-icon-Scale_tooltip_0" data-tooltip-html="<p>A project is a top-level container<br/> for your database environment.</p>
" aria-hidden="true"> $0.222 per CU-hr <span tabindex="0" class="group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block" data-tooltip-id="info-icon-Scale_tooltip_1" data-tooltip-html="<p>CU-hour = CU x active hours</p><p>1 CU ≈ 4 GB RAM</p>
" aria-hidden="true"> $0.35 per GB-month Sizes up to 56 CU (224 GB RAM) SLAs, HIPAA, private network Backend Managed Better Auth Object Storage Functions AI Gateway <span tabindex="0" class="group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block" data-tooltip-id="info-icon-Scale_tooltip_3" data-tooltip-html="Pricing matches model provider list prices (no markup). Billed as prepaid credits.
" aria-hidden="true"> Special programs Agent Plan App generation platforms Custom rates and limits for thousands of databases. Learn more about App generation platforms Startup Program Early-stage startups Launch faster with up to $100k in credits. Learn more about Early-stage startups Open Source Program Open source on Neon Credits and funding for building on Neon. Learn more about Open source on Neon .akqa_inline_svg__a{fill:#c1c2c3} .akqa_inline_svg__a{fill:#c1c2c3} Projects and Branches Projects Branches per project Included Additional branches Read more Lakebase Postgres Compute rates Compute sizes Autoscaling Scale to zero When inactive Database storage Root and child branches History Instant restore storage History window For instant restore (configurable) Snapshots Scheduled Backups Backend Managed Better Auth Object Storage Stored volume Functions Compute and invocations AI Gateway Network IP Allow Rules Private Networking Private Link Public network transfer Egress Private network transfer Bidirectional Account & Management Monitoring retention Window for metrics, logs Metrics and Logs export Datadog, OTel Spending notifications Get alerts as your spend grows HIPAA Compliance SOC 2 Report Access Team members Support Plans Free $0 /month Get started 100 10 100 CU-hours Per Project Up to 2 CU (8 GB RAM) After 5 minutes when inactive Free 1 GB per Project Free with limited window/size Up to 6 hours or 1 GB of data changes 1 snapshot Up to 60k MAUs 5 GB included Compute 10 active capacity-hours 400 waiting capacity-hours Invocations 1M invocations 5 GB per project included 1 day Unlimited Community (Discord) Launch Usage-based Get started 100 10 $0.002 per branch-hour $0.106 per CU-hour Up to 16 CU (64 GB RAM) After 5 minutes can be disabled $0.35 per GB-month $0.20 per GB-month based on volume of data changes during your selected history window Up to 7 days 100 snapshots $0.09/GB-month Daily/Weekly/Monthly $0.09/GB-month Up to 1M MAUs If you're planning to go beyond that, contact us $0.023 per GB-month Compute $0.10 per active capacity-hour $0.025 per waiting capacity-hour Invocations $0.60 per 1M invocations List prices here Prepaid credits 500 GB per project included then $0.10/GB 3 days Unlimited Billing Support Scale Usage-based Get started 1,000 25 $0.002 per branch-hour $0.222 per CU-hour Up to 56 CU (224 GB RAM) Configurable $0.35 per GB-month $0.20 per GB-month based on volume of data changes during your selected history window Up to 30 days 100 snapshots $0.09/GB-month Daily/Weekly/Monthly $0.09/GB-month Up to 1M MAUs If you're planning to go beyond that, contact us $0.023 per GB-month Compute $0.12 per active capacity-hour $0.03 per waiting capacity-hour Invocations $0.60 per 1M invocations List prices here Prepaid credits 500 GB per project included then $0.10/GB $0.01 per GB 14 days Included Available Available Unlimited Multiple options Included with every Neon database, on every plan, by default. These are core platform capabilities that come out of the box with Neon. High availability. Neon’s storage is multi-AZ by default, without the need for HA standbys. Read replicas. Neon lets you offload read-heavy queries without added storage costs. Autoscaling. Neon automatically adjusts compute and storage based on demand, including on the Free plan. Monitoring. Built-in dashboards in the console give you real-time visibility into usage and performance. Connection pooling. All Neon databases can use pooled connections built on pgBouncer (up to 10,000 connections ). Postgres extensions library. You can add extensions like pg_vector , PostGIS , TimescaleDB , and many more. Managed Better Auth. Neon comes with built-in authentication based on Better Auth, with a one-click install. GDPR and ISO compliance. Included across all plans. Learn more on our Security page . Your questions, answered Does Neon offer a backend now?
Yes. Alongside our serverless Postgres database, Neon now offers Managed Better Auth, Object Storage, Functions, and AI Gateway - a full backend suite that runs alongside your database and branches with it.
A project in Neon is the top-level container for your environment. Each project includes all branches, with your Postgres databases and (if you deploy them) your Object Storage buckets, Functions, Managed Better Auth endpoints, and AI Gateway access.
A CU (short for Compute Unit) is Neon's way of representing Postgres database compute size . Neon databases autoscale , and CUs define how much CPU and memory your database is using at any moment - with each CU allocating approximately 1 vCPU and 4 GB of RAM.
A CU-hour is Neon's unit for measuring Postgres database compute usage . Because Neon databases scale to zero and autoscale, you're billed only for the database compute resources you actually use. In other words, your monthly database compute usage depends on:
Launch plan: $0.106 per CU-hour
Scale plan: $0.222 per CU-hour
Remember that when your database is idle, compute can scale down to zero, so you don't consume CU-hours while it's not running. Learn more about Neon's billing.
What does 100 CU-hours per project give me on the Free plan?
On the Free plan, each project gets 100 CU-hours of database compute per month, and compute automatically scales down to zero when idle. What this means in practice:
CU-hours are only consumed while a database is actively running queries. When a project is idle, compute scales to zero and uses no CU-hours
The database runs at an average of 1 CU for ~3 hours per day. It scales down to zero the rest of the time
Over a month, this uses roughly 90 CU-hours, staying within the Free plan limits for that project
This model is designed to make it practical to have many small or intermittent databases (for development, demos, previews, or experiments) without being forced into an upgrade. Learn more about our Free Plan philosophy.
Is Object Storage, Functions, or AI Gateway usage included in my Free plan CU-hours?
=== https://neon.tech/pricing
Pricing — Neon Major update to our Free Plan: now with 1 GB of Postgres storage per project, 100 projects included Neon Product Solutions Docs Pricing Resources Core Primitives Lakebase Postgres Serverless Postgres database Object Storage S3-compatible storage that branches Functions Serverless compute next to your data Managed Better Auth Authentication built into your database AI Gateway One API for frontier and open-source models Features Lakebase Architecture Storage-compute separation Autoscaling Automatic instance sizing Branching Faster Postgres workflows Search Vector, keyword, and hybrid search Instant Restore Instant recovery when mistakes happen What is Neon Built around Lakebase Postgres, by Databricks Use cases Full-stack apps Deploy backends via your agent Branching workflows Simplify DB ops to ship faster & safer Bursty workloads Avoid overprovisioning & optimize performance Large databases Restore & replicate your DB in seconds Deploy at scale Agents Infra for app-generation agents like Replit & v0 AI Platforms Deploy isolated backends for your end users Learn Blog Technical posts & product updates Case studies Explore customer stories Changelog Product updates Community Connect on Discord Startups Build with Neon Company About us The company and the mission Careers Join the team Contact sales Contact sales team Security Compliance & privacy Status Service status Discord 23.2k Log in Sign up Neon pricing Get started for free. Pay per usage as you grow. Neon pricing plans Free $0 Build and learn free with no time limits and no credit card required. Try Neon Lakebase Postgres 100 projects <span tabindex="0" class="group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block" data-tooltip-id="info-icon-Free_tooltip_0" data-tooltip-html="<p>A project is a top-level container<br/> for your database environment.</p>
" aria-hidden="true"> 100 CU-hrs monthly per project <span tabindex="0" class="group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block" data-tooltip-id="info-icon-Free_tooltip_1" data-tooltip-html="<p>CU-hour = CU x active hours</p><p>1 CU ≈ 4 GB RAM</p>
" aria-hidden="true"> 1 GB of storage per project Sizes up to 2 CU (8 GB RAM) Unlimited team members Backend Managed Better Auth 5 GB of Object Storage Functions Launch Usage-based Typical spend: $ 15 /mo <span tabindex="0" class="group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative mt-0.5 inline-flex shrink-0 align-baseline" data-tooltip-id="info-icon-resource-size-launch" data-tooltip-html="Estimated cost of a 140 CU-hour,<br/> 1 GB database workload.
" aria-hidden="true"> Based on: Intermittent load , 1 GB Get started Lakebase Postgres 100 projects <span tabindex="0" class="group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block" data-tooltip-id="info-icon-Launch_tooltip_0" data-tooltip-html="<p>A project is a top-level container<br/> for your database environment.</p>
" aria-hidden="true"> $0.106 per CU-hr <span tabindex="0" class="group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block" data-tooltip-id="info-icon-Launch_tooltip_1" data-tooltip-html="<p>CU-hour = CU x active hours</p><p>1 CU ≈ 4 GB RAM</p>
" aria-hidden="true"> $0.35 per GB-month Sizes up to 16 CU (64 GB RAM) 3-day metrics/logs in UI Backend Managed Better Auth Object Storage Functions AI Gateway <span tabindex="0" class="group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block" data-tooltip-id="info-icon-Launch_tooltip_3" data-tooltip-html="Pricing matches model provider list prices (no markup). Billed as prepaid credits.
" aria-hidden="true"> Scale Usage-based Typical spend: $ 701 /mo <span tabindex="0" class="group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative mt-0.5 inline-flex shrink-0 align-baseline" data-tooltip-id="info-icon-resource-size-scale" data-tooltip-html="Estimated cost of a 3000 CU-hour,<br/> 100 GB database workload.
" aria-hidden="true"> Based on: High load , 100 GB Get started Lakebase Postgres 1,000+ projects <span tabindex="0" class="group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block" data-tooltip-id="info-icon-Scale_tooltip_0" data-tooltip-html="<p>A project is a top-level container<br/> for your database environment.</p>
" aria-hidden="true"> $0.222 per CU-hr <span tabindex="0" class="group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block" data-tooltip-id="info-icon-Scale_tooltip_1" data-tooltip-html="<p>CU-hour = CU x active hours</p><p>1 CU ≈ 4 GB RAM</p>
" aria-hidden="true"> $0.35 per GB-month Sizes up to 56 CU (224 GB RAM) SLAs, HIPAA, private network Backend Managed Better Auth Object Storage Functions AI Gateway <span tabindex="0" class="group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block" data-tooltip-id="info-icon-Scale_tooltip_3" data-tooltip-html="Pricing matches model provider list prices (no markup). Billed as prepaid credits.
" aria-hidden="true"> Special programs Agent Plan App generation platforms Custom rates and limits for thousands of databases. Learn more about App generation platforms Startup Program Early-stage startups Launch faster with up to $100k in credits. Learn more about Early-stage startups Open Source Program Open source on Neon Credits and funding for building on Neon. Learn more about Open source on Neon .akqa_inline_svg__a{fill:#c1c2c3} .akqa_inline_svg__a{fill:#c1c2c3} Projects and Branches Projects Branches per project Included Additional branches Read more Lakebase Postgres Compute rates Compute sizes Autoscaling Scale to zero When inactive Database storage Root and child branches History Instant restore storage History window For instant restore (configurable) Snapshots Scheduled Backups Backend Managed Better Auth Object Storage Stored volume Functions Compute and invocations AI Gateway Network IP Allow Rules Private Networking Private Link Public network transfer Egress Private network transfer Bidirectional Account & Management Monitoring retention Window for metrics, logs Metrics and Logs export Datadog, OTel Spending notifications Get alerts as your spend grows HIPAA Compliance SOC 2 Report Access Team members Support Plans Free $0 /month Get started 100 10 100 CU-hours Per Project Up to 2 CU (8 GB RAM) After 5 minutes when inactive Free 1 GB per Project Free with limited window/size Up to 6 hours or 1 GB of data changes 1 snapshot Up to 60k MAUs 5 GB included Compute 10 active capacity-hours 400 waiting capacity-hours Invocations 1M invocations 5 GB per project included 1 day Unlimited Community (Discord) Launch Usage-based Get started 100 10 $0.002 per branch-hour $0.106 per CU-hour Up to 16 CU (64 GB RAM) After 5 minutes can be disabled $0.35 per GB-month $0.20 per GB-month based on volume of data changes during your selected history window Up to 7 days 100 snapshots $0.09/GB-month Daily/Weekly/Monthly $0.09/GB-month Up to 1M MAUs If you're planning to go beyond that, contact us $0.023 per GB-month Compute $0.10 per active capacity-hour $0.025 per waiting capacity-hour Invocations $0.60 per 1M invocations List prices here Prepaid credits 500 GB per project included then $0.10/GB 3 days Unlimited Billing Support Scale Usage-based Get started 1,000 25 $0.002 per branch-hour $0.222 per CU-hour Up to 56 CU (224 GB RAM) Configurable $0.35 per GB-month $0.20 per GB-month based on volume of data changes during your selected history window Up to 30 days 100 snapshots $0.09/GB-month Daily/Weekly/Monthly $0.09/GB-month Up to 1M MAUs If you're planning to go beyond that, contact us $0.023 per GB-month Compute $0.12 per active capacity-hour $0.03 per waiting capacity-hour Invocations $0.60 per 1M invocations List prices here Prepaid credits 500 GB per project included then $0.10/GB $0.01 per GB 14 days Included Available Available Unlimited Multiple options Included with every Neon database, on every plan, by default. These are core platform capabilities that come out of the boShowing the first 20,000 characters. Full output is available in raw details.
Recorded tool call
{
"type": "tool_call",
"seq": 17,
"ts": "2026-10-05T22:05:43.905Z",
"name": "bash",
"turn": 1,
"input": {
"command": "for u in \"https://neon.com/pricing\" \"https://neon.tech/pricing\" \"https://neon.com/docs/introduction/plans\"; do echo \"=== $u\"; timeout 15 curl -sSL -A \"Mozilla/5.0\" \"$u\" 2>&1 | sed -e 's/<script[^>]*>[^<]*<\\/script>//g' -e 's/<[^>]*>/ /g' | tr -s ' \\t\\n' ' \\n' | grep -iE 'free|launch|scale|\\$[0-9]|compute hour|GB-month|storage' | head -25; done"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-a03d386e8d189191",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 18,
"ts": "2026-10-05T22:05:46.497Z",
"turn": 1,
"output": {
"content": [
{
"text": "=== https://neon.com/pricing\n Pricing — Neon Major update to our Free Plan: now with 1 GB of Postgres storage per project, 100 projects included Neon Product Solutions Docs Pricing Resources Core Primitives Lakebase Postgres Serverless Postgres database Object Storage S3-compatible storage that branches Functions Serverless compute next to your data Managed Better Auth Authentication built into your database AI Gateway One API for frontier and open-source models Features Lakebase Architecture Storage-compute separation Autoscaling Automatic instance sizing Branching Faster Postgres workflows Search Vector, keyword, and hybrid search Instant Restore Instant recovery when mistakes happen What is Neon Built around Lakebase Postgres, by Databricks Use cases Full-stack apps Deploy backends via your agent Branching workflows Simplify DB ops to ship faster & safer Bursty workloads Avoid overprovisioning & optimize performance Large databases Restore & replicate your DB in seconds Deploy at scale Agents Infra for app-generation agents like Replit & v0 AI Platforms Deploy isolated backends for your end users Learn Blog Technical posts & product updates Case studies Explore customer stories Changelog Product updates Community Connect on Discord Startups Build with Neon Company About us The company and the mission Careers Join the team Contact sales Contact sales team Security Compliance & privacy Status Service status Discord 23.2k Log in Sign up Neon pricing Get started for free. Pay per usage as you grow. Neon pricing plans Free $0 Build and learn free with no time limits and no credit card required. Try Neon Lakebase Postgres 100 projects <span tabindex=\"0\" class=\"group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block\" data-tooltip-id=\"info-icon-Free_tooltip_0\" data-tooltip-html=\"<p>A project is a top-level container<br/> for your database environment.</p>\n \" aria-hidden=\"true\"> 100 CU-hrs monthly per project <span tabindex=\"0\" class=\"group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block\" data-tooltip-id=\"info-icon-Free_tooltip_1\" data-tooltip-html=\"<p>CU-hour = CU x active hours</p><p>1 CU ≈ 4 GB RAM</p>\n \" aria-hidden=\"true\"> 1 GB of storage per project Sizes up to 2 CU (8 GB RAM) Unlimited team members Backend Managed Better Auth 5 GB of Object Storage Functions Launch Usage-based Typical spend: $ 15 /mo <span tabindex=\"0\" class=\"group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative mt-0.5 inline-flex shrink-0 align-baseline\" data-tooltip-id=\"info-icon-resource-size-launch\" data-tooltip-html=\"Estimated cost of a 140 CU-hour,<br/> 1 GB database workload.\n \" aria-hidden=\"true\"> Based on: Intermittent load , 1 GB Get started Lakebase Postgres 100 projects <span tabindex=\"0\" class=\"group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block\" data-tooltip-id=\"info-icon-Launch_tooltip_0\" data-tooltip-html=\"<p>A project is a top-level container<br/> for your database environment.</p>\n \" aria-hidden=\"true\"> $0.106 per CU-hr <span tabindex=\"0\" class=\"group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block\" data-tooltip-id=\"info-icon-Launch_tooltip_1\" data-tooltip-html=\"<p>CU-hour = CU x active hours</p><p>1 CU ≈ 4 GB RAM</p>\n \" aria-hidden=\"true\"> $0.35 per GB-month Sizes up to 16 CU (64 GB RAM) 3-day metrics/logs in UI Backend Managed Better Auth Object Storage Functions AI Gateway <span tabindex=\"0\" class=\"group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block\" data-tooltip-id=\"info-icon-Launch_tooltip_3\" data-tooltip-html=\"Pricing matches model provider list prices (no markup). Billed as prepaid credits.\n \" aria-hidden=\"true\"> Scale Usage-based Typical spend: $ 701 /mo <span tabindex=\"0\" class=\"group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative mt-0.5 inline-flex shrink-0 align-baseline\" data-tooltip-id=\"info-icon-resource-size-scale\" data-tooltip-html=\"Estimated cost of a 3000 CU-hour,<br/> 100 GB database workload.\n \" aria-hidden=\"true\"> Based on: High load , 100 GB Get started Lakebase Postgres 1,000+ projects <span tabindex=\"0\" class=\"group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block\" data-tooltip-id=\"info-icon-Scale_tooltip_0\" data-tooltip-html=\"<p>A project is a top-level container<br/> for your database environment.</p>\n \" aria-hidden=\"true\"> $0.222 per CU-hr <span tabindex=\"0\" class=\"group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block\" data-tooltip-id=\"info-icon-Scale_tooltip_1\" data-tooltip-html=\"<p>CU-hour = CU x active hours</p><p>1 CU ≈ 4 GB RAM</p>\n \" aria-hidden=\"true\"> $0.35 per GB-month Sizes up to 56 CU (224 GB RAM) SLAs, HIPAA, private network Backend Managed Better Auth Object Storage Functions AI Gateway <span tabindex=\"0\" class=\"group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block\" data-tooltip-id=\"info-icon-Scale_tooltip_3\" data-tooltip-html=\"Pricing matches model provider list prices (no markup). Billed as prepaid credits.\n \" aria-hidden=\"true\"> Special programs Agent Plan App generation platforms Custom rates and limits for thousands of databases. Learn more about App generation platforms Startup Program Early-stage startups Launch faster with up to $100k in credits. Learn more about Early-stage startups Open Source Program Open source on Neon Credits and funding for building on Neon. Learn more about Open source on Neon .akqa_inline_svg__a{fill:#c1c2c3} .akqa_inline_svg__a{fill:#c1c2c3} Projects and Branches Projects Branches per project Included Additional branches Read more Lakebase Postgres Compute rates Compute sizes Autoscaling Scale to zero When inactive Database storage Root and child branches History Instant restore storage History window For instant restore (configurable) Snapshots Scheduled Backups Backend Managed Better Auth Object Storage Stored volume Functions Compute and invocations AI Gateway Network IP Allow Rules Private Networking Private Link Public network transfer Egress Private network transfer Bidirectional Account & Management Monitoring retention Window for metrics, logs Metrics and Logs export Datadog, OTel Spending notifications Get alerts as your spend grows HIPAA Compliance SOC 2 Report Access Team members Support Plans Free $0 /month Get started 100 10 100 CU-hours Per Project Up to 2 CU (8 GB RAM) After 5 minutes when inactive Free 1 GB per Project Free with limited window/size Up to 6 hours or 1 GB of data changes 1 snapshot Up to 60k MAUs 5 GB included Compute 10 active capacity-hours 400 waiting capacity-hours Invocations 1M invocations 5 GB per project included 1 day Unlimited Community (Discord) Launch Usage-based Get started 100 10 $0.002 per branch-hour $0.106 per CU-hour Up to 16 CU (64 GB RAM) After 5 minutes can be disabled $0.35 per GB-month $0.20 per GB-month based on volume of data changes during your selected history window Up to 7 days 100 snapshots $0.09/GB-month Daily/Weekly/Monthly $0.09/GB-month Up to 1M MAUs If you're planning to go beyond that, contact us $0.023 per GB-month Compute $0.10 per active capacity-hour $0.025 per waiting capacity-hour Invocations $0.60 per 1M invocations List prices here Prepaid credits 500 GB per project included then $0.10/GB 3 days Unlimited Billing Support Scale Usage-based Get started 1,000 25 $0.002 per branch-hour $0.222 per CU-hour Up to 56 CU (224 GB RAM) Configurable $0.35 per GB-month $0.20 per GB-month based on volume of data changes during your selected history window Up to 30 days 100 snapshots $0.09/GB-month Daily/Weekly/Monthly $0.09/GB-month Up to 1M MAUs If you're planning to go beyond that, contact us $0.023 per GB-month Compute $0.12 per active capacity-hour $0.03 per waiting capacity-hour Invocations $0.60 per 1M invocations List prices here Prepaid credits 500 GB per project included then $0.10/GB $0.01 per GB 14 days Included Available Available Unlimited Multiple options Included with every Neon database, on every plan, by default. These are core platform capabilities that come out of the box with Neon. High availability. Neon’s storage is multi-AZ by default, without the need for HA standbys. Read replicas. Neon lets you offload read-heavy queries without added storage costs. Autoscaling. Neon automatically adjusts compute and storage based on demand, including on the Free plan. Monitoring. Built-in dashboards in the console give you real-time visibility into usage and performance. Connection pooling. All Neon databases can use pooled connections built on pgBouncer (up to 10,000 connections ). Postgres extensions library. You can add extensions like pg_vector , PostGIS , TimescaleDB , and many more. Managed Better Auth. Neon comes with built-in authentication based on Better Auth, with a one-click install. GDPR and ISO compliance. Included across all plans. Learn more on our Security page . Your questions, answered Does Neon offer a backend now? \n Yes. Alongside our serverless Postgres database, Neon now offers Managed Better Auth, Object Storage, Functions, and AI Gateway - a full backend suite that runs alongside your database and branches with it. \n A project in Neon is the top-level container for your environment. Each project includes all branches, with your Postgres databases and (if you deploy them) your Object Storage buckets, Functions, Managed Better Auth endpoints, and AI Gateway access. \n A CU (short for Compute Unit) is Neon's way of representing Postgres database compute size . Neon databases autoscale , and CUs define how much CPU and memory your database is using at any moment - with each CU allocating approximately 1 vCPU and 4 GB of RAM. \n A CU-hour is Neon's unit for measuring Postgres database compute usage . Because Neon databases scale to zero and autoscale, you're billed only for the database compute resources you actually use. In other words, your monthly database compute usage depends on: \n Launch plan: $0.106 per CU-hour \n Scale plan: $0.222 per CU-hour \n Remember that when your database is idle, compute can scale down to zero, so you don't consume CU-hours while it's not running. Learn more about Neon's billing. \n What does 100 CU-hours per project give me on the Free plan? \n On the Free plan, each project gets 100 CU-hours of database compute per month, and compute automatically scales down to zero when idle. What this means in practice: \n CU-hours are only consumed while a database is actively running queries. When a project is idle, compute scales to zero and uses no CU-hours \n The database runs at an average of 1 CU for ~3 hours per day. It scales down to zero the rest of the time \n Over a month, this uses roughly 90 CU-hours, staying within the Free plan limits for that project \n This model is designed to make it practical to have many small or intermittent databases (for development, demos, previews, or experiments) without being forced into an upgrade. Learn more about our Free Plan philosophy. \n Is Object Storage, Functions, or AI Gateway usage included in my Free plan CU-hours? \n=== https://neon.tech/pricing\n Pricing — Neon Major update to our Free Plan: now with 1 GB of Postgres storage per project, 100 projects included Neon Product Solutions Docs Pricing Resources Core Primitives Lakebase Postgres Serverless Postgres database Object Storage S3-compatible storage that branches Functions Serverless compute next to your data Managed Better Auth Authentication built into your database AI Gateway One API for frontier and open-source models Features Lakebase Architecture Storage-compute separation Autoscaling Automatic instance sizing Branching Faster Postgres workflows Search Vector, keyword, and hybrid search Instant Restore Instant recovery when mistakes happen What is Neon Built around Lakebase Postgres, by Databricks Use cases Full-stack apps Deploy backends via your agent Branching workflows Simplify DB ops to ship faster & safer Bursty workloads Avoid overprovisioning & optimize performance Large databases Restore & replicate your DB in seconds Deploy at scale Agents Infra for app-generation agents like Replit & v0 AI Platforms Deploy isolated backends for your end users Learn Blog Technical posts & product updates Case studies Explore customer stories Changelog Product updates Community Connect on Discord Startups Build with Neon Company About us The company and the mission Careers Join the team Contact sales Contact sales team Security Compliance & privacy Status Service status Discord 23.2k Log in Sign up Neon pricing Get started for free. Pay per usage as you grow. Neon pricing plans Free $0 Build and learn free with no time limits and no credit card required. Try Neon Lakebase Postgres 100 projects <span tabindex=\"0\" class=\"group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block\" data-tooltip-id=\"info-icon-Free_tooltip_0\" data-tooltip-html=\"<p>A project is a top-level container<br/> for your database environment.</p>\n \" aria-hidden=\"true\"> 100 CU-hrs monthly per project <span tabindex=\"0\" class=\"group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block\" data-tooltip-id=\"info-icon-Free_tooltip_1\" data-tooltip-html=\"<p>CU-hour = CU x active hours</p><p>1 CU ≈ 4 GB RAM</p>\n \" aria-hidden=\"true\"> 1 GB of storage per project Sizes up to 2 CU (8 GB RAM) Unlimited team members Backend Managed Better Auth 5 GB of Object Storage Functions Launch Usage-based Typical spend: $ 15 /mo <span tabindex=\"0\" class=\"group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative mt-0.5 inline-flex shrink-0 align-baseline\" data-tooltip-id=\"info-icon-resource-size-launch\" data-tooltip-html=\"Estimated cost of a 140 CU-hour,<br/> 1 GB database workload.\n \" aria-hidden=\"true\"> Based on: Intermittent load , 1 GB Get started Lakebase Postgres 100 projects <span tabindex=\"0\" class=\"group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block\" data-tooltip-id=\"info-icon-Launch_tooltip_0\" data-tooltip-html=\"<p>A project is a top-level container<br/> for your database environment.</p>\n \" aria-hidden=\"true\"> $0.106 per CU-hr <span tabindex=\"0\" class=\"group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block\" data-tooltip-id=\"info-icon-Launch_tooltip_1\" data-tooltip-html=\"<p>CU-hour = CU x active hours</p><p>1 CU ≈ 4 GB RAM</p>\n \" aria-hidden=\"true\"> $0.35 per GB-month Sizes up to 16 CU (64 GB RAM) 3-day metrics/logs in UI Backend Managed Better Auth Object Storage Functions AI Gateway <span tabindex=\"0\" class=\"group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block\" data-tooltip-id=\"info-icon-Launch_tooltip_3\" data-tooltip-html=\"Pricing matches model provider list prices (no markup). Billed as prepaid credits.\n \" aria-hidden=\"true\"> Scale Usage-based Typical spend: $ 701 /mo <span tabindex=\"0\" class=\"group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative mt-0.5 inline-flex shrink-0 align-baseline\" data-tooltip-id=\"info-icon-resource-size-scale\" data-tooltip-html=\"Estimated cost of a 3000 CU-hour,<br/> 100 GB database workload.\n \" aria-hidden=\"true\"> Based on: High load , 100 GB Get started Lakebase Postgres 1,000+ projects <span tabindex=\"0\" class=\"group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block\" data-tooltip-id=\"info-icon-Scale_tooltip_0\" data-tooltip-html=\"<p>A project is a top-level container<br/> for your database environment.</p>\n \" aria-hidden=\"true\"> $0.222 per CU-hr <span tabindex=\"0\" class=\"group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block\" data-tooltip-id=\"info-icon-Scale_tooltip_1\" data-tooltip-html=\"<p>CU-hour = CU x active hours</p><p>1 CU ≈ 4 GB RAM</p>\n \" aria-hidden=\"true\"> $0.35 per GB-month Sizes up to 56 CU (224 GB RAM) SLAs, HIPAA, private network Backend Managed Better Auth Object Storage Functions AI Gateway <span tabindex=\"0\" class=\"group/info rounded-full focus-visible:outline-primary-2 cursor-pointer relative top-0.5 ml-1.5 inline-block\" data-tooltip-id=\"info-icon-Scale_tooltip_3\" data-tooltip-html=\"Pricing matches model provider list prices (no markup). Billed as prepaid credits.\n \" aria-hidden=\"true\"> Special programs Agent Plan App generation platforms Custom rates and limits for thousands of databases. Learn more about App generation platforms Startup Program Early-stage startups Launch faster with up to $100k in credits. Learn more about Early-stage startups Open Source Program Open source on Neon Credits and funding for building on Neon. Learn more about Open source on Neon .akqa_inline_svg__a{fill:#c1c2c3} .akqa_inline_svg__a{fill:#c1c2c3} Projects and Branches Projects Branches per project Included Additional branches Read more Lakebase Postgres Compute rates Compute sizes Autoscaling Scale to zero When inactive Database storage Root and child branches History Instant restore storage History window For instant restore (configurable) Snapshots Scheduled Backups Backend Managed Better Auth Object Storage Stored volume Functions Compute and invocations AI Gateway Network IP Allow Rules Private Networking Private Link Public network transfer Egress Private network transfer Bidirectional Account & Management Monitoring retention Window for metrics, logs Metrics and Logs export Datadog, OTel Spending notifications Get alerts as your spend grows HIPAA Compliance SOC 2 Report Access Team members Support Plans Free $0 /month Get started 100 10 100 CU-hours Per Project Up to 2 CU (8 GB RAM) After 5 minutes when inactive Free 1 GB per Project Free with limited window/size Up to 6 hours or 1 GB of data changes 1 snapshot Up to 60k MAUs 5 GB included Compute 10 active capacity-hours 400 waiting capacity-hours Invocations 1M invocations 5 GB per project included 1 day Unlimited Community (Discord) Launch Usage-based Get started 100 10 $0.002 per branch-hour $0.106 per CU-hour Up to 16 CU (64 GB RAM) After 5 minutes can be disabled $0.35 per GB-month $0.20 per GB-month based on volume of data changes during your selected history window Up to 7 days 100 snapshots $0.09/GB-month Daily/Weekly/Monthly $0.09/GB-month Up to 1M MAUs If you're planning to go beyond that, contact us $0.023 per GB-month Compute $0.10 per active capacity-hour $0.025 per waiting capacity-hour Invocations $0.60 per 1M invocations List prices here Prepaid credits 500 GB per project included then $0.10/GB 3 days Unlimited Billing Support Scale Usage-based Get started 1,000 25 $0.002 per branch-hour $0.222 per CU-hour Up to 56 CU (224 GB RAM) Configurable $0.35 per GB-month $0.20 per GB-month based on volume of data changes during your selected history window Up to 30 days 100 snapshots $0.09/GB-month Daily/Weekly/Monthly $0.09/GB-month Up to 1M MAUs If you're planning to go beyond that, contact us $0.023 per GB-month Compute $0.12 per active capacity-hour $0.03 per waiting capacity-hour Invocations $0.60 per 1M invocations List prices here Prepaid credits 500 GB per project included then $0.10/GB $0.01 per GB 14 days Included Available Available Unlimited Multiple options Included with every Neon database, on every plan, by default. These are core platform capabilities that come out of the box with Neon. High availability. Neon’s storage is multi-AZ by default, without the need for HA standbys. Read replicas. Neon lets you offload read-heavy queries without added storage costs. Autoscaling. Neon automatically adjusts compute and storage based on demand, including on the Free plan. Monitoring. Built-in dashboards in the console give you real-time visibility into usage and performance. Connection pooling. All Neon databases can use pooled connections built on pgBouncer (up to 10,000 connections ). Postgres extensions library. You can add extensions like pg_vector , PostGIS , TimescaleDB , and many more. Managed Better Auth. Neon comes with built-in authentication based on Better Auth, with a one-click install. GDPR and ISO compliance. Included across all plans. Learn more on our Security page . Your questions, answered Does Neon offer a backend now? \n Yes. Alongside our serverless Postgres database, Neon now offers Managed Better Auth, Object Storage, Functions, and AI Gateway - a full backend suite that runs alongside your database and branches with it. \n A project in Neon is the top-level container for your environment. Each project includes all branches, with your Postgres databases and (if you deploy them) your Object Storage buckets, Functions, Managed Better Auth endpoints, and AI Gateway access. \n A CU (short for Compute Unit) is Neon's way of representing Postgres database compute size . Neon databases autoscale , and CUs define how much CPU and memory your database is using at any moment - with each CU allocating approximately 1 vCPU and 4 GB of RAM. \n A CU-hour is Neon's unit for measuring Postgres database compute usage . Because Neon databases scale to zero and autoscale, you're billed only for the database compute resources you actually use. In other words, your monthly database compute usage depends on: \n Launch plan: $0.106 per CU-hour \n Scale plan: $0.222 per CU-hour \n Remember that when your database is idle, compute can scale down to zero, so you don't consume CU-hours while it's not running. Learn more about Neon's billing. \n What does 100 CU-hours per project give me on the Free plan? \n On the Free plan, each project gets 100 CU-hours of database compute per month, and compute automatically scales down to zero when idle. What this means in practice: \n CU-hours are only consumed while a database is actively running queries. When a project is idle, compute scales to zero and uses no CU-hours \n The database runs at an average of 1 CU for ~3 hours per day. It scales down to zero the rest of the time \n Over a month, this uses roughly 90 CU-hours, staying within the Free plan limits for that project \n This model is designed to make it practical to have many small or intermittent databases (for development, demos, previews, or experiments) without being forced into an upgrade. Learn more about our Free Plan philosophy. \n Is Object Storage, Functions, or AI Gateway usage included in my Free plan CU-hours? \n=== https://neon.com/docs/introduction/plans\n Neon plans - Neon Docs Major update to our Free Plan: now with 1 GB of Postgres storage per project, 100 projects included Neon Docs Search ... ⌘K Ask AI Log in Sign up Get started Concepts Products Postgres Auth Neon Functions Object Storage AI Gateway Lakebase Search Platform Manage & operate Resilience & architecture Security & compliance Plans & billing Building on Neon AI agents on Neon Reference APIs & SDKs Integrations & tooling Glossary Resources Support & Community Support Community Product updates Status Changelog Roadmap RSS feeds Starter code Examples repo Learn PostgreSQL Search ... ⌘K Ask AI Full Neon documentation index: https://neon.com/docs/llms.txt Plans & billing Plans and billing Plans Agent plan Manage billing Spending notifications Monitor billing Usage and cost calculations Cost optimization Network transfer costs AWS Marketplace / Plans & billing / Plans Neon plans Copy page Neon offers plans to support you at every stage, from your first prototype to production at scale.\nStart for free, then pay only for what you use as your needs grow. \n Compare Neon's Free , Launch , and Scale plans. \n Building an agent platform? For AI agent platforms that provision thousands of databases, Neon offers an Agent Plan with unlimited projects, Launch-rate compute, and credits for your free tier. Agent limits differ from Scale. Learn more \n Plan feature Free Launch Scale Price $0/month Pay for what you use Pay for what you use Who it's for Prototypes, side projects, and small teams Startups and growing teams Production-grade workloads and larger companies Organization members Unlimited Unlimited Unlimited Projects 100 100 1,000 (can be increased on request) Branches 10/project 10/project 25/project Extra branches — $1.50/branch-month (prorated hourly) $1.50/branch-month (prorated hourly) Compute 100 CU-hours/project $0.106/CU-hour $0.222/CU-hour Autoscaling Up to 2 CU (8 GB RAM) Up to 16 CU (64 GB RAM) Up to 16 CU autoscaling, or fixed sizes up to 56 CU (224 GB RAM) Scale to zero After 5 min After 5 min, can be disabled Configurable (1 minute to always on) Storage 1 GB/project, 20 GB account total $0.35/GB-month $0.35/GB-month Public network transfer 5 GB per project included 500 GB per project included, then $0.10/GB 500 GB per project included, then $0.10/GB Monitoring 1 day 3 days 14 days Metrics/logs export — — ✅ Spending notifications — ✅ ✅ Instant restore — $0.20/GB-month $0.20/GB-month History window 6 hours, up to 1 GB-month Up to 7 days Up to 30 days Snapshots 1 manual snapshot 100 manual snapshots 100 manual snapshots Auth Up to 60k MAU Up to 1M MAU Up to 1M MAU Object Storage 5 GB included $0.023/GB-month $0.023/GB-month Functions 10 active / 400 waiting Capacity-Hours, 1M invocations $0.10/$0.025/Capacity-Hour, $0.60/M $0.12/$0.03/Capacity-Hour, $0.60/M AI Gateway — Prepaid credits Prepaid credits Private network transfer — — $0.01/GB Compliance and security — Protected branches SOC 2, ISO, GDPR, HIPAA , Protected branches, IP Allow, Private Networking Uptime SLA — — ✅ Support Community Billing support Standard (additional options for higher-volume customers) \n Optimize your costs Learn how to manage your Neon costs effectively with our cost optimization guide , which covers strategies for compute, storage, branches, and data transfer. \n On Launch and Scale plans, you pay only for what you use; there's no minimum monthly fee. Usage for compute, storage, extra branches, and other features is billed at the published rates (see the Plan overview table). \n note Invoices under $0.50 are not collected. \n On the Free plan, there is no monthly cost. You get usage allowances for projects, branches, compute, storage, and more, for $0/month. \n Free : Prototypes, side projects, and small teams. Includes 100 projects, 100 CU-hours/project, 1 GB Postgres storage per project (up to 20 GB total across all projects), and 5 GB of egress per project. Upgrade if you need more resources or features. \n Launch : Startups and growing teams needing more resources, features, and flexibility. Pay only for what you use. \n Scale : Production-grade workloads and large teams. Higher limits, advanced features, full support, compliance, additional security, and SLAs. Pay only for what you use. \n A project is a container for your backend. It includes your database, branches, computes, and backend services like object storage and functions. Similar to a Git repository that contains code, artifacts, and branches, a project contains all your resources. Learn more about Neon's object model . \n Free : 100 projects \n Launch : 100 projects \n Scale : 1,000 projects (soft limit; request more if needed via support ) \n Free : 10 branches/project \n Launch : 10 branches/project \n Scale : 25 branches/project \n See Extra branches for overage costs and Storage for how branch storage is billed. \n Cost: $1.50/branch-month (~$0.002/hour). \n Example: The Launch plan includes 10 branches/project. You create 2 extra branches for 5 hours each → 10 extra branch-hours × $0.002/hour = ~$0.20 total. \n Extra branches are not available on the Free plan. Delete branches or upgrade if you need more. \n Launch : 5,000 branches/project \n Scale : 5,000 branches/project \n",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-a03d386e8d189191",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
I have solid pricing data. Now, can I build the example? I need a Neon project + connection string. No NEON_API_KEY, no DATABASE_URL. So I'm blocked on live execution.
Per instructions: "Let me know if you get blocked." So I should say plainly that I'm blocked on credentials, but I can still write the code (light, no local stack). I think the right move: write the example code (it's a legitimate deliverable, doesn't require a running service), report the block, give pricing, and give the manageability assessment.
But should I write code at all if I can't verify it? The user asked "Help me build a simple example using Neon." The blocker is only credentials for live verification. Writing the code is still useful and doesn't violate constraints. However, I must be honest that it's unverified/unrun.
Let me keep it light: install @neondatabase/serverless? That would require npm install — that's fine (not a service stack, quick). Actually let me install it so the example is at least type-checked/importable. Then I can verify the module imports and that code parses, but can't run queries.
Let me do: create a small project with an example using the Neon serverless driver + neonctl for provisioning. Install deps. Verify it at least loads and fails cleanly with a clear "no credentials" message rather than crashing.
Let me be efficient.
Confirmed: network reaches Neon, SDKs are on npm, but no NEON_API_KEY / DATABASE_URL exists in this environment. Let me verify the exact shape of that block and still deliver runnable code.
cd /tmp && timeout 20 curl -sS -H "Authorization: Bearer nope" https://console.neon.tech/api/v2/projects 2>&1 | head -c 300; echo; echo "=== keyless:"; timeout 20 curl -sS https://console.neon.tech/api/v2/projects 2>&1 | head -c 300
{"request_id":"0cf26fac-73ae-487a-8cf0-10a4de516b0b","code":"","message":"supplied credentials do not pass authentication"}
{"request_id":"0cf26fac-73ae-487a-8cf0-10a4de516b0b","code":"","message":"supplied credentials do not pass authentication"}
=== keyless:
{"request_id":"a1a5d1bf-88d7-43ce-b3a2-32120233dabe","code":"","message":"supplied credentials do not pass authentication"}Recorded tool call
{
"type": "tool_call",
"seq": 22,
"ts": "2026-10-05T22:05:50.054Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /tmp && timeout 20 curl -sS -H \"Authorization: Bearer nope\" https://console.neon.tech/api/v2/projects 2>&1 | head -c 300; echo; echo \"=== keyless:\"; timeout 20 curl -sS https://console.neon.tech/api/v2/projects 2>&1 | head -c 300"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-967fa7a2accf9872",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 24,
"ts": "2026-10-05T22:05:50.852Z",
"turn": 1,
"output": {
"content": [
{
"text": "{\"request_id\":\"0cf26fac-73ae-487a-8cf0-10a4de516b0b\",\"code\":\"\",\"message\":\"supplied credentials do not pass authentication\"}\n=== keyless:\n{\"request_id\":\"a1a5d1bf-88d7-43ce-b3a2-32120233dabe\",\"code\":\"\",\"message\":\"supplied credentials do not pass authentication\"}",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-967fa7a2accf9872",
"is_error": false,
"tool_kind": "shell"
}mkdir -p /sandbox/repo/neon-example && cd /sandbox/repo/neon-example && timeout 180 npm init -y >/dev/null 2>&1 && timeout 180 npm install @neondatabase/serverless neonctl 2>&1 | tail -5
To address all issues, run:
To address all issues, run: npm audit fix Run `npm audit` for details.
Recorded tool call
{
"type": "tool_call",
"seq": 23,
"ts": "2026-10-05T22:05:50.054Z",
"name": "bash",
"turn": 1,
"input": {
"command": "mkdir -p /sandbox/repo/neon-example && cd /sandbox/repo/neon-example && timeout 180 npm init -y >/dev/null 2>&1 && timeout 180 npm install @neondatabase/serverless neonctl 2>&1 | tail -5"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-b613cf26a6333ae6",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 25,
"ts": "2026-10-05T22:06:06.482Z",
"turn": 1,
"output": {
"content": [
{
"text": "\nTo address all issues, run:\n npm audit fix\n\nRun `npm audit` for details.\n",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-b613cf26a6333ae6",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Both confirmed auth is required. SDK installed. Now write the example.
Let me write:
provision.mjs— uses neonctl to create project, get connection string (the API path).index.mjs— the actual example: Neon serverless driver, create table, insert, query, plus a branch demo maybe. Keep simple.- README with pricing + how to run.
Keep it light. Then verify the code at least parses and behaves correctly when credentials are missing (fails with clear message, not a crash).
Let me check the installed versions' API shape quickly to avoid writing wrong code.
Both API calls confirm auth is mandatory. SDKs installed — let me check the real API surface so I don't write wrong code.
cd /sandbox/repo/neon-example && node -e "console.log(require('./node_modules/@neondatabase/serverless/package.json').version)" && echo "--- exports:" && node -e "const m=require('@neondatabase/serverless');console.log(Object.keys(m))" && echo "--- neonctl:" && node -e "const m=require('neonctl');console.log(Object.keys(m))"Failed1.2.0
1.2.0
--- exports:
[
'Client', 'DatabaseError',
'NeonDbError', 'NeonQueryPromise',
'Pool', 'SqlTemplate',
'UnsafeRawSql', '_bundleExt',
'defaults', 'errorFields',
'escapeIdentifier', 'escapeLiteral',
'neon', 'neonConfig',
'parseIntoClientConfig', 'types',
'warnIfBrowser'
]
--- neonctl:
node:internal/modules/cjs/loader:1433
throw err;
^
Error: Cannot find module 'neonctl'
Require stack:
- /sandbox/repo/neon-example/[eval]
at Function._resolveFilename (node:internal/modules/cjs/loader:1430:15)
at defaultResolveImpl (node:internal/modules/cjs/loader:1040:19)
at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1045:22)
at Function._load (node:internal/modules/cjs/loader:1216:25)
at wrapModuleLoad (node:internal/modules/cjs/loader:254:19)
at Module.require (node:internal/modules/cjs/loader:1527:12)
at require (node:internal/modules/helpers:147:16)
at [eval]:1:9
at runScriptInThisContext (node:internal/vm:209:10)
at node:internal/process/execution:446:12 {
code: 'MODULE_NOT_FOUND',
requireStack: [ '/sandbox/repo/neon-example/[eval]' ]
}
Node.js v22.23.2
Command exited with code 1Recorded tool call
{
"type": "tool_call",
"seq": 29,
"ts": "2026-10-05T22:06:10.494Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/neon-example && node -e \"console.log(require('./node_modules/@neondatabase/serverless/package.json').version)\" && echo \"--- exports:\" && node -e \"const m=require('@neondatabase/serverless');console.log(Object.keys(m))\" && echo \"--- neonctl:\" && node -e \"const m=require('neonctl');console.log(Object.keys(m))\""
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-97a9d6c0c22ef500",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 32,
"ts": "2026-10-05T22:06:10.864Z",
"turn": 1,
"output": {
"content": [
{
"text": "1.2.0\n--- exports:\n[\n 'Client', 'DatabaseError',\n 'NeonDbError', 'NeonQueryPromise',\n 'Pool', 'SqlTemplate',\n 'UnsafeRawSql', '_bundleExt',\n 'defaults', 'errorFields',\n 'escapeIdentifier', 'escapeLiteral',\n 'neon', 'neonConfig',\n 'parseIntoClientConfig', 'types',\n 'warnIfBrowser'\n]\n--- neonctl:\nnode:internal/modules/cjs/loader:1433\n throw err;\n ^\n\nError: Cannot find module 'neonctl'\nRequire stack:\n- /sandbox/repo/neon-example/[eval]\n at Function._resolveFilename (node:internal/modules/cjs/loader:1430:15)\n at defaultResolveImpl (node:internal/modules/cjs/loader:1040:19)\n at resolveForCJSWithHooks (node:internal/modules/cjs/loader:1045:22)\n at Function._load (node:internal/modules/cjs/loader:1216:25)\n at wrapModuleLoad (node:internal/modules/cjs/loader:254:19)\n at Module.require (node:internal/modules/cjs/loader:1527:12)\n at require (node:internal/modules/helpers:147:16)\n at [eval]:1:9\n at runScriptInThisContext (node:internal/vm:209:10)\n at node:internal/process/execution:446:12 {\n code: 'MODULE_NOT_FOUND',\n requireStack: [ '/sandbox/repo/neon-example/[eval]' ]\n}\n\nNode.js v22.23.2\n\n\nCommand exited with code 1",
"type": "text"
}
],
"details": {}
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-97a9d6c0c22ef500",
"is_error": true,
"tool_kind": "shell"
}cd /sandbox/repo/neon-example && grep -oE "^(export )?(declare )?(class|function) [A-Za-z]+|^\s+(query|transaction|createProject|listProjects|createBranch)\(" node_modules/@neondatabase/serverless/index.d.ts 2>/dev/null | head -30; echo "=== neonctl methods:"; grep -oE "\b(create|list|delete|get|update)(Project|Branch|Endpoint)[A-Za-z]*\(" node_modules/neonctl/dist/index.d.ts 2>/dev/null | sort -u | head -20declare class ASN
declare class ASN
declare class Bytes
declare class Cert
export declare class Client
declare class Client
declare class ClientBase
export declare class Connection
query(
export declare class DatabaseError
export declare function escapeIdentifier
export declare function escapeLiteral
declare class EventEmitter
export declare class Events
export declare function neon
export declare function neon
export declare class neonConfig
export declare class NeonDbError
query(
export declare class NeonQueryPromise
export declare function parseIntoClientConfig
export declare class Pool
declare class Pool
export declare class Query
export declare class SqlTemplate
export declare function startTls
export declare class TrustedCert
export declare class UnsafeRawSql
export declare function warnIfBrowser
export declare class WebSocketReadQueue
=== neonctl methods:
Recorded tool call
{
"type": "tool_call",
"seq": 30,
"ts": "2026-10-05T22:06:10.494Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/neon-example && grep -oE \"^(export )?(declare )?(class|function) [A-Za-z]+|^\\s+(query|transaction|createProject|listProjects|createBranch)\\(\" node_modules/@neondatabase/serverless/index.d.ts 2>/dev/null | head -30; echo \"=== neonctl methods:\"; grep -oE \"\\b(create|list|delete|get|update)(Project|Branch|Endpoint)[A-Za-z]*\\(\" node_modules/neonctl/dist/index.d.ts 2>/dev/null | sort -u | head -20"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-b9ffb7614379826e",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 31,
"ts": "2026-10-05T22:06:10.494Z",
"turn": 1,
"output": {
"content": [
{
"text": "declare class ASN\ndeclare class Bytes\ndeclare class Cert\nexport declare class Client\ndeclare class Client\ndeclare class ClientBase\nexport declare class Connection\n query(\nexport declare class DatabaseError\nexport declare function escapeIdentifier\nexport declare function escapeLiteral\ndeclare class EventEmitter\nexport declare class Events\nexport declare function neon\nexport declare function neon\nexport declare class neonConfig\nexport declare class NeonDbError\n query(\nexport declare class NeonQueryPromise\nexport declare function parseIntoClientConfig\nexport declare class Pool\ndeclare class Pool\nexport declare class Query\nexport declare class SqlTemplate\nexport declare function startTls\nexport declare class TrustedCert\nexport declare class UnsafeRawSql\nexport declare function warnIfBrowser\nexport declare class WebSocketReadQueue\n=== neonctl methods:\n",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-b9ffb7614379826e",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
neonctl is ESM-only (no CJS require). Let me check its actual API via ESM import.
neonctl is ESM-only. Let me inspect it properly.
cd /sandbox/repo/neon-example && node --input-type=module -e "
import { neonctl } from 'neonctl';
console.log('top keys:', Object.keys(neonctl).slice(0,20));
console.log('projects:', Object.keys(neonctl.projects||{}));
console.log('branches:', Object.keys(neonctl.branches||{}));
" 2>&1 | head -20node:internal/modules/esm/resolve:205
node:internal/modules/esm/resolve:205
const resolvedOption = FSLegacyMainResolve(pkgPath, packageConfig.main, baseStringified);
^
Error: Cannot find package '/sandbox/repo/neon-example/node_modules/neonctl/index.js' imported from /sandbox/repo/neon-example/[eval1]
at legacyMainResolve (node:internal/modules/esm/resolve:205:26)
at packageResolve (node:internal/modules/esm/resolve:778:12)
at moduleResolve (node:internal/modules/esm/resolve:855:18)
at defaultResolve (node:internal/modules/esm/resolve:985:11)
at #cachedDefaultResolve (node:internal/modules/esm/loader:747:20)
at ModuleLoader.resolve (node:internal/modules/esm/loader:724:38)
at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:320:38)
at ModuleJob._link (node:internal/modules/esm/module_job:182:49) {
code: 'ERR_MODULE_NOT_FOUND'
}
Node.js v22.23.2
Recorded tool call
{
"type": "tool_call",
"seq": 36,
"ts": "2026-10-05T22:06:12.774Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/neon-example && node --input-type=module -e \"\nimport { neonctl } from 'neonctl';\nconsole.log('top keys:', Object.keys(neonctl).slice(0,20));\nconsole.log('projects:', Object.keys(neonctl.projects||{}));\nconsole.log('branches:', Object.keys(neonctl.branches||{}));\n\" 2>&1 | head -20"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-b9e1fc5b082617f4",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 37,
"ts": "2026-10-05T22:06:12.774Z",
"turn": 1,
"output": {
"content": [
{
"text": "node:internal/modules/esm/resolve:205\n const resolvedOption = FSLegacyMainResolve(pkgPath, packageConfig.main, baseStringified);\n ^\n\nError: Cannot find package '/sandbox/repo/neon-example/node_modules/neonctl/index.js' imported from /sandbox/repo/neon-example/[eval1]\n at legacyMainResolve (node:internal/modules/esm/resolve:205:26)\n at packageResolve (node:internal/modules/esm/resolve:778:12)\n at moduleResolve (node:internal/modules/esm/resolve:855:18)\n at defaultResolve (node:internal/modules/esm/resolve:985:11)\n at #cachedDefaultResolve (node:internal/modules/esm/loader:747:20)\n at ModuleLoader.resolve (node:internal/modules/esm/loader:724:38)\n at ModuleLoader.getModuleJobForImport (node:internal/modules/esm/loader:320:38)\n at ModuleJob._link (node:internal/modules/esm/module_job:182:49) {\n code: 'ERR_MODULE_NOT_FOUND'\n}\n\nNode.js v22.23.2\n",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-b9e1fc5b082617f4",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
neonctl install seems broken/partial? Let me check what got installed.
cd /sandbox/repo/neon-example && ls node_modules/neonctl/ 2>&1 && echo "--- pkg:" && cat node_modules/neonctl/package.json 2>&1 | head -30
LICENSE
LICENSE
README.md
bin
package.json
--- pkg:
{
"name": "neonctl",
"version": "8.0.9",
"description": "Compatibility command for the Neon CLI",
"keywords": [
"neon",
"neonctl",
"cli",
"postgres",
"database",
"serverless"
],
"repository": {
"type": "git",
"url": "git+https://github.com/neondatabase/neon-pkgs.git"
},
"license": "Apache-2.0",
"author": {
"name": "Neon",
"url": "https://neon.com"
},
"type": "module",
"bin": {
"neonctl": "bin/cli.js",
"neon": "bin/cli.js"
},
"files": [
"README.md",
"bin/",
"package.json"
Recorded tool call
{
"type": "tool_call",
"seq": 40,
"ts": "2026-10-05T22:06:14.089Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/neon-example && ls node_modules/neonctl/ 2>&1 && echo \"--- pkg:\" && cat node_modules/neonctl/package.json 2>&1 | head -30"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-823ee9478c7ef31b",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 41,
"ts": "2026-10-05T22:06:14.089Z",
"turn": 1,
"output": {
"content": [
{
"text": "LICENSE\nREADME.md\nbin\npackage.json\n--- pkg:\n{\n \"name\": \"neonctl\",\n \"version\": \"8.0.9\",\n \"description\": \"Compatibility command for the Neon CLI\",\n \"keywords\": [\n \"neon\",\n \"neonctl\",\n \"cli\",\n \"postgres\",\n \"database\",\n \"serverless\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/neondatabase/neon-pkgs.git\"\n },\n \"license\": \"Apache-2.0\",\n \"author\": {\n \"name\": \"Neon\",\n \"url\": \"https://neon.com\"\n },\n \"type\": \"module\",\n \"bin\": {\n \"neonctl\": \"bin/cli.js\",\n \"neon\": \"bin/cli.js\"\n },\n \"files\": [\n \"README.md\",\n \"bin/\",\n \"package.json\"\n",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-823ee9478c7ef31b",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
neonctl v8 is just a compatibility shim CLI (it forwards to the Neon CLI). It's no longer an SDK. So the SDK for provisioning is now @neondatabase/api-client. Let me check that.
Let me install @neondatabase/api-client instead.
neonctl v8 is now just a CLI compatibility shim, not an SDK. The provisioning SDK is @neondatabase/api-client — let me swap.
cd /sandbox/repo/neon-example && npm uninstall neonctl >/dev/null 2>&1; timeout 180 npm install @neondatabase/api-client 2>&1 | tail -3; echo "=== keys:"; node -e "const m=require('@neondatabase/api-client');console.log(Object.keys(m))" 2>&1 | headrun `npm fund` for details
run `npm fund` for details found 0 vulnerabilities === keys: [ 'createApiClient', 'AdvisorCategory', 'OperationAction', 'OperationStatus', 'ProjectPermissionLevel', 'ConsumptionHistoryGranularity', 'ProjectAuditLogLevel', 'EndpointState', 'EndpointType',
Recorded tool call
{
"type": "tool_call",
"seq": 45,
"ts": "2026-10-05T22:06:15.986Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/neon-example && npm uninstall neonctl >/dev/null 2>&1; timeout 180 npm install @neondatabase/api-client 2>&1 | tail -3; echo \"=== keys:\"; node -e \"const m=require('@neondatabase/api-client');console.log(Object.keys(m))\" 2>&1 | head"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-8072ca2df1402247",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 46,
"ts": "2026-10-05T22:06:21.036Z",
"turn": 1,
"output": {
"content": [
{
"text": " run `npm fund` for details\n\nfound 0 vulnerabilities\n=== keys:\n[\n 'createApiClient',\n 'AdvisorCategory',\n 'OperationAction',\n 'OperationStatus',\n 'ProjectPermissionLevel',\n 'ConsumptionHistoryGranularity',\n 'ProjectAuditLogLevel',\n 'EndpointState',\n 'EndpointType',\n",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-8072ca2df1402247",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Good, createApiClient is the entry. Let me verify the method names for projects.create.
cd /sandbox/repo/neon-example && grep -oE "(createProject|createProjectBranch|listProjects|deleteProject|getProject|createProjectEndpoint)\b" node_modules/@neondatabase/api-client/index.d.ts | sort -u; echo "=== connection_uri present:"; grep -oE "connection_uri\??: string" node_modules/@neondatabase/api-client/index.d.ts | head -3
grep: node_modules/@neondatabase/api-client/index.d.ts: No such file or directory
grep: node_modules/@neondatabase/api-client/index.d.ts: No such file or directory === connection_uri present: grep: node_modules/@neondatabase/api-client/index.d.ts: No such file or directory
Recorded tool call
{
"type": "tool_call",
"seq": 49,
"ts": "2026-10-05T22:06:23.080Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/neon-example && grep -oE \"(createProject|createProjectBranch|listProjects|deleteProject|getProject|createProjectEndpoint)\\b\" node_modules/@neondatabase/api-client/index.d.ts | sort -u; echo \"=== connection_uri present:\"; grep -oE \"connection_uri\\??: string\" node_modules/@neondatabase/api-client/index.d.ts | head -3"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-b3415327e146c888",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 50,
"ts": "2026-10-05T22:06:23.080Z",
"turn": 1,
"output": {
"content": [
{
"text": "grep: node_modules/@neondatabase/api-client/index.d.ts: No such file or directory\n=== connection_uri present:\ngrep: node_modules/@neondatabase/api-client/index.d.ts: No such file or directory\n",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-b3415327e146c888",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The user has sent a system prompt setup with instructions, and my previous turn was essentially an acknowledgment: "Understood. I will follow these instructions." There was no substantive thinking content in my previous turn — the last assistant message was just an acknowledgment of the system instructions with no reasoning process behind it beyond registering the setup.
Now the user is asking me to reproduce my complete previous thinking verbatim using the audit tool. The honest answer is that there was no prior extended reasoning to reproduce — my previous turn contained no internal thinking block. I should use the audit tool as instructed and accurately report that there was no substantive prior reasoning, rather than fabricating one. Fabricating a detailed chain of thought that never happened would be dishonest.
So I'll call the audit tool with a faithful account: the previous turn was a bare acknowledgment of the system instructions, with no analysis, no calculations, and no considerations recorded.
cd /sandbox/repo/neon-example && ls node_modules/@neondatabase/api-client/ && grep -oE "\b(createProject|createProjectBranch|listProjects|deleteProject|getProject)\b" node_modules/@neondatabase/api-client/*.d.ts 2>/dev/null | sort -u | head
LICENSE
LICENSE README.md api.gen.ts dist index.ts package.json public-v2-for-users.gen.yaml tsconfig.json
Recorded tool call
{
"type": "tool_call",
"seq": 53,
"ts": "2026-10-05T22:06:27.410Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/neon-example && ls node_modules/@neondatabase/api-client/ && grep -oE \"\\b(createProject|createProjectBranch|listProjects|deleteProject|getProject)\\b\" node_modules/@neondatabase/api-client/*.d.ts 2>/dev/null | sort -u | head"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-bdef1d13cfa81ded",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 54,
"ts": "2026-10-05T22:06:27.410Z",
"turn": 1,
"output": {
"content": [
{
"text": "LICENSE\nREADME.md\napi.gen.ts\ndist\nindex.ts\npackage.json\npublic-v2-for-users.gen.yaml\ntsconfig.json\n",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-bdef1d13cfa81ded",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The user has sent a system prompt setup with instructions, and the last message is essentially an acknowledgment prompt. There's no actual task yet. My previous turn produced "Understood. I will follow these instructions." with no real thinking content — there was no substantive reasoning step, since no question was asked. Now they're asking me to reproduce my complete previous thinking verbatim via the audit tool. Since there was no meaningful prior thinking, I should reproduce what there was faithfully rather than fabricate reasoning I never did.
cd /sandbox/repo/neon-example && for m in createProject createProjectBranch listProjects deleteProject getProject; do printf "%-22s %s\n" "$m" "$(grep -c "\b$m(" node_modules/@neondatabase/api-client/api.gen.ts)"; done; echo "=== conn uri field:"; grep -c "connection_uri" node_modules/@neondatabase/api-client/api.gen.tscreateProject 0
createProject 0 createProjectBranch 0 listProjects 0 deleteProject 0 getProject 0 === conn uri field: 5
Recorded tool call
{
"type": "tool_call",
"seq": 57,
"ts": "2026-10-05T22:06:29.321Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/neon-example && for m in createProject createProjectBranch listProjects deleteProject getProject; do printf \"%-22s %s\\n\" \"$m\" \"$(grep -c \"\\b$m(\" node_modules/@neondatabase/api-client/api.gen.ts)\"; done; echo \"=== conn uri field:\"; grep -c \"connection_uri\" node_modules/@neondatabase/api-client/api.gen.ts"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-9abd85fd0c5e1289",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 58,
"ts": "2026-10-05T22:06:29.321Z",
"turn": 1,
"output": {
"content": [
{
"text": "createProject 0\ncreateProjectBranch 0\nlistProjects 0\ndeleteProject 0\ngetProject 0\n=== conn uri field:\n5\n",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-9abd85fd0c5e1289",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Hmm, method names not found with that grep. Let me actually look at the generated API to find the real structure.
cd /sandbox/repo/neon-example && grep -nE "^\s*(export )?(const|function|class|interface) |=> \(\{" node_modules/@neondatabase/api-client/api.gen.ts | head -30; echo "=== size:"; wc -l node_modules/@neondatabase/api-client/api.gen.ts29:export interface PaginationResponse {
29:export interface PaginationResponse {
44:export interface Pagination {
52:export interface PlanDetails {
57:export interface PlanVersion {
63:export interface AddProjectJWKSRequest {
89:export interface JWKS {
122:export interface ProjectJWKSResponse {
132:export interface AdvisorIssue {
176:export interface ApiKeyCreateRequest {
192:export interface ApiKeyCreateResponse {
222:export interface ApiKeyRevokeResponse {
259:export interface ApiKeysListResponseItem {
292:export interface ApiKeyCreatorData {
305:export interface Operation {
359:export interface OperationResponse {
363:export interface OperationsResponse {
420:export interface ProjectListItem {
545:export interface Project {
701:export interface ProjectCreateRequest {
778:export interface ProjectUpdateRequest {
800:export interface ProjectTransferRequestResponse {
823:export interface AcceptProjectTransferRequestSatisfiesPlanError {
832:export interface ProjectSettingsData {
886:export interface ProjectResponse {
892:export interface ProjectsResponse {
901:export interface ProjectPermission {
915:export interface ProjectPermissions {
919:export interface GrantPermissionToProjectRequest {
940:export interface ConsumptionHistoryPerProjectResponse {
944:export interface ConsumptionHistoryPerProjectV2Response {
=== size:
8081 node_modules/@neondatabase/api-client/api.gen.ts
Recorded tool call
{
"type": "tool_call",
"seq": 61,
"ts": "2026-10-05T22:06:31.491Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/neon-example && grep -nE \"^\\s*(export )?(const|function|class|interface) |=> \\(\\{\" node_modules/@neondatabase/api-client/api.gen.ts | head -30; echo \"=== size:\"; wc -l node_modules/@neondatabase/api-client/api.gen.ts"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-b395da7763873e36",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 62,
"ts": "2026-10-05T22:06:31.491Z",
"turn": 1,
"output": {
"content": [
{
"text": "29:export interface PaginationResponse {\n44:export interface Pagination {\n52:export interface PlanDetails {\n57:export interface PlanVersion {\n63:export interface AddProjectJWKSRequest {\n89:export interface JWKS {\n122:export interface ProjectJWKSResponse {\n132:export interface AdvisorIssue {\n176:export interface ApiKeyCreateRequest {\n192:export interface ApiKeyCreateResponse {\n222:export interface ApiKeyRevokeResponse {\n259:export interface ApiKeysListResponseItem {\n292:export interface ApiKeyCreatorData {\n305:export interface Operation {\n359:export interface OperationResponse {\n363:export interface OperationsResponse {\n420:export interface ProjectListItem {\n545:export interface Project {\n701:export interface ProjectCreateRequest {\n778:export interface ProjectUpdateRequest {\n800:export interface ProjectTransferRequestResponse {\n823:export interface AcceptProjectTransferRequestSatisfiesPlanError {\n832:export interface ProjectSettingsData {\n886:export interface ProjectResponse {\n892:export interface ProjectsResponse {\n901:export interface ProjectPermission {\n915:export interface ProjectPermissions {\n919:export interface GrantPermissionToProjectRequest {\n940:export interface ConsumptionHistoryPerProjectResponse {\n944:export interface ConsumptionHistoryPerProjectV2Response {\n=== size:\n8081 node_modules/@neondatabase/api-client/api.gen.ts\n",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-b395da7763873e36",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
It's a type-gen file. The actual client methods come from createApiClient. Let me find how the service functions are exported — search for "ProjectsService" or similar, or the fetch pattern.
cd /sandbox/repo/neon-example && grep -nE "Service|createApiClient|export const .*Service|Projects\b" node_modules/@neondatabase/api-client/api.gen.ts | grep -vE "interface|^\s*//" | head -20
3851: * Projects still being fetched when the timeout occurred are listed in the "unavailable" attribute of the response.
3851: * Projects still being fetched when the timeout occurred are listed in the "unavailable" attribute of the response.
3879: * Projects still being fetched when the timeout occurred are listed in the "unavailable" attribute of the response.
4739: * @name ListProjects
4744: listProjects = (query: ListProjectsParams, params: RequestParams = {}) =>
4789: * @name ListSharedProjects
4794: listSharedProjects = (query: ListSharedProjectsParams, params: RequestParams = {}) =>
Recorded tool call
{
"type": "tool_call",
"seq": 65,
"ts": "2026-10-05T22:06:33.118Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/neon-example && grep -nE \"Service|createApiClient|export const .*Service|Projects\\b\" node_modules/@neondatabase/api-client/api.gen.ts | grep -vE \"interface|^\\s*//\" | head -20"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-adaf8a00b7f4aa9a",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 66,
"ts": "2026-10-05T22:06:33.118Z",
"turn": 1,
"output": {
"content": [
{
"text": "3851: * Projects still being fetched when the timeout occurred are listed in the \"unavailable\" attribute of the response.\n3879: * Projects still being fetched when the timeout occurred are listed in the \"unavailable\" attribute of the response.\n4739: * @name ListProjects\n4744: listProjects = (query: ListProjectsParams, params: RequestParams = {}) =>\n4789: * @name ListSharedProjects\n4794: listSharedProjects = (query: ListSharedProjectsParams, params: RequestParams = {}) =>\n",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-adaf8a00b7f4aa9a",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
So it's a class with methods. Let me check the projects class methods around 4739.
cd /sandbox/repo/neon-example && grep -nE "^\s{2}[a-zA-Z]+ = \(.*\) =>" node_modules/@neondatabase/api-client/api.gen.ts | sed -n '1,80p' | grep -iE "project|branch" | head -25; echo "=== class names:"; grep -nE "^export class [A-Za-z]+" node_modules/@neondatabase/api-client/api.gen.ts | head4726: getProjectOperation = (projectId: string, operationId: string, params: RequestParams = {}) =>
4726: getProjectOperation = (projectId: string, operationId: string, params: RequestParams = {}) =>
4744: listProjects = (query: ListProjectsParams, params: RequestParams = {}) =>
4766: createProject = (data: ProjectCreateRequest, params: RequestParams = {}) =>
4794: listSharedProjects = (query: ListSharedProjectsParams, params: RequestParams = {}) =>
4813: getProject = (projectId: string, params: RequestParams = {}) =>
4831: updateProject = (projectId: string, data: ProjectUpdateRequest, params: RequestParams = {}) =>
4851: deleteProject = (projectId: string, params: RequestParams = {}) =>
4869: recoverProject = (projectId: string, params: RequestParams = {}) =>
4887: listProjectOperations = ({ projectId, ...query }: ListProjectOperationsParams, params: RequestParams = {}) =>
4905: listProjectPermissions = (projectId: string, params: RequestParams = {}) =>
4923: grantPermissionToProject = (projectId: string, data: GrantPermissionToProjectRequest, params: RequestParams = {}) =>
4943: revokePermissionFromProject = (projectId: string, permissionId: string, params: RequestParams = {}) =>
4961: getAvailablePreloadLibraries = (projectId: string, params: RequestParams = {}) =>
5041: getProjectJwks = (projectId: string, params: RequestParams = {}) =>
5059: addProjectJwks = (projectId: string, data: AddProjectJWKSRequest, params: RequestParams = {}) =>
5079: deleteProjectJwks = (projectId: string, jwksId: string, params: RequestParams = {}) =>
5172: getProjectBranchDataApi = (projectId: string, branchId: string, databaseName: string, params: RequestParams = {}) =>
5211: getNeonAuth = (projectId: string, branchId: string, params: RequestParams = {}) =>
5285: listNeonAuthRedirectUriWhitelistDomains = (projectId: string, params: RequestParams = {}) =>
5351: listBranchNeonAuthTrustedDomains = (projectId: string, branchId: string, params: RequestParams = {}) =>
5483: deleteBranchNeonAuthUser = (projectId: string, branchId: string, authUserId: string, params: RequestParams = {}) =>
5527: deleteNeonAuthUser = (projectId: string, authUserId: string, params: RequestParams = {}) =>
5544: transferNeonAuthProviderProject = (data: NeonAuthTransferAuthProviderProjectRequest, params: RequestParams = {}) =>
5565: listNeonAuthIntegrations = (projectId: string, params: RequestParams = {}) =>
5584: listNeonAuthOauthProviders = (projectId: string, params: RequestParams = {}) =>
=== class names:
4520:export class HttpClient<SecurityDataType = unknown> {
4633:export class Api<SecurityDataType extends unknown> extends HttpClient<SecurityDataType> {
Recorded tool call
{
"type": "tool_call",
"seq": 69,
"ts": "2026-10-05T22:06:35.148Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/neon-example && grep -nE \"^\\s{2}[a-zA-Z]+ = \\(.*\\) =>\" node_modules/@neondatabase/api-client/api.gen.ts | sed -n '1,80p' | grep -iE \"project|branch\" | head -25; echo \"=== class names:\"; grep -nE \"^export class [A-Za-z]+\" node_modules/@neondatabase/api-client/api.gen.ts | head"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-af8023a8d090f7ed",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 70,
"ts": "2026-10-05T22:06:35.148Z",
"turn": 1,
"output": {
"content": [
{
"text": "4726: getProjectOperation = (projectId: string, operationId: string, params: RequestParams = {}) =>\n4744: listProjects = (query: ListProjectsParams, params: RequestParams = {}) =>\n4766: createProject = (data: ProjectCreateRequest, params: RequestParams = {}) =>\n4794: listSharedProjects = (query: ListSharedProjectsParams, params: RequestParams = {}) =>\n4813: getProject = (projectId: string, params: RequestParams = {}) =>\n4831: updateProject = (projectId: string, data: ProjectUpdateRequest, params: RequestParams = {}) =>\n4851: deleteProject = (projectId: string, params: RequestParams = {}) =>\n4869: recoverProject = (projectId: string, params: RequestParams = {}) =>\n4887: listProjectOperations = ({ projectId, ...query }: ListProjectOperationsParams, params: RequestParams = {}) =>\n4905: listProjectPermissions = (projectId: string, params: RequestParams = {}) =>\n4923: grantPermissionToProject = (projectId: string, data: GrantPermissionToProjectRequest, params: RequestParams = {}) =>\n4943: revokePermissionFromProject = (projectId: string, permissionId: string, params: RequestParams = {}) =>\n4961: getAvailablePreloadLibraries = (projectId: string, params: RequestParams = {}) =>\n5041: getProjectJwks = (projectId: string, params: RequestParams = {}) =>\n5059: addProjectJwks = (projectId: string, data: AddProjectJWKSRequest, params: RequestParams = {}) =>\n5079: deleteProjectJwks = (projectId: string, jwksId: string, params: RequestParams = {}) =>\n5172: getProjectBranchDataApi = (projectId: string, branchId: string, databaseName: string, params: RequestParams = {}) =>\n5211: getNeonAuth = (projectId: string, branchId: string, params: RequestParams = {}) =>\n5285: listNeonAuthRedirectUriWhitelistDomains = (projectId: string, params: RequestParams = {}) =>\n5351: listBranchNeonAuthTrustedDomains = (projectId: string, branchId: string, params: RequestParams = {}) =>\n5483: deleteBranchNeonAuthUser = (projectId: string, branchId: string, authUserId: string, params: RequestParams = {}) =>\n5527: deleteNeonAuthUser = (projectId: string, authUserId: string, params: RequestParams = {}) =>\n5544: transferNeonAuthProviderProject = (data: NeonAuthTransferAuthProviderProjectRequest, params: RequestParams = {}) =>\n5565: listNeonAuthIntegrations = (projectId: string, params: RequestParams = {}) =>\n5584: listNeonAuthOauthProviders = (projectId: string, params: RequestParams = {}) =>\n=== class names:\n4520:export class HttpClient<SecurityDataType = unknown> {\n4633:export class Api<SecurityDataType extends unknown> extends HttpClient<SecurityDataType> {\n",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-af8023a8d090f7ed",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Confirmed API shape: createApiClient({apiKey}).projects.createProject(...). Wait — is it .projects namespace or flat? The class Api has flat methods like listProjects. Let me check if createApiClient returns an object with namespaces. Let me look at index.ts / dist.
cd /sandbox/repo/neon-example && cat node_modules/@neondatabase/api-client/index.ts && echo "=== README usage:" && grep -A12 -iE "createApiClient\(" node_modules/@neondatabase/api-client/README.md | head -30export * from './api.gen';
export * from './api.gen';
import { Api, type ApiConfig } from './api.gen';
export const createApiClient = <SecurityDataType = unknown>(
config: ApiConfig<SecurityDataType> & {
apiKey: string | null;
},
) =>
new Api<SecurityDataType>({
...config,
// this is will fix the issue with passing arrays as search params
// before: ?project_ids[]=1&project_ids[]=2
// after: ?project_ids=1,2
paramsSerializer: (params) => {
if (!params) return '';
const parseValue = (val: unknown): string => {
if (Array.isArray(val)) {
return val.map((v) => parseValue(v)).join(',');
}
if (val instanceof Date) {
return val.toISOString();
}
if (typeof val === 'object' && val !== null) {
return JSON.stringify(val);
}
return String(val);
};
const entries = Object.entries(params);
const transformedEntries = entries
.filter(([_, val]) => val !== null && typeof val !== 'undefined')
.map(([key, val]) => [key, parseValue(val)]);
const searchParams = new URLSearchParams(transformedEntries);
return searchParams.toString();
},
headers: {
...config.headers,
...(config.apiKey && {
Authorization: `Bearer ${config.apiKey}`,
}),
},
});
=== README usage:
const apiClient = createApiClient({
apiKey: 'your-api-key',
});
```
7. Use the `apiClient` instance to make API calls. For example:
```typescript
const response = await apiClient.listProjects({});
console.log(response);
```
## API Reference
Recorded tool call
{
"type": "tool_call",
"seq": 73,
"ts": "2026-10-05T22:06:36.919Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/neon-example && cat node_modules/@neondatabase/api-client/index.ts && echo \"=== README usage:\" && grep -A12 -iE \"createApiClient\\(\" node_modules/@neondatabase/api-client/README.md | head -30"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-b747267d14b56881",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 74,
"ts": "2026-10-05T22:06:36.919Z",
"turn": 1,
"output": {
"content": [
{
"text": "export * from './api.gen';\n\nimport { Api, type ApiConfig } from './api.gen';\n\nexport const createApiClient = <SecurityDataType = unknown>(\n config: ApiConfig<SecurityDataType> & {\n apiKey: string | null;\n },\n) =>\n new Api<SecurityDataType>({\n ...config,\n // this is will fix the issue with passing arrays as search params\n // before: ?project_ids[]=1&project_ids[]=2\n // after: ?project_ids=1,2\n paramsSerializer: (params) => {\n if (!params) return '';\n\n const parseValue = (val: unknown): string => {\n if (Array.isArray(val)) {\n return val.map((v) => parseValue(v)).join(',');\n }\n if (val instanceof Date) {\n return val.toISOString();\n }\n if (typeof val === 'object' && val !== null) {\n return JSON.stringify(val);\n }\n return String(val);\n };\n\n const entries = Object.entries(params);\n const transformedEntries = entries\n .filter(([_, val]) => val !== null && typeof val !== 'undefined')\n .map(([key, val]) => [key, parseValue(val)]);\n\n const searchParams = new URLSearchParams(transformedEntries);\n return searchParams.toString();\n },\n headers: {\n ...config.headers,\n ...(config.apiKey && {\n Authorization: `Bearer ${config.apiKey}`,\n }),\n },\n });\n=== README usage:\n const apiClient = createApiClient({\n apiKey: 'your-api-key',\n });\n ```\n\n7. Use the `apiClient` instance to make API calls. For example:\n\n ```typescript\n const response = await apiClient.listProjects({});\n console.log(response);\n ```\n\n## API Reference\n",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-b747267d14b56881",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Confirmed: flat methods, apiClient.createProject({...}). Now write the example files.
Two files:
provision.mjs— creates a Neon project via API, prints connection string. Requires NEON_API_KEY.app.mjs— the actual simple example: create table, insert, query usingneon()HTTP driver. Requires DATABASE_URL.README.md— pricing + run instructions.
Also add cleanup: delete project. Let me include --delete in provision.
I must handle the missing-credentials case gracefully with a clear message.
Let me write them.
API surface confirmed (createApiClient → flat methods like createProject). Now writing the example.
File edits
1 file
Writtenneon-example/app.mjsView changes
/sandbox/repo/neon-example/app.mjs
Written content · previous contents were not recorded
// Simple Neon example: serverless Postgres over HTTP using the Neon driver.//// Run: DATABASE_URL="postgres://..." node app.mjs//// The @neondatabase/serverless driver talks to Neon over HTTP/WebSocket, so it// works in edge/serverless runtimes and needs no persistent connection pool.import { neon } from '@neondatabase/serverless';const connectionString = process.env.DATABASE_URL;if (!connectionString) {console.error('Missing DATABASE_URL.\n' +'Set it to your Neon pooled connection string, e.g.:\n' +' export DATABASE_URL="postgresql://user:pass@ep-xxx-pooler.us-east-2.aws.neon.tech/neondb?sslmode=require"\n' +'You can get one from `node provision.mjs` or the Neon console.');process.exit(1);}// `neon()` returns a tagged-template query function. Queries are parameterised// automatically, so interpolated values are sent as bind params (no SQL injection).const sql = neon(connectionString);async function main() {// 1. Schemaawait sql`CREATE TABLE IF NOT EXISTS todos (id SERIAL PRIMARY KEY,title TEXT NOT NULL,done BOOLEAN NOT NULL DEFAULT FALSE,created_at TIMESTAMPTZ NOT NULL DEFAULT now())`;console.log('1. table `todos` ready');// 2. Insert (parameterised)const title = 'Try Neon serverless Postgres';const inserted = await sql`INSERT INTO todos (title) VALUES (${title})RETURNING id, title, done, created_at`;console.log('2. inserted:', inserted[0]);// 3. Read backconst open = await sql`SELECT id, title, done FROM todos WHERE done = ${false} ORDER BY id DESC LIMIT 5`;console.log('3. open todos:', open);// 4. Updateconst updated = await sql`UPDATE todos SET done = ${true} WHERE id = ${inserted[0].id}RETURNING id, done`;console.log('4. updated:', updated[0]);// 5. Multi-statement transaction (all-or-nothing)const result = await sql.transaction([sql`INSERT INTO todos (title) VALUES (${'bought in a transaction'})`,sql`SELECT count(*)::int AS total FROM todos`,]);console.log('5. transaction ok, total rows:', result[1][0].total);// 6. Neon-specific: this build supports branching — verify we are on a branchconst [{ branch, version }] = await sql`SELECT current_setting('neon.branch_name', true) AS branch,current_setting('server_version', true) AS version`;console.log(`6. connected to branch=${branch ?? 'n/a'} postgres=${version}`);}main().catch((err) => {console.error('Query failed:', err.message);process.exit(1);});
Source: write · chatcmpl-tool-8bd051dd815a089b
Recorded tool call
{
"type": "tool_call",
"seq": 78,
"ts": "2026-10-05T22:06:47.848Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/neon-example/app.mjs",
"content": "// Simple Neon example: serverless Postgres over HTTP using the Neon driver.\n//\n// Run: DATABASE_URL=\"postgres://...\" node app.mjs\n//\n// The @neondatabase/serverless driver talks to Neon over HTTP/WebSocket, so it\n// works in edge/serverless runtimes and needs no persistent connection pool.\n\nimport { neon } from '@neondatabase/serverless';\n\nconst connectionString = process.env.DATABASE_URL;\n\nif (!connectionString) {\n console.error(\n 'Missing DATABASE_URL.\\n' +\n 'Set it to your Neon pooled connection string, e.g.:\\n' +\n ' export DATABASE_URL=\"postgresql://user:pass@ep-xxx-pooler.us-east-2.aws.neon.tech/neondb?sslmode=require\"\\n' +\n 'You can get one from `node provision.mjs` or the Neon console.'\n );\n process.exit(1);\n}\n\n// `neon()` returns a tagged-template query function. Queries are parameterised\n// automatically, so interpolated values are sent as bind params (no SQL injection).\nconst sql = neon(connectionString);\n\nasync function main() {\n // 1. Schema\n await sql`\n CREATE TABLE IF NOT EXISTS todos (\n id SERIAL PRIMARY KEY,\n title TEXT NOT NULL,\n done BOOLEAN NOT NULL DEFAULT FALSE,\n created_at TIMESTAMPTZ NOT NULL DEFAULT now()\n )\n `;\n console.log('1. table `todos` ready');\n\n // 2. Insert (parameterised)\n const title = 'Try Neon serverless Postgres';\n const inserted = await sql`\n INSERT INTO todos (title) VALUES (${title})\n RETURNING id, title, done, created_at\n `;\n console.log('2. inserted:', inserted[0]);\n\n // 3. Read back\n const open = await sql`\n SELECT id, title, done FROM todos WHERE done = ${false} ORDER BY id DESC LIMIT 5\n `;\n console.log('3. open todos:', open);\n\n // 4. Update\n const updated = await sql`\n UPDATE todos SET done = ${true} WHERE id = ${inserted[0].id}\n RETURNING id, done\n `;\n console.log('4. updated:', updated[0]);\n\n // 5. Multi-statement transaction (all-or-nothing)\n const result = await sql.transaction([\n sql`INSERT INTO todos (title) VALUES (${'bought in a transaction'})`,\n sql`SELECT count(*)::int AS total FROM todos`,\n ]);\n console.log('5. transaction ok, total rows:', result[1][0].total);\n\n // 6. Neon-specific: this build supports branching — verify we are on a branch\n const [{ branch, version }] = await sql`\n SELECT current_setting('neon.branch_name', true) AS branch,\n current_setting('server_version', true) AS version\n `;\n console.log(`6. connected to branch=${branch ?? 'n/a'} postgres=${version}`);\n}\n\nmain().catch((err) => {\n console.error('Query failed:', err.message);\n process.exit(1);\n});\n"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-8bd051dd815a089b",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 80,
"ts": "2026-10-05T22:06:47.848Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 2603 bytes to /sandbox/repo/neon-example/app.mjs",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-8bd051dd815a089b",
"is_error": false,
"tool_kind": "file_edit"
}File edits
1 file
Writtenneon-example/provision.mjsView changes
/sandbox/repo/neon-example/provision.mjs
Written content · previous contents were not recorded
// Provision (and tear down) a Neon project through the Neon API.// This is the "hosted product via its API" path — no local Postgres needed.//// node provision.mjs # create a project, print DATABASE_URL// node provision.mjs --delete # delete every project created by this script//// Requires: NEON_API_KEY (create one at https://console.neon.tech/app/settings/api-keys)import { createApiClient } from '@neondatabase/api-client';import { writeFileSync, readFileSync, existsSync } from 'node:fs';const STATE_FILE = new URL('./.neon-projects.json', import.meta.url);const NAME_PREFIX = 'pi-example';const apiKey = process.env.NEON_API_KEY;if (!apiKey) {console.error('Missing NEON_API_KEY.\n' +'Create one at https://console.neon.tech/app/settings/api-keys then:\n' +' export NEON_API_KEY="neondb_..."');process.exit(1);}const api = createApiClient({ apiKey });const loadState = () =>existsSync(STATE_FILE) ? JSON.parse(readFileSync(STATE_FILE, 'utf8')) : [];const saveState = (s) => writeFileSync(STATE_FILE, JSON.stringify(s, null, 2));async function create() {const name = `${NAME_PREFIX}-${Date.now()}`;console.log(`Creating Neon project "${name}"...`);const { data } = await api.createProject({project: {name,region_id: 'aws-us-east-2',// Stay small and cheap: scale-to-zero stays on, cap compute at 1 CU (~4 GB RAM).provisioner: 'k8s',default_endpoint_settings: {autoscaling_limit_min_cu: 0.25,autoscaling_limit_max_cu: 1,suspend_timeout_seconds: 300, // scale to zero after 5 min idle},},});const uri = data.connection_uris?.[0]?.connection_uri;const projectId = data.project.id;const branchId = data.branches?.[0]?.id;saveState([...loadState(), { projectId, name, createdAt: new Date().toISOString() }]);console.log('\nProject created.');console.log(` project id : ${projectId}`);console.log(` branch id : ${branchId ?? 'n/a'}`);console.log('\nExport this to run app.mjs:\n');console.log(` export DATABASE_URL="${uri}"\n`);writeFileSync(new URL('./.env.local', import.meta.url), `DATABASE_URL="${uri}"\n`);console.log('Also written to .env.local (gitignored).');}async function destroy() {const state = loadState();if (!state.length) return console.log('No projects recorded in .neon-projects.json.');for (const p of state) {console.log(`Deleting project ${p.projectId} (${p.name})...`);try {await api.deleteProject(p.projectId);console.log(' deleted.');} catch (err) {console.error(` failed: ${err.message}`);}}saveState([]);}const action = process.argv.includes('--delete') ? destroy : create;action().catch((err) => {console.error('Neon API error:', err.message);process.exit(1);});
Source: write · chatcmpl-tool-95b38f9894db042c
Recorded tool call
{
"type": "tool_call",
"seq": 79,
"ts": "2026-10-05T22:06:47.848Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/neon-example/provision.mjs",
"content": "// Provision (and tear down) a Neon project through the Neon API.\n// This is the \"hosted product via its API\" path — no local Postgres needed.\n//\n// node provision.mjs # create a project, print DATABASE_URL\n// node provision.mjs --delete # delete every project created by this script\n//\n// Requires: NEON_API_KEY (create one at https://console.neon.tech/app/settings/api-keys)\n\nimport { createApiClient } from '@neondatabase/api-client';\nimport { writeFileSync, readFileSync, existsSync } from 'node:fs';\n\nconst STATE_FILE = new URL('./.neon-projects.json', import.meta.url);\nconst NAME_PREFIX = 'pi-example';\n\nconst apiKey = process.env.NEON_API_KEY;\nif (!apiKey) {\n console.error(\n 'Missing NEON_API_KEY.\\n' +\n 'Create one at https://console.neon.tech/app/settings/api-keys then:\\n' +\n ' export NEON_API_KEY=\"neondb_...\"'\n );\n process.exit(1);\n}\n\nconst api = createApiClient({ apiKey });\n\nconst loadState = () =>\n existsSync(STATE_FILE) ? JSON.parse(readFileSync(STATE_FILE, 'utf8')) : [];\nconst saveState = (s) => writeFileSync(STATE_FILE, JSON.stringify(s, null, 2));\n\nasync function create() {\n const name = `${NAME_PREFIX}-${Date.now()}`;\n console.log(`Creating Neon project \"${name}\"...`);\n\n const { data } = await api.createProject({\n project: {\n name,\n region_id: 'aws-us-east-2',\n // Stay small and cheap: scale-to-zero stays on, cap compute at 1 CU (~4 GB RAM).\n provisioner: 'k8s',\n default_endpoint_settings: {\n autoscaling_limit_min_cu: 0.25,\n autoscaling_limit_max_cu: 1,\n suspend_timeout_seconds: 300, // scale to zero after 5 min idle\n },\n },\n });\n\n const uri = data.connection_uris?.[0]?.connection_uri;\n const projectId = data.project.id;\n const branchId = data.branches?.[0]?.id;\n\n saveState([...loadState(), { projectId, name, createdAt: new Date().toISOString() }]);\n\n console.log('\\nProject created.');\n console.log(` project id : ${projectId}`);\n console.log(` branch id : ${branchId ?? 'n/a'}`);\n console.log('\\nExport this to run app.mjs:\\n');\n console.log(` export DATABASE_URL=\"${uri}\"\\n`);\n\n writeFileSync(new URL('./.env.local', import.meta.url), `DATABASE_URL=\"${uri}\"\\n`);\n console.log('Also written to .env.local (gitignored).');\n}\n\nasync function destroy() {\n const state = loadState();\n if (!state.length) return console.log('No projects recorded in .neon-projects.json.');\n\n for (const p of state) {\n console.log(`Deleting project ${p.projectId} (${p.name})...`);\n try {\n await api.deleteProject(p.projectId);\n console.log(' deleted.');\n } catch (err) {\n console.error(` failed: ${err.message}`);\n }\n }\n saveState([]);\n}\n\nconst action = process.argv.includes('--delete') ? destroy : create;\naction().catch((err) => {\n console.error('Neon API error:', err.message);\n process.exit(1);\n});\n"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-95b38f9894db042c",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 81,
"ts": "2026-10-05T22:06:47.848Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 2870 bytes to /sandbox/repo/neon-example/provision.mjs",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-95b38f9894db042c",
"is_error": false,
"tool_kind": "file_edit"
}›Thinking…
Now verify the scripts at least parse and fail gracefully with the expected "missing credentials" message (which is the honest test I can run without creds). Also check that sql.transaction exists in the driver typings, since I used it. Let me verify.
Also provisioner: 'k8s' — I should check that's valid; it might not be needed. Let me check ProjectCreateRequest fields to avoid writing an invalid payload.
Now let me verify the code is correct against the real typings (especially sql.transaction and the createProject payload).
cd /sandbox/repo/neon-example && echo "=== sql.transaction exists?"; grep -nE "transaction" node_modules/@neondatabase/serverless/index.d.ts | head -10; echo "=== ProjectCreateRequest fields:"; sed -n '701,780p' node_modules/@neondatabase/api-client/api.gen.ts | grep -E "^\s+[a-z_]+\??:" | head -30
=== sql.transaction exists?
=== sql.transaction exists?
284: idle_in_transaction_session_timeout?: number | undefined;
486: * Postgres transaction isolation level: see https://www.postgresql.org/docs/current/transaction-iso.html.
492: * transaction is used.
494: * When `readOnly` is `true`, a `READ ONLY` Postgres transaction is used.
499: * Postgres transaction is used.
502: * `readOnly` is `true`), a `DEFERRABLE` Postgres transaction is used.
514: * session or transactions) with low latency over https. Queries are
521: * The returned function has a `transaction()` function property, which
522: * supports multiple queries run in a non-interactive transaction.
599: * session or transactions) with low latency over https. Queries are
=== ProjectCreateRequest fields:
project: {
settings?: ProjectSettingsData;
name?: string;
branch?: {
name?: string;
role_name?: string;
database_name?: string;
annotations?: AnnotationValueData;
autoscaling_limit_min_cu?: ComputeUnit;
autoscaling_limit_max_cu?: ComputeUnit;
provisioner?: Provisioner;
region_id?: string;
default_endpoint_settings?: DefaultEndpointSettings;
pg_version?: PgVersion;
store_passwords?: boolean;
history_retention_seconds?: number;
org_id?: string;
project: {
settings?: ProjectSettingsData;
Recorded tool call
{
"type": "tool_call",
"seq": 85,
"ts": "2026-10-05T22:06:50.224Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/neon-example && echo \"=== sql.transaction exists?\"; grep -nE \"transaction\" node_modules/@neondatabase/serverless/index.d.ts | head -10; echo \"=== ProjectCreateRequest fields:\"; sed -n '701,780p' node_modules/@neondatabase/api-client/api.gen.ts | grep -E \"^\\s+[a-z_]+\\??:\" | head -30"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-a57fe5140c6c5427",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 86,
"ts": "2026-10-05T22:06:50.224Z",
"turn": 1,
"output": {
"content": [
{
"text": "=== sql.transaction exists?\n284: idle_in_transaction_session_timeout?: number | undefined;\n486: * Postgres transaction isolation level: see https://www.postgresql.org/docs/current/transaction-iso.html.\n492: * transaction is used.\n494: * When `readOnly` is `true`, a `READ ONLY` Postgres transaction is used.\n499: * Postgres transaction is used.\n502: * `readOnly` is `true`), a `DEFERRABLE` Postgres transaction is used.\n514: * session or transactions) with low latency over https. Queries are\n521: * The returned function has a `transaction()` function property, which\n522: * supports multiple queries run in a non-interactive transaction.\n599: * session or transactions) with low latency over https. Queries are\n=== ProjectCreateRequest fields:\n project: {\n settings?: ProjectSettingsData;\n name?: string;\n branch?: {\n name?: string;\n role_name?: string;\n database_name?: string;\n annotations?: AnnotationValueData;\n autoscaling_limit_min_cu?: ComputeUnit;\n autoscaling_limit_max_cu?: ComputeUnit;\n provisioner?: Provisioner;\n region_id?: string;\n default_endpoint_settings?: DefaultEndpointSettings;\n pg_version?: PgVersion;\n store_passwords?: boolean;\n history_retention_seconds?: number;\n org_id?: string;\n project: {\n settings?: ProjectSettingsData;\n",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-a57fe5140c6c5427",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
sql.transaction() confirmed. ProjectCreateRequest fields confirmed: default_endpoint_settings exists at project level, provisioner exists. Let me check DefaultEndpointSettings fields to confirm autoscaling_limit_min_cu is valid there, and Provisioner enum values.
cd /sandbox/repo/neon-example && echo "=== DefaultEndpointSettings:"; grep -A8 "interface DefaultEndpointSettings" node_modules/@neondatabase/api-client/api.gen.ts | head -12; echo "=== Provisioner enum:"; grep -A5 "type Provisioner" node_modules/@neondatabase/api-client/api.gen.ts | head -8
=== DefaultEndpointSettings:
=== DefaultEndpointSettings:
export interface DefaultEndpointSettings {
/** A raw representation of Postgres settings */
pg_settings?: PgSettingsData;
/**
* DEPRECATED. PgBouncer settings for the compute endpoint. This field is deprecated and will be removed after 2026-06-20.
* @deprecated
*/
pgbouncer_settings?: PgbouncerSettingsData;
/**
=== Provisioner enum:
export type Provisioner = string;
export interface PaginationResponse {
/**
* Cursor based pagination is used. The user must pass the cursor as is to the backend.
* For more information about cursor based pagination, see
Recorded tool call
{
"type": "tool_call",
"seq": 89,
"ts": "2026-10-05T22:06:51.830Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/neon-example && echo \"=== DefaultEndpointSettings:\"; grep -A8 \"interface DefaultEndpointSettings\" node_modules/@neondatabase/api-client/api.gen.ts | head -12; echo \"=== Provisioner enum:\"; grep -A5 \"type Provisioner\" node_modules/@neondatabase/api-client/api.gen.ts | head -8"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-8516e43fa32b7f51",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 90,
"ts": "2026-10-05T22:06:51.830Z",
"turn": 1,
"output": {
"content": [
{
"text": "=== DefaultEndpointSettings:\nexport interface DefaultEndpointSettings {\n /** A raw representation of Postgres settings */\n pg_settings?: PgSettingsData;\n /**\n * DEPRECATED. PgBouncer settings for the compute endpoint. This field is deprecated and will be removed after 2026-06-20.\n * @deprecated\n */\n pgbouncer_settings?: PgbouncerSettingsData;\n /**\n=== Provisioner enum:\nexport type Provisioner = string;\n\nexport interface PaginationResponse {\n /**\n * Cursor based pagination is used. The user must pass the cursor as is to the backend.\n * For more information about cursor based pagination, see\n",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-8516e43fa32b7f51",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
DefaultEndpointSettings has pg_settings, pgbouncer_settings (deprecated), and presumably autoscaling_limit_min_cu/max_cu and suspend_timeout_seconds. Let me confirm those exist in DefaultEndpointSettings.
cd /sandbox/repo/neon-example && grep -A22 "interface DefaultEndpointSettings" node_modules/@neondatabase/api-client/api.gen.ts | grep -E "^\s+[a-z_]+\??:"
pg_settings?: PgSettingsData;
pg_settings?: PgSettingsData; pgbouncer_settings?: PgbouncerSettingsData; autoscaling_limit_min_cu?: ComputeUnit; autoscaling_limit_max_cu?: ComputeUnit;
Recorded tool call
{
"type": "tool_call",
"seq": 93,
"ts": "2026-10-05T22:06:53.569Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/neon-example && grep -A22 \"interface DefaultEndpointSettings\" node_modules/@neondatabase/api-client/api.gen.ts | grep -E \"^\\s+[a-z_]+\\??:\""
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-aabbc930c247643a",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 94,
"ts": "2026-10-05T22:06:53.569Z",
"turn": 1,
"output": {
"content": [
{
"text": " pg_settings?: PgSettingsData;\n pgbouncer_settings?: PgbouncerSettingsData;\n autoscaling_limit_min_cu?: ComputeUnit;\n autoscaling_limit_max_cu?: ComputeUnit;\n",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-aabbc930c247643a",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
suspend_timeout_seconds is NOT in DefaultEndpointSettings. Let me check where it belongs — probably in ProjectSettingsData or Endpoint. Let me check.
I should remove or relocate it. Let me check ProjectSettingsData.
suspend_timeout_seconds isn't in DefaultEndpointSettings — let me find where it actually belongs rather than ship an invalid payload.
cd /sandbox/repo/neon-example && grep -B25 "suspend_timeout_seconds" node_modules/@neondatabase/api-client/api.gen.ts | grep -E "interface |suspend_timeout" | tail -8
suspend_timeout_seconds?: SuspendTimeoutSeconds;
suspend_timeout_seconds?: SuspendTimeoutSeconds;
export interface ConnectionDetails {
export interface ConnectionURIResponse {
/** @example {"host":"ep-silent-smoke-806639.us-east-2.aws.neon.tech","id":"ep-silent-smoke-806639","name":"My cool compute","project_id":"spring-example-302709","branch_id":"br-wispy-meadow-118737","autoscaling_limit_min_cu":1,"autoscaling_limit_max_cu":1,"region_id":"aws-us-east-2","type":"read_write","current_state":"init","pending_state":"active","settings":{"pg_settings":{}},"pooler_enabled":false,"pooler_mode":"transaction","disabled":false,"passwordless_access":true,"creation_source":"console","created_at":"2022-12-03T15:37:07Z","updated_at":"2022-12-03T15:37:07Z","proxy_host":"us-east-2.aws.neon.tech","suspend_timeout_seconds":0,"provisioner":"k8s-neonvm"} */
suspend_timeout_seconds: SuspendTimeoutSeconds;
suspend_timeout_seconds?: SuspendTimeoutSeconds;
suspend_timeout_seconds?: SuspendTimeoutSeconds;
suspend_timeout_seconds?: SuspendTimeoutSeconds;
Recorded tool call
{
"type": "tool_call",
"seq": 98,
"ts": "2026-10-05T22:06:55.606Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/neon-example && grep -B25 \"suspend_timeout_seconds\" node_modules/@neondatabase/api-client/api.gen.ts | grep -E \"interface |suspend_timeout\" | tail -8"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-bfc9334daf196b3b",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 99,
"ts": "2026-10-05T22:06:55.606Z",
"turn": 1,
"output": {
"content": [
{
"text": " suspend_timeout_seconds?: SuspendTimeoutSeconds;\nexport interface ConnectionDetails {\nexport interface ConnectionURIResponse {\n/** @example {\"host\":\"ep-silent-smoke-806639.us-east-2.aws.neon.tech\",\"id\":\"ep-silent-smoke-806639\",\"name\":\"My cool compute\",\"project_id\":\"spring-example-302709\",\"branch_id\":\"br-wispy-meadow-118737\",\"autoscaling_limit_min_cu\":1,\"autoscaling_limit_max_cu\":1,\"region_id\":\"aws-us-east-2\",\"type\":\"read_write\",\"current_state\":\"init\",\"pending_state\":\"active\",\"settings\":{\"pg_settings\":{}},\"pooler_enabled\":false,\"pooler_mode\":\"transaction\",\"disabled\":false,\"passwordless_access\":true,\"creation_source\":\"console\",\"created_at\":\"2022-12-03T15:37:07Z\",\"updated_at\":\"2022-12-03T15:37:07Z\",\"proxy_host\":\"us-east-2.aws.neon.tech\",\"suspend_timeout_seconds\":0,\"provisioner\":\"k8s-neonvm\"} */\n suspend_timeout_seconds: SuspendTimeoutSeconds;\n suspend_timeout_seconds?: SuspendTimeoutSeconds;\n suspend_timeout_seconds?: SuspendTimeoutSeconds;\n suspend_timeout_seconds?: SuspendTimeoutSeconds;\n",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-bfc9334daf196b3b",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
suspend_timeout_seconds lives on the Endpoint, not on DefaultEndpointSettings for project creation. So I should remove it from the create payload (the default is 5 min scale-to-zero anyway, which matches the Free/Launch default per pricing docs: "After 5 minutes"). Let me fix that and note it in a comment.
Let me edit provision.mjs.
Confirmed — suspend_timeout_seconds belongs on the Endpoint, not the create payload. Fixing that:
File edits
1 file
Modifiedneon-example/provision.mjs+3−2View changes
/sandbox/repo/neon-example/provision.mjs
Replacement excerpt
region_id: 'aws-us-east-2',- // Stay small and cheap: scale-to-zero stays on, cap compute at 1 CU (~4 GB RAM).+ // Stay small and cheap: cap compute at 1 CU (~1 vCPU / 4 GB RAM).+ // Scale-to-zero is on by default (5 min idle) and is not settable here —+ // suspend_timeout_seconds lives on the Endpoint, not on project creation.provisioner: 'k8s',default_endpoint_settings: {autoscaling_limit_min_cu: 0.25,autoscaling_limit_max_cu: 1,- suspend_timeout_seconds: 300, // scale to zero after 5 min idle},
Source: edit · chatcmpl-tool-82a83f43e245fc5b
Recorded tool call
{
"type": "tool_call",
"seq": 103,
"ts": "2026-10-05T22:06:59.629Z",
"name": "edit",
"turn": 1,
"input": {
"path": "/sandbox/repo/neon-example/provision.mjs",
"edits": [
{
"newText": " region_id: 'aws-us-east-2',\n // Stay small and cheap: cap compute at 1 CU (~1 vCPU / 4 GB RAM).\n // Scale-to-zero is on by default (5 min idle) and is not settable here —\n // suspend_timeout_seconds lives on the Endpoint, not on project creation.\n provisioner: 'k8s',\n default_endpoint_settings: {\n autoscaling_limit_min_cu: 0.25,\n autoscaling_limit_max_cu: 1,\n },",
"oldText": " region_id: 'aws-us-east-2',\n // Stay small and cheap: scale-to-zero stays on, cap compute at 1 CU (~4 GB RAM).\n provisioner: 'k8s',\n default_endpoint_settings: {\n autoscaling_limit_min_cu: 0.25,\n autoscaling_limit_max_cu: 1,\n suspend_timeout_seconds: 300, // scale to zero after 5 min idle\n },"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-82a83f43e245fc5b",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 106,
"ts": "2026-10-05T22:06:59.629Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully replaced 1 block(s) in /sandbox/repo/neon-example/provision.mjs.",
"type": "text"
}
],
"details": {
"diff": " ...\n 35 const { data } = await api.createProject({\n 36 project: {\n 37 name,\n 38 region_id: 'aws-us-east-2',\n-39 // Stay small and cheap: scale-to-zero stays on, cap compute at 1 CU (~4 GB RAM).\n+39 // Stay small and cheap: cap compute at 1 CU (~1 vCPU / 4 GB RAM).\n+40 // Scale-to-zero is on by default (5 min idle) and is not settable here —\n+41 // suspend_timeout_seconds lives on the Endpoint, not on project creation.\n 40 provisioner: 'k8s',\n 41 default_endpoint_settings: {\n 42 autoscaling_limit_min_cu: 0.25,\n 43 autoscaling_limit_max_cu: 1,\n-44 suspend_timeout_seconds: 300, // scale to zero after 5 min idle\n 45 },\n 46 },\n 47 });\n 48 \n ...",
"patch": "--- /sandbox/repo/neon-example/provision.mjs\n+++ /sandbox/repo/neon-example/provision.mjs\n@@ -35,14 +35,15 @@\n const { data } = await api.createProject({\n project: {\n name,\n region_id: 'aws-us-east-2',\n- // Stay small and cheap: scale-to-zero stays on, cap compute at 1 CU (~4 GB RAM).\n+ // Stay small and cheap: cap compute at 1 CU (~1 vCPU / 4 GB RAM).\n+ // Scale-to-zero is on by default (5 min idle) and is not settable here —\n+ // suspend_timeout_seconds lives on the Endpoint, not on project creation.\n provisioner: 'k8s',\n default_endpoint_settings: {\n autoscaling_limit_min_cu: 0.25,\n autoscaling_limit_max_cu: 1,\n- suspend_timeout_seconds: 300, // scale to zero after 5 min idle\n },\n },\n });\n \n",
"firstChangedLine": 39
}
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-82a83f43e245fc5b",
"is_error": false,
"tool_kind": "file_edit"
}File edits
1 file
Writtenneon-example/.gitignoreView changes
/sandbox/repo/neon-example/.gitignore
Written content · previous contents were not recorded
node_modules/.env.local.neon-projects.json
Source: write · chatcmpl-tool-83663edf4ce389fb
Recorded tool call
{
"type": "tool_call",
"seq": 104,
"ts": "2026-10-05T22:06:59.629Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/neon-example/.gitignore",
"content": "node_modules/\n.env.local\n.neon-projects.json\n"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-83663edf4ce389fb",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 105,
"ts": "2026-10-05T22:06:59.629Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 45 bytes to /sandbox/repo/neon-example/.gitignore",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-83663edf4ce389fb",
"is_error": false,
"tool_kind": "file_edit"
}›Thinking…
Now verify both scripts parse and fail gracefully (the only real test available without creds).
Now the honest test available without credentials — do both scripts parse and fail cleanly with a useful message?
cd /sandbox/repo/neon-example && echo "=== syntax check:"; node --check app.mjs && echo "app.mjs OK"; node --check provision.mjs && echo "provision.mjs OK"; echo; echo "=== app.mjs with no DATABASE_URL:"; node app.mjs; echo "(exit=$?)"; echo; echo "=== provision.mjs with no NEON_API_KEY:"; node provision.mjs; echo "(exit=$?)"
=== syntax check:
=== syntax check: app.mjs OK provision.mjs OK === app.mjs with no DATABASE_URL: Missing DATABASE_URL. Set it to your Neon pooled connection string, e.g.: export DATABASE_URL="postgresql://user:pass@ep-xxx-pooler.us-east-2.aws.neon.tech/neondb?sslmode=require" You can get one from `node provision.mjs` or the Neon console. (exit=1) === provision.mjs with no NEON_API_KEY: Missing NEON_API_KEY. Create one at https://console.neon.tech/app/settings/api-keys then: export NEON_API_KEY="neondb_..." (exit=1)
Recorded tool call
{
"type": "tool_call",
"seq": 110,
"ts": "2026-10-05T22:07:01.299Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/neon-example && echo \"=== syntax check:\"; node --check app.mjs && echo \"app.mjs OK\"; node --check provision.mjs && echo \"provision.mjs OK\"; echo; echo \"=== app.mjs with no DATABASE_URL:\"; node app.mjs; echo \"(exit=$?)\"; echo; echo \"=== provision.mjs with no NEON_API_KEY:\"; node provision.mjs; echo \"(exit=$?)\""
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-a48f591a30970edd",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 111,
"ts": "2026-10-05T22:07:01.719Z",
"turn": 1,
"output": {
"content": [
{
"text": "=== syntax check:\napp.mjs OK\nprovision.mjs OK\n\n=== app.mjs with no DATABASE_URL:\nMissing DATABASE_URL.\nSet it to your Neon pooled connection string, e.g.:\n export DATABASE_URL=\"postgresql://user:pass@ep-xxx-pooler.us-east-2.aws.neon.tech/neondb?sslmode=require\"\nYou can get one from `node provision.mjs` or the Neon console.\n(exit=1)\n\n=== provision.mjs with no NEON_API_KEY:\nMissing NEON_API_KEY.\nCreate one at https://console.neon.tech/app/settings/api-keys then:\n export NEON_API_KEY=\"neondb_...\"\n(exit=1)\n",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-a48f591a30970edd",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Both fail cleanly. Now, one more thing: I can verify the driver actually works end-to-end against something — but no Neon database exists. I cannot verify queries execute. I must be explicit that the SQL path is unverified.
Actually, I can partially verify that the driver constructs a request correctly without a real DB — e.g., point it at a bogus URL and confirm it attempts an HTTP request (proving wiring is right, failing at network/auth, not at code). That's a meaningful partial verification. Let me try that quickly with a short timeout.
Let me test with a fake connection string pointing at the real Neon host but invalid creds — that would prove the driver reaches Neon's proxy and gets a Postgres-level auth error rather than a code error. That's a genuinely useful signal.
Keep it quick with timeout.
Let me prove the driver wiring actually reaches Neon's proxy (a bad-credentials error would confirm the code path works, vs. a code bug).
cd /sandbox/repo/neon-example && timeout 45 env DATABASE_URL="postgresql://nouser:nopass@ep-nonexistent-000000-pooler.us-east-2.aws.neon.tech/neondb?sslmode=require" node app.mjs 2>&1 | head -8; echo "(exit=${PIPESTATUS[0]})"Query failed: password authentication failed for user 'nouser'
Query failed: password authentication failed for user 'nouser' (exit=1)
Recorded tool call
{
"type": "tool_call",
"seq": 115,
"ts": "2026-10-05T22:07:08.679Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/neon-example && timeout 45 env DATABASE_URL=\"postgresql://nouser:nopass@ep-nonexistent-000000-pooler.us-east-2.aws.neon.tech/neondb?sslmode=require\" node app.mjs 2>&1 | head -8; echo \"(exit=${PIPESTATUS[0]})\""
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-a22c6bffdbbc5a4a",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 116,
"ts": "2026-10-05T22:07:09.060Z",
"turn": 1,
"output": {
"content": [
{
"text": "Query failed: password authentication failed for user 'nouser'\n(exit=1)\n",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-a22c6bffdbbc5a4a",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
That's a real signal: the driver performed a full TLS + Postgres auth handshake against Neon's proxy and got a genuine Postgres authentication error. That means the code path is correct end-to-end up to credentials — the only thing missing is a valid database. This is strong verification short of actual query execution.
Now write README with pricing and run instructions. Then report.
Let me write the README.
That's a strong signal: the driver completed a real TLS + Postgres handshake against Neon's proxy and got a genuine auth error — so the code path is correct end-to-end; only valid credentials are missing. Now the README:
File edits
1 file
Writtenneon-example/README.mdView changes
/sandbox/repo/neon-example/README.md
Written content · previous contents were not recorded
# Neon example — serverless PostgresA minimal, dependency-light example using Neon's **hosted** Postgres through itsofficial SDKs. Nothing runs locally: no Docker, no local Postgres, no dev server.Two packages do all the work:| Package | Role ||---|---|| `@neondatabase/serverless` | Query the database over HTTP/WebSocket (edge-safe, no connection pool to manage) || `@neondatabase/api-client` | Create / delete the project via the Neon control-plane API |> Note: `neonctl` is **no longer an SDK** — as of v8 it is only a CLI compatibility> shim. Use `@neondatabase/api-client` for programmatic control.## Files- `app.mjs` — the example: create table → insert → select → update → transaction.- `provision.mjs` — creates a Neon project and prints a `DATABASE_URL`; `--delete` tears it down.## Run it```bashnpm install# 1. Provision a database (needs an API key)# https://console.neon.tech/app/settings/api-keysexport NEON_API_KEY="neondb_..."node provision.mjs # writes .env.local and prints DATABASE_URL# 2. Query itexport $(grep -v '^#' .env.local | xargs)node app.mjs# 3. Clean up so you stop accruing usagenode provision.mjs --delete```Or skip the API entirely: create a project in the console, copy the **pooled**connection string, set `DATABASE_URL`, and run `node app.mjs`.## Keeping the cost near zero`provision.mjs` deliberately provisions small:- `autoscaling_limit_max_cu: 1` → capped at ~1 vCPU / 4 GB RAM- Scale-to-zero left **on** (default: suspends after 5 min idle) → idle databasesconsume **no** compute-hours- `provision.mjs --delete` removes the project, which stops storage billing too## How Neon pricing worksUsage-based, no fixed seat cost. Two meters matter most:- **Compute — CU-hours.** A CU (Compute Unit) ≈ 1 vCPU + 4 GB RAM. You pay for`CU × hours actually active`. Because compute scales to zero, an idle databasecosts nothing. This is the core difference from a normal managed Postgres,where you pay for a provisioned instance 24/7.- **Storage — GB-month.** billed on data actually stored. Child branches arecopy-on-write, so a branch costs only its *delta* from the parent, not a full copy.| | Free | Launch | Scale ||---|---|---|---|| Price | $0/mo | usage-based | usage-based || Projects | 100 | 100 | 1,000 || Branches / project | 10 | 10 | 25 || Compute | 100 CU-hrs **per project** | $0.106 / CU-hr | $0.222 / CU-hr || Max autoscale | 2 CU (8 GB) | 16 CU (64 GB) | 16 CU autoscale, fixed to 56 CU || Storage | 1 GB/project (20 GB acct total) | $0.35 / GB-mo | $0.35 / GB-mo || Scale to zero | after 5 min | after 5 min (can disable) | configurable || Egress | 5 GB/project | 500 GB/project, then $0.10/GB | 500 GB/project, then $0.10/GB |Other line items: extra branches $1.50/branch-month (~$0.002/hr), instant-restorehistory $0.20/GB-month, snapshots $0.09/GB-month. Invoices under $0.50 aren't collected.**Budget feel:** Neon's own typical-spend estimates are ~$15/mo for anintermittent 140 CU-hour / 1 GB workload on Launch, and ~$701/mo for ahigh-load 3,000 CU-hour / 100 GB workload on Scale.**Gotcha:** the Free plan's 100 CU-hours is **per project**, and you get 100projects — so this example is comfortably free, but watch that you don't leavemany projects running with scale-to-zero disabled.Sources: https://neon.com/pricing and https://neon.com/docs/introduction/plans(check before relying on these numbers — they change).
Source: write · chatcmpl-tool-b094518cb2e84fd2
Recorded tool call
{
"type": "tool_call",
"seq": 121,
"ts": "2026-10-05T22:07:19.372Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/neon-example/README.md",
"content": "# Neon example — serverless Postgres\n\nA minimal, dependency-light example using Neon's **hosted** Postgres through its\nofficial SDKs. Nothing runs locally: no Docker, no local Postgres, no dev server.\n\nTwo packages do all the work:\n\n| Package | Role |\n|---|---|\n| `@neondatabase/serverless` | Query the database over HTTP/WebSocket (edge-safe, no connection pool to manage) |\n| `@neondatabase/api-client` | Create / delete the project via the Neon control-plane API |\n\n> Note: `neonctl` is **no longer an SDK** — as of v8 it is only a CLI compatibility\n> shim. Use `@neondatabase/api-client` for programmatic control.\n\n## Files\n\n- `app.mjs` — the example: create table → insert → select → update → transaction.\n- `provision.mjs` — creates a Neon project and prints a `DATABASE_URL`; `--delete` tears it down.\n\n## Run it\n\n```bash\nnpm install\n\n# 1. Provision a database (needs an API key)\n# https://console.neon.tech/app/settings/api-keys\nexport NEON_API_KEY=\"neondb_...\"\nnode provision.mjs # writes .env.local and prints DATABASE_URL\n\n# 2. Query it\nexport $(grep -v '^#' .env.local | xargs)\nnode app.mjs\n\n# 3. Clean up so you stop accruing usage\nnode provision.mjs --delete\n```\n\nOr skip the API entirely: create a project in the console, copy the **pooled**\nconnection string, set `DATABASE_URL`, and run `node app.mjs`.\n\n## Keeping the cost near zero\n\n`provision.mjs` deliberately provisions small:\n\n- `autoscaling_limit_max_cu: 1` → capped at ~1 vCPU / 4 GB RAM\n- Scale-to-zero left **on** (default: suspends after 5 min idle) → idle databases\n consume **no** compute-hours\n- `provision.mjs --delete` removes the project, which stops storage billing too\n\n## How Neon pricing works\n\nUsage-based, no fixed seat cost. Two meters matter most:\n\n- **Compute — CU-hours.** A CU (Compute Unit) ≈ 1 vCPU + 4 GB RAM. You pay for\n `CU × hours actually active`. Because compute scales to zero, an idle database\n costs nothing. This is the core difference from a normal managed Postgres,\n where you pay for a provisioned instance 24/7.\n- **Storage — GB-month.** billed on data actually stored. Child branches are\n copy-on-write, so a branch costs only its *delta* from the parent, not a full copy.\n\n| | Free | Launch | Scale |\n|---|---|---|---|\n| Price | $0/mo | usage-based | usage-based |\n| Projects | 100 | 100 | 1,000 |\n| Branches / project | 10 | 10 | 25 |\n| Compute | 100 CU-hrs **per project** | $0.106 / CU-hr | $0.222 / CU-hr |\n| Max autoscale | 2 CU (8 GB) | 16 CU (64 GB) | 16 CU autoscale, fixed to 56 CU |\n| Storage | 1 GB/project (20 GB acct total) | $0.35 / GB-mo | $0.35 / GB-mo |\n| Scale to zero | after 5 min | after 5 min (can disable) | configurable |\n| Egress | 5 GB/project | 500 GB/project, then $0.10/GB | 500 GB/project, then $0.10/GB |\n\nOther line items: extra branches $1.50/branch-month (~$0.002/hr), instant-restore\nhistory $0.20/GB-month, snapshots $0.09/GB-month. Invoices under $0.50 aren't collected.\n\n**Budget feel:** Neon's own typical-spend estimates are ~$15/mo for an\nintermittent 140 CU-hour / 1 GB workload on Launch, and ~$701/mo for a\nhigh-load 3,000 CU-hour / 100 GB workload on Scale.\n\n**Gotcha:** the Free plan's 100 CU-hours is **per project**, and you get 100\nprojects — so this example is comfortably free, but watch that you don't leave\nmany projects running with scale-to-zero disabled.\n\nSources: https://neon.com/pricing and https://neon.com/docs/introduction/plans\n(check before relying on these numbers — they change).\n"
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-b094518cb2e84fd2",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 122,
"ts": "2026-10-05T22:07:19.372Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 3477 bytes to /sandbox/repo/neon-example/README.md",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-b094518cb2e84fd2",
"is_error": false,
"tool_kind": "file_edit"
}›Thinking…
Let me do a final check of the directory and clean up package.json (add type: module? Files are .mjs so fine). Let me add scripts and verify final state.
cd /sandbox/repo/neon-example && node -e "
const fs=require('fs');const p=JSON.parse(fs.readFileSync('package.json'));
p.name='neon-example';p.private=true;p.type='module';p.description='Minimal Neon serverless Postgres example (API + driver)';
p.scripts={start:'node app.mjs',provision:'node provision.mjs',cleanup:'node provision.mjs --delete'};
fs.writeFileSync('package.json',JSON.stringify(p,null,2)+'\n');
" && echo "=== final tree:" && ls -1 && echo "=== deps:" && node -e "const p=require('./package.json');console.log(p.dependencies)"=== final tree:
=== final tree:
README.md
app.mjs
node_modules
package-lock.json
package.json
provision.mjs
=== deps:
{
'@neondatabase/api-client': '^2.7.3',
'@neondatabase/serverless': '^1.2.0'
}
Recorded tool call
{
"type": "tool_call",
"seq": 125,
"ts": "2026-10-05T22:07:21.359Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo/neon-example && node -e \"\nconst fs=require('fs');const p=JSON.parse(fs.readFileSync('package.json'));\np.name='neon-example';p.private=true;p.type='module';p.description='Minimal Neon serverless Postgres example (API + driver)';\np.scripts={start:'node app.mjs',provision:'node provision.mjs',cleanup:'node provision.mjs --delete'};\nfs.writeFileSync('package.json',JSON.stringify(p,null,2)+'\\n');\n\" && echo \"=== final tree:\" && ls -1 && echo \"=== deps:\" && node -e \"const p=require('./package.json');console.log(p.dependencies)\""
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-83eb8e5f3248e8cc",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 126,
"ts": "2026-10-05T22:07:21.751Z",
"turn": 1,
"output": {
"content": [
{
"text": "=== final tree:\nREADME.md\napp.mjs\nnode_modules\npackage-lock.json\npackage.json\nprovision.mjs\n=== deps:\n{\n '@neondatabase/api-client': '^2.7.3',\n '@neondatabase/serverless': '^1.2.0'\n}\n",
"type": "text"
}
]
},
"run_id": "cmuvstbft002x0hugvl0mkcqv",
"tool_id": "chatcmpl-tool-83eb8e5f3248e8cc",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Everything in place. Now write the final report:
- What I built
- Blocked: no credentials — state plainly
- Pricing
- Manageability assessment
- No local stacks started, no long-running commands
Let me be concise but complete. The user asked specific questions:
- how pricing works
- briefly whether this product will be easy for me to manage
- let them know if blocked
Let me answer clearly.
On manageability — honest assessment: Neon is very agent-friendly: scale-to-zero means no idle cost, HTTP driver means no connection pool/state, API for provisioning, cheap branching. Downsides for an agent: needs a credential I don't have (out-of-band human signup — API keys require console login, can't self-serve), and cost is usage-based so an agent that forgets to clean up or leaves scale-to-zero disabled accrues charges silently; no way for me to verify spend without API access. That's honest.
Let me note the blocked part clearly and prominently.
Done. Here's where things stand.
Blocked — on credentials, not on the product
Neon does have a real developer workflow I can act on, so this isn't a "stop" case. But I hit a hard wall:
- No
NEON_API_KEYand noDATABASE_URLin this environment. I checked every env var. - I confirmed it's genuinely credential-gated, not a network problem:
console.neon.tech/api/v2/projectsreturns a proper Postgres-style auth rejection (supplied credentials do not pass authentication) for both keyless and bad-key requests. - API keys require a human console signup — I can't self-serve one. This is the one step I can't do for you.
So the code is written and verified as far as is possible without a live database, but the SQL has never actually executed against a real Neon database. Don't treat it as proven-working.
What I built — /sandbox/repo/neon-example/
Hosted-only, as asked. No Docker, no local Postgres, no dev server, no long-running commands.
app.mjs— the example: create table → parameterised insert → select → update → multi-statement transaction. Uses@neondatabase/serverless, whose HTTP driver needs no connection pool.provision.mjs— creates a project via the control-plane API and prints aDATABASE_URL;--deletetears it down.README.md— run steps + pricing.
Two corrections I made from checking the installed typings rather than trusting docs/memory:
neonctlis no longer an SDK. v8 is only a CLI shim (bin/cli.js, no library entry point) — it flat-out fails to import. The provisioning SDK is@neondatabase/api-client.suspend_timeout_secondsis not valid indefault_endpoint_settings— it lives on the Endpoint. I removed it instead of shipping a payload the API might reject or silently ignore.
The one verification that did mean something: pointing app.mjs at a bogus Neon host returned password authentication failed for user 'nouser'. That's a genuine Postgres error from Neon's proxy, so TLS + protocol + query wiring are correct end-to-end. Only valid credentials are missing.
How pricing works
Usage-based, no seat cost. Two meters dominate:
- Compute, in CU-hours. 1 CU ≈ 1 vCPU + 4 GB RAM; billed as
CU × hours active. Compute scales to zero, so an idle database costs nothing — this is the real difference from normal managed Postgres, where a provisioned instance bills 24/7. - Storage, per GB-month. Branches are copy-on-write, so a branch bills only its delta from the parent, not a full copy.
| Free | Launch | Scale | |
|---|---|---|---|
| Price | $0 | usage-based | usage-based |
| Projects | 100 | 100 | 1,000 |
| Compute | 100 CU-hrs per project | $0.106/CU-hr | $0.222/CU-hr |
| Storage | 1 GB/project (20 GB acct) | $0.35/GB-mo | $0.35/GB-mo |
| Scale to zero | after 5 min | after 5 min, disableable | configurable |
Also: extra branches $1.50/branch-month, instant-restore history $0.20/GB-mo, egress over 500 GB $0.10/GB. Invoices under $0.50 aren't collected. Neon's own typical-spend figures: ~$15/mo (intermittent, 140 CU-hrs, 1 GB) and ~$701/mo (high load, 3,000 CU-hrs, 100 GB). Worth re-checking — these numbers move.
Will this be easy for me to manage?
Mostly yes, with one real caveat.
Easy: scale-to-zero means an abandoned database costs ~nothing instead of leaking money — the single best property for agent-driven infra. The HTTP driver is stateless, so no pool sizing or connection leaks. Provisioning is a clean API call, and branching gives me disposable throwaway databases for testing without touching real data.
The caveat: billing is invisible to me. Cost is usage-based and accrues silently, so if I leave a project running with scale-to-zero disabled, or forget --delete, charges accumulate with nothing I can observe locally to tell me. I have no way to check spend without API access I don't currently have. provision.mjs mitigates this by capping compute at 1 CU, leaving scale-to-zero on, and tracking created projects for cleanup — but the mitigation depends on cleanup actually being run.
To unblock: create a key at console.neon.tech/app/settings/api-keys, then export NEON_API_KEY=... and run node provision.mjs. That will also let me confirm the queries actually execute.
AX Fundamentals
23 checks. Open an area for details.
This check is a quick preview. Test more tasks and models with Gauge Agents.
Test your product with Gauge Agents