Skip to content

chore(api): sync OpenAPI contract - #51

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

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
Contributor

Summary

API change report

Public API

New Endpoints: 22


GET /durable-functions/{functionId}/executions/{executionId}/messages
POST /durable-functions/{functionId}/executions/{executionId}/messages
POST /durable-messages/publish
POST /durable-messages/sessions
POST /durable-messages/waits
GET /projects/{id}/autofix
PUT /projects/{id}/autofix
GET /projects/{id}/autofix-runs
GET /projects/{id}/autofix-runs/{runId}
DELETE /projects/{id}/autofix/api-key
GET /projects/{id}/durable-functions/{functionId}/executions/{executionId}/message-waits
GET /projects/{id}/durable-functions/{functionId}/executions/{executionId}/messages
POST /projects/{id}/durable-functions/{functionId}/executions/{executionId}/messages
GET /projects/{id}/issues
GET /projects/{id}/issues/{issueId}
PATCH /projects/{id}/issues/{issueId}
POST /projects/{id}/issues/{issueId}/autofix-runs
GET /projects/{id}/variable-environments
POST /projects/{id}/variable-environments
DELETE /projects/{id}/variable-environments/{environmentId}
GET /projects/{id}/variable-environments/{environmentId}
PATCH /projects/{id}/variable-environments/{environmentId}

Deleted Endpoints: None


Modified Endpoints: 61


POST /auth/forgot-password

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • New response: 401

POST /auth/logout

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • New response: 401

POST /auth/oauth/exchange

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • Modified response: 401
      • Description changed from 'Missing or invalid project anon key' to 'Missing or invalid project anon key; or invalid auth proxy metadata'

GET /auth/password-policy

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • Modified response: 401
      • Description changed from 'Invalid, missing, or revoked anon key' to 'Invalid, missing, or revoked anon key; or invalid auth proxy metadata'

POST /auth/refresh

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • Modified response: 401
      • Description changed from 'Invalid or expired refresh token' to 'Invalid or expired refresh token; or invalid auth proxy metadata'

POST /auth/reset-password

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • Modified response: 401
      • Description changed from 'Invalid or expired token' to 'Invalid or expired token; or invalid auth proxy metadata'

POST /auth/signin

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • Modified response: 401
      • Description changed from 'Unauthorized - Invalid credentials, invalid/tampered/revoked anon key,
        or account banned/deleted
        ' to 'Unauthorized - Invalid credentials, invalid/tampered/revoked anon key,
        or account banned/deleted; or invalid auth proxy metadata
        '

POST /auth/signup

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • Modified response: 401
      • Description changed from 'Unauthorized - Invalid, tampered, revoked, or wrong-project anon key
        ' to 'Unauthorized - Invalid, tampered, revoked, or wrong-project anon key.
        Also returned for invalid, repeated, or under-scoped auth proxy metadata
        (invalid auth proxy metadata).
        '

POST /auth/signup-anonymous

  • New header param: x-volcano-client-ip
  • New header param: x-volcano-proxy-authorization
  • Responses changed
    • New response: 401

GET /capabilities

  • Description changed from 'Lists which product capabilities accept new work in this environment. Check it
    to decide what to offer, instead of calling a route to see whether it fails.
ID Covers
sandboxes The Sandbox API: presets, templates, sessions, and executions
sandboxes.sessions Starting and resuming sessions, and one-shot executions
sandboxes.custom_templates Deploying a custom template; its validation waits while sandboxes.sessions is unavailable

A capability missing from the list is unavailable, and a capability under
another, such as sandboxes.sessions, is unavailable whenever its parent is.
While a capability is unavailable, requests that start new work answer 404
or 400 with code feature_unavailable; refresh this list when you receive
that code. Reading, deleting, and terminating what already exists keep
working unless the whole feature is absent from the environment. Every caller
in an environment gets the same answer.
' to 'Lists which product capabilities accept new work in this environment. Check it
to decide what to offer, instead of calling a route to see whether it fails.

ID Covers
sandboxes The Sandbox API: presets, templates, sessions, and executions
sandboxes.sessions Starting and resuming sessions, and one-shot executions
sandboxes.custom_templates Deploying a custom template; its validation waits while sandboxes.sessions is unavailable
issues The Issues API: listing, reading, and updating grouped runtime errors
autofix The Autofix API: a project's AI diagnosis and fix settings
autofix.managed_models Turning autofix on with Volcano-managed models instead of your own API key

