---
title: "Submit"
method: POST
path: "/v1/gallery"
tags: ["gallery"]
---

# Submit

`POST /v1/gallery`

## Request

- Base URL: `https://api.craterview.ai`
- URL: `https://api.craterview.ai/v1/gallery`
- Auth: HTTP bearer

Offer a finished job to the gallery. Nothing is visible until it is approved.

Sharing keeps the job: its result and original are retained past the ordinary schedule,
exactly as asking to keep them would, and the gallery shows those retained copies. So a
post never outlives what it shows, your own links to a shared result do not expire
under it, and withdrawing changes nothing about what you keep. While a job is on the
gallery or awaiting review, its retention cannot be turned off — withdraw it first.

## Request body

- PostRequest
  - `job_id` string, required: The job whose before-and-after you are offering.
  - `consent` boolean: Required. Owning a file is not the consent of whoever appears in it, so this must be set deliberately and is never inferred.
  - `keep` boolean: No longer needed: sharing keeps the job's files past the ordinary schedule, so this is accepted and has no effect.
  - `description` string, nullable: Optional. A sentence or two to show with the picture on the gallery. The reviewer reads it with the submission and may shorten or correct it before publishing.

## Response `201`

Successful Response

- PostResponse
  - `id` string, required: Identifies this submission, for withdrawing it later.
  - `status` string, required: `pending` until a person decides, then `approved` or `rejected`. Nothing appears in the gallery without that decision.
  - `job_id` string, required: The job this post shows.
  - `public_model` string, nullable: The model that produced it.
  - `created_at` string, nullable: When the post was submitted. ISO-8601, UTC.
  - `decided_note` string, nullable: What you were told about the decision, when there is anything to say.
  - `description` string, nullable: The description this post goes out with: yours as sent, or as the reviewer edited it on approval.
  - `withdrawn` boolean: Whether you have taken this post back. A withdrawn post is not shown and is not reconsidered.
  - `kept` boolean: Whether the job's files are retained — kept past the ordinary schedule. True for every new submission: sharing keeps the job.

## Other responses

- `400`: the path, query or a JSON string in the body contains a NUL character or an unpaired surrogate; the body is not JSON encoded as UTF-8, or carries a number JSON cannot represent (NaN, Infinity, or one too large) or nesting too deep to read; or an Idempotency-Key header is longer than 255 characters or not printable ASCII. The request was not read
- `401`: missing, malformed or unrecognised API key
- `403`: a guest account, or consent not given
- `404`: no such finished job on this account, a job with no image left to publish, or one whose original has expired
- `409`: this job already has a submission awaiting moderation or published, or its pictures were deleted while it was being offered
- `413`: the request body is larger than 1 MiB. The request was not read
- `422`: the request did not validate
- `429`: the calling key's request rate is exceeded, or this account has made as many gallery submissions as it may in 24 hours. The allowance counts a rolling day, so a slot returns once the oldest submission is a day old, and Retry-After says when, for either.
- `503`: storage was briefly unavailable while preparing the submission; retry

---

[API](https://skmtc.dev/craterview/apis/craterview-ai-api.md) · [All operations](https://skmtc.dev/craterview/apis/craterview-ai-api/llms.txt) · [OpenAPI document](https://skmtc.dev/craterview/apis/craterview-ai-api/revisions/9419a5cd27cd?raw)
