Skip to content

Projects and actions

Base URL: https://app.trymaglev.com/api/v1. All endpoint families.

Publication review: the September 22 deployed contract and matching source require a stored owner approval for the exact recipients, file hashes and terms. The API proposes the review; the owner decides in their signed-in workspace. CLI0.6.14/MCP0.2.14 supply supplier reads and bounded quote observation, not a dedicated publication-approval tool. Follow disclosure review and distinguish these endpoints from real supplier execution acceptance.

Open a project: the thing being built and the batch it is at.

Save a project brief. Defaults to first_batch and markets US. Creation does not support idempotency keys. Strings are trimmed before validation; intake must serialize to at most 8192 characters; maximum body size is 12000 bytes.

Required scope: projects:write.

Authentication: bearer key.

Field Type Required Details
name string Yes Min length 1. Max length 120
product string or null No
category string or null No
targetQuantity integer or null No
stage string No One of: prototype, first_batch, second_batch, later. Default: “first_batch”
markets string[] No Max items 20. Default: [“US”]
intake object No At most 8192 serialized characters. Updates replace the whole object.. Default: {}
201 response schema
{
"type": "object",
"properties": {
"project": {
"$ref": "#/components/schemas/Project"
},
"note": {
"type": "string"
},
"requestId": {
"type": "string"
}
},
"required": [
"project",
"note",
"requestId"
]
}

Errors: 400 Invalid input or missing idempotency header; 401 Invalid key or missing sign-in; 403 Insufficient access; 429 Rate limit reached; 500 Server failure. See recovery guidance.

Your newest 50 projects. Count is the number returned; no pagination is currently exposed.

Returns at most the newest 50 projects. Count is the number returned, not the total saved. This endpoint currently has no pagination.

Required scope: projects:write.

Authentication: bearer key.

200 response schema
{
"type": "object",
"properties": {
"projects": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Project"
}
},
"count": {
"type": "integer"
},
"requestId": {
"type": "string"
}
},
"required": [
"projects",
"count",
"requestId"
]
}

Errors: 401 Invalid key or missing sign-in; 403 Insufficient access; 429 Rate limit reached; 500 Server failure. See recovery guidance.

One project with action counts by status.

Required scope: projects:write.

Authentication: bearer key.

Parameter Location Required Details
id path Yes
200 response schema
{
"type": "object",
"properties": {
"project": {
"$ref": "#/components/schemas/Project"
},
"actions": {
"type": "object",
"properties": {
"total": {
"type": "integer"
},
"byStatus": {
"type": "object",
"additionalProperties": {
"type": "integer"
}
}
},
"required": [
"total",
"byStatus"
]
},
"requestId": {
"type": "string"
}
},
"required": [
"project",
"actions",
"requestId"
]
}

Errors: 400 Invalid input or missing idempotency header; 401 Invalid key or missing sign-in; 403 Insufficient access; 404 Endpoint or record unavailable; 429 Rate limit reached; 500 Server failure. See recovery guidance.

Update project fields. Intake replaces the whole object; structured intent edits require expectedContextVersion.

Update at least one supported project field. Intake replaces the whole object. Strings are trimmed before validation; intake must serialize to at most 8192 characters; maximum body size is 12000 bytes. Supply expectedContextVersion from the current project. It is required for manufacturing-intent updates; changed context returns 409.

Required scope: projects:write.

Authentication: bearer key.

Parameter Location Required Details
id path Yes
Field Type Required Details
name string No Min length 1. Max length 120
product string or null No
category string or null No
targetQuantity integer or null No
stage string No One of: prototype, first_batch, second_batch, later
markets string[] No Max items 20
intake object No At most 8192 serialized characters. Updates replace the whole object.
200 response schema
{
"type": "object",
"properties": {
"project": {
"$ref": "#/components/schemas/Project"
},
"requestId": {
"type": "string"
}
},
"required": [
"project",
"requestId"
]
}

Errors: 400 Invalid input or missing idempotency header; 401 Invalid key or missing sign-in; 403 Insufficient access; 404 Endpoint or record unavailable; 429 Rate limit reached; 500 Server failure. See recovery guidance.

The newest 100 actions on a project, each paired with delivery summaries. No pagination is currently exposed.

Returns at most the newest 100 actions for a project, each as an action/deliveries entry. Count is the number returned. Delivery entries are summaries; use GET /deliveries/{id} for message bodies. No pagination is currently exposed.

Required scope: projects:write.

Authentication: bearer key.

Parameter Location Required Details
id path Yes
200 response schema
{
"type": "object",
"properties": {
"actions": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ActionListEntry"
}
},
"count": {
"type": "integer"
},
"draft": {
"const": true
},
"requestId": {
"type": "string"
}
},
"required": [
"actions",
"count",
"draft",
"requestId"
]
}

Errors: 400 Invalid input or missing idempotency header; 401 Invalid key or missing sign-in; 403 Insufficient access; 404 Endpoint or record unavailable; 429 Rate limit reached; 500 Server failure. See recovery guidance.

Request an action along the lifecycle. Available kinds return drafts; coordinated kinds create work items. Delivery drafts wait for approval.

Save and run a supported action. New requests return 201; an identical replay with the original idempotency key returns 200, including running and failed records. Output is a draft; delivery drafts require approval. A lost response does not prove failure.

Required scope: actions:write.

Authentication: bearer key.

Parameter Location Required Details
id path Yes
Idempotency-Key header Yes 8 to 120 characters, unique per request; replays return the original action
Field Type Required Details
kind string Yes One of GET /actions/kinds. Min length 1. Max length 80
input object No Default: {}
200 response schema
{
"type": "object",
"properties": {
"action": {
"$ref": "#/components/schemas/Action"
},
"deliveries": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DeliverySummary"
}
},
"task": {
"anyOf": [
{
"$ref": "#/components/schemas/TaskSummary"
},
{
"type": "null"
}
]
},
"draft": {
"const": true
},
"note": {
"type": "string"
},
"replayed": {
"type": "boolean"
},
"next": {
"type": "string"
},
"requestId": {
"type": "string"
}
},
"required": [
"action",
"deliveries",
"task",
"draft",
"note",
"replayed",
"next",
"requestId"
]
}
201 response schema
{
"type": "object",
"properties": {
"action": {
"$ref": "#/components/schemas/Action"
},
"deliveries": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DeliverySummary"
}
},
"task": {
"anyOf": [
{
"$ref": "#/components/schemas/TaskSummary"
},
{
"type": "null"
}
]
},
"draft": {
"const": true
},
"note": {
"type": "string"
},
"replayed": {
"type": "boolean"
},
"next": {
"type": "string"
},
"requestId": {
"type": "string"
}
},
"required": [
"action",
"deliveries",
"task",
"draft",
"note",
"replayed",
"next",
"requestId"
]
}

Errors: 400 Invalid input or missing idempotency header; 401 Invalid key or missing sign-in; 403 Insufficient access; 404 Endpoint or record unavailable; 409 Version, publication or idempotency conflict; 429 Rate limit reached; 500 Server failure; 502 Action generation failed; 503 Dependency temporarily unavailable. See recovery guidance.

Your newest 100 matching actions across projects, each paired with delivery summaries. No pagination is currently exposed.

Returns at most the newest 100 matching actions, each as an action/deliveries entry. Count is the number returned. No pagination is currently exposed.

Required scope: actions:write.

Authentication: bearer key.

Parameter Location Required Details
projectId query No
status query No
200 response schema
{
"type": "object",
"properties": {
"actions": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ActionListEntry"
}
},
"count": {
"type": "integer"
},
"draft": {
"const": true
},
"requestId": {
"type": "string"
}
},
"required": [
"actions",
"count",
"draft",
"requestId"
]
}

Errors: 400 Invalid input or missing idempotency header; 401 Invalid key or missing sign-in; 403 Insufficient access; 429 Rate limit reached; 500 Server failure. See recovery guidance.

One action with its output.

Returns an action, delivery summaries and an optional coordination task summary. The kind-specific output is at action.output.result when output is present. Use GET /deliveries/{id} for message bodies.

Required scope: actions:write.

Authentication: bearer key.

Parameter Location Required Details
id path Yes
200 response schema
{
"type": "object",
"properties": {
"action": {
"$ref": "#/components/schemas/Action"
},
"deliveries": {
"type": "array",
"items": {
"$ref": "#/components/schemas/DeliverySummary"
}
},
"task": {
"anyOf": [
{
"$ref": "#/components/schemas/TaskSummary"
},
{
"type": "null"
}
]
},
"draft": {
"const": true
},
"requestId": {
"type": "string"
}
},
"required": [
"action",
"deliveries",
"task",
"draft",
"requestId"
]
}

Errors: 400 Invalid input or missing idempotency header; 401 Invalid key or missing sign-in; 403 Insufficient access; 404 Endpoint or record unavailable; 429 Rate limit reached; 500 Server failure. See recovery guidance.