A capability missing from the list is unavailable, and a capability under
another, such as sandboxes.sessions, is unavailable whenever its parent is.
While a capability is unavailable, requests that start new work answer 404
or 400 with code feature_unavailable; refresh this list when you receive
that code. Reading, deleting, and terminating what already exists keep
working unless the whole feature is absent from the environment. Every caller
in an environment gets the same answer.
'

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: data
                • Items changed
                  • Properties changed
                    • Modified property: id
                    • Description changed from 'Stable capability ID, such as sandboxes, sandboxes.sessions, or sandboxes.custom_templates. New IDs may appear at any time.' to 'Stable capability ID, such as sandboxes, sandboxes.sessions, sandboxes.custom_templates, issues, or autofix. New IDs may appear at any time.'
          • Example changed from map[data:[map[id:sandboxes status:available] map[id:sandboxes.sessions status:available] map[id:sandboxes.custom_templates status:unavailable]]] to map[data:[map[id:sandboxes status:available] map[id:sandboxes.sessions status:available] map[id:sandboxes.custom_templates status:unavailable] map[id:issues status:available] map[id:autofix status:available] map[id:autofix.managed_models status:unavailable]]]

POST /durable-approvals

  • Request body changed

    • Content changed
      • Modified media type: application/json
        • Schema changed
          • Properties changed
            • Modified property: details
              • Extensions changed
                • New extension: x-go-type
                • New extension: x-go-type-skip-optional-pointer
              • Description changed from 'Any JSON value to show the person deciding. The whole request is
                limited to 64 KiB.
                ' to 'Any JSON value to show the person deciding. A number's exponent must
                be between -324 and 324, and a number too large or too precise to
                store is refused with 400. Numbers are read back written out in
                full, so the exponents' absolute values may total at most 65,536.
                The whole request is limited to 64 KiB.
                '
  • Responses changed

    • Modified response: 409
      • Description changed from 'The approval cannot be registered now. code says why:
  • approval_not_ready: the workflow has not finished opening the
    approval yet. Retry with a short backoff; the SDK does.

  • approval_closed: the workflow is no longer waiting on it.

  • execution_ended: the execution has finished.

  • too_many_pending_approvals: the execution already has the
    maximum number of pending approvals.
    ' to 'The approval cannot be registered now. code says why:

  • approval_not_ready: the workflow has not finished opening the
    approval yet. Retry with a short backoff; the SDK does.

  • approval_closed: the workflow is no longer waiting on it.

  • callback_taken: the callback is already registered as a
    message wait or a messages session.

  • execution_ended: the execution has finished.

  • too_many_pending_approvals: the execution already has the
    maximum number of pending approvals.
    '

POST /durable-functions/{functionId}/executions

  • Responses changed
    • Modified response: 202
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • New property: client_token
    • Modified response: 409
      • Description changed from 'Function is not deployed yet, or has no deployed region. Also
        returned when two starts under the same execution name raced and
        both released it, which is retryable as it stands.
        ' to 'Function is not deployed yet, or has no deployed region. Also
        returned when two starts under the same execution name raced and
        both released it, which is retryable as it stands, and with code
        execution_name_held when an unfinished start this caller may not
        resume holds the execution name, which needs a name of its own.
        '

POST /functions/{functionId}/invoke

  • Description changed from 'Invoke a function. The function's visibility decides which credentials
    may call it, and the function does not run for any other. A private
    function answers every credential but a service key exactly as a
    missing one, with 404, so its name and id cannot be discovered; an anon
    key on an authenticated function gets 403. An SDK calling by name
    resolves it first through GET /functions/resolve, which answers that
    anon key with 404 instead.

With Service Key (admin/background operations, every visibility):

  • 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, authenticated or public functions):

  • Use for user-initiated actions
  • Includes users from anonymous sign-ins
  • 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 functions only):

  • Requires anon key permission: functions.invoke
  • Function must have visibility: public
  • 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 the function's invoke_url. It is on a
    different domain from this API, so it cannot be derived from the API host.
  • 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.

