Skip to content

chore(api): sync OpenAPI contract - #51

Draft
kong[bot] wants to merge 1 commit into
mainfrom
chore/sync-openapi
Draft

chore(api): sync OpenAPI contract#51
kong[bot] wants to merge 1 commit into
mainfrom
chore/sync-openapi

Conversation

@kong

@kong kong Bot commented Jul 13, 2026

Copy link
Copy Markdown

Summary

API change report

Public API

New Endpoints: 9


GET /projects/{id}/auth/pages/appearance
DELETE /projects/{id}/auth/pages/theme
PUT /projects/{id}/auth/pages/theme
DELETE /projects/{id}/auth/pages/{pageType}/layout
PUT /projects/{id}/auth/pages/{pageType}/layout
POST /projects/{id}/auth/pages/{pageType}/preview
DELETE /projects/{id}/source-export
GET /projects/{id}/source-export
POST /projects/{id}/source-export

Deleted Endpoints: 1


POST /projects/{id}/git-connection/repository

Modified Endpoints: 50


POST /databases/{databaseName}/branches/{branchName}/query/delete

  • Responses changed
    • New response: 503
    • Modified response: 429
      • Description changed from 'The query was rejected by a monthly usage cap: either the platform user's
        bandwidth cap (aggregate ingress + egress across owned projects) or the
        project's monthly database-request cap. Enforcement is eventual: queries
        are rejected until the relevant cap increases (plan/override) or the
        calendar-month meter resets. The error message identifies which cap.
        ' to 'The query was rejected by a billing-cycle allowance: either the owning
        platform user's bandwidth allowance (aggregate ingress + egress across
        owned projects) or their database-request allowance. Enforcement is
        eventual: queries are rejected until the allowance increases or the
        next anniversary cycle begins. The error message identifies the resource.
        '

POST /databases/{databaseName}/branches/{branchName}/query/insert

  • Responses changed
    • New response: 503
    • Modified response: 429
      • Description changed from 'The query was rejected by a monthly usage cap: either the platform user's
        bandwidth cap (aggregate ingress + egress across owned projects) or the
        project's monthly database-request cap. Enforcement is eventual: queries
        are rejected until the relevant cap increases (plan/override) or the
        calendar-month meter resets. The error message identifies which cap.
        ' to 'The query was rejected by a billing-cycle allowance: either the owning
        platform user's bandwidth allowance (aggregate ingress + egress across
        owned projects) or their database-request allowance. Enforcement is
        eventual: queries are rejected until the allowance increases or the
        next anniversary cycle begins. The error message identifies the resource.
        '

POST /databases/{databaseName}/branches/{branchName}/query/ping

  • Responses changed
    • New response: 503
    • Modified response: 429
      • Description changed from 'The query was rejected by a monthly usage cap: either the platform user's
        bandwidth cap (aggregate ingress + egress across owned projects) or the
        project's monthly database-request cap. Enforcement is eventual: queries
        are rejected until the relevant cap increases (plan/override) or the
        calendar-month meter resets. The error message identifies which cap.
        ' to 'The query was rejected by a billing-cycle allowance: either the owning
        platform user's bandwidth allowance (aggregate ingress + egress across
        owned projects) or their database-request allowance. Enforcement is
        eventual: queries are rejected until the allowance increases or the
        next anniversary cycle begins. The error message identifies the resource.
        '

POST /databases/{databaseName}/branches/{branchName}/query/select

  • Responses changed
    • New response: 503
    • Modified response: 429
      • Description changed from 'The query was rejected by a monthly usage cap: either the platform user's
        bandwidth cap (aggregate ingress + egress across owned projects) or the
        project's monthly database-request cap. Enforcement is eventual: queries
        are rejected until the relevant cap increases (plan/override) or the
        calendar-month meter resets. The error message identifies which cap.
        ' to 'The query was rejected by a billing-cycle allowance: either the owning
        platform user's bandwidth allowance (aggregate ingress + egress across
        owned projects) or their database-request allowance. Enforcement is
        eventual: queries are rejected until the allowance increases or the
        next anniversary cycle begins. The error message identifies the resource.
        '