Read an owner-authorized engineering package

Live founder key only. Requires an unexpired, unrevoked owner grant for this exact key and agent project. Rechecks current membership, API context and retained engineering. Returns approved metadata and commercial terms, not original files or supplier formulas. Grant creation and revocation are session-owner actions in the engineering portal.

Required scope: projects:write.

Authentication: bearer key.

Parameter Location Required Details
id path Yes
200 response schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"binding": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"expiresAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"allowPreview": {
"type": "boolean"
}
},
"required": [
"id",
"expiresAt",
"allowPreview"
],
"additionalProperties": false
},
"engineering": {
"type": "object",
"properties": {
"snapshotId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"snapshotSha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"evidence": {
"type": "string",
"const": "retained_bytes_and_founder_review"
},
"semanticVerification": {
"type": "boolean",
"const": false
},
"quantity": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"specification": {
"type": "object",
"properties": {
"partId": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"revision": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"sha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"process": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"material": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"finish": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"inspection": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"unit": {
"type": "string",
"enum": [
"piece",
"set"
]
},
"quantityBasis": {
"type": "string",
"const": "total_build"
}
},
"required": [
"partId",
"revision",
"sha256",
"process",
"material",
"finish",
"inspection",
"unit",
"quantityBasis"
],
"additionalProperties": false
},
"intent": {
"type": "object",
"properties": {
"schemaVersion": {
"type": "number",
"const": 1
},
"current": {
"type": "object",
"properties": {
"purpose": {
"type": "string",
"enum": [
"samples",
"pilot",
"production",
"unknown"
]
},
"quantity": {
"anyOf": [
{
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 10000000
},
{
"type": "null"
}
]
},
"unit": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 800
},
{
"type": "null"
}
]
},
"configuration": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 800
},
{
"type": "null"
}
]
},
"revision": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 800
},
{
"type": "null"
}
]
},
"confirmation": {
"type": "string",
"enum": [
"unconfirmed",
"caller_confirmed"
]
},
"source": {
"anyOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"caller",
"file",
"interview"
]
},
"reference": {
"type": "string",
"minLength": 1,
"maxLength": 800
},
"quote": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 800
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"reference",
"quote"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"purpose",
"quantity",
"unit",
"configuration",
"revision",
"confirmation",
"source"
],
"additionalProperties": false
},
"plannedPilot": {
"anyOf": [
{
"type": "object",
"properties": {
"quantity": {
"anyOf": [
{
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 10000000
},
{
"type": "null"
}
]
},
"unit": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 800
},
{
"type": "null"
}
]
},
"period": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 800
},
{
"type": "null"
}
]
},
"source": {
"anyOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"caller",
"file",
"interview"
]
},
"reference": {
"type": "string",
"minLength": 1,
"maxLength": 800
},
"quote": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 800
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"reference",
"quote"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"quantity",
"unit",
"period",
"source"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"forecast": {
"anyOf": [
{
"type": "object",
"properties": {
"quantity": {
"anyOf": [
{
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 10000000
},
{
"type": "null"
}
]
},
"unit": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 800
},
{
"type": "null"
}
]
},
"period": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 800
},
{
"type": "null"
}
]
},
"source": {
"anyOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"caller",
"file",
"interview"
]
},
"reference": {
"type": "string",
"minLength": 1,
"maxLength": 800
},
"quote": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 800
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"reference",
"quote"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"quantity",
"unit",
"period",
"source"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"requirements": {
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"location",
"quality",
"material",
"inspection",
"deadline",
"other"
]
},
"detail": {
"type": "string",
"minLength": 1,
"maxLength": 800
},
"strength": {
"type": "string",
"enum": [
"hard",
"preference"
]
},
"confirmation": {
"type": "string",
"enum": [
"unconfirmed",
"caller_confirmed"
]
},
"source": {
"anyOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"caller",
"file",
"interview"
]
},
"reference": {
"type": "string",
"minLength": 1,
"maxLength": 800
},
"quote": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 800
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"reference",
"quote"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"detail",
"strength",
"confirmation",
"source"
],
"additionalProperties": false
}
},
"priorities": {
"maxItems": 5,
"type": "array",
"items": {
"type": "string",
"enum": [
"quality",
"price",
"lead_time",
"scale",
"location"
]
}
},
"prioritySource": {
"anyOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"caller",
"file",
"interview"
]
},
"reference": {
"type": "string",
"minLength": 1,
"maxLength": 800
},
"quote": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 800
},
{
"type": "null"
}
]
}
},
"required": [
"kind",
"reference",
"quote"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"schemaVersion",
"current",
"plannedPilot",
"forecast",
"requirements",
"priorities",
"prioritySource"
],
"additionalProperties": false
},
"fileCount": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"totalBytes": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"snapshotId",
"snapshotSha256",
"evidence",
"semanticVerification",
"quantity",
"specification",
"intent",
"fileCount",
"totalBytes"
],
"additionalProperties": false
},
"rules": {
"type": "object",
"properties": {
"choices": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ruleVersionId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"supplierName": {
"type": "string"
},
"ruleKey": {
"type": "string"
},
"version": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"commercial": {
"type": "object",
"properties": {
"currency": {
"type": "string",
"enum": [
"USD",
"CNY",
"EUR"
]
},
"incoterm": {
"type": "string",
"enum": [
"EXW",
"FCA",
"CPT",
"CIP",
"DAP",
"DPU",
"DDP",
"FAS",
"FOB",
"CFR",
"CIF"
]
},
"namedPlace": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"paymentTermsId": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"leadTimeDays": {
"type": "integer",
"minimum": 1,
"maximum": 3650
},
"dayBasis": {
"type": "string",
"enum": [
"calendar",
"working"
]
},
"leadTimeStartsOn": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"scopeId": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"required": [
"currency",
"incoterm",
"namedPlace",
"paymentTermsId",
"leadTimeDays",
"dayBasis",
"leadTimeStartsOn",
"scopeId"
],
"additionalProperties": false
},
"validUntil": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"ruleVersionId",
"supplierName",
"ruleKey",
"version",
"commercial",
"validUntil"
],
"additionalProperties": false
}
},
"truncated": {
"type": "boolean"
}
},
"required": [
"choices",
"truncated"
],
"additionalProperties": false
},
"originalFilesAccessible": {
"type": "boolean",
"const": false
},
"productionAuthorized": {
"type": "boolean",
"const": false
},
"requestId": {
"type": "string"
}
},
"required": [
"binding",
"engineering",
"rules",
"originalFilesAccessible",
"productionAuthorized",
"requestId"
],
"additionalProperties": false
}

Errors: 400 Validation error; 401 Missing or invalid key; 403 Scope or mode does not allow this; 404 Not found; 409 Grant or engineering changed, expired or revoked; 429 Rate limit reached; 503 Original evidence unavailable. See recovery guidance.

Calculate an evidence-bound nonbinding price preview

Requires explicit preview permission in the current owner grant. Quantity and specification come from the reviewed package. Supplier authority, capacity, originals and hard requirements are rechecked. No file disclosure, order or capacity reservation. Each successful request creates a new point-in-time receipt; retries recalculate and are not firm-offer issuance.

Required scope: projects:write.

Authentication: bearer key.

