curl -X PATCH "$base_url/public/v1/teardowns/$teardown_id" \
-H "Authorization: Bearer $api_key" \
-H "X-Organization-Id: $org_id" \
-H "Content-Type: application/json" \
-d '{
"description": "Updated via API",
"tail_number": "VT-XYZ",
"country": "IN",
"audience": ["Airline", "MRO"]
}'
import requests
resp = requests.patch(
f"{base_url}/public/v1/teardowns/{teardown_id}",
headers={
"Authorization": f"Bearer {api_key}",
"X-Organization-Id": org_id,
},
json={
"description": "Updated via API",
"tail_number": "VT-XYZ",
"country": "IN",
"audience": ["Airline", "MRO"],
},
)
resp.raise_for_status()
# Pass null to clear back to "anyone with platform access"
curl -X PATCH "$base_url/public/v1/teardowns/$teardown_id" \
-H "Authorization: Bearer $api_key" \
-H "X-Organization-Id: $org_id" \
-H "Content-Type: application/json" \
-d '{"audience": null}'
{
"teardown_id": "3c707051-021d-4d04-a8e7-4eb254e80858",
...
"tail_number": "VT-XYZ",
"country": "IN",
"description": "Updated via API",
"audience": ["Airline", "MRO"],
"audience_set_at": "2026-05-27T08:00:00Z",
"updated_at": "2026-05-27T08:00:00Z"
}
{
"detail": {
"error_code": "unknown_vocabulary",
"field": "aircraft_type",
"value": "A320-poo",
"valid_values": ["A320-200", "A321-200", ...],
"message": "Unknown aircraft_type: 'A320-poo'. See valid_values."
}
}
{
"detail": "Teardown not found"
}
Teardowns
Update a teardown
Partial update only the fields you send are applied.
PATCH
/
public
/
v1
/
teardowns
/
{teardown_id}
curl -X PATCH "$base_url/public/v1/teardowns/$teardown_id" \
-H "Authorization: Bearer $api_key" \
-H "X-Organization-Id: $org_id" \
-H "Content-Type: application/json" \
-d '{
"description": "Updated via API",
"tail_number": "VT-XYZ",
"country": "IN",
"audience": ["Airline", "MRO"]
}'
import requests
resp = requests.patch(
f"{base_url}/public/v1/teardowns/{teardown_id}",
headers={
"Authorization": f"Bearer {api_key}",
"X-Organization-Id": org_id,
},
json={
"description": "Updated via API",
"tail_number": "VT-XYZ",
"country": "IN",
"audience": ["Airline", "MRO"],
},
)
resp.raise_for_status()
# Pass null to clear back to "anyone with platform access"
curl -X PATCH "$base_url/public/v1/teardowns/$teardown_id" \
-H "Authorization: Bearer $api_key" \
-H "X-Organization-Id: $org_id" \
-H "Content-Type: application/json" \
-d '{"audience": null}'
{
"teardown_id": "3c707051-021d-4d04-a8e7-4eb254e80858",
...
"tail_number": "VT-XYZ",
"country": "IN",
"description": "Updated via API",
"audience": ["Airline", "MRO"],
"audience_set_at": "2026-05-27T08:00:00Z",
"updated_at": "2026-05-27T08:00:00Z"
}
{
"detail": {
"error_code": "unknown_vocabulary",
"field": "aircraft_type",
"value": "A320-poo",
"valid_values": ["A320-200", "A321-200", ...],
"message": "Unknown aircraft_type: 'A320-poo'. See valid_values."
}
}
{
"detail": "Teardown not found"
}
PATCH a teardown your organization owns. Sparse only the keys on
your request body are written. Omitted keys are left alone.
Use this for:
- Correcting a typo in
msnortail_number - Re-classifying with a different vocab name
- Setting / changing / clearing the
audience - Updating dates, location, traceability, description
status lifecycle changes go through the
state machine.
Headers
string
required
Bearer tdao_live_…string
required
Your organization’s UUID.
string
required
application/jsonPath parameters
string (UUID)
required
Body
Every field is optional. Sending an empty body returns the teardown unchanged.string
Re-classify by name. Same case-insensitive lookup as create.
An unknown value returns
400 unknown_vocabulary with the allowed
list in the body. APU and landing-gear vocab fields are not patchable
through the public surface.string
string
string
string (date)
Maps to
teardowns.teardown_start_date.string (date)
string
Yes or No.string
string
string
ISO country code.
array | null
Set who can see the teardown’s documents. Pass an array of company
types (
Airline / Lessor / OEM / MRO / Distributor /
Others), or pass null to clear the restriction back to
“anyone with platform access”.This is the JSON-array form. The document-upload endpoint accepts
the same concept as a comma-separated string. See
audience.array of URLs
Direct overwrite. Usually you want the upload / delete-by-url
endpoints instead.
array of URLs
Direct overwrite. Usually you want the upload / delete-by-url
endpoints instead.
location_city, sub_status, non_incident_statement, apu_model,
and landing_gear_type are NOT patchable on the public surface
sending any of them returns 422 (strict mode). If you need to update
one of those fields, use the web app.status is not patchable here. Use the transition
endpoint so lifecycle moves run
through the state machine. Sending status returns a 422 (strict mode
catches unknown body keys).Same goes for teardown_status_label it’s a derived label, not
something you set directly.Response
200 OK. The full updated teardown in the same shape as the GET / POST
responses (partner field names).
curl -X PATCH "$base_url/public/v1/teardowns/$teardown_id" \
-H "Authorization: Bearer $api_key" \
-H "X-Organization-Id: $org_id" \
-H "Content-Type: application/json" \
-d '{
"description": "Updated via API",
"tail_number": "VT-XYZ",
"country": "IN",
"audience": ["Airline", "MRO"]
}'
import requests
resp = requests.patch(
f"{base_url}/public/v1/teardowns/{teardown_id}",
headers={
"Authorization": f"Bearer {api_key}",
"X-Organization-Id": org_id,
},
json={
"description": "Updated via API",
"tail_number": "VT-XYZ",
"country": "IN",
"audience": ["Airline", "MRO"],
},
)
resp.raise_for_status()
# Pass null to clear back to "anyone with platform access"
curl -X PATCH "$base_url/public/v1/teardowns/$teardown_id" \
-H "Authorization: Bearer $api_key" \
-H "X-Organization-Id: $org_id" \
-H "Content-Type: application/json" \
-d '{"audience": null}'
{
"teardown_id": "3c707051-021d-4d04-a8e7-4eb254e80858",
...
"tail_number": "VT-XYZ",
"country": "IN",
"description": "Updated via API",
"audience": ["Airline", "MRO"],
"audience_set_at": "2026-05-27T08:00:00Z",
"updated_at": "2026-05-27T08:00:00Z"
}
{
"detail": {
"error_code": "unknown_vocabulary",
"field": "aircraft_type",
"value": "A320-poo",
"valid_values": ["A320-200", "A321-200", ...],
"message": "Unknown aircraft_type: 'A320-poo'. See valid_values."
}
}
{
"detail": "Teardown not found"
}
Audit trail
PATCH writes:teardown.updatedthe generic update audit, withprevious_statecontaining the old values formsn,registration,description, andnew_statecontaining the sparse body you sent.teardown.audience.setorteardown.audience.changedif the audience field changed. Two separate action codes so support can filter “first time it was restricted” vs “subsequent change”.
via_api, api_key_id, api_key_prefix, actor_email).
See also
- Transition for changing lifecycle state.
- Audience for the visibility model.
- Vocabularies for the name-based lookup behaviour shared with create.