Durable functions are not invocable here. A durable function's id
answers 404, whatever its visibility, because a synchronous call would
run it with no execution record, no idempotency and no concurrency
accounting. Start one with
POST /durable-functions/{functionId}/executions.
' to 'Invoke a function. The function's visibility decides which credentials
may call it, and the function does not run for any other. A private
function answers every credential but a service key exactly as a
missing one, with 404, so its name and id cannot be discovered; an anon
key on an authenticated function gets 403. An SDK calling by name
resolves it first through GET /functions/resolve, which answers that
anon key with 404 instead.

With Service Key (admin/background operations, every visibility):

  • 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, authenticated or public functions):

  • Use for user-initiated actions
  • Includes users from anonymous sign-ins
  • 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 functions only):

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

Reserved payload keys: the top-level __volcano_auth and
__volcano_http keys are reserved. Volcano removes caller-supplied
values for both before the function runs; only an auth user token adds
a server-built __volcano_auth, and only HTTP-mode ingress sets
__volcano_http: true.

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 the function's invoke_url. It is on a
    different domain from this API, so it cannot be derived from the API host.
  • 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.

Durable functions are not invocable here. A durable function's id
answers 404, whatever its visibility, because a synchronous call would
run it with no execution record, no idempotency and no concurrency
accounting. Start one with
POST /durable-functions/{functionId}/executions.
'

  • Request body changed
    • Content changed
      • Modified media type: application/json
        • Schema changed
          • Properties changed
            • Modified property: payload
              • Description changed from 'Payload to send to the function.

If invoked with auth user token, Volcano automatically injects __volcano_auth context:

{
  ...yourPayload,
  __volcano_auth: {
    user_id: "uuid",
    email: "user@example.com",
    project_id: "uuid",
    role: "authenticated" | "anonymous"
  }
}

' to 'Payload to send to the function.

If invoked with auth user token, Volcano automatically injects __volcano_auth context:

{
  ...yourPayload,
  __volcano_auth: {
    user_id: "uuid",
    email: "user@example.com",
    project_id: "uuid",
    role: "authenticated" | "anonymous"
  }
}

The top-level __volcano_auth and __volcano_http keys are reserved;
Volcano removes caller-supplied values for both.
'

GET /projects

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: data
                • Items changed
                  • Properties changed
                    • Modified property: health
                    • Property 'AllOf' changed
                    • Modified schema: #/components/schemas/ProjectHealthSummary
                    • Properties changed
                    • Modified property: status
                    • Description changed from '' to 'empty means no functions, frontends, databases, storage, Volcano Auth users, or Sandbox resources are listed. needs_attention means an operation needs review without confirmed service impairment, or a serving frontend whose edge recovery gave up needs a redeploy. degraded means a resource is only partly available or is unavailable for an expected, temporary reason, such as a frontend whose edge synchronization did not complete or a database being restored; critical means use is blocked. A failed workflow or deployment record alone does not establish an outage. Findings remain available for empty projects.'
                    • New enum values: [empty needs_attention]

POST /projects

  • Responses changed
    • Modified response: 201
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: health
                • Property 'AllOf' changed
                  • Modified schema: #/components/schemas/ProjectHealthSummary
                    • Properties changed
                    • Modified property: status
                    • Description changed from '' to 'empty means no functions, frontends, databases, storage, Volcano Auth users, or Sandbox resources are listed. needs_attention means an operation needs review without confirmed service impairment, or a serving frontend whose edge recovery gave up needs a redeploy. degraded means a resource is only partly available or is unavailable for an expected, temporary reason, such as a frontend whose edge synchronization did not complete or a database being restored; critical means use is blocked. A failed workflow or deployment record alone does not establish an outage. Findings remain available for empty projects.'
                    • New enum values: [empty needs_attention]

GET /projects/{id}

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: health
                • Property 'AllOf' changed
                  • Modified schema: #/components/schemas/ProjectHealthSummary
                    • Properties changed
                    • Modified property: status
                    • Description changed from '' to 'empty means no functions, frontends, databases, storage, Volcano Auth users, or Sandbox resources are listed. needs_attention means an operation needs review without confirmed service impairment, or a serving frontend whose edge recovery gave up needs a redeploy. degraded means a resource is only partly available or is unavailable for an expected, temporary reason, such as a frontend whose edge synchronization did not complete or a database being restored; critical means use is blocked. A failed workflow or deployment record alone does not establish an outage. Findings remain available for empty projects.'
                    • New enum values: [empty needs_attention]