Parameter Location Required Details
id path Yes
Field Type Required Details
bindingId string Yes Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$. Format: uuid
ruleVersionId string Yes Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$. Format: uuid
commercial object Yes
commercial.currency string If parent supplied One of: USD, CNY, EUR
commercial.incoterm string If parent supplied One of: EXW, FCA, CPT, CIP, DAP, DPU, DDP, FAS, FOB, CFR, CIF
commercial.namedPlace string If parent supplied Min length 1. Max length 200
commercial.paymentTermsId string If parent supplied Min length 1. Max length 200
commercial.leadTimeDays integer If parent supplied Minimum 1. Maximum 3650
commercial.dayBasis string If parent supplied One of: calendar, working
commercial.leadTimeStartsOn string If parent supplied Min length 1. Max length 200
commercial.scopeId string If parent supplied Min length 1. Max length 200
201 response schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"bindingId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"previewId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"evidenceOrigin": {
"type": "string",
"const": "server_records"
},
"engineering": {
"type": "object",
"properties": {
"snapshotId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"snapshotSha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"evidence": {
"type": "string",
"const": "retained_bytes_and_founder_review"
},
"semanticVerification": {
"type": "boolean",
"const": false
}
},
"required": [
"snapshotId",
"snapshotSha256",
"evidence",
"semanticVerification"
],
"additionalProperties": false
},
"result": {
"type": "object",
"properties": {
"binding": {
"type": "boolean",
"const": false
},
"canPlaceOrder": {
"type": "boolean",
"const": false
},
"capacityReserved": {
"type": "boolean",
"const": false
},
"status": {
"type": "string",
"enum": [
"eligible_preview",
"review_required"
]
},
"reasons": {
"type": "array",
"items": {
"type": "string"
}
},
"evidenceMode": {
"type": "string",
"enum": [
"incomplete",
"synthetic",
"supplied_evidence"
]
},
"rule": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"sha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
"required": [
"id",
"version",
"sha256"
],
"additionalProperties": false
},
"evaluatedAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"recheckBy": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
{
"type": "null"
}
]
},
"price": {
"anyOf": [
{
"type": "object",
"properties": {
"currency": {
"type": "string",
"enum": [
"USD",
"CNY",
"EUR"
]
},
"minorUnitScale": {
"type": "number",
"const": 2
},
"quantity": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"unit": {
"type": "string",
"enum": [
"piece",
"set"
]
},
"unitPriceMinor": {
"type": "string",
"pattern": "^(0|[1-9]\\d*)$"
},
"partTotalMinor": {
"type": "string",
"pattern": "^(0|[1-9]\\d*)$"
},
"charges": {
"type": "object",
"properties": {
"setupMinor": {
"anyOf": [
{
"type": "string",
"pattern": "^(0|[1-9]\\d{0,14})$"
},
{
"type": "null"
}
]
},
"toolingMinor": {
"anyOf": [
{
"type": "string",
"pattern": "^(0|[1-9]\\d{0,14})$"
},
{
"type": "null"
}
]
},
"inspectionMinor": {
"anyOf": [
{
"type": "string",
"pattern": "^(0|[1-9]\\d{0,14})$"
},
{
"type": "null"
}
]
},
"packagingMinor": {
"anyOf": [
{
"type": "string",
"pattern": "^(0|[1-9]\\d{0,14})$"
},
{
"type": "null"
}
]
},
"shippingMinor": {
"anyOf": [
{
"type": "string",
"pattern": "^(0|[1-9]\\d{0,14})$"
},
{
"type": "null"
}
]
},
"taxMinor": {
"anyOf": [
{
"type": "string",
"pattern": "^(0|[1-9]\\d{0,14})$"
},
{
"type": "null"
}
]
},
"maglevFeeMinor": {
"anyOf": [
{
"type": "string",
"pattern": "^(0|[1-9]\\d{0,14})$"
},
{
"type": "null"
}
]
}
},
"required": [
"setupMinor",
"toolingMinor",
"inspectionMinor",
"packagingMinor",
"shippingMinor",
"taxMinor",
"maglevFeeMinor"
],
"additionalProperties": false
},
"factorySubtotalMinor": {
"anyOf": [
{
"type": "string",
"pattern": "^(0|[1-9]\\d*)$"
},
{
"type": "null"
}
]
},
"knownTotalMinor": {
"type": "string",
"pattern": "^(0|[1-9]\\d*)$"
},
"totalMinor": {
"anyOf": [
{
"type": "string",
"pattern": "^(0|[1-9]\\d*)$"
},
{
"type": "null"
}
]
},
"unknownCharges": {
"type": "array",
"items": {
"type": "string"
}
},
"scopeId": {
"type": "string"
},
"exclusions": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"currency",
"minorUnitScale",
"quantity",
"unit",
"unitPriceMinor",
"partTotalMinor",
"charges",
"factorySubtotalMinor",
"knownTotalMinor",
"totalMinor",
"unknownCharges",
"scopeId",
"exclusions"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"binding",
"canPlaceOrder",
"capacityReserved",
"status",
"reasons",
"price"
],
"additionalProperties": false
},
"requestId": {
"type": "string"
}
},
"required": [
"bindingId",
"previewId",
"evidenceOrigin",
"engineering",
"result",
"requestId"
],
"additionalProperties": false
}

Errors: 400 Validation error; 401 Missing or invalid key; 403 Scope or mode does not allow this; 404 Not found; 409 Grant or engineering changed, expired or revoked; 429 Rate limit reached; 503 Original evidence unavailable. See recovery guidance.

Propose selected engineering files

Live founder key only. Submit a stable client-generated transfer UUID and metadata for 1-10 selected technical files, at most 2 MiB each and 10 MiB total including retained project files. IDs and case-insensitive relative paths must be unique; hidden, secret, legal and correspondence paths are rejected. No bytes are uploaded here. An organization owner must approve this exact manifest and portal destination in the engineering portal. Reusing the transfer ID with the same manifest returns its receipt; different content conflicts. No supplier disclosure, BOM import or production permission.

Required scope: projects:write.

Authentication: bearer key.

Parameter Location Required Details
id path Yes Format: uuid
Field Type Required Details
transferId string Yes Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$. Format: uuid
manifest object Yes
manifest.schemaVersion 1 If parent supplied
manifest.files object[] If parent supplied Min items 1. Max items 10
manifest.files[].id string If parent supplied Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$. Format: uuid
manifest.files[].path string If parent supplied Min length 1. Max length 400
manifest.files[].kind string If parent supplied One of: cad, drawing, gerber, prd, spec, product_description
manifest.files[].contentType string If parent supplied Min length 1. Max length 200. Pattern: ^[\w.+-]+/[\w.+-]+$
manifest.files[].sizeBytes integer If parent supplied Minimum 1. Maximum 2097152
manifest.files[].sha256 string If parent supplied Pattern: ^[a-f0-9]{64}$
200 response schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"transfer": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"apiProjectId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"projectId": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "null"
}
]
},
"manifestSha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"manifest": {
"type": "object",
"properties": {
"schemaVersion": {
"type": "number",
"const": 1
},
"files": {
"minItems": 1,
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"path": {
"type": "string",
"minLength": 1,
"maxLength": 400
},
"kind": {
"type": "string",
"enum": [
"cad",
"drawing",
"gerber",
"prd",
"spec",
"product_description"
]
},
"contentType": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[\\w.+-]+\\/[\\w.+-]+$"
},
"sizeBytes": {
"type": "integer",
"minimum": 1,
"maximum": 2097152
},
"sha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
"required": [
"id",
"path",
"kind",
"contentType",
"sizeBytes",
"sha256"
],
"additionalProperties": false
}
}
},
"required": [
"schemaVersion",
"files"
],
"additionalProperties": false
},
"status": {
"type": "string",
"enum": [
"pending_owner",
"approved",
"received",
"expired",
"revoked"
]
},
"expiresAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"received": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"properties": {
"fileId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"sha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"sizeBytes": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"fileId",
"sha256",
"sizeBytes"
],
"additionalProperties": false
}
}
},
"required": [
"id",
"apiProjectId",
"projectId",
"manifestSha256",
"manifest",
"status",
"expiresAt",
"received"
],
"additionalProperties": false
},
"sharingAuthorized": {
"type": "boolean",
"const": false
},
"productionAuthorized": {
"type": "boolean",
"const": false
},
"reviewRequired": {
"type": "boolean",
"const": true
},
"replayed": {
"type": "boolean"
},
"requestId": {
"type": "string"
}
},
"required": [
"transfer",
"sharingAuthorized",
"productionAuthorized",
"reviewRequired",
"requestId"
],
"additionalProperties": false
}
201 response schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"transfer": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"apiProjectId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"projectId": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "null"
}
]
},
"manifestSha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"manifest": {
"type": "object",
"properties": {
"schemaVersion": {
"type": "number",
"const": 1
},
"files": {
"minItems": 1,
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"path": {
"type": "string",
"minLength": 1,
"maxLength": 400
},
"kind": {
"type": "string",
"enum": [
"cad",
"drawing",
"gerber",
"prd",
"spec",
"product_description"
]
},
"contentType": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[\\w.+-]+\\/[\\w.+-]+$"
},
"sizeBytes": {
"type": "integer",
"minimum": 1,
"maximum": 2097152
},
"sha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
"required": [
"id",
"path",
"kind",
"contentType",
"sizeBytes",
"sha256"
],
"additionalProperties": false
}
}
},
"required": [
"schemaVersion",
"files"
],
"additionalProperties": false
},
"status": {
"type": "string",
"enum": [
"pending_owner",
"approved",
"received",
"expired",
"revoked"
]
},
"expiresAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"received": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"properties": {
"fileId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"sha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"sizeBytes": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"fileId",
"sha256",
"sizeBytes"
],
"additionalProperties": false
}
}
},
"required": [
"id",
"apiProjectId",
"projectId",
"manifestSha256",
"manifest",
"status",
"expiresAt",
"received"
],
"additionalProperties": false
},
"sharingAuthorized": {
"type": "boolean",
"const": false
},
"productionAuthorized": {
"type": "boolean",
"const": false
},
"reviewRequired": {
"type": "boolean",
"const": true
},
"replayed": {
"type": "boolean"
},
"requestId": {
"type": "string"
}
},
"required": [
"transfer",
"sharingAuthorized",
"productionAuthorized",
"reviewRequired",
"requestId"
],
"additionalProperties": false
}

Errors: 400 Validation error; 401 Missing or invalid key; 403 Scope or mode does not allow this; 404 Not found; 409 Transfer changed, expired, revoked, over capacity, not approved or bytes do not match; 413 JSON body exceeds the bounded upload limit; 429 Rate limit reached; 503 Private storage is unavailable; read the receipt before retrying the same file. See recovery guidance.

