Documentation

OfferUp CLI

offerup-pp-cli

Install

npx -y @mvanhorn/printing-press-library install offerup

Installs the CLI binary and the agent skill for Claude Code, Codex, Cursor, Gemini CLI, Copilot, and more. Add --cli-only or --skill-only for one half. Requires Node.

Documentation

Search local OfferUp listings from your terminal, keep them in a local database, and spot underpriced deals before anyone else — no login and no paid key for the things that matter most.

OfferUp's web scrapers all dump a one-shot listing array and forget it. This CLI persists every listing in a local SQLite store, then layers on price intelligence no marketplace tool offers: price-check tells you the going rate in your area, deals flags listings below the local median, new-since and price-drops track saved searches over time, and seller-scan profiles a seller's whole inventory. Built for agents too — every command speaks --json, --select, and an MCP surface.

Learn more at OfferUp.

Created by @tmchow (Trevin Chow).

Authentication

Public commands need no login: search, item detail (listings get), seller lookup, category-scoped browse, and every price-intelligence command (price-check, deals, new-since, price-drops, digest, seller-scan). Set location with --zip (or --lat/--lon), not a credential. Account commands act on your own OfferUp account and require login: account (your profile), my-listings (plus archived, mark-sold, archive), saved, and messages (plus messages read). Auth is your OfferUp web session cookie. Capture it once with auth login --chrome, which extracts the cookie straight from your logged-in browser — no extra install needed. The optional press-auth companion adds a smoother one-click controlled-Chrome capture and encrypts the session at rest, but it is not required. You can also paste the cookie via the OFFERUP_COOKIE environment variable or auth set-token. Check with auth status, clear with auth logout. The mutating commands my-listings mark-sold and my-listings archive preview by default and apply only with --confirm. Creating a new listing is not supported — OfferUp's web app posts Jobs only, so listing creation is mobile-app-only.

Quick Start

# Health check — confirms the CLI can reach OfferUp; needs no auth.
offerup-pp-cli doctor --dry-run

# Search live listings near a ZIP with no login.
offerup-pp-cli listings search "dewalt drill" --zip 98101 --limit 20

# See the local going rate; this fetches and stores listings itself, no separate sync needed.
offerup-pp-cli price-check "dewalt drill" --zip 98101

# Flag listings at least 25% under the local median.
offerup-pp-cli deals "dewalt drill" --zip 98101 --below 25

Known Gaps

  • Cross-run intelligence is empty on the first run. price-drops, new-since, and digest compare each search against the listing history stored locally for that query, so the first run for a new query returns no drops or new items — by design. Run the same query again later (the commands re-fetch and re-record on every run) and the second run onward will show changes within the --since window.
  • seller-scan reads only locally-known inventory. OfferUp has no public endpoint that lists a seller's full catalog, so seller-scan <seller-id> returns an empty inventory until you run offerup-pp-cli listings get <listing-id> on that seller's items. The inventory grows as you fetch more of their listings.
  • Posting a new listing is not supported. OfferUp's web app only allows posting Jobs; creating a marketplace listing is mobile-app-only, so there is no listing create. The CLI covers managing existing listings (mark-sold, archive), not creating them.
  • Account commands need a captured OfferUp session. account / my-listings / saved / messages require login — run auth login --chrome (extracts the cookie from your browser, no extra install), set OFFERUP_COOKIE, or auth set-token. The optional press-auth companion gives a one-click capture but is not required. The public commands need none of this.

Unique Features

These capabilities aren't available in any other tool for this API.

Local price intelligence

  • price-check — See the real going rate for an item in your area — median, 25th/75th percentile, min, max, and the firm-vs-negotiable split — computed across every listing you've pulled.

    Reach for this before buying or pricing a resale — it answers "what is this actually worth here" with a number instead of a scroll.

    offerup-pp-cli price-check "herman miller aeron" --zip 85001 --agent
    
  • deals — Surface listings priced a chosen percentage below the local median for that item — the underpriced finds, ranked by how far under they are.

    The deal-sniping command: it tells an agent which listings are underpriced right now, not just what exists.

    offerup-pp-cli deals "dewalt drill" --zip 98101 --below 25 --agent
    
  • price-drops — Detect listings whose price fell between syncs — the same item, now cheaper — sorted by the size of the drop.

    Catches sellers who just cut a price on something you're tracking — the moment to make an offer.

    offerup-pp-cli price-drops "macbook pro" --since 7d --agent
    

