๐Ÿ“š Acme Corp โ€” Data Guide

What the API serves, and what it means
โ† Dashboard ยท API docs

Acme Corp is a small company that makes and sells widgets. Every time something money-related happens โ€” a sale, a bill, a refund โ€” a new record shows up in the API. Your job is to build an agent that reads this data and spots when something looks wrong. Everything is served by a small read-only REST API (try it at /docs); this page explains every endpoint and field in plain language, no finance background needed.

Big picture Simulation clock How money is recorded /transactions /skus /vendors /customers Entry types Glossary

The big picture

Four read endpoints matter. One is the live event stream; the other three are reference lists it points at. Each returns JSON.

EndpointWhat it returnsGrows over time?
GET /transactionsEvery financial event โ€” the heart of the dataYes, constantly
GET /skusThe catalog of products Acme makes/sellsNo, fixed list
GET /vendorsCompanies Acme buys from (suppliers)No, fixed list
GET /customersCompanies Acme sells toNo, fixed list

Each transaction can reference a product (sku_id โ†’ /skus), a supplier (vendor_id โ†’ /vendors), and/or a buyer (customer_id โ†’ /customers) by id โ€” which ones are filled in depends on the kind of event. /transactions also takes query filters (time range, entry_type, sku, amount, โ€ฆ), and pre-computed rollups live under /aggregates/โ€ฆ (revenue, margin, cost-by-category, time series). The full, exact contract is at /docs.

The simulation clock โ€” time is "game time"

This is the one thing to understand before anything else. Acme runs on its own simulation clock, not the real-world clock on your computer.

Every ts (timestamp) on a transaction is a moment in game time. The game starts at a fixed date (currently 2025-01-01) and the simulator pushes the clock forward as it runs. So "now", from the data's point of view, is whatever the simulation clock currently reads โ€” shown live in the top-right of the dashboard. When you ask for "the last 30 days", that means the last 30 game days, ending at the current game time.

Two consequences worth building around:

Practical tip: don't compare transaction times to your computer's clock (you'll be a year or more off). Compare them to the current game time โ€” read it from the dashboard, or from GET /health or GET /control (both report sim_clock).

How money is recorded

Two ideas unlock the whole dataset:

1. Money is a single signed number. The amount field is positive when money comes in (a sale, a customer paying a bill) and negative when money goes out (paying a supplier, a refund, rent, taxes). So you never need a separate "is this income or expense" flag โ€” the sign tells you. The direction field just spells this out as inflow or outflow.
2. Product records should add up. For sales and cost-of-goods records, the money equals quantity ร— price: amount โ‰ˆ quantity ร— unit_price. When that equation is badly broken, or a number is suddenly thousands of times too big or small, something is wrong. That is exactly the kind of thing your agent should catch.

GET /transactions

One JSON object per financial event. This is where almost all your monitoring happens.

FieldTypeMeaning
idintegerUnique id for the record. Higher = more recent.
tstimestampWhen the event happened, in game time (see the simulation clock). Filter by this for "last 24h", "this month", etc. โ€” relative to the current game time, not your real clock.
entry_typestringWhat kind of event it is โ€” sale, cogs, payable, and so on. Full list below.
directionstringinflow (money in) or outflow (money out). Matches the sign of amount.
amountnumberThe money, signed: + in, โˆ’ out. In dollars.
currencystringAlways USD here.
quantityinteger / nullHow many units, for product events (sales, cost-of-goods). Null otherwise.
unit_pricenumber / nullPrice or cost per single unit. For a sale this is the selling price; for cost-of-goods it's the make cost. Null for non-product events.
sku_idid / nullโ†’ /skus. Which product this event is about, if any.
vendor_idid / nullโ†’ /vendors. Which supplier was paid, if any.
customer_idid / nullโ†’ /customers. Which buyer this involves, if any.
counterpartystring / nullThe name of the other party as free text (e.g. a customer or vendor name, or "Payroll Run"). Handy for display.
statusstringLifecycle: posted (recorded), pending (not finalized), settled (money actually moved).
memostring / nullA short human description, e.g. "Sale of 60x ASM-200".
created_attimestampReal wall-clock time the record was created. This is operational metadata โ€” for the business timeline use ts (game time) instead.

GET /skus

The product catalog. "SKU" just means a single distinct product (Stock Keeping Unit). Each sale or cost-of-goods event points at one of these.

FieldTypeMeaning
idintegerUnique product id (what a transaction's sku_id points to).
sku_codestringShort product code, e.g. WID-100.
namestringHuman name, e.g. "Standard Widget".
categorystringProduct family: Widgets, Gadgets, Components, Assemblies, Accessories.
unit_costnumberWhat it costs Acme to make one unit.
list_pricenumberWhat Acme sells one unit for. (Should be higher than unit_cost.)

Tip: list_price โˆ’ unit_cost is the profit per unit. A sale whose unit_price is wildly different from the SKU's list_price is suspicious.

GET /vendors

Companies Acme buys from โ€” raw materials, parts, utilities, software, rent.

FieldTypeMeaning
idintegerUnique supplier id (what a transaction's vendor_id points to).
namestringSupplier name.
categorystringWhat they supply: raw_materials, components, freight, utilities, software, packaging, facilities, rent.

GET /customers

Companies Acme sells to.

FieldTypeMeaning
idintegerUnique buyer id (what a transaction's customer_id points to).
namestringCustomer name.
segmentstringType of buyer: retail, wholesale, or enterprise.

The entry_type values

Every transaction is one of these. The colored label shows whether money flows in or out.

sale โ–ฒ inflow
Acme sold products to a customer. Has a sku_id, quantity, and unit_price.
receivable_payment โ–ฒ inflow
A customer paid an invoice they owed. Money actually arriving.
cogs โ–ผ outflow
"Cost of goods sold" โ€” what it cost Acme to make the products it sold. Has a sku_id and quantity.
payable โ–ผ outflow
Paying a supplier (vendor) for materials or services.
operating_expense โ–ผ outflow
Day-to-day running costs: cloud hosting, utilities, marketing, supplies, insurance.
payroll โ–ผ outflow
Paying staff wages.
rent โ–ผ outflow
Monthly cost of the facility. Tends to be a steady, repeating amount.
tax โ–ผ outflow
Money paid to the government.
refund โ–ผ outflow
Money returned to a customer (e.g. they sent back a product).
chargeback โ–ผ outflow
A payment was disputed and clawed back by the customer's bank.

Mini glossary

Inflow / OutflowMoney coming in vs. going out.
RevenueTotal money from sales (the sale records).
COGSCost of Goods Sold โ€” the direct cost of making what you sold.
Gross marginRevenue minus COGS โ€” roughly the profit before running costs. Usually a healthy positive percentage of revenue.
Operating expense (opex)The cost of running the business beyond making the product.
PayableMoney Acme owes a supplier (an outgoing bill).
ReceivableMoney a customer owes Acme; receivable_payment is when they actually pay.
ChargebackA reversed payment forced by the customer's bank after a dispute.
Net cashEverything added up โ€” all inflows minus all outflows.
Where to go next. Browse the data live on the dashboard, then explore the read-only REST API โ€” that's the surface your agent monitors. Decide what "normal" looks like, and build an agent that notices when it isn't.