POST /databases/{databaseName}/branches/{branchName}/query/update

  • Responses changed
    • New response: 503
    • Modified response: 429
      • Description changed from 'The query was rejected by a monthly usage cap: either the platform user's
        bandwidth cap (aggregate ingress + egress across owned projects) or the
        project's monthly database-request cap. Enforcement is eventual: queries
        are rejected until the relevant cap increases (plan/override) or the
        calendar-month meter resets. The error message identifies which cap.
        ' to 'The query was rejected by a billing-cycle allowance: either the owning
        platform user's bandwidth allowance (aggregate ingress + egress across
        owned projects) or their database-request allowance. Enforcement is
        eventual: queries are rejected until the allowance increases or the
        next anniversary cycle begins. The error message identifies the resource.
        '

POST /databases/{databaseName}/query/delete

  • Responses changed
    • Modified response: 429
      • Description changed from 'The query was rejected by a monthly usage cap: either the platform user's
        bandwidth cap (aggregate ingress + egress across owned projects) or the
        project's monthly database-request cap. Enforcement is eventual: queries
        are rejected until the relevant cap increases (plan/override) or the
        calendar-month meter resets. The error message identifies which cap.
        ' to 'The query was rejected by a billing-cycle allowance: either the owning
        platform user's bandwidth allowance (aggregate ingress + egress across
        owned projects) or their database-request allowance. Enforcement is
        eventual: queries are rejected until the allowance increases or the
        next anniversary cycle begins. The error message identifies the resource.
        '

POST /databases/{databaseName}/query/insert

  • Responses changed
    • Modified response: 429
      • Description changed from 'The query was rejected by a monthly usage cap: either the platform user's
        bandwidth cap (aggregate ingress + egress across owned projects) or the
        project's monthly database-request cap. Enforcement is eventual: queries
        are rejected until the relevant cap increases (plan/override) or the
        calendar-month meter resets. The error message identifies which cap.
        ' to 'The query was rejected by a billing-cycle allowance: either the owning
        platform user's bandwidth allowance (aggregate ingress + egress across
        owned projects) or their database-request allowance. Enforcement is
        eventual: queries are rejected until the allowance increases or the
        next anniversary cycle begins. The error message identifies the resource.
        '

POST /databases/{databaseName}/query/ping

  • Responses changed
    • Modified response: 429
      • Description changed from 'The query was rejected by a monthly usage cap: either the platform user's
        bandwidth cap (aggregate ingress + egress across owned projects) or the
        project's monthly database-request cap. Enforcement is eventual: queries
        are rejected until the relevant cap increases (plan/override) or the
        calendar-month meter resets. The error message identifies which cap.
        ' to 'The query was rejected by a billing-cycle allowance: either the owning
        platform user's bandwidth allowance (aggregate ingress + egress across
        owned projects) or their database-request allowance. Enforcement is
        eventual: queries are rejected until the allowance increases or the
        next anniversary cycle begins. The error message identifies the resource.
        '

POST /databases/{databaseName}/query/select

  • Responses changed
    • Modified response: 429
      • Description changed from 'The query was rejected by a monthly usage cap: either the platform user's
        bandwidth cap (aggregate ingress + egress across owned projects) or the
        project's monthly database-request cap. Enforcement is eventual: queries
        are rejected until the relevant cap increases (plan/override) or the
        calendar-month meter resets. The error message identifies which cap.
        ' to 'The query was rejected by a billing-cycle allowance: either the owning
        platform user's bandwidth allowance (aggregate ingress + egress across
        owned projects) or their database-request allowance. Enforcement is
        eventual: queries are rejected until the allowance increases or the
        next anniversary cycle begins. The error message identifies the resource.
        '

POST /databases/{databaseName}/query/update

  • Responses changed
    • Modified response: 429
      • Description changed from 'The query was rejected by a monthly usage cap: either the platform user's
        bandwidth cap (aggregate ingress + egress across owned projects) or the
        project's monthly database-request cap. Enforcement is eventual: queries
        are rejected until the relevant cap increases (plan/override) or the
        calendar-month meter resets. The error message identifies which cap.
        ' to 'The query was rejected by a billing-cycle allowance: either the owning
        platform user's bandwidth allowance (aggregate ingress + egress across
        owned projects) or their database-request allowance. Enforcement is
        eventual: queries are rejected until the allowance increases or the
        next anniversary cycle begins. The error message identifies the resource.
        '

POST /functions/{functionId}/invoke

  • Description changed from 'Invoke a serverless function.