GET /projects/{id}/engineering/transfers/{transferId}

Section titled “GET /projects/{id}/engineering/transfers/{transferId}”

Read a saved engineering transfer receipt

Only the proposing live key may read this receipt. Reports recorded uploads and authorization state, including expiry or revocation. This is historical receipt metadata, not a current integrity check or engineering approval. Original files and private storage locations are not returned.

Required scope: projects:write.

Authentication: bearer key.

Parameter Location Required Details
id path Yes Format: uuid
transferId path Yes Format: uuid
200 response schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"transfer": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"apiProjectId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"projectId": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "null"
}
]
},
"manifestSha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"manifest": {
"type": "object",
"properties": {
"schemaVersion": {
"type": "number",
"const": 1
},
"files": {
"minItems": 1,
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"path": {
"type": "string",
"minLength": 1,
"maxLength": 400
},
"kind": {
"type": "string",
"enum": [
"cad",
"drawing",
"gerber",
"prd",
"spec",
"product_description"
]
},
"contentType": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[\\w.+-]+\\/[\\w.+-]+$"
},
"sizeBytes": {
"type": "integer",
"minimum": 1,
"maximum": 2097152
},
"sha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
"required": [
"id",
"path",
"kind",
"contentType",
"sizeBytes",
"sha256"
],
"additionalProperties": false
}
}
},
"required": [
"schemaVersion",
"files"
],
"additionalProperties": false
},
"status": {
"type": "string",
"enum": [
"pending_owner",
"approved",
"received",
"expired",
"revoked"
]
},
"expiresAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"received": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"properties": {
"fileId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"sha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"sizeBytes": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"fileId",
"sha256",
"sizeBytes"
],
"additionalProperties": false
}
}
},
"required": [
"id",
"apiProjectId",
"projectId",
"manifestSha256",
"manifest",
"status",
"expiresAt",
"received"
],
"additionalProperties": false
},
"sharingAuthorized": {
"type": "boolean",
"const": false
},
"productionAuthorized": {
"type": "boolean",
"const": false
},
"reviewRequired": {
"type": "boolean",
"const": true
},
"replayed": {
"type": "boolean"
},
"requestId": {
"type": "string"
}
},
"required": [
"transfer",
"sharingAuthorized",
"productionAuthorized",
"reviewRequired",
"requestId"
],
"additionalProperties": false
}

Errors: 400 Validation error; 401 Missing or invalid key; 403 Scope or mode does not allow this; 404 Not found; 409 Transfer changed, expired, revoked, over capacity, not approved or bytes do not match; 413 JSON body exceeds the bounded upload limit; 429 Rate limit reached; 503 Private storage is unavailable; read the receipt before retrying the same file. See recovery guidance.

POST /projects/{id}/engineering/transfers/{transferId}/files/{entryId}

Section titled “POST /projects/{id}/engineering/transfers/{transferId}/files/{entryId}”

Retain one authorized engineering file

Canonical padded base64 of an exact manifest entry, up to 2 MiB decoded. Requires the current key, owner authorization and unchanged API/portal request. Rechecks actual retained bytes before saving an attributed receipt. After an interrupted response, read the receipt or resend identical bytes to the same entry; a verified replay is HTTP 200. Successful partial uploads remain attached and invalidate the prior engineering review. No geometry interpretation, supplier disclosure, order or capacity reservation.

Required scope: projects:write.

Authentication: bearer key.

Parameter Location Required Details
id path Yes Format: uuid
transferId path Yes Format: uuid
entryId path Yes Format: uuid
Field Type Required Details
contentBase64 string Yes Min length 4. Max length 2796204. Pattern: ^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$
200 response schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"transfer": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"apiProjectId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"projectId": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "null"
}
]
},
"manifestSha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"manifest": {
"type": "object",
"properties": {
"schemaVersion": {
"type": "number",
"const": 1
},
"files": {
"minItems": 1,
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"path": {
"type": "string",
"minLength": 1,
"maxLength": 400
},
"kind": {
"type": "string",
"enum": [
"cad",
"drawing",
"gerber",
"prd",
"spec",
"product_description"
]
},
"contentType": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[\\w.+-]+\\/[\\w.+-]+$"
},
"sizeBytes": {
"type": "integer",
"minimum": 1,
"maximum": 2097152
},
"sha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
"required": [
"id",
"path",
"kind",
"contentType",
"sizeBytes",
"sha256"
],
"additionalProperties": false
}
}
},
"required": [
"schemaVersion",
"files"
],
"additionalProperties": false
},
"status": {
"type": "string",
"enum": [
"pending_owner",
"approved",
"received",
"expired",
"revoked"
]
},
"expiresAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"received": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"properties": {
"fileId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"sha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"sizeBytes": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"fileId",
"sha256",
"sizeBytes"
],
"additionalProperties": false
}
}
},
"required": [
"id",
"apiProjectId",
"projectId",
"manifestSha256",
"manifest",
"status",
"expiresAt",
"received"
],
"additionalProperties": false
},
"sharingAuthorized": {
"type": "boolean",
"const": false
},
"productionAuthorized": {
"type": "boolean",
"const": false
},
"reviewRequired": {
"type": "boolean",
"const": true
},
"replayed": {
"type": "boolean"
},
"requestId": {
"type": "string"
}
},
"required": [
"transfer",
"sharingAuthorized",
"productionAuthorized",
"reviewRequired",
"requestId"
],
"additionalProperties": false
}
201 response schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"transfer": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"apiProjectId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"projectId": {
"anyOf": [
{
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
{
"type": "null"
}
]
},
"manifestSha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"manifest": {
"type": "object",
"properties": {
"schemaVersion": {
"type": "number",
"const": 1
},
"files": {
"minItems": 1,
"maxItems": 10,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"path": {
"type": "string",
"minLength": 1,
"maxLength": 400
},
"kind": {
"type": "string",
"enum": [
"cad",
"drawing",
"gerber",
"prd",
"spec",
"product_description"
]
},
"contentType": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[\\w.+-]+\\/[\\w.+-]+$"
},
"sizeBytes": {
"type": "integer",
"minimum": 1,
"maximum": 2097152
},
"sha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
"required": [
"id",
"path",
"kind",
"contentType",
"sizeBytes",
"sha256"
],
"additionalProperties": false
}
}
},
"required": [
"schemaVersion",
"files"
],
"additionalProperties": false
},
"status": {
"type": "string",
"enum": [
"pending_owner",
"approved",
"received",
"expired",
"revoked"
]
},
"expiresAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"received": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"properties": {
"fileId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"sha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"sizeBytes": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"fileId",
"sha256",
"sizeBytes"
],
"additionalProperties": false
}
}
},
"required": [
"id",
"apiProjectId",
"projectId",
"manifestSha256",
"manifest",
"status",
"expiresAt",
"received"
],
"additionalProperties": false
},
"sharingAuthorized": {
"type": "boolean",
"const": false
},
"productionAuthorized": {
"type": "boolean",
"const": false
},
"reviewRequired": {
"type": "boolean",
"const": true
},
"replayed": {
"type": "boolean"
},
"requestId": {
"type": "string"
}
},
"required": [
"transfer",
"sharingAuthorized",
"productionAuthorized",
"reviewRequired",
"requestId"
],
"additionalProperties": false
}

Errors: 400 Validation error; 401 Missing or invalid key; 403 Scope or mode does not allow this; 404 Not found; 409 Transfer changed, expired, revoked, over capacity, not approved or bytes do not match; 413 JSON body exceeds the bounded upload limit; 429 Rate limit reached; 503 Private storage is unavailable; read the receipt before retrying the same file. See recovery guidance.

Read the exact scope that publication would disclose, and the digest over it

Live founder key only, and only a key that already holds the engineering access grant for this action’s API project: this returns the exact file hashes, supplier shortlist and wording that publication would disclose. It is the only way to obtain the expectedReviewSha256 that POST /actions/{id}/publication requires. Reads only: no RFQ, invitation, thread, file grant, publication row or audit entry is created, nothing is locked and nothing is authorized. The engineering snapshot and its hash come from this key’s own access grant, the file list is the whole reviewed package, the part mapping is resolved from the reviewed specification, and the wording, quote-by date and anonymity are the retained draft’s own; only the commercial basis and the factory selection are the caller’s. Return selection unchanged as the publication body’s selection, and reviewSha256 as its expectedReviewSha256, after the approving owner has seen the complete review. If the source, engineering package or selected scope moves first, the digest moves with it and publication returns review_changed (409) rather than publishing stale scope.

Required scope: approvals:write.

Authentication: bearer key.

