Skip to main content
POST
Create a new teardown owned by your organization. The teardown is published immediately into the appropriate active state — there’s no draft path through the public API.
The public API supports asset_type of aircraft or engine only. apu and landing_gear teardowns are UI-only today — existing rows of those types stay readable on GET, but cannot be created via this endpoint and sending either returns 422.

Headers

string
required
Bearer tdao_live_… — your API key.
string
required
Your organization’s UUID. Must match the org the API key was minted in.
string
required
application/json

Body

The request body shape depends on the asset_type you pick. Five fields are required on every request regardless of type, and each type then has its own set of required and optional fields on top. Sending a request that’s missing a required field returns 422 with a single error message naming every missing field, so you can fix all of them in one round trip.

Universal required fields (every asset_type)

These five are required on every request, no matter which type you are creating.
string
required
One of aircraft or engine. Sending apu or landing_gear returns 422.
string
required
One of Starting, In process, or Completed. Case-sensitive. The teardown is published into the matching active_* state. See status lifecycle. UI label: “Status *”.
string (date)
required
ISO date. Stored as teardown_start_date — the column the detail page reads to render “Start Date”. UI label: “Start Date *”.
string
required
Free-text teardown location, e.g. Tucson, AZ. UI label: “Teardown Location *”.
string
required
ISO country code, e.g. US. UI label: “Country *”.

asset_type = "aircraft"

Mirrors the UI wizard’s aircraft teardown form exactly.

Required for aircraft

string
required
Human-readable name from the aircraft-types vocabulary, e.g. A320-200. Case-insensitive. Unknown values return 400 unknown_vocabulary with the full allowed list in the body. UI label: “Aircraft *” (on the type-selection step).
string
required
The last operator’s name, e.g. Delta. UI label: “Aircraft Traceability *” on the wizard, “Last Operator” in the marketplace browse table. Shown only on the aircraft form — the engine form hides this field, and the API mirrors that.
Yes or No. UI label: “Incident Related *”. Aircraft-only — engines don’t carry an incident-related concept, so the API and the UI both omit it from the engine flow.

Optional for aircraft

string
Aircraft tail / registration number, e.g. VT-ABC. UI label: “Tail Number”. Maps to DB column teardowns.registration.
string
Manufacturer serial number. UI label: “MSN”.
string (date)
Optional teardown end date. Not on the create wizard step but surfaced on the edit page and accepted on create for partners that already know it.
string
Free-text description shown in the Description card on the detail page. UI label: “Description”.

asset_type = "engine"

Mirrors the UI wizard’s engine teardown form exactly. Notably, the engine form does not ask for traceability or incident_related, and the API follows the same rule.

Required for engine

string
required
Human-readable name from the engine-models vocabulary, e.g. CFM56-5B. Case-insensitive. Unknown values return 400 unknown_vocabulary with the full allowed list in the body. UI label: “Engine *” (on the type-selection step).

Optional for engine

string
Engine serial number. UI label: “ESN”.
string (date)
Optional teardown end date. Not on the create wizard step but surfaced on the edit page and accepted on create for partners that already know it.
string
Free-text description shown in the Description card on the detail page. UI label: “Description”.

audience is intentionally NOT on the create body — it’s a document-visibility decision. Set it on the upload call that attaches your first document, or via PATCH later. See audience.
Strict mode is on for this endpoint. Sending an unknown body key returns 422 that tells you which key was wrong. Common stale names to avoid: registration (use tail_number), location_country (use country), estimated_teardown_date (use start_date), aircraft_type_id (use the name, not the UUID). The fields location_city, sub_status, non_incident_statement, apu_model, and landing_gear_type are NOT accepted on the public surface — sending any of them returns 422.

Response

201 Created. The body is the full teardown in the same shape every GET returns. Save the teardown_id — you’ll need it for upload, PATCH, or transition calls.
string (UUID)
The new teardown’s identifier.
string (UUID)
Same as the X-Organization-Id you sent.
string
Echoed back.
object
Full vocabulary row for whichever asset_type you chose: { id, name, manufacturer, category, is_active, created_at }. The engine_model field is populated symmetrically when relevant. Legacy teardowns may surface apu_model / landing_gear_type on reads, but neither is creatable through the public API.
string
Internal lifecycle name: active_starting / active_in_process / active_completed.
string
Human label: Starting / In Process / Completed.
string (datetime)
Set to “now” at create time.
string (datetime)
Set to 90 days from publish. Auto-archives when reached.
array | null
Always null immediately after create — populated by upload calls.
array | null
Always null immediately after create.
array | null
Always null immediately after create.

Common gotchas

  • status is case-sensitive. starting returns 422.
  • Only aircraft and engine are accepted. Sending asset_type=apu or asset_type=landing_gear returns 422. Those flows aren’t shipped in the UI yet.
  • One vocabulary field per asset_type. Sending engine_model while asset_type=aircraft is silently ignored — only the matching field is read.
  • audience here returns 422. Set it on the upload call or via PATCH.
  • teardown_status_label is RESPONSE only. The server computes it from your status; sending it on the request body returns 422 (strict mode).
  • The teardown auto-archives in 90 days. Run a transition or PATCH a fresh expires_at to extend.

See also