Skip to main content
POST
/
v1
/
datasets
/
{table}
/
search
Search rows
curl --request POST \
  --url https://api.trydatadriver.com/v1/datasets/{table}/search
import requests

url = "https://api.trydatadriver.com/v1/datasets/{table}/search"

response = requests.post(url)

print(response.text)
const options = {method: 'POST'};

fetch('https://api.trydatadriver.com/v1/datasets/{table}/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.trydatadriver.com/v1/datasets/{table}/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"net/http"
"io"
)

func main() {

url := "https://api.trydatadriver.com/v1/datasets/{table}/search"

req, _ := http.NewRequest("POST", url, nil)

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://api.trydatadriver.com/v1/datasets/{table}/search")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.trydatadriver.com/v1/datasets/{table}/search")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)

response = http.request(request)
puts response.read_body

When you’d use this

Whenever you want to see actual rows. Apply filters to narrow the result, get up to 1,000 rows per call, then use the cursor to keep paging.

Why POST instead of GET?

The filter object can be complex (nested objects, arrays). It doesn’t fit cleanly in a URL, so we put it in the request body. The server is still doing a “read” — it just needs more input.

Request body fields

FieldTypeDescription
select (optional)array of stringsWhich columns to return. Omit for all columns your key can see.
filters (optional)objectFilter rules per column. Format: { "column": { "operator": value } }. AND across columns.
sort (optional)array of objects[{ "column": "...", "direction": "asc" or "desc" }]. Default: lead_time desc.
limit (optional)integerRows per page. Default 100. Max 1000.
cursor (optional)stringFrom the previous response’s next_cursor. Omit on the first call.

Request

curl https://api.trydatadriver.com/v1/datasets/leads/search \
  -H "Authorization: Bearer dd_a3f9b2c1d4e5f6g7h8i9j0" \
  -H "Content-Type: application/json" \
  -d '{
    "select": ["first_name","last_name","state","age","homeowner","tier"],
    "filters": {
      "state":     { "in":      ["AZ","TX"] },
      "age":       { "between": [30, 65] },
      "homeowner": { "eq":      "Y" },
      "dnc":       { "eq":      "N" },
      "tier":      { "in":      [1, 3] },
      "lead_time": { "gte":     "2026-01-01T00:00:00Z" }
    },
    "sort":  [{ "column": "lead_time", "direction": "desc" }],
    "limit": 100
  }'

Response

{
  "rows": [
    {
      "first_name": "Cody",
      "last_name":  "Schlotfeld",
      "state":      "AZ",
      "age":        35,
      "homeowner":  "Y",
      "tier":       1
    }
    /* ... 99 more rows ... */
  ],
  "returned":       100,
  "next_cursor":    "eyJjIjoibGVhZF90aW1lIiwiZCI6ImRlc2MiLCJ2IjoiMjAyNi0w...",
  "total_estimate": 8421
}

Field reference

FieldWhat it is
rowsAn array of objects. Each object is one row from the table with the columns you asked for in select.
returnedHow many rows are in this response. Equals rows.length.
next_cursorAn opaque string. Pass this as cursor in your next call to get the next page. null means you’ve hit the end.
total_estimateApproximate total matching rows across all pages — handy for progress bars.

Common error

{
  "error": {
    "code":    "INVALID_FILTER",
    "message": "Operator 'gt' is not supported on column 'homeowner'.",
    "field":   "filters.homeowner.gt",
    "request_id": "req_a3f9b2c1d4e5"
  }
}
This means you used an operator that doesn’t fit the column type. Check /schema to see which operators each column supports.