PATCH /projects/{id}

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: health
                • Property 'AllOf' changed
                  • Modified schema: #/components/schemas/ProjectHealthSummary
                    • Properties changed
                    • Modified property: status
                    • Description changed from '' to 'empty means no functions, frontends, databases, storage, Volcano Auth users, or Sandbox resources are listed. needs_attention means an operation needs review without confirmed service impairment, or a serving frontend whose edge recovery gave up needs a redeploy. degraded means a resource is only partly available or is unavailable for an expected, temporary reason, such as a frontend whose edge synchronization did not complete or a database being restored; critical means use is blocked. A failed workflow or deployment record alone does not establish an outage. Findings remain available for empty projects.'
                    • New enum values: [empty needs_attention]

GET /projects/{id}/auth/config

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • New property: created_at
              • New property: rate_limit_password_reset
              • New property: refresh_token_reuse_interval
              • New property: updated_at

PUT /projects/{id}/auth/config

  • Request body changed
    • Content changed
      • Modified media type: application/json
        • Schema changed
          • Properties changed
            • New property: cors_allowed_origins
            • New property: cors_enabled
            • New property: platform_token_ttl
            • New property: rate_limit_password_reset
            • New property: refresh_token_reuse_interval
  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • New property: created_at
              • New property: rate_limit_password_reset
              • New property: refresh_token_reuse_interval
              • New property: updated_at

GET /projects/{id}/auth/insights

  • Description changed from 'Returns current and deleted auth-user totals, rolling 24-hour and 30-day
    active users, and zero-filled signup, deletion, net-growth, and successful
    sign-in counts for an inclusive UTC date range. Weeks start on Monday.
    Signups remain counted after deletion; net growth is signups minus
    deletions. Deleted users contribute to active counts until their last
    activity leaves the rolling window. Token refreshes affect active users
    but not the sign-in series. Collection starts at deployment, with signup
    history backfilled from accounts still present then. Earlier hard-deleted
    accounts cannot be recovered.
    ' to 'Returns current and deleted auth-user totals, rolling 24-hour and 30-day
    active users, and zero-filled daily activity and account-retention counts
    for an inclusive UTC date range. Weeks start on Monday.
    The existing deletions series counts accounts by deletion date; net_growth
    remains signups minus deletions and is not affected by bans.
    The banned_users, deleted_users, and available_users fields describe the
    current state of users registered in each bucket. Banned users exclude
    deleted users and expired bans. Available users are signups minus
    banned_users minus deleted_users. Unban and expiry restore availability in
    the original signup bucket. These current-state cohorts can change after
    the requested dates have passed, without rewriting activity counts.
    Sign-in counts remain grouped by session creation date. Deleted users
    contribute to active counts until their last activity leaves the rolling
    window. Token refreshes affect active users but not the sign-in series.
    Signup history is backfilled from accounts present when collection was
    deployed. Accounts hard-deleted before deletion-history collection cannot
    be recovered. Current bans require no separate event-history collection.
    '
  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: series
                • Items changed
                  • Required changed
                    • New required property: available_users
                    • New required property: banned_users
                    • New required property: deleted_users
                  • Properties changed
                    • New property: available_users
                    • New property: banned_users
                    • New property: deleted_users
                    • Modified property: net_growth
                    • Description changed from 'Registrations minus deletions during this bucket. May be negative.' to 'Registrations minus deletions during this bucket. May be negative. Bans do not affect this value.'
          • Example changed from map[observed_at:2026-07-20T18:00:00Z project_id:4f165080-a931-4e03-b3bd-41c45c3f0058 series:[map[bucket_start:2026-07-20 deletions:3 is_partial:true net_growth:9 signins:97 signups:12]] summary:map[active_users_1d:83 active_users_30d:418 deleted_users:42 total_users:1234] window:map[from:2026-06-21 interval:day to:2026-07-20]] to map[observed_at:2026-07-20T18:00:00Z project_id:4f165080-a931-4e03-b3bd-41c45c3f0058 series:[map[available_users:7 banned_users:2 bucket_start:2026-07-20 deleted_users:3 deletions:3 is_partial:true net_growth:9 signins:97 signups:12]] summary:map[active_users_1d:83 active_users_30d:418 deleted_users:42 total_users:1234] window:map[from:2026-06-21 interval:day to:2026-07-20]]

