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

Shippo's docs get an agent from quickstart to first API call fast.
20 of 23 checks passed: install commands, code samples, auth steps, MCP server and pricing are all stated plainly, no login wall.

## Onboarding needs a login

## Coding sessions
All three independent coding sessions completed and reported pricing clearly, citing concrete per-label fees, free tiers, and paid plan tiers (e.g. Starter, Professional, Premier) sourced from Shippo's pricing page, each noting the assumptions behind the numbers.

### DeepSeek V4 Pro
[View public run](https://agents.withgauge.com/p/runs/e8cf4164-cce4-4452-a465-329df513565f) · [Read transcript](https://www.ax-check.com/shippo.com/sessions/deepseek.json)
README.md and final output give concrete API Starter pricing ($0.07/label, 30 free/month) with named plan/trial-limit assumptions plus a full per-service fee table sourced from goshippo.com/pricing/api.
#### End-to-end onboarding
- **Onboarding needs a login**: The agent built and ran a Shippo REST API example but had no real API credentials in the sandbox. It only tested the auth failure path (bogus/missing key returning 401), never a genuine authenticated operation. Getting a real key requires human signup at apps.goshippo.com/join and manual key generation in the API portal — an unresolved credential need blocking any live product interaction.
  Event 7:

  ```text
  no shippo env vars
  ```
  Event 106:

  ```text
  Error: HTTP 401 Unauthorized: {"detail":"Token does not exist"}
  ```
  Event 122:

  ```text
  The one block is **credentials**: there's no Shippo API key in this environment, and getting one requires a human to sign up at `apps.goshippo.com/join` and generate a token in the API portal.
  ```

#### Hallucinated URLs
- **Guessed docs URLs under old /docs/ path structure**: The agent guessed several documentation URLs following a /docs/get-started/ and /docs/apis/ pattern that doesn't exist on the current docs site, all returning 404. These look like plausible but invented paths rather than links copied from any page the agent had already read, since the correct paths (under /guides/) were only discovered afterward via llms.txt.
  Event 40:

  ```text
  shipments:404 final:https://docs.goshippo.com/docs/apis/shipments
  signup:404 final:https://docs.goshippo.com/docs/get-started/signing-up
  ```
  Event 56:

  ```text
  first:404 final:https://docs.goshippo.com/docs/get-started/first-label
  auth:404 final:https://docs.goshippo.com/docs/get-started/authentication
  ```

#### Blockers
- **No Shippo API credentials available in sandbox**: The environment had no SHIPPO_API_KEY or any Shippo account credentials, and creating one requires a human to sign up on Shippo's website and generate a key through the web portal — steps the agent cannot do itself. This is a normal login/signup requirement of the product, not a defect, but it fully blocked any live rate lookup or label purchase.
  Event 7:

  ```text
  no shippo env vars
  ```
  Event 122:

  ```text
  getting one requires a human to sign up at `apps.goshippo.com/join` and generate a token in the API portal
  ```

#### Suggested Changes
- **Fix or remove broken quickstart links referenced from llms.txt-adjacent guessed paths**: Requests to https://docs.goshippo.com/docs/get-started/authentication and https://docs.goshippo.com/docs/get-started/first-label return 404; the real pages live under /guides/authentication and /guides/generate-shipping-label. If any external documentation, blog posts, or redirects still point to the old /docs/get-started/ path, update them to the /guides/ path and confirm with a curl check that the URL returns 200 instead of 404.
  Event 56:

  ```text
  first:404 final:https://docs.goshippo.com/docs/get-started/first-label
  auth:404 final:https://docs.goshippo.com/docs/get-started/authentication
  ```

### Kimi K3
[View public run](https://agents.withgauge.com/p/runs/376ef106-f008-4b0d-8371-1b079ccb853a) · [Read transcript](https://www.ax-check.com/shippo.com/sessions/kimi.json)
Final output gives concrete pricing (test mode free, ~$0.05/label pay-as-you-go plus carrier postage, Professional ~$10/mo, custom Premier) and flags plan/tier assumptions plus a caveat to verify current tiers at shippo.com/pricing.
#### End-to-end onboarding
- **Onboarding needs a login**: The agent found no Shippo credentials in the environment, correctly identified that obtaining an API token requires signing up at goshippo.com with email verification (a human step it cannot perform), and stopped there. It only verified the API's shape via an unauthenticated request that returned 401. No authenticated operation was ever performed against the live Shippo API.
  Event 5:

  ```text
  env | grep -i shippo; echo "---"; node --version; python3 --version; pip list 2>/dev/null | grep -i shippo; npm ls shippo 2>/dev/null
  ```
  Event 45:

  ```text
  I could not execute the flow end-to-end because Shippo has no anonymous sandbox. An API token requires signing up at goshippo.com, which involves email verification I can't perform.
  ```
  Event 13:

  ```text
  401
  {"detail":"Authentication credentials were not provided."}
  ```

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

#### Blockers
- **Shippo signup requires human email verification**: The agent could not obtain a Shippo API token because account creation requires email verification, a step outside the agent's self-service capability. This is a normal product authentication requirement, not a product defect, and it left the example script untested against the live API.
  Event 45:

  ```text
  An API token requires signing up at goshippo.com, which involves email verification I can't perform. Once you export `SHIPPO_API_TOKEN=shippo_test_...`, the script runs as-is.
  ```
- **SDK v2 has a different interface than documented v1 pattern**: The agent's first attempt used the classic v1 factory-function pattern (require('shippo')(token)), which failed because the installed npm package (v2.18.0) uses a class-based Shippo client instead. This was agent error from assuming outdated SDK usage, though it was self-corrected quickly by inspecting the module's exports and prototype methods.
  Event 24:

  ```text
  TypeError: require(...) is not a function
      at Object.<anonymous> (/sandbox/repo/shippo_example.js:10:33)
  ```

#### Suggested Changes
- **Update Node quickstart examples to the v2 SDK client pattern**: The npm package 'shippo' at version 2.18.0 exports a class-based API (new Shippo({apiKeyHeader}) with shippo.addresses.create, shippo.shipments.create, etc.) rather than the classic factory-function call (require('shippo')(token)). If public quickstart docs still show the old pattern, update them to match the installed package version so first-time developers do not hit a TypeError on the first run. Verify by running a fresh npm install shippo and confirming the documented snippet executes without modification.
  Event 24:

  ```text
  TypeError: require(...) is not a function
      at Object.<anonymous> (/sandbox/repo/shippo_example.js:10:33)
  ```

### Qwen 3.8 Max
[View public run](https://agents.withgauge.com/p/runs/1b722271-6ace-4dd8-8e9d-87a3623c0fe0) · [Read transcript](https://www.ax-check.com/shippo.com/sessions/qwen.json)
README.md and final summary state pricing with explicit assumptions: free test-mode tokens, Starter plan ~$0.05/label fee vs paid Professional/Premier tiers, and separate carrier postage costs.
#### End-to-end onboarding
- **Onboarding needs a login**: The agent never obtained a real Shippo API credential during the session. It only had a dummy/placeholder token (shippo_test_dummy) and used it to hit the live api.goshippo.com endpoint, which correctly returned 401 Token does not exist. No self-service signup or credential retrieval occurred, and the agent explicitly flagged the missing token as the sole blocker to a successful authenticated call.
  Event 114:

  ```text
  SDKError API error occurred: Status 401
  {"detail":"Token does not exist"}
  ```
  Event 122:

  ```text
  shippo.models.errors.sdkerror.SDKError: API error occurred: Status 401
  {"detail":"Token does not exist"}
  ```
  Event 129:

  ```text
  I don't have a real `SHIPPO_API_TOKEN` in this environment
  ```

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

#### Blockers
- **No real Shippo API token available in sandbox**: The environment only exposed a gateway API key (PI_GATEWAY_API_KEY), not a Shippo credential. This is a missing-credentials limitation of the test environment, not a product defect — the agent could not complete a live end-to-end call (create address/shipment/rates) and had to validate the code path with a dummy token, correctly receiving a 401 from the real API.
  Event 6:

  ```text
  PI_GATEWAY_API_KEY=<set>
  ```
  Event 114:

  ```text
  SDKError API error occurred: Status 401
  {"detail":"Token does not exist"}
  ```
- **SDK v3 API surface differs sharply from commonly-known v2 patterns**: Agent error/discovery friction: the agent initially wrote code using shippo.Address.create(...) style calls (apparently from prior/general knowledge of the SDK), which failed because the installed v3 SDK uses a client-based shippo.Shippo(...) object with typed request dataclasses (AddressCreateRequest, etc.). This required multiple rounds of introspection (dir(), inspect.signature, unzipping the wheel) to discover the correct v3 usage.
  Event 25:

  ```text
  AttributeError: module 'shippo' has no attribute 'Address'. Did you mean: 'Addresses'?
  ```
  Event 33:

  ```text
  AttributeError: module 'shippo' has no attribute 'ShippoClient'
  ```
  Event 65:

  ```text
  TypeError: ParcelCreateRequest.__init__() missing 1 required positional argument: 'mass_unit'
  ```
- **SSL certificate verification failure against api.goshippo.com from default client**: Test-environment issue: the sandbox's default requests client failed TLS verification when calling the live Shippo API using default settings, requiring the agent to manually pass a Session with a custom CA bundle. This is a sandbox/environment configuration quirk rather than a Shippo product defect, since raw curl and requests.get calls to the same host succeeded (401, not TLS failure) once verify was set appropriately.
  Event 65:

  ```text
  requests.exceptions.SSLError: HTTPSConnectionPool(host='api.goshippo.com', port=443): Max retries exceeded with url: /addresses (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1000)')))
  ```
  Event 114:

  ```text
  SDKError API error occurred: Status 401
  ```

#### Suggested Changes
- **Publish a v3 SDK migration note in the Python quickstart**: Add a short callout in the Shippo Python SDK docs/quickstart clarifying that v3 replaced the old shippo.Address.create(...) pattern with a client object (shippo.Shippo(api_key_header=...)) plus typed request dataclasses (AddressCreateRequest, ParcelCreateRequest, ShipmentCreateRequest). Verify by having a new developer follow only the quickstart and confirm their first script runs without needing to introspect the installed package (dir(shippo), unzip the wheel) to find the right classes, as happened here.
  Event 25:

  ```text
  AttributeError: module 'shippo' has no attribute 'Address'. Did you mean: 'Addresses'?
  ```
  Event 45:

  ```text
  (self, request: shippo.models.components.addresscreaterequest.AddressCreateRequest) -> shippo.models.components.address.Address
  ```
- **Document the ParcelCreateRequest required mass_unit field explicitly**: In the Parcel object reference/quickstart example, list mass_unit (not weight_unit) as the required field name alongside weight, since the agent's first guess (weight_unit) matched common shipping terminology but failed. Verify by checking that the sample code in the Parcels API reference uses mass_unit and that a fresh implementation based only on that sample succeeds on first run.
  Event 65:

  ```text
  TypeError: ParcelCreateRequest.__init__() missing 1 required positional argument: 'mass_unit'
  ```

### Task given to each agent
Help me build a simple example using Shippo. 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 · 84/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 even when Markdown was requested; no Markdown representation offered.
  ```

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

  ```text
  llms.txt lists docs, API quickstart, first-label guide, MCP, and skills links.
  ```

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

  ```text
  llms.txt organizes content into Overview, Web App, API, AI, Solutions, Pricing sections.
  ```

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

  ```text
  llms.txt mentions API docs, Shippo MCP, and Shippo Intelligence AI features.
  ```

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

  ```text
  Standalone Markdown guides exist, e.g. docs.goshippo.com/guides/api-quickstart.md and reporting-api/quickstart.md.
  ```

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

  ```text
  API quickstart .md gives token, install, first call, and response in one page.
  ```

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

  ```text
  Quickstart .md is 2014 tokens, well under the 8000-token budget.
  ```

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

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

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

  ```text
  API quickstart gives token setup, install commands, and a first address call with response.
  ```

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

  ```text
  Fetched quickstart and reporting quickstart pages returned 200 with working next-step routes.
  ```


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

  ```text
  llms.txt links API Quickstart Guide; fetched quickstart gives concrete first API call steps.
  ```

- **Pass** — Installation commands are extractable

  ```text
  Quickstart lists pip install shippo, npm install shippo, dotnet add package Shippo.
  ```

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

  ```text
  Quickstart shows cURL, Python, PHP, TypeScript, Java, C# code inline without interaction.
  ```

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

  ```text
  Quickstart requires API token, links Authentication guide, and recommends test token.
  ```


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

  ```text
  Pricing pages render plan tiers, prices and feature tables as static HTML text.
  ```

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

  ```text
  App Pro $17/mo, API 7¢/label, tracking 2¢, validation 2¢/8¢ all stated publicly.
  ```

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

  ```text
  Label limits, overage $0.08/label, per-call API rates and user counts are explicit.
  ```

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

  ```text
  3 of 3 sessions were judged on pricing; 0 fell short. DeepSeek V4 Pro: README.md and final output give concrete API Starter pricing ($0.07/label, 30 free/month) with named plan/trial-limit assumptions plus a full per-service fee table sourced from goshippo.com/pricing/api. Kimi K3: Final output gives concrete pricing (test mode free, ~$0.05/label pay-as-you-go plus carrier postage, Professional ~$10/mo, custom Premier) and flags plan/tier assumptions plus a caveat to verify current tiers at shippo.com/pricing. Qwen 3.8 Max: README.md and final summary state pricing with explicit assumptions: free test-mode tokens, Starter plan ~$0.05/label fee vs paid Professional/Premier tiers, and separate carrier postage costs. This behavioural item does not affect the fast grade.
  ```


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

  ```text
  API reference reachable at docs.goshippo.com/api-reference; quickstart links API reference and OpenAPI 3.1 noted.
  ```

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

  ```text
  Hosted MCP at mcp.shippo.com documented with OAuth, transport, tools, and client setup.
  ```

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

  ```text
  No dedicated CLI install path documented; SDKs and npx MCP bridge only.
  ```

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

  ```text
  PyPI shippo and npm shippo registry lookups both returned HTTP 200.
  ```

- **Pass** — Agent skills are published

  ```text
  Agent skills and knowledge pack published at github.com/goshippo/ai, downloadable from MCP page.
  ```



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