Verify contractor licenses, monitor subcontractor credentials, and track insurance compliance across all 50 states — checked against government records nightly.
Start making API calls in under a minute. Sign up, grab your key, and query any contractor license in the country.
Sign up at tradeproof.net/signup. Free tier includes 25 lookups/month.
Go to Settings → API Keys in the app. Your key starts with tp_ and is shown once at creation.
Send a GET request with your key in the X-API-Key header.
# Look up a California contractor license curl -X GET "https://tradeproof.net/v1/licenses/CA/1234567" \ -H "X-API-Key: tp_your_api_key_here"
import requests API_KEY = "tp_your_api_key_here" BASE_URL = "https://tradeproof.net" response = requests.get( f"{BASE_URL}/v1/licenses/CA/1234567", headers={"X-API-Key": API_KEY}, ) data = response.json() print(data["business_name"], data["status"])
const API_KEY = "tp_your_api_key_here"; const BASE_URL = "https://tradeproof.net"; const response = await fetch( `${BASE_URL}/v1/licenses/CA/1234567`, { headers: { "X-API-Key": API_KEY } } ); const data = await response.json(); console.log(data.business_name, data.status);
{
"license_number": "1234567",
"state": "CA",
"business_name": "Acme Construction Inc.",
"dba_name": "Acme Builders",
"status": "CLEAR",
"license_type": "General Building",
"classifications": ["B", "C-10"],
"issue_date": "2018-03-15",
"expiration_date": "2026-03-15",
"city": "Los Angeles",
"state_code": "CA",
"zip_code": "90001",
"entity_type": "Corporation",
"bond_amount": 25000,
"workers_comp": true,
"has_disciplinary_action": false,
"last_updated": "2026-03-10T03:00:00Z"
}
All API endpoints require authentication except /health,
/v1/stats, and /v1/coverage.
TradeProof supports two authentication methods:
| Method | Header | Format | Best For |
|---|---|---|---|
| API Key | X-API-Key |
tp_abc123... |
Server-to-server integrations, scripts, CI/CD pipelines |
| JWT Bearer | Authorization |
Bearer eyJ... |
Browser apps, user sessions (obtained via POST /v1/auth/login) |
Control what each API key can access with granular scopes. Professional tier and above can assign custom scopes per key.
| Scope | Grants Access To |
|---|---|
| license:read | License lookups and search (GET /v1/licenses/*) |
| license:batch | Batch verification (POST /v1/verify/batch) |
| watchlist:read | View monitored licenses (GET /v1/watchlist/*) |
| watchlist:write | Add/remove monitored licenses (POST/DELETE /v1/watchlist/*) |
| insurance:read | View insurance certificates (GET /v1/insurance/*) |
| insurance:write | Manage insurance records (POST/PUT /v1/insurance/*) |
| webhook:manage | Create and manage webhooks (/v1/webhooks/*) |
| report:generate | Generate compliance reports (/v1/reports/*) |
| * | Full access (all scopes). Default for Free and Starter tiers. |
Business and Enterprise tiers can restrict API key access to specific IP addresses or CIDR ranges. Configure at the org level (Business: up to 20 IPs) or per-key level (Enterprise: up to 100 IPs).
The base URL for all API calls is https://tradeproof.net.
All responses are JSON. Timestamps are in UTC (ISO 8601).
/v1/licenses/{state}/{license_number}Look up a specific contractor license by state code and license number.
state requiredCA, OH, TX)license_number required
Scope: license:read
Returns: LicenseResponse
/v1/licensesSearch licenses with filters. Returns paginated results.
state optionalCA)license_number optionalbusiness_name optionalcity optionalclassification optionalB, C-10)status optionalCLEAR, Expired)page / per_page optionalScope: license:read
/v1/verify/batchVerify up to 100 licenses in a single request. Returns pass/fail status for each.
licenses array of {state, license_number} objects (max 100).Scope: license:batch
curl -X POST "https://tradeproof.net/v1/verify/batch" \ -H "X-API-Key: tp_your_api_key_here" \ -H "Content-Type: application/json" \ -d '{ "licenses": [ {"state": "CA", "license_number": "1234567"}, {"state": "OH", "license_number": "2023009241"}, {"state": "TX", "license_number": "9876543"} ] }'
[
{
"license_number": "1234567",
"state": "CA",
"valid": true,
"status": "CLEAR",
"business_name": "Acme Construction Inc.",
"expiration_date": "2026-03-15"
},
{
"license_number": "2023009241",
"state": "OH",
"valid": true,
"status": "ACTIVE",
"business_name": "Buckeye Builders LLC",
"expiration_date": "2027-01-31"
},
{
"license_number": "9876543",
"state": "TX",
"valid": false,
"status": "NOT_FOUND",
"business_name": null,
"expiration_date": null
}
]
Add licenses to your watchlist for continuous monitoring. TradeProof checks every monitored license nightly against state records and alerts you when status changes or expirations approach.
/v1/watchlistAdd a license to your organization's watchlist.
Scope: watchlist:write Limit: Based on tier (Free: 5, Starter: 50, Professional: 200, Business: 500)
/v1/watchlist/bulkAdd multiple licenses to your watchlist in a single request. Skips duplicates.
Scope: watchlist:write
/v1/watchlistList all monitored licenses, enriched with current license details. Paginated.
Scope: watchlist:read
/v1/watchlist/summaryGet a traffic-light summary: counts of green (active), yellow (expiring soon), and red (expired/suspended) licenses.
Scope: watchlist:read
/v1/watchlist/{item_id}Update a watchlist item (label, alert preferences).
Scope: watchlist:write
/v1/watchlist/{item_id}Remove a license from your watchlist.
Scope: watchlist:write
/v1/alertsList recent status changes detected for licenses on your watchlist. Paginated, newest first.
Auth: JWT Bearer
Params: page, per_page (max 100)
/v1/statsGet database statistics: total records, states covered, last data update timestamp.
/v1/coverageList all supported states with license and workers' comp lookup availability.
/healthLiveness check. Returns {"status": "ok"}. Bypasses all middleware.
Subscribe to events and receive HMAC-signed HTTP callbacks when license statuses change, expirations approach, or insurance certificates lapse. Available on Professional tier and above (max 5 webhooks per org).
license.status_changed
A monitored license status changed (e.g., CLEAR → Expired)
license.expiry_warning
A monitored license expires within 30 or 60 days
license.suspended
A monitored license was suspended or revoked
insurance.compliance_alert
Insurance coverage gap detected for a subcontractor
insurance.certificate_expired
An insurance certificate on file has expired
compliance.request_submitted
A compliance request was submitted by a GC
support.ticket_created
A new support ticket was opened
ping
Test event — verify your endpoint works
/v1/webhooksRegister a new webhook URL. You'll receive a signing secret in the response — store it securely.
Scope: webhook:manage Tier: Professional+
/v1/webhooksList your registered webhooks (secrets are masked).
/v1/webhooks/{webhook_id}Delete a webhook.
/v1/webhooks/{webhook_id}/deliveriesView delivery history for a webhook (last 100 deliveries with status codes and timestamps).
/v1/webhooks/{webhook_id}/testSend a test ping event to verify your endpoint.
Every webhook delivery includes an HMAC-SHA256 signature in the
X-TradeProof-Signature header. Always verify this
before processing the payload.
import hmac, hashlib def verify_webhook(payload_bytes, signature, secret): expected = hmac.new( secret.encode(), payload_bytes, hashlib.sha256 ).hexdigest() return hmac.compare_digest(expected, signature)
const crypto = require("crypto"); function verifyWebhook(body, signature, secret) { const expected = crypto .createHmac("sha256", secret) .update(body) .digest("hex"); return crypto.timingSafeEqual( Buffer.from(expected), Buffer.from(signature) ); }
Rate limits are enforced per API key using a token-bucket algorithm. Check the response headers to monitor your usage.
| Header | Description |
|---|---|
X-RateLimit-Limit | Your tier's requests-per-minute limit |
X-RateLimit-Remaining | Requests remaining in current window |
X-RateLimit-Reset | Unix timestamp when the window resets |
Retry-After | Seconds to wait (only on 429 responses) |
| Tier | Requests/Min | Monthly Lookups | Monitored Licenses | Webhooks |
|---|---|---|---|---|
| Free | 10 | 25 | 5 | — |
| Starter ($149/mo) | 30 | 250 | 50 | — |
| Professional ($399/mo) | 60 | 2,500 | 200 | 5 |
| Business ($899/mo) | 120 | 10,000 | 500 | 5 |
| Developer ($99/mo) | 60 | 1,000 | — | — |
| Developer Scale ($349/mo) | 120 | 10,000 | — | 5 |
| Enterprise | 300 | Custom | Unlimited | Unlimited |
429 Too Many Requests with a JSON error body and Retry-After header.
Implement exponential backoff in your client.
TradeProof uses standard HTTP status codes. Errors return a JSON object
with a detail field describing the issue.
| Code | Meaning | Example |
|---|---|---|
| 200 | Success | Request completed successfully |
| 201 | Created | Resource created (watchlist item, webhook, API key) |
| 400 | Bad Request | {"detail": "Maximum 5 active API keys per organization"} |
| 401 | Unauthorized | Missing or invalid API key / JWT token |
| 403 | Forbidden | {"detail": "Your starter plan allows 50 monitored licenses. Upgrade for more."} |
| 404 | Not Found | {"detail": "License 0000000 not found in CA"} |
| 409 | Conflict | {"detail": "License already on your watchlist"} |
| 429 | Rate Limited | {"error": {"code": "rate_limit_exceeded", "retry_after": 7}} |
| 503 | Service Unavailable | Database temporarily unavailable. Includes Retry-After header. |
Manage API keys programmatically. Keys start with tp_ and are shown
in full only once at creation — they are stored as irreversible SHA-256 hashes.
/v1/account/api-keysCreate a new API key. Returns the full key once. Max 5 active keys per org.
name requiredscopes optional["*"]). Professional+ can set custom scopes./v1/account/api-keysList all API keys for your organization. Keys are masked (first 8 chars + ****).
/v1/account/api-keys/{key_id}/scopesUpdate scopes on an existing key. Professional tier and above only.
/v1/account/api-keys/{key_id}Revoke an API key immediately. This cannot be undone.
TradeProof offers dedicated API plans for developers and platforms that want to integrate license verification into their own products.
All plans include access to the full 50-state database. Annual billing saves ~15%. Need higher limits? Contact us.
Explore every endpoint, try requests, and see response schemas. Powered by the auto-generated OpenAPI 3.1 specification.