GET /projects/{id}/config

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • New property: autofix
              • Modified property: frontends
                • Items changed
                  • Properties changed
                    • Modified property: custom_domain
                    • Description changed from 'Custom domain with managed or BYOC TLS. tls is required
                      when the domain is first created and optional afterwards. For an existing
                      domain, omitting tls or sending only tls.mode keeps the stored
                      certificate; new BYOC material for the same domain rotates the
                      certificate in place (zero downtime). Changing tls.mode for the same
                      hostname, or the hostname of a managed domain, requires deleting the
                      domain first. BYOC TLS material is write-only; exports render only
                      tls.mode.
                      ' to 'Custom domain with managed or BYOC TLS. tls is required
                      when the domain is first created and optional afterwards. For an existing
                      domain, omitting tls or sending only tls.mode keeps the stored
                      certificate; new BYOC material for the same domain rotates the
                      certificate in place (zero downtime). Changing tls.mode for the same
                      hostname switches an active domain in place (zero downtime); a domain
                      that is not yet active, or a managed domain changing hostname, must be
                      deleted first. BYOC TLS material is write-only; exports render only
                      tls.mode.
                      '
              • Modified property: sandboxes
                • Items changed
                  • Properties changed
                    • Modified property: ttl_seconds
                    • Description changed from 'Default absolute lifetime for new sessions when the caller omits it. Cloud accepts 30–28800 seconds; local accepts 0 for unlimited or a positive lifetime.' to 'Default absolute lifetime for new sessions when the caller omits it. Cloud templates accept 30–28800 seconds; inherited lifetimes are clamped to the session plan limit (3600 for HOBBY, 28800 for SUPERAGENT). Local accepts 0 for unlimited or a positive lifetime.'

PUT /projects/{id}/config

  • Request body changed
    • Content changed
      • Modified media type: application/json
        • Schema changed
          • Properties changed
            • New property: autofix
            • Modified property: frontends
              • Items changed
                • Properties changed
                  • Modified property: custom_domain
                    • Description changed from 'Custom domain with managed or BYOC TLS. tls is required
                      when the domain is first created and optional afterwards. For an existing
                      domain, omitting tls or sending only tls.mode keeps the stored
                      certificate; new BYOC material for the same domain rotates the
                      certificate in place (zero downtime). Changing tls.mode for the same
                      hostname, or the hostname of a managed domain, requires deleting the
                      domain first. BYOC TLS material is write-only; exports render only
                      tls.mode.
                      ' to 'Custom domain with managed or BYOC TLS. tls is required
                      when the domain is first created and optional afterwards. For an existing
                      domain, omitting tls or sending only tls.mode keeps the stored
                      certificate; new BYOC material for the same domain rotates the
                      certificate in place (zero downtime). Changing tls.mode for the same
                      hostname switches an active domain in place (zero downtime); a domain
                      that is not yet active, or a managed domain changing hostname, must be
                      deleted first. BYOC TLS material is write-only; exports render only
                      tls.mode.
                      '
            • Modified property: sandboxes
              • Items changed
                • Properties changed
                  • Modified property: ttl_seconds
                    • Description changed from 'Default absolute lifetime for new sessions when the caller omits it. Cloud accepts 30–28800 seconds; local accepts 0 for unlimited or a positive lifetime.' to 'Default absolute lifetime for new sessions when the caller omits it. Cloud templates accept 30–28800 seconds; inherited lifetimes are clamped to the session plan limit (3600 for HOBBY, 28800 for SUPERAGENT). Local accepts 0 for unlimited or a positive lifetime.'

