> ## Documentation Index
> Fetch the complete documentation index at: https://teardowns.aero/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Get one teardown

> Fetch a single teardown by id.

Returns the full teardown record for one of your org's teardowns.
Cross-org access returns **404 not\_found** we never reveal whether
the id exists in another org.

## Headers

<ParamField header="Authorization" type="string" required>
  `Bearer tdao_live_…`
</ParamField>

<ParamField header="X-Organization-Id" type="string" required>
  Your organization's UUID.
</ParamField>

## Path parameters

<ParamField path="teardown_id" type="string (UUID)" required>
  The teardown's id (from the `teardown_id` field on create / list
  responses).
</ParamField>

## Response

`200 OK`. The same shape returned by the create endpoint partner
field names (`teardown_id`, `tail_number`, `start_date`, `country`,
`end_date`).

<ResponseField name="teardown_id" type="string (UUID)" />

<ResponseField name="org_id" type="string (UUID)" />

<ResponseField name="asset_type" type="string">
  `aircraft` or `engine` for any teardown created through the public
  API. Legacy UI-created rows may still surface `apu` or `landing_gear`.
</ResponseField>

<ResponseField name="aircraft_type | engine_model | apu_model | landing_gear_type" type="object">
  Whichever vocabulary row matches the asset\_type, populated with
  `{ id, name, manufacturer, category, is_active }`. The remaining
  vocabulary fields are `null`. `apu_model` and `landing_gear_type`
  appear only on legacy teardowns the public API can't create them.
</ResponseField>

<ResponseField name="tail_number" type="string | null" />

<ResponseField name="msn" type="string | null" />

<ResponseField name="traceability" type="string | null" />

<ResponseField name="start_date" type="string (date) | null" />

<ResponseField name="end_date" type="string (date) | null" />

<ResponseField name="status" type="string">
  Internal lifecycle value:
  `active_starting | active_in_process | active_completed | suspended | archived`.
</ResponseField>

<ResponseField name="teardown_status_label" type="string | null">
  Human label: `Starting | In Process | Completed`.
</ResponseField>

<ResponseField name="incident_related" type="string | null">
  `Yes` or `No`.
</ResponseField>

<ResponseField name="location / location_city / country" type="string | null">
  `location_city` may be set on legacy rows but cannot be written via
  the public API.
</ResponseField>

<ResponseField name="description" type="string | null" />

<ResponseField name="documents" type="array of URLs | null">
  Attached document URLs. Subject to audience filtering when read by
  a different org (this endpoint always returns the full list since
  it's org-scoped to the owner).
</ResponseField>

<ResponseField name="images" type="array of URLs | null">
  Attached image URLs.
</ResponseField>

<ResponseField name="audience" type="array | null">
  `null` = "anyone with platform access". Otherwise a non-empty list
  of company types.
</ResponseField>

<ResponseField name="audience_set_at" type="string (datetime) | null">
  When the audience field was last changed.
</ResponseField>

<ResponseField name="published_at" type="string (datetime) | null" />

<ResponseField name="expires_at" type="string (datetime) | null">
  Auto-archive deadline. Resets to now + 90 days on certain transitions.
</ResponseField>

<ResponseField name="created_at / updated_at" type="string (datetime)" />

<RequestExample>
  ```bash curl theme={null}
  curl "$base_url/public/v1/teardowns/$teardown_id" \
    -H "Authorization: Bearer $api_key" \
    -H "X-Organization-Id: $org_id"
  ```

  ```python python theme={null}
  import requests
  resp = requests.get(
      f"{base_url}/public/v1/teardowns/{teardown_id}",
      headers={"Authorization": f"Bearer {api_key}", "X-Organization-Id": org_id},
  )
  if resp.status_code == 404:
      print("Teardown not found (or not yours)")
  else:
      resp.raise_for_status()
      teardown = resp.json()
  ```
</RequestExample>

<ResponseExample>
  ```jsonc 200 OK theme={null}
  {
    "teardown_id": "3c707051-021d-4d04-a8e7-4eb254e80858",
    "org_id": "72f95f4e-65bb-41b3-8ef4-226c5a59cbc1",
    "created_by": "afdb4059-345b-4adb-b8f1-4035668f22d7",
    "asset_type": "aircraft",
    "aircraft_type": {
      "id": "c0000000-0000-0000-0000-000000000002",
      "name": "A320-200",
      "manufacturer": "Airbus",
      "category": "Narrowbody",
      "is_active": true
    },
    "tail_number": "VT-ABC",
    "msn": "12345",
    "traceability": "Delta",
    "start_date": "2026-08-01",
    "end_date": null,
    "status": "active_starting",
    "teardown_status_label": "Starting",
    "incident_related": "No",
    "description": "Posted from ERP",
    "location": "Tucson, AZ",
    "country": "US",
    "documents": [
      "https://.../teardowns-media/teardowns/3c707.../documents/ab12_specs.pdf"
    ],
    "images": null,
    "audience": ["Airline", "MRO"],
    "audience_set_at": "2026-05-26T20:15:00Z",
    "published_at": "2026-05-26T20:06:50.677262Z",
    "expires_at": "2026-08-24T20:06:50.677262Z",
    "created_at": "2026-05-26T20:06:48.825931Z",
    "updated_at": "2026-05-26T20:15:00Z"
  }
  ```

  ```jsonc 404 Not Found theme={null}
  {
    "detail": "Teardown not found"
  }
  ```
</ResponseExample>

## Why 404 for foreign-org teardowns

Returning `403` would tell a probing caller that the id exists in some
other org that's a side channel for enumerating other partners'
teardowns. `404` collapses "doesn't exist" and "not yours" into one
response, so neither case leaks information.

## See also

* [Update a teardown](/api-reference/teardowns/update) to PATCH any
  field on the row.
* [Transition a teardown](/api-reference/teardowns/transition) to
  change its lifecycle state.
* [Audience](/concepts/audience) for the `audience` field's behaviour.
