chore(api): sync OpenAPI contract - #51
Draft
kong[bot] wants to merge 1 commit into
Draft
Conversation
kong
Bot
force-pushed
the
chore/sync-openapi
branch
10 times, most recently
from
July 20, 2026 13:54
04d66d1 to
b8d922a
Compare
kong
Bot
force-pushed
the
chore/sync-openapi
branch
10 times, most recently
from
July 27, 2026 22:41
ee0bdba to
eb217d3
Compare
kong
Bot
force-pushed
the
chore/sync-openapi
branch
9 times, most recently
from
July 31, 2026 00:52
bc4afe5 to
7b3fd89
Compare
kong
Bot
force-pushed
the
chore/sync-openapi
branch
6 times, most recently
from
August 7, 2026 10:32
ee8c547 to
90f7585
Compare
kong
Bot
force-pushed
the
chore/sync-openapi
branch
7 times, most recently
from
August 15, 2026 11:10
ce30e63 to
00a5297
Compare
kong
Bot
force-pushed
the
chore/sync-openapi
branch
10 times, most recently
from
August 23, 2026 19:35
db70cc7 to
bd1e685
Compare
kong
Bot
force-pushed
the
chore/sync-openapi
branch
from
August 24, 2026 23:52
bd1e685 to
96d81db
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
API change report
Public API
New Endpoints: 1
PUT /projects/{id}/git-connection/production-branch
Deleted Endpoints: None
Modified Endpoints: 57
GET /auth/user/sessions
Each session includes device info, IP addresses, and activity timestamps.
The current session is marked with
is_current: true.' to 'Returns paginated sessions for the currently authenticated user.
Each session includes device info, IP addresses, and activity timestamps.
The current session is marked with
is_current: true.Ordering and pagination. Without
sort, results are ordered by mostrecent activity and paged with
page/limit, returning thesessions/total/page/limit/total_pagesbody below. This is thelegacy default and is preserved for existing clients.
Send
sort=created_atto opt into the standard list contract: results areordered by session start (newest first) and may be paged either with
page/limitor by cursor withcursor/ending_beforeplus a boundedoffsetpast the cursor anchor. Cursor responses use the shareddataenvelope withnext_cursor/prev_cursor.Unlike other list endpoints, sending
limitwithoutpagedoes notselect cursor mode here;
sort=created_atis the only opt-in. Cursorpagination is rejected with 400 for the activity order, because
last_activity_atchanges whenever a session refreshes its token: a rowthat crosses the cursor anchor between two requests would be skipped and
never shown. The
status=expiredfilter is also offset-only because asession can expire above the cursor anchor during a walk. Sending that
filter in cursor mode,
pagewithcursororending_before, or bothcursor directions returns 400.
'
GET /databases/regions
This is a public endpoint that doesn't require authentication.
' to 'Returns the regions enabled for database provisioning in this platform environment.
This is a public endpoint that doesn't require authentication.
'
POST /databases/{databaseName}/branches/{branchName}/query/delete
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
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
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
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
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
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
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
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
Authentication: Requires auth user access token (from signup/signin)
Row-Level Security: Automatically enforced - you see only data you have access to
Use Cases:
Note: For complex queries (JOINs, CTEs), use Lambda functions with direct SQL
' to 'Query your database using a simple REST API - no SQL required!
Authentication: Requires auth user access token (from signup/signin)
Row-Level Security: Automatically enforced - you see only data you have access to
Use Cases:
Note: For complex queries (JOINs, CTEs), use functions with direct SQL
'
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
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.
'
GET /functions/regions
with a human-readable label and country flag emoji for use in UI pickers.
This is a public endpoint that doesn't require authentication.
' to 'Returns the configured regions where functions can be deployed, each annotated
with a human-readable label and country flag emoji for use in UI pickers.
This is a public endpoint that doesn't require authentication.
'
POST /functions/{functionId}/invoke
If invoked with auth user token, Volcano automatically injects
__volcano_authcontext:' to 'Payload to send to the function.
If invoked with auth user token, Volcano automatically injects
__volcano_authcontext:'
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
uploaded. The path is versioned with a
?v=cache-busting queryparam that changes on each upload. Absent when the project has no
logo. The logo image is stored in the project's S3 folder.
' to 'Relative API path that serves the project logo when one has been
uploaded. The path is versioned with a
?v=cache-busting queryparam that changes on each upload. Absent when the project has no
logo. The logo image is stored in the project's storage folder.
'
POST /projects
uploaded. The path is versioned with a
?v=cache-busting queryparam that changes on each upload. Absent when the project has no
logo. The logo image is stored in the project's S3 folder.
' to 'Relative API path that serves the project logo when one has been
uploaded. The path is versioned with a
?v=cache-busting queryparam that changes on each upload. Absent when the project has no
logo. The logo image is stored in the project's storage folder.
'
GET /projects/{id}
uploaded. The path is versioned with a
?v=cache-busting queryparam that changes on each upload. Absent when the project has no
logo. The logo image is stored in the project's S3 folder.
' to 'Relative API path that serves the project logo when one has been
uploaded. The path is versioned with a
?v=cache-busting queryparam that changes on each upload. Absent when the project has no
logo. The logo image is stored in the project's storage folder.
'
PATCH /projects/{id}
uploaded. The path is versioned with a
?v=cache-busting queryparam that changes on each upload. Absent when the project has no
logo. The logo image is stored in the project's S3 folder.
' to 'Relative API path that serves the project logo when one has been
uploaded. The path is versioned with a
?v=cache-busting queryparam that changes on each upload. Absent when the project has no
logo. The logo image is stored in the project's storage folder.
'
GET /projects/{id}/auth/config
email/password signup, OAuth/SSO signup, anonymous conversion, and
email changes. Empty (the default) allows every domain.
Entries are stored normalized (lowercase, no
@prefix) and matchthe domain part exactly:
domain1.comdoes not covermail.domain1.com. Signups from other domains are rejected with403, and
allowed_email_domains_modedecides whether sign-in iscovered as well.
' to 'Email domains allowed to create users in this project. Applies to
email/password signup, OAuth/SSO signup, anonymous conversion, and
email changes. Empty (the default) allows every domain.
Entries are stored normalized (lowercase, no
@prefix) and matchthe domain part exactly:
domain1.comdoes not covermail.domain1.com. Signups from other domains are rejected with403, and
allowed_email_domains_modedecides whether sign-in iscovered as well.
The allowlist is a PRO feature to configure and to enforce. A
downgrade parks it: the domains are still returned here and stop
being applied until the project is back on PRO.
'
PUT /projects/{id}/auth/config
the body are changed.
'
restriction so any domain can sign up. Entries must be bare domains
such as
domain1.comand are stored normalized (lowercase, no@prefix); matching is exact, so subdomains need their own entry. At
most 100 entries.
' to 'Replaces the email domain allowlist. Empty array removes the
restriction so any domain can sign up. Entries must be bare domains
such as
domain1.comand are stored normalized (lowercase, no@prefix); matching is exact, so subdomains need their own entry. At
most 100 entries.
Restricting signups is a PRO feature to configure and to enforce: a
FREE project can only remove the restriction and gets 403 for any
other change, and the list it keeps is parked until it upgrades.
'
email/password signup, OAuth/SSO signup, anonymous conversion, and
email changes. Empty (the default) allows every domain.
Entries are stored normalized (lowercase, no
@prefix) and matchthe domain part exactly:
domain1.comdoes not covermail.domain1.com. Signups from other domains are rejected with403, and
allowed_email_domains_modedecides whether sign-in iscovered as well.
' to 'Email domains allowed to create users in this project. Applies to
email/password signup, OAuth/SSO signup, anonymous conversion, and
email changes. Empty (the default) allows every domain.
Entries are stored normalized (lowercase, no
@prefix) and matchthe domain part exactly:
domain1.comdoes not covermail.domain1.com. Signups from other domains are rejected with403, and
allowed_email_domains_modedecides whether sign-in iscovered as well.
The allowlist is a PRO feature to configure and to enforce. A
downgrade parks it: the domains are still returned here and stop
being applied until the project is back on PRO.
'
GET /projects/{id}/auth/hosted-pages/{pageType}
page: nullwhen theproject has not customized it yet. Always returns
defaults(the themeshell to seed an editor with, which is valid input to the update endpoint)
and
runtime(the script the rendered page runs, plus a preview harness).'
PUT /projects/{id}/auth/hosted-pages/{pageType}
GET /projects/{id}/auth/users/{userId}/sessions
Returns session details including device info, IP address, and activity timestamps.
' to 'List paginated sessions for a specific auth user.
Returns session details including device info, IP address, and activity timestamps.
Ordering and pagination match
GET /auth/user/sessions: the default isactivity order with
page/limitand the legacysessionsbody, andsort=created_atopts into the standard cursor/offset hybrid with theshared
dataenvelope. Cursor pagination is only available forsort=created_at, because the activity timestamp changes under paging.The
status=expiredfilter is offset-only because sessions can expireabove a cursor anchor during a walk.
'
GET /projects/{id}/config
Replaces the stored list; entries are normalized (lowercase, no
@prefix) and must be bare domains such as
domain1.com. Matching isexact, so subdomains need their own entry. At most 100 entries.
' to 'Email domains allowed to create users. Empty allows every domain.
Replaces the stored list; entries are normalized (lowercase, no
@prefix) and must be bare domains such as
domain1.com. Matching isexact, so subdomains need their own entry. At most 100 entries.
Restricting signups is a PRO feature to configure and to enforce: a
FREE project can only declare the list it already has or remove the
restriction, and the list it keeps is parked until it upgrades.
'
- Modified property: databases
- Items changed
- Properties changed
- Modified property: region
- Description changed from 'Deployed region (aws- prefixed, e.g. aws-us-east-1). Asserted, never written.' to 'Deployed region ID (e.g. aws-us-east-1). Asserted, never written.'
- Modified property: project
- Properties changed
- Modified property: selected_regions
- Description changed from 'Region subset (bare AWS names). Requires
all_regions=false.' to 'Region subset (bare region names). Requiresall_regions=false.'PUT /projects/{id}/config
Replaces the stored list; entries are normalized (lowercase, no
@prefix) and must be bare domains such as
domain1.com. Matching isexact, so subdomains need their own entry. At most 100 entries.
' to 'Email domains allowed to create users. Empty allows every domain.
Replaces the stored list; entries are normalized (lowercase, no
@prefix) and must be bare domains such as
domain1.com. Matching isexact, so subdomains need their own entry. At most 100 entries.
Restricting signups is a PRO feature to configure and to enforce: a
FREE project can only declare the list it already has or remove the
restriction, and the list it keeps is parked until it upgrades.
'
- Modified property: databases
- Items changed
- Properties changed
- Modified property: region
- Description changed from 'Deployed region (aws- prefixed, e.g. aws-us-east-1). Asserted, never written.' to 'Deployed region ID (e.g. aws-us-east-1). Asserted, never written.'
- Modified property: project
- Properties changed
- Modified property: selected_regions
- Description changed from 'Region subset (bare AWS names). Requires
all_regions=false.' to 'Region subset (bare region names). Requiresall_regions=false.'GET /projects/{id}/databases
POST /projects/{id}/databases
DELETE /projects/{id}/databases/{databaseName}
removed synchronously the database row is deleted and the response is
204. If the Neon project cannot be deleted right away, the database rowis retained (status
deleting) and its teardown is handed to thebackground reconciler, which retries the Neon deletion and removes the row
once Neon is gone; in that case the response is
202. The database row isnever dropped while its Neon project still exists, so a Neon project is
never orphaned without a record to retry from.
' to 'Deletes a database and the instance backing it. When the instance is
removed synchronously the database row is deleted and the response is
204. If the instance cannot be deleted right away, the database rowis retained (status
deleting) and its teardown is handed to thebackground reconciler, which retries the deletion and removes the row
once the instance is gone; in that case the response is
202. The database row isnever dropped while its instance still exists, so an instance is
never orphaned without a record to retry from.
'
removed synchronously, so the database is marked
deletingand torndown asynchronously by the reconciler.
' to 'Deletion accepted and in progress. The backing instance could not be
removed synchronously, so the database is marked
deletingand torndown asynchronously by the reconciler.
'
GET /projects/{id}/databases/{databaseName}
GET /projects/{id}/databases/{databaseName}/branches
provisioningand is notconnectable until it reports
active; poll this endpoint until itdoes.
connection_stringis only present whileactive.' to 'Branch status. A new branch starts
provisioningand is notconnectable until it reports
active; poll this endpoint until itdoes.
connection_stringis only present whileactive.provisioningalso covers a branch being rebuilt after areset,and a build that is between retries, so it is the status to keep
waiting on.
failedis terminal: it means the platform gave up, andthe branch will not become
activeon its own.'
POST /projects/{id}/databases/{databaseName}/branches
provisioningand is notconnectable until it reports
active; poll this endpoint until itdoes.
connection_stringis only present whileactive.' to 'Branch status. A new branch starts
provisioningand is notconnectable until it reports
active; poll this endpoint until itdoes.
connection_stringis only present whileactive.provisioningalso covers a branch being rebuilt after areset,and a build that is between retries, so it is the status to keep
waiting on.
failedis terminal: it means the platform gave up, andthe branch will not become
activeon its own.'
DELETE /projects/{id}/databases/{databaseName}/branches/{branchName}
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.'
GET /projects/{id}/databases/{databaseName}/branches/{branchName}
provisioningand is notconnectable until it reports
active; poll this endpoint until itdoes.
connection_stringis only present whileactive.' to 'Branch status. A new branch starts
provisioningand is notconnectable until it reports
active; poll this endpoint until itdoes.
connection_stringis only present whileactive.provisioningalso covers a branch being rebuilt after areset,and a build that is between retries, so it is the status to keep
waiting on.
failedis terminal: it means the platform gave up, andthe branch will not become
activeon its own.'
PATCH /projects/{id}/databases/{databaseName}/branches/{branchName}
provisioningand is notconnectable until it reports
active; poll this endpoint until itdoes.
connection_stringis only present whileactive.' to 'Branch status. A new branch starts
provisioningand is notconnectable until it reports
active; poll this endpoint until itdoes.
connection_stringis only present whileactive.provisioningalso covers a branch being rebuilt after areset,and a build that is between retries, so it is the status to keep
waiting on.
failedis terminal: it means the platform gave up, andthe branch will not become
activeon its own.'
POST /projects/{id}/databases/{databaseName}/branches/{branchName}/reset
provisioningand is notconnectable until it reports
active; poll this endpoint until itdoes.
connection_stringis only present whileactive.' to 'Branch status. A new branch starts
provisioningand is notconnectable until it reports
active; poll this endpoint until itdoes.
connection_stringis only present whileactive.provisioningalso covers a branch being rebuilt after areset,and a build that is between retries, so it is the status to keep
waiting on.
failedis terminal: it means the platform gave up, andthe branch will not become
activeon its own.'
POST /projects/{id}/databases/{databaseName}/branches/{branchName}/reset-password
provisioningand is notconnectable until it reports
active; poll this endpoint until itdoes.
connection_stringis only present whileactive.' to 'Branch status. A new branch starts
provisioningand is notconnectable until it reports `act
Report truncated; see the source commit for the complete contract diff.
Validation