Org stock

GET /exchange/v1/org-stock, scope exchange.orgstock.read: the shared warehouse stock of the org units the member directly belongs to, one pool per unit. With exchange.orgstock.write, a Logistician of a unit also books, sells, moves and edits the stock of that unit’s pool, see Writing.

Which pools #

Each unit the member is a direct member of is a pool: the stock its members booked into the unit’s shared warehouse. All four kinds of unit count, as for org units. A unit the member only oversees — the squadrons below an area they lead — is not served, and an administrator’s role adds nothing: the exchange acts with the member’s own memberships only. Personal stock of any member and shared stock booked to no unit never appear.

A lot #

An org-stock-lot is one pool’s stock of one material or item at one warehouse location, quality and stolen state, summed over every member who holds stock there. The same material at the same place in two of the member’s units is two lots. A lot names no holder; the single entries are an extra, see Entries.

Field Meaning
key Opaque identifier of the lot.
unit {id, name} of the unit whose pool holds the lot.
material {bt, name}: a material, or a game item, as in a stock lot.
materialKind Materials only, as in a stock lot.
location {name, uex?} of the warehouse location.
quality 0 to 1000; an item lot has 0.
stolen Whether the stock is marked stolen.
quantity {amount, unit}, the summed amount in the material’s own unit.
earmarked {jobOrders, missions}: how much of quantity is reserved for job orders and for missions, each a {amount, unit} in the lot’s unit; 0 when nothing is.
entries Only with exchange.orgstock.details, in a pool where the member is a Logistician: the single entries, see Entries. Absent otherwise.
{
  "key": "u:7d1c2f4e-3b8a-4c55-9e21-6a0f3b2d9c10|m:c3b1e0c2-8a4e-4f64-9a51-2b9f5c7e0a11|l:5e2a9d71-0c4b-4f8e-b3a6-1d7c8e9f0a22|q:500|s:0",
  "unit": {"id": "7d1c2f4e-3b8a-4c55-9e21-6a0f3b2d9c10", "name": "Iridium"},
  "material": {"bt": "c3b1e0c2-8a4e-4f64-9a51-2b9f5c7e0a11", "name": "Laranite"},
  "materialKind": {"type": "RAW", "commodity": true},
  "location": {"name": "Area18", "uex": {"kind": "CITY", "id": 4}},
  "quality": 500,
  "stolen": false,
  "quantity": {"amount": 48.25, "unit": "SCU"},
  "earmarked": {
    "jobOrders": {"amount": 12, "unit": "SCU"},
    "missions": {"amount": 0, "unit": "SCU"}
  }
}

Entries #

With the additional scope exchange.orgstock.details, every lot of a pool in which the member is a Logistician of that unit carries entries: one per holder’s stock, as the Basetool shows a Logistician in its warehouse. The member is a Logistician of a unit when their membership in exactly that unit carries the Logistician flag or a leadership rank; leading an area does not make them one of the squadrons below it. In every other pool, and without the scope, lots carry no entries. The scope asks nothing of its own: a request without it is answered without entries, not refused. When the member becomes or stops being a Logistician of a unit, the feed delivers that unit’s lots again, with or without entries. When your token gains the scope, read a new snapshot; when it loses it, drop the entries you kept.

Field Meaning
id, version The entry and its version.
holder {withheld: false, name, ref}: the name the Basetool shows and ref, a pseudonym of the member that stays the same at your client and differs at every other client. Use ref, not the name, to recognise a holder. {withheld: true} alone when the member keeps their name away from connected applications.
quantity The entry’s amount, in the lot’s unit.
note The entry’s note, when it has one and the holder is not withheld.
jobOrders [{id, number?, quantity, delivered}]: the job orders it is earmarked to, number shown as #number.
missions [{id, name?, quantity}]: the missions it is earmarked to.
free {jobOrders, missions}: the part not earmarked, per dimension.
"entries": [
  {
    "id": "9a7c2e10-4f3b-4d21-8c6e-2b1a0f9d8e31",
    "version": 3,
    "holder": {"withheld": false, "name": "Hauler One", "ref": "q0Fh3kB9xV7m2LwP5nR8tY1cZ4dE6gJ0sU3aH7bK9fM"},
    "quantity": {"amount": 30, "unit": "SCU"},
    "note": "Hangar 3",
    "jobOrders": [{"id": "4b2d6f80-1a3c-4e57-9b0d-7c5e3a1f2d42", "number": 412, "quantity": {"amount": 12, "unit": "SCU"}, "delivered": false}],
    "missions": [],
    "free": {"jobOrders": {"amount": 18, "unit": "SCU"}, "missions": {"amount": 30, "unit": "SCU"}}
  },
  {
    "id": "1f3e5a7c-9b2d-4c64-8e0a-3d5f7b9c1e75",
    "version": 0,
    "holder": {"withheld": true},
    "quantity": {"amount": 18.25, "unit": "SCU"},
    "jobOrders": [],
    "missions": [],
    "free": {"jobOrders": {"amount": 18.25, "unit": "SCU"}, "missions": {"amount": 18.25, "unit": "SCU"}}
  }
]

The answer #

A page of org-stock lots with one more member, units: the org-unit entries of every pool the member reads now. Every page lists them. A unit that is no longer listed — the member left it — is gone for your client together with all its lots; a departure takes effect on the next request.

{
  "items": [ ],
  "removed": [],
  "units": [
    {"id": "7d1c2f4e-3b8a-4c55-9e21-6a0f3b2d9c10", "name": "Iridium", "shorthand": "IRI", "kind": "SQUADRON"}
  ],
  "nextCursor": "f1.4711.0",
  "hasMore": false
}

Page the snapshot with limit (1 to 1000, default 500) and the nextCursor of the previous page while hasMore is true. A lot whose stock changes while you page may move to a later page.

Following changes #

As for every resource, the last snapshot page carries a feed cursor: store it, and read with it later to get only what changed since (sync guide). A feed page holds each changed lot once, in items with its current state or in removed as a tombstone keyed like the lot when the pool no longer holds any of it. Store the new nextCursor after every page.

A lot changes when someone books stock into or out of the pool, moves it to another place, holder or unit, changes its quality, its stolen marker or its note, rebooks it between personal and shared, or earmarks it for a job order or a mission. For the entries it also changes when a holder’s name changes or they start or stop withholding it, and when an earmarked mission is renamed. A tombstone names the channel that removed the lot and, for a client, its clientId; installationId is set only when one of the member’s own installations removed it.

Every feed page lists units too. Drop the lots of a unit that is no longer listed. When the member joins a unit, the feed delivers every lot of its pool, so you never need a new snapshot for it. A cursor older than the 90-day tombstones is answered 410 CURSOR_EXPIRED: read a new snapshot without cursor.

{
  "items": [ ],
  "removed": [
    {
      "key": "u:7d1c2f4e-3b8a-4c55-9e21-6a0f3b2d9c10|m:c3b1e0c2-8a4e-4f64-9a51-2b9f5c7e0a11|l:5e2a9d71-0c4b-4f8e-b3a6-1d7c8e9f0a22|q:500|s:0",
      "removedAt": "2026-10-16T09:12:44Z",
      "removedBy": {"channel": "web"}
    }
  ],
  "units": [ ],
  "nextCursor": "f1.4802.0",
  "hasMore": false
}

You may keep org stock for up to 7 days. It is other members’ stock, and the entries name them: show it to the member who connected your client, and do not pass it on.

Writing #

With exchange.orgstock.write, a member who is a Logistician of a unit (see Entries) books stock into that unit’s pool for any member of the unit, and books out, sells, moves and edits any entry of the pool, as the Basetool’s warehouse lets them. Send a change set to POST /exchange/v1/org-stock/changes with an Idempotency-Key, as for every write (sync guide). The ops run one after the other in one request; each op counts against the daily write quota (a dryRun counts once), and a change set that would exceed it is refused 429 QUOTA_EXCEEDED as a whole. Every write is checked and booked by the Basetool’s warehouse with its own rules: reservations stay protected, linked offers of the Basetool’s material exchange are lowered, the holder is notified of a book-out, a sale or a move by someone else, the Basetool’s warehouse audit names the member and your client, and every change is journaled under the member.

Every op names its pool in unit. An op on a pool whose unit the member is not a Logistician and direct member of, on a personal entry, or on an entry of another pool is rejected NOT_PERMITTED and changes nothing. Use the entries’ id and version from the entries.

The roster #

GET /exchange/v1/org-stock/members?unit=<unit id>, scope exchange.orgstock.write: the members a book-in into that unit’s pool may name as holder — the unit’s direct members with their ref (the same pseudonym the entries carry) and name, ordered by name. Members who keep their name away from connected applications are left out and cannot be booked in for; their entries stay writable by id. A unit the member is not a Logistician of is answered 403 NOT_PERMITTED.

{
  "unit": {"id": "7d1c2f4e-3b8a-4c55-9e21-6a0f3b2d9c10", "name": "Iridium"},
  "items": [
    {"ref": "q0Fh3kB9xV7m2LwP5nR8tY1cZ4dE6gJ0sU3aH7bK9fM", "name": "Hauler One"}
  ]
}

book-in #

A new shared entry of the pool, held by the member whose ref you name in holder, with material, location, quality, stolen and quantity as in a stock write, an optional note and optional earmarks: jobOrders ([{jobOrder, quantity}], job orders that need the material or item) and missions ([{mission, quantity}], not for an item), each adding up to at most the amount. Piece-counted stock joins the holder’s entry of the same lot in the pool; for an SCU material set mergeScu: true to do the same, as the warehouse’s merge option does.

book-out #

Takes quantity out of the entry entry at the version you last read. By default only the part of the entry that is free of earmarks can be booked out; to take earmarked stock, name how much comes out of each earmark in fromJobOrders and fromMissions ([{jobOrder, quantity}], [{mission, quantity}]). An entry booked out completely is removed.

sell #

A book-out that records a sale: quantity, fromJobOrders and fromMissions as for a book-out, plus the terminal the stock was sold at and the proceeds in aUEC. Each mission in fromMissions receives its share of the proceeds, proceeds × mission's amount ÷ quantity, as mission income — only when the member takes part in that mission, as in the Basetool’s warehouse.

move-location and move-holder #

Moves quantity of the entry entry to a new entry. move-location keeps holder and pool and names the new location. move-holder keeps the location and names the new holder by its ref from the roster of toUnit, the unit whose pool receives the stock: unit itself or another unit the member is a Logistician of. The earmarks named in fromJobOrders and fromMissions move along; everything else must come from the free part, as for a book-out. Piece-counted stock joins the receiving holder’s entry of the same lot; for an SCU material set mergeScu: true to do the same. The previous and the new holder are notified. A move to the entry’s own holder and place is unchanged; a move-holder to the entry’s own holder into another pool is NOT_PERMITTED, use move-pool for that.

move-pool #

Moves the entry entry into the pool of toUnit, another unit the member is a Logistician of and the entry’s holder directly belongs to; holder and location stay. Without quantity the whole entry moves with its earmarks; an entry pledged as a donation cannot move whole. With quantity that part is split off the free stock as a new entry, and the earmarks stay on the rest. mergeScu works as for the other moves. The holder is notified. Naming the entry’s own pool is unchanged.

note and stolen #

note sets the entry’s note; without note, or with a blank one, it clears it. stolen sets the marker in stolen on the whole entry or, with a quantity, on that part of it, which becomes an entry of its own. Either op is unchanged when the entry already is as asked.

A change set #

The ops of one change set run in their order, each against the entry as the ops before it left it, so a later op on the same entry carries the version the earlier one produced:

{
  "ops": [
    {
      "op": "book-in",
      "unit": "7d1c2f4e-3b8a-4c55-9e21-6a0f3b2d9c10",
      "holder": "q0Fh3kB9xV7m2LwP5nR8tY1cZ4dE6gJ0sU3aH7bK9fM",
      "material": {"bt": "c3b1e0c2-8a4e-4f64-9a51-2b9f5c7e0a11", "name": "Laranite"},
      "location": {"name": "Area18", "uex": {"kind": "CITY", "id": 4}},
      "quality": 500,
      "stolen": false,
      "quantity": {"amount": 12.5, "unit": "SCU"},
      "note": "Hangar 3"
    },
    {
      "op": "book-out",
      "unit": "7d1c2f4e-3b8a-4c55-9e21-6a0f3b2d9c10",
      "entry": "9a7c2e10-4f3b-4d21-8c6e-2b1a0f9d8e31",
      "version": 3,
      "quantity": {"amount": 14, "unit": "SCU"},
      "fromJobOrders": [{"jobOrder": "4b2d6f80-1a3c-4e57-9b0d-7c5e3a1f2d42", "quantity": {"amount": 2, "unit": "SCU"}}]
    },
    {
      "op": "sell",
      "unit": "7d1c2f4e-3b8a-4c55-9e21-6a0f3b2d9c10",
      "entry": "1f3e5a7c-9b2d-4c64-8e0a-3d5f7b9c1e75",
      "version": 0,
      "quantity": {"amount": 6, "unit": "SCU"},
      "terminal": "TDD Area18",
      "proceeds": 48250
    },
    {
      "op": "move-holder",
      "unit": "7d1c2f4e-3b8a-4c55-9e21-6a0f3b2d9c10",
      "entry": "1f3e5a7c-9b2d-4c64-8e0a-3d5f7b9c1e75",
      "version": 1,
      "quantity": {"amount": 4, "unit": "SCU"},
      "toUnit": "7d1c2f4e-3b8a-4c55-9e21-6a0f3b2d9c10",
      "holder": "q0Fh3kB9xV7m2LwP5nR8tY1cZ4dE6gJ0sU3aH7bK9fM"
    },
    {
      "op": "stolen",
      "unit": "7d1c2f4e-3b8a-4c55-9e21-6a0f3b2d9c10",
      "entry": "9a7c2e10-4f3b-4d21-8c6e-2b1a0f9d8e31",
      "version": 4,
      "stolen": true,
      "quantity": {"amount": 2, "unit": "SCU"}
    }
  ]
}

The result #

A change result as for every write: an applied op is counted, an op that was not is listed with its reason. The entries an op created or changed reach you through the feed. dryRun: true checks every op without writing.

Reason Op Meaning
NOT_PERMITTED all The pool, or the toUnit of a move-holder or move-pool, is not one of the member’s Logistician units; the entry is unknown, personal or in another pool; or a move-holder names the entry’s own holder for another pool.
HOLDER_UNKNOWN book-in, move-holder, move-pool holder is not on the roster of the receiving unit: not a direct member, withholding their name, or not a ref of your client; for move-pool, the entry’s holder is not a direct member of toUnit. Read the roster again.
VERSION_CONFLICT all but book-in The entry changed since you read it; an earlier op of the same change set counts. Pull the feed and retry.
INSUFFICIENT_STOCK all but book-in, note The entry holds less than quantity.
STOCK_EARMARKED book-out, sell, moves, stolen The part of quantity that fromJobOrders and fromMissions do not cover is earmarked, or pledged as a donation; for a partial stolen or move-pool, the rest of the entry would hold less than its earmarks; a whole move-pool of an entry pledged as a donation.
STOCK_OFFERED stolen, move-pool The rest of the entry after a partial stolen or move-pool would hold less than it offers on the Basetool’s material exchange.
OVER_ALLOCATION book-in The earmarks of one kind add up to more than quantity.
EARMARK_TARGET_INVALID book-in, book-out, sell, moves An earmark names a job order that does not need the material or item, an unknown mission, a mission for an item, a target twice, or — when taking from an entry — a target the entry is not earmarked to or more than it holds there.
UNIT_MISMATCH, LOCATION_UNKNOWN, STOLEN_MARKING_DISABLED, UNMATCHED, AMBIGUOUS as for stock  

An undo of org-stock writes under Connected applications is not offered yet; the journal keeps every change for it.