# AX Check: postgrid.com
Checked 2026-09-18.

PostGrid's quickstart and pricing are clear, but llms.txt is broken
Guides serve actionable Markdown quickstarts with code and pricing is stated openly, but llms.txt returns the plain homepage instead of a docs index.

## Onboarding needs a login

## Coding sessions
All three independent sessions (DeepSeek V4 Pro, Kimi K3, Qwen 3.8 Max) completed and found pricing without hitting a login wall, pulling per-piece rates and plan tiers straight from the pricing page and stating the assumptions behind them, like plan tier, region, and mail class.

### DeepSeek V4 Pro
[View public run](https://agents.withgauge.com/p/runs/cd7e1866-0255-45dc-9ba7-3ddcb9ee5912) · [Read transcript](https://www.ax-check.com/postgrid.com/sessions/deepseek.json)
README.md pricing table lists per-piece US Starter-plan prices with named assumptions (plan tier, region US vs Canada, mail class, item type, 500/mo overage threshold).
#### End-to-end onboarding
- **Onboarding needs a login**: The agent never obtained real PostGrid API credentials. It explicitly notes no API key exists in the sandbox and that account creation requires human signup. It tested its script with a fabricated placeholder key, which correctly triggered a 401 from the live API. This confirms the API endpoint is real, but no authenticated operation ever succeeded because no genuine key was available or obtained self-service.
  Event 184:

  ```text
  No real or test API key exists in this environment, and I can't create an account for you (signup needs credentials).
  ```
  Event 177:

  ```text
  postgrid.AuthenticationError: Error code: 401 - {'object': 'error', 'error': {'type': 'invalid_api_key_error', 'message': 'Invalid API key test_fake_placeholder_key'}}
  ```
  Event 184:

  ```text
  just `export POSTGRID_PRINT_MAIL_API_KEY="test_..."` from a free dashboard account, then `python send_letter.py`.
  ```

#### Hallucinated URLs
None identified in this transcript.

#### Blockers
- **No self-service API key available to complete a live test**: PostGrid requires signing up at the hosted dashboard to obtain even a test API key; this is normal product authentication, not a defect. The agent could not create an account or acquire a key inside the sandbox, so it could only validate the request path structurally (confirming a real 401 from the live API with a placeholder key) rather than complete an actual letter-creation call.
  Event 184:

  ```text
  No real or test API key exists in this environment, and I can't create an account for you (signup needs credentials).
  ```
  Event 177:

  ```text
  postgrid.AuthenticationError: Error code: 401 - {'object': 'error', 'error': {'type': 'invalid_api_key_error', 'message': 'Invalid API key test_fake_placeholder_key'}}
  ```
- **Marketing pricing page blocked scripted access**: Test-environment/agent behavior issue: the default curl user agent was blocked by the site's WAF (403 Forbidden) on www.postgrid.com/pricing and /pricing-print-mail/. This is not a product API defect — it's anti-bot protection on the marketing site — and the agent worked around it by spoofing a Googlebot user agent, which succeeded.
  Event 30:

  ```text
  403 - Forbidden bg_error_lines circle_dots 403 - Forbidden Access to this page is forbidden. clouds_shape
  ```
  Event 57:

  ```text
  exit 0
  75193 /tmp/pricing2.html
  403 - Forbidden
  ```

#### Suggested Changes
- **Clarify that the npm package name 'postgrid' is unrelated to the PostGrid API**: A plain `npm view postgrid` returns an unrelated CSS flexbox-grid package, not the PostGrid SDK (which is actually published as `postgrid-node`). Add a note on the docs.postgrid.com quickstart or README of postgrid-node clarifying the correct install command (`npm install postgrid-node`) to prevent developers from installing the wrong package by guessing the name.
  Event 40:

  ```text
  postgrid@1.0.1 | MIT | deps: 1 | versions: 6
  > A fully responsive flexbox grid helper.
  ```

### Kimi K3
[View public run](https://agents.withgauge.com/p/runs/500563b5-8a89-4861-8788-d00f72705710) · [Read transcript](https://www.ax-check.com/postgrid.com/sessions/kimi.json)
Final output gives per-piece price ranges for letters/postcards/cheques and states the basis: pay-per-piece no monthly fee, historical published figures, and flags that the live pricing page is JS-rendered so exact current numbers couldn't be scraped.
#### End-to-end onboarding
- **Onboarding needs a login**: Agent never obtained a real PostGrid API key. It tried the live API with a placeholder value ('test_sk_missing') and got a clean 401 invalid_api_key_error, confirming reachability but no authenticated operation was ever completed. The session ended with the agent stating a human must sign up at dashboard.postgrid.com to get a key.
  Event 71:

  ```text
  [Error] 401 {"object":"error","error":{"type":"invalid_api_key_error","message":"Invalid API key test_sk_missing"}}
  ```
  Event 76:

  ```text
  No API key was available in this environment, and getting one requires signing up at dashboard.postgrid.com (self-serve, gives you a free `test_sk_...` key).
  ```
  Event 55:

  ```text
  // Use a *test* key (test_sk_...) from https://dashboard.postgrid.com — test mode
  // never prints/mails anything and is free.
  ```

#### Hallucinated URLs
None identified in this transcript.

#### Blockers
- **No PostGrid API key available in sandbox**: The session had no PostGrid credentials pre-provisioned, and self-serve signup requires a human to visit the PostGrid dashboard. This is a normal login/credential requirement, not a product defect — the agent correctly identified the live API endpoint and got a clean, well-formed 401 error rather than any unexpected failure.
  Event 71:

  ```text
  [Error] 401 {"object":"error","error":{"type":"invalid_api_key_error","message":"Invalid API key test_sk_missing"}}
  ```
  Event 76:

  ```text
  getting one requires signing up at dashboard.postgrid.com (self-serve, gives you a free `test_sk_...` key)
  ```
- **Wrong npm package name collides with unrelated CSS tool**: The agent's first instinct, 'npm install postgrid', pulled down an unrelated CSS flexbox grid helper package rather than the official PostGrid SDK, wasting a round trip before it found the correct package name 'postgrid-node' via npm registry search. This is an agent/ecosystem naming-collision issue, not a PostGrid product defect, but it did cost extra turns.
  Event 19:

  ```text
  # postgrid
  
  > A fully responsive flexbox grid helper.
  ```
  Event 28:

  ```text
  postgrid-node - The official TypeScript library for the PostGrid API
  ```
- **Constructor signature mismatch caused an initial runtime error**: The agent initially called the PostGrid SDK constructor with a single string argument, which the SDK rejected because it expects a named-options object with explicit key fields. This was an agent coding error, quickly self-corrected after reading the type definitions.
  Event 59:

  ```text
  [Error] Could not resolve authentication method. Expected either addressVerificationAPIKey or printMailAPIKey to be set. Or for one of the "X-API-Key" or "X-API-Key" headers to be explicitly omitted
  ```

#### Suggested Changes
- **Rename or deprecate-link the mismatched 'postgrid' npm package listing**: Searching npm for 'postgrid' surfaces an unrelated CSS grid helper package before the official 'postgrid-node' SDK is found via full-text registry search. On the PostGrid quickstart/developer docs page, state the exact install command 'npm install postgrid-node' up front so new integrators do not install the wrong package first (as seen when the agent ran 'npm install postgrid' and got a CSS library README instead of API docs).
  Event 7:

  ```text
  npm install postgrid
  ```
  Event 19:

  ```text
  # postgrid
  
  > A fully responsive flexbox grid helper.
  ```
- **Clarify SDK constructor usage in postgrid-node README**: The postgrid-node package's constructor requires a named-options object (e.g. { printMailAPIKey: '...' }) rather than a plain string, but this was not obvious without reading client.d.ts directly. Add a short usage example to the postgrid-node README showing the correct constructor call, and confirm the fix by running the same example.js without a TypeError before the 401 auth check.
  Event 59:

  ```text
  [Error] Could not resolve authentication method. Expected either addressVerificationAPIKey or printMailAPIKey to be set. Or for one of the "X-API-Key" or "X-API-Key" headers to be explicitly omitted
  ```
  Event 62:

  ```text
  constructor({ baseURL, addressVerificationAPIKey, printMailAPIKey, ...opts }?: ClientOptions)
  ```

### Qwen 3.8 Max
[View public run](https://agents.withgauge.com/p/runs/a043ea33-46f9-4e9e-aec4-fc39041145bb) · [Read transcript](https://www.ax-check.com/postgrid.com/sessions/qwen.json)
Pricing figures (Starter $0/500 mailings, $1.059 First Class letter, etc.) were pulled from a real curl fetch of postgrid.com/pricing-print-mail (seq 51-52) and reported with plan/region assumptions (US rates, Starter free tier, test-mode-is-free caveat).
#### End-to-end onboarding
- **Onboarding needs a login**: No PostGrid API key was available in the environment. The agent checked env vars, probed the live API with fabricated test keys (all rejected with structured 401s), and searched for any way to self-provision credentials, but could not obtain a real key without human action via the PostGrid dashboard. The example script was fully wired and exercised its error paths (missing key, non-test key refusal, invalid key 401) but never completed an authenticated create-letter call against the real API, so no genuine product operation was demonstrated.
  Event 6:

  ```text
  PI_GATEWAY_API_KEY=<redacted>
  ```
  Event 18:

  ```text
  {"object":"error","error":{"type":"missing_auth_error","message":"Missing or invalid authentication."}}
  ```
  Event 97:

  ```text
  PostGrid API error 401: {'type': 'invalid_api_key_error', 'message': 'Invalid API key test_dummy_key_for_wiring_check'}
  ```
  Event 117:

  ```text
  Blocked on one thing: there's no PostGrid API key in this environment, so no letter has actually been created.
  ```

#### Hallucinated URLs
None identified in this transcript.

#### Blockers
- **No PostGrid API key available to complete the live create-letter call**: The sandbox environment contains no PostGrid credentials, and PostGrid requires a human to sign up in the dashboard to obtain a key (self-serve, but gated behind human account creation, not something the agent could automate). This is a test-environment/credential limitation rather than a product defect: the API correctly rejected fabricated test keys with clear structured errors, proving the auth flow itself works as documented.
  Event 6:

  ```text
  PI_GATEWAY_API_KEY=<redacted>
  ```
  Event 97:

  ```text
  PostGrid API error 401: {'type': 'invalid_api_key_error', 'message': 'Invalid API key test_dummy_key_for_wiring_check'}
  ```
  Event 117:

  ```text
  Getting a key is self-serve (dashboard → Settings → API Keys, free Starter account) — but it needs a human.
  ```

#### Suggested Changes
None identified in this transcript.

### Task given to each agent
Help me build a simple example using PostGrid. Tell me how pricing works, and briefly tell me whether this product will be easy for you to manage. Let me know if you get blocked. If this product has no developer workflow you can act on, say so plainly and stop. Stay light: use the hosted product through its SDK or API. Do not start local service stacks or wait for long-running commands; if the quickstart requires either, say so plainly and stop.

No product credentials were supplied and no purchases were authorized.

## Score: B · 65/100 (provisional)
Grades come from completed site checks. Coding sessions and skipped checks do not affect the score.

### Clarity
- **Failed** — Homepage answers Markdown requests

  ```text
  Homepage returned text/html for a text/markdown request; no Markdown representation offered.
  ```

- **Failed** — llms.txt provides an actionable documentation index

  ```text
  /llms.txt returned the HTML homepage (200), not a Markdown index of docs.
  ```

- **Skipped** — llms.txt provides navigation guidance

  ```text
  No llms.txt body exists; navigation guidance cannot be evaluated.
  ```

- **Skipped** — llms.txt mentions offered API, MCP, and skills

  ```text
  No llms.txt body exists; API/MCP/skills mentions cannot be evaluated.
  ```

- **Pass** — A compact guide representation exists

  ```text
  guides.postgrid.com serves text/markdown for guide pages, e.g. the Address Verification quickstart.
  ```

- **Pass** — A focused guide is directly retrievable

  ```text
  Address Verification quickstart is directly retrievable as Markdown with API key, setup and code.
  ```

- **Pass** — Equivalent instructions fit a token budget

  ```text
  Markdown quickstart is 3736 tokens, well under the 8000-token budget.
  ```

- **Skipped** — Product-docs links survive format changes

  ```text
  Homepage Markdown is unsupported, so link preservation across formats cannot be measured.
  ```

- **Pass** — The compact guide is independently actionable

  ```text
  Address Verification guide gives concrete setup: API key, node-fetch install, verify code, batch, geocoding.
  ```

- **Pass** — Install and next-step links resolve

  ```text
  Fetched install/next-step pages (guides, API docs, address verification guide) all returned HTTP 200.
  ```


### Onboarding
- **Pass** — Docs lead to a relevant quickstart

  ```text
  Guides hub links to Address Verification and Print & Mail quickstart guides with concrete steps.
  ```

- **Pass** — Installation commands are extractable

  ```text
  Guide shows npm install node-fetch and node index.js commands in setup.
  ```

- **Pass** — Code examples are available without interaction

  ```text
  Homepage and guide show cURL and Node.js code examples inline without interaction.
  ```

- **Pass** — Prerequisites and auth boundaries are explicit

  ```text
  Guide explains obtaining API key, public vs server keys, and x-api-key header auth.
  ```


### Pricing
- **Pass** — Pricing is readable without interaction

  ```text
  Pricing pages render plan tiers and per-piece rates directly in fetched HTML, no interaction needed.
  ```

- **Pass** — Prices are stated, not gated

  ```text
  Starter $0/month, per-piece rates, and AV tiers $18-$200/month are stated openly.
  ```

- **Pass** — Pricing units and limits are explicit

  ```text
  Units explicit: 500 mailings/month, per-letter/postcard/check rates, 2,000 lookups at $0.02 each.
  ```

- **Pass** — Agents identify pricing and its assumptions

  ```text
  3 of 3 sessions were judged on pricing; 0 fell short. DeepSeek V4 Pro: README.md pricing table lists per-piece US Starter-plan prices with named assumptions (plan tier, region US vs Canada, mail class, item type, 500/mo overage threshold). Kimi K3: Final output gives per-piece price ranges for letters/postcards/cheques and states the basis: pay-per-piece no monthly fee, historical published figures, and flags that the live pricing page is JS-rendered so exact current numbers couldn't be scraped. Qwen 3.8 Max: Pricing figures (Starter $0/500 mailings, $1.059 First Class letter, etc.) were pulled from a real curl fetch of postgrid.com/pricing-print-mail (seq 51-52) and reported with plan/region assumptions (US rates, Starter free tier, test-mode-is-free caveat). This behavioural item does not affect the fast grade.
  ```


### Activation
- **Pass** — An API reference or OpenAPI spec is reachable

  ```text
  API docs page links to Print & Mail and Address Verification API references; OpenAPI spec downloadable.
  ```

- **Skipped** — An MCP server is documented and well-formed

  ```text
  No MCP server documentation found in fetched PostGrid pages.
  ```

- **Skipped** — A CLI install path is documented

  ```text
  No CLI install path documented in fetched PostGrid pages.
  ```

- **Skipped** — SDK packages resolve on their registries

  ```text
  Only node-fetch dependency registry checked; no PostGrid SDK package registry result supplied.
  ```

- **Skipped** — Agent skills are published

  ```text
  No agent skills published or documented in fetched PostGrid pages.
  ```



[Full report data](https://www.ax-check.com/postgrid.com/report.json)