With Service Key (admin/background operations):

  • Use for background jobs, webhooks, cron, admin operations
  • Function receives payload only (no user context)
  • Database queries bypass RLS (admin access)

With Auth User Token (user-facing):

  • Use for user-initiated actions
  • Function receives payload + __volcano_auth context:
    {
      user_id: "uuid",
      email: "user@example.com",
      project_id: "uuid",
      role: "authenticated" or "anonymous"
    }
  • Database queries enforce RLS (user-scoped data)

With Anon Key (public function only):

  • Requires anon key permission: functions.invoke
  • Function must have is_public: true
  • Function receives payload only (no __volcano_auth)

Transport and CORS:

  • Direct invocation endpoint is intended for http://api.<domain>/functions/{functionId}/invoke
  • DNS invocation endpoint is https://{functionId}.functions.<domain>/
  • CORS preflight for invocation allows only POST, OPTIONS
    ' to 'Invoke a serverless function.

With Service Key (admin/background operations):

  • Use for background jobs, webhooks, cron, admin operations
  • Function receives payload only (no user context)
  • Database queries bypass RLS (admin access)

With Auth User Token (user-facing):

  • Use for user-initiated actions
  • Function receives payload + __volcano_auth context:
    {
      user_id: "uuid",
      email: "user@example.com",
      project_id: "uuid",
      role: "authenticated" or "anonymous"
    }
  • Database queries enforce RLS (user-scoped data)

With Anon Key (public function only):

  • Requires anon key permission: functions.invoke
  • Function must have is_public: true
  • Function receives payload only (no __volcano_auth)

Transport and CORS:

  • This operation is the authenticated direct RPC endpoint and always uses the
    POST {payload: ...} contract, including for functions whose DNS ingress is
    configured in HTTP mode.
  • The geo-routed DNS ingress is https://{functionId}.functions.<domain>/.
  • RPC-mode DNS ingress accepts POST at /. HTTP-mode DNS ingress accepts GET,
    HEAD, POST, PUT, PATCH, and DELETE at / and nested paths.
  • Direct and RPC-mode CORS preflight advertises POST, OPTIONS. HTTP-mode DNS
    preflight advertises GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS.
  • http_auth_mode: none applies only to public HTTP-mode DNS ingress; this
    direct operation always requires a Volcano credential.
    '
  • Responses changed
    • Modified response: 429
      • Description changed from 'Rate limit exceeded (per-function or project-wide limit), or the
        owning platform user's monthly bandwidth cap (aggregate ingress +
        egress) was exceeded.
        ' to 'Rate limit exceeded (per-function or project-wide limit), or the
        owning platform user's billing-cycle bandwidth allowance (aggregate ingress +
        egress) was exceeded.
        '

GET /projects/{id}/auth/hosted-pages/{pageType}

  • Modified path param: pageType
    • Schema changed
      • New enum values: [signup forgot-password device verify-email]
  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: page
                • Property 'AllOf' changed
                  • Modified schema: #/components/schemas/AuthHostedPage
                    • Properties changed
                    • Modified property: page_type
                    • New enum values: [signup forgot-password device verify-email]

PUT /projects/{id}/auth/hosted-pages/{pageType}

  • Modified path param: pageType
    • Schema changed
      • New enum values: [signup forgot-password device verify-email]
  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: page
                • Property 'AllOf' changed
                  • Modified schema: #/components/schemas/AuthHostedPage
                    • Properties changed
                    • Modified property: page_type
                    • New enum values: [signup forgot-password device verify-email]

GET /projects/{id}/auth/hosted/{pageType}

  • Summary changed from 'Render managed reset-password page' to 'Render a managed auth page'
  • Description changed from 'Public HTML endpoint for the managed reset-password page.
    Requires Accept: text/html.
    Returns 404 when managed hosted pages are disabled for the project.
    ' to 'Public HTML endpoint for signup, forgot-password, device approval,
    verify-email, and reset-password pages. Login uses the path without a
    page type.
    Requires Accept: text/html.
    Returns 404 when managed hosted pages are disabled for the project.
    '
  • Modified path param: pageType
    • Schema changed
      • New enum values: [signup forgot-password device verify-email]

