{"openapi":"3.1.0","info":{"title":"Fieldnode API","version":"v1","contact":{"name":"Support","url":"https://fieldnode.com","email":"support@fieldnode.com"}},"tags":[{"name":"Process"},{"name":"Standard"},{"name":"Material"},{"name":"Org"},{"name":"Upload"},{"name":"Part"},{"name":"Factory"},{"name":"Category"},{"name":"Criticality"},{"name":"Rfq"},{"name":"Offer"},{"name":"User"},{"name":"Role"},{"name":"AuditLog"},{"name":"Technology"},{"name":"UnspscCategory"},{"name":"Order"}],"paths":{"/v1/audit-log":{"get":{"operationId":"listAuditLog","summary":"List Audit Log","description":"List audit log entries for the caller's organization, newest first.\n\nAlways scoped to the caller's own organization — there is no organization parameter, because an\nadministrator administers their own.\n\n**Requires organization administration.**","parameters":[{"$ref":"#/components/parameters/PaginatedListProps.page"},{"$ref":"#/components/parameters/PaginatedListProps.pageSize"},{"name":"q","in":"query","required":false,"description":"Free-text search. Matches a case-insensitive substring of the action name or\nof the actor's email.","schema":{"type":"string"},"explode":false},{"name":"procedure","in":"query","required":false,"description":"Only entries for this exact action name, such as `signedIn`.","schema":{"type":"string"},"explode":false},{"name":"actorId","in":"query","required":false,"description":"Only entries by this user id.","schema":{"type":"string"},"explode":false},{"name":"impersonatedOnly","in":"query","required":false,"description":"Only entries written while somebody was impersonating.","schema":{"type":"boolean"},"explode":false},{"name":"failedOnly","in":"query","required":false,"description":"Only refused attempts, which is usually what a review is looking for.","schema":{"type":"boolean"},"explode":false},{"name":"hideSignIns","in":"query","required":false,"description":"Drop successful sign-ins. They are the most numerous event in any\norganization — every user, every day — and they drown out the changes a\nreview is for. **Refused** sign-ins are kept: a rejected attempt is the one\nsign-in worth reading.","schema":{"type":"boolean"},"explode":false},{"name":"from","in":"query","required":false,"description":"Only entries at or after this time.","schema":{"type":"string","format":"date-time"},"explode":false},{"name":"to","in":"query","required":false,"description":"Only entries at or before this time.","schema":{"type":"string","format":"date-time"},"explode":false}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items","hasMore"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/AuditLogEntry"},"description":"List of items."},"hasMore":{"type":"boolean","description":"Whether there are more items to fetch."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["AuditLog"]}},"/v1/audit-log/{id}":{"get":{"operationId":"getAuditLogEntry","summary":"Get Audit Log Entry","description":"Get one audit log entry in the caller's organization.\n\nReturns `AuditLogEntryDetail`, which adds `userAgent`, `request` and `impersonationDetail` to\nwhat the list carries. An entry belonging to another organization is not found, identically to an id that\nnames nothing.\n\n**Requires organization administration.**","parameters":[{"name":"id","in":"path","required":true,"description":"Audit log entry id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditLogEntryDetail"}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["AuditLog"]}},"/v1/categories":{"get":{"operationId":"listCategories","summary":"List Categories","description":"List categories.\n\nThe catalog is a tree of equipment classes. With a thousand rows and only a handful of roots,\npaging from the start will not find the top of it — `topLevel` is the entry point and `parentId`\nwalks down from there.","parameters":[{"$ref":"#/components/parameters/PaginatedListProps.page"},{"$ref":"#/components/parameters/PaginatedListProps.pageSize"},{"name":"topLevel","in":"query","required":false,"description":"Only categories with no parent — the roots of the tree.","schema":{"type":"boolean"},"explode":false},{"name":"parentId","in":"query","required":false,"description":"Only the direct children of this category. Contradicts `topLevel`; sending both is refused.","schema":{"type":"string"},"explode":false},{"name":"search","in":"query","required":false,"description":"Free-text match on the name or description.","schema":{"type":"string"},"explode":false}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items","hasMore"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Category"},"description":"List of items."},"hasMore":{"type":"boolean","description":"Whether there are more items to fetch."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Category"]}},"/v1/categories/{id}":{"get":{"operationId":"getCategory","summary":"Get Category","description":"Get category by id.","parameters":[{"name":"id","in":"path","required":true,"description":"Category id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Category"}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Category"]}},"/v1/categories:batch-get":{"post":{"operationId":"batchGetCategories","summary":"Batch Get Categories","description":"Batch get categories.","parameters":[],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Category"},"description":"List of items."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Category"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"},"description":"List of category ids to load."}},"required":["ids"]}}}}}},"/v1/criticalities":{"get":{"operationId":"listCriticalities","summary":"List Criticalities","description":"List criticalities.\n\nA closed list of a handful of values, so it is returned whole rather than paged — the same\nshape `listProcesses` uses for the same reason.","parameters":[{"name":"governingBody","in":"query","required":false,"description":"Filter on governing body.","schema":{"type":"string"},"explode":false}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Criticality"},"description":"List of items."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Criticality"]}},"/v1/criticalities/{id}":{"get":{"operationId":"getCriticality","summary":"Get Criticality","description":"Get criticality by id.","parameters":[{"name":"id","in":"path","required":true,"description":"Criticality id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Criticality"}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Criticality"]}},"/v1/criticalities:batch-get":{"post":{"operationId":"batchGetCriticalities","summary":"Batch Get Criticalities","description":"Batch get criticalities.","parameters":[],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Criticality"},"description":"List of items."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Criticality"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"},"description":"List of criticality ids to load."}},"required":["ids"]}}}}}},"/v1/factories":{"get":{"operationId":"listFactories","summary":"List Factories","description":"List factories, with pagination.\n\n`view` selects which catalog is being read and is required — the two are\ndifferent sets, not two orderings of one set, so there is no sensible default.","parameters":[{"$ref":"#/components/parameters/PaginatedListProps.page"},{"$ref":"#/components/parameters/PaginatedListProps.pageSize"},{"name":"view","in":"query","required":true,"description":"Which catalog to read.\n\n`MANUFACTURER` lists the factories the caller's own organization owns.\n`CONSUMER` lists the factories the caller may source from — every active,\nnon-internal factory for a directly engaged organization, or only those\nreleased by the distributor for a distributor-engaged one. Each requires\nthe matching `app:*` permission.","schema":{"type":"string","enum":["CONSUMER","MANUFACTURER"]},"explode":false},{"name":"q","in":"query","required":false,"description":"Free-text search. Matches a case-insensitive substring of the factory name\nor of its owning organization's name.","schema":{"type":"string"},"explode":false},{"name":"orgId","in":"query","required":false,"description":"Only factories owned by this organization.","schema":{"type":"string"},"explode":false},{"name":"active","in":"query","required":false,"description":"Filter by active flag. Omit for both.","schema":{"type":"boolean"},"explode":false},{"name":"internal","in":"query","required":false,"description":"Filter by internal flag. Omit for both. Always false in the `CONSUMER`\nview, which never includes another organization's internal factories.","schema":{"type":"boolean"},"explode":false},{"name":"regionCode","in":"query","required":false,"description":"Only factories whose address carries this CLDR region code, e.g. `NO`.","schema":{"type":"string"},"explode":false},{"name":"locality","in":"query","required":false,"description":"Only factories whose address locality starts with this text,\ncase-insensitively.","schema":{"type":"string"},"explode":false},{"name":"partId","in":"query","required":false,"description":"Only factories that can make this part.\n\nA factory qualifies when it holds a capability in the part's material **and**\na capability whose technology overlaps the part's. The part's material and\ntechnology are read from the part itself, not from the request, so this\ncannot be widened by omitting anything; the caller must be able to read the\npart, or it is not found.\n\nA part with no technology selected is matched on material alone. Matching on\nan empty technology set would select only capabilities that name no\ntechnology either — after the taxonomy backfill, almost none — turning the\nfilter into an empty list.\n\nCombines with the other filters, including `materialCode`, which further\nnarrows rather than replacing the part's own material.","schema":{"type":"string"},"explode":false},{"name":"materialCode","in":"query","required":false,"description":"Only factories with a registered capability in this material, by material\ncode. Use `GET /v1/materials` to resolve a material name to its code.","schema":{"type":"string"},"explode":false},{"name":"standardCode","in":"query","required":false,"description":"Only factories with a registered capability against this standard, by\nstandard code.","schema":{"type":"string"},"explode":false},{"name":"criticalityCode","in":"query","required":false,"description":"Only factories with a registered capability at this criticality, by\ncriticality code.","schema":{"type":"string"},"explode":false},{"name":"processType","in":"query","required":false,"description":"Only factories with a registered capability in this production process\ntype. One of `additive_manufacturing`, `cnc` or `rapid_casting`.","schema":{"type":"string"},"explode":false}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items","hasMore"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Factory"},"description":"List of items."},"hasMore":{"type":"boolean","description":"Whether there are more items to fetch."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Factory"]}},"/v1/factories/{id}":{"get":{"operationId":"getFactory","summary":"Get Factory","description":"Get factory by id.","parameters":[{"name":"id","in":"path","required":true,"description":"Factory id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Factory"}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Factory"]}},"/v1/factories:batch-get":{"post":{"operationId":"batchGetFactories","summary":"Batch Get Factories","description":"Batch get factories.","parameters":[],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Factory"},"description":"List of items."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Factory"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"},"description":"List of factory ids to load."}},"required":["ids"]}}}}}},"/v1/materials":{"get":{"operationId":"listMaterials","summary":"List Materials","description":"List materials.","parameters":[{"$ref":"#/components/parameters/PaginatedListProps.page"},{"$ref":"#/components/parameters/PaginatedListProps.pageSize"},{"name":"type","in":"query","required":false,"description":"Filter on material type.","schema":{"type":"string"},"explode":false}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items","hasMore"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Material"},"description":"List of items."},"hasMore":{"type":"boolean","description":"Whether there are more items to fetch."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Material"]}},"/v1/materials/{code}":{"get":{"operationId":"getMaterial","summary":"Get Material","description":"Get material by code.","parameters":[{"name":"code","in":"path","required":true,"description":"Material code.","schema":{"type":"string"}}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Material"}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Material"]}},"/v1/materials:batch-get":{"post":{"operationId":"batchGetMaterials","summary":"Batch Get Materials","description":"Batch get materials.","parameters":[],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Material"},"description":"List of items."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Material"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"codes":{"type":"array","items":{"type":"string"},"description":"List of material codes to load."}},"required":["codes"]}}}}}},"/v1/offers":{"get":{"operationId":"listOffers","summary":"List Offers","description":"List offers with pagination.","parameters":[{"$ref":"#/components/parameters/PaginatedListProps.page"},{"$ref":"#/components/parameters/PaginatedListProps.pageSize"},{"name":"view","in":"query","required":false,"description":"Which role to list the offers for. Omit for every offer the caller's\norganization is party to in any role.","schema":{"type":"string","enum":["CONSUMER","IP_OWNER","MANUFACTURER"]},"explode":false},{"name":"rfqId","in":"query","required":false,"description":"Only offers made against this RFQ.","schema":{"type":"string"},"explode":false},{"name":"partId","in":"query","required":false,"description":"Only offers for this part.","schema":{"type":"string"},"explode":false},{"name":"state","in":"query","required":false,"description":"Filter by lifecycle state.","schema":{"$ref":"#/components/schemas/OfferState"},"explode":false},{"name":"activated","in":"query","required":false,"description":"Filter by activation status — a coarse spelling of `state`, kept because it\npredates it. `true` is `state=ACCEPTED`; `false` is every other state. Prefer\n`state`, which can say which.","schema":{"type":"boolean"},"explode":false}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items","hasMore"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Offer"},"description":"List of items."},"hasMore":{"type":"boolean","description":"Whether there are more items to fetch."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Offer"]}},"/v1/offers/{id}":{"get":{"operationId":"getOffer","summary":"Get Offer","description":"Get offer by id.","parameters":[{"name":"id","in":"path","required":true,"description":"Offer id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Offer"}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Offer"]}},"/v1/orders":{"get":{"operationId":"listOrders","summary":"List Orders","description":"List orders.\n\n**Beta.** This endpoint is still settling: its shape may change, including in ways that break an\nintegration built on it. It is exempt from the contract's breaking-change gate, so treat it as\nsomething to follow rather than to pin to. It will lose this notice when it stabilises.","parameters":[{"$ref":"#/components/parameters/PaginatedListProps.page"},{"$ref":"#/components/parameters/PaginatedListProps.pageSize"},{"name":"view","in":"query","required":false,"description":"Which role to list the orders for. Omit to list every order the caller's organisation is\nparty to in any role.","schema":{"type":"string","enum":["CONSUMER","IP_OWNER","MANUFACTURER","SELLER","DISTRIBUTOR"]},"explode":false},{"name":"state","in":"query","required":false,"description":"Filter by order state.","schema":{"$ref":"#/components/schemas/OrderState"},"explode":false},{"name":"partId","in":"query","required":false,"description":"Only orders for this part.","schema":{"type":"string"},"explode":false},{"name":"factoryId","in":"query","required":false,"description":"Only orders placed with this factory.","schema":{"type":"string"},"explode":false}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items","hasMore"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Order"},"description":"List of items."},"hasMore":{"type":"boolean","description":"Whether there are more items to fetch."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Order"],"x-stability-level":"beta"}},"/v1/orders/{id}":{"get":{"operationId":"getOrder","summary":"Get Order","description":"Get order by id.\n\n**Beta.** This endpoint is still settling: its shape may change, including in ways that break an\nintegration built on it. It is exempt from the contract's breaking-change gate, so treat it as\nsomething to follow rather than to pin to. It will lose this notice when it stabilises.","parameters":[{"name":"id","in":"path","required":true,"description":"Order id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Order"],"x-stability-level":"beta"}},"/v1/orders/{id}/history":{"get":{"operationId":"listOrderHistory","summary":"List Order History","description":"List the recorded changes to an order, newest first.\n\n**Beta.** This endpoint is still settling: its shape may change, including in ways that break an\nintegration built on it. It is exempt from the contract's breaking-change gate, so treat it as\nsomething to follow rather than to pin to. It will lose this notice when it stabilises.\n\nReadable by any organisation party to the order, which is the same rule `GET /v1/orders/{id}`\napplies — an order the caller holds no role on is not found.\n\nHistory reaches back to the day change capture was switched on and no further; an order older\nthan that begins with a `BACKFILL` entry rather than a creation. Entries are never rewritten.\n\nWho made a change is deliberately not reported. The capture records the change, not the actor,\nand reporting an actor it does not hold would be worse than omitting one.","parameters":[{"name":"id","in":"path","required":true,"description":"Order id.","schema":{"type":"string"}},{"$ref":"#/components/parameters/PaginatedListProps.page"},{"$ref":"#/components/parameters/PaginatedListProps.pageSize"}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items","hasMore"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEntry"},"description":"List of items."},"hasMore":{"type":"boolean","description":"Whether there are more items to fetch."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Order"],"x-stability-level":"beta"}},"/v1/orgs/{id}":{"get":{"operationId":"getOrg","summary":"Get Org","description":"Get organization by id.","parameters":[{"name":"id","in":"path","required":true,"description":"Organization id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Org"}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Org"]}},"/v1/orgs:batch-get":{"post":{"operationId":"batchGetOrgs","summary":"Batch Get Orgs","description":"Batch get organizations.","parameters":[],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Org"},"description":"List of items."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Org"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"},"description":"List of organization ids to load."}},"required":["ids"]}}}}}},"/v1/parts":{"get":{"operationId":"listParts","summary":"List Part","description":"List multiple parts with pagination.","parameters":[{"$ref":"#/components/parameters/PaginatedListProps.page"},{"$ref":"#/components/parameters/PaginatedListProps.pageSize"},{"name":"view","in":"query","required":false,"description":"View mode for listing parts.","schema":{"type":"string","enum":["CONSUMER","IP_OWNER"],"default":"CONSUMER"},"explode":false},{"name":"q","in":"query","required":false,"description":"Case-insensitive substring match against the part's title and external\nreference. Omit to list without filtering.","schema":{"type":"string"},"explode":false}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items","hasMore"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Part"},"description":"List of items."},"hasMore":{"type":"boolean","description":"Whether there are more items to fetch."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Part"]},"post":{"operationId":"createPart","summary":"Create Part","description":"Create a new part.","parameters":[],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePartResponse"}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Part"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Title of the part."},"externalRef":{"type":"string","description":"External reference for the part."},"description":{"type":"string","description":"Description of the part."},"requireSubscription":{"type":"boolean","description":"Whether the part requires a subscription."},"materialType":{"type":"string","enum":["metal","polymer","ceramic","composite","sand","wax","other"],"description":"Material type of the part."},"materialId":{"type":"string","description":"Material ID."},"processId":{"type":"string","description":"Process ID."},"materialNote":{"type":"string","description":"Material note."},"processNote":{"type":"string","description":"Process note."},"standardIds":{"type":"array","items":{"type":"string"},"description":"Standard IDs."},"criticalityIds":{"type":"array","items":{"type":"string"},"description":"Criticality IDs."},"categoryIds":{"type":"array","items":{"type":"string"},"description":"Category IDs."},"unspscCategoryIds":{"type":"array","items":{"type":"string"},"description":"UNSPSC category IDs."},"keywords":{"type":"array","items":{"type":"string"},"description":"Keywords."},"internal":{"type":"boolean","description":"Whether the part is internal."},"rapidManufacturingMaterial":{"type":"string","description":"Rapid manufacturing material."},"exemptionsNotes":{"type":"string","description":"Exemptions notes."},"documentationRequirementNotes":{"type":"string","description":"Documentation requirement notes."},"otherRequirementNotes":{"type":"string","description":"Other requirement notes."},"descriptionManufacturer":{"type":"string","description":"Description for manufacturer."},"unitSystem":{"$ref":"#/components/schemas/UnitSystem","description":"Unit system."},"businessUnitIds":{"type":"array","items":{"type":"string"},"description":"Business unit IDs."},"boundingBox":{"$ref":"#/components/schemas/BoundingBox","description":"Bounding box measures (x/y/z)."},"metadata":{"type":"object","unevaluatedProperties":{"type":"string"},"description":"Optional metadata key-value pairs to attach to the part."},"customFields":{"type":"array","items":{"$ref":"#/components/schemas/CustomFieldInput"},"description":"Custom dropdown selections to attach to the part."}}}}}}}},"/v1/parts/{id}":{"get":{"operationId":"getPart","summary":"Get Part","description":"Get part by id.","parameters":[{"name":"id","in":"path","required":true,"description":"Part id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Part"}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Part"]}},"/v1/parts/{id}/files":{"get":{"operationId":"listPartFiles","summary":"List Part Files","description":"List part files.","parameters":[{"name":"id","in":"path","required":true,"description":"Part id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/File"},"description":"List of items."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Part"]},"patch":{"operationId":"updatePartFiles","summary":"Update Part Files","description":"Add or remove part files.","parameters":[{"name":"id","in":"path","required":true,"description":"Part id.","schema":{"type":"string"}}],"responses":{"204":{"description":"There is no content to send for this request, but the headers may be useful. "},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Part"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFilesRequest"}}}}}},"/v1/parts/{id}/history":{"get":{"operationId":"listPartHistory","summary":"List Part History","description":"List the recorded changes to a part, newest first.\n\n**Beta.** This endpoint is still settling: its shape may change, including in ways that break an\nintegration built on it. It is exempt from the contract's breaking-change gate, so treat it as\nsomething to follow rather than to pin to. It will lose this notice when it stabilises.\n\n**Restricted to the part's IP owner**, which is narrower than `GET /v1/parts/{id}` — that is\nreadable by anyone once the part is published and not internal.\n\nThe difference is deliberate. A part's history necessarily includes what it looked like while\nit was still a private draft, and publishing a part is a decision about the part as it is now,\nnot consent to hand over every revision that led to it. Being party to an order or an RFQ makes\nyou a counterparty to that transaction and its record is jointly yours; reading a published\ncatalogue entry does not make its drafting history yours.\n\nHistory reaches back to the day change capture was switched on and no further; a part older\nthan that begins with a `BACKFILL` entry rather than a creation. A deleted part has no readable\nhistory. Entries are never rewritten.\n\nWho made a change is deliberately not reported. The capture records the change, not the actor,\nand reporting an actor it does not hold would be worse than omitting one.","parameters":[{"name":"id","in":"path","required":true,"description":"Part id.","schema":{"type":"string"}},{"$ref":"#/components/parameters/PaginatedListProps.page"},{"$ref":"#/components/parameters/PaginatedListProps.pageSize"}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items","hasMore"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEntry"},"description":"List of items."},"hasMore":{"type":"boolean","description":"Whether there are more items to fetch."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Part"],"x-stability-level":"beta"}},"/v1/parts/{id}/metadata":{"get":{"operationId":"getPartMetadata","summary":"Get Part Metadata","description":"Get metadata for part.","parameters":[{"name":"id","in":"path","required":true,"description":"Part id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetadataResponse"}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Part"]}},"/v1/parts/{partId}/import-file":{"post":{"operationId":"importPartFile","summary":"Import Part File","description":"Import a file from external SAS URL to a part.","parameters":[{"name":"partId","in":"path","required":true,"description":"Part ID to import file to.","schema":{"type":"string"}}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportPartFileResponse"}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Part"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"File name."},"sasUrl":{"type":"string","description":"SAS URL to copy from."},"group":{"type":"string","enum":["preview","document","ip","partDevelopment","development"],"description":"File group."}},"required":["name","sasUrl","group"]}}}}}},"/v1/processes":{"get":{"operationId":"listProcesses","summary":"List Processes","description":"List processes.","parameters":[{"name":"materialType","in":"query","required":false,"description":"Filter on material type.","schema":{"type":"string"},"explode":false}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Process"},"description":"List of items."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Process"]}},"/v1/processes/{code}":{"get":{"operationId":"getProcess","summary":"Get Process","description":"Get process by code.","parameters":[{"name":"code","in":"path","required":true,"description":"Process code.","schema":{"type":"string"}}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Process"}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Process"]}},"/v1/processes:batch-get":{"post":{"operationId":"batchGetProcesses","summary":"Batch Get Processes","description":"Batch get processes.","parameters":[],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Process"},"description":"List of items."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Process"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"codes":{"type":"array","items":{"type":"string"},"description":"List of process codes to load."}},"required":["codes"]}}}}}},"/v1/rfqs":{"get":{"operationId":"listRfqs","summary":"List Rfqs","description":"List RFQs the caller's organisation is party to, with pagination.","parameters":[{"$ref":"#/components/parameters/PaginatedListProps.page"},{"$ref":"#/components/parameters/PaginatedListProps.pageSize"},{"name":"view","in":"query","required":false,"description":"Which role to list the RFQs for. Omit to list every RFQ the caller's\norganisation is party to in any role.","schema":{"type":"string","enum":["CONSUMER","IP_OWNER","MANUFACTURER"]},"explode":false},{"name":"state","in":"query","required":false,"description":"Filter by RFQ state.","schema":{"$ref":"#/components/schemas/RfqState"},"explode":false},{"name":"q","in":"query","required":false,"description":"Free-text search. Matches a substring of the part's title, or an exact\nRFQ or part serial number.","schema":{"type":"string"},"explode":false},{"name":"partId","in":"query","required":false,"description":"Only RFQs for this part.","schema":{"type":"string"},"explode":false},{"name":"excludeDrafts","in":"query","required":false,"description":"Omit RFQs still in DRAFT.","schema":{"type":"boolean"},"explode":false},{"name":"excludeExpired","in":"query","required":false,"description":"Omit RFQs whose expiry time has passed.","schema":{"type":"boolean"},"explode":false}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items","hasMore"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Rfq"},"description":"List of items."},"hasMore":{"type":"boolean","description":"Whether there are more items to fetch."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Rfq"]}},"/v1/rfqs/{id}":{"get":{"operationId":"getRfq","summary":"Get Rfq","description":"Get RFQ by id.","parameters":[{"name":"id","in":"path","required":true,"description":"Rfq id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Rfq"}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Rfq"]}},"/v1/rfqs/{id}/history":{"get":{"operationId":"listRfqHistory","summary":"List Rfq History","description":"List the recorded changes to an RFQ, newest first.\n\n**Beta.** This endpoint is still settling: its shape may change, including in ways that break an\nintegration built on it. It is exempt from the contract's breaking-change gate, so treat it as\nsomething to follow rather than to pin to. It will lose this notice when it stabilises.\n\nReadable by the consumer, the IP owner and any invited manufacturer — the same rule\n`GET /v1/rfqs/{id}` applies, so an RFQ the caller is not party to is not found.\n\nHistory reaches back to the day change capture was switched on and no further; an RFQ older\nthan that begins with a `BACKFILL` entry rather than a creation. Entries are never rewritten.\n\nTwo limits specific to RFQs are worth knowing. A deleted RFQ has no readable history, because\nthe record that establishes who was party to it is what the deletion removed. And the earliest\nentries were imported from a change feed that recorded RFQs without their quotes, so a change\nto `manufacturerIds` made before capture began may be missing from the list even though later\nones are present.\n\nWho made a change is deliberately not reported. The capture records the change, not the actor,\nand reporting an actor it does not hold would be worse than omitting one.","parameters":[{"name":"id","in":"path","required":true,"description":"Rfq id.","schema":{"type":"string"}},{"$ref":"#/components/parameters/PaginatedListProps.page"},{"$ref":"#/components/parameters/PaginatedListProps.pageSize"}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items","hasMore"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/HistoryEntry"},"description":"List of items."},"hasMore":{"type":"boolean","description":"Whether there are more items to fetch."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Rfq"],"x-stability-level":"beta"}},"/v1/roles":{"get":{"operationId":"listRoles","summary":"List Roles","description":"List the roles in the caller's organization, with pagination.\n\nWith `userId`, this is the user-to-role direction of the mapping: the roles\nthat one user holds. The opposite direction is `GET /v1/users?roleId=`.","parameters":[{"$ref":"#/components/parameters/PaginatedListProps.page"},{"$ref":"#/components/parameters/PaginatedListProps.pageSize"},{"name":"q","in":"query","required":false,"description":"Free-text search. Matches a case-insensitive substring of the role name.","schema":{"type":"string"},"explode":false},{"name":"userId","in":"query","required":false,"description":"Only roles held by this user — the user-to-role direction of the mapping.\n\nRequires organization administration, **unless** it is the caller's own user\nid: anyone may ask which roles they themselves hold.","schema":{"type":"string"},"explode":false},{"name":"permission","in":"query","required":false,"description":"Only roles granting this permission key, such as `part:create`.","schema":{"type":"string"},"explode":false}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items","hasMore"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Role"},"description":"List of items."},"hasMore":{"type":"boolean","description":"Whether there are more items to fetch."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Role"]}},"/v1/roles/{id}":{"get":{"operationId":"getRole","summary":"Get Role","description":"Get a role in the caller's organization by id.\n\nA role belonging to another organization is not found, identically to an id\nthat names nothing.","parameters":[{"name":"id","in":"path","required":true,"description":"Role id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Role"}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Role"]}},"/v1/standards":{"get":{"operationId":"listStandards","summary":"List Standards","description":"List standards.","parameters":[{"name":"governingBody","in":"query","required":false,"description":"Filter on governing body.","schema":{"type":"string"},"explode":false},{"name":"materialType","in":"query","required":false,"description":"Filter on material type.","schema":{"type":"string"},"explode":false}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Standard"},"description":"List of items."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Standard"]}},"/v1/standards/{code}":{"get":{"operationId":"getStandard","summary":"Get Standard","description":"Get standard by code.","parameters":[{"name":"code","in":"path","required":true,"description":"Standard code.","schema":{"type":"string"}}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Standard"}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Standard"]}},"/v1/standards:batch-get":{"post":{"operationId":"batchGetStandards","summary":"Batch Get Standards","description":"Batch get standards.","parameters":[],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Standard"},"description":"List of items."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Standard"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"codes":{"type":"array","items":{"type":"string"},"description":"List of standard codes to load."}},"required":["codes"]}}}}}},"/v1/technologies":{"get":{"operationId":"listTechnologies","summary":"List Technologies","description":"List technologies.","parameters":[{"$ref":"#/components/parameters/PaginatedListProps.page"},{"$ref":"#/components/parameters/PaginatedListProps.pageSize"},{"name":"productionProcessType","in":"query","required":false,"description":"Filter on production process type.","schema":{"type":"string"},"explode":false},{"name":"search","in":"query","required":false,"description":"Free-text match on the label, code or an acronym.","schema":{"type":"string"},"explode":false}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items","hasMore"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Technology"},"description":"List of items."},"hasMore":{"type":"boolean","description":"Whether there are more items to fetch."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Technology"]}},"/v1/technologies/{id}":{"get":{"operationId":"getTechnology","summary":"Get Technology","description":"Get technology by id.","parameters":[{"name":"id","in":"path","required":true,"description":"Technology id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Technology"}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Technology"]}},"/v1/technologies:batch-get":{"post":{"operationId":"batchGetTechnologies","summary":"Batch Get Technologies","description":"Batch get technologies.","parameters":[],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Technology"},"description":"List of items."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Technology"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"},"description":"List of technology ids to load."}},"required":["ids"]}}}}}},"/v1/unspsc-categories":{"get":{"operationId":"listUnspscCategories","summary":"List UNSPSC Categories","description":"List UNSPSC categories.","parameters":[{"$ref":"#/components/parameters/PaginatedListProps.page"},{"$ref":"#/components/parameters/PaginatedListProps.pageSize"},{"name":"level","in":"query","required":false,"description":"Filter on taxonomy depth.","schema":{"type":"integer","format":"int32"},"explode":false},{"name":"search","in":"query","required":false,"description":"Free-text match on the label or any of the segment, family, class and commodity numbers and\ntitles.","schema":{"type":"string"},"explode":false}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items","hasMore"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/UnspscCategory"},"description":"List of items."},"hasMore":{"type":"boolean","description":"Whether there are more items to fetch."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["UnspscCategory"]}},"/v1/unspsc-categories/{id}":{"get":{"operationId":"getUnspscCategory","summary":"Get UNSPSC Category","description":"Get UNSPSC category by id.","parameters":[{"name":"id","in":"path","required":true,"description":"Category id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnspscCategory"}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["UnspscCategory"]}},"/v1/unspsc-categories:batch-get":{"post":{"operationId":"batchGetUnspscCategories","summary":"Batch Get UNSPSC Categories","description":"Batch get UNSPSC categories.","parameters":[],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/UnspscCategory"},"description":"List of items."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["UnspscCategory"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"},"description":"List of category ids to load."}},"required":["ids"]}}}}}},"/v1/uploads":{"post":{"operationId":"createUploadUrl","summary":"Create Upload URL","description":"Create Upload URL for file.","parameters":[],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Upload"}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["Upload"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"File name."},"public":{"type":"boolean","description":"Whether the file is public.","default":false}},"required":["name","public"]}}}}}},"/v1/users":{"get":{"operationId":"listUsers","summary":"List Users","description":"List the users in the caller's organization, with pagination.\n\nThere is no cross-organization user search: the result is always scoped to the\ncaller's own organization.","parameters":[{"$ref":"#/components/parameters/PaginatedListProps.page"},{"$ref":"#/components/parameters/PaginatedListProps.pageSize"},{"name":"q","in":"query","required":false,"description":"Free-text search. Matches a case-insensitive substring of the email, the\ngiven name, the family name, or the full name as \"given family\".","schema":{"type":"string"},"explode":false},{"name":"active","in":"query","required":false,"description":"Filter by active flag. Omit for both.","schema":{"type":"boolean"},"explode":false},{"name":"admin","in":"query","required":false,"description":"Filter by administrator flag. Omit for both.\n\n**Administrators only** — a caller without organization administration\nreceives `403`, because it reports who holds administrative access.","schema":{"type":"boolean"},"explode":false},{"name":"permission","in":"query","required":false,"description":"Only users who hold this permission, through any of the organization's\nroles — \"who can create a part?\". Takes a permission key such as\n`part:create`.\n\n**Administrators only**, for the same reason as `admin`.","schema":{"type":"string"},"explode":false},{"name":"roleId","in":"query","required":false,"description":"Only users holding this role — the role-to-user direction of the mapping.\nThe opposite direction is `GET /v1/roles?userId=`.\n\n**Administrators only**: who holds a role is who holds its permissions.","schema":{"type":"string"},"explode":false}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"type":"object","required":["items","hasMore"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/User"},"description":"List of items."},"hasMore":{"type":"boolean","description":"Whether there are more items to fetch."}}}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["User"]}},"/v1/users/{id}":{"get":{"operationId":"getUser","summary":"Get User","description":"Get a user in the caller's organization by id.\n\nReturns the directory view to any caller. An administrator, and a caller\nfetching their own record, additionally receive `admin` and `phone`.","parameters":[{"name":"id","in":"path","required":true,"description":"User id.","schema":{"type":"string"}}],"responses":{"200":{"description":"The request has succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}},"default":{"description":"An unexpected error response.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"tags":["User"]}}},"security":[{"BearerAuth":[]}],"components":{"parameters":{"PaginatedListProps.page":{"name":"page","in":"query","required":false,"description":"Page number for pagination, starting at 1.","schema":{"type":"integer","format":"int32","minimum":1,"default":1},"explode":false},"PaginatedListProps.pageSize":{"name":"pageSize","in":"query","required":false,"description":"Page size for pagination.","schema":{"type":"integer","format":"int32","minimum":1,"maximum":50,"default":10},"explode":false}},"schemas":{"AuditActor":{"type":"object","required":["id","email"],"properties":{"id":{"type":"string","description":"User id of the actor. Always a user in the caller's own organization."},"email":{"type":"string","description":"Email address of the actor."},"name":{"type":"string","description":"Full name of the actor, when one is recorded."}},"description":"Who performed an audited action.\n\nThis is the identity every domain table records — during an impersonation it is the\n*impersonated* user, not the person operating the session. When `impersonation` is present on\nthe entry, read this field together with it."},"AuditImpersonation":{"type":"object","required":["grantId","actingEmail","reason"],"properties":{"grantId":{"type":"string","description":"Id of the impersonation grant the session was operating under."},"actingEmail":{"type":"string","description":"Address the grant link was sent to — the closest thing to a verified\nidentity for the person actually at the keyboard."},"reason":{"type":"string","description":"Reason recorded when the grant was created."},"grantedByEmail":{"type":"string","description":"Email of the account owner who authorized the grant, when still resolvable."}},"description":"Present only on entries written while somebody was impersonating another user. Without it such\nan entry reads as something the actor did themselves, which is exactly wrong."},"AuditImpersonationDetail":{"type":"object","properties":{"redeemedTime":{"type":"string","format":"date-time","description":"When the grant link was redeemed."},"redeemedIp":{"type":"string","description":"IP address the grant was redeemed from."},"expireTime":{"type":"string","format":"date-time","description":"When the grant expires or expired."},"revokedTime":{"type":"string","format":"date-time","description":"When the grant was revoked, if it was."}},"description":"Facts about the grant that are worth reading on one entry but too much for a list."},"AuditLogEntry":{"type":"object","required":["id","timestamp","procedure","success","actor"],"properties":{"id":{"type":"string","description":"Entry id."},"timestamp":{"type":"string","format":"date-time","description":"When the action was performed."},"procedure":{"type":"string","description":"Name of the audited action, such as `signedIn` or the server procedure that\nran."},"success":{"type":"boolean","description":"Whether the action succeeded. A refused attempt is recorded, not dropped."},"error":{"type":"string","description":"Why the action was refused. Present only when `success` is false."},"ipAddress":{"type":"string","description":"IP address the action came from, when it could be resolved."},"actor":{"$ref":"#/components/schemas/AuditActor","description":"Who performed the action."},"impersonation":{"$ref":"#/components/schemas/AuditImpersonation","description":"Set when the action was performed under an impersonation grant."}},"description":"One audited action in the caller's organization.\n\nThe audit log is **always** scoped to the caller's own organization. There is no parameter for\nanother one, and no endpoint that crosses organizations."},"AuditLogEntryDetail":{"type":"object","required":["id","timestamp","procedure","success","actor"],"properties":{"id":{"type":"string","description":"Entry id."},"timestamp":{"type":"string","format":"date-time","description":"When the action was performed."},"procedure":{"type":"string","description":"Name of the audited action, such as `signedIn` or the server procedure that\nran."},"success":{"type":"boolean","description":"Whether the action succeeded. A refused attempt is recorded, not dropped."},"error":{"type":"string","description":"Why the action was refused. Present only when `success` is false."},"ipAddress":{"type":"string","description":"IP address the action came from, when it could be resolved."},"actor":{"$ref":"#/components/schemas/AuditActor","description":"Who performed the action."},"impersonation":{"$ref":"#/components/schemas/AuditImpersonation","description":"Set when the action was performed under an impersonation grant."},"userAgent":{"type":"string","description":"Client user agent, when one was recorded."},"request":{"description":"The validated input the action ran with, redacted when it was stored — the\nonly place to see WHAT changed rather than only that something did.\n\nShape varies by `procedure`."},"impersonationDetail":{"$ref":"#/components/schemas/AuditImpersonationDetail","description":"Further detail about the impersonation grant. Present only for an\nimpersonated entry."}},"description":"One audit log entry with the fuller record `GET /v1/audit-log/{id}` adds.\n\nA separate model rather than optional fields on `AuditLogEntry`: which fields you get is\ndecided by the endpoint, not by the data, so the two shapes are two types. A reader of the list\nschema should not have to be told in prose that three of its fields never arrive."},"BoundingBox":{"type":"object","properties":{"x":{"type":"number","format":"double","description":"X dimension."},"y":{"type":"number","format":"double","description":"Y dimension."},"z":{"type":"number","format":"double","description":"Z dimension."}},"description":"Bounding box dimensions."},"Category":{"type":"object","required":["id","name"],"properties":{"id":{"type":"string","description":"Category id."},"name":{"type":"string","description":"Category name."},"description":{"type":"string","description":"Category description."},"parentId":{"type":"string","description":"Parent category id."}}},"ChangeKind":{"type":"string","enum":["INSERT","UPDATE","DELETE","BACKFILL"],"description":"What kind of change a history entry records.\n\nEvery `/history` endpoint reports the same four, whatever it is the history of."},"CreatePartResponse":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"ID of the created part."}}},"Criticality":{"type":"object","required":["id","code","name","governingBody"],"properties":{"id":{"type":"string","description":"Criticality id."},"code":{"type":"string","description":"Criticality code."},"name":{"type":"string","description":"Criticality name."},"governingBody":{"type":"string","description":"Governing body."}}},"Currency":{"type":"string","enum":["NOK","EUR","USD","JPY","SGD"]},"CustomFieldInput":{"type":"object","required":["dropdownId","selectedOptionIds"],"properties":{"dropdownId":{"type":"string","description":"Dropdown id."},"selectedOptionIds":{"type":"array","items":{"type":"string"},"description":"IDs of the options to select."}},"description":"Input for setting custom dropdown selections when creating a part."},"CustomFieldOption":{"type":"object","required":["id","label","value"],"properties":{"id":{"type":"string","description":"Option id."},"label":{"type":"string","description":"Display label."},"value":{"type":"string","description":"Machine-readable value."}},"description":"A single option within a custom dropdown."},"CustomFieldSelection":{"type":"object","required":["dropdownId","dropdownLabel","multiselect","selectedOptions"],"properties":{"dropdownId":{"type":"string","description":"Dropdown id."},"dropdownLabel":{"type":"string","description":"Dropdown display label."},"multiselect":{"type":"boolean","description":"Whether the dropdown allows multiple selections."},"selectedOptions":{"type":"array","items":{"$ref":"#/components/schemas/CustomFieldOption"},"description":"The options currently selected for this part."}},"description":"A custom dropdown with its currently selected options for a part."},"Dimensions":{"type":"object","properties":{"angle":{"type":"number","format":"double","description":"Angle."},"depth":{"type":"number","format":"double","description":"Depth."},"width":{"type":"number","format":"double","description":"Width."},"height":{"type":"number","format":"double","description":"Height."},"length":{"type":"number","format":"double","description":"Length."},"radius":{"type":"number","format":"double","description":"Radius."},"volume":{"type":"number","format":"double","description":"Volume."},"weight":{"type":"number","format":"double","description":"Weight."},"tolerance":{"type":"number","format":"double","description":"Tolerance."},"threadSize":{"type":"number","format":"double","description":"Thread size."},"chamferSize":{"type":"number","format":"double","description":"Chamfer size."},"surfaceArea":{"type":"number","format":"double","description":"Surface area."},"filletRadius":{"type":"number","format":"double","description":"Fillet radius."},"holeDiameter":{"type":"number","format":"double","description":"Hole diameter."},"innerDiameter":{"type":"number","format":"double","description":"Inner diameter."},"outerDiameter":{"type":"number","format":"double","description":"Outer diameter."},"wallThickness":{"type":"number","format":"double","description":"Wall thickness."},"holeChamferSize":{"type":"number","format":"double","description":"Hole chamfer size."}},"description":"Geometric dimensions extracted from the part. Absent values are omitted."},"Error":{"type":"object","required":["status","message"],"properties":{"status":{"type":"integer"},"message":{"type":"string"}}},"Factory":{"type":"object","required":["id","name","orgId","active","internal"],"properties":{"id":{"type":"string","description":"Factory id."},"name":{"type":"string","description":"Factory name."},"orgId":{"type":"string","description":"Organization id of the manufacturer that owns the factory."},"orgName":{"type":"string","description":"Name of the organization that owns the factory."},"active":{"type":"boolean","description":"Whether the factory is currently active. An inactive factory cannot be\nquoted against."},"internal":{"type":"boolean","description":"Whether the factory is internal to its owning organization. Internal\nfactories are never part of the cross-organization consumer catalog."},"address":{"$ref":"#/components/schemas/FactoryAddress","description":"Postal address, when one is recorded."},"geoLocation":{"$ref":"#/components/schemas/FactoryGeoLocation","description":"Geographic coordinates, when both are recorded."}}},"FactoryAddress":{"type":"object","properties":{"addressLines":{"type":"array","items":{"type":"string"},"description":"Street address lines."},"locality":{"type":"string","description":"City or town."},"province":{"type":"string","description":"State, province or region name."},"postalCode":{"type":"string","description":"Postal or ZIP code."},"regionCode":{"type":"string","description":"CLDR region code of the country, e.g. `NO`, `DE`. This is what the\n`regionCode` list filter matches on."}},"description":"Postal address of a factory. Every field is optional — the underlying column is\nfree-form JSON and older rows fill in only part of it."},"FactoryGeoLocation":{"type":"object","required":["latitude","longitude"],"properties":{"latitude":{"type":"number","format":"double","description":"Latitude in decimal degrees."},"longitude":{"type":"number","format":"double","description":"Longitude in decimal degrees."}},"description":"Latitude/longitude of a factory. Absent unless both coordinates are set."},"FieldChange":{"type":"object","required":["field"],"properties":{"field":{"type":"string","description":"Field that changed, e.g. `state`, `leadTimeDays` or `cost.totalPrice`."},"from":{"description":"Value before the change."},"to":{"description":"Value after the change."}},"description":"One field that changed, named as this API names it.\n\n`from` and `to` carry the field's value on each side of the change, in the shape the resource's\nown model uses — an enumerated value is the same uppercase vocabulary here that it is there,\nand a nested field is addressed with a dot, as `cost.totalPrice`. Either side is absent when\nthe field had no value then."},"File":{"type":"object","required":["id","name","path","container","group","url","size","type"],"properties":{"id":{"type":"string","description":"File id."},"name":{"type":"string","description":"File name."},"path":{"type":"string","description":"Path of file."},"container":{"type":"string","description":"Container of file."},"group":{"type":"string","description":"Group of file."},"url":{"type":"string","description":"File url."},"signedUrl":{"type":"string","description":"Signed url of file."},"signedDownloadUrl":{"type":"string","description":"Signed download url of file."},"size":{"type":"integer","description":"Size of file in bytes."},"type":{"type":"string","description":"Type of file."},"isPreview":{"type":"boolean","description":"Whether this file is the selected preview for its resource."}}},"HistoryEntry":{"type":"object","required":["changedAt","kind","changes"],"properties":{"changedAt":{"type":"string","format":"date-time","description":"When the change was made."},"kind":{"$ref":"#/components/schemas/ChangeKind","description":"What kind of change this is."},"changes":{"type":"array","items":{"$ref":"#/components/schemas/FieldChange"},"description":"The fields that changed, empty for a creation or a removal — there is no other version to\ncompare against.\n\n**Only fields this API publishes appear here.** Changes are recorded as whole rows, and a row\nroutinely carries values no single caller may read — the other side's figures on a mediated\ncommercial arrangement, addresses, payment terms, internal notes. Entries are therefore\nnarrowed to the resource's own model *as this caller sees it*, so a `/history` endpoint can\nnever show a field its `GET` would have withheld.\n\nA consequence worth expecting: a change that touched only fields outside the model is not\nlisted at all. This is the history of the resource **as published**, not of every write the\nplatform made to it."}},"description":"One recorded change to a resource, as returned by every `/history` endpoint."},"ImportPartFileResponse":{"type":"object","required":["fileId"],"properties":{"fileId":{"type":"string","description":"Imported file ID."}}},"Material":{"type":"object","required":["code","name","type"],"properties":{"code":{"type":"string","description":"Material code."},"name":{"type":"string","description":"Material name."},"type":{"type":"string","description":"Material type."}}},"MetadataResponse":{"type":"object","required":["data"],"properties":{"data":{"type":"object","unevaluatedProperties":{"type":"string"},"description":"Metadata data."}}},"Offer":{"type":"object","required":["id","serialId","state","createdTime","modifiedTime","consumerId","manufacturerId","factoryId","partId"],"properties":{"id":{"type":"string","description":"Offer id."},"serialId":{"type":"string","description":"Human-readable offer number, unique per platform."},"state":{"$ref":"#/components/schemas/OfferState","description":"Lifecycle state."},"title":{"type":"string","description":"Offer title."},"createdTime":{"type":"string","format":"date-time","description":"When the offer was created."},"modifiedTime":{"type":"string","format":"date-time","description":"When the offer was last modified."},"expireTime":{"type":"string","format":"date-time","description":"When the offer expires, if it does."},"description":{"type":"string","description":"Offer description."},"consumerId":{"type":"string","description":"Consumer organization id."},"manufacturerId":{"type":"string","description":"Manufacturer organization id."},"factoryId":{"type":"string","description":"Factory id."},"partId":{"type":"string","description":"Part id this offer is for."},"rfqId":{"type":"string","description":"Rfq id this offer responds to."},"currency":{"$ref":"#/components/schemas/Currency","description":"Currency of the offer."},"itemsInUnit":{"type":"integer","format":"int32","description":"Number of items per unit."},"priceMatrix":{"type":"array","items":{"$ref":"#/components/schemas/PriceEntry"},"description":"Tiered price matrix."},"shippingPrice":{"type":"number","format":"double","description":"Shipping price."},"frameworkNumber":{"type":"string","description":"Framework agreement number."}}},"OfferState":{"type":"string","enum":["DRAFT","SUGGESTED","ACCEPTED","DECLINED","REJECTED"],"description":"Lifecycle state of an offer. Mirrors the `Offer.state` CHECK constraint, uppercased."},"Order":{"type":"object","required":["id","serialId","state","engagementType","partId","factoryId","consumerId","ipOwnerId","manufacturerId","sellerId","numUnits","itemsInUnit","totalNumItems","leadTimeDays","createdTime","modifiedTime"],"properties":{"id":{"type":"string","description":"Order id."},"serialId":{"type":"integer","format":"int32","description":"Human-readable order number."},"state":{"$ref":"#/components/schemas/OrderState","description":"Where the order is in its lifecycle."},"orderType":{"type":"string","description":"How the order came about, e.g. `RFQ` or `OEM_CENTRIC`."},"engagementType":{"type":"string","description":"Commercial engagement, e.g. `DISTRIBUTOR`. Decides whether a mark-up applies at all."},"partId":{"type":"string","description":"The part being ordered."},"factoryId":{"type":"string","description":"Factory the order is placed with."},"offerId":{"type":"string","description":"The quote this order was raised from, when there was one."},"consumerId":{"type":"string","description":"Organisation buying."},"ipOwnerId":{"type":"string","description":"Organisation owning the part's IP."},"manufacturerId":{"type":"string","description":"Organisation manufacturing."},"sellerId":{"type":"string","description":"Organisation selling."},"distributorId":{"type":"string","description":"Organisation mediating, on a distributor engagement."},"numUnits":{"type":"integer","format":"int32","description":"Units ordered."},"itemsInUnit":{"type":"integer","format":"int32","description":"Items per unit."},"totalNumItems":{"type":"integer","format":"int32","description":"Items ordered in total."},"leadTimeDays":{"type":"integer","format":"int32","description":"Quoted lead time in days."},"confirmedProductionTime":{"type":"string","format":"date-time","description":"When production was confirmed, once it has been."},"externalRef":{"type":"string","description":"Caller-supplied external reference."},"createdTime":{"type":"string","format":"date-time"},"modifiedTime":{"type":"string","format":"date-time"},"cost":{"$ref":"#/components/schemas/OrderCost","description":"Cost from the caller's side. Omitted when the caller's role carries no cost perspective."}}},"OrderCost":{"type":"object","required":["currency","price","engineeringPrice","orderHandlingFee","shippingPrice","vatPercent","vatPrice","totalPrice"],"properties":{"currency":{"type":"string","description":"ISO currency code these figures are in."},"price":{"type":"number","format":"double","description":"Production price, excluding fee, shipping and VAT."},"engineeringPrice":{"type":"number","format":"double","description":"Engineering price."},"orderHandlingFee":{"type":"number","format":"double","description":"Order handling fee."},"shippingPrice":{"type":"number","format":"double","description":"Shipping price."},"vatPercent":{"type":"number","format":"double","description":"VAT rate applied, as a percentage."},"vatPrice":{"type":"number","format":"double","description":"VAT amount."},"totalPrice":{"type":"number","format":"double","description":"Grand total, including VAT."},"consumerTotalPrice":{"type":"number","format":"double","description":"What the CONSUMER pays in total. Present only for the distributor of the order — it is half\nof their own margin, and nobody else's business."},"manufacturerTotalPrice":{"type":"number","format":"double","description":"What the MANUFACTURER is paid in total. Present only for the distributor of the order."}},"description":"What this order costs, from the CALLER's side of it.\n\nWhich figures these are depends on the caller's role, and that is the point rather than a\ndetail. On a distributor-mediated order the consumer pays a marked-up price and the\nmanufacturer is paid the base one; the difference is the distributor's margin. So the consumer\nand the IP owner see the marked-up figures, the manufacturer sees the base ones, and neither\ncan derive the other's. The distributor sees both, because the margin is theirs.\n\nAbsent entirely when the caller holds no role that carries a cost perspective."},"OrderState":{"type":"string","enum":["OPEN","CONFIRMED","PRODUCTION","SHIPPING","GOODS_RECEIVED","CLOSED"]},"Org":{"type":"object","required":["id","name","roles","createdTime","modifiedTime"],"properties":{"id":{"type":"string","description":"Organization id."},"name":{"type":"string","description":"Name of organization."},"country":{"type":"string","description":"Country of the organization."},"orgNumber":{"type":"string","description":"Country specific organization number."},"logoUrl":{"type":"string","description":"Logo url of the organization."},"roles":{"type":"array","items":{"$ref":"#/components/schemas/OrgRole"},"description":"Organization roles in the platform."},"createdTime":{"type":"string","format":"date-time","description":"Time when the part was created."},"modifiedTime":{"type":"string","format":"date-time","description":"Time when the part was modified."}}},"OrgRole":{"type":"string","enum":["CONSUMER","IP_OWNER","MANUFACTURER","SERVICE_PROVIDER","DISTRIBUTOR"]},"Part":{"type":"object","required":["id","title","serialId","ipOwnerId","internal","published","requireSubscription","keywords","createdTime","modifiedTime","customFields"],"properties":{"id":{"type":"string","description":"Part id."},"parentId":{"type":"string","description":"Part parent id (if versioned)."},"title":{"type":"string","description":"Title of the part."},"versionName":{"type":"string","description":"Version name of the part."},"serialId":{"type":"string","description":"Part serial id."},"ipOwnerId":{"type":"string","description":"IP owner organization id."},"internal":{"type":"boolean","description":"Whether the part is internal."},"externalRef":{"type":"string","description":"External reference for the part."},"description":{"type":"string","description":"Description of the part."},"published":{"type":"boolean","description":"Whether the part is published."},"requireSubscription":{"type":"boolean","description":"Whether the part requires a subscription."},"keywords":{"type":"array","items":{"type":"string"},"description":"Keywords of the part."},"createdTime":{"type":"string","format":"date-time","description":"Time when the part was created."},"modifiedTime":{"type":"string","format":"date-time","description":"Time when the part was modified."},"processId":{"type":"string","description":"Process id of the part."},"materialId":{"type":"string","description":"Material id of the part."},"standardIds":{"type":"array","items":{"type":"string"},"description":"Standard ids."},"criticalityIds":{"type":"array","items":{"type":"string"},"description":"Criticality ids."},"productionProcessType":{"type":"string","description":"Production process family this part belongs to: `additive_manufacturing`,\n`cnc` or `rapid_casting`.\n\nThis and `technologyIds` are the CURRENT manufacturing taxonomy; `processId`\nabove is the legacy vocabulary it replaced. Use these two to find factories\nthat can make the part — see `GET /v1/factories?partId=`."},"technologyIds":{"type":"array","items":{"type":"string"},"description":"Technology nodes selected for this part, as ids.\n\nA selection stores the chosen node **and its whole ancestor chain**, so two\nparts sharing any element are somewhere on the same branch of the taxonomy.\nThat is what factory matching compares against."},"categoryIds":{"type":"array","items":{"type":"string"},"description":"Category ids."},"unspscCategoryIds":{"type":"array","items":{"type":"string"},"description":"UNSPSC category ids."},"dimensions":{"$ref":"#/components/schemas/Dimensions","description":"Physical dimensions of the part."},"boundingBox":{"$ref":"#/components/schemas/BoundingBox","description":"Bounding box measures (x/y/z)."},"customFields":{"type":"array","items":{"$ref":"#/components/schemas/CustomFieldSelection"},"description":"Custom dropdown selections for this part.\nPopulated only for parts owned by the caller's organisation;\nempty for other organisations' parts."}}},"PriceEntry":{"type":"object","required":["unitFrom","unitTo","pricePerUnit","leadTimeDays"],"properties":{"unitFrom":{"type":"integer","format":"int32","description":"Lower bound of the unit range (inclusive)."},"unitTo":{"type":"integer","format":"int32","description":"Upper bound of the unit range (inclusive)."},"pricePerUnit":{"type":"number","format":"double","description":"Price per unit."},"leadTimeDays":{"type":"integer","format":"int32","description":"Lead time in days."},"orderFee":{"type":"number","format":"double","description":"Order fee."}}},"Process":{"type":"object","required":["code","name","materialType"],"properties":{"code":{"type":"string","description":"Process code."},"name":{"type":"string","description":"Process name."},"materialType":{"type":"string","description":"Material type."}}},"Rfq":{"type":"object","required":["id","serialId","consumerId","ipOwnerId","manufacturerIds","state","partId","createdTime","modifiedTime","closed"],"properties":{"id":{"type":"string","description":"Rfq id."},"serialId":{"type":"string","description":"Human-readable RFQ number, unique per platform. This is what\n`GET /v1/rfqs?q=` matches an exact numeric search against."},"consumerId":{"type":"string","description":"Organization buying — the party that raised the RFQ."},"ipOwnerId":{"type":"string","description":"Organization that owns the part's design."},"manufacturerIds":{"type":"array","items":{"type":"string"},"description":"Organizations invited to quote."},"state":{"$ref":"#/components/schemas/RfqState","description":"State of the RFQ."},"partId":{"type":"string","description":"Part id this RFQ is for."},"quantity":{"type":"integer","format":"int32","description":"Requested quantity."},"maxLeadTime":{"type":"integer","format":"int32","description":"Maximum lead time in days."},"deadlineTime":{"type":"string","format":"date-time","description":"Deadline for offers."},"expireTime":{"type":"string","format":"date-time","description":"Time when the RFQ expires."},"createdTime":{"type":"string","format":"date-time","description":"When the RFQ was created."},"modifiedTime":{"type":"string","format":"date-time","description":"When the RFQ was last modified."},"issuedTime":{"type":"string","format":"date-time","description":"When the RFQ was issued to manufacturers, if it has been."},"closed":{"type":"boolean","description":"Whether the RFQ has been closed. Distinct from `state`: a closed RFQ keeps\nwhichever state it reached."},"note":{"type":"string","description":"Free-text note from the consumer."},"currency":{"$ref":"#/components/schemas/Currency","description":"Currency the RFQ is priced in."},"externalRef":{"type":"string","description":"The consumer's own reference for this RFQ."}}},"RfqState":{"type":"string","enum":["DRAFT","ONGOING","RESPONDED","REVIEW","UNFULFILLED","SUCCESSFUL","QUOTE_RECEIVED"]},"Role":{"type":"object","required":["id","orgId","name","permissions","userCount"],"properties":{"id":{"type":"string","description":"Role id."},"orgId":{"type":"string","description":"Organization the role belongs to. Always the caller's own organization."},"name":{"type":"string","description":"Role name."},"permissions":{"type":"array","items":{"type":"string"},"description":"Permission keys the role grants, such as `part:create`.\n\n`app:admin` never appears here: it is held through the user account rather\nthan through a role, so a role cannot grant it."},"userCount":{"type":"integer","format":"int32","description":"How many users in the organization hold this role.\n\nA count, not identities — use `GET /v1/users?roleId=` for those."}},"description":"A role in the caller's organization, and the permissions it grants.\n\nRoles are never returned across organizations. The role catalog itself — names and the\npermissions they carry — is readable by any member of the organization; who *holds* a role is\nnot, and needs organization administration. See `GET /v1/roles` and `GET /v1/users`."},"Standard":{"type":"object","required":["code","name","governingBody","materialType"],"properties":{"code":{"type":"string","description":"Standard code."},"name":{"type":"string","description":"Standard name."},"governingBody":{"type":"string","description":"Governing body."},"materialType":{"type":"string","description":"Material type."}}},"Technology":{"type":"object","required":["id","code","label","acronyms","productionProcessType","parentId","pathLabels"],"properties":{"id":{"type":"string","description":"Technology id. This is what `Part.technologyIds` contains."},"code":{"type":"string","description":"Technology code. NOT unique — two nodes may share one."},"label":{"type":"string","description":"Human-readable name."},"acronyms":{"type":"array","items":{"type":"string"},"description":"Alternative short forms, e.g. `LPBF`. Empty when there are none."},"productionProcessType":{"type":"string","description":"The production process type this technology belongs to."},"parentId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parent technology, or null for a root of the tree."},"pathLabels":{"type":"array","items":{"type":"string"},"description":"Labels from the root down to and including this node."}},"description":"A manufacturing technology, e.g. Laser Powder Bed Fusion.\n\nGlobal reference data: the catalog is the same for every organisation. `Part.technologyIds`\nholds ids from here, which is what this resource exists to resolve.\n\nThe catalog is a TREE — `parentId` and `pathLabels` place a node in it. A caller showing a\ntechnology usually wants its ancestry too (\"Additive Manufacturing › Powder Bed Fusion › LPBF\"),\nand `pathLabels` carries that without a second request per level."},"UnitSystem":{"type":"string","enum":["METRIC","IMPERIAL"]},"UnspscCategory":{"type":"object","required":["id","code","label","level","parentId"],"properties":{"id":{"type":"string","description":"Category id. This is what `Part.unspscCategoryIds` contains."},"code":{"type":"string","description":"The most specific UNSPSC number this category carries — its commodity number where it has\none, otherwise its class, family or segment number."},"label":{"type":"string","description":"Human-readable name."},"level":{"type":"integer","format":"int32","description":"Depth in the taxonomy: segment, family, class, then commodity."},"parentId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Parent category, or null for a segment."}},"description":"A UNSPSC classification category.\n\nGlobal reference data, and a four-level tree: segment › family › class › commodity, which is\nwhat `level` counts. `Part.unspscCategoryIds` holds ids from here, which is what this resource\nexists to resolve."},"UpdateFilesRequest":{"type":"object","properties":{"add":{"type":"array","items":{"type":"object","properties":{"group":{"type":"string","description":"Group to add to."},"uploadId":{"type":"string","description":"Upload file id."}},"required":["group","uploadId"]},"description":"List of files to add."},"remove":{"type":"array","items":{"type":"string"},"description":"List of file ids to remove."}}},"Upload":{"type":"object","required":["id","method","signedUrl","expireTime","headers"],"properties":{"id":{"type":"string","description":"Upload id."},"method":{"type":"string","description":"HTTP method for uploading file."},"signedUrl":{"type":"string","description":"Signed URL. Used to upload file."},"expireTime":{"type":"string","format":"date-time","description":"Expire time of the signed URL."},"headers":{"type":"object","unevaluatedProperties":{"type":"string"},"description":"HTTP headers for uploading file."}}},"User":{"type":"object","required":["id","orgId","email","active"],"properties":{"id":{"type":"string","description":"User id."},"orgId":{"type":"string","description":"Organization the user belongs to. Always the caller's own organization."},"email":{"type":"string","description":"Email address."},"firstName":{"type":"string","description":"Given name, when recorded."},"lastName":{"type":"string","description":"Family name, when recorded."},"avatarUrl":{"type":"string","description":"Avatar image URL, when one is set."},"active":{"type":"boolean","description":"Whether the account is active. A deactivated user cannot sign in and is not\nassignable, but is kept so existing records still resolve to a person."},"admin":{"type":"boolean","description":"Whether the user administers the organization.\n\nOnly present for a caller who is an administrator, or for the caller's own\nrecord. Absent otherwise — absence means \"not disclosed\", not `false`."},"phone":{"type":"string","description":"Phone number, when recorded.\n\nOnly present for a caller who is an administrator, or for the caller's own\nrecord."}},"description":"A user in the caller's organization.\n\nUsers are never returned across organizations: every endpoint here is scoped to the caller's\nown, and an id belonging to another one is not found.\n\n`admin` and `phone` are **administrative** fields and are present only when the caller is an\nadministrator of the organization, or when the user is the caller themselves. Everything else\nis the directory view every member of an organization can already see."}},"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"Token"}}},"servers":[{"url":"https://api-plrnou.bunnyenv.com","description":"This server"}]}