Parameter Location Required Details
id path Yes The live quote_request action to review. Format: uuid
currency query Yes USD or CNY. Publication never defaults a commercial term, so it must be stated here.. One of: USD, CNY
namedPlace query Yes The named place for the Incoterm, as the supplier will be shown it. Max length 200
incoterm query No Only when the retained draft states no trade term. A term that contradicts the draft is refused, not ignored.. One of: EXW, FCA, CPT, CIP, DAP, DPU, DDP, FAS, FOB, CFR, CIF
deliverTo query No Optional delivery destination. Omitted stays unknown rather than guessed.. Max length 200
factoryIds query No Comma separated, at most five, each already on the draft’s shortlist. Defaults to the whole shortlist when it holds five or fewer.
lineId query No Optional BOM line override. By default the single line matching the reviewed specification is resolved on the server.. Format: uuid
200 response schema
{
"type": "object",
"properties": {
"review": {
"type": "object",
"properties": {
"actionId": {
"type": "string",
"format": "uuid"
},
"apiProjectId": {
"type": "string",
"format": "uuid"
},
"projectId": {
"type": "string",
"format": "uuid"
},
"snapshotId": {
"type": "string",
"format": "uuid"
},
"snapshotSha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"state": {
"type": "string",
"enum": [
"review_required",
"not_publishable"
]
},
"reviewSha256": {
"type": "string",
"description": "Echo as expectedReviewSha256 on POST /actions/{id}/publication",
"pattern": "^[a-f0-9]{64}$"
},
"manifest": {
"type": "object",
"properties": {}
},
"selection": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"projectId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"snapshotId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"expectedSnapshotSha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"factoryIds": {
"minItems": 1,
"maxItems": 5,
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"fileIds": {
"minItems": 1,
"maxItems": 11,
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"partMapping": {
"type": "object",
"properties": {
"partIndex": {
"type": "number",
"const": 0
},
"lineId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"quantityPerUnit": {
"type": "number",
"const": 1
}
},
"required": [
"partIndex",
"lineId",
"quantityPerUnit"
],
"additionalProperties": false
},
"currency": {
"type": "string",
"enum": [
"USD",
"CNY"
]
},
"incoterm": {
"type": "string",
"enum": [
"EXW",
"FCA",
"CPT",
"CIP",
"DAP",
"DPU",
"DDP",
"FAS",
"FOB",
"CFR",
"CIF"
]
},
"namedPlace": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"quoteBy": {
"anyOf": [
{
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
},
{
"type": "null"
}
]
},
"deliverTo": {
"anyOf": [
{
"type": "string",
"minLength": 1,
"maxLength": 200
},
{
"type": "null"
}
]
},
"anonymised": {
"type": "boolean"
},
"wording": {
"type": "object",
"properties": {
"subjectZh": {
"type": "string",
"minLength": 1,
"maxLength": 20000
},
"en": {
"type": "string",
"minLength": 1,
"maxLength": 20000
},
"zh": {
"type": "string",
"minLength": 1,
"maxLength": 20000
}
},
"required": [
"subjectZh",
"en",
"zh"
],
"additionalProperties": false
}
},
"required": [
"projectId",
"snapshotId",
"expectedSnapshotSha256",
"factoryIds",
"fileIds",
"partMapping",
"currency",
"incoterm",
"namedPlace",
"quoteBy",
"deliverTo",
"anonymised",
"wording"
],
"additionalProperties": false
},
"factories": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"organisationId": {
"anyOf": [
{
"type": "string",
"format": "uuid"
},
{
"type": "null"
}
]
},
"directoryId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"nameEn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"nameZh": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"accountState": {
"type": "string",
"enum": [
"bound",
"awaiting_account"
]
}
},
"required": [
"id",
"organisationId",
"directoryId",
"nameEn",
"nameZh",
"accountState"
]
}
},
"files": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"kind": {
"type": "string"
},
"filename": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"sha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"sizeBytes": {
"type": "integer"
}
},
"required": [
"id",
"kind",
"filename",
"sha256",
"sizeBytes"
]
}
},
"commercial": {
"type": "object",
"properties": {
"currency": {
"type": "string",
"enum": [
"USD",
"CNY"
]
},
"incoterm": {
"type": "string"
},
"namedPlace": {
"type": "string"
},
"quoteBy": {
"anyOf": [
{
"type": "string",
"format": "date"
},
{
"type": "null"
}
]
},
"deliverTo": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"currency",
"incoterm",
"namedPlace",
"quoteBy",
"deliverTo"
]
},
"anonymised": {
"type": "boolean"
},
"wording": {
"type": "object",
"properties": {
"subjectZh": {
"type": "string"
},
"en": {
"type": "string"
},
"zh": {
"type": "string"
}
},
"required": [
"subjectZh",
"en",
"zh"
]
},
"publicationAuthorized": {
"type": "boolean"
},
"productionAuthorized": {
"type": "boolean"
},
"eligibility": {
"type": "object",
"properties": {
"publishable": {
"type": "boolean",
"description": "False when no NDA is in force between this customer organisation and Maglev, or this managed project has not recorded every release check publication requires. The reviewed scope is still returned and still hashed; publishing it would be refused with 409 nda_required or 409 publication_precondition."
},
"blockers": {
"type": "array",
"items": {
"type": "string",
"enum": [
"nda",
"export_attestation",
"maglev_screening"
]
},
"description": "The records that are missing, empty when this customer and project may disclose"
},
"note": {
"type": "string"
}
},
"required": [
"publishable",
"blockers",
"note"
]
},
"effect": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"actionId",
"apiProjectId",
"projectId",
"snapshotId",
"snapshotSha256",
"state",
"reviewSha256",
"manifest",
"selection",
"factories",
"files",
"commercial",
"anonymised",
"wording",
"publicationAuthorized",
"productionAuthorized",
"eligibility",
"effect",
"note"
]
}
},
"required": [
"review"
]
}

Errors: 400 The derived selection could not be bound to the reviewed source and engineering; 401 Missing or invalid key; 403 Key, mode or engineering access grant does not authorize reading this scope; 404 No such live action for this organization, or this key holds no engineering access grant on its API project; 409 Source, engineering package or retained draft changed and the review cannot be built; 429 Rate limit reached; 503 Retained engineering evidence is unavailable. See recovery guidance.

Ask the founder to approve disclosing this exact reviewed revision

Live founder key only, holding the same engineering access grant publication needs. Records a durable pending approval for one reviewed revision and returns it. It publishes nothing, creates no RFQ, invitation, thread or file grant, sends no message, and above all approves nothing: the record is created with no approver, and only the founder, signed in to the Maglev workspace, can approve it. An API key cannot approve its own proposal and there is no field anywhere in this API that lets it try. The recipients, files and terms stored on the record are recomputed on the server from the same rows publication would read, so the founder is shown the disclosure that would actually be made rather than a summary the caller supplied. Re-proposing the same approvalId for the same revision returns the existing record with 200 and does not ask the founder twice; a second proposal for a revision that already has a live approval returns that one instead. An approval is single use: it authorizes exactly one publication of exactly one revision, and a change to any recipient, any file or any commercial term invalidates it rather than carrying over.

Required scope: approvals:write.

Authentication: bearer key.