GET /projects/{id}/config

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: auth
                • Properties changed
                  • Modified property: managed_pages
                    • Properties changed
                    • New property: appearance
                    • Modified property: pages
                    • Properties changed
                    • New property: device
                    • New property: forgot_password
                    • New property: signup
                    • New property: verify_email
              • Modified property: functions
                • Items changed
                  • Properties changed
                    • New property: http_auth_mode
                    • New property: invocation_mode
                    • New property: openapi_spec

PUT /projects/{id}/config

  • Request body changed
    • Content changed
      • Modified media type: application/json
        • Schema changed
          • Properties changed
            • Modified property: auth
              • Properties changed
                • Modified property: managed_pages
                  • Properties changed
                    • New property: appearance
                    • Modified property: pages
                    • Properties changed
                    • New property: device
                    • New property: forgot_password
                    • New property: signup
                    • New property: verify_email
            • Modified property: functions
              • Items changed
                • Properties changed
                  • New property: http_auth_mode
                  • New property: invocation_mode
                  • New property: openapi_spec

GET /projects/{id}/databases

  • New query param: status

POST /projects/{id}/databases

  • Description changed from 'Creates a serverless PostgreSQL database in the project.
    Each project can contain up to 100 databases. Requests over this cap return 403.
    ' to 'Creates a serverless PostgreSQL database in the project.
    Each project can hold 1 database on Free and up to 10,000 on Pro.
    Requests over the plan's cap return 403.
    '

DELETE /projects/{id}/databases/{databaseName}

  • Responses changed
    • New response: 503

PUT /projects/{id}/databases/{databaseName}/backup-schedule

  • Responses changed
    • Modified response: 400
      • Description changed from 'Invalid schedule' to 'The schedule names a recurrence that cannot fire: a weekly or
        monthly one with no day, or a day outside its frequency's range
        (1-7 for weekly, 1-28 for monthly). The response says which.
        '
    • Modified response: 409
      • Description changed from 'The database is not active' to 'The database is not active, or a restore is running on it — a restore
        moves the data to a new branch, and the provider keeps the schedule
        per branch.
        '

GET /projects/{id}/databases/{databaseName}/backups

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: restore_window
                • Description changed from 'The span a point-in-time restore may target. Empty when the owner's plan
                  does not include point-in-time restore.
                  ' to 'The span a point-in-time restore may target. Absent from the response
                  when the owner's plan does not include point-in-time restore, and while
                  the storage provider has no history window in place yet — briefly the
                  case after an upgrade, since the window is applied asynchronously. The
                  window is read from the provider rather than from the plan, so it never
                  advertises a point a restore could not actually reach.
                  '

POST /projects/{id}/databases/{databaseName}/backups

  • Responses changed
    • Modified response: 409
      • Description changed from 'A backup of that name already exists, the database is not active, or
        a backup was taken too recently.
        ' to 'A backup of that name already exists, the database is not active, a
        restore is running on it, or a backup was taken too recently.
        '

DELETE /projects/{id}/databases/{databaseName}/backups/{backupName}

  • Description changed from 'Deletes the backup and frees its storage. Scheduled backups can be
    deleted too. A backup that is already gone reports 404, so a name
    that never existed and a name that no longer does read the same.

Refused with 409 while the database is being restored.
' to 'Deletes the backup and frees its storage. Scheduled backups can be
deleted too. A backup that is already gone reports 404, so a name
that never existed and a name that no longer does read the same.
Refused with 409 while the database is being restored.
'

POST /projects/{id}/databases/{databaseName}/branches

  • Responses changed
    • Modified response: 409
      • Description changed from 'A branch of that name already exists on this database, or the
        database cannot be branched right now because it is still
        provisioning, failed, or being deleted.
        ' to 'A branch of that name already exists on this database, or the
        database cannot be branched right now because it is still
        provisioning, being restored, failed, or being deleted.
        '

DELETE /projects/{id}/databases/{databaseName}/branches/{branchName}

  • Description changed from 'Marks the branch for teardown and returns immediately. The branch stops
    accepting connections at once; its fork and its row are removed by a
    background job, so a provider outage cannot leave the call hanging or the
    branch half-deleted.

Deleting a branch that is still provisioning is allowed and stops the
build. Deleting a branch that is already gone succeeds.
' to 'Marks the branch for teardown and returns immediately. The branch stops
accepting connections at once; its fork and its row are removed by a
background job, so a provider outage cannot leave the call hanging or the
branch half-deleted.