Track saved searches

  • new-since — Show only the listings that appeared since a cutoff for a saved search, so you never re-scan items you already saw.

    Use this for a recurring watch — it answers "what dropped since I last looked" in one call.

    offerup-pp-cli new-since "road bike" --since 24h --agent
    
  • digest — A single composite report for a saved search combining what's new, what dropped in price, and what's underpriced.

    The morning-ritual command and the natural single MCP tool call for an agent watching a market.

    offerup-pp-cli digest "snowboard" --since 24h --agent
    

Seller intelligence

  • seller-scan — Pull a seller's full synced inventory alongside their reputation badges (business/dealer/TruYou), join date, and the median asking price across their listings.

    Vet a dealer before buying to flip, or watch a high-volume seller's pricing in one view.

    offerup-pp-cli seller-scan 161842229 --agent
    

Recipes

Narrow a verbose search for an agent

offerup-pp-cli listings search "macbook pro" --zip 98101 --agent --select listingId,title,price,locationName,conditionText

Listing payloads are wide; --agent with --select returns only the fields an agent needs, saving context.

Find this week's underpriced finds

offerup-pp-cli deals "aeron chair" --zip 85001 --below 30 --agent

Lists Aeron chairs priced at least 30% below the local median around Phoenix.

offerup-pp-cli digest "road bike" --since 24h --agent

One call returns what's new, what dropped in price, and what's a deal for road bikes since yesterday.

Vet a seller before buying to flip

offerup-pp-cli seller-scan 161842229 --agent

Shows the seller's badges, join date, full inventory, and median asking price in one view.

Usage

Run offerup-pp-cli --help for the full command reference and flag list.

Commands

listings

Search and view OfferUp listings (public, no login)

  • offerup-pp-cli listings get - Get the full detail for one listing
  • offerup-pp-cli listings search - Search live OfferUp listings by keyword and location

Output Formats

# Human-readable table (default in terminal, JSON when piped)
offerup-pp-cli listings get mock-value

# JSON for scripting and agents
offerup-pp-cli listings get mock-value --json

# Filter to specific fields
offerup-pp-cli listings get mock-value --json --select id,name,status

# Dry run — show the request without sending
offerup-pp-cli listings get mock-value --dry-run

# Agent mode — JSON + compact + no prompts in one flag
offerup-pp-cli listings get mock-value --agent

Agent Usage

This CLI is designed for AI agent consumption:

  • Non-interactive - never prompts, every input is a flag
  • Pipeable - --json output to stdout, errors to stderr
  • Filterable - --select id,name returns only fields you need
  • Previewable - --dry-run shows the request without sending
  • Read-only by default - this CLI does not create, update, delete, publish, send, or mutate remote resources
  • Offline-friendly - sync/search commands can use the local SQLite store when available
  • Agent-safe by default - no colors or formatting unless --human-friendly is set

Exit codes: 0 success, 2 usage error, 3 not found, 5 API error, 7 rate limited, 10 config error.

Health Check

offerup-pp-cli doctor

Verifies configuration and connectivity to the API.

Configuration

Config file: ~/.config/offerup-pp-cli/config.toml

Static request headers can be configured under headers; per-command header overrides take precedence.

Troubleshooting

Not found errors (exit code 3)

  • Check the resource ID is correct
  • Run the list command to see available items

API-specific

  • Empty results for a common item — Widen the area with a larger --radius or a different --zip, or drop extra keywords from the query.
  • Requests slow down or start failing in bursts — OfferUp throttles rapid requests; lower --limit/--max-pages and let the built-in pacing back off — the CLI rate-limits per request.
  • Results are for the wrong city — Location defaults to IP geo; pass --zip (or --lat/--lon) explicitly to scope to your area.
  • price-check or deals returns nothing — Run sync for that query first — the price commands read the local store, not the live feed.

HTTP Transport

This CLI uses Chrome-compatible HTTP transport for browser-facing endpoints. It does not require a resident browser process for normal API calls.


Sources & Inspiration

This CLI was built by studying these projects and resources:

Generated by CLI Printing Press

For agents: pass /documentation/offerup/agents.md to install this CLI from a prompt.