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

# Reserve a complete publication

> Reserves the entire table inventory in the selected Workspace and returns direct upload grants. Each table declares its name, input format, size, SHA-256 and row count; the worker derives its schema when it analyses the upload. Reusing a revision ID requires an identical declaration; a replacement names the expected active revision. A table whose name, input SHA-256 and row count match that revision reuses its stored data and gets no upload grant.

## Access

This operation needs a Parable token. An MCP token cannot call it. See [Authentication](/getting-started/authentication.md) for the kinds of token.

Your roles must grant `tenant.artifacts.upload`.


## OpenAPI

````yaml /api-reference/openapi.json post /api/artifact-publications/actions/reserve
openapi: 3.0.3
info:
  description: >-
    Use the Workspace API to work with artifacts, connectors, Parables, and
    account resources.
  title: Workspace API
  version: v2026.10.22.1
servers: []
security: []
paths:
  /api/artifact-publications/actions/reserve:
    post:
      tags:
        - Artifacts
      summary: Reserve a complete publication
      description: >-
        Reserves the entire table inventory in the selected Workspace and
        returns direct upload grants. Each table declares its name, input
        format, size, SHA-256 and row count; the worker derives its schema when
        it analyses the upload. Reusing a revision ID requires an identical
        declaration; a replacement names the expected active revision. A table
        whose name, input SHA-256 and row count match that revision reuses its
        stored data and gets no upload grant.
      operationId: ArtifactsReserveArtifactPublicationHandler
      parameters:
        - description: >-
            Workspace slug. Overrides subdomain-based workspace resolution when
            provided.
          in: header
          name: X-Tenant
          required: false
          schema:
            example: acme
            type: string
        - description: Optional request correlation ID echoed back in the response.
          in: header
          name: X-Request-ID
          required: false
          schema:
            example: 550e8400-e29b-41d4-a716-446655440000
            format: uuid
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ReserveArtifactPublicationInput'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                properties:
                  data:
                    $ref: '#/components/schemas/ReserveArtifactPublicationResult'
                  links:
                    $ref: '#/components/schemas/ResponseLinks'
                  meta:
                    $ref: '#/components/schemas/ResponseMeta'
                required:
                  - data
                  - meta
                type: object
          description: Successful response
          headers:
            X-Request-ID:
              $ref: '#/components/headers/X-Request-ID'
        '400':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
          description: >-
            The request is not valid. `detail` says why. A value that breaks a
            field rule gives the code `WA-VL-001` and an `errors` member that
            names each field.
          headers:
            X-Request-ID:
              $ref: '#/components/headers/X-Request-ID'
        '401':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
          description: The token is missing, malformed, revoked, or expired.
          headers:
            X-Request-ID:
              $ref: '#/components/headers/X-Request-ID'
        '403':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
          description: >-
            The token cannot make this request. For example, the roles of its
            owner do not allow the operation.
          headers:
            X-Request-ID:
              $ref: '#/components/headers/X-Request-ID'
        '500':
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
          description: The request failed on the server.
          headers:
            X-Request-ID:
              $ref: '#/components/headers/X-Request-ID'
      security:
        - bearerAuth: []
      x-codeSamples:
        - label: TypeScript SDK
          lang: typescript
          source: >-
            import { WebApiSDK } from "@parable-platform/web-api-sdk";

            import type { ReserveArtifactPublicationInput } from
            "@parable-platform/web-api-types";


            const sdk = new WebApiSDK({
              baseUrl: process.env.PARABLE_API_URL!,
              auth: { token: process.env.PARABLE_API_TOKEN! },
              requestInterceptor: (config) => ({
                ...config,
                headers: { ...config.headers, "X-Tenant": process.env.PARABLE_WORKSPACE! },
              }),
            });


            const input: ReserveArtifactPublicationInput = JSON.parse(`{
              "namespaceId": "550e8400-e29b-41d4-a716-446655440000",
              "namespaceSlug": "example",
              "revisionId": "550e8400-e29b-41d4-a716-446655440000",
              "tables": []
            }`);

            const result = await sdk.artifacts.reserveArtifactPublication(
              input
            );
        - label: Python SDK
          lang: python
          source: |-
            import json
            import os

            from parable_types_web_api import ReserveArtifactPublicationInput
            from parable_web_api_sdk import ClientConfig, WebApiSDK

            sdk = WebApiSDK(
                ClientConfig(
                    base_url=os.environ["PARABLE_API_URL"],
                    auth_token=os.environ["PARABLE_API_TOKEN"],
                    default_headers={"X-Tenant": os.environ["PARABLE_WORKSPACE"]},
                )
            )

            input_data = ReserveArtifactPublicationInput.model_validate(
                json.loads("{\"namespaceId\":\"550e8400-e29b-41d4-a716-446655440000\",\"namespaceSlug\":\"example\",\"revisionId\":\"550e8400-e29b-41d4-a716-446655440000\",\"tables\":[]}"),
            )
            result = sdk.artifacts.reserve_artifact_publication(input_data)
        - label: Rust SDK
          lang: rust
          source: >-
            use parable_web_api_sdk::{types, ClientConfig, RequestOptions,
            WebApiSdk};


            let sdk = WebApiSdk::new(ClientConfig::with_base_url(
                std::env::var("PARABLE_API_URL")?,
                Some(std::env::var("PARABLE_API_TOKEN")?),
                None,
            ))?;

            let options = RequestOptions::with_header("X-Tenant",
            std::env::var("PARABLE_WORKSPACE")?, None, None);


            let input: types::ReserveArtifactPublicationInput =
            serde_json::from_value(
                serde_json::json!({
              "namespaceId": "550e8400-e29b-41d4-a716-446655440000",
              "namespaceSlug": "example",
              "revisionId": "550e8400-e29b-41d4-a716-446655440000",
              "tables": []
            }),

            )?;

            let result = sdk.artifacts.reserve_artifact_publication(
                input,
                Some(&options)
            ).await?;
        - label: Go SDK
          lang: go
          source: "sdk, err := webapisdk.New(webapisdk.SDKConfig{\n\tBaseURL: os.Getenv(\"PARABLE_API_URL\"),\n\tAuth:    &webapisdk.AuthConfig{Token: os.Getenv(\"PARABLE_API_TOKEN\")},\n\tRequestInterceptor: func(ctx context.Context, req *http.Request) error {\n\t\treq.Header.Set(\"X-Tenant\", os.Getenv(\"PARABLE_WORKSPACE\"))\n\t\treturn nil\n\t},\n})\nif err != nil {\n\treturn err\n}\n\nvar input webapitypes.ReserveArtifactPublicationInput\nif err := json.Unmarshal([]byte(`{\"namespaceId\":\"550e8400-e29b-41d4-a716-446655440000\",\"namespaceSlug\":\"example\",\"revisionId\":\"550e8400-e29b-41d4-a716-446655440000\",\"tables\":[]}`), &input); err != nil {\n\treturn err\n}\nresult, err := sdk.ArtifactsNamespace.ReserveArtifactPublication(ctx, input)"