Deleting a branch that is still provisioning is allowed and stops the
build, and repeating the call while teardown is in progress is accepted
again. Once the branch is gone the call returns 404.
'

POST /projects/{id}/databases/{databaseName}/branches/{branchName}/reset

  • Responses changed
    • Modified response: 409
      • Description changed from 'The branch is not active, or a reset is already in progress.
        ' to 'The branch is not active, a reset is already in progress, the parent
        database is being restored, or the parent was restored within the
        last 24 hours — a reset re-forks from the parent, and the provider
        holds a child's reset shut for that long afterwards.
        '

POST /projects/{id}/databases/{databaseName}/branches/{branchName}/reset-password

  • Description changed from 'Issues a new password for the branch and invalidates the previous
    connection string. Existing connections are not interrupted; new ones
    must use the returned string.

The parent database's credentials are untouched.
' to 'Issues a new password for the branch and invalidates the previous
connection string. Existing connections are not interrupted; new ones
must use the returned string. Proxies pick the rotation up within a few
seconds, so the previous password can still open new connections until
then.

The parent database's credentials are untouched.
'

POST /projects/{id}/databases/{databaseName}/reset-password

  • Description changed from 'Rotates the Volcano-managed PostgreSQL password used by clients when connecting
    through pgproxy. This does not rotate or expose the internal owner password.
    The returned password and connection string are the only client credentials that
    will authenticate through pgproxy after reset.
    ' to 'Rotates the Volcano-managed PostgreSQL password used by clients when connecting
    through pgproxy. This does not rotate or expose the internal owner password.
    The returned password and connection string are the only client credentials that
    will authenticate through pgproxy after reset.

Existing connections are not interrupted; new ones must use the returned
string. Proxies pick the rotation up within a few seconds, so the previous
password can still open new connections until then.
'

  • Responses changed
    • New response: 503

POST /projects/{id}/databases/{databaseName}/restores

  • Request body changed
    • Content changed
      • Modified media type: application/json
        • Schema changed
          • Properties changed
            • Modified property: backup_name
              • Description changed from 'A backup of this database to restore.' to 'A backup of this database to restore, exactly as returned by the list
                endpoint.

Deliberately looser than the names you can create, like the backup
path parameter: a backup made by a schedule is named for you, so
restoring one accepts any name a backup can have.
'
- MinLength changed from 0 to 1
- MaxLength changed from 63 to 128
- Pattern changed from '^[a-z0-9][a-z0-9_-]{0,62}$' to ''

PATCH /projects/{id}/databases/{databaseName}/type

  • Responses changed
    • New response: 503

