curl --request GET \
--url https://api.decodahealth.com/inventory/stocks/groups \
--header 'API-KEY: <api-key>' \
--header 'TENANT: <tenant>'import requests
url = "https://api.decodahealth.com/inventory/stocks/groups"
headers = {
"TENANT": "<tenant>",
"API-KEY": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {TENANT: '<tenant>', 'API-KEY': '<api-key>'}};
fetch('https://api.decodahealth.com/inventory/stocks/groups', 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.decodahealth.com/inventory/stocks/groups",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"API-KEY: <api-key>",
"TENANT: <tenant>"
],
]);
$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.decodahealth.com/inventory/stocks/groups"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("TENANT", "<tenant>")
req.Header.Add("API-KEY", "<api-key>")
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.decodahealth.com/inventory/stocks/groups")
.header("TENANT", "<tenant>")
.header("API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.decodahealth.com/inventory/stocks/groups")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["TENANT"] = '<tenant>'
request["API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body[
{
"key": "<string>",
"label": "<string>",
"total": 123,
"depth": 0,
"parentKey": "<string>",
"isSynthetic": false
}
]{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Get Stock Groups
List stock items grouped by the requested field, with cost-gated fields redacted per the caller’s permissions.
curl --request GET \
--url https://api.decodahealth.com/inventory/stocks/groups \
--header 'API-KEY: <api-key>' \
--header 'TENANT: <tenant>'import requests
url = "https://api.decodahealth.com/inventory/stocks/groups"
headers = {
"TENANT": "<tenant>",
"API-KEY": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {TENANT: '<tenant>', 'API-KEY': '<api-key>'}};
fetch('https://api.decodahealth.com/inventory/stocks/groups', 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.decodahealth.com/inventory/stocks/groups",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"API-KEY: <api-key>",
"TENANT: <tenant>"
],
]);
$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.decodahealth.com/inventory/stocks/groups"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("TENANT", "<tenant>")
req.Header.Add("API-KEY", "<api-key>")
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.decodahealth.com/inventory/stocks/groups")
.header("TENANT", "<tenant>")
.header("API-KEY", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.decodahealth.com/inventory/stocks/groups")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["TENANT"] = '<tenant>'
request["API-KEY"] = '<api-key>'
response = http.request(request)
puts response.read_body[
{
"key": "<string>",
"label": "<string>",
"total": 123,
"depth": 0,
"parentKey": "<string>",
"isSynthetic": false
}
]{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Headers
The tenant you are making this request on behalf of
Your api key
Query Parameters
Optional sort field. inventory_value requires inventory:cost.
asc, desc Optional name of the stock
Optional IDs of the stock
Optional ID of the item
Optional ID of the supplier to filter by
Optional category names to filter by (references category.name). Multiple repeated values combine with OR.
Optional remaining quantity of the stock
Optional list of location IDs to filter shipments by
Optional unit of measurement
AMPOULES, APPLICATORS, BOTTLES, BOXES, CAPSULES, CUPS, DOSES, G_PER_ML, GRAMS, IU, IU_PER_ML, OUNCES, FLUID_OUNCES, KG, KITS, LITERS, MCG, MG, MG_PER_ML, ML, MMOL, MICROGRAM_PER_ML, PACKS, PAIRS, PATCHES, PERCENTAGE, PIECES, POUCHES, ROLLS, SACHETS, SHEETS, SPRAYS, STRIPS, SYRINGES, TABLETS, TABLETS_PER_DAY, TESTS, TROCHES, TUBES, UNITS, VIALS, TREATMENTS, SESSIONS, PULSES, JOULES, CENTIMETERS, THREAD_COUNT, INJECTIONS, WRINKLE_UNITS, POUNDS, FEET, INCHES Optional filter for archived status
Optional group by field
category, supplier When true, the category filter matches by exact name and skips the closure expansion. Used by the grouped-table per-group page query so a parent group doesn't pull in its descendants' stock (which would double-count rows).
Expiry range in days [lower_bound, upper_bound]
Filter by stock level status relative to min_stock_level
low, critical, out-of-stock 
