An array of available droplets
Soon to be deprecated. Use GET /api/company/v2026-10/droplets (the v2026-10 company droplets API) for new work; this endpoint keeps working until it is retired with notice.
List the droplets your company can see: published marketplace droplets, droplets your company owns (in any lifecycle state), and internal droplets another company granted you access to. Use GET /api/droplets/company_droplets for only the droplets your company owns.
Call it with a Bearer token for your company that has the droplets.view permission — a company admin, company API token, or partner token. A public (pub-) token is refused with 403.
Results are paginated with page and per_page (default 25, maximum 100). Pass category with a droplet category slug to filter. Responses may be cached for up to two minutes.
Pass search to rank the same droplets by how well their name, summary, description and categories match, most relevant first. Without search, the list is returned in its usual order.
curl --request GET \
--url https://api.fluid.app/api/droplets \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/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/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/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/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/droplets")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/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_4Tq8nXw2KfL9mRv3BpZ6cYh1JdS7aGe5u",
"name": "Middle-Out Order Analytics",
"categories": [
"Analytics & Reporting"
],
"active": true,
"publicly_available": true,
"embed_url": "https://apps.piedpiper.com/fluid/embed",
"requested_scopes": [
"orders",
"products",
"members"
],
"created_at": "2026-09-08T16:20:44Z",
"settings": {
"marketplace_page": {
"title": "Middle-Out Order Analytics",
"logo_url": "https://cdn.piedpiper.com/fluid/middle-out-logo.png",
"summary": "Order and rep performance dashboards, compressed to what matters."
},
"details_page": {
"title": "Middle-Out Order Analytics",
"logo_url": "https://cdn.piedpiper.com/fluid/middle-out-logo.png",
"summary": "See sales by rep, product, and country without exporting a single spreadsheet.",
"features": [
{
"name": "Rep leaderboards",
"summary": "Rank reps by sales and new enrollments.",
"details": "Daily leaderboards show which reps drive the most revenue, refreshed every hour from your Fluid orders.",
"image_url": "https://cdn.piedpiper.com/fluid/leaderboard.png",
"video_url": null
}
]
},
"service_operational_countries": [
"USA",
"CAN"
]
},
"app_extensions": []
}
],
"meta": {
"request_id": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-09-14T15:32:08Z",
"pagination": null,
"current_page": 1,
"total_pages": 1,
"total_count": 1,
"per_page": 25
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}curl --request GET \
--url https://api.fluid.app/api/droplets \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/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/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/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/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/droplets")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/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_4Tq8nXw2KfL9mRv3BpZ6cYh1JdS7aGe5u",
"name": "Middle-Out Order Analytics",
"categories": [
"Analytics & Reporting"
],
"active": true,
"publicly_available": true,
"embed_url": "https://apps.piedpiper.com/fluid/embed",
"requested_scopes": [
"orders",
"products",
"members"
],
"created_at": "2026-09-08T16:20:44Z",
"settings": {
"marketplace_page": {
"title": "Middle-Out Order Analytics",
"logo_url": "https://cdn.piedpiper.com/fluid/middle-out-logo.png",
"summary": "Order and rep performance dashboards, compressed to what matters."
},
"details_page": {
"title": "Middle-Out Order Analytics",
"logo_url": "https://cdn.piedpiper.com/fluid/middle-out-logo.png",
"summary": "See sales by rep, product, and country without exporting a single spreadsheet.",
"features": [
{
"name": "Rep leaderboards",
"summary": "Rank reps by sales and new enrollments.",
"details": "Daily leaderboards show which reps drive the most revenue, refreshed every hour from your Fluid orders.",
"image_url": "https://cdn.piedpiper.com/fluid/leaderboard.png",
"video_url": null
}
]
},
"service_operational_countries": [
"USA",
"CAN"
]
},
"app_extensions": []
}
],
"meta": {
"request_id": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-09-14T15:32:08Z",
"pagination": null,
"current_page": 1,
"total_pages": 1,
"total_count": 1,
"per_page": 25
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z"
}
}