POST /projects/{id}/frontends

  • Description changed from 'Creates and deploys a frontend for the project.
    If a frontend with the same name already exists in the project, this operation updates that
    frontend using the uploaded archive and starts a new deployment. A deployment that starts
    immediately returns status: provisioning, then transitions to active, degraded, or
    failed. If another deployment is running, the response preserves the frontend's current status
    and exposes the queued deployment through pending_deployment_id.
    Existing frontend traffic continues to use an available runtime while the new deployment builds
    and provisions. Each deployment publishes its own static assets before the runtimes switch to its
    build, and the live build's assets keep serving until the new deployment is live, so a page loaded
    mid-deployment resolves its assets whichever build served it. A failed redeploy puts the runtimes
    back on the build they were running, leaves the frontend active on the previous deployment, and
    records the attempted deployment as failed. degraded means the runtime remains available but
    edge synchronization requires recovery; Volcano retries the edge step without rebuilding. Only one deployment may run for a
    given frontend, while independent frontends and projects can deploy concurrently.
    For monorepos, provide app_root as a relative path from the uploaded archive root
    to the Next.js app that should be built. Omit it for single-app archives.
    Supported frontend environments are Next.js 15.x and 16.x with Node.js
    22.x or 24.x. The Node.js runtime is inferred from
    package.json engines.node; if omitted, Volcano uses Node.js 22.x.
    The selected Node.js family must also satisfy the installed Next.js package's
    engines.node constraint. Volcano tests Next 15.5.23 (^18.18.0 || ^19.8.0 || >=20.0.0) and Next 16.3.2 (>=20.9.0).
    Source archive size is enforced by the API with SOURCE_ARCHIVE_SIZE_LIMIT_MB; the CLI
    does not apply its own source archive size limit. After the final container images are
    built, the publish build enforces LAMBDA_TARGET_CONTAINER_SIZE_LIMIT_MB before pushing.
    This operation is limited by plan-based frontend deployment quotas (FREE_FRONTEND_DEPLOYMENTS, PRO_FRONTEND_DEPLOYMENTS).
    Each project can contain up to 10,000 frontends regardless of plan.
    ' to 'Creates and deploys a frontend for the project.
    If a frontend with the same name already exists in the project, this operation updates that
    frontend using the uploaded archive and starts a new deployment. A deployment that starts
    immediately returns status: provisioning, then transitions to active, degraded, or
    failed. If another deployment is running, the response preserves the frontend's current status
    and exposes the queued deployment through pending_deployment_id.
    Existing frontend traffic continues to use an available runtime while the new deployment builds
    and provisions. Each deployment publishes its own static assets before the runtimes switch to its
    build, and the live build's assets keep serving until the new deployment is live, so a page loaded
    mid-deployment resolves its assets whichever build served it. A failed redeploy puts the runtimes
    back on the build they were running, leaves the frontend active on the previous deployment, and
    records the attempted deployment as failed. degraded means the runtime remains available but
    edge synchronization requires recovery; Volcano retries the edge step without rebuilding. Only one deployment may run for a
    given frontend, while independent frontends and projects can deploy concurrently.
    For monorepos, provide app_root as a relative path from the uploaded archive root
    to the Next.js app that should be built. Omit it for single-app archives.
    Supported frontend environments are Next.js 15.x and 16.x with Node.js
    22.x or 24.x. The Node.js runtime is inferred from
    package.json engines.node; if omitted, Volcano uses Node.js 22.x.
    The selected Node.js family must also satisfy the installed Next.js package's
    engines.node constraint. Volcano tests Next 15.5.25 (^18.18.0 || ^19.8.0 || >=20.0.0) and Next 16.3.4 (>=20.9.0).
    Source archive size is enforced by the API with SOURCE_ARCHIVE_SIZE_LIMIT_MB; the CLI
    does not apply its own source archive size limit. After the final container images are
    built, the publish build enforces LAMBDA_TARGET_CONTAINER_SIZE_LIMIT_MB before pushing.
    This operation is limited by plan-based frontend deployment quotas (FREE_FRONTEND_DEPLOYMENTS, PRO_FRONTEND_DEPLOYMENTS).
    Each project can contain up to 10,000 frontends regardless of plan.
    '

POST /projects/{id}/frontends/{frontendId}/domain

  • Responses changed
    • Modified response: 409
      • Description changed from 'Conflict - custom domain already in use or frontend already has a custom domain' to 'Conflict - custom domain already in use, still detaching, or frontend already has a custom domain'

GET /projects/{id}/functions

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: data
                • Items changed
                  • Required changed
                    • New required property: has_openapi_spec
                    • New required property: http_auth_mode
                    • New required property: invocation_mode
                    • New required property: openapi_spec
                  • Properties changed
                    • New property: has_openapi_spec
                    • New property: http_auth_mode
                    • New property: invocation_mode
                    • New property: openapi_spec

POST /projects/{id}/functions

  • Request body changed
    • Content changed
      • Modified media type: multipart/form-data
        • Schema changed
          • Properties changed
            • New property: http_auth_mode
            • New property: invocation_mode
            • New property: is_public
            • New property: openapi_spec
  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Required changed
              • New required property: has_openapi_spec
              • New required property: http_auth_mode
              • New required property: invocation_mode
              • New required property: openapi_spec
            • Properties changed
              • New property: has_openapi_spec
              • New property: http_auth_mode
              • New property: invocation_mode
              • New property: openapi_spec
    • Modified response: 201
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Required changed
              • New required property: has_openapi_spec
              • New required property: http_auth_mode
              • New required property: invocation_mode
              • New required property: openapi_spec
            • Properties changed
              • New property: has_openapi_spec
              • New property: http_auth_mode
              • New property: invocation_mode
              • New property: openapi_spec

