Submit URL-checking jobs over JSON, poll for completion, fetch paginated results. Standard bearer-token auth, OpenAPI spec published, five endpoints. Same backend as the web UI and the MCP integration.
Every request must carry an Authorization: Bearer uck_live_YOUR_KEY header. Generate a key from the dashboard , we show the plaintext value once, then store only an irreversible hash. Lose it and you regenerate, no recovery.
1# pip install bulkurlchecker2from bulkurlchecker import Client34client = Client(api_key="uck_live_YOUR_KEY")5results = client.check_urls([6 "https://example.com",7 "https://example.org",8])910for r in results.results:11 print(r.status_code, r.url, "BROKEN" if r.is_broken else "ok")1213# Broken-link convenience accessor:14broken = results.broken # list of URLResult where is_broken == True
| Method | Path | Description |
|---|---|---|
| POST | /api/v2/jobs | Submit URLs. Returns job_id. Idempotency-Key supported. |
| GET | /api/v2/jobs/{id} | Status + progress. |
| GET | /api/v2/jobs/{id}/results | Paginated results (limit/offset or cursor). |
| DELETE | /api/v2/jobs/{id} | Cancel + refund unchecked credits. |
| GET | /api/v2/usage | Current credit balance. |
| POST | /api/v2/webhooks/endpoints | Register an outbound webhook URL. |
| GET | /api/v2/webhooks/endpoints | List your webhook endpoints. |
| DELETE | /api/v2/webhooks/endpoints/{id} | Revoke a webhook endpoint. |
/api/v2/jobsSubmit URLs. Returns job_id. Idempotency-Key supported.
/api/v2/jobs/{id}Status + progress.
/api/v2/jobs/{id}/resultsPaginated results (limit/offset or cursor).
/api/v2/jobs/{id}Cancel + refund unchecked credits.
/api/v2/usageCurrent credit balance.
/api/v2/webhooks/endpointsRegister an outbound webhook URL.
/api/v2/webhooks/endpointsList your webhook endpoints.
/api/v2/webhooks/endpoints/{id}Revoke a webhook endpoint.
Full request/response schemas, error codes, and examples are in the OpenAPI spec. Drop it into Postman, Stoplight, or the SDK generator of your choice.
GET /api/v2/jobs/{id}/results supports two modes. Offset/limit is the default (?limit=100&offset=200): simple but page contents shift if results land mid-export. Cursor is stable under concurrent writes (recommended for full exports of big jobs): pass ?cursor= from a previous response's next_cursor field. next_cursor: null means the last page.
limit + offset. Use when you only need the first page or a fixed window.iter_results() / iterResults() use cursor mode under the hood.Send an Idempotency-Key header on POST /api/v2/jobs to make retries safe. Generate one UUIDv4 per logical request and reuse it on retries. If the network fails mid-call and you retry with the same key within 24 hours, you get back the original response without creating a duplicate job.
job_id, same credits allocated).409 Conflict with error.code = "idempotency_key_mismatch". Use a new key for a new request.Register an HTTPS endpoint and we POST job-completion events to it as they happen. No polling, no cron. Sign-verified with HMAC-SHA256 so you can trust the body without an extra fetch.
POST /api/v2/webhooks/endpoints. The signing secret is returned once. Store it somewhere safe; rotating means deleting + recreating.job.completed (more coming). Empty subscription list = all events.Bulkurlchecker-Signature: t=<ts>,v1=<hex> where hex = HMAC-SHA256(secret, "<ts>.<raw_body>"). Stripe-compatible format. Verify with bulkurlchecker.verify_signature() (Python) or verifySignature() (Node). Both ship in the SDKs.Bulkurlchecker-Event-Id, Bulkurlchecker-Event-Type, and Bulkurlchecker-Delivery-Id. Dedupe on Event-Id if you care about exactly-once semantics.429 with a Retry-After header plus X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset (unix epoch). Back off and retry.One credit per URL checked. New accounts get a free tier on signup; additional credits are pay-as-you-go through billing. Cancelling a job mid-run refunds unchecked credits. The REST API and the MCP integration share the same balance, no separate quota.
We use analytics cookies to improve your experience. Opt out anytime in Cookie Settings. Privacy Policy