GET /projects/{id}/domains

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: data
                • Items changed
                  • Property 'AllOf' changed
                    • Modified schema: #/components/schemas/FrontendCustomDomainResponse
                    • Properties changed
                    • New property: serving_certificate
                    • Modified property: failure_reason
                    • Description changed from 'Failure category, present only when managed TLS setup has failed. Current values are provider, certificate, ownership, and internal; ownership means another account has already claimed the hostname through ownership verification. Treat unrecognized values as internal.' to 'Failure category, present when managed TLS setup has failed, or when issuance is failing for a domain that switched to managed TLS and still serves its uploaded certificate. Current values are provider, certificate, ownership, and internal; ownership means another account has already claimed the hostname through ownership verification. Treat unrecognized values as internal.'

GET /projects/{id}/durable-functions/{functionId}/executions

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: data
                • Items changed
                  • Properties changed
                    • New property: client_token

POST /projects/{id}/durable-functions/{functionId}/executions

  • Responses changed
    • Modified response: 202
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • New property: client_token

GET /projects/{id}/durable-functions/{functionId}/executions/{executionId}

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • New property: client_token

POST /projects/{id}/durable-functions/{functionId}/executions/{executionId}/stop

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • New property: client_token

GET /projects/{id}/frontends

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • Modified property: data
                • Items changed
                  • Properties changed
                    • New property: last_deployed_at

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.27 (^18.18.0 || ^19.8.0 || >=20.0.0) and Next 16.4.0 (>=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.28 (^18.18.0 || ^19.8.0 || >=20.0.0) and Next 16.4.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.
    '
  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • New property: last_deployed_at
    • Modified response: 201
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • New property: last_deployed_at

GET /projects/{id}/frontends/{frontendId}

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Properties changed
              • New property: last_deployed_at

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

  • Responses changed
    • New response: 409

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

  • Responses changed
    • Modified response: 200
      • Content changed
        • Modified media type: application/json
          • Schema changed
            • Property 'AllOf' changed
              • Modified schema: #/components/schemas/FrontendCustomDomainResponse
                • Properties changed
                  • New property: serving_certificate
                  • Modified property: failure_reason
                    • Description changed from 'Failure category, present only when managed TLS setup has failed. Current values are provider, certificate, ownership, and internal; ownership means another account has already claimed the hostname through ownership verification. Treat unrecognized values as internal.' to 'Failure category, present when managed TLS setup has failed, or when issuance is failing for a domain that switched to managed TLS and still serves its uploaded certificate. Current values are provider, certificate, ownership, and internal; ownership means another account has already claimed the hostname through ownership verification. Treat unrecognized values as internal.'

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

  • Description changed from 'Configures one custom domain for a frontend.
    The default Volcano-generated frontend URL remains active.
    Wildcard Volcano frontend TLS remains valid and isolated from custom-domain certificate changes.
    The account must own the hostname: it must have verified the hostname or a domain above it (see POST /user/domains). A certificate does not prove ownership.
    When the account owns no domain covering the hostname, Volcano asks for a TXT record at _volcano.<registrable domain>, such as _volcano.example.com. Publishing it verifies the whole domain, so later subdomains need no record. A managed TLS request reserves the hostname and returns that record in verification_records; the reservation expires after 72 hours unless the record is published. A BYOC request gets 409 with code: ownership_verification_required and the record in required_record; publish it and send the same request again.
    Managed TLS then returns the CNAME that authorizes certificate issuance and renewal.
    An unverified reservation does not block an account that proves ownership. When another acc

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 10 times, most recently from b5d4634 to 61e1bcc Compare August 28, 2026 13:58
@kong
kong Bot force-pushed the chore/sync-openapi branch 9 times, most recently from 5187d45 to 1d7604f Compare September 5, 2026 02:49
@kong
kong Bot force-pushed the chore/sync-openapi branch 2 times, most recently from d4953ec to 1e2ab55 Compare September 10, 2026 22:00
@github-actions

github-actions Bot commented Oct 14, 2026 •

Copy link
Copy Markdown

AI review: 4 P0-P2 finding(s)

Reviewed c58fb2c. Run log

Syncs the OpenAPI contract and generated Go client. The change leaves an autofix manifest incompatibility, incorrect environment-name validation, and outdated public docs; authorization and pricing changes need human judgment.

🟡 P2

  • openapi/openapi.yaml:23705 The CLI rejects the new autofix manifest section
  • openapi/openapi.yaml:18779 Environment-name patterns escape whitespace twice
  • openapi/openapi.yaml:17084 Published Sandbox limits no longer match the contract
  • openapi/openapi.yaml:1868 Published domain docs still promise a permanent verification value

🟣 Pre-existing

  • internal/projectconfig/manifest.go:54 CLI manifest parser rejects the new autofix section the synced contract now allows in project config

Not checked: The AI review read the diff, the code, and the PR's text; it ran no tests or builds and read nothing outside this repository.

  • That openapi/openapi.yaml matches Kong/volcano-hosting@​a56db392a072 exactly; the upstream contract was not compared.
  • That make openapi-generated-check passes, i.e. client.gen.go is exactly what the pinned oapi-codegen produces from the new spec.
  • Whether the deployed GET /projects/{id}/config export already emits an autofix: section, which decides whether the pull-then-deploy failure affects users today.
  • Confirm Kong/volcano-hosting enforces the new credential scopes and execution-token isolation described by the synced contract.
  • Confirm the Sandbox billing transition preserves unbilled preview sessions and history as promised.

Push a fix, or have a collaborator with write access (including the PR author) add the ai-review-override label to accept c58fb2c as is. An override also needs a human review.

Human review: needed

  • Should openapi/openapi.yaml expand Sandbox access to project access tokens and introduce the documented auth-proxy and durable-message token permissions?
  • Are the Sandbox billing transition and reduced HOBBY resource limits in openapi/openapi.yaml approved for existing CLI users?

Decide the points above: approve to accept them, or request changes.

Suggested reviewer: subnetmarco (most commits to client.gen.go and openapi.yaml). Any collaborator with write access other than the author can approve.

@tkkhq tkkhq left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Live compatibility with the target Hosting deployment is unverified. Verify server support before exposing the new generated operations in CLI commands.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot wasn't able to review any files in this pull request. Check if the Files changed in this pull request are included in default exclusions.

Auth *ProjectConfigAuth `json:"auth,omitempty"`

// Autofix AI diagnosis and fix settings. Omitted fields keep their current value. Your API key is never part of the manifest, and an apply never sets or deletes it: set it with `PUT /projects/{id}/autofix` before turning on a provider that runs on your own key.
Autofix *ProjectConfigAutofix `json:"autofix,omitempty"`

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 P2: Add autofix support to the CLI manifest parser

The generated configuration now supports autofix, but internal/projectconfig/manifest.go uses a separate Manifest without that field and decodes with KnownFields(true). Consequently, volcano cloud config deploy rejects valid manifests such as autofix: {enabled: false} before contacting the server, including pulled exports containing this section. Extend the local manifest type and update its documentation.

Found by gpt-6.1-sol

Comment thread openapi/openapi.yaml
@@ -15528,7 +16427,7 @@ components:
type: integer
minimum: 0
maximum: 2147483647
description: Inherits the template TTL when omitted (cloud default 3600 seconds; local default 0, unlimited). Cloud accepts 30–28800 seconds; local accepts 0 for unlimited or a positive lifetime.
description: Inherits the template TTL when omitted (cloud default 3600 seconds; local default 0, unlimited). Cloud HOBBY accepts 30–3600 seconds; SUPERAGENT accepts 30–28800 seconds. Inherited template defaults are clamped to the plan limit; explicit values above it are rejected. Local accepts 0 for unlimited or a positive lifetime.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 P2: Update published Sandbox limits and CLI help

The revised contract limits HOBBY sessions to 1024 MiB and 3600 seconds, but docs/sandboxes.md and the flag help in internal/cmd/sandboxes/exec.go still advertise 2048 MiB and 28800 seconds without plan qualifications. HOBBY users following that guidance receive plan-limit errors. Update the matching docs and help, including inherited lifetime clamping, as required by AGENTS.md.

Found by gpt-6.1-sol

Comment thread openapi/openapi.yaml
publish. Its value is the same on every request. The record must be
served at that name itself; a record reached through a CNAME does not
count.
publish. Its value stays the same until Volcano rotates the key it is

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 P2: Correct the published domain-verification permanence guarantee

The contract now says verification TXT values change when Volcano rotates its derivation key and old values stop counting, while docs/domains.md:56 still promises that the value “never changes.” After rotation, users relying on that promise can retain a record that no longer satisfies verification. Update the guide to explain obtaining and publishing the replacement value.

Found by gpt-6.1-sol

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.

4 participants