POST /projects/{id}/functions/batch

  • Responses changed
    • Modified response: 202
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: data
                • Items changed
                  • Required changed
                    • New required property: has_openapi_spec
                    • New required property: http_auth_mode
                    • New required property: invocation_mode
                    • New required property: openapi_spec
                  • Properties changed
                    • New property: has_openapi_spec
                    • New property: http_auth_mode
                    • New property: invocation_mode
                    • New property: openapi_spec
    • Modified response: 207
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: data
                • Items changed
                  • Required changed
                    • New required property: has_openapi_spec
                    • New required property: http_auth_mode
                    • New required property: invocation_mode
                    • New required property: openapi_spec
                  • Properties changed
                    • New property: has_openapi_spec
                    • New property: http_auth_mode
                    • New property: invocation_mode
                    • New property: openapi_spec

GET /projects/{id}/functions/{functionId}

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Required changed
              • New required property: has_openapi_spec
              • New required property: http_auth_mode
              • New required property: invocation_mode
              • New required property: openapi_spec
            • Properties changed
              • New property: has_openapi_spec
              • New property: http_auth_mode
              • New property: invocation_mode
              • New property: openapi_spec

PATCH /projects/{id}/functions/{functionId}

  • Request body changed
    • Content changed
      • Modified media type: application/json
        • Schema changed
          • AdditionalProperties changed from null to false
          • Required changed
            • Deleted required property: is_public
          • MinProps changed from 0 to 1
          • Properties changed
            • New property: http_auth_mode
            • New property: invocation_mode
            • New property: openapi_spec
  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Required changed
              • New required property: has_openapi_spec
              • New required property: http_auth_mode
              • New required property: invocation_mode
              • New required property: openapi_spec
            • Properties changed
              • New property: has_openapi_spec
              • New property: http_auth_mode
              • New property: invocation_mode
              • New property: openapi_spec

DELETE /projects/{id}/git-connection

  • Responses changed
    • New response: 409

PUT /projects/{id}/git-connection

  • Responses changed
    • New response: 409

PUT /projects/{id}/git-connection/production-branch

  • Responses changed
    • New response: 409

PUT /projects/{id}/git-deploy-settings

  • Responses changed
    • New response: 409

GET /public/{projectId}/{bucketName}/{path}

  • Responses changed
    • Modified response: 429
      • Description changed from 'The platform user exceeded their monthly bandwidth cap (aggregate
        ingress + egress across owned projects). Enforcement is eventual:
        requests are rejected until the cap increases (plan/override) or the
        calendar-month meter resets.
        ' to 'The platform user exceeded their billing-cycle bandwidth allowance (aggregate
        ingress + egress across owned projects). Enforcement is eventual:
        requests are rejected until the allowance increases or the next
        anniversary cycle begins.
        '

GET /storage/{bucketName}

  • Responses changed
    • Modified response: 429
      • Description changed from 'The platform user exceeded their monthly bandwidth cap (aggregate
        ingress + egress across owned projects). Enforcement is eventual:
        requests are rejected until the cap increases (plan/override) or the
        calendar-month meter resets.
        ' to 'The platform user exceeded their billing-cycle bandwidth allowance (aggregate
        ingress + egress across owned projects). Enforcement is eventual:
        requests are rejected until the allowance increases or the next
        anniversary cycle begins.
        '

POST /storage/{bucketName}/copy

  • Responses changed
    • Modified response: 429
      • Description changed from 'The platform user exceeded their monthly bandwidth cap (aggregate
        ingress + egress across owned projects). Enforcement is eventual:
        requests are rejected until the cap increases (plan/override) or the
        calendar-month meter resets.
        ' to 'The platform user exceeded their billing-cycle bandwidth allowance (aggregate
        ingress + egress across owned projects). Enforcement is eventual:
        requests are rejected until the allowance increases or the next
        anniversary cycle begins.
        '

POST /storage/{bucketName}/move

  • Responses changed
    • Modified response: 429
      • Description changed from 'The platform user exceeded their monthly bandwidth cap (aggregate
        ingress + egress across owned projects). Enforcement is eventual:
        requests are rejected until the cap increases (plan/override) or the
        calendar-month meter resets.
        ' to 'The platform user exceeded their billing-cycle bandwidth allowance (aggregate
        ingress + egress across owned projects). Enforcement is eventual:
        requests are rejected until the allowance increases or the next
        anniversary cycle begins.
        '

DELETE /storage/{bucketName}/{path}

  • Description changed from 'Delete a file, or abort a resumable upload session.

File Delete (default):
Deletes the file at the specified path.

