An agent-first CLI for the Shovels API. One binary, JSON output, zero interactivity. Built for AI agents, scripts, and pipelines.
$ curl -LsSf https://shovels.ai/install.sh | sh
Installed shovels to ~/.shovels/bin/shovels
# How many solar permits in 92024 (Encinitas, CA) last year?
$ shovels permits search --geo-id 92024 \
--permit-from 2024-01-01 --permit-to 2024-12-31 \
--tags solar --include-count --limit 1 \
| jq '.meta.total_count.value'
581
curl -LsSf https://shovels.ai/install.sh | sh
Shovels is SOC 2® Type II certified
Shovels meets enterprise security and compliance requirements. Our SOC 2 Type II certification reflects controls independently audited over a sustained period, not just a point-in-time snapshot.
01
No SDKs, no dependencies, no config files. Download one file and query permits, contractors, and addresses in seconds.
--limit all handles cursors, page sizes, and rate-limit retries
$ shovels permits search \
--geo-id 33139 \ # Miami Beach, FL
--permit-from 2024-01-01 \
--permit-to 2024-12-31 \
--tags roofing --include-count \
--limit 1 | jq '.meta.total_count.value'
490
02
Claude Code, Codex, Cursor, or your own agents shell out to shovels and get structured data back. No MCP headaches, no context bloat, no credential juggling.
stdout, always; errors to stderr
--help text written for LLMs: specific, example-rich, jargon-free
# Your AI agent runs this:
$ shovels permits search --help
...
# Reads the help, builds the query:
$ shovels permits search \
--geo-id 94110 \ # San Francisco, CA
--permit-from 2024-06-01 \
--tags roofing \
--property-type residential \
--limit 20
# Parses the JSON, reasons about the results...
03
JSON output composes with jq, cron, and everything else in your stack. Build workflows that would take weeks in a GUI.
geo_ids mid-pipeline
$ shovels contractors search --geo-id CA \
--permit-from 2024-01-01 --permit-to 2024-12-31 \
--tags solar --limit all \
| jq -r '.data[] | [.name, .phone, .permit_count] | @csv' \
> solar_contractors_ca.csv
04
The CLI handles the operational plumbing, so jobs run unattended and your agent always knows the cost.
--limit all manages cursors, page sizes, and the 100K-record ceiling
Retry-After
credits_used and credits_remaining
Pagination handled
--limit all manages cursors, page sizes, and the 100K-record ceiling
Auto-retry on rate limits
Backoff + jitter; respects Retry-After
Credit tracking
Every response reports credits_used and credits_remaining
$ shovels permits search --geo-id 33139 \
--permit-from 2024-01-01 --permit-to 2024-12-31 \
--tags roofing --include-count --limit 1 \
| jq '.meta.total_count.value'
490
shovels permits search --geo-id 33139 --permit-from 2024-01-01 --permit-to 2024-12-31 --tags roofing --include-count --limit 1 | jq '.meta.total_count.value'$ shovels contractors permits 03xTGkafsf \ # Cosmic Solar Inc.
--limit all | jq '.data | length'
2056
shovels contractors permits 03xTGkafsf --limit all | jq '.data | length'$ shovels contractors search --geo-id 78701 \ # Austin, TX
--tags electrical --limit 100 \
| jq -r '.data[] | [.name, .permit_count] | @csv'
"KENNETH TUMLINSON",554
"JOSEPH H MARTINEZ",85
...
shovels contractors search --geo-id 78701 --tags electrical --limit 100 | jq -r '.data[] | [.name, .permit_count] | @csv'$ shovels addresses search \
-q "1600 Pennsylvania Ave" \
| jq '.data[0] | {name, geo_id}'
{
"name": "1600 Pennsylvania Ave Nw, Washington, DC",
"geo_id": "Kw5MGExoU6Y"
}
shovels addresses search -q "1600 Pennsylvania Ave" | jq '.data[0] | {name, geo_id}'✕ With curl — 15+ lines, manual pagination
cursor=""
while true; do
resp=$(curl -s -H "X-API-Key: $KEY" \
"https://api.shovels.ai/v2/permits/search\
?geo_id=92024&permit_from=2024-01-01\
&permit_to=2024-12-31&cursor=$cursor")
echo "$resp" | jq '.items[]'
cursor=$(echo "$resp" | jq -r '.next_cursor')
[ "$cursor" = "null" ] && break
done
✓ With shovels — one command, all records
shovels permits search \
--geo-id 92024 \
--permit-from 2024-01-01 \
--permit-to 2024-12-31 \
--limit all
The CLI handles auth headers, cursor pagination, rate-limit retries, and credit tracking. Just say how many records you want.
Building an application?
The CLI is built on the Shovels API. For full REST access and integration into your product, use our API directly.
One line, checksum-verified, no runtime to install.
$ curl -LsSf https://shovels.ai/install.sh | sh
Installed shovels (sha256 verified)
curl -LsSf https://shovels.ai/install.sh | shGrab a key from your Shovels account dashboard.
$ export SHOVELS_API_KEY=your-key
export SHOVELS_API_KEY=your-keyJSON results, instantly.
$ shovels permits search --geo-id 92024 \
--permit-from 2025-01-01
{ "meta": { "count": 138 }, ... }
shovels permits search --geo-id 92024 --permit-from 2025-01-01The Shovels CLI is a command-line interface for the Shovels construction data API. It's a single open-source binary that lets you query building permits, contractors, and addresses directly from your terminal, returning clean JSON every time. It was designed from the ground up for AI agents, scripts, and data pipelines.
The CLI runs on macOS, Linux, and Windows. The install script downloads the binary from GitHub Releases and verifies its SHA256 checksum before anything touches your system, so you always know exactly what you're installing.
AI agents like Claude Code, Codex, and Cursor simply shell out to the shovels command. They read the LLM-friendly --help text to construct the right command, parse the JSON that comes back on stdout, and branch on meaningful exit codes. There's no MCP server to configure and no credential juggling involved.
The CLI authenticates with your Shovels API key and draws from the same credit balance as the API. Every response includes credits_used and credits_remaining fields, so you—or your agent—always know exactly what a query cost and how much you have left.
Yes, the CLI is fully open source under the MIT license. It's written in Go using the Cobra framework, and the complete source code is available on GitHub—we welcome issues, feedback, and contributions.
They share the same data and the same credits, so the difference comes down to ergonomics. The CLI handles auth headers, cursor pagination, rate-limit retries, and credit tracking for you, which makes it ideal for terminal work and AI agents. If you're building Shovels data into an application, the API gives you direct REST access.
Install the CLI, set your API key, and run your first query.