---
title: "Confirm the uploaded bytes"
method: POST
path: "/projects/{project}/uploads/{upload}/confirm"
tags: ["Views"]
---

# Confirm the uploaded bytes

`POST /projects/{project}/uploads/{upload}/confirm`

## Request

- Base URL: `https://api.getfacade.ai/api/v1`
- URL: `https://api.getfacade.ai/api/v1/projects/{project}/uploads/{upload}/confirm`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://api.getfacade.ai/oauth/authorize`, token URL `https://api.getfacade.ai/oauth/token`, scopes: `agent`)

Third leg. Starts reading the photo. Repeating it changes nothing.

## Path parameters

- `project` string, required
- `upload` string, required

## Response `200`

Confirmed

- object
  - `data` Upload: One photo entering one building. `validation` says what the server made of it and whether it is still reading; `outcome` names what it created — a `angle` (a view to design from), a `reference` kept with the building, or nothing at all for a refusal.
    - `type` 'upload'
    - `id` string
    - `attributes` object
      - `status` 'pending' | 'processing' | 'valid' | 'invalid' | 'different_building' | 'info_source' | 'reference' | 'output_style' | 'technical_error' | 'prohibited': Where an upload stands. `pending` and `processing` mean the server is still reading it; poll `validation.is_in_progress` rather than matching on these, so a status added later does not read as "finished". The rest are final. `valid` — a view of the building to design from. `info_source`, `reference` and `output_style` — the file was kept with the building as a drawing, a reference or a render style; `promote` claims it as a view instead. `different_building` — it looks like another house: kept as a reference, or refused outright when `view` was asked for. `invalid` — not usable, with the reason in `recommendations`. `prohibited` — the file was removed. `technical_error` — the read failed on our side: nothing was created, nothing was charged, send the same photo again.
      - `intent` 'auto' | 'view'
      - `original_filename` string, nullable
      - `file` object, nullable: The stored bytes, once the upload is confirmed; `null` before that.
        - `md5` string
        - `url` string: Permanent public link to the file
      - `upload_policy` UploadPolicy, nullable: Where to PUT the bytes. `null` once the upload is confirmed — there is nothing left to send. When `skip_upload` is true the server already holds these bytes: `url` is empty and the PUT is skipped, so go straight to confirm.
        - `url` string: Presigned target; empty string when `skip_upload` is true
        - `method` string
        - `headers` object: Send these verbatim with the PUT. Empty object when none are needed.
        - `expires_in` integer: Seconds the presigned URL stays valid. Absent when `skip_upload` is true.
        - `skip_upload` boolean: Present only when true.
      - `validation` object: What the server made of the photo. Poll on `is_in_progress`, then read the rest: the flags below say where the file went and what may still be done with it.
        - `status` 'pending' | 'processing' | 'valid' | 'invalid' | 'different_building' | 'info_source' | 'reference' | 'output_style' | 'technical_error' | 'prohibited': Where an upload stands. `pending` and `processing` mean the server is still reading it; poll `validation.is_in_progress` rather than matching on these, so a status added later does not read as "finished". The rest are final. `valid` — a view of the building to design from. `info_source`, `reference` and `output_style` — the file was kept with the building as a drawing, a reference or a render style; `promote` claims it as a view instead. `different_building` — it looks like another house: kept as a reference, or refused outright when `view` was asked for. `invalid` — not usable, with the reason in `recommendations`. `prohibited` — the file was removed. `technical_error` — the read failed on our side: nothing was created, nothing was charged, send the same photo again.
        - `is_in_progress` boolean: True while the server is still reading. The only flag to poll on.
        - `is_valid` boolean, nullable
        - `is_technical_error` boolean: The read itself failed. Nothing was created and nothing was charged — send the same photo again rather than treating it as a refusal.
        - `validation_failure_reason` string, nullable
        - `recommendations` string, nullable: The server's own wording of the outcome. Repeat it as it is.
        - `can_override_building` boolean: True when this upload can still be claimed as a view of the building — `POST …/uploads/{upload}/promote`. Check it before calling promote; without it the call answers 422.
        - `routed_to_documents` boolean: The file was kept as a drawing or document of the building.
        - `routed_to_references` boolean: The file was kept as a reference alongside the building.
        - `routed_to_output_style` boolean: The file was kept as a render style. Set alongside `routed_to_references`, since a render style lives with the references.
        - `routed_reference_id` string, nullable: The reference the file became, when it became one. Same id as `outcome`.
        - `auto_accepted_as_view` boolean: The photo read as inspiration, but it is the building's first, so it was kept as a view. Say so, and offer to file it as a reference instead.
      - `outcome` object
        - `type` 'angle' | 'reference' | 'null', nullable
        - `id` string, nullable
      - `created_at` string, date-time
      - `updated_at` string, date-time

## Other responses

- `401`: The key is missing, revoked or expired. Re-issuing a key is a human action.
- `403`: The key is valid but this building belongs to another account. The message is the API's own text; show it unchanged.
- `422`: The request was understood and refused. The message is the API's own text; show it unchanged. `IDEMPOTENCY_KEY_REQUIRED` — a paid call from an agent key with no `Idempotency-Key` header; nothing was queued, send it again with one. `IDEMPOTENCY_KEY_REUSED` — that header value already names a different request; a new order needs a new value.

---

[API](https://skmtc.dev/getfacade/apis/getfacade-agent-api.md) · [All operations](https://skmtc.dev/getfacade/apis/getfacade-agent-api/llms.txt) · [OpenAPI document](https://skmtc.dev/getfacade/apis/getfacade-agent-api/revisions/2b52eda7362c?raw)
