List and search droplets
The droplets your company may see, a page at a time. Search with q to find a droplet that already does what you need before building one; narrow with filter[ownership], filter[category] and filter[status].
Needs the droplets.view permission.
Examples:
- Find one to install:
GET /api/company/v2026-10/droplets?q=sync%20orders%20to%20a%20warehouse - Your company’s own droplets (what
GET /api/droplets/company_dropletsreturned):?filter[ownership]=owned - What you have installed:
?filter[ownership]=installed - The next page:
?page[cursor]=<meta.pagination.next_cursor>
curl --request GET \
--url https://api.fluid.app/api/company/v2026-10/droplets \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/company/v2026-10/droplets"
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/company/v2026-10/droplets', 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/company/v2026-10/droplets",
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/company/v2026-10/droplets"
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/company/v2026-10/droplets")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/company/v2026-10/droplets")
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{
"droplets": [
{
"uuid": "drp_4tq8nxw2kfl9mrv3bpz6cyh1jds7age5",
"title": "Order Sync",
"summary": "Push every paid order to your warehouse the moment it is captured.",
"description": "<p>Order Sync sends each paid order to your warehouse management system as soon as payment is captured, and writes tracking numbers back when it ships.</p><h3>What it does</h3><ul><li>Sends new orders, with line items and shipping address, within seconds.</li><li>Marks orders fulfilled and adds tracking when the warehouse ships.</li></ul>",
"logo_url": "https://ik.imagekit.io/fluid/droplets/order-sync/logo.png",
"features": [
{
"title": "Real-time order push",
"image_url": "https://ik.imagekit.io/fluid/droplets/order-sync/dashboard.png",
"video_url": null
},
{
"title": "Tracking write-back",
"image_url": null,
"video_url": "https://ik.imagekit.io/fluid/droplets/order-sync/tour.mp4"
}
],
"categories": [
{
"slug": "orders-shipping",
"name": "Orders & Shipping"
}
],
"publisher": {
"name": "Pied Piper Apps"
},
"status": "published",
"owned": false,
"installed": true,
"requested_scopes": [
"orders"
],
"service_operational_countries": null,
"embed_url": "https://apps.piedpiper.com/fluid/order-sync",
"created_at": "2026-09-08T16:20:44Z",
"updated_at": "2026-10-02T09:12:30Z"
}
],
"status": 200,
"meta": {
"request_id": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-18T15:32:08Z",
"pagination": {
"cursor": null,
"limit": 25,
"prev_cursor": null,
"next_cursor": "eyJuYW1lIjoiT3JkZXIgU3luYyIsImlkIjo0MTJ9"
}
}
}{
"message": "Invalid credentials."
}{
"message": "Not authorized."
}{
"error": {
"message": "Invalid parameters",
"details": {
"filter": {
"ownership": [
"must be one of: all, owned, installed"
]
}
}
},
"status": 422,
"meta": {
"request_id": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-18T15:32:08Z"
}
}Authorizations
A company admin credential for your company. Droplet installation tokens are refused.
Query Parameters
Words describing what the droplet should do. Matches the title, summary, description and categories. With no sort, the response is one page of the best matches, most relevant first, and next_cursor is null: refine q rather than paging. With a sort, every match (up to 10,000) pages in that order.
200Opaque cursor from meta.pagination.next_cursor or prev_cursor. Do not construct or decode it.
Droplets per page. Default 25, maximum 100.
1 <= x <= 100all (default): every droplet your company may see, which is published droplets, your own in any status, and internal droplets granted to you. owned: only the droplets your company publishes. installed: only the droplets your company has installed.
all, owned, installed A droplet category slug.
Only droplets in this status.
draft, internal, pending, published, archived Sort key; prefix - for descending. Default title, or relevance when q is given.
title, -title, created_at, -created_at, updated_at, -updated_at curl --request GET \
--url https://api.fluid.app/api/company/v2026-10/droplets \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/company/v2026-10/droplets"
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/company/v2026-10/droplets', 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/company/v2026-10/droplets",
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/company/v2026-10/droplets"
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/company/v2026-10/droplets")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/company/v2026-10/droplets")
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{
"droplets": [
{
"uuid": "drp_4tq8nxw2kfl9mrv3bpz6cyh1jds7age5",
"title": "Order Sync",
"summary": "Push every paid order to your warehouse the moment it is captured.",
"description": "<p>Order Sync sends each paid order to your warehouse management system as soon as payment is captured, and writes tracking numbers back when it ships.</p><h3>What it does</h3><ul><li>Sends new orders, with line items and shipping address, within seconds.</li><li>Marks orders fulfilled and adds tracking when the warehouse ships.</li></ul>",
"logo_url": "https://ik.imagekit.io/fluid/droplets/order-sync/logo.png",
"features": [
{
"title": "Real-time order push",
"image_url": "https://ik.imagekit.io/fluid/droplets/order-sync/dashboard.png",
"video_url": null
},
{
"title": "Tracking write-back",
"image_url": null,
"video_url": "https://ik.imagekit.io/fluid/droplets/order-sync/tour.mp4"
}
],
"categories": [
{
"slug": "orders-shipping",
"name": "Orders & Shipping"
}
],
"publisher": {
"name": "Pied Piper Apps"
},
"status": "published",
"owned": false,
"installed": true,
"requested_scopes": [
"orders"
],
"service_operational_countries": null,
"embed_url": "https://apps.piedpiper.com/fluid/order-sync",
"created_at": "2026-09-08T16:20:44Z",
"updated_at": "2026-10-02T09:12:30Z"
}
],
"status": 200,
"meta": {
"request_id": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-18T15:32:08Z",
"pagination": {
"cursor": null,
"limit": 25,
"prev_cursor": null,
"next_cursor": "eyJuYW1lIjoiT3JkZXIgU3luYyIsImlkIjo0MTJ9"
}
}
}{
"message": "Invalid credentials."
}{
"message": "Not authorized."
}{
"error": {
"message": "Invalid parameters",
"details": {
"filter": {
"ownership": [
"must be one of: all, owned, installed"
]
}
}
},
"status": 422,
"meta": {
"request_id": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-18T15:32:08Z"
}
}