Two other searches have similar names. Data Brokers searches an index of listings collected ahead of time by crawling broker sites on a schedule. Russian Market answers only one search at a time and cannot be crawled in bulk, so it is searched live here instead. Stealer logs searches captures already in the credential corpus. This page covers logs still on sale.
Availability and cost
Availability: Live Data Broker. Cost: 1 session from your monthly Live Data Broker allowance for each search thatlive_search_create accepts with 202. If the call returns any other status, the session is refunded. A search that is accepted and later ends failed keeps its session. Every other call on this page uses no sessions. Each successful call also counts toward your API Calls allowance.
Without the Live Data Broker feature, or when your license is not active, every endpoint on this page except the two purchase endpoints returns 403:
403 with {"detail": "Your license is not active."}.
When the month’s sessions are spent, live_search_create returns 429 and no search is created:
limit is your monthly session allowance, including any active packs. The message uses the allowance’s internal name, Hacker Forum Live Search. Do not retry until the allowance resets. Plans and quotas explains allowances.
Two limits: your allowance and engine capacity
Two separate limits decide whether a new search runs.
The allowance is checked first. Extra Live Data Broker packs, bought in the dashboard, raise it while they are active.
When the engine refuses a search, the body names the window that is full:
detail is one of Hourly search limit exceeded, Daily search limit exceeded, Monthly search limit exceeded or Concurrent search limit exceeded. retry_after is the number of seconds, sent as a string, until that window opens again. When too many of your searches are still in progress, retry_after is 90. A refused create uses no session.
A fifth value, Organization is disabled, means the engine has turned off live searches for your organization. retry_after is then "None", and waiting does not help. Contact support.
How it works
Russian Market cannot be crawled in bulk. Each search runs live, on demand, through a small pool of managed marketplace accounts. That pool is the scarce resource, so searches wait in one queue that all organizations share. The engine picks the marketplace for you.- You create a search. It joins the queue with
statuspending. - A marketplace account picks it up.
statusmoves throughqueuedtorunning. - The engine reads the live listings, keeps those that match your query and stores them as rows.
statusends atcompleted,failedorcancelled.
Check capacity before you submit
live_search_capacity reports the engine’s headroom for your organization. It does not report your plan allowance.
While
circuit_breaker_active is true, live_search_create returns 502 and refunds the session, unless the same query completed recently and its results are reused. Wait for circuit_breaker_clears_at.
live_search_platform_health reports whether the marketplace is serving searches. Read is_available. reason explains a false. The other fields are diagnostics. Take the platform_id from any search’s detail or results.
Create the search
live_search_create takes one field, query.
query is a domain or a brand keyword. A dot decides which.
The query is lowercased, and a trailing dot is dropped. It can be up to 253 characters. Use a keyword to cover every domain a brand owns in one search. Use a domain for a narrower result.
An empty
query returns 400. A query that breaks these rules returns 422 with a detail list that names the rule.
The call returns 202. The search is queued, not finished.
id. The progress and results calls take it.
If the same query completed recently, the engine reuses those results. The new search has its own id and reads completed on the first poll. It still uses a session. The listings of a reused search cannot be acquired by their id; see Request acquisition.
Track progress
Follow the search by polling or by streaming. Polllive_search_detail every 3 to 5 seconds:
pending,queued,running,retrying,healing: still in progress. Keep polling.completed: done. Read the listings.failed: done, with an error. Readerror_message.cancelled: stopped before it finished.
queue_position, estimated_wait_seconds and estimated_wait are recalculated on every poll. Once it ends, results_count, search_duration_seconds and completed_at describe the run, and cached_until says how long its results are reused for the same query. The response also carries platform_id, query, created_at and retry_count.
Each poll that returns 200 uses one API call. A two-minute search polled every 3 seconds uses about 40.
Stream live_search_stream to receive progress as Server-Sent Events over one request:
- Each event is a
data:line holding a JSON object with atype. - The stream ends after an event whose
typeiscompletedorfailed. If the search has already completed or failed, you get that one event. - A cancelled search sends no final event, and the stream keeps sending keepalives. While you stream, also poll
live_search_detailevery 60 seconds, and stop whenstatusreadscancelled. - Lines that read
: keepalivearrive every 15 seconds while nothing else happens. Ignore them. - The connection closes if no data arrives for 900 seconds.
Read the listings
live_search_results returns the listings of one search, with the most recent listing date first.
limitdefaults to50, max200.offsetstarts at0.- The response holds
items,total,limitandoffset, plussearch_id,queryandapplied_filters. btc_usd_rateandbtc_rate_updated_atgive the Bitcoin rate used forprice_btc.
Links lists the domains in the log that match your query. Other domains in the same log are left out. The columns in row_data are what the marketplace shows for free. The credentials and files stay hidden until the log is acquired.
Filter the listings
Narrow the results with query parameters on the same call. Each filter matches onerow_data column exactly.
live_search_results_filters returns the values present in one search’s listings: stealers, os_values, vendors, countries, isps, and a size_range with min_mb and max_mb. Use them as filter values instead of guessing.
Review every search at once
live_search_org_results returns listings from all of your organization’s live searches, most recently read first. It takes the same filters as the results call, plus:
query: listings from searches whose query contains this text.min_date,max_date: listing date range, asYYYY-MM-DD.limit(default50, max200) andoffset.
search_count, the number of searches the listings came from.
live_search_list returns your organization’s live searches, newest first. Filter with status, and page with limit (default 20, max 100) and offset.
Request acquisition
When a listing is worth acquiring, create a purchase request. An analyst reviews it, buys the log on your behalf and sends a formal invoice by email.live_search_purchases_create returns 201.
Take
result_id from live_search_org_results. It returns only listings stored for your organization, so its IDs are always accepted. live_search_results can also return IDs that are not stored: for a search that reused earlier results, and for listings a later search found again. Those IDs return 404 with {"detail": "LiveSearch result not found"}.A reused search reads completed on the first poll, with search_duration_seconds at 0. If the listing you want is missing from live_search_org_results, run the query again after that search’s cached_until. A search that runs live stores its listings for your organization.id, status, your contact fields, a result_snapshot of the listing, listing_url, the pricing fields price_quoted and price_final, the analyst’s analyst_notes and responded_at, and created_at and updated_at.
status starts at pending. An analyst sets it to purchased or rejected. A request can also end expired.
One pending request per listing and email address. A second request for the same
result_id and customer_email while the first is pending returns 409 with {"detail": "A pending purchase request already exists for this result and customer"}. An unknown result_id returns 404 with {"detail": "LiveSearch result not found"}.live_search_purchases_list returns your organization’s requests, newest first. Filter with status and with result_ids, a comma-separated list of listing IDs. Page with limit (default 20, max 100) and offset.
Errors
Handle API errors explains how to branch on each status.
Endpoints
For the overview of all three live searches, see Live search.