components:
  schemas:
    ReserveArtifactPublicationInput:
      additionalProperties: false
      properties:
        expectedBaseRevisionId:
          description: UUID v4 with automatic base62 encoding for client-facing APIs
          nullable: true
          pattern: >-
            ^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
          type: string
        namespaceId:
          description: UUID v4 with automatic base62 encoding for client-facing APIs
          pattern: >-
            ^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
          type: string
        namespaceSlug:
          description: >-
            An immutable data-catalog segment:
            parables.{parable_slug}.{plot_slug}
          maxLength: 255
          minLength: 1
          pattern: ^[a-z][a-z0-9]*(_[a-z0-9]+)*$
          type: string
        revisionId:
          description: UUID v4 with automatic base62 encoding for client-facing APIs
          pattern: >-
            ^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
          type: string
        tables:
          items:
            $ref: '#/components/schemas/ArtifactPublicationTableInput'
          type: array
      required:
        - namespaceId
        - namespaceSlug
        - revisionId
        - tables
      type: object
    ReserveArtifactPublicationResult:
      properties:
        receipt:
          $ref: '#/components/schemas/ArtifactPublicationReceipt'
        uploads:
          description: Only tables still requiring a source upload receive a grant.
          items:
            $ref: '#/components/schemas/ArtifactPublicationUpload'
          type: array
      required:
        - receipt
        - uploads
      type: object
    ResponseLinks:
      properties:
        first:
          nullable: true
          type: string
        last:
          nullable: true
          type: string
        next:
          nullable: true
          type: string
        prev:
          nullable: true
          type: string
      type: object
    ResponseMeta:
      properties:
        requestId:
          description: Unique identifier for the request
          type: string
        totalCount:
          description: Total count of items for paginated responses
          nullable: true
          type: integer
      required:
        - requestId
      type: object
    ProblemDetails:
      description: An error response in the Problem Details format (RFC 9457).
      properties:
        code:
          description: The stable error code, when the problem has one.
          example: WA-VL-001
          type: string
        detail:
          description: What went wrong with this request.
          type: string
        details:
          description: >-
            Structured facts about the refusal, such as the entity or the path
            it concerns. Only some refusals have it.
        errors:
          description: >-
            The fields or filters that failed validation. Only a validation or
            filter error has it.
        requestId:
          description: >-
            The ID of the request, when the problem has one. The `X-Request-ID`
            response header always has it.
          type: string
        status:
          description: The HTTP status code.
          example: 400
          type: integer
        title:
          description: A short summary, usually the text of the HTTP status.
          example: Bad Request
          type: string
        type:
          description: >-
            The problem type. It is `about:blank`: the status and `code`
            identify the problem.
          example: about:blank
          type: string
      required:
        - type
        - title
        - status
        - detail
      type: object
    ArtifactPublicationTableInput:
      additionalProperties: false
      description: >-
        Complete immutable input declaration. Storage locations are assigned by
        the service,

        and the worker derives the table's schema from the uploaded input.
      properties:
        inputFormat:
          $ref: '#/components/schemas/ArtifactInputFormat'
        inputSha256:
          description: Lowercase hexadecimal SHA-256 digest
          maxLength: 64
          minLength: 64
          pattern: ^[0-9a-f]{64}$
          type: string
        name:
          description: >-
            An immutable data-catalog segment:
            parables.{parable_slug}.{plot_slug}
          maxLength: 255
          minLength: 1
          pattern: ^[a-z][a-z0-9]*(_[a-z0-9]+)*$
          type: string
        rowCount:
          description: >-
            Signed 64-bit integer; range bounded by JavaScript's safe-integer
            ceiling.
          format: int64
          maximum: 9007199254740991
          minimum: -9007199254740991
          type: integer
        sizeBytes:
          description: File size in bytes (non-negative, BIGINT-backed)
          format: int64
          maximum: 9007199254740991
          minimum: 0
          type: integer
      required:
        - name
        - rowCount
        - inputSha256
        - sizeBytes
        - inputFormat
      type: object
    ArtifactPublicationReceipt:
      properties:
        activeRevisionId:
          description: UUID v4 with automatic base62 encoding for client-facing APIs
          nullable: true
          pattern: >-
            ^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
          type: string
        expectedBaseRevisionId:
          description: UUID v4 with automatic base62 encoding for client-facing APIs
          nullable: true
          pattern: >-
            ^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
          type: string
        failureCode:
          nullable: true
          type: string
        namespaceId:
          description: UUID v4 with automatic base62 encoding for client-facing APIs
          pattern: >-
            ^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
          type: string
        namespaceSlug:
          description: >-
            An immutable data-catalog segment:
            parables.{parable_slug}.{plot_slug}
          maxLength: 255
          minLength: 1
          pattern: ^[a-z][a-z0-9]*(_[a-z0-9]+)*$
          type: string
        previousRevisionId:
          description: >-
            The revision active before the current one; activation can switch
            back to it.
          nullable: true
          pattern: >-
            ^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
          type: string
        revisionId:
          description: UUID v4 with automatic base62 encoding for client-facing APIs
          pattern: >-
            ^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
          type: string
        state:
          $ref: '#/components/schemas/ArtifactRevisionStateEnum'
        tables:
          items:
            $ref: '#/components/schemas/ArtifactPublicationTableReceipt'
          type: array
      required:
        - namespaceId
        - namespaceSlug
        - revisionId
        - state
        - tables
      type: object
    ArtifactPublicationUpload:
      properties:
        expiresAt:
          description: >-
            ISO8601 datetime string. Epoch wire values keep this scalar and
            declare x-temporal-format (unix, unix_millis, unix_micros,
            unix_nanos) on the property; the unit is never guessed from digit
            count.
          format: date-time
          type: string
        name:
          description: >-
            An immutable data-catalog segment:
            parables.{parable_slug}.{plot_slug}
          maxLength: 255
          minLength: 1
          pattern: ^[a-z][a-z0-9]*(_[a-z0-9]+)*$
          type: string
        requiredHeaders:
          items:
            $ref: '#/components/schemas/ArtifactUploadHeader'
          type: array
        tableId:
          description: UUID v4 with automatic base62 encoding for client-facing APIs
          pattern: >-
            ^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
          type: string
        uploadUrl:
          description: Valid HTTP/HTTPS URL
          format: uri
          maxLength: 2048
          pattern: >-
            ^https?://[\w\-\{\}]+(\.[\w\-\{\}]+)+([:/?#][\w\-\._~:/?#\[\]@!\$&'\(\)\*\+,;=\{\}%]*)?$
          type: string
      required:
        - tableId
        - name
        - uploadUrl
        - requiredHeaders
        - expiresAt
      type: object
    ArtifactInputFormat:
      description: >-
        The single transport-format contract shared by uploads and publication
        ingestion.
      enum:
        - CSV
        - ARROW_IPC_STREAM
        - OPAQUE
      type: string
    ArtifactRevisionStateEnum:
      description: >-
        READY means activated successfully at least once; the namespace selects
        the current revision.
      enum:
        - STAGING
        - FAILED
        - READY
      type: string
    ArtifactPublicationTableReceipt:
      properties:
        analysisWork:
          oneOf:
            - $ref: '#/components/schemas/ArtifactWorkStatus'
            - enum:
                - null
              nullable: true
              type: object
        declaration:
          $ref: '#/components/schemas/ArtifactPublicationTableInput'
        ingestWork:
          oneOf:
            - $ref: '#/components/schemas/ArtifactWorkStatus'
            - enum:
                - null
              nullable: true
              type: object
        outputSchema:
          description: >-
            The schema the worker derived from the uploaded input. Null until
            analysis succeeds.
          nullable: true
          type: object
        reused:
          description: >-
            True when the table was unchanged from the base revision and reuses
            its stored data.
          type: boolean
        storageVerified:
          type: boolean
        tableId:
          description: UUID v4 with automatic base62 encoding for client-facing APIs
          pattern: >-
            ^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
          type: string
      required:
        - tableId
        - declaration
        - storageVerified
        - reused
      type: object
    ArtifactUploadHeader:
      properties:
        name:
          type: string
        value:
          type: string
      required:
        - name
        - value
      type: object
    ArtifactWorkStatus:
      properties:
        artifactId:
          description: UUID v4 with automatic base62 encoding for client-facing APIs
          pattern: >-
            ^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
          type: string
        errorCode:
          oneOf:
            - $ref: '#/components/schemas/ArtifactWorkErrorCode'
            - enum:
                - null
              nullable: true
              type: string
        errorMessage:
          nullable: true
          type: string
        state:
          $ref: '#/components/schemas/ArtifactWorkState'
        tapId:
          description: UUID v4 with automatic base62 encoding for client-facing APIs
          nullable: true
          pattern: >-
            ^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
          type: string
        workId:
          description: UUID v4 with automatic base62 encoding for client-facing APIs
          pattern: >-
            ^([0-9A-Za-z]{1,22}|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
          type: string
      required:
        - workId
        - artifactId
        - state
      type: object
    ArtifactWorkErrorCode:
      enum:
        - INVALID_SOURCE
        - INVALID_SCHEMA
        - SIZE_MISMATCH
        - CHECKSUM_MISMATCH
        - ROW_COUNT_MISMATCH
        - UNSUPPORTED_FORMAT
        - STORAGE_ERROR
        - CANCELLED
        - INTERNAL_ERROR
        - DISPATCH_REJECTED
        - DISPATCH_EXHAUSTED
      type: string
    ArtifactWorkState:
      enum:
        - PENDING
        - CLAIMED
        - RUNNING
        - SUCCEEDED
        - FAILED
        - CANCELLED
      type: string
  headers:
    X-Request-ID:
      description: >-
        The ID of the request. It is the `X-Request-ID` value that you sent, or
        an ID that the server made. Give it when you report a problem.
      schema:
        type: string
  securitySchemes:
    bearerAuth:
      description: >-
        A personal access token, which starts with `pat_`. A Parable token can
        call each operation that the roles of its owner allow. An MCP token can
        call only the read operations that are open to agents. A SQL token does
        not work on this API.
      scheme: bearer
      type: http

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.