Abort Session (with X-Upload-Session header):
Aborts a resumable upload session and cleans up any uploaded parts.
' to 'Delete a file, or abort a resumable upload session.

File Delete (default):
Deletes the file at the specified path.

Abort Session (with X-Upload-Session header):
Aborts a resumable upload session and cleans up any uploaded parts.
Anonymous sessions must reuse the exact anon key that created the session.
'

  • Responses changed
    • Modified response: 404
      • Description changed from 'Object or session not found' to 'Object or session not found, or session not owned by this credential'
    • Modified response: 429
      • Description changed from 'The platform user exceeded their monthly bandwidth cap (aggregate
        ingress + egress across owned projects). Enforcement is eventual:
        requests are rejected until the cap increases (plan/override) or the
        calendar-month meter resets.
        ' to 'The platform user exceeded their billing-cycle bandwidth allowance (aggregate
        ingress + egress across owned projects). Enforcement is eventual:
        requests are rejected until the allowance increases or the next
        anniversary cycle begins.
        '
  • Security changed
    • New security requirements: AnonKey

GET /storage/{bucketName}/{path}

  • Description changed from 'Download a file, or get the status of a resumable upload session.

File Download (default):
Downloads the file at the specified path.

Session Status (with X-Upload-Session header):
Returns the status of a resumable upload session, including which parts have been uploaded.
' to 'Download a file, or get the status of a resumable upload session.

File Download (default):
Downloads the file at the specified path.

Session Status (with X-Upload-Session header):
Returns the status of a resumable upload session, including which parts have been uploaded.
Anonymous sessions must reuse the exact anon key that created the session.
'

  • Responses changed
    • Modified response: 404
      • Description changed from 'Object or session not found' to 'Object or session not found, or session not owned by this credential'
    • Modified response: 429
      • Description changed from 'The platform user exceeded their monthly bandwidth cap (aggregate
        ingress + egress across owned projects). Enforcement is eventual:
        requests are rejected until the cap increases (plan/override) or the
        calendar-month meter resets.
        ' to 'The platform user exceeded their billing-cycle bandwidth allowance (aggregate
        ingress + egress across owned projects). Enforcement is eventual:
        requests are rejected until the allowance increases or the next
        anniversary cycle begins.
        '

POST /storage/{bucketName}/{path}

  • Description changed from 'Unified endpoint for file uploads. Behavior depends on Content-Type and headers:

Simple Upload (multipart/form-data):
Upload a complete file in a single request. Best for files under 100MB.

Create Resumable Session (application/json):
Create a session for chunked uploads. Best for large files or unreliable networks.
Requires: Content-Type: application/json with body {"filename": "...", "content_type": "...", "total_size": ...}

Complete Resumable Session:
Complete a session after all parts are uploaded.
Requires: X-Upload-Session header with session ID and X-Upload-Complete: true header.
' to 'Unified endpoint for file uploads. Behavior depends on Content-Type and headers:

Simple Upload (multipart/form-data):
Upload a complete file in a single request. Bes

Report truncated; see the source commit for the complete contract diff.

Validation

@CLAassistant

CLAassistant commented Jul 13, 2026

Copy link
Copy Markdown

CLA assistant check
All committers have signed the CLA.

@kong
kong Bot force-pushed the chore/sync-openapi branch 10 times, most recently from 04d66d1 to b8d922a Compare July 20, 2026 13:54
@kong
kong Bot force-pushed the chore/sync-openapi branch 10 times, most recently from ee0bdba to eb217d3 Compare July 27, 2026 22:41
@kong
kong Bot force-pushed the chore/sync-openapi branch 9 times, most recently from bc4afe5 to 7b3fd89 Compare July 31, 2026 00:52
@kong
kong Bot force-pushed the chore/sync-openapi branch 6 times, most recently from 00a5297 to 0da965e Compare August 18, 2026 02:03
@kong
kong Bot force-pushed the chore/sync-openapi branch 12 times, most recently from 1e1dad2 to 75791c1 Compare August 26, 2026 20:08
@kong
kong Bot force-pushed the chore/sync-openapi branch 10 times, most recently from 4b98a9f to 1842671 Compare August 31, 2026 02:10
@kong
kong Bot force-pushed the chore/sync-openapi branch from 1842671 to cc201f1 Compare September 1, 2026 06:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant