Catalogue

Two routes that turn a client’s own names for things into the Basetool’s. Either is open to a token with any exchange scope the registry grants, exchange.connect included, and neither is a write.

Resolve references — POST /exchange/v1/catalog/resolve #

The body is a resolve-request: one kind and 1 to 500 item references of that kind.

{
  "kind": "BLUEPRINT",
  "refs": [
    {"bt": "bp-cf-337-panther-repeater", "name": "CF-337 Panther Repeater"},
    {"scRecord": "bp_craft_arclight"},
    {"name": "Unknown Thing"}
  ]
}

What each field is matched against, per kind:

kind bt scRecord scGuid uexId locKey name
BLUEPRINT the product key, the same value as a blueprint’s feed key the blueprint’s Wiki key the blueprint’s Wiki or game-file UUID, or its output item’s the output item’s UEX id the output item’s name key the web import’s chain: exact, alias, pack-tag strip, fuzzy
ITEM the item id the class name the Wiki or game-file UUID the UEX item id the name key exact, ignoring case
MATERIAL the material id the Wiki key the Wiki or game-file UUID the UEX commodity id the name key exact, canonical, alias, fuzzy
SHIP_TYPE the ship type id the class name the Wiki UUID the UEX vehicle id the name key the hangar import’s ship-type matching

A reference takes the first of its fields, in the order bt, scRecord, scGuid, uexId, locKey, that resolves to exactly one entry. If none does, a name that resolves to exactly one entry wins; otherwise the first field that resolved to several decides, and a reference with nothing that resolved is unmatched. v1 accepts nameLocale but does not use it for matching: send locKey, which is the same in every language, whenever you have it.

The answer is a resolve-response with one result per reference, in request order:

{
  "results": [
    {"index": 0, "status": "resolved",
     "ref": {"bt": "bp-cf-337-panther-repeater", "name": "CF-337 Panther Repeater"}},
    {"index": 1, "status": "ambiguous",
     "candidates": [{"bt": "a", "name": "A"}, {"bt": "b", "name": "B"}]},
    {"index": 2, "status": "unmatched"}
  ]
}
status Carries What a client does
resolved ref with bt and the Basetool’s name Store bt and send it from then on.
ambiguous candidates, at most ten {bt, name} Let the member pick. A fuzzy suggestion is always ambiguous, even alone.
unmatched nothing Show it to the member; do not send it in a change set.

warnings[] holds at most 50 {pointer, code}: LOC_KEY_UNRESOLVED at /refs/<i>/locKey for a reference with a locKey whose key fields did not resolve, and UNKNOWN_FIELD for a field the schema does not declare.

The change sets resolve their references the same way, so resolving first is optional. It lets a client settle ambiguous and unmatched with the member before it writes, instead of reading them back as per-op results. A stock op resolves its material as a MATERIAL first and, when no material matches, as an ITEM.

Warehouse locations — GET /exchange/v1/catalog/locations #

No parameters. The answer is a location-list: the warehouse’s non-hidden locations, ordered by name, each with its UEX city or space station when it is linked to one (a city link wins).

{
  "items": [
    {"name": "Area18", "uex": {"kind": "CITY", "id": 4}},
    {"name": "Seraphim Station"}
  ]
}

These are the only places a stock lot or a ship can be at. A location in a change set resolves by its uex link first, then by the exact name of a non-hidden location; a place with neither is refused per op as LOCATION_UNKNOWN and is never created. Offer the member a place from this list instead. The list changes rarely; reading it once per session is enough.

Errors #

Code When
400 SCHEMA_INVALID The request breaks resolve-request, for example more than 500 references or a reference without any field.
403 SCOPE_MISSING The token carries no exchange scope at all that the registry grants.

The full list is the error registry.