Look up customers for a picker
Finds customers whose email, first name, last name or external id contains the term, and returns only the fields a picker renders. Unlike the customer index this endpoint does not paginate and does not count the match set, so it stays cheap enough to call on every keystroke. The term must carry at least three characters: shorter terms carry no trigram, the indexes behind the search cannot serve them, and the query would degrade to a scan of the whole tenant.
curl --request GET \
--url https://api.fluid.app/api/customers/lookup \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/customers/lookup"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fluid.app/api/customers/lookup', 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.fluid.app/api/customers/lookup",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.fluid.app/api/customers/lookup"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.fluid.app/api/customers/lookup")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/customers/lookup")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"customers": [
{
"id": 48213,
"full_name": "Holly Flax",
"email": "holly.flax@dundermifflin.com",
"role": "customer",
"is_rep": false
}
],
"status": 200,
"meta": {
"request_uuid": "c4b1e8f2-3a7d-4e19-9b62-5d0f7a2c8e41",
"timestamp": "2026-09-30T15:42:07Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "Search term must contain a word of at least 3 characters",
"details": {}
},
"status": 422,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}Authorizations
Bearer token authentication
Query Parameters
Term matched case-insensitively anywhere in the customer's email, first name, last name or external id. The term is split on whitespace and every word must match, so at least one word must carry three characters or more.
\S{3,}Maximum rows to return. Defaults to 10 and is capped at 25.
Response
Success
Picker rows for a lookup term, wrapped in the standard API response envelope.
The matching rows, newest customer first, at most as many as the limit allows.
Show child attributes
Show child attributes
The HTTP status code echoed in the response envelope.
200
The correlation metadata the API emits on every target-pattern endpoint. Distinct from the legacy Meta schema, which carries request_id rather than request_uuid.
Show child attributes
Show child attributes
curl --request GET \
--url https://api.fluid.app/api/customers/lookup \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/customers/lookup"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.fluid.app/api/customers/lookup', 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.fluid.app/api/customers/lookup",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.fluid.app/api/customers/lookup"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.fluid.app/api/customers/lookup")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/customers/lookup")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"customers": [
{
"id": 48213,
"full_name": "Holly Flax",
"email": "holly.flax@dundermifflin.com",
"role": "customer",
"is_rep": false
}
],
"status": 200,
"meta": {
"request_uuid": "c4b1e8f2-3a7d-4e19-9b62-5d0f7a2c8e41",
"timestamp": "2026-09-30T15:42:07Z"
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}{
"error": {
"message": "Search term must contain a word of at least 3 characters",
"details": {}
},
"status": 422,
"meta": {
"request_uuid": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}