Point-in-Time Inventory¶
/v2/packages/point-in-time/report lists every package one license held on a past date, with the quantity each had then. It works from each package's history, so it includes packages that have since been finished, discontinued or sent to another license.
https://api.trackandtrace.tools/v2/packages/point-in-time/report?secretKey=YOUR_SECRET_KEY&licenseNumber=EX-00001&date=2026-09-30&moment=close&contentType=csv
That is the license's inventory as September 30 closed, in Central time.
Parameters¶
| Parameter | Required | Meaning |
|---|---|---|
licenseNumber | Yes | One license. A second one is refused. |
date | Yes | YYYY-MM-DD. Today or up to 180 days back. |
moment | No | open (the default) or close. The close of a day is the opening of the next. The close of today is refused, since it has not happened yet. |
timezone | No | An IANA zone such as America/Denver. Defaults to your state's: Missouri is America/Chicago. |
columns, contentType, delivery, columnHeaderOverrides and the other output options work as on every report. filter, filterLogic, sort, include, rowMode and rowLimit are refused: the report lists one license's whole inventory, so there is nothing to narrow.
Columns¶
The default columns are label, item.name, quantity, unitOfMeasureAbbreviation, status, quantityConfidence and note. packageId and the other item. fields are available through columns.
| Column | Meaning |
|---|---|
quantity | What the package held at that moment. Empty when it could not be worked out. Can be negative when Metrc had the package overdrawn. |
status | held, or unknown when the report cannot settle whether the license held it. Unknown rows are listed, never dropped. |
quantityConfidence | exact, probable, bounded, unreliable or estimated. See below. |
note | Anything that qualifies the row, in words. |
quantityConfidence:
exact: worked out two ways that agree, or read from a package nothing has changed since.probable: worked out one way only.bounded: the two ways disagree. The quantity shown is worked back from the current one.unreliable: the history could not be read far enough to work it out.estimated: the package has since left the license, and Metrc keeps no history for it there, so the quantity shipped is shown.
What counts as held¶
- A package on a manifest is held by its shipper until the receiver accepts it.
- A package rejected by its receiver is held by nobody until the shipper takes it back.
- A finished or discontinued package is not listed, and neither is one not yet made.
- A date counts as the user entered it in Metrc, not when it was recorded. A use entered a day late still counts on its own day.
A package that has since left is held on the date if nothing shows it arriving after it. The report reads your deliveries and used tags since the date to tell. If your Metrc login cannot read used tags, a package no delivery explains is listed as unknown.
Example¶
#!/usr/bin/env python3
# /// script
# requires-python = ">=3.8"
# dependencies = [
# "httpx",
# ]
# ///
import httpx
SECRET_KEY = "1234-1234-1234-1234-1234-1234"
LICENSE_NUMBER = "EX-00001"
def main():
response = httpx.get(
"https://api.trackandtrace.tools/v2/packages/point-in-time/report",
params={
"licenseNumber": LICENSE_NUMBER,
"date": "2026-09-30",
"moment": "close",
"contentType": "json",
},
headers={"X-T3-API-Key": SECRET_KEY},
# A report waits up to 240 seconds before giving up.
timeout=250.0,
)
response.raise_for_status()
for package in response.json()["data"]:
print(
package["label"],
package["quantity"],
package["unitOfMeasureAbbreviation"],
package["status"],
package["note"] or "",
)
if __name__ == "__main__":
main()
Limits¶
The report reads every package the license could have held, so it costs more than a plain report. A license that could have held more than 50,000 packages on the date, or whose report would need more than 10,000 Metrc requests, is refused with Report Request Too Large. Point-in-time reports for licenses that large are not available yet.
Each subscription can build 2 point-in-time reports an hour. Asking again for a report that is already cached does not count, so a spreadsheet can refresh one freely. Over the limit, the request returns 429.