Skip to main content
POST
Import or replace a site from an archive

Authorizations

Authorization
string
header
required

An API key minted at Settings › API & MCP. Send it as Authorization: Bearer <key>. A key carries its holder's own permissions, resolved on every call — revoking a membership closes the key's reach immediately. Keep it in an environment variable (GOOSY_API_KEY), never in a committed file.

Query Parameters

workspace
string

Which workspace to act in — its slug or id. The SAME argument every workspace-scoped tool takes, resolved the same way: an account-wide key may select any workspace its holder currently reaches, a workspace-pinned key may only name its own, and a call that names nothing falls through to your default. It is a QUERY parameter rather than a body field on purpose: this endpoint's body is a multipart upload, and reading a field out of it would decode that body before the bearer and the rate limiter had run. With more than one reachable workspace and no default, the call is refused as workspace_ambiguous and the choices are listed. Ignored for a signed-in session, whose workspace comes from its own claims.

Minimum string length: 1
confirm
string

The handle a previous 202 answered with. Present ⇒ apply the diff that handle was issued for: the archive must be byte-identical to the one the diff was shown for, and the site's current project must still be the base it was shown against, else 400 (confirmation_stale). Ignored on a first upload.

Minimum string length: 1

Body

multipart/form-data
file
file
required

The single ZIP archive to import.

siteId
string<uuid>

Replace the source or staged bundle on this existing site. Omit to create one.

name
string

Display name for a NEWLY created site. Ignored when siteId is sent.

Response

The archive was applied, or was identical to the current project. Read data.outcome first: ingested (then data.kind tells a staged upload from a queued build) or unchanged (nothing was written).

ok
boolean
required
data
object
required