Parameter Location Required Details
id path Yes The live quote_request action whose reviewed revision is being proposed. Format: uuid
Field Type Required Details
approvalId string Yes Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$. Format: uuid
expectedReviewSha256 string Yes Pattern: ^[a-f0-9]{64}$
selection object Yes
selection.projectId string If parent supplied Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$. Format: uuid
selection.snapshotId string If parent supplied Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$. Format: uuid
selection.expectedSnapshotSha256 string If parent supplied Pattern: ^[a-f0-9]{64}$
selection.factoryIds string[] If parent supplied Min items 1. Max items 5
selection.fileIds string[] If parent supplied Min items 1. Max items 11
selection.partMapping object If parent supplied
selection.partMapping.partIndex 0 If parent supplied
selection.partMapping.lineId string If parent supplied Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$. Format: uuid
selection.partMapping.quantityPerUnit 1 If parent supplied
selection.currency string If parent supplied One of: USD, CNY
selection.incoterm string If parent supplied One of: EXW, FCA, CPT, CIP, DAP, DPU, DDP, FAS, FOB, CFR, CIF
selection.namedPlace string If parent supplied Min length 1. Max length 200
selection.quoteBy string or null If parent supplied
selection.deliverTo string or null If parent supplied
selection.anonymised boolean If parent supplied
selection.wording object If parent supplied
selection.wording.subjectZh string If parent supplied Min length 1. Max length 20000
selection.wording.en string If parent supplied Min length 1. Max length 20000
selection.wording.zh string If parent supplied Min length 1. Max length 20000
200 response schema
{
"type": "object",
"properties": {
"approval": {
"type": "object",
"properties": {
"approvalId": {
"type": "string",
"description": "The stored approval, named as `approval.approvalId` on POST /actions/{id}/publication",
"format": "uuid"
},
"actionId": {
"type": "string",
"format": "uuid"
},
"apiProjectId": {
"type": "string",
"format": "uuid"
},
"apiKeyId": {
"type": "string",
"description": "The key that proposed it, and the only key that may publish under it",
"format": "uuid"
},
"projectId": {
"type": "string",
"format": "uuid"
},
"snapshotId": {
"type": "string",
"format": "uuid"
},
"status": {
"type": "string",
"enum": [
"pending_owner",
"approved",
"expired",
"revoked",
"published"
]
},
"reviewSha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"bindingSha256": {
"type": "string",
"description": "Digest over the recipients, files and terms this approval binds",
"pattern": "^[a-f0-9]{64}$"
},
"recipients": {
"type": "array",
"items": {
"type": "object",
"properties": {
"factoryId": {
"type": "string",
"format": "uuid"
},
"organisationId": {
"anyOf": [
{
"type": "string",
"format": "uuid"
},
{
"type": "null"
}
]
},
"accountState": {
"type": "string",
"enum": [
"bound",
"awaiting_account"
]
}
},
"required": [
"factoryId",
"organisationId",
"accountState"
]
},
"description": "Exactly the factories this approval permits disclosing to"
},
"files": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"kind": {
"type": "string"
},
"sha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"sizeBytes": {
"type": "integer"
}
},
"required": [
"id",
"kind",
"sha256",
"sizeBytes"
]
},
"description": "Exactly the files, at exactly these hashes. A file whose bytes moved is not one of these."
},
"terms": {
"type": "object",
"properties": {
"currency": {
"type": "string",
"enum": [
"USD",
"CNY"
]
},
"incoterm": {
"type": "string"
},
"namedPlace": {
"type": "string"
},
"deliverTo": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"quoteBy": {
"anyOf": [
{
"type": "string",
"format": "date"
},
{
"type": "null"
}
]
},
"quantities": {
"type": "array",
"items": {
"type": "integer"
}
},
"anonymised": {
"type": "boolean"
}
},
"required": [
"currency",
"incoterm",
"namedPlace",
"deliverTo",
"quoteBy",
"quantities",
"anonymised"
]
},
"expiresAt": {
"type": "string",
"format": "date-time"
},
"approvedBy": {
"anyOf": [
{
"type": "string",
"description": "The founder who approved, null until they do",
"format": "uuid"
},
{
"type": "null"
}
]
},
"approvedAt": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"revokedAt": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"revokeReason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"consumedAt": {
"anyOf": [
{
"type": "string",
"description": "When this approval was spent. It authorizes one publication and no more.",
"format": "date-time"
},
{
"type": "null"
}
]
},
"consumedRfqId": {
"anyOf": [
{
"type": "string",
"format": "uuid"
},
{
"type": "null"
}
]
},
"proposedAt": {
"type": "string",
"format": "date-time"
},
"effect": {
"type": "string"
}
},
"required": [
"approvalId",
"actionId",
"apiProjectId",
"apiKeyId",
"projectId",
"snapshotId",
"status",
"reviewSha256",
"bindingSha256",
"recipients",
"files",
"terms",
"expiresAt",
"approvedBy",
"approvedAt",
"revokedAt",
"revokeReason",
"consumedAt",
"consumedRfqId",
"proposedAt",
"effect"
]
},
"replayed": {
"type": "boolean"
}
},
"required": [
"approval",
"replayed"
]
}
201 response schema
{
"type": "object",
"properties": {
"approval": {
"type": "object",
"properties": {
"approvalId": {
"type": "string",
"description": "The stored approval, named as `approval.approvalId` on POST /actions/{id}/publication",
"format": "uuid"
},
"actionId": {
"type": "string",
"format": "uuid"
},
"apiProjectId": {
"type": "string",
"format": "uuid"
},
"apiKeyId": {
"type": "string",
"description": "The key that proposed it, and the only key that may publish under it",
"format": "uuid"
},
"projectId": {
"type": "string",
"format": "uuid"
},
"snapshotId": {
"type": "string",
"format": "uuid"
},
"status": {
"type": "string",
"enum": [
"pending_owner",
"approved",
"expired",
"revoked",
"published"
]
},
"reviewSha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"bindingSha256": {
"type": "string",
"description": "Digest over the recipients, files and terms this approval binds",
"pattern": "^[a-f0-9]{64}$"
},
"recipients": {
"type": "array",
"items": {
"type": "object",
"properties": {
"factoryId": {
"type": "string",
"format": "uuid"
},
"organisationId": {
"anyOf": [
{
"type": "string",
"format": "uuid"
},
{
"type": "null"
}
]
},
"accountState": {
"type": "string",
"enum": [
"bound",
"awaiting_account"
]
}
},
"required": [
"factoryId",
"organisationId",
"accountState"
]
},
"description": "Exactly the factories this approval permits disclosing to"
},
"files": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"kind": {
"type": "string"
},
"sha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"sizeBytes": {
"type": "integer"
}
},
"required": [
"id",
"kind",
"sha256",
"sizeBytes"
]
},
"description": "Exactly the files, at exactly these hashes. A file whose bytes moved is not one of these."
},
"terms": {
"type": "object",
"properties": {
"currency": {
"type": "string",
"enum": [
"USD",
"CNY"
]
},
"incoterm": {
"type": "string"
},
"namedPlace": {
"type": "string"
},
"deliverTo": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"quoteBy": {
"anyOf": [
{
"type": "string",
"format": "date"
},
{
"type": "null"
}
]
},
"quantities": {
"type": "array",
"items": {
"type": "integer"
}
},
"anonymised": {
"type": "boolean"
}
},
"required": [
"currency",
"incoterm",
"namedPlace",
"deliverTo",
"quoteBy",
"quantities",
"anonymised"
]
},
"expiresAt": {
"type": "string",
"format": "date-time"
},
"approvedBy": {
"anyOf": [
{
"type": "string",
"description": "The founder who approved, null until they do",
"format": "uuid"
},
{
"type": "null"
}
]
},
"approvedAt": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"revokedAt": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
]
},
"revokeReason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"consumedAt": {
"anyOf": [
{
"type": "string",
"description": "When this approval was spent. It authorizes one publication and no more.",
"format": "date-time"
},
{
"type": "null"
}
]
},
"consumedRfqId": {
"anyOf": [
{
"type": "string",
"format": "uuid"
},
{
"type": "null"
}
]
},
"proposedAt": {
"type": "string",
"format": "date-time"
},
"effect": {
"type": "string"
}
},
"required": [
"approvalId",
"actionId",
"apiProjectId",
"apiKeyId",
"projectId",
"snapshotId",
"status",
"reviewSha256",
"bindingSha256",
"recipients",
"files",
"terms",
"expiresAt",
"approvedBy",
"approvedAt",
"revokedAt",
"revokeReason",
"consumedAt",
"consumedRfqId",
"proposedAt",
"effect"
]
},
"replayed": {
"type": "boolean",
"description": "True when this proposal already existed and nothing was written"
}
},
"required": [
"approval",
"replayed"
]
}

Errors: 400 The selection could not be bound to the reviewed source and engineering; 401 Missing or invalid key; 403 Key, mode or engineering access grant does not authorize proposing this disclosure; 404 No such live action for this organization, or this key holds no engineering access grant on its API project; 409 The reviewed scope moved, or this approvalId already names a different revision; 429 Rate limit reached; 503 Retained engineering evidence is unavailable. See recovery guidance.

Publish a reviewed quote request to the selected suppliers

Live founder key only, and only under a stored founder approval. The order is: read GET /actions/{id}/publication/review, which returns the reviewed scope, the selection to send back unchanged and the expectedReviewSha256 this call requires; POST /actions/{id}/publication/approval to record that revision for approval; wait for the founder to approve it in the Maglev workspace; then call this with approval: { approvalId }. A key on its own cannot publish, whether or not anyone happens to be signed in. The approval binds the exact recipients, the exact files and their hashes, and the exact commercial terms, so adding a factory, changing a file or changing the currency is refused with 403 publication_not_approved rather than published under the approval that was given for something else, and one approval authorizes exactly one publication. Publishes one reviewed quote_request into one explicitly selected managed project as a managed RFQ with a thread, an invitation and exactly the reviewed file grants per selected factory. Currency and Incoterm must be stated explicitly in the selection; the managed RFQ’s USD and EXW column defaults are never applied to a request whose buyer did not state them. Every authority and selection is rechecked inside one transaction under the human sender’s lock order and committed with the durable source mapping and audit entry, or rolled back whole. Publication itself discloses the request to the supplier, so an approved email digest does not authorize it: this returns a publication receipt and dispatches no email. An identical reviewed revision returns that revision’s existing publication and writes nothing, so a revoked file grant is never restored by a retry. A different reviewed revision is published as the next revision of the same request: it reuses the RFQ, and every recipient already invited keeps its invitation and its thread and is told in that thread, while earlier revisions’ rows are never rewritten. A revision is a fresh disclosure and needs its own founder approval, because the approval binds the reviewed revision it was given for and is spent by the publication it authorized; publishing revision 2 under revision 1’s approval is refused with 403 publication_not_approved. A revision may add a recipient and may not drop one: dropping is refused with 409 publication_revision_recipient_removed, because withdrawing a disclosure already made is a revocation. A directory factory with no bound supplier account is published awaiting account setup, with no account created and no outreach, and its grantedFileIds is empty. That empty list does not mean the factory stays outside the disclosure: when a supplier account is later bound to that directory factory it is granted the files this founder approved for it, with no further founder approval and no second review. grantedFileIds records the grants at publication time and is not updated by that backfill, so read it as publication-time state rather than as current disclosure, and read filesOnAccountBinding as what binding will grant. That promise is bounded and withdrawable: it lapses at filesOnAccountBindingExpireAt, after which binding grants nothing, and the owner organisation can withdraw it earlier by revoking pendingDisclosureId, which also deletes any grant already issued. Revocation stops further reads and cannot unsend a file that was already downloaded. A revision re-approves the outstanding promise: it moves the pending disclosure to the corrected file set and to a fresh deadline, and a disclosure the owner has already revoked stays revoked and is not resurrected by it. GET /pending-disclosures lists what is outstanding. No order and no payment is authorized.

