2,500 free credits — no credit card required. Start building
One base URL, one header, 16 endpoints. Reads are GETs, the few actions are POSTs, and everything answers in the same shape.
base url · https://sensecollect.com
Create a key in the dashboard, then send it as x-api-key. Nothing else is required — no SDK, no OAuth, no per-source credentials.
curl "https://sensecollect.com/v1/maps/search?query=dentists&location=Berlin&limit=25" \ -H "x-api-key: $SENSECOLLECT_KEY"Keys look like sc_live_… and are shown once at creation. Send them in the x-api-key header, or as a bearer token if that fits your client better. Revoking a key in the dashboard takes effect on the next call.
x-api-key: sc_live_YOUR_KEYAuthorization: Bearer sc_live_YOUR_KEYEvery data endpoint answers with the same envelope, and every item in data uses the same record shape regardless of source. Fields a source cannot fill come back empty rather than missing, so your parser never branches on source.
{ "success": true, "request_id": "req_9f2a…", "status": "completed", "source": "google_maps", "endpoint": "/v1/maps/search", "job_id": "6c1f…", "credits_used": 400, "credits_remaining": 9600, "count": 50, "data": [ … ]}{ "id": "ChIJ0xT4…", "type": "place" | "review" | "post", "source": "google_maps" | "amazon_reviews" | "tiktok", "title": "Mitte Dental Studio", "url": "https://maps.google.com/…", "content": "Dentist", "published_at": "2026-05-02T09:14:00.000Z" | null, "author": { "name": "", "handle": "", "url": "" }, "contact": { "phone": "", "email": "", "website": "" }, "location": { "address": "" }, "metrics": { "rating": 4.6, "reviews": 42 }, "raw": { … original source fields … }}The same catalog is available as JSON at GET /v1/sources, with no key required.
Every business a map search returns for a niche and place, enriched with the phone, email, and website you need to actually reach them. This is the source most SenseCollect accounts are here for.
/v1/maps/search17 credits per rowBusinesses matching a query and location, with phone, email, website, rating, and review count.
querystringrequiredlocationstringlimitintegerenrichbooleanverifybooleanpersonal_onlybooleanskip_claimedbooleanhttps://sensecollect.com/v1/maps/search?query=dentists&location=Berlin&limit=50&verify=true
/v1/maps/no-website19 credits per rowThe same search, pre-filtered to businesses with no website on file — the standard web-design lead list. The filter runs at the source, so businesses that have a website are never collected and never charged for.
querystringrequiredlocationstringlimitintegerverifybooleanhttps://sensecollect.com/v1/maps/no-website?query=restaurants&location=Hamburg
Reviews for any public ASIN as flat records — rating, text, date, reviewer — ready for sentiment work or objection mining.
/v1/amazon/reviews7 credits per rowReviews for one or more ASINs in the unified record shape.
asinstringrequiredlimitintegerhttps://sensecollect.com/v1/amazon/reviews?asin=B09G9FPHY6&limit=25
/v1/amazon/complaints7 credits per rowThe same run, filtered server-side to 1- and 2-star reviews so you get the complaints without paging the rest.
asinstringrequiredlimitintegerhttps://sensecollect.com/v1/amazon/complaints?asin=B09G9FPHY6
Posts for a hashtag or topic with creator, caption, and engagement counts — the raw material for trend and creator research.
/v1/tiktok/hashtag10 credits per rowPosts for one or more hashtags, with plays, likes, comments, and shares.
hashtagstringrequiredlimitintegerhttps://sensecollect.com/v1/tiktok/hashtag?hashtag=fitnesscoach&limit=100
/v1/tiktok/search10 credits per rowGive it a plain-language topic; SenseCollect resolves the hashtags and returns the posts.
querystringrequiredlimitintegerhttps://sensecollect.com/v1/tiktok/search?query=ai%20fitness%20coaches
A watch re-runs one search on a cadence and reports only what moved — new businesses, a site that disappeared, a rating that dropped. Being first to a trigger is worth more than the row, so watch runs cost no credits; you pay only when you pull the leads behind them.
/v1/watchesfreeEvery watch on the account, with its cadence and last run.
https://sensecollect.com/v1/watches
/v1/watches/createfreeStart watching a niche and city. The first run records a baseline; changes are reported from the second run onward.
querystringrequiredlocationstringcadence_hoursintegerhttps://sensecollect.com/v1/watches/create?query=dentists&location=Berlin
/v1/watches/changesfreeChanges detected across your watches: added, removed, website_added, website_removed, rating_dropped.
watch_idstringsincestringlimitintegerhttps://sensecollect.com/v1/watches/changes?since=2026-07-01T00:00:00Z
/v1/watches/deletefreeStops the watch and drops its history.
watch_idstringrequiredhttps://sensecollect.com/v1/watches/delete?watch_id=6c1f…
Claim a lead and it disappears from future searches on the account — not filtered out after you have paid for it, but excluded before it is charged.
/v1/leads/claimfreeMark records as yours. Future searches skip them, and they are never charged again.
record_keystringrequirednotestringhttps://sensecollect.com/v1/leads/claim?record_key=ChIJ0xT4…
/v1/leads/claimedfreeEverything currently suppressed on the account.
limitintegerhttps://sensecollect.com/v1/leads/claimed
/v1/leads/releasefreePuts records back into circulation for this account.
record_keystringrequiredhttps://sensecollect.com/v1/leads/release?record_key=ChIJ0xT4…
Balance, catalog, and job polling. These never cost credits, so you can wire up monitoring without paying for it.
/v1/accountfreeRemaining credits and the email the key belongs to.
https://sensecollect.com/v1/account
/v1/sourcesfreeMachine-readable list of every source, endpoint, parameter, and price.
https://sensecollect.com/v1/sources
/v1/jobs/{id}freeFetch a run started with async=true, or one that outlived the synchronous request budget.
idstringrequiredhttps://sensecollect.com/v1/jobs/6c1f…
A listing is not a lead. Add verify=true to a Maps search and every address is checked for syntax, a disposable domain, and a live mail server before the row comes back. Rows without a deliverable contact are dropped — and they are not charged for. A pull where nothing verifies costs nothing at all.
Add personal_only=true to drop shared inboxes like info@ and keep only addresses that reach a named person. Verified rows cost 45 credits each and carry a verification block explaining the verdict.
curl "https://sensecollect.com/v1/maps/search?query=dentists&location=Berlin&limit=50&verify=true&personal_only=true" \ -H "x-api-key: $SENSECOLLECT_KEY"{ "verified": true, "rows_collected": 50, "rows_billable": 31, "credits_used": 1395, "data": [ { "title": "Mitte Dental Studio", "contact": { "email": "m.schneider@mitte-dental.de", … }, "verification": { "status": "deliverable", "kind": "personal", "billable": true } } ]}A watch re-runs one search on a cadence and tells you only what moved: a business that appeared, one whose website went away, one whose rating slipped. Being first to a trigger is the whole point, so watches and their change feed are free — you pay when you pull the leads behind them.
The first run records a baseline rather than reporting every existing business as new. Changes appear from the second run onward.
curl -X POST "https://sensecollect.com/v1/watches/create?query=restaurants&location=Hamburg&cadence_hours=24" \ -H "x-api-key: $SENSECOLLECT_KEY"curl "https://sensecollect.com/v1/watches/changes?since=2026-07-01T00:00:00Z" \ -H "x-api-key: $SENSECOLLECT_KEY"# types: added · removed · website_added · website_removed · rating_droppedClaim a lead once you have worked it and it drops out of later searches on the account — excluded before it is charged, not filtered out after you have paid for it. Two campaigns on the same account will not contact the same business, and you never buy the same row twice.
curl -X POST "https://sensecollect.com/v1/leads/claim?record_key=ChIJ0xT4…¬e=sent%20to%20client" \ -H "x-api-key: $SENSECOLLECT_KEY"# Suppression is on by default. To see claimed leads anyway:GET /v1/maps/search?query=dentists&location=Berlin&skip_claimed=falseEvery data endpoint is also an MCP tool at /v1/mcp, so an agent can call the sources directly with no glue code. It is the same key, the same pricing, and the same records — the MCP server dispatches to the same handlers as the HTTP API. Point any MCP client at it:
{ "mcpServers": { "sensecollect": { "type": "http", "url": "https://sensecollect.com/v1/mcp", "headers": { "x-api-key": "sc_live_YOUR_KEY" } } }}The handshake and tools/list answer without a key, so you can wire a client up and inspect the tools before pasting one in. Tool calls need the key. Because billing is per row, an agent that searches and finds nothing is charged nothing — and account_balance is free to call, so a long-running agent can watch its own budget.
maps_search places matching a query and locationmaps_no_website the same search, only businesses with no siteamazon_reviews reviews for one or more ASINsamazon_complaints the same run, 1- and 2-star onlytiktok_hashtag posts for one or more hashtagstiktok_search posts for a plain-language topicaccount_balance remaining credits (free)get_job poll a run that returned a job id (free)create_watch monitor a niche and city (free)watch_changes what moved since you last looked (free)list_watches watches on the account (free)delete_watch stop a watch (free)claim_leads mark leads worked, so they never return (free)list_claimed_leads everything currently suppressed (free)release_leads put claimed leads back in circulation (free)Collection happens against the live source, so a large pull can take longer than one HTTP request. Pass async=true to get a job id immediately, then poll /v1/jobs/{id}. A synchronous call that outlives its request budget returns the same 202 body, so a single code path handles both.
curl "https://sensecollect.com/v1/tiktok/hashtag?hashtag=fyp&limit=500&async=true" \ -H "x-api-key: $SENSECOLLECT_KEY"{ "success": true, "status": "running", "job_id": "6c1f…", "poll_url": "/v1/jobs/6c1f…", "credits_used": 15}Errors keep the envelope and add a machine-readable code. When a run fails upstream, the credits are already back on your account by the time you read the response.
| code | status | meaning |
|---|---|---|
| missing_api_key | 401 | No key on the request. |
| invalid_api_key | 401 | Unknown or revoked key. |
| invalid_request | 400 | A required parameter is missing or unusable. |
| insufficient_credits | 402 | The call costs more than the account has left. |
| not_found | 404 | No such run on this account. |
| upstream_failed | 502 | The source run failed. Credits refunded. |
| internal_error | 500 | Something broke on our side. |
Endpoints are priced per row, not per call. Credits are held against the limit you asked for when a run starts, then settled against the rows it actually collected — ask for 200 places in a town that only has 12 and you are charged for 12. A run that fails is refunded in full. The two filtered endpoints (/v1/maps/no-website and /v1/amazon/complaints) filter after collection, so they settle against the rows the run collected rather than the smaller set returned. Every response carries credits_used and credits_remaining, and GET /v1/account reports the balance for free.