Reconcile provider customer ids
Matches the provider’s customer ids against Fluid’s external_ids for a window, so timing differences between the two systems never read as missing records.
Each provider customer dated in the window is looked up in Fluid by external_id with no time limit; those Fluid has no record of count toward missing_in_fluid. For an integration that exports to the provider, each customer created in Fluid in the window is looked up in the provider by id, so the provider’s own dates and timezone cannot cause a miss; those absent count toward missing_in_provider. A platform with no id lookup is checked against the provider’s ids over the window widened by two hours on each side instead. An entity the integration’s sync settings turn off answers 409 entity_not_synced.
The window defaults to the hour ending 30 minutes ago, spans at most 24 hours, and must end at least 30 minutes ago so records still in flight are not counted. The response carries counts; add include=ids to page the missing ids, 1,000 per page. A window holding more than 20,000 ids answers truncated: true with counts over the first 20,000.
Needs droplets.view and members.view.
curl --request GET \
--url https://api.fluid.app/api/company/v2026-10/connect/integrations/{uuid}/provider/customers/reconciliation \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/company/v2026-10/connect/integrations/{uuid}/provider/customers/reconciliation"
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/connect/integrations/{uuid}/provider/customers/reconciliation', 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/connect/integrations/{uuid}/provider/customers/reconciliation",
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/connect/integrations/{uuid}/provider/customers/reconciliation"
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/connect/integrations/{uuid}/provider/customers/reconciliation")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/company/v2026-10/connect/integrations/{uuid}/provider/customers/reconciliation")
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{
"provider_reconciliation": {
"entity": "customers",
"since": "2026-10-24T13:00:00Z",
"until": "2026-10-24T14:00:00Z",
"provider_count": 152,
"matched": 150,
"missing_in_fluid": 2,
"missing_in_provider": 1,
"missing_in_provider_skipped": null,
"truncated": false,
"computed_at": "2026-10-24T14:31:02Z",
"ids": {
"page": 1,
"per_page": 1000,
"missing_in_fluid": [
"20481733",
"20481790"
],
"missing_in_provider": [
"20481655"
],
"next_page": null
}
},
"status": 200,
"meta": {
"request_id": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-24T15:32:08Z"
}
}Authorizations
A company admin credential for your company. Droplet installation tokens are refused.
Path Parameters
The integration's droplet uuid, from uuid in the list.
Query Parameters
When the window opens, ISO 8601, inclusive. Defaults to one hour before until.
When the window closes, ISO 8601, exclusive. Defaults to 30 minutes ago.
ids adds one page of the missing ids to the counts.
ids The page of missing ids, from 1, at most 1,000 ids per list. Only read with include=ids.
x >= 1Response
The customer reconciliation.
A provider ID reconciliation for a window.
curl --request GET \
--url https://api.fluid.app/api/company/v2026-10/connect/integrations/{uuid}/provider/customers/reconciliation \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.fluid.app/api/company/v2026-10/connect/integrations/{uuid}/provider/customers/reconciliation"
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/connect/integrations/{uuid}/provider/customers/reconciliation', 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/connect/integrations/{uuid}/provider/customers/reconciliation",
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/connect/integrations/{uuid}/provider/customers/reconciliation"
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/connect/integrations/{uuid}/provider/customers/reconciliation")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/company/v2026-10/connect/integrations/{uuid}/provider/customers/reconciliation")
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{
"provider_reconciliation": {
"entity": "customers",
"since": "2026-10-24T13:00:00Z",
"until": "2026-10-24T14:00:00Z",
"provider_count": 152,
"matched": 150,
"missing_in_fluid": 2,
"missing_in_provider": 1,
"missing_in_provider_skipped": null,
"truncated": false,
"computed_at": "2026-10-24T14:31:02Z",
"ids": {
"page": 1,
"per_page": 1000,
"missing_in_fluid": [
"20481733",
"20481790"
],
"missing_in_provider": [
"20481655"
],
"next_page": null
}
},
"status": 200,
"meta": {
"request_id": "7e2c9b41-3f8a-4d15-b6e0-9a4c21d7f583",
"timestamp": "2026-10-24T15:32:08Z"
}
}