Required scope: approvals:write.

Authentication: bearer key.

Parameter Location Required Details
id path Yes The live quote_request action to publish. Format: uuid
Field Type Required Details
expectedReviewSha256 string Yes Pattern: ^[a-f0-9]{64}$
approval object Yes
approval.approvalId string If parent supplied Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$. Format: uuid
selection object Yes
selection.projectId string If parent supplied Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$. Format: uuid
selection.snapshotId string If parent supplied Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$. Format: uuid
selection.expectedSnapshotSha256 string If parent supplied Pattern: ^[a-f0-9]{64}$
selection.factoryIds string[] If parent supplied Min items 1. Max items 5
selection.fileIds string[] If parent supplied Min items 1. Max items 11
selection.partMapping object If parent supplied
selection.partMapping.partIndex 0 If parent supplied
selection.partMapping.lineId string If parent supplied Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$. Format: uuid
selection.partMapping.quantityPerUnit 1 If parent supplied
selection.currency string If parent supplied One of: USD, CNY
selection.incoterm string If parent supplied One of: EXW, FCA, CPT, CIP, DAP, DPU, DDP, FAS, FOB, CFR, CIF
selection.namedPlace string If parent supplied Min length 1. Max length 200
selection.quoteBy string or null If parent supplied
selection.deliverTo string or null If parent supplied
selection.anonymised boolean If parent supplied
selection.wording object If parent supplied
selection.wording.subjectZh string If parent supplied Min length 1. Max length 20000
selection.wording.en string If parent supplied Min length 1. Max length 20000
selection.wording.zh string If parent supplied Min length 1. Max length 20000
200 response schema
{
"type": "object",
"properties": {
"publication": {
"type": "object",
"properties": {
"actionId": {
"type": "string",
"description": "uuid"
},
"apiProjectId": {
"type": "string",
"description": "uuid"
},
"projectId": {
"type": "string",
"description": "uuid",
"format": "uuid"
},
"rfqId": {
"type": "string",
"description": "uuid",
"format": "uuid"
},
"reviewSha256": {
"type": "string",
"description": "The reviewed publication revision this request was published under"
},
"revision": {
"type": "integer",
"description": "Which reviewed revision of this request this receipt is for, counting from 1. A correction published after the request is already out is the next revision: it reuses the same RFQ and every existing recipient's invitation and thread, and appends a row per recipient rather than rewriting the earlier revision."
},
"supersedes": {
"anyOf": [
{
"type": "object",
"properties": {
"revision": {
"type": "integer"
},
"reviewSha256": {
"type": "string"
},
"publishedAt": {
"type": "string",
"format": "date-time"
}
},
"required": [
"revision",
"reviewSha256",
"publishedAt"
],
"description": "The revision this one supersedes, or null on a first publication. A pointer, never a rewrite: the superseded revision keeps its own recipients, files, terms and publication-time grants."
},
{
"type": "null"
}
]
},
"revisionNote": {
"type": "string",
"description": "What this revision did to the supplier side, in words."
},
"apiContextSha256": {
"type": "string"
},
"retainedActionSha256": {
"type": "string"
},
"snapshotId": {
"type": "string",
"description": "uuid",
"format": "uuid"
},
"snapshotSha256": {
"type": "string"
},
"anonymised": {
"type": "boolean"
},
"commercial": {
"type": "object",
"properties": {
"currency": {
"type": "string",
"enum": [
"USD",
"CNY"
]
},
"incoterm": {
"type": "string"
},
"namedPlace": {
"type": "string"
},
"quoteBy": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"deliverTo": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"currency",
"incoterm",
"namedPlace",
"quoteBy",
"deliverTo"
]
},
"fileIds": {
"type": "array",
"items": {
"type": "string",
"description": "uuid",
"format": "uuid"
},
"description": "Exactly the reviewed files. Granted at publication to each factory with a bound supplier account, and granted to an awaiting-account factory when a supplier account is later bound to it"
},
"factories": {
"type": "array",
"items": {
"type": "object",
"properties": {
"factoryId": {
"type": "string",
"description": "uuid",
"format": "uuid"
},
"invitationId": {
"type": "string",
"description": "uuid",
"format": "uuid"
},
"threadId": {
"type": "string",
"description": "uuid",
"format": "uuid"
},
"supplierOrgId": {
"anyOf": [
{
"type": "string",
"description": "uuid",
"format": "uuid"
},
{
"type": "null"
}
]
},
"accountState": {
"type": "string",
"enum": [
"bound",
"awaiting_account"
]
},
"newRecipient": {
"type": "boolean",
"description": "True when this revision is the first one this factory was a recipient of, which is every factory on a first publication. False means the invitation and thread are the ones it already had, so its thread history and any quote it already submitted are still attached to them, and it was told in that thread that the terms moved."
},
"grantedFileIds": {
"type": "array",
"items": {
"type": "string",
"description": "uuid",
"format": "uuid"
},
"description": "The file grants this publication issued. Empty for a factory awaiting account setup, and also empty for a bound factory whose disclosure the owner has revoked, because a revision grants a revoked recipient nothing. It is not updated afterwards: binding a supplier account to a directory factory grants it the whole reviewed package without changing this list, so it is a record of publication-time state rather than an audit trail of current disclosure. Read pendingDisclosureState for that"
},
"filesOnAccountBinding": {
"type": "array",
"items": {
"type": "string",
"description": "uuid",
"format": "uuid"
},
"description": "Present only when this factory is awaiting account setup AND its pending disclosure is still live: the reviewed files it will be granted when a supplier account is bound to it, with no further founder approval and no second review. These are not grants that exist yet. Absent once pendingDisclosureState is revoked, expired or delivered, because binding would then grant nothing"
},
"filesOnAccountBindingExpireAt": {
"anyOf": [
{
"type": "string",
"description": "Present alongside filesOnAccountBinding: the instant this pending disclosure lapses. Binding a supplier account after it grants nothing. Publishing a later revision of this request does re-arm it, because a revision carries a fresh owner approval naming this recipient; revoke pendingDisclosureId to stop that",
"format": "date-time"
},
{
"type": "null"
}
]
},
"pendingDisclosureId": {
"anyOf": [
{
"type": "string",
"description": "On EVERY recipient, whether or not it had a supplier account at publication time: the disclosure to read on GET /pending-disclosures, and the one the owner organisation revokes to take this package back from this factory. A recipient that was already bound has one too, recorded as delivered, because revoking it is the only way to delete the grants it already holds. Null only for a recipient this publication disclosed no files to",
"format": "uuid"
},
{
"type": "null"
}
]
},
"pendingDisclosureState": {
"anyOf": [
{
"type": "string",
"enum": [
"pending",
"delivered",
"expired",
"revoked"
],
"description": "On every recipient. pending: granted to nobody yet, and binding a supplier account delivers the whole package. delivered: the supplier organisation holds the grants now. expired: binding grants nothing, though a later revision of this request re-arms and delivers it. revoked: the owner took it back, binding grants nothing, and no later revision re-grants it, including through another directory site of the same supplier organisation"
},
{
"type": "null"
}
]
},
"note": {
"type": "string",
"description": "Present when there is something about this recipient's disclosure state to say: what binding will or will not deliver, and what revoking pendingDisclosureId does"
}
},
"required": [
"factoryId",
"invitationId",
"threadId",
"supplierOrgId",
"accountState",
"grantedFileIds",
"newRecipient"
]
}
},
"approvedBy": {
"type": "string",
"description": "uuid",
"format": "uuid"
},
"approvedAt": {
"type": "string",
"format": "date-time"
},
"publishedAt": {
"type": "string",
"format": "date-time"
}
},
"required": [
"actionId",
"apiProjectId",
"projectId",
"rfqId",
"reviewSha256",
"revision",
"supersedes",
"revisionNote",
"apiContextSha256",
"retainedActionSha256",
"snapshotId",
"snapshotSha256",
"anonymised",
"commercial",
"fileIds",
"factories",
"approvedBy",
"approvedAt",
"publishedAt"
]
},
"notification": {
"type": "object",
"properties": {
"channel": {
"type": "string",
"enum": [
"email"
]
},
"state": {
"type": "string",
"enum": [
"not_requested"
]
},
"dispatchReceipt": {
"type": "null"
},
"note": {
"type": "string"
}
},
"required": [
"channel",
"state",
"dispatchReceipt",
"note"
]
},
"replayed": {
"type": "boolean",
"description": "True when an identical reviewed revision was already published and nothing was written"
},
"productionAuthorized": {
"type": "boolean"
},
"orderAuthorized": {
"type": "boolean"
},
"requestId": {
"type": "string"
}
},
"required": [
"publication",
"notification",
"replayed",
"productionAuthorized",
"orderAuthorized",
"requestId"
]
}
201 response schema
{
"type": "object",
"properties": {
"publication": {
"type": "object",
"properties": {
"actionId": {
"type": "string",
"description": "uuid"
},
"apiProjectId": {
"type": "string",
"description": "uuid"
},
"projectId": {
"type": "string",
"description": "uuid",
"format": "uuid"
},
"rfqId": {
"type": "string",
"description": "uuid",
"format": "uuid"
},
"reviewSha256": {
"type": "string",
"description": "The reviewed publication revision this request was published under"
},
"revision": {
"type": "integer",
"description": "Which reviewed revision of this request this receipt is for, counting from 1. A correction published after the request is already out is the next revision: it reuses the same RFQ and every existing recipient's invitation and thread, and appends a row per recipient rather than rewriting the earlier revision."
},
"supersedes": {
"anyOf": [
{
"type": "object",
"properties": {
"revision": {
"type": "integer"
},
"reviewSha256": {
"type": "string"
},
"publishedAt": {
"type": "string",
"format": "date-time"
}
},
"required": [
"revision",
"reviewSha256",
"publishedAt"
],
"description": "The revision this one supersedes, or null on a first publication. A pointer, never a rewrite: the superseded revision keeps its own recipients, files, terms and publication-time grants."
},
{
"type": "null"
}
]
},
"revisionNote": {
"type": "string",
"description": "What this revision did to the supplier side, in words."
},
"apiContextSha256": {
"type": "string"
},
"retainedActionSha256": {
"type": "string"
},
"snapshotId": {
"type": "string",
"description": "uuid",
"format": "uuid"
},
"snapshotSha256": {
"type": "string"
},
"anonymised": {
"type": "boolean"
},
"commercial": {
"type": "object",
"properties": {
"currency": {
"type": "string",
"enum": [
"USD",
"CNY"
]
},
"incoterm": {
"type": "string"
},
"namedPlace": {
"type": "string"
},
"quoteBy": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"deliverTo": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"currency",
"incoterm",
"namedPlace",
"quoteBy",
"deliverTo"
]
},
"fileIds": {
"type": "array",
"items": {
"type": "string",
"description": "uuid",
"format": "uuid"
},
"description": "Exactly the reviewed files. Granted at publication to each factory with a bound supplier account, and granted to an awaiting-account factory when a supplier account is later bound to it"
},
"factories": {
"type": "array",
"items": {
"type": "object",
"properties": {
"factoryId": {
"type": "string",
"description": "uuid",
"format": "uuid"
},
"invitationId": {
"type": "string",
"description": "uuid",
"format": "uuid"
},
"threadId": {
"type": "string",
"description": "uuid",
"format": "uuid"
},
"supplierOrgId": {
"anyOf": [
{
"type": "string",
"description": "uuid",
"format": "uuid"
},
{
"type": "null"
}
]
},
"accountState": {
"type": "string",
"enum": [
"bound",
"awaiting_account"
]
},
"newRecipient": {
"type": "boolean",
"description": "True when this revision is the first one this factory was a recipient of, which is every factory on a first publication. False means the invitation and thread are the ones it already had, so its thread history and any quote it already submitted are still attached to them, and it was told in that thread that the terms moved."
},
"grantedFileIds": {
"type": "array",
"items": {
"type": "string",
"description": "uuid",
"format": "uuid"
},
"description": "The file grants this publication issued. Empty for a factory awaiting account setup, and also empty for a bound factory whose disclosure the owner has revoked, because a revision grants a revoked recipient nothing. It is not updated afterwards: binding a supplier account to a directory factory grants it the whole reviewed package without changing this list, so it is a record of publication-time state rather than an audit trail of current disclosure. Read pendingDisclosureState for that"
},
"filesOnAccountBinding": {
"type": "array",
"items": {
"type": "string",
"description": "uuid",
"format": "uuid"
},
"description": "Present only when this factory is awaiting account setup AND its pending disclosure is still live: the reviewed files it will be granted when a supplier account is bound to it, with no further founder approval and no second review. These are not grants that exist yet. Absent once pendingDisclosureState is revoked, expired or delivered, because binding would then grant nothing"
},
"filesOnAccountBindingExpireAt": {
"anyOf": [
{
"type": "string",
"description": "Present alongside filesOnAccountBinding: the instant this pending disclosure lapses. Binding a supplier account after it grants nothing. Publishing a later revision of this request does re-arm it, because a revision carries a fresh owner approval naming this recipient; revoke pendingDisclosureId to stop that",
"format": "date-time"
},
{
"type": "null"
}
]
},
"pendingDisclosureId": {
"anyOf": [
{
"type": "string",
"description": "On EVERY recipient, whether or not it had a supplier account at publication time: the disclosure to read on GET /pending-disclosures, and the one the owner organisation revokes to take this package back from this factory. A recipient that was already bound has one too, recorded as delivered, because revoking it is the only way to delete the grants it already holds. Null only for a recipient this publication disclosed no files to",
"format": "uuid"
},
{
"type": "null"
}
]
},
"pendingDisclosureState": {
"anyOf": [
{
"type": "string",
"enum": [
"pending",
"delivered",
"expired",
"revoked"
],
"description": "On every recipient. pending: granted to nobody yet, and binding a supplier account delivers the whole package. delivered: the supplier organisation holds the grants now. expired: binding grants nothing, though a later revision of this request re-arms and delivers it. revoked: the owner took it back, binding grants nothing, and no later revision re-grants it, including through another directory site of the same supplier organisation"
},
{
"type": "null"
}
]
},
"note": {
"type": "string",
"description": "Present when there is something about this recipient's disclosure state to say: what binding will or will not deliver, and what revoking pendingDisclosureId does"
}
},
"required": [
"factoryId",
"invitationId",
"threadId",
"supplierOrgId",
"accountState",
"grantedFileIds",
"newRecipient"
]
}
},
"approvedBy": {
"type": "string",
"description": "uuid",
"format": "uuid"
},
"approvedAt": {
"type": "string",
"format": "date-time"
},
"publishedAt": {
"type": "string",
"format": "date-time"
}
},
"required": [
"actionId",
"apiProjectId",
"projectId",
"rfqId",
"reviewSha256",
"revision",
"supersedes",
"revisionNote",
"apiContextSha256",
"retainedActionSha256",
"snapshotId",
"snapshotSha256",
"anonymised",
"commercial",
"fileIds",
"factories",
"approvedBy",
"approvedAt",
"publishedAt"
]
},
"notification": {
"type": "object",
"properties": {
"channel": {
"type": "string",
"enum": [
"email"
]
},
"state": {
"type": "string",
"enum": [
"not_requested"
]
},
"dispatchReceipt": {
"type": "null"
},
"note": {
"type": "string"
}
},
"required": [
"channel",
"state",
"dispatchReceipt",
"note"
]
},
"replayed": {
"type": "boolean",
"description": "True when an identical reviewed revision was already published and nothing was written"
},
"productionAuthorized": {
"type": "boolean"
},
"orderAuthorized": {
"type": "boolean"
},
"requestId": {
"type": "string"
}
},
"required": [
"publication",
"notification",
"replayed",
"productionAuthorized",
"orderAuthorized",
"requestId"
]
}

Errors: 400 The selection could not be bound to the reviewed source and engineering; 401 Missing or invalid key; 403 Key or engineering grant does not authorize publication, or no stored founder approval covers this exact disclosure (publication_not_approved; details.field is recipients, files, terms, review_sha256 or approval); 404 Not found; 409 Source, engineering or review changed, the revision drops a factory an earlier revision was already published to (publication_revision_recipient_removed; revoke it instead), no NDA is in force between this customer organisation and Maglev (nda_required; details.state says what the record holds), or the project has not recorded the release checks disclosure requires (publication_precondition; read eligibility on the review); 429 Rate limit reached; 503 Retained engineering evidence is unavailable. See recovery guidance.

Project · Error · ActionListEntry · Action · ActionOutput · DeliverySummary · TaskSummary