{
"binary": "sylphx",
"generated": "@generated by sylphx-gen 0.1.0 from contracts@a2fae12c0c5145b79e95827e3e70b57caffc9b10e04ab643baf17ab8dff51931. Do not edit.",
"global_flags": [
{
"default": "table",
"flag": "--output",
"summary": "Output format; tables show name, Ready, and age.",
"values": [
"table",
"json",
"yaml",
"name"
]
},
{
"flag": "--from-file",
"summary": "Read the whole request body from a YAML or JSON file.",
"type": "path"
}
],
"services": [
{
"collections": [
{
"collection": "orgs",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*}",
"method": "access.orgs.get",
"permission": "access:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}"
},
"summary": "Gets an org.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable spec fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/orgs",
"method": "access.orgs.list",
"paginates": true,
"permission": "access:read",
"positional": null,
"summary": "Lists orgs the caller can see.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "org.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "org.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "org.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "org.spec.slug",
"flag": "--spec.slug",
"required": true,
"summary": "Globally unique handle, resolved to the id by clients, never the server.",
"type": "string"
},
{
"field": "org.spec.api_version",
"flag": "--spec.api-version",
"summary": "The API version (`YYYY-MM-DD`) requests are served at when neither the request nor the key pins one.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/orgs",
"method": "access.orgs.create",
"permission": "access:admin",
"positional": null,
"resource_field": "org",
"summary": "Creates an org. Access assigns the id.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "org.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "org.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "org.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "org.spec.slug",
"flag": "--spec.slug",
"required": true,
"summary": "Globally unique handle, resolved to the id by clients, never the server.",
"type": "string"
},
{
"field": "org.spec.api_version",
"flag": "--spec.api-version",
"summary": "The API version (`YYYY-MM-DD`) requests are served at when neither the request nor the key pins one.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{org.name=orgs/*}",
"method": "access.orgs.update",
"permission": "access:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "org.name",
"pattern": "orgs/{org}"
},
"resource_field": "org",
"sends_etag": true,
"summary": "Updates an org.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete every child Resource; without it a parent with children fails with FAILED_PRECONDITION.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*}",
"method": "access.orgs.delete",
"permission": "access:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}"
},
"summary": "Deletes an org and everything in it. Deletion cascades through every service, so it returns an Operation.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "orgs",
"resource_type": "access.sylphx.com/Org"
},
{
"collection": "projects",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*}",
"method": "access.projects.get",
"permission": "access:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Gets a project.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable spec fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/projects",
"method": "access.projects.list",
"paginates": true,
"permission": "access:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists projects in an org.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "project.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "project.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "project.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "project.spec.slug",
"flag": "--spec.slug",
"required": true,
"summary": "Unique within the org.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*}/projects",
"method": "access.projects.create",
"permission": "access:admin",
"positional": null,
"resource_field": "project",
"summary": "Creates a project. Access assigns the id.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "project.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "project.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "project.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "project.spec.slug",
"flag": "--spec.slug",
"required": true,
"summary": "Unique within the org.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{project.name=orgs/*/projects/*}",
"method": "access.projects.update",
"permission": "access:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "project.name",
"pattern": "orgs/{org}/projects/{project}"
},
"resource_field": "project",
"sends_etag": true,
"summary": "Updates a project.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete every child Resource; without it a parent with children fails with FAILED_PRECONDITION.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*}",
"method": "access.projects.delete",
"permission": "access:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Deletes a project.",
"verb": "delete"
}
],
"noun": "projects",
"resource_type": "access.sylphx.com/Project"
},
{
"collection": "envs",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*}",
"method": "access.envs.get",
"permission": "access:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Gets an environment.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable spec fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*}/envs",
"method": "access.envs.list",
"paginates": true,
"permission": "access:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Lists environments in a project.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "environment.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "environment.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "environment.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "environment.spec.slug",
"flag": "--spec.slug",
"required": true,
"summary": "Unique within the project, for example `production`.",
"type": "string"
},
{
"field": "environment.spec.mode",
"flag": "--spec.mode",
"required": true,
"summary": "Live or test; a test key never touches a live environment.",
"type": "enum",
"values": [
"live",
"test"
]
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*}/envs",
"method": "access.envs.create",
"permission": "access:admin",
"positional": null,
"resource_field": "environment",
"summary": "Creates an environment. Access assigns the id.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "environment.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "environment.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "environment.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "environment.spec.slug",
"flag": "--spec.slug",
"required": true,
"summary": "Unique within the project, for example `production`.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{environment.name=orgs/*/projects/*/envs/*}",
"method": "access.envs.update",
"permission": "access:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "environment.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"resource_field": "environment",
"sends_etag": true,
"summary": "Updates an environment.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete every child Resource; without it a parent with children fails with FAILED_PRECONDITION.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*}",
"method": "access.envs.delete",
"permission": "access:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Deletes an environment.",
"verb": "delete"
}
],
"noun": "envs",
"resource_type": "access.sylphx.com/Environment"
},
{
"collection": "service_enablements",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/service_enablements/*}",
"method": "access.service_enablements.get",
"permission": "access:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/service_enablements/{service_enablement}"
},
"summary": "Gets a service enablement.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable spec fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*}/service_enablements",
"method": "access.service_enablements.list",
"paginates": true,
"permission": "access:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Lists the service enablements of a project, one per service.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "service_enablement.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "service_enablement.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "service_enablement.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "service_enablement.spec.enabled",
"flag": "--spec.enabled",
"required": true,
"summary": "Whether the project's keys may reach the service.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{service_enablement.name=orgs/*/projects/*/service_enablements/*}",
"method": "access.service_enablements.update",
"permission": "access:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "service_enablement.name",
"pattern": "orgs/{org}/projects/{project}/service_enablements/{service_enablement}"
},
"resource_field": "service_enablement",
"sends_etag": true,
"summary": "Enables or disables a service on a project (`spec.enabled`).",
"update_mask": "from-flags",
"verb": "update"
}
],
"noun": "service-enablements",
"resource_type": "access.sylphx.com/ServiceEnablement"
},
{
"collection": "api_keys",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/api_keys/*}",
"method": "access.api_keys.get",
"permission": "access:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/api_keys/{api_key}"
},
"summary": "Gets an API key.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable spec fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/api_keys",
"method": "access.api_keys.list",
"paginates": true,
"permission": "access:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists API keys in an environment, or the org-wide keys of an org.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "api_key.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "api_key.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "api_key.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "api_key.spec.kind",
"flag": "--spec.kind",
"required": true,
"summary": "Secret (server-side) or publishable (browser, `publishable_ok` methods only).",
"type": "enum",
"values": [
"secret",
"publishable"
]
},
{
"field": "api_key.spec.scopes",
"flag": "--spec.scopes",
"repeated": true,
"required": true,
"summary": "Scopes `<service>:<action>`, a subset of the creator's effective scopes.",
"type": "string"
},
{
"field": "api_key.spec.label",
"flag": "--spec.label",
"summary": "A free-form label, for example the talent id a key was minted for.",
"type": "string"
},
{
"field": "api_key.spec.expire_time",
"flag": "--spec.expire-time",
"summary": "When the key stops verifying; required in unclaimed projects.",
"type": "timestamp"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/api_keys",
"method": "access.api_keys.create",
"permission": "access:keys:write",
"positional": null,
"resource_field": "api_key",
"summary": "Creates an API key. Access assigns the id.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "api_key.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "api_key.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "api_key.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "api_key.spec.label",
"flag": "--spec.label",
"summary": "A free-form label, for example the talent id a key was minted for.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{api_key.name=orgs/*/projects/*/envs/*/api_keys/*}",
"method": "access.api_keys.update",
"permission": "access:keys:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "api_key.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/api_keys/{api_key}"
},
"resource_field": "api_key",
"sends_etag": true,
"summary": "Updates an API key.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/api_keys/*}",
"method": "access.api_keys.delete",
"permission": "access:keys:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/api_keys/{api_key}"
},
"summary": "Deletes an API key.",
"verb": "delete"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Revoke only if the current etag matches.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/api_keys/*}:revoke",
"method": "access.api_keys.revoke",
"permission": "access:keys:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/api_keys/{api_key}"
},
"summary": "Revokes an API key immediately; revocation propagates on its own fast path, ahead of the bulk key data.",
"verb": "revoke"
},
{
"effect": "write",
"flags": [
{
"field": "grace_period",
"flag": "--grace-period",
"summary": "How long the old key keeps verifying; default 24h.",
"type": "duration"
},
{
"field": "etag",
"flag": "--etag",
"summary": "Roll only if the current etag matches.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/api_keys/*}:roll",
"method": "access.api_keys.roll",
"permission": "access:keys:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/api_keys/{api_key}"
},
"summary": "Rolls an API key: returns a new key with the same spec and revokes the old one after the grace period.",
"verb": "roll"
}
],
"noun": "api-keys",
"resource_type": "access.sylphx.com/ApiKey"
}
],
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/whoami",
"method": "access.whoami",
"permission": "access:whoami",
"positional": null,
"summary": "Returns the caller: the principal and the scope of the key or token that authenticated this request. Clients fill their org, project, and env defaults from it; every valid key may call it, whatever its scopes.",
"verb": "whoami"
}
],
"display_name": "Sylphx Access",
"noun": "access",
"stage": "preview"
},
{
"collections": [
{
"collection": "ai_models",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=ai_models/*}",
"method": "ai.ai_models.get",
"permission": "ai:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "ai_models/{ai_model}"
},
"summary": "Gets an AI model.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/ai_models",
"method": "ai.ai_models.list",
"paginates": true,
"permission": "ai:read",
"positional": null,
"summary": "Lists the admitted catalog; filter by `brand`, `modality`, or `model`.",
"verb": "list"
}
],
"noun": "ai-models",
"resource_type": "ai.sylphx.com/AiModel"
}
],
"commands": [],
"display_name": "Sylphx AI",
"noun": "ai",
"stage": "preview"
},
{
"collections": [
{
"collection": "artifacts",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/artifacts/*}",
"method": "artifacts.artifacts.get",
"permission": "artifacts:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/artifacts/{artifact}"
},
"summary": "Gets an artifact.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*}/artifacts",
"method": "artifacts.artifacts.list",
"paginates": true,
"permission": "artifacts:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Lists a project's artifacts; filter by `digest`, `kind`, or `subject`.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "artifact.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "artifact.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "artifact.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "artifact.digest",
"flag": "--digest",
"required": true,
"summary": "The algorithm-qualified digest of the stored bytes, for example `sha256:4f1c…`.",
"type": "string"
},
{
"field": "artifact.kind",
"flag": "--kind",
"required": true,
"summary": "What the Artifact is.",
"type": "enum",
"values": [
"image",
"sbom",
"provenance",
"signature",
"bundle"
]
},
{
"field": "artifact.media_type",
"flag": "--media-type",
"required": true,
"summary": "The media type, for example `application/vnd.oci.image.manifest.v1+json`.",
"type": "string"
},
{
"field": "artifact.size_bytes",
"flag": "--size-bytes",
"required": true,
"summary": "The size of the stored bytes.",
"type": "int"
},
{
"field": "artifact.subject",
"flag": "--subject",
"summary": "The Artifact this one describes, for an SBOM, provenance, or signature.",
"type": "string"
},
{
"field": "artifact.source_digests",
"flag": "--source-digests",
"repeated": true,
"summary": "Digests of the sources and inputs that produced it.",
"type": "string"
},
{
"field": "artifact.retention",
"flag": "--retention",
"summary": "How long the Artifact is kept.",
"type": "enum",
"values": [
"standard",
"referenced"
]
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*}/artifacts",
"method": "artifacts.artifacts.create",
"permission": "artifacts:write",
"positional": {
"arg": "ID",
"field": "artifact_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "artifact",
"summary": "Registers an artifact whose bytes were pushed by digest; verification runs after.",
"verb": "create"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/artifacts/*}",
"method": "artifacts.artifacts.delete",
"permission": "artifacts:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/artifacts/{artifact}"
},
"summary": "Deletes an artifact; fails while a Release references it or a legal hold is active.",
"verb": "delete"
}
],
"noun": "artifacts",
"resource_type": "artifacts.sylphx.com/Artifact"
}
],
"commands": [],
"display_name": "Sylphx Artifacts",
"noun": "artifacts",
"served": false,
"stage": "preview"
},
{
"collections": [
{
"collection": "assets",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/assets/*}",
"method": "assets.assets.get",
"permission": "assets:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/assets/{asset}"
},
"summary": "Gets an asset.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, limited to `kind`, `state`, and `review_state`; for example `kind = ASSET_KIND_IMAGE AND state = ASSET_STATE_READY`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/assets",
"method": "assets.assets.list",
"paginates": true,
"permission": "assets:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists assets. The filter is limited to `kind`, `state`, and `review_state`.",
"verb": "list"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many items; default 100, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, limited to `kind` and `review_state`; for example `kind = ASSET_KIND_IMAGE`. Without a `review_state` term, rejected and retired variants are left out.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/assets:export",
"method": "assets.assets.export",
"permission": "assets:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Exports every servable variant in the environment as one flat, paged manifest, independent of the keys the code declares. Rejected and retired variants are left out unless `filter` asks for their `review_state`. The last page carries a digest a client checks to know it holds the whole set.",
"verb": "export"
},
{
"effect": "write",
"flags": [
{
"field": "recipes",
"flag": "--recipes",
"repeated": true,
"required": true,
"summary": "The recipes the code declares; 1 to 1000.",
"type": "json"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/assets:generate",
"method": "assets.assets.generate",
"permission": "assets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Records the recipes as assets and generates the variants that are missing. Each call is idempotent and works within a bounded time; call again until `pending` is 0.",
"verb": "generate"
},
{
"effect": "read",
"flags": [
{
"field": "keys",
"flag": "--keys",
"repeated": true,
"required": true,
"summary": "The logical keys the code declares, 1 to 5000, each 16 lowercase hex characters. The lock holds only these, so a removed recipe drops out.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/assets:lock",
"method": "assets.assets.lock",
"permission": "assets:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Returns the `assets.lock` entries and canonical text for the keys the call names, and only those. A read with a request body, like a query.",
"verb": "lock"
},
{
"effect": "write",
"flags": [
{
"field": "content_hash",
"flag": "--content-hash",
"required": true,
"summary": "The content hash of the variant, 64 lowercase hex characters.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/assets/*}:approveVariant",
"method": "assets.assets.approve_variant",
"permission": "assets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/assets/{asset}"
},
"summary": "Approves one variant and records who approved it.",
"verb": "approve-variant"
},
{
"effect": "write",
"flags": [
{
"field": "content_hash",
"flag": "--content-hash",
"required": true,
"summary": "The content hash of the variant, 64 lowercase hex characters.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/assets/*}:rejectVariant",
"method": "assets.assets.reject_variant",
"permission": "assets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/assets/{asset}"
},
"summary": "Rejects one variant. Its slot is freed and the next `:generate` fills it; the rejected file keeps serving at its URL.",
"verb": "reject-variant"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "content_hash",
"flag": "--content-hash",
"required": true,
"summary": "The content hash of the variant, 64 lowercase hex characters.",
"type": "string"
},
{
"field": "reason",
"flag": "--reason",
"summary": "Why the variant is retired, at most 500 characters.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/assets/*}:retireVariant",
"method": "assets.assets.retire_variant",
"permission": "assets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/assets/{asset}"
},
"summary": "Retires one variant. Its URL answers 404 from then on and its slot is freed.",
"verb": "retire-variant"
}
],
"noun": "assets",
"resource_type": "assets.sylphx.com/Asset"
}
],
"commands": [],
"display_name": "Sylphx Generated Assets",
"noun": "assets",
"stage": "preview"
},
{
"collections": [
{
"collection": "auth_configs",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/auth_configs/*}",
"method": "auth.auth_configs.get",
"permission": "auth:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/auth_configs/{auth_config}"
},
"summary": "Gets an auth config.",
"verb": "get"
},
{
"effect": "write",
"flags": [
{
"field": "auth_config.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "auth_config.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "auth_config.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "auth_config.spec.auth_methods",
"flag": "--spec.auth-methods",
"repeated": true,
"summary": "Sign-in methods offered to end users.",
"type": "enum",
"values": [
"password",
"magic_link",
"email_otp",
"passkey",
"totp",
"oidc",
"saml",
"device"
]
},
{
"field": "auth_config.spec.mfa_required",
"flag": "--spec.mfa-required",
"summary": "Require a second factor for every end user.",
"type": "bool"
},
{
"field": "auth_config.spec.passkey_policy.required",
"flag": "--spec.passkey-policy.required",
"summary": "Require a passkey for every end user.",
"type": "bool"
},
{
"field": "auth_config.spec.passkey_policy.device_bound",
"flag": "--spec.passkey-policy.device-bound",
"summary": "Refuse synced (multi-device) passkeys.",
"type": "bool"
},
{
"field": "auth_config.spec.passkey_policy.aaguid_allowlist",
"flag": "--spec.passkey-policy.aaguid-allowlist",
"repeated": true,
"summary": "Allowed authenticator AAGUIDs; empty allows any.",
"type": "string"
},
{
"field": "auth_config.spec.lockout_enabled",
"flag": "--spec.lockout-enabled",
"summary": "Progressive lockout by user and IP.",
"type": "bool"
},
{
"field": "auth_config.spec.session_policy.max_concurrent_sessions",
"flag": "--spec.session-policy.max-concurrent-sessions",
"summary": "Concurrent sessions per end user; excess sessions are revoked, oldest first. 0 is unlimited.",
"type": "int"
},
{
"field": "auth_config.spec.session_policy.idle_timeout",
"flag": "--spec.session-policy.idle-timeout",
"summary": "Revoke after this long without use; default 30d.",
"type": "duration"
},
{
"field": "auth_config.spec.session_policy.absolute_timeout",
"flag": "--spec.session-policy.absolute-timeout",
"summary": "Revoke this long after sign-in regardless of use; default 90d.",
"type": "duration"
},
{
"field": "auth_config.spec.session_policy.fingerprint_binding",
"flag": "--spec.session-policy.fingerprint-binding",
"summary": "Bind sessions to network and agent; a mismatch demands step-up.",
"type": "bool"
},
{
"field": "auth_config.spec.captcha_secret",
"flag": "--spec.captcha-secret",
"summary": "The CAPTCHA verifier secret, held in Sylphx Secrets; unset disables CAPTCHA.",
"type": "string"
},
{
"field": "auth_config.spec.portal.custom_domain",
"flag": "--spec.portal.custom-domain",
"summary": "A verified Network Domain serving the portal; unset uses the default origin.",
"type": "string"
},
{
"field": "auth_config.spec.portal.product_title",
"flag": "--spec.portal.product-title",
"summary": "The product name shown to end users.",
"type": "string"
},
{
"field": "auth_config.spec.portal.logo_uri",
"flag": "--spec.portal.logo-uri",
"summary": "An HTTPS logo URI.",
"type": "string"
},
{
"field": "auth_config.spec.portal.primary_color",
"flag": "--spec.portal.primary-color",
"summary": "The primary color, `#rrggbb`.",
"type": "string"
},
{
"field": "auth_config.spec.portal.sylphx_branding",
"flag": "--spec.portal.sylphx-branding",
"summary": "Show Sylphx branding.",
"type": "bool"
},
{
"field": "auth_config.spec.mail_sending_domain",
"flag": "--spec.mail-sending-domain",
"summary": "The Notify Sending Domain Auth mail is sent from; unset uses the Sylphx default.",
"type": "string"
},
{
"field": "auth_config.spec.user_sync_database",
"flag": "--spec.user-sync-database",
"summary": "A Sylphx Data database end users are synced into; unset disables sync.",
"type": "string"
},
{
"field": "auth_config.spec.social_providers",
"flag": "--spec.social-providers",
"repeated": true,
"summary": "Social sign-in: one entry per provider Sylphx serves (`google`, `github`, `apple`), whether it is on, and whether end users can use it now. An update changes only the providers it lists; the others keep their state. Without any change Google is on through Sylphx's shared client, when Sylphx has one. The provider's credentials (the shared client, or your own client id and secret) are set with the instance's `sign-in-providers:put`: a client secret never passes through this resource.",
"type": "json"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the auth config when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{auth_config.name=orgs/*/projects/*/envs/*/auth_configs/*}",
"method": "auth.auth_configs.update",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "auth_config.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/auth_configs/{auth_config}"
},
"resource_field": "auth_config",
"sends_etag": true,
"summary": "Updates an auth config.",
"update_mask": "from-flags",
"verb": "update"
}
],
"noun": "auth-configs",
"resource_type": "auth.sylphx.com/AuthConfig"
},
{
"collection": "end_users",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/end_users/*}",
"method": "auth.end_users.get",
"permission": "auth:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}"
},
"summary": "Gets an end user.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/end_users",
"method": "auth.end_users.list",
"paginates": true,
"permission": "auth:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists end users.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "end_user.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "end_user.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "end_user.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "end_user.email",
"flag": "--email",
"summary": "The primary email address.",
"type": "string"
},
{
"field": "end_user.password",
"flag": "--password",
"sensitive": true,
"summary": "An initial password; write-only, checked against breached passwords.",
"type": "string"
},
{
"field": "end_user.public_metadata",
"flag": "--public-metadata",
"summary": "App data readable by the end user's own tokens.",
"type": "json"
},
{
"field": "end_user.private_metadata",
"flag": "--private-metadata",
"summary": "App data readable only with an Access key.",
"type": "json"
},
{
"field": "end_user.unsafe_metadata",
"flag": "--unsafe-metadata",
"summary": "App data the end user may write with their own session (preferences a sign-up form collects); never trust it for authorization.",
"type": "json"
},
{
"field": "end_user.external_ids",
"flag": "--external-ids",
"repeated": true,
"summary": "The customer's own ids for this end user, one per namespace (`game_user`, `steam_id`): how an app that signs users in by its own id finds them again. Read on create; never changed through here, because a set namespace's value is never rewritten — `AttachEndUserExternalId` sets an unset one. At most four namespaces. Never an authorization input: scope checks use grant ids.",
"type": "key=value"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/end_users",
"method": "auth.end_users.create",
"permission": "auth:write",
"positional": {
"arg": "ID",
"field": "end_user_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "end_user",
"summary": "Creates an end user.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "end_user.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "end_user.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "end_user.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "end_user.email",
"flag": "--email",
"summary": "The primary email address.",
"type": "string"
},
{
"field": "end_user.password",
"flag": "--password",
"sensitive": true,
"summary": "An initial password; write-only, checked against breached passwords.",
"type": "string"
},
{
"field": "end_user.public_metadata",
"flag": "--public-metadata",
"summary": "App data readable by the end user's own tokens.",
"type": "json"
},
{
"field": "end_user.private_metadata",
"flag": "--private-metadata",
"summary": "App data readable only with an Access key.",
"type": "json"
},
{
"field": "end_user.unsafe_metadata",
"flag": "--unsafe-metadata",
"summary": "App data the end user may write with their own session (preferences a sign-up form collects); never trust it for authorization.",
"type": "json"
},
{
"field": "end_user.external_ids",
"flag": "--external-ids",
"repeated": true,
"summary": "The customer's own ids for this end user, one per namespace (`game_user`, `steam_id`): how an app that signs users in by its own id finds them again. Read on create; never changed through here, because a set namespace's value is never rewritten — `AttachEndUserExternalId` sets an unset one. At most four namespaces. Never an authorization input: scope checks use grant ids.",
"type": "key=value"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{end_user.name=orgs/*/projects/*/envs/*/end_users/*}",
"method": "auth.end_users.update",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "end_user.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}"
},
"resource_field": "end_user",
"sends_etag": true,
"summary": "Updates an end user.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the end user does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete the end user's memberships; sessions are always revoked.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/end_users/*}",
"method": "auth.end_users.delete",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}"
},
"summary": "Deletes an end user.",
"verb": "delete"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "reason",
"flag": "--reason",
"summary": "Why; shown to administrators only.",
"type": "string"
},
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/end_users/*}:suspend",
"method": "auth.end_users.suspend",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}"
},
"summary": "Suspends an end user: sessions are revoked and sign-in is refused.",
"verb": "suspend"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/end_users/*}:reactivate",
"method": "auth.end_users.reactivate",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}"
},
"summary": "Reactivates a suspended end user.",
"verb": "reactivate"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/end_users/*}:unlock",
"method": "auth.end_users.unlock",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}"
},
"summary": "Clears an end user's sign-in lock (repeated failed sign-ins) now.",
"verb": "unlock"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/end_users/*}:revokeSessions",
"method": "auth.end_users.revoke_sessions",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}"
},
"summary": "Revokes every session of an end user.",
"verb": "revoke-sessions"
},
{
"effect": "write",
"flags": [
{
"field": "namespace",
"flag": "--namespace",
"required": true,
"summary": "The customer's namespace for this id: `^[a-z][a-z0-9_]{0,31}$`.",
"type": "string"
},
{
"field": "external_id",
"flag": "--external-id",
"required": true,
"summary": "The id itself, 1 to 128 printable characters, unique in its namespace across the environment's live users.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/end_users/*}:attachExternalId",
"method": "auth.end_users.attach_external_id",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}"
},
"summary": "Sets the customer's own id for an end user, once: an unset namespace is written, a set one is never rewritten, and a different value for a set namespace is refused. A namespace holds one id for the life of the user. Erasure removes the ids and remembers their hashes, so a value that belonged to an erased user is never handed to another one.",
"verb": "attach-external-id"
},
{
"effect": "read",
"flags": [
{
"field": "namespace",
"flag": "--namespace",
"required": true,
"summary": "The customer's namespace of the id.",
"type": "string"
},
{
"field": "external_id",
"flag": "--external-id",
"required": true,
"summary": "The id to find.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/end_users:find",
"method": "auth.end_users.find",
"permission": "auth:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Finds the one end user of one of the customer's own ids. An id that belongs to no live user of this environment is `RESOURCE_NOT_FOUND`, the same answer a value erased with its user gives.",
"verb": "find"
}
],
"noun": "end-users",
"resource_type": "auth.sylphx.com/EndUser"
},
{
"collection": "sessions",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/end_users/*/sessions/*}",
"method": "auth.sessions.get",
"permission": "auth:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}/sessions/{session}"
},
"summary": "Gets a session.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/end_users/*}/sessions",
"method": "auth.sessions.list",
"paginates": true,
"permission": "auth:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}"
},
"summary": "Lists sessions.",
"verb": "list"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/end_users/*/sessions/*}:revoke",
"method": "auth.sessions.revoke",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}/sessions/{session}"
},
"summary": "Revokes a session.",
"verb": "revoke"
}
],
"noun": "sessions",
"resource_type": "auth.sylphx.com/Session"
},
{
"collection": "identities",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/end_users/*/identities/*}",
"method": "auth.identities.get",
"permission": "auth:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}/identities/{identity}"
},
"summary": "Gets an identity of an end user.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/end_users/*}/identities",
"method": "auth.identities.list",
"paginates": true,
"permission": "auth:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}"
},
"summary": "Lists the identities an end user signs in with.",
"verb": "list"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "target_end_user",
"flag": "--target-end-user",
"required": true,
"summary": "The end user that receives the identity.",
"type": "string"
},
{
"field": "reason",
"flag": "--reason",
"required": true,
"summary": "Why the identity moves (1 to 512 characters); recorded in the audit trail.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/end_users/*/identities/*}:move",
"method": "auth.identities.move",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}/identities/{identity}"
},
"summary": "Moves a federated or device identity from one end user to another, to fix a wrongly linked player. One transaction: the identity changes owner, the sessions of both end users are revoked, and nothing else about either moves (profile, memberships, data). Refused when it would leave the source with no sign-in, unless the source is suspended, and when the target already has an identity of the same provider. The reason is audited with the operator, both end users and the identity's fingerprint. An operator action: an end user's own session cannot call it.",
"verb": "move"
}
],
"noun": "identities",
"resource_type": "auth.sylphx.com/Identity"
},
{
"collection": "customer_organizations",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/customer_organizations/*}",
"method": "auth.customer_organizations.get",
"permission": "auth:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}"
},
"summary": "Gets a customer organization.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/customer_organizations",
"method": "auth.customer_organizations.list",
"paginates": true,
"permission": "auth:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists customer organizations.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "customer_organization.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "customer_organization.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "customer_organization.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "customer_organization.slug",
"flag": "--slug",
"summary": "Unique within the environment.",
"type": "string"
},
{
"field": "customer_organization.public_metadata",
"flag": "--public-metadata",
"summary": "App data.",
"type": "json"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "owner_end_user",
"flag": "--owner-end-user",
"summary": "The organization's first owner, an active end user of the same environment. The organization and its `owner` membership are created in one transaction, and the call honours `Idempotency-Key`: a retry returns the organization the first call created. Naming a person is explicit app authority: the app vouches for its own tenant. Empty creates an organization without members; creating then calling `CreateMembership` is not atomic.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/customer_organizations",
"method": "auth.customer_organizations.create",
"permission": "auth:write",
"positional": {
"arg": "ID",
"field": "customer_organization_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "customer_organization",
"summary": "Creates a customer organization.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "customer_organization.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "customer_organization.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "customer_organization.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "customer_organization.slug",
"flag": "--slug",
"summary": "Unique within the environment.",
"type": "string"
},
{
"field": "customer_organization.public_metadata",
"flag": "--public-metadata",
"summary": "App data.",
"type": "json"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the customer organization when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{customer_organization.name=orgs/*/projects/*/envs/*/customer_organizations/*}",
"method": "auth.customer_organizations.update",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "customer_organization.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}"
},
"resource_field": "customer_organization",
"sends_etag": true,
"summary": "Updates a customer organization.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the customer organization does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also close every membership.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/customer_organizations/*}",
"method": "auth.customer_organizations.delete",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}"
},
"summary": "Deletes a customer organization.",
"verb": "delete"
}
],
"noun": "customer-organizations",
"resource_type": "auth.sylphx.com/CustomerOrganization"
},
{
"collection": "memberships",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/customer_organizations/*/memberships/*}",
"method": "auth.memberships.get",
"permission": "auth:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}/memberships/{membership}"
},
"summary": "Gets a membership.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/customer_organizations/*}/memberships",
"method": "auth.memberships.list",
"paginates": true,
"permission": "auth:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}"
},
"summary": "Lists memberships.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "membership.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "membership.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "membership.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "membership.end_user",
"flag": "--end-user",
"required": true,
"summary": "The member.",
"type": "string"
},
{
"field": "membership.roles",
"flag": "--roles",
"repeated": true,
"summary": "App-defined roles, for example `admin`.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/customer_organizations/*}/memberships",
"method": "auth.memberships.create",
"permission": "auth:write",
"positional": {
"arg": "ID",
"field": "membership_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "membership",
"summary": "Creates a membership.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "membership.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "membership.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "membership.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "membership.roles",
"flag": "--roles",
"repeated": true,
"summary": "App-defined roles, for example `admin`.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{membership.name=orgs/*/projects/*/envs/*/customer_organizations/*/memberships/*}",
"method": "auth.memberships.update",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "membership.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}/memberships/{membership}"
},
"resource_field": "membership",
"sends_etag": true,
"summary": "Updates a membership.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the membership does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/customer_organizations/*/memberships/*}",
"method": "auth.memberships.delete",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}/memberships/{membership}"
},
"summary": "Deletes a membership.",
"verb": "delete"
}
],
"noun": "memberships",
"resource_type": "auth.sylphx.com/Membership"
},
{
"collection": "organization_roles",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/organization_roles/*}",
"method": "auth.organization_roles.get",
"permission": "auth:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/organization_roles/{organization_role}"
},
"summary": "Gets an organization role.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/organization_roles",
"method": "auth.organization_roles.list",
"paginates": true,
"permission": "auth:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists organization roles.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "organization_role.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "organization_role.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "organization_role.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "organization_role.permissions",
"flag": "--permissions",
"repeated": true,
"summary": "The app's permission strings `<resource>:<action>`, for example `invoices:read` or `org:payroll:approve`.",
"type": "string"
},
{
"field": "organization_role.auto_assign",
"flag": "--auto-assign",
"summary": "Whether new members and invitations without roles get this role.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/organization_roles",
"method": "auth.organization_roles.create",
"permission": "auth:write",
"positional": {
"arg": "ID",
"field": "organization_role_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "organization_role",
"summary": "Creates an organization role.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "organization_role.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "organization_role.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "organization_role.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "organization_role.permissions",
"flag": "--permissions",
"repeated": true,
"summary": "The app's permission strings `<resource>:<action>`, for example `invoices:read` or `org:payroll:approve`.",
"type": "string"
},
{
"field": "organization_role.auto_assign",
"flag": "--auto-assign",
"summary": "Whether new members and invitations without roles get this role.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{organization_role.name=orgs/*/projects/*/envs/*/organization_roles/*}",
"method": "auth.organization_roles.update",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "organization_role.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/organization_roles/{organization_role}"
},
"resource_field": "organization_role",
"sends_etag": true,
"summary": "Updates an organization role.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the organization role does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/organization_roles/*}",
"method": "auth.organization_roles.delete",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/organization_roles/{organization_role}"
},
"summary": "Deletes an organization role.",
"verb": "delete"
}
],
"noun": "organization-roles",
"resource_type": "auth.sylphx.com/OrganizationRole"
},
{
"collection": "invitations",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/customer_organizations/*/invitations/*}",
"method": "auth.invitations.get",
"permission": "auth:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}/invitations/{invitation}"
},
"summary": "Gets an invitation.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/customer_organizations/*}/invitations",
"method": "auth.invitations.list",
"paginates": true,
"permission": "auth:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}"
},
"summary": "Lists invitations.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "invitation.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "invitation.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "invitation.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "invitation.email",
"flag": "--email",
"required": true,
"summary": "The invited address.",
"type": "string"
},
{
"field": "invitation.roles",
"flag": "--roles",
"repeated": true,
"summary": "Roles the membership gets; empty means the environment's default roles.",
"type": "string"
},
{
"field": "invitation.ttl",
"flag": "--ttl",
"summary": "How long it stays open; default 7 days, at most 30.",
"type": "duration"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/customer_organizations/*}/invitations",
"method": "auth.invitations.create",
"permission": "auth:write",
"positional": {
"arg": "ID",
"field": "invitation_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "invitation",
"summary": "Creates an invitation.",
"verb": "create"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/customer_organizations/*/invitations/*}:revoke",
"method": "auth.invitations.revoke",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}/invitations/{invitation}"
},
"summary": "Revokes a pending invitation.",
"verb": "revoke"
},
{
"effect": "write",
"flags": [
{
"field": "end_user",
"flag": "--end-user",
"required": true,
"summary": "The accepting end user; its verified email must be the invited address.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/customer_organizations/*/invitations/*}:accept",
"method": "auth.invitations.accept",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}/invitations/{invitation}"
},
"summary": "Accepts a pending invitation for an end user whose verified email is the invited address, and creates the membership.",
"verb": "accept"
}
],
"noun": "invitations",
"resource_type": "auth.sylphx.com/Invitation"
},
{
"collection": "email_domains",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/customer_organizations/*/email_domains/*}",
"method": "auth.email_domains.get",
"permission": "auth:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}/email_domains/{email_domain}"
},
"summary": "Gets an email domain.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/customer_organizations/*}/email_domains",
"method": "auth.email_domains.list",
"paginates": true,
"permission": "auth:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}"
},
"summary": "Lists email domains.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "email_domain.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "email_domain.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "email_domain.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "email_domain.domain",
"flag": "--domain",
"required": true,
"summary": "The domain, lowercase, for example `acme.com`.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/customer_organizations/*}/email_domains",
"method": "auth.email_domains.create",
"permission": "auth:write",
"positional": {
"arg": "ID",
"field": "email_domain_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "email_domain",
"summary": "Creates an email domain; the answer names the TXT record to publish.",
"verb": "create"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the email domain does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/customer_organizations/*/email_domains/*}",
"method": "auth.email_domains.delete",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}/email_domains/{email_domain}"
},
"summary": "Deletes an email domain.",
"verb": "delete"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/customer_organizations/*/email_domains/*}:verify",
"method": "auth.email_domains.verify",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}/email_domains/{email_domain}"
},
"summary": "Looks up the domain's TXT record now; found, the domain is verified.",
"verb": "verify"
}
],
"noun": "email-domains",
"resource_type": "auth.sylphx.com/EmailDomain"
},
{
"collection": "oauth_clients",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/oauth_clients/*}",
"method": "auth.oauth_clients.get",
"permission": "auth:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/oauth_clients/{oauth_client}"
},
"summary": "Gets an OAuth client.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/oauth_clients",
"method": "auth.oauth_clients.list",
"paginates": true,
"permission": "auth:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists OAuth clients.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "oauth_client.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "oauth_client.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "oauth_client.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "oauth_client.spec.client_type",
"flag": "--spec.client-type",
"required": true,
"summary": "Confidential or public.",
"type": "enum",
"values": [
"confidential",
"public"
]
},
{
"field": "oauth_client.spec.token_endpoint_auth_method",
"flag": "--spec.token-endpoint-auth-method",
"required": true,
"summary": "How the client authenticates at the token endpoint.",
"type": "enum",
"values": [
"none",
"client_secret_basic",
"private_key_jwt"
]
},
{
"field": "oauth_client.spec.redirect_uris",
"flag": "--spec.redirect-uris",
"repeated": true,
"summary": "Exact redirect URIs.",
"type": "string"
},
{
"field": "oauth_client.spec.grant_types",
"flag": "--spec.grant-types",
"repeated": true,
"required": true,
"summary": "Allowed grants.",
"type": "enum",
"values": [
"authorization_code",
"refresh_token",
"device_code",
"client_credentials"
]
},
{
"field": "oauth_client.spec.scopes",
"flag": "--spec.scopes",
"repeated": true,
"summary": "Scopes the client may request.",
"type": "string"
},
{
"field": "oauth_client.spec.jwks_uri",
"flag": "--spec.jwks-uri",
"summary": "The client's JWKS URI, for `private_key_jwt`.",
"type": "string"
},
{
"field": "oauth_client.spec.dpop_required",
"flag": "--spec.dpop-required",
"summary": "Require DPoP-bound tokens (RFC 9449).",
"type": "bool"
},
{
"field": "oauth_client.spec.access_token_ttl",
"flag": "--spec.access-token-ttl",
"summary": "Access token lifetime; default 1h.",
"type": "duration"
},
{
"field": "oauth_client.spec.refresh_token_ttl",
"flag": "--spec.refresh-token-ttl",
"summary": "Refresh token lifetime; default 30d.",
"type": "duration"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/oauth_clients",
"method": "auth.oauth_clients.create",
"permission": "auth:write",
"positional": {
"arg": "ID",
"field": "oauth_client_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "oauth_client",
"summary": "Creates an OAuth client.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "oauth_client.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "oauth_client.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "oauth_client.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "oauth_client.spec.token_endpoint_auth_method",
"flag": "--spec.token-endpoint-auth-method",
"required": true,
"summary": "How the client authenticates at the token endpoint.",
"type": "enum",
"values": [
"none",
"client_secret_basic",
"private_key_jwt"
]
},
{
"field": "oauth_client.spec.redirect_uris",
"flag": "--spec.redirect-uris",
"repeated": true,
"summary": "Exact redirect URIs.",
"type": "string"
},
{
"field": "oauth_client.spec.grant_types",
"flag": "--spec.grant-types",
"repeated": true,
"required": true,
"summary": "Allowed grants.",
"type": "enum",
"values": [
"authorization_code",
"refresh_token",
"device_code",
"client_credentials"
]
},
{
"field": "oauth_client.spec.scopes",
"flag": "--spec.scopes",
"repeated": true,
"summary": "Scopes the client may request.",
"type": "string"
},
{
"field": "oauth_client.spec.jwks_uri",
"flag": "--spec.jwks-uri",
"summary": "The client's JWKS URI, for `private_key_jwt`.",
"type": "string"
},
{
"field": "oauth_client.spec.dpop_required",
"flag": "--spec.dpop-required",
"summary": "Require DPoP-bound tokens (RFC 9449).",
"type": "bool"
},
{
"field": "oauth_client.spec.access_token_ttl",
"flag": "--spec.access-token-ttl",
"summary": "Access token lifetime; default 1h.",
"type": "duration"
},
{
"field": "oauth_client.spec.refresh_token_ttl",
"flag": "--spec.refresh-token-ttl",
"summary": "Refresh token lifetime; default 30d.",
"type": "duration"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the OAuth client when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{oauth_client.name=orgs/*/projects/*/envs/*/oauth_clients/*}",
"method": "auth.oauth_clients.update",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "oauth_client.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/oauth_clients/{oauth_client}"
},
"resource_field": "oauth_client",
"sends_etag": true,
"summary": "Updates an OAuth client.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the OAuth client does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/oauth_clients/*}",
"method": "auth.oauth_clients.delete",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/oauth_clients/{oauth_client}"
},
"summary": "Deletes an OAuth client.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "grace_period",
"flag": "--grace-period",
"summary": "How long the old secret keeps verifying; default 24h.",
"type": "duration"
},
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/oauth_clients/*}:rollSecret",
"method": "auth.oauth_clients.roll_secret",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/oauth_clients/{oauth_client}"
},
"summary": "Issues a new client secret, returned once; the old one verifies until `grace_period` ends.",
"verb": "roll-secret"
}
],
"noun": "oauth-clients",
"resource_type": "auth.sylphx.com/OauthClient"
}
],
"commands": [],
"display_name": "Sylphx Auth",
"noun": "auth",
"stage": "preview"
},
{
"collections": [
{
"collection": "meters",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=meters/*}",
"method": "billing.meters.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "meters/{meter}"
},
"summary": "Gets a meter.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/meters",
"method": "billing.meters.list",
"paginates": true,
"permission": "billing:read",
"positional": null,
"summary": "Lists meters. Anonymous-readable: the pricing page renders from it.",
"verb": "list"
}
],
"noun": "meters",
"resource_type": "billing.sylphx.com/Meter"
},
{
"collection": "plans",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=plans/*}",
"method": "billing.plans.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "plans/{plan}"
},
"summary": "Gets a plan.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/plans",
"method": "billing.plans.list",
"paginates": true,
"permission": "billing:read",
"positional": null,
"summary": "Lists the plans the caller can see. Anonymous-readable: the pricing page renders from it.",
"verb": "list"
}
],
"noun": "plans",
"resource_type": "billing.sylphx.com/Plan"
},
{
"collection": "billing_accounts",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/billing_accounts/*}",
"method": "billing.billing_accounts.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/billing_accounts/{billing_account}"
},
"summary": "Gets a billing account.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/billing_accounts",
"method": "billing.billing_accounts.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists an org's billing accounts: exactly one, `default`.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "billing_account.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "billing_account.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "billing_account.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "billing_account.spec.plan",
"flag": "--spec.plan",
"required": true,
"summary": "The plan to be on, for example `plans/pro`. A change takes effect at once; an upgrade to Pro is prorated by day and requires a payment method.",
"type": "string"
},
{
"field": "billing_account.spec.spend_limit.currency_code",
"flag": "--spec.spend-limit.currency-code",
"summary": "ISO 4217 currency, for example `USD`.",
"type": "string"
},
{
"field": "billing_account.spec.spend_limit.units_minor",
"flag": "--spec.spend-limit.units-minor",
"summary": "The amount in the currency's minor unit (cents for USD).",
"type": "int"
},
{
"field": "billing_account.spec.unlimited_spend",
"flag": "--spec.unlimited-spend",
"summary": "No spend limit; requires a verified payment method.",
"type": "bool"
},
{
"field": "billing_account.spec.billing_email",
"flag": "--spec.billing-email",
"summary": "Where invoices and payment notices are sent.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{billing_account.name=orgs/*/billing_accounts/*}",
"method": "billing.billing_accounts.update",
"permission": "billing:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "billing_account.name",
"pattern": "orgs/{org}/billing_accounts/{billing_account}"
},
"resource_field": "billing_account",
"sends_etag": true,
"summary": "Updates a billing account: changes plan, spend limit, or billing email.",
"update_mask": "from-flags",
"verb": "update"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/billing_accounts/*}:setupPaymentMethod",
"method": "billing.billing_accounts.setup_payment_method",
"permission": "billing:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/billing_accounts/{billing_account}"
},
"summary": "Starts saving a payment method for the org: returns a client secret the console confirms with Stripe.js, so card data never reaches Sylphx. The saved method becomes the account's default and is charged off-session for each finalized invoice.",
"verb": "setup-payment-method"
}
],
"noun": "billing-accounts",
"resource_type": "billing.sylphx.com/BillingAccount"
},
{
"collection": "invoices",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/invoices/*}",
"method": "billing.invoices.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/invoices/{invoice}"
},
"summary": "Gets an invoice.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/invoices",
"method": "billing.invoices.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists an org's invoices.",
"verb": "list"
}
],
"noun": "invoices",
"resource_type": "billing.sylphx.com/Invoice"
},
{
"collection": "usage_reports",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/usage_reports/*}",
"method": "billing.usage_reports.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/usage_reports/{usage_report}"
},
"summary": "Gets an usage report.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/usage_reports",
"method": "billing.usage_reports.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists an org's usage reports, one per billing period.",
"verb": "list"
},
{
"effect": "read",
"flags": [
{
"field": "start_time",
"flag": "--start-time",
"required": true,
"summary": "The start of the range, inclusive.",
"type": "timestamp"
},
{
"field": "end_time",
"flag": "--end-time",
"required": true,
"summary": "The end of the range, exclusive; at most 400 days after `start_time`.",
"type": "timestamp"
},
{
"field": "granularity",
"flag": "--granularity",
"required": true,
"summary": "The bucket width.",
"type": "enum",
"values": [
"hour",
"day",
"period"
]
},
{
"field": "projects",
"flag": "--projects",
"repeated": true,
"summary": "Only these projects; empty means every project.",
"type": "string"
},
{
"field": "meters",
"flag": "--meters",
"repeated": true,
"summary": "Only these meter ids; empty means every meter.",
"type": "string"
},
{
"field": "group_projects",
"flag": "--group-projects",
"summary": "Group by project in addition to meter.",
"type": "bool"
},
{
"field": "group_dimensions",
"flag": "--group-dimensions",
"repeated": true,
"summary": "Dimension keys to group by, for example `model`.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*}/usage_reports:query",
"method": "billing.usage_reports.query",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}"
},
"summary": "Queries usage over any time range, bucketed and grouped: the usage summary the console charts. Reads rollups; never raw events.",
"verb": "query"
}
],
"noun": "usage-reports",
"resource_type": "billing.sylphx.com/UsageReport"
},
{
"collection": "budget_leases",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/budget_leases/*}",
"method": "billing.budget_leases.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/budget_leases/{budget_lease}"
},
"summary": "Gets a budget lease.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/budget_leases",
"method": "billing.budget_leases.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists an org's budget leases.",
"verb": "list"
}
],
"noun": "budget-leases",
"resource_type": "billing.sylphx.com/BudgetLease"
}
],
"commands": [],
"display_name": "Sylphx Billing",
"noun": "billing",
"served": false,
"stage": "preview"
},
{
"collections": [
{
"collection": "trust_policies",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/trust_policies/*}",
"method": "broker.trust_policies.get",
"permission": "broker:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/trust_policies/{trust_policy}"
},
"summary": "Gets a trust policy.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/trust_policies",
"method": "broker.trust_policies.list",
"paginates": true,
"permission": "broker:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists an org's trust policies.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "trust_policy.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "trust_policy.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "trust_policy.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "trust_policy.spec.connection",
"flag": "--spec.connection",
"required": true,
"summary": "The Connection credentials are issued on.",
"type": "string"
},
{
"field": "trust_policy.spec.subjects",
"flag": "--spec.subjects",
"repeated": true,
"required": true,
"summary": "The identities allowed to exchange: SPIFFE ids (`spiffe://<trust-domain>/cell/<cell>/role/<role>`, `*` matching one segment) or Sylphx Access principal names. The cell segment is never stripped.",
"type": "string"
},
{
"field": "trust_policy.spec.permissions",
"flag": "--spec.permissions",
"repeated": true,
"required": true,
"summary": "The most a credential may carry, in the provider's permission names, for example `{\"contents\": \"read\", \"checks\": \"write\"}`.",
"type": "key=value"
},
{
"field": "trust_policy.spec.repositories",
"flag": "--spec.repositories",
"repeated": true,
"summary": "The most repositories a credential may cover; empty means every repository the Connection covers.",
"type": "string"
},
{
"field": "trust_policy.spec.credential_kind",
"flag": "--spec.credential-kind",
"required": true,
"summary": "What the credential service issues.",
"type": "enum",
"values": [
"access_token",
"runner_registration"
]
},
{
"field": "trust_policy.spec.max_ttl",
"flag": "--spec.max-ttl",
"summary": "The longest a credential lives; default and maximum 1 hour.",
"type": "duration"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*}/trust_policies",
"method": "broker.trust_policies.create",
"permission": "broker:admin",
"positional": {
"arg": "ID",
"field": "trust_policy_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "trust_policy",
"summary": "Creates a trust policy.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "trust_policy.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "trust_policy.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "trust_policy.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "trust_policy.spec.connection",
"flag": "--spec.connection",
"required": true,
"summary": "The Connection credentials are issued on.",
"type": "string"
},
{
"field": "trust_policy.spec.subjects",
"flag": "--spec.subjects",
"repeated": true,
"required": true,
"summary": "The identities allowed to exchange: SPIFFE ids (`spiffe://<trust-domain>/cell/<cell>/role/<role>`, `*` matching one segment) or Sylphx Access principal names. The cell segment is never stripped.",
"type": "string"
},
{
"field": "trust_policy.spec.permissions",
"flag": "--spec.permissions",
"repeated": true,
"required": true,
"summary": "The most a credential may carry, in the provider's permission names, for example `{\"contents\": \"read\", \"checks\": \"write\"}`.",
"type": "key=value"
},
{
"field": "trust_policy.spec.repositories",
"flag": "--spec.repositories",
"repeated": true,
"summary": "The most repositories a credential may cover; empty means every repository the Connection covers.",
"type": "string"
},
{
"field": "trust_policy.spec.credential_kind",
"flag": "--spec.credential-kind",
"required": true,
"summary": "What the credential service issues.",
"type": "enum",
"values": [
"access_token",
"runner_registration"
]
},
{
"field": "trust_policy.spec.max_ttl",
"flag": "--spec.max-ttl",
"summary": "The longest a credential lives; default and maximum 1 hour.",
"type": "duration"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{trust_policy.name=orgs/*/trust_policies/*}",
"method": "broker.trust_policies.update",
"permission": "broker:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "trust_policy.name",
"pattern": "orgs/{org}/trust_policies/{trust_policy}"
},
"resource_field": "trust_policy",
"sends_etag": true,
"summary": "Updates a trust policy.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/trust_policies/*}",
"method": "broker.trust_policies.delete",
"permission": "broker:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/trust_policies/{trust_policy}"
},
"summary": "Deletes a trust policy.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "subject_token",
"flag": "--subject-token",
"required": true,
"sensitive": true,
"summary": "The caller's identity: a SPIFFE JWT-SVID or an Access-issued workload OIDC token, with audience `broker.sylphx.com`.",
"type": "string"
},
{
"field": "permissions",
"flag": "--permissions",
"repeated": true,
"summary": "The permissions this call needs, at most the policy's; empty means the policy's.",
"type": "key=value"
},
{
"field": "repositories",
"flag": "--repositories",
"repeated": true,
"summary": "The repositories this call needs, at most the policy's; empty means the policy's.",
"type": "string"
},
{
"field": "ttl",
"flag": "--ttl",
"summary": "How long the credential should live, at most the policy's `max_ttl`.",
"type": "duration"
}
],
"http": "POST /v1/{name=orgs/*/trust_policies/*}:exchangeToken",
"method": "broker.trust_policies.exchange_token",
"permission": "broker:exchange",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/trust_policies/{trust_policy}"
},
"summary": "Exchanges the caller's workload identity for a short-lived provider credential under a trust policy (RFC 8693 token exchange). The credential is narrowed to the request and cached per installation and permission set; a permission the Connection lacks is PERMISSION_DENIED with reason `CapabilityMissing`, never an outage.",
"verb": "exchange-token"
}
],
"noun": "trust-policies",
"resource_type": "broker.sylphx.com/TrustPolicy"
}
],
"commands": [],
"display_name": "Sylphx Broker",
"noun": "broker",
"served": false,
"stage": "preview"
},
{
"collections": [
{
"collection": "builds",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/builds/*}",
"method": "build.builds.get",
"permission": "build:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/builds/{build}"
},
"summary": "Gets a build.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*}/builds",
"method": "build.builds.list",
"paginates": true,
"permission": "build:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Lists builds in a project.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "build.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "build.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "build.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "build.spec.source.source_link",
"flag": "--spec.source.source-link",
"summary": "The Hosting SourceLink naming the repository and its Connection.",
"type": "string"
},
{
"field": "build.spec.source.commit",
"flag": "--spec.source.commit",
"summary": "The full commit SHA to build.",
"type": "string"
},
{
"field": "build.spec.source.root_directory",
"flag": "--spec.source.root-directory",
"summary": "The directory inside the repository to build; default the root.",
"type": "string"
},
{
"field": "build.spec.cache",
"flag": "--spec.cache",
"summary": "The BuildCache to read and write; default the project's `default` cache.",
"type": "string"
},
{
"field": "build.spec.tree.root_digest",
"flag": "--spec.tree.root-digest",
"summary": "The root `Directory` digest, `<sha256 hex>/<size in bytes>`.",
"type": "string"
},
{
"field": "build.spec.image.service",
"flag": "--spec.image.service",
"summary": "The `sylphx.toml` service whose `dockerfile` and `context` apply; unset reads the fields below or lets the zero-config frontend detect the stack.",
"type": "string"
},
{
"field": "build.spec.image.dockerfile",
"flag": "--spec.image.dockerfile",
"summary": "A Dockerfile path relative to the input root; unset lets the zero-config frontend detect the stack.",
"type": "string"
},
{
"field": "build.spec.image.target",
"flag": "--spec.image.target",
"summary": "The Dockerfile stage to build.",
"type": "string"
},
{
"field": "build.spec.image.build_args",
"flag": "--spec.image.build-args",
"repeated": true,
"summary": "Build arguments. Secret values bind through `[build.secrets]`, never here.",
"type": "key=value"
},
{
"field": "build.spec.command.argv",
"flag": "--spec.command.argv",
"repeated": true,
"summary": "The program and its arguments. Use `[\"bash\", \"-lc\", \"…\"]` for a shell.",
"type": "string"
},
{
"field": "build.spec.command.artifacts",
"flag": "--spec.command.artifacts",
"repeated": true,
"summary": "Globs, relative to the input root, of files kept after the command ends, whatever its exit code (test reports, coverage).",
"type": "string"
},
{
"field": "build.spec.size",
"flag": "--spec.size",
"summary": "The machine size; default `[build] size`, else STANDARD.",
"type": "enum",
"values": [
"standard",
"large",
"xlarge"
]
},
{
"field": "build.spec.timeout",
"flag": "--spec.timeout",
"summary": "The time limit; default 1 hour, at most 6 hours. A command that reaches it is killed and the Build ends with BUILD_FAILURE_TIMEOUT.",
"type": "duration"
},
{
"field": "build.spec.allow_hosts",
"flag": "--spec.allow-hosts",
"repeated": true,
"summary": "Internet hosts the build may reach. Empty means in-cell only: the mirrors and the store. Default `[build] allow_hosts`.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*}/builds",
"method": "build.builds.create",
"permission": "build:run",
"positional": {
"arg": "ID",
"field": "build_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "build",
"summary": "Creates a build: one command or one image over a commit or a tree. The Operation is done when the build reaches a final state. `run` and `image` are the short forms.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/builds/*}:cancel",
"method": "build.builds.cancel",
"permission": "build:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/builds/{build}"
},
"summary": "Cancels a queued or running Build; its lease is released and nothing is published.",
"verb": "cancel",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "tree",
"flag": "--tree",
"required": true,
"summary": "The uploaded tree to run over.",
"type": "json"
},
{
"field": "command",
"flag": "--command",
"repeated": true,
"required": true,
"summary": "The program and its arguments.",
"type": "string"
},
{
"field": "artifacts",
"flag": "--artifacts",
"repeated": true,
"summary": "Globs of files kept after the command ends, whatever its exit code.",
"type": "string"
},
{
"field": "size",
"flag": "--size",
"summary": "The machine size; default `[build] size`, else STANDARD.",
"type": "enum",
"values": [
"standard",
"large",
"xlarge"
]
},
{
"field": "timeout",
"flag": "--timeout",
"summary": "The time limit; default 1 hour.",
"type": "duration"
},
{
"field": "allow_hosts",
"flag": "--allow-hosts",
"repeated": true,
"summary": "Internet hosts the command may reach; empty means in-cell only.",
"type": "string"
},
{
"field": "cache",
"flag": "--cache",
"summary": "The BuildCache to use; default the project's `default` cache.",
"type": "string"
},
{
"field": "build_id",
"flag": "--build-id",
"summary": "The id segment of the Build's name; the server assigns one when unset.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*}/builds:run",
"method": "build.builds.run",
"permission": "build:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Runs one command over an uploaded tree and settles with its exit code, like the local command. A caller that gets a failure before the command started (BUILD_FAILURE_SETUP_FAILED, NO_CAPACITY) may build locally.",
"verb": "run",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "source",
"flag": "--source",
"summary": "A commit, read through the Broker at that exact commit.",
"type": "json"
},
{
"field": "tree",
"flag": "--tree",
"summary": "An uploaded tree.",
"type": "json"
},
{
"field": "image",
"flag": "--image",
"summary": "The image to build.",
"type": "json"
},
{
"field": "size",
"flag": "--size",
"summary": "The machine size; default `[build] size`, else STANDARD.",
"type": "enum",
"values": [
"standard",
"large",
"xlarge"
]
},
{
"field": "timeout",
"flag": "--timeout",
"summary": "The time limit; default 1 hour.",
"type": "duration"
},
{
"field": "allow_hosts",
"flag": "--allow-hosts",
"repeated": true,
"summary": "Internet hosts the build may reach; empty means in-cell only.",
"type": "string"
},
{
"field": "cache",
"flag": "--cache",
"summary": "The BuildCache to use; default the project's `default` cache.",
"type": "string"
},
{
"field": "build_id",
"flag": "--build-id",
"summary": "The id segment of the Build's name; the server assigns one when unset.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*}/builds:buildImage",
"method": "build.builds.build_image",
"permission": "build:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Builds an image, with an SBOM and signed provenance, from a commit or an uploaded tree.",
"verb": "build-image",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many lines; default 500, clamped to 5000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "wait",
"flag": "--wait",
"summary": "On a running build, wait up to this long (at most 30s) for new lines before returning an empty page.",
"type": "duration"
}
],
"http": "GET /v1/{name=orgs/*/projects/*/builds/*}:readLogs",
"method": "build.builds.read_logs",
"permission": "build:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/builds/{build}"
},
"summary": "Reads a page of a build's log lines, oldest first. With `wait`, an empty page on a running build waits up to that long for new lines, so a client follows the log by passing each `next_page_token` back.",
"verb": "read-logs"
}
],
"noun": "builds",
"resource_type": "build.sylphx.com/Build"
},
{
"collection": "build_caches",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/build_caches/*}",
"method": "build.build_caches.get",
"permission": "build:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/build_caches/{build_cache}"
},
"summary": "Gets a build cache.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*}/build_caches",
"method": "build.build_caches.list",
"paginates": true,
"permission": "build:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Lists build caches in a project.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "build_cache.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "build_cache.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "build_cache.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "build_cache.spec.retention",
"flag": "--spec.retention",
"summary": "Entries unused this long are evicted; default 7 days.",
"type": "duration"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{build_cache.name=orgs/*/projects/*/build_caches/*}",
"method": "build.build_caches.update",
"permission": "build:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "build_cache.name",
"pattern": "orgs/{org}/projects/{project}/build_caches/{build_cache}"
},
"resource_field": "build_cache",
"sends_etag": true,
"summary": "Updates a build cache.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/build_caches/*}",
"method": "build.build_caches.delete",
"permission": "build:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/build_caches/{build_cache}"
},
"summary": "Deletes a build cache.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "access",
"flag": "--access",
"summary": "What the token may do; default READ.",
"type": "enum",
"values": [
"read",
"read_write"
]
}
],
"http": "POST /v1/{name=orgs/*/projects/*/build_caches/*}:mintEnv",
"method": "build.build_caches.mint_env",
"permission": "build:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/build_caches/{build_cache}"
},
"summary": "Mints the settings a build that runs elsewhere (a laptop, a CI runner) uses to reach the cache: the sccache, Turbo and crates mirror doors and a short-lived token, as environment variables.",
"verb": "mint-env"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Purge only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/build_caches/*}:purge",
"method": "build.build_caches.purge",
"permission": "build:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/build_caches/{build_cache}"
},
"summary": "Empties a build cache and keeps the cache. The undo is that the next build refills it.",
"verb": "purge",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "build-caches",
"resource_type": "build.sylphx.com/BuildCache"
}
],
"commands": [],
"display_name": "Sylphx Build",
"noun": "build",
"served": false,
"stage": "preview"
},
{
"collections": [
{
"collection": "config_flags",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/config_flags/*}",
"method": "config.config_flags.get",
"permission": "config:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/config_flags/{config_flag}"
},
"summary": "Gets a config flag.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/config_flags",
"method": "config.config_flags.list",
"paginates": true,
"permission": "config:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists config flags in an environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "config_flag.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "config_flag.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "config_flag.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "config_flag.spec.value_type",
"flag": "--spec.value-type",
"required": true,
"summary": "The type every value of the flag has.",
"type": "enum",
"values": [
"bool",
"string",
"int64",
"double",
"json"
]
},
{
"field": "config_flag.spec.default_value",
"flag": "--spec.default-value",
"required": true,
"summary": "The value when no rule matches, or when the flag is disabled.",
"type": "json"
},
{
"field": "config_flag.spec.enabled",
"flag": "--spec.enabled",
"summary": "When false, every evaluation returns `default_value` and the rules are skipped: a kill switch. Default true.",
"type": "bool"
},
{
"field": "config_flag.spec.rules",
"flag": "--spec.rules",
"repeated": true,
"summary": "Targeting rules, first match wins.",
"type": "json"
},
{
"field": "config_flag.spec.description",
"flag": "--spec.description",
"summary": "What the flag is for.",
"type": "string"
},
{
"field": "config_flag.spec.client_visible",
"flag": "--spec.client-visible",
"summary": "Publishable keys (browsers, mobile apps) may evaluate it with `config_flags:evaluate`; default false, so a server-only flag's value never reaches a device. Secret keys evaluate every flag.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/config_flags",
"method": "config.config_flags.create",
"permission": "config:write",
"positional": {
"arg": "ID",
"field": "config_flag_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "config_flag",
"summary": "Creates a config flag; the Operation is done when every cell serves it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "config_flag.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "config_flag.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "config_flag.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "config_flag.spec.default_value",
"flag": "--spec.default-value",
"required": true,
"summary": "The value when no rule matches, or when the flag is disabled.",
"type": "json"
},
{
"field": "config_flag.spec.enabled",
"flag": "--spec.enabled",
"summary": "When false, every evaluation returns `default_value` and the rules are skipped: a kill switch. Default true.",
"type": "bool"
},
{
"field": "config_flag.spec.rules",
"flag": "--spec.rules",
"repeated": true,
"summary": "Targeting rules, first match wins.",
"type": "json"
},
{
"field": "config_flag.spec.description",
"flag": "--spec.description",
"summary": "What the flag is for.",
"type": "string"
},
{
"field": "config_flag.spec.client_visible",
"flag": "--spec.client-visible",
"summary": "Publishable keys (browsers, mobile apps) may evaluate it with `config_flags:evaluate`; default false, so a server-only flag's value never reaches a device. Secret keys evaluate every flag.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{config_flag.name=orgs/*/projects/*/envs/*/config_flags/*}",
"method": "config.config_flags.update",
"permission": "config:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "config_flag.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/config_flags/{config_flag}"
},
"resource_field": "config_flag",
"sends_etag": true,
"summary": "Updates a config flag; the change rolls out in waves and the Operation is done when every cell serves it.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/config_flags/*}",
"method": "config.config_flags.delete",
"permission": "config:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/config_flags/{config_flag}"
},
"summary": "Deletes a config flag; evaluators then get their compiled-in fallback.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "read",
"flags": [
{
"field": "context",
"flag": "--context",
"summary": "Who and what the evaluation is for.",
"type": "json"
},
{
"field": "config_flags",
"flag": "--config-flags",
"repeated": true,
"summary": "The ids of the flags to evaluate; empty evaluates every flag of the environment. An unknown id answers reason NOT_FOUND.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/config_flags:evaluate",
"method": "config.config_flags.evaluate",
"permission": "config:evaluate",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Evaluates config flags of an environment for one evaluation context: each flag's value, and why. Browsers and mobile apps call it with a publishable key holding `config:evaluate`, which reads values, never rules.",
"verb": "evaluate"
},
{
"effect": "read",
"flags": [
{
"field": "if_none_match",
"flag": "--if-none-match",
"summary": "The `etag` of the snapshot the caller holds; unchanged answers `not_modified`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/config_flags:snapshot",
"method": "config.config_flags.snapshot",
"permission": "config:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "The environment's flags and segments in one read, for SDKs that evaluate locally. Poll it with `if_none_match` set to the last `etag`: an unchanged ruleset answers `not_modified` and nothing else.",
"verb": "snapshot"
}
],
"noun": "config-flags",
"resource_type": "config.sylphx.com/ConfigFlag"
},
{
"collection": "config_segments",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/config_segments/*}",
"method": "config.config_segments.get",
"permission": "config:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/config_segments/{config_segment}"
},
"summary": "Gets a config segment.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/config_segments",
"method": "config.config_segments.list",
"paginates": true,
"permission": "config:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists config segments in an environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "config_segment.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "config_segment.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "config_segment.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "config_segment.spec.included",
"flag": "--spec.included",
"repeated": true,
"summary": "Subjects always in the segment, by `user_id` or `anonymous_id`.",
"type": "string"
},
{
"field": "config_segment.spec.excluded",
"flag": "--spec.excluded",
"repeated": true,
"summary": "Subjects never in the segment, whatever else holds.",
"type": "string"
},
{
"field": "config_segment.spec.conditions",
"flag": "--spec.conditions",
"repeated": true,
"summary": "Conditions over the evaluation context; all must hold.",
"type": "json"
},
{
"field": "config_segment.spec.description",
"flag": "--spec.description",
"summary": "Who the segment is.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/config_segments",
"method": "config.config_segments.create",
"permission": "config:write",
"positional": {
"arg": "ID",
"field": "config_segment_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "config_segment",
"summary": "Creates a config segment.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "config_segment.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "config_segment.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "config_segment.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "config_segment.spec.included",
"flag": "--spec.included",
"repeated": true,
"summary": "Subjects always in the segment, by `user_id` or `anonymous_id`.",
"type": "string"
},
{
"field": "config_segment.spec.excluded",
"flag": "--spec.excluded",
"repeated": true,
"summary": "Subjects never in the segment, whatever else holds.",
"type": "string"
},
{
"field": "config_segment.spec.conditions",
"flag": "--spec.conditions",
"repeated": true,
"summary": "Conditions over the evaluation context; all must hold.",
"type": "json"
},
{
"field": "config_segment.spec.description",
"flag": "--spec.description",
"summary": "Who the segment is.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{config_segment.name=orgs/*/projects/*/envs/*/config_segments/*}",
"method": "config.config_segments.update",
"permission": "config:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "config_segment.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/config_segments/{config_segment}"
},
"resource_field": "config_segment",
"sends_etag": true,
"summary": "Updates a config segment; every flag naming it follows.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/config_segments/*}",
"method": "config.config_segments.delete",
"permission": "config:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/config_segments/{config_segment}"
},
"summary": "Deletes a config segment; refused while a flag names it.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "config-segments",
"resource_type": "config.sylphx.com/ConfigSegment"
},
{
"collection": "config_changes",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/config_changes/*}",
"method": "config.config_changes.get",
"permission": "config:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/config_changes/{config_change}"
},
"summary": "Gets a config change.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter; `target = \"<flag or segment name>\"` is supported.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/config_changes",
"method": "config.config_changes.list",
"paginates": true,
"permission": "config:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists config changes in an environment.",
"verb": "list"
}
],
"noun": "config-changes",
"resource_type": "config.sylphx.com/ConfigChange"
}
],
"commands": [],
"display_name": "Sylphx Config",
"noun": "config",
"stage": "preview"
},
{
"collections": [
{
"collection": "connection_providers",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/connection_providers/*}",
"method": "connections.connection_providers.get",
"permission": "connections:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/connection_providers/{connection_provider}"
},
"summary": "Gets a connection provider.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/connection_providers",
"method": "connections.connection_providers.list",
"paginates": true,
"permission": "connections:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists an org's connection providers.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "connection_provider.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "connection_provider.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "connection_provider.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "connection_provider.spec.github_app.app_id",
"flag": "--spec.github-app.app-id",
"summary": "The App's numeric id.",
"type": "int"
},
{
"field": "connection_provider.spec.github_app.slug",
"flag": "--spec.github-app.slug",
"summary": "The App's slug, for example `sylphx`.",
"type": "string"
},
{
"field": "connection_provider.spec.github_app.client_id",
"flag": "--spec.github-app.client-id",
"summary": "The App's OAuth client id.",
"type": "string"
},
{
"field": "connection_provider.spec.github_app.signing_key",
"flag": "--spec.github-app.signing-key",
"summary": "The imported, non-exportable SIGN Key (RS256) that signs App assertions; only the credential service may use it.",
"type": "string"
},
{
"field": "connection_provider.spec.github_app.webhook_secret",
"flag": "--spec.github-app.webhook-secret",
"summary": "The Secret holding the webhook secret that verifies deliveries.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*}/connection_providers",
"method": "connections.connection_providers.create",
"permission": "connections:admin",
"positional": {
"arg": "ID",
"field": "connection_provider_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "connection_provider",
"summary": "Creates a connection provider.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "connection_provider.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "connection_provider.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "connection_provider.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "connection_provider.spec.github_app.slug",
"flag": "--spec.github-app.slug",
"summary": "The App's slug, for example `sylphx`.",
"type": "string"
},
{
"field": "connection_provider.spec.github_app.client_id",
"flag": "--spec.github-app.client-id",
"summary": "The App's OAuth client id.",
"type": "string"
},
{
"field": "connection_provider.spec.github_app.signing_key",
"flag": "--spec.github-app.signing-key",
"summary": "The imported, non-exportable SIGN Key (RS256) that signs App assertions; only the credential service may use it.",
"type": "string"
},
{
"field": "connection_provider.spec.github_app.webhook_secret",
"flag": "--spec.github-app.webhook-secret",
"summary": "The Secret holding the webhook secret that verifies deliveries.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{connection_provider.name=orgs/*/connection_providers/*}",
"method": "connections.connection_providers.update",
"permission": "connections:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "connection_provider.name",
"pattern": "orgs/{org}/connection_providers/{connection_provider}"
},
"resource_field": "connection_provider",
"sends_etag": true,
"summary": "Updates a connection provider.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete every child Resource; without it a parent with children fails with FAILED_PRECONDITION.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/connection_providers/*}",
"method": "connections.connection_providers.delete",
"permission": "connections:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/connection_providers/{connection_provider}"
},
"summary": "Deletes a connection provider; it must have no connections.",
"verb": "delete"
}
],
"noun": "connection-providers",
"resource_type": "connections.sylphx.com/ConnectionProvider"
},
{
"collection": "connections",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/connections/*}",
"method": "connections.connections.get",
"permission": "connections:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/connections/{connection}"
},
"summary": "Gets a connection.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/connections",
"method": "connections.connections.list",
"paginates": true,
"permission": "connections:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists an org's connections.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "connection.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "connection.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "connection.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "connection.spec.provider",
"flag": "--spec.provider",
"required": true,
"summary": "The provider this is an installation of.",
"type": "string"
},
{
"field": "connection.spec.external_id",
"flag": "--spec.external-id",
"required": true,
"summary": "The provider's id of the installation, for example a GitHub App installation id.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*}/connections",
"method": "connections.connections.create",
"permission": "connections:write",
"positional": {
"arg": "ID",
"field": "connection_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "connection",
"summary": "Records an installation; the controller confirms it with the provider.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "connection.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "connection.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "connection.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{connection.name=orgs/*/connections/*}",
"method": "connections.connections.update",
"permission": "connections:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "connection.name",
"pattern": "orgs/{org}/connections/{connection}"
},
"resource_field": "connection",
"sends_etag": true,
"summary": "Updates a connection's metadata.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/connections/*}",
"method": "connections.connections.delete",
"permission": "connections:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/connections/{connection}"
},
"summary": "Forgets a connection. The installation itself is removed at the provider.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "connections",
"resource_type": "connections.sylphx.com/Connection"
}
],
"commands": [],
"display_name": "Sylphx Connections",
"noun": "connections",
"served": false,
"stage": "preview"
},
{
"collections": [
{
"collection": "databases",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/databases/*}",
"method": "data.databases.get",
"permission": "data:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/databases/{database}"
},
"summary": "Gets a database.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/databases",
"method": "data.databases.list",
"paginates": true,
"permission": "data:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists databases in a environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "database.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "database.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "database.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "database.spec.postgres_version",
"flag": "--spec.postgres-version",
"summary": "The Postgres major version, for example `17`; default the newest supported.",
"type": "string"
},
{
"field": "database.spec.compute_units",
"flag": "--spec.compute-units",
"summary": "Compute size in units; default the plan's. `max_connections` derives from it.",
"type": "number"
},
{
"field": "database.spec.region",
"flag": "--spec.region",
"summary": "The region; default the project's home region. Changing it moves the data by signed export and import.",
"type": "string"
},
{
"field": "database.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While set, Delete fails with DELETION_PROTECTED.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/databases",
"method": "data.databases.create",
"permission": "data:write",
"positional": {
"arg": "ID",
"field": "database_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "database",
"summary": "Creates a database. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "database.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "database.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "database.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "database.spec.compute_units",
"flag": "--spec.compute-units",
"summary": "Compute size in units; default the plan's. `max_connections` derives from it.",
"type": "number"
},
{
"field": "database.spec.region",
"flag": "--spec.region",
"summary": "The region; default the project's home region. Changing it moves the data by signed export and import.",
"type": "string"
},
{
"field": "database.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While set, Delete fails with DELETION_PROTECTED.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{database.name=orgs/*/projects/*/envs/*/databases/*}",
"method": "data.databases.update",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "database.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/databases/{database}"
},
"resource_field": "database",
"sends_etag": true,
"summary": "Updates a database.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/databases/*}",
"method": "data.databases.delete",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/databases/{database}"
},
"summary": "Deletes a database. Fails while `spec.deletion_protection` is set.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "read",
"flags": [
{
"field": "profile",
"flag": "--profile",
"summary": "POOLED (default) or DIRECT.",
"type": "enum",
"values": [
"pooled",
"direct"
]
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/databases/*}:connect",
"method": "data.databases.connect",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/databases/{database}"
},
"summary": "Returns how to connect to the database: its endpoint and its own engine credentials. The credentials are not API keys and are returned only here.",
"verb": "connect"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/databases/*}:rotateCredentials",
"method": "data.databases.rotate_credentials",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/databases/{database}"
},
"summary": "Replaces the database's engine credentials; the old ones stop working once the new ones are served.",
"verb": "rotate-credentials",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "restore_time",
"flag": "--restore-time",
"required": true,
"summary": "The point in time to restore to.",
"type": "timestamp"
},
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/databases/*}:restore",
"method": "data.databases.restore",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/databases/{database}"
},
"summary": "Restores the database in place to a point in time inside its retention window; the database is unavailable while it restores.",
"verb": "restore",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "databases",
"resource_type": "data.sylphx.com/Database"
},
{
"collection": "kv_namespaces",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/kv_namespaces/*}",
"method": "data.kv_namespaces.get",
"permission": "data:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/kv_namespaces/{kv_namespace}"
},
"summary": "Gets a kv namespace.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/kv_namespaces",
"method": "data.kv_namespaces.list",
"paginates": true,
"permission": "data:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists kv namespaces in a environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "kv_namespace.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "kv_namespace.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "kv_namespace.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "kv_namespace.spec.default_ttl",
"flag": "--spec.default-ttl",
"summary": "The TTL of a value written without one; unset keeps values until deleted.",
"type": "duration"
},
{
"field": "kv_namespace.spec.region",
"flag": "--spec.region",
"summary": "The region; default the project's home region. Changing it moves the data by signed export and import.",
"type": "string"
},
{
"field": "kv_namespace.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While set, Delete fails with DELETION_PROTECTED.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/kv_namespaces",
"method": "data.kv_namespaces.create",
"permission": "data:write",
"positional": {
"arg": "ID",
"field": "kv_namespace_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "kv_namespace",
"summary": "Creates a kv namespace. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "kv_namespace.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "kv_namespace.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "kv_namespace.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "kv_namespace.spec.default_ttl",
"flag": "--spec.default-ttl",
"summary": "The TTL of a value written without one; unset keeps values until deleted.",
"type": "duration"
},
{
"field": "kv_namespace.spec.region",
"flag": "--spec.region",
"summary": "The region; default the project's home region. Changing it moves the data by signed export and import.",
"type": "string"
},
{
"field": "kv_namespace.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While set, Delete fails with DELETION_PROTECTED.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{kv_namespace.name=orgs/*/projects/*/envs/*/kv_namespaces/*}",
"method": "data.kv_namespaces.update",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "kv_namespace.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/kv_namespaces/{kv_namespace}"
},
"resource_field": "kv_namespace",
"sends_etag": true,
"summary": "Updates a kv namespace.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/kv_namespaces/*}",
"method": "data.kv_namespaces.delete",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/kv_namespaces/{kv_namespace}"
},
"summary": "Deletes a kv namespace. Fails while `spec.deletion_protection` is set.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "read",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/kv_namespaces/*}:connect",
"method": "data.kv_namespaces.connect",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/kv_namespaces/{kv_namespace}"
},
"summary": "Returns how to connect to the KV namespace: its endpoint and its own engine credentials. The credentials are not API keys and are returned only here.",
"verb": "connect"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/kv_namespaces/*}:rotateCredentials",
"method": "data.kv_namespaces.rotate_credentials",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/kv_namespaces/{kv_namespace}"
},
"summary": "Replaces the KV namespace's engine credentials; the old ones stop working once the new ones are served.",
"verb": "rotate-credentials",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "kv-namespaces",
"resource_type": "data.sylphx.com/KvNamespace"
},
{
"collection": "buckets",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/buckets/*}",
"method": "data.buckets.get",
"permission": "data:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/buckets/{bucket}"
},
"summary": "Gets a bucket.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/buckets",
"method": "data.buckets.list",
"paginates": true,
"permission": "data:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists buckets in a environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "bucket.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "bucket.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "bucket.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "bucket.spec.versioning_enabled",
"flag": "--spec.versioning-enabled",
"summary": "Keep every version and write delete markers.",
"type": "bool"
},
{
"field": "bucket.spec.retention",
"flag": "--spec.retention",
"summary": "Versions are kept at least this long; unset keeps no minimum.",
"type": "duration"
},
{
"field": "bucket.spec.region",
"flag": "--spec.region",
"summary": "The region; default the project's home region. Changing it moves the data by signed export and import.",
"type": "string"
},
{
"field": "bucket.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While set, Delete fails with DELETION_PROTECTED.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/buckets",
"method": "data.buckets.create",
"permission": "data:write",
"positional": {
"arg": "ID",
"field": "bucket_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "bucket",
"summary": "Creates a bucket. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "bucket.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "bucket.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "bucket.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "bucket.spec.versioning_enabled",
"flag": "--spec.versioning-enabled",
"summary": "Keep every version and write delete markers.",
"type": "bool"
},
{
"field": "bucket.spec.retention",
"flag": "--spec.retention",
"summary": "Versions are kept at least this long; unset keeps no minimum.",
"type": "duration"
},
{
"field": "bucket.spec.region",
"flag": "--spec.region",
"summary": "The region; default the project's home region. Changing it moves the data by signed export and import.",
"type": "string"
},
{
"field": "bucket.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While set, Delete fails with DELETION_PROTECTED.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{bucket.name=orgs/*/projects/*/envs/*/buckets/*}",
"method": "data.buckets.update",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "bucket.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/buckets/{bucket}"
},
"resource_field": "bucket",
"sends_etag": true,
"summary": "Updates a bucket.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/buckets/*}",
"method": "data.buckets.delete",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/buckets/{bucket}"
},
"summary": "Deletes a bucket. Fails while `spec.deletion_protection` is set.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "read",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/buckets/*}:connect",
"method": "data.buckets.connect",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/buckets/{bucket}"
},
"summary": "Returns how to connect to the bucket: its endpoint and its own engine credentials. The credentials are not API keys and are returned only here.",
"verb": "connect"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/buckets/*}:rotateCredentials",
"method": "data.buckets.rotate_credentials",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/buckets/{bucket}"
},
"summary": "Replaces the bucket's engine credentials; the old ones stop working once the new ones are served.",
"verb": "rotate-credentials",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "buckets",
"resource_type": "data.sylphx.com/Bucket"
},
{
"collection": "search_indexes",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/search_indexes/*}",
"method": "data.search_indexes.get",
"permission": "data:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/search_indexes/{search_index}"
},
"summary": "Gets a search index.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/search_indexes",
"method": "data.search_indexes.list",
"paginates": true,
"permission": "data:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists search indexs in a environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "search_index.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "search_index.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "search_index.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "search_index.spec.vector_dimensions",
"flag": "--spec.vector-dimensions",
"summary": "The vector dimension; 0 for lexical only.",
"type": "int"
},
{
"field": "search_index.spec.region",
"flag": "--spec.region",
"summary": "The region; default the project's home region. Changing it moves the data by signed export and import.",
"type": "string"
},
{
"field": "search_index.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While set, Delete fails with DELETION_PROTECTED.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/search_indexes",
"method": "data.search_indexes.create",
"permission": "data:write",
"positional": {
"arg": "ID",
"field": "search_index_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "search_index",
"summary": "Creates a search index. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "search_index.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "search_index.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "search_index.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "search_index.spec.region",
"flag": "--spec.region",
"summary": "The region; default the project's home region. Changing it moves the data by signed export and import.",
"type": "string"
},
{
"field": "search_index.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While set, Delete fails with DELETION_PROTECTED.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{search_index.name=orgs/*/projects/*/envs/*/search_indexes/*}",
"method": "data.search_indexes.update",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "search_index.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/search_indexes/{search_index}"
},
"resource_field": "search_index",
"sends_etag": true,
"summary": "Updates a search index.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/search_indexes/*}",
"method": "data.search_indexes.delete",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/search_indexes/{search_index}"
},
"summary": "Deletes a search index. Fails while `spec.deletion_protection` is set.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "read",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/search_indexes/*}:connect",
"method": "data.search_indexes.connect",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/search_indexes/{search_index}"
},
"summary": "Returns how to connect to the search index: its endpoint and its own engine credentials. The credentials are not API keys and are returned only here.",
"verb": "connect"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/search_indexes/*}:rotateCredentials",
"method": "data.search_indexes.rotate_credentials",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/search_indexes/{search_index}"
},
"summary": "Replaces the search index's engine credentials; the old ones stop working once the new ones are served.",
"verb": "rotate-credentials",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "search-indexes",
"resource_type": "data.sylphx.com/SearchIndex"
}
],
"commands": [],
"display_name": "Sylphx Data",
"noun": "data",
"stage": "preview"
},
{
"collections": [
{
"collection": "entitlements",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/entitlements/*}",
"method": "entitlement.entitlements.get",
"permission": "entitlement:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/entitlements/{entitlement}"
},
"summary": "Gets an org's entitlement.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable spec fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/entitlements",
"method": "entitlement.entitlements.list",
"paginates": true,
"permission": "entitlement:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists an org's entitlements: exactly one, `default`.",
"verb": "list"
}
],
"noun": "entitlements",
"resource_type": "entitlement.sylphx.com/Entitlement"
}
],
"commands": [],
"display_name": "Sylphx Entitlement",
"noun": "entitlement",
"served": false,
"stage": "preview"
},
{
"collections": [
{
"collection": "topics",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/topics/*}",
"method": "events.topics.get",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/topics/{topic}"
},
"summary": "Gets a topic.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/topics",
"method": "events.topics.list",
"paginates": true,
"permission": "events:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists topics.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "topic.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "topic.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "topic.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "topic.spec.retention",
"flag": "--spec.retention",
"summary": "How long published events stay readable and replayable; default 7d, at most 30d.",
"type": "duration"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/topics",
"method": "events.topics.create",
"permission": "events:write",
"positional": {
"arg": "ID",
"field": "topic_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "topic",
"summary": "Creates a topic.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "topic.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "topic.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "topic.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "topic.spec.retention",
"flag": "--spec.retention",
"summary": "How long published events stay readable and replayable; default 7d, at most 30d.",
"type": "duration"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the topic when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{topic.name=orgs/*/projects/*/envs/*/topics/*}",
"method": "events.topics.update",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "topic.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/topics/{topic}"
},
"resource_field": "topic",
"sends_etag": true,
"summary": "Updates a topic.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the topic does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete the Topic's Subscriptions; without it a Topic with Subscriptions fails with INVALID_STATE.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/topics/*}",
"method": "events.topics.delete",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/topics/{topic}"
},
"summary": "Deletes a topic.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "events",
"flag": "--events",
"repeated": true,
"required": true,
"summary": "The events, at most 100.",
"type": "json"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/topics/*}:publish",
"method": "events.topics.publish",
"permission": "events:publish",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/topics/{topic}"
},
"summary": "Publishes CloudEvents into a Topic, atomically. Replaying the same `source` + `id` with the same payload returns the stored event; a different payload fails with RESOURCE_ALREADY_EXISTS.",
"verb": "publish"
}
],
"noun": "topics",
"resource_type": "events.sylphx.com/Topic"
},
{
"collection": "events",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/events/*}",
"method": "events.events.get",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/events/{event}"
},
"summary": "Gets an event.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/events",
"method": "events.events.list",
"paginates": true,
"permission": "events:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists events.",
"verb": "list"
}
],
"noun": "events",
"resource_type": "events.sylphx.com/Event"
},
{
"collection": "connectors",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/connectors/*}",
"method": "events.connectors.get",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/connectors/{connector}"
},
"summary": "Gets a connector.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over filterable fields: `kind = email`, `state = active`.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/connectors",
"method": "events.connectors.list",
"paginates": true,
"permission": "events:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists connectors.",
"verb": "list"
}
],
"noun": "connectors",
"resource_type": "events.sylphx.com/Connector"
},
{
"collection": "subscriptions",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/subscriptions/*}",
"method": "events.subscriptions.get",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/subscriptions/{subscription}"
},
"summary": "Gets a subscription.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/subscriptions",
"method": "events.subscriptions.list",
"paginates": true,
"permission": "events:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists subscriptions.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "subscription.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "subscription.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "subscription.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "subscription.spec.topic",
"flag": "--spec.topic",
"required": true,
"summary": "The Topic to read.",
"type": "string"
},
{
"field": "subscription.spec.types",
"flag": "--spec.types",
"repeated": true,
"summary": "Match these CloudEvents types; empty matches all. A trailing `*` matches a prefix.",
"type": "string"
},
{
"field": "subscription.spec.sources",
"flag": "--spec.sources",
"repeated": true,
"summary": "Match these sources; empty matches all.",
"type": "string"
},
{
"field": "subscription.spec.queue",
"flag": "--spec.queue",
"summary": "A Queue.",
"type": "string"
},
{
"field": "subscription.spec.webhook_endpoint",
"flag": "--spec.webhook-endpoint",
"summary": "A Webhook Endpoint.",
"type": "string"
},
{
"field": "subscription.spec.realtime_channel",
"flag": "--spec.realtime-channel",
"summary": "A Realtime Channel.",
"type": "string"
},
{
"field": "subscription.spec.paused",
"flag": "--spec.paused",
"summary": "Whether matching is paused; events published while paused are not delivered.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/subscriptions",
"method": "events.subscriptions.create",
"permission": "events:write",
"positional": {
"arg": "ID",
"field": "subscription_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "subscription",
"summary": "Creates a subscription.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "subscription.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "subscription.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "subscription.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "subscription.spec.types",
"flag": "--spec.types",
"repeated": true,
"summary": "Match these CloudEvents types; empty matches all. A trailing `*` matches a prefix.",
"type": "string"
},
{
"field": "subscription.spec.sources",
"flag": "--spec.sources",
"repeated": true,
"summary": "Match these sources; empty matches all.",
"type": "string"
},
{
"field": "subscription.spec.queue",
"flag": "--spec.queue",
"summary": "A Queue.",
"type": "string"
},
{
"field": "subscription.spec.webhook_endpoint",
"flag": "--spec.webhook-endpoint",
"summary": "A Webhook Endpoint.",
"type": "string"
},
{
"field": "subscription.spec.realtime_channel",
"flag": "--spec.realtime-channel",
"summary": "A Realtime Channel.",
"type": "string"
},
{
"field": "subscription.spec.paused",
"flag": "--spec.paused",
"summary": "Whether matching is paused; events published while paused are not delivered.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the subscription when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{subscription.name=orgs/*/projects/*/envs/*/subscriptions/*}",
"method": "events.subscriptions.update",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "subscription.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/subscriptions/{subscription}"
},
"resource_field": "subscription",
"sends_etag": true,
"summary": "Updates a subscription.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the subscription does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/subscriptions/*}",
"method": "events.subscriptions.delete",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/subscriptions/{subscription}"
},
"summary": "Deletes a subscription.",
"verb": "delete"
}
],
"noun": "subscriptions",
"resource_type": "events.sylphx.com/Subscription"
},
{
"collection": "queues",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/queues/*}",
"method": "events.queues.get",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/queues/{queue}"
},
"summary": "Gets a queue.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/queues",
"method": "events.queues.list",
"paginates": true,
"permission": "events:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists queues.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "queue.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "queue.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "queue.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "queue.spec.visibility_timeout",
"flag": "--spec.visibility-timeout",
"summary": "How long a lease hides a message; default 30s, 1s to 12h.",
"type": "duration"
},
{
"field": "queue.spec.max_deliveries",
"flag": "--spec.max-deliveries",
"summary": "Deliveries before a message dead-letters; default 5, 1 to 100.",
"type": "int"
},
{
"field": "queue.spec.dead_letter_queue",
"flag": "--spec.dead-letter-queue",
"summary": "The dead-letter Queue; unset keeps exhausted messages in this Queue's own dead-letter set.",
"type": "string"
},
{
"field": "queue.spec.retention",
"flag": "--spec.retention",
"summary": "How long an unacked message is kept; default 4d, at most 14d.",
"type": "duration"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/queues",
"method": "events.queues.create",
"permission": "events:write",
"positional": {
"arg": "ID",
"field": "queue_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "queue",
"summary": "Creates a queue.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "queue.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "queue.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "queue.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "queue.spec.visibility_timeout",
"flag": "--spec.visibility-timeout",
"summary": "How long a lease hides a message; default 30s, 1s to 12h.",
"type": "duration"
},
{
"field": "queue.spec.max_deliveries",
"flag": "--spec.max-deliveries",
"summary": "Deliveries before a message dead-letters; default 5, 1 to 100.",
"type": "int"
},
{
"field": "queue.spec.dead_letter_queue",
"flag": "--spec.dead-letter-queue",
"summary": "The dead-letter Queue; unset keeps exhausted messages in this Queue's own dead-letter set.",
"type": "string"
},
{
"field": "queue.spec.retention",
"flag": "--spec.retention",
"summary": "How long an unacked message is kept; default 4d, at most 14d.",
"type": "duration"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the queue when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{queue.name=orgs/*/projects/*/envs/*/queues/*}",
"method": "events.queues.update",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "queue.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/queues/{queue}"
},
"resource_field": "queue",
"sends_etag": true,
"summary": "Updates a queue.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the queue does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/queues/*}",
"method": "events.queues.delete",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/queues/{queue}"
},
"summary": "Deletes a queue.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "events",
"flag": "--events",
"repeated": true,
"required": true,
"summary": "The messages, at most 100.",
"type": "json"
},
{
"field": "delay",
"flag": "--delay",
"summary": "Hide the messages this long before their first lease.",
"type": "duration"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/queues/*}:send",
"method": "events.queues.send",
"permission": "events:publish",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/queues/{queue}"
},
"summary": "Enqueues messages directly, without a Subscription.",
"verb": "send"
},
{
"effect": "write",
"flags": [
{
"field": "max_messages",
"flag": "--max-messages",
"summary": "At most this many; default 1, at most 100.",
"type": "int"
},
{
"field": "visibility_timeout",
"flag": "--visibility-timeout",
"summary": "Override the Queue's visibility timeout for this lease.",
"type": "duration"
},
{
"field": "wait",
"flag": "--wait",
"summary": "Wait up to this long (at most 20s) for a message when none is ready.",
"type": "duration"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/queues/*}:lease",
"method": "events.queues.lease",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/queues/{queue}"
},
"summary": "Leases up to `max_messages` ready messages for the visibility timeout.",
"verb": "lease"
},
{
"effect": "write",
"flags": [
{
"field": "leases",
"flag": "--leases",
"repeated": true,
"required": true,
"summary": "The leases to ack, at most 100.",
"type": "json"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/queues/*}:ack",
"method": "events.queues.ack",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/queues/{queue}"
},
"summary": "Acknowledges leased messages; each is removed. A lease that is stale (expired or superseded) is reported, not applied.",
"verb": "ack"
},
{
"effect": "write",
"flags": [
{
"field": "leases",
"flag": "--leases",
"repeated": true,
"required": true,
"summary": "The leases to nack, at most 100.",
"type": "json"
},
{
"field": "delay",
"flag": "--delay",
"summary": "Hide the messages this long before the next lease.",
"type": "duration"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/queues/*}:nack",
"method": "events.queues.nack",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/queues/{queue}"
},
"summary": "Returns leased messages to the Queue after `delay`; each nack counts as a delivery.",
"verb": "nack"
},
{
"effect": "write",
"flags": [
{
"field": "start_time",
"flag": "--start-time",
"summary": "Replay messages dead-lettered at or after this time.",
"type": "timestamp"
},
{
"field": "end_time",
"flag": "--end-time",
"summary": "Replay messages dead-lettered before this time.",
"type": "timestamp"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/queues/*}:replay",
"method": "events.queues.replay",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/queues/{queue}"
},
"summary": "Moves dead-lettered messages, optionally bounded by dead-letter time, back to ready.",
"verb": "replay"
}
],
"noun": "queues",
"resource_type": "events.sylphx.com/Queue"
},
{
"collection": "webhook_endpoints",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/webhook_endpoints/*}",
"method": "events.webhook_endpoints.get",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/webhook_endpoints/{webhook_endpoint}"
},
"summary": "Gets a webhook endpoint.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/webhook_endpoints",
"method": "events.webhook_endpoints.list",
"paginates": true,
"permission": "events:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists webhook endpoints.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "webhook_endpoint.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "webhook_endpoint.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "webhook_endpoint.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "webhook_endpoint.spec.uri",
"flag": "--spec.uri",
"required": true,
"summary": "The HTTPS URI deliveries are POSTed to; its host resolves to a public address.",
"type": "string"
},
{
"field": "webhook_endpoint.spec.disabled",
"flag": "--spec.disabled",
"summary": "Stop delivering; deliveries queue until enabled.",
"type": "bool"
},
{
"field": "webhook_endpoint.spec.max_concurrent_deliveries",
"flag": "--spec.max-concurrent-deliveries",
"summary": "At most this many deliveries in flight; default 10.",
"type": "int"
},
{
"field": "webhook_endpoint.spec.event_types",
"flag": "--spec.event-types",
"repeated": true,
"summary": "Which event types the endpoint receives: an exact type (`order.paid`), a prefix ending in `.*` (`order.*`), or `*` for every type; default `[\"*\"]`.",
"type": "string"
},
{
"field": "webhook_endpoint.spec.rate_limit_per_second",
"flag": "--spec.rate-limit-per-second",
"summary": "At most this many attempts start per second; 0 is no limit. Deliveries over the limit wait their turn; none is dropped.",
"type": "int"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/webhook_endpoints",
"method": "events.webhook_endpoints.create",
"permission": "events:write",
"positional": {
"arg": "ID",
"field": "webhook_endpoint_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "webhook_endpoint",
"summary": "Creates a webhook endpoint.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "webhook_endpoint.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "webhook_endpoint.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "webhook_endpoint.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "webhook_endpoint.spec.uri",
"flag": "--spec.uri",
"required": true,
"summary": "The HTTPS URI deliveries are POSTed to; its host resolves to a public address.",
"type": "string"
},
{
"field": "webhook_endpoint.spec.disabled",
"flag": "--spec.disabled",
"summary": "Stop delivering; deliveries queue until enabled.",
"type": "bool"
},
{
"field": "webhook_endpoint.spec.max_concurrent_deliveries",
"flag": "--spec.max-concurrent-deliveries",
"summary": "At most this many deliveries in flight; default 10.",
"type": "int"
},
{
"field": "webhook_endpoint.spec.event_types",
"flag": "--spec.event-types",
"repeated": true,
"summary": "Which event types the endpoint receives: an exact type (`order.paid`), a prefix ending in `.*` (`order.*`), or `*` for every type; default `[\"*\"]`.",
"type": "string"
},
{
"field": "webhook_endpoint.spec.rate_limit_per_second",
"flag": "--spec.rate-limit-per-second",
"summary": "At most this many attempts start per second; 0 is no limit. Deliveries over the limit wait their turn; none is dropped.",
"type": "int"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the webhook endpoint when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{webhook_endpoint.name=orgs/*/projects/*/envs/*/webhook_endpoints/*}",
"method": "events.webhook_endpoints.update",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "webhook_endpoint.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/webhook_endpoints/{webhook_endpoint}"
},
"resource_field": "webhook_endpoint",
"sends_etag": true,
"summary": "Updates a webhook endpoint.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the webhook endpoint does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete the endpoint's delivery records and the Subscriptions that target it.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/webhook_endpoints/*}",
"method": "events.webhook_endpoints.delete",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/webhook_endpoints/{webhook_endpoint}"
},
"summary": "Deletes a webhook endpoint.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "start_time",
"flag": "--start-time",
"required": true,
"summary": "Replay deliveries created at or after this time.",
"type": "timestamp"
},
{
"field": "end_time",
"flag": "--end-time",
"summary": "Replay deliveries created before this time; default now.",
"type": "timestamp"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/webhook_endpoints/*}:replay",
"method": "events.webhook_endpoints.replay",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/webhook_endpoints/{webhook_endpoint}"
},
"summary": "Redelivers every dead-lettered delivery to the endpoint created in a time range, each as a new attempt.",
"verb": "replay"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Rotate only if the current etag matches.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/webhook_endpoints/*}:rotateSecret",
"method": "events.webhook_endpoints.rotate_secret",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/webhook_endpoints/{webhook_endpoint}"
},
"summary": "Replaces the endpoint's signing secret and returns the new one, once (`status.signing_secret`). For 24 hours deliveries carry a signature with each secret, so a receiver can switch without dropping one.",
"verb": "rotate-secret"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/webhook_endpoints/*}:test",
"method": "events.webhook_endpoints.test",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/webhook_endpoints/{webhook_endpoint}"
},
"summary": "Sends a test event (`type` `sylphx.webhook.test`) to the endpoint alone, through the same signing, retries, and delivery log as any other event.",
"verb": "test"
}
],
"noun": "webhook-endpoints",
"resource_type": "events.sylphx.com/WebhookEndpoint"
},
{
"collection": "webhook_deliveries",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/webhook_endpoints/*/webhook_deliveries/*}",
"method": "events.webhook_deliveries.get",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/webhook_endpoints/{webhook_endpoint}/webhook_deliveries/{webhook_delivery}"
},
"summary": "Gets a webhook delivery.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/webhook_endpoints/*}/webhook_deliveries",
"method": "events.webhook_deliveries.list",
"paginates": true,
"permission": "events:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/webhook_endpoints/{webhook_endpoint}"
},
"summary": "Lists webhook deliveries.",
"verb": "list"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/webhook_endpoints/*/webhook_deliveries/*}:replay",
"method": "events.webhook_deliveries.replay",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/webhook_endpoints/{webhook_endpoint}/webhook_deliveries/{webhook_delivery}"
},
"summary": "Redelivers one delivery now, as a new attempt.",
"verb": "replay"
}
],
"noun": "webhook-deliveries",
"resource_type": "events.sylphx.com/WebhookDelivery"
},
{
"collection": "inbound_endpoints",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/inbound_endpoints/*}",
"method": "events.inbound_endpoints.get",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/inbound_endpoints/{inbound_endpoint}"
},
"summary": "Gets an inbound endpoint.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/inbound_endpoints",
"method": "events.inbound_endpoints.list",
"paginates": true,
"permission": "events:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists inbound endpoints.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "inbound_endpoint.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "inbound_endpoint.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "inbound_endpoint.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "inbound_endpoint.spec.signature_scheme",
"flag": "--spec.signature-scheme",
"required": true,
"summary": "The sender's signature scheme.",
"type": "enum",
"values": [
"standard_webhooks",
"stripe",
"shopify",
"github"
]
},
{
"field": "inbound_endpoint.spec.verification_secret",
"flag": "--spec.verification-secret",
"required": true,
"summary": "The provider's verification secret, held in Sylphx Secrets.",
"type": "string"
},
{
"field": "inbound_endpoint.spec.topic",
"flag": "--spec.topic",
"required": true,
"summary": "The Topic verified requests are published to.",
"type": "string"
},
{
"field": "inbound_endpoint.spec.source",
"flag": "--spec.source",
"summary": "The CloudEvents `source` of published events; default the endpoint name.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/inbound_endpoints",
"method": "events.inbound_endpoints.create",
"permission": "events:write",
"positional": {
"arg": "ID",
"field": "inbound_endpoint_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "inbound_endpoint",
"summary": "Creates an inbound endpoint.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "inbound_endpoint.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "inbound_endpoint.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "inbound_endpoint.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "inbound_endpoint.spec.signature_scheme",
"flag": "--spec.signature-scheme",
"required": true,
"summary": "The sender's signature scheme.",
"type": "enum",
"values": [
"standard_webhooks",
"stripe",
"shopify",
"github"
]
},
{
"field": "inbound_endpoint.spec.verification_secret",
"flag": "--spec.verification-secret",
"required": true,
"summary": "The provider's verification secret, held in Sylphx Secrets.",
"type": "string"
},
{
"field": "inbound_endpoint.spec.topic",
"flag": "--spec.topic",
"required": true,
"summary": "The Topic verified requests are published to.",
"type": "string"
},
{
"field": "inbound_endpoint.spec.source",
"flag": "--spec.source",
"summary": "The CloudEvents `source` of published events; default the endpoint name.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the inbound endpoint when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{inbound_endpoint.name=orgs/*/projects/*/envs/*/inbound_endpoints/*}",
"method": "events.inbound_endpoints.update",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "inbound_endpoint.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/inbound_endpoints/{inbound_endpoint}"
},
"resource_field": "inbound_endpoint",
"sends_etag": true,
"summary": "Updates an inbound endpoint.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the inbound endpoint does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/inbound_endpoints/*}",
"method": "events.inbound_endpoints.delete",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/inbound_endpoints/{inbound_endpoint}"
},
"summary": "Deletes an inbound endpoint.",
"verb": "delete"
}
],
"noun": "inbound-endpoints",
"resource_type": "events.sylphx.com/InboundEndpoint"
},
{
"collection": "realtime_channels",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/realtime_channels/*}",
"method": "events.realtime_channels.get",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/realtime_channels/{realtime_channel}"
},
"summary": "Gets a realtime channel.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/realtime_channels",
"method": "events.realtime_channels.list",
"paginates": true,
"permission": "events:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists realtime channels.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "realtime_channel.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "realtime_channel.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "realtime_channel.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "realtime_channel.spec.publishable_ok",
"flag": "--spec.publishable-ok",
"summary": "Allow clients holding a publishable key (`events:realtime:subscribe`) to connect.",
"type": "bool"
},
{
"field": "realtime_channel.spec.history_retention",
"flag": "--spec.history-retention",
"summary": "How far back a cursor may resume; default 24h, at most 7d.",
"type": "duration"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/realtime_channels",
"method": "events.realtime_channels.create",
"permission": "events:write",
"positional": {
"arg": "ID",
"field": "realtime_channel_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "realtime_channel",
"summary": "Creates a realtime channel.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "realtime_channel.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "realtime_channel.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "realtime_channel.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "realtime_channel.spec.publishable_ok",
"flag": "--spec.publishable-ok",
"summary": "Allow clients holding a publishable key (`events:realtime:subscribe`) to connect.",
"type": "bool"
},
{
"field": "realtime_channel.spec.history_retention",
"flag": "--spec.history-retention",
"summary": "How far back a cursor may resume; default 24h, at most 7d.",
"type": "duration"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the realtime channel when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{realtime_channel.name=orgs/*/projects/*/envs/*/realtime_channels/*}",
"method": "events.realtime_channels.update",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "realtime_channel.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/realtime_channels/{realtime_channel}"
},
"resource_field": "realtime_channel",
"sends_etag": true,
"summary": "Updates a realtime channel.",
"update_mask": "from-flags",
"verb": "update"
},
{
"effect": "write",
"flags": [
{
"field": "message_type",
"flag": "--message-type",
"required": true,
"summary": "The message name, 1 to 255 of `[A-Za-z0-9._:-]`.",
"type": "string"
},
{
"field": "data",
"flag": "--data",
"summary": "The payload; at most 64 KiB as JSON.",
"type": "json"
},
{
"field": "client_id",
"flag": "--client-id",
"summary": "The publisher's client id, shown to subscribers.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/realtime_channels/*}:publish",
"method": "events.realtime_channels.publish",
"permission": "events:publish",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/realtime_channels/{realtime_channel}"
},
"summary": "Publishes one message to the channel: it is appended to the channel's history and pushed to every connected client. A retry with the same Idempotency-Key returns the first message.",
"verb": "publish"
},
{
"effect": "write",
"flags": [
{
"field": "ttl",
"flag": "--ttl",
"summary": "How long the token lives; default and at most 1 hour, at least 1 minute.",
"type": "duration"
},
{
"field": "client_id",
"flag": "--client-id",
"summary": "The client this token is for; with it, the connection enters presence.",
"type": "string"
},
{
"field": "client_data",
"flag": "--client-data",
"summary": "The client's presence data, at most 4 KiB as JSON.",
"type": "json"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/realtime_channels/*}:issueToken",
"method": "events.realtime_channels.issue_token",
"permission": "events:publish",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/realtime_channels/{realtime_channel}"
},
"summary": "Mints a subscribe token (`rtt_…`) for this channel alone, at most an hour long, for a browser or device that holds no key. A token that names a client id enters the channel's presence while it is connected.",
"verb": "issue-token"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the realtime channel does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete the channel's history. Without it, a channel with retained messages is still deleted and its history stops being readable.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/realtime_channels/*}",
"method": "events.realtime_channels.delete",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/realtime_channels/{realtime_channel}"
},
"summary": "Deletes a realtime channel.",
"verb": "delete"
}
],
"noun": "realtime-channels",
"resource_type": "events.sylphx.com/RealtimeChannel"
},
{
"collection": "realtime_messages",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/realtime_channels/*/realtime_messages/*}",
"method": "events.realtime_messages.get",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/realtime_channels/{realtime_channel}/realtime_messages/{realtime_message}"
},
"summary": "Gets one retained message of a channel.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "Empty, or `sequence > N` to start after message N (resume).",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/realtime_channels/*}/realtime_messages",
"method": "events.realtime_messages.list",
"paginates": true,
"permission": "events:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/realtime_channels/{realtime_channel}"
},
"summary": "Lists a channel's retained messages, oldest first.",
"verb": "list"
}
],
"noun": "realtime-messages",
"resource_type": "events.sylphx.com/RealtimeMessage"
},
{
"collection": "realtime_members",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/realtime_channels/*/realtime_members/*}",
"method": "events.realtime_members.get",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/realtime_channels/{realtime_channel}/realtime_members/{realtime_member}"
},
"summary": "Gets one client present in a channel.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/realtime_channels/*}/realtime_members",
"method": "events.realtime_members.list",
"paginates": true,
"permission": "events:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/realtime_channels/{realtime_channel}"
},
"summary": "Lists the clients present in a channel now.",
"verb": "list"
}
],
"noun": "realtime-members",
"resource_type": "events.sylphx.com/RealtimeMember"
}
],
"commands": [],
"display_name": "Sylphx Events",
"noun": "events",
"stage": "preview"
},
{
"collections": [
{
"collection": "services",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/services/*}",
"method": "hosting.services.get",
"permission": "hosting:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/services/{service}"
},
"summary": "Gets a service.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/services",
"method": "hosting.services.list",
"paginates": true,
"permission": "hosting:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists services in a environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "service.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "service.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "service.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "service.spec.source.source_link",
"flag": "--spec.source.source-link",
"summary": "Build from this SourceLink's repository on every push to `branch`.",
"type": "string"
},
{
"field": "service.spec.source.image",
"flag": "--spec.source.image",
"summary": "Run this Artifact, by digest: `registry.sylphx.net/<path>@sha256:<hex>`.",
"type": "string"
},
{
"field": "service.spec.source.branch",
"flag": "--spec.source.branch",
"summary": "The branch that ships to this Service; default the SourceLink's production branch. Ignored for `image`.",
"type": "string"
},
{
"field": "service.spec.source.build.root_directory",
"flag": "--spec.source.build.root-directory",
"summary": "The directory inside the repository to build; default the root.",
"type": "string"
},
{
"field": "service.spec.source.build.dockerfile",
"flag": "--spec.source.build.dockerfile",
"summary": "A Dockerfile path relative to `root_directory`; unset lets the zero-config frontend detect the stack.",
"type": "string"
},
{
"field": "service.spec.source.build.build_class",
"flag": "--spec.source.build.build-class",
"summary": "The Build class, `sylphx-<os>-<size>`; default `sylphx-linux-standard`.",
"type": "string"
},
{
"field": "service.spec.command",
"flag": "--spec.command",
"summary": "Overrides the image's command.",
"type": "string"
},
{
"field": "service.spec.port",
"flag": "--spec.port",
"summary": "The port the application listens on; the public edge stays 443.",
"type": "int"
},
{
"field": "service.spec.exposure",
"flag": "--spec.exposure",
"summary": "Who can reach the Service; default PUBLIC.",
"type": "enum",
"values": [
"public",
"internal"
]
},
{
"field": "service.spec.size",
"flag": "--spec.size",
"summary": "The size of each instance; default the plan's.",
"type": "enum",
"values": [
"nano",
"micro",
"small",
"standard",
"large",
"xlarge",
"xxlarge"
]
},
{
"field": "service.spec.scaling.min_instances",
"flag": "--spec.scaling.min-instances",
"summary": "Instances kept running with no traffic; 0 idles to zero and wakes on request.",
"type": "int"
},
{
"field": "service.spec.scaling.max_instances",
"flag": "--spec.scaling.max-instances",
"summary": "Instances at most; 0 means the plan's limit.",
"type": "int"
},
{
"field": "service.spec.health.protocol",
"flag": "--spec.health.protocol",
"summary": "How to probe.",
"type": "enum",
"values": [
"http",
"tcp"
]
},
{
"field": "service.spec.health.path",
"flag": "--spec.health.path",
"summary": "The HTTP path to probe when `protocol` is HTTP.",
"type": "string"
},
{
"field": "service.spec.health.startup_timeout",
"flag": "--spec.health.startup-timeout",
"summary": "How long a new instance may take to pass its first probe.",
"type": "duration"
},
{
"field": "service.spec.env",
"flag": "--spec.env",
"repeated": true,
"summary": "Plain environment variables. Secret values bind through `secret_env`, never here.",
"type": "key=value"
},
{
"field": "service.spec.secret_env",
"flag": "--spec.secret-env",
"repeated": true,
"summary": "Environment variables bound to Sylphx Secrets: variable name to Secret name. The value never enters the spec.",
"type": "key=value"
},
{
"field": "service.spec.regions",
"flag": "--spec.regions",
"repeated": true,
"summary": "Regions to run in; default the project's home region.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/services",
"method": "hosting.services.create",
"permission": "hosting:write",
"positional": {
"arg": "ID",
"field": "service_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "service",
"summary": "Creates a service. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "service.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "service.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "service.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "service.spec.source.source_link",
"flag": "--spec.source.source-link",
"summary": "Build from this SourceLink's repository on every push to `branch`.",
"type": "string"
},
{
"field": "service.spec.source.image",
"flag": "--spec.source.image",
"summary": "Run this Artifact, by digest: `registry.sylphx.net/<path>@sha256:<hex>`.",
"type": "string"
},
{
"field": "service.spec.source.branch",
"flag": "--spec.source.branch",
"summary": "The branch that ships to this Service; default the SourceLink's production branch. Ignored for `image`.",
"type": "string"
},
{
"field": "service.spec.source.build.root_directory",
"flag": "--spec.source.build.root-directory",
"summary": "The directory inside the repository to build; default the root.",
"type": "string"
},
{
"field": "service.spec.source.build.dockerfile",
"flag": "--spec.source.build.dockerfile",
"summary": "A Dockerfile path relative to `root_directory`; unset lets the zero-config frontend detect the stack.",
"type": "string"
},
{
"field": "service.spec.source.build.build_class",
"flag": "--spec.source.build.build-class",
"summary": "The Build class, `sylphx-<os>-<size>`; default `sylphx-linux-standard`.",
"type": "string"
},
{
"field": "service.spec.command",
"flag": "--spec.command",
"summary": "Overrides the image's command.",
"type": "string"
},
{
"field": "service.spec.port",
"flag": "--spec.port",
"summary": "The port the application listens on; the public edge stays 443.",
"type": "int"
},
{
"field": "service.spec.exposure",
"flag": "--spec.exposure",
"summary": "Who can reach the Service; default PUBLIC.",
"type": "enum",
"values": [
"public",
"internal"
]
},
{
"field": "service.spec.size",
"flag": "--spec.size",
"summary": "The size of each instance; default the plan's.",
"type": "enum",
"values": [
"nano",
"micro",
"small",
"standard",
"large",
"xlarge",
"xxlarge"
]
},
{
"field": "service.spec.scaling.min_instances",
"flag": "--spec.scaling.min-instances",
"summary": "Instances kept running with no traffic; 0 idles to zero and wakes on request.",
"type": "int"
},
{
"field": "service.spec.scaling.max_instances",
"flag": "--spec.scaling.max-instances",
"summary": "Instances at most; 0 means the plan's limit.",
"type": "int"
},
{
"field": "service.spec.health.protocol",
"flag": "--spec.health.protocol",
"summary": "How to probe.",
"type": "enum",
"values": [
"http",
"tcp"
]
},
{
"field": "service.spec.health.path",
"flag": "--spec.health.path",
"summary": "The HTTP path to probe when `protocol` is HTTP.",
"type": "string"
},
{
"field": "service.spec.health.startup_timeout",
"flag": "--spec.health.startup-timeout",
"summary": "How long a new instance may take to pass its first probe.",
"type": "duration"
},
{
"field": "service.spec.env",
"flag": "--spec.env",
"repeated": true,
"summary": "Plain environment variables. Secret values bind through `secret_env`, never here.",
"type": "key=value"
},
{
"field": "service.spec.secret_env",
"flag": "--spec.secret-env",
"repeated": true,
"summary": "Environment variables bound to Sylphx Secrets: variable name to Secret name. The value never enters the spec.",
"type": "key=value"
},
{
"field": "service.spec.regions",
"flag": "--spec.regions",
"repeated": true,
"summary": "Regions to run in; default the project's home region.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{service.name=orgs/*/projects/*/envs/*/services/*}",
"method": "hosting.services.update",
"permission": "hosting:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "service.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/services/{service}"
},
"resource_field": "service",
"sends_etag": true,
"summary": "Updates a service.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete every child Resource; without it a parent with children fails with FAILED_PRECONDITION.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/services/*}",
"method": "hosting.services.delete",
"permission": "hosting:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/services/{service}"
},
"summary": "Deletes a service.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "services",
"resource_type": "hosting.sylphx.com/Service"
},
{
"collection": "service_rollouts",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/services/*/service_rollouts/*}",
"method": "hosting.service_rollouts.get",
"permission": "hosting:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/services/{service}/service_rollouts/{rollout}"
},
"summary": "Gets a rollout.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/services/*}/service_rollouts",
"method": "hosting.service_rollouts.list",
"paginates": true,
"permission": "hosting:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/services/{service}"
},
"summary": "Lists rollouts in a service.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/services/{service}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "rollout.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "rollout.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "rollout.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "rollout.spec.release",
"flag": "--spec.release",
"summary": "The Release to roll out. Unset rolls out the Service's current generation; a previous Release rolls back.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/services/*}/service_rollouts",
"method": "hosting.service_rollouts.create",
"permission": "hosting:write",
"positional": {
"arg": "ID",
"field": "rollout_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "rollout",
"summary": "Creates a rollout.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/services/*/service_rollouts/*}:pause",
"method": "hosting.service_rollouts.pause",
"permission": "hosting:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/services/{service}/service_rollouts/{rollout}"
},
"summary": "Holds a Rollout at its current wave.",
"verb": "pause"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/services/*/service_rollouts/*}:resume",
"method": "hosting.service_rollouts.resume",
"permission": "hosting:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/services/{service}/service_rollouts/{rollout}"
},
"summary": "Resumes a paused Rollout.",
"verb": "resume"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/services/*/service_rollouts/*}:abort",
"method": "hosting.service_rollouts.abort",
"permission": "hosting:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/services/{service}/service_rollouts/{rollout}"
},
"summary": "Stops a Rollout; the cells it reached return to the previous Release.",
"verb": "abort"
}
],
"noun": "service-rollouts",
"resource_type": "hosting.sylphx.com/Rollout"
},
{
"collection": "previews",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/previews/*}",
"method": "hosting.previews.get",
"permission": "hosting:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/previews/{preview}"
},
"summary": "Gets a preview.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/previews",
"method": "hosting.previews.list",
"paginates": true,
"permission": "hosting:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists previews in a environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "preview.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "preview.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "preview.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "preview.spec.service",
"flag": "--spec.service",
"required": true,
"summary": "The Service previewed.",
"type": "string"
},
{
"field": "preview.spec.pull_request",
"flag": "--spec.pull-request",
"required": true,
"summary": "The pull request number in the Service's SourceLink repository.",
"type": "int"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/previews",
"method": "hosting.previews.create",
"permission": "hosting:write",
"positional": {
"arg": "ID",
"field": "preview_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "preview",
"summary": "Creates a preview. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/previews/*}",
"method": "hosting.previews.delete",
"permission": "hosting:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/previews/{preview}"
},
"summary": "Deletes a preview.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "previews",
"resource_type": "hosting.sylphx.com/Preview"
},
{
"collection": "source_links",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/source_links/*}",
"method": "hosting.source_links.get",
"permission": "hosting:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/source_links/{source_link}"
},
"summary": "Gets a source link.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*}/source_links",
"method": "hosting.source_links.list",
"paginates": true,
"permission": "hosting:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Lists source links in a project.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "source_link.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "source_link.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "source_link.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "source_link.spec.connection",
"flag": "--spec.connection",
"required": true,
"summary": "The forge Connection (the Sylphx App installation).",
"type": "string"
},
{
"field": "source_link.spec.repository",
"flag": "--spec.repository",
"required": true,
"summary": "The repository, `<owner>/<name>`.",
"type": "string"
},
{
"field": "source_link.spec.production_branch",
"flag": "--spec.production-branch",
"summary": "The branch production Services ship from; default the repository's default branch.",
"type": "string"
},
{
"field": "source_link.spec.previews_enabled",
"flag": "--spec.previews-enabled",
"summary": "Build a Preview for every pull request.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*}/source_links",
"method": "hosting.source_links.create",
"permission": "hosting:write",
"positional": {
"arg": "ID",
"field": "source_link_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "source_link",
"summary": "Creates a source link. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "source_link.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "source_link.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "source_link.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "source_link.spec.production_branch",
"flag": "--spec.production-branch",
"summary": "The branch production Services ship from; default the repository's default branch.",
"type": "string"
},
{
"field": "source_link.spec.previews_enabled",
"flag": "--spec.previews-enabled",
"summary": "Build a Preview for every pull request.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{source_link.name=orgs/*/projects/*/source_links/*}",
"method": "hosting.source_links.update",
"permission": "hosting:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "source_link.name",
"pattern": "orgs/{org}/projects/{project}/source_links/{source_link}"
},
"resource_field": "source_link",
"sends_etag": true,
"summary": "Updates a source link.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/source_links/*}",
"method": "hosting.source_links.delete",
"permission": "hosting:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/source_links/{source_link}"
},
"summary": "Deletes a source link.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "source-links",
"resource_type": "hosting.sylphx.com/SourceLink"
}
],
"commands": [],
"display_name": "Sylphx Hosting",
"noun": "hosting",
"served": false,
"stage": "preview"
},
{
"collections": [
{
"collection": "keys",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/keys/*}",
"method": "keys.keys.get",
"permission": "keys:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}"
},
"summary": "Gets a key.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/keys",
"method": "keys.keys.list",
"paginates": true,
"permission": "keys:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists keys in an environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "key.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "key.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "key.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "key.spec.purpose",
"flag": "--spec.purpose",
"required": true,
"summary": "What the key does.",
"type": "enum",
"values": [
"sign",
"encrypt",
"mac"
]
},
{
"field": "key.spec.algorithm",
"flag": "--spec.algorithm",
"required": true,
"summary": "The algorithm; it must suit the purpose.",
"type": "enum",
"values": [
"ed25519",
"ec_p256_sha256",
"rsa_pkcs1_2048_sha256",
"rsa_pss_3072_sha256",
"aes_256_gcm",
"hmac_sha256"
]
},
{
"field": "key.spec.rotation_period",
"flag": "--spec.rotation-period",
"summary": "Rotate automatically this often; unset means rotate only on request.",
"type": "duration"
},
{
"field": "key.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While true, Delete fails with DELETION_PROTECTED. Default true.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/keys",
"method": "keys.keys.create",
"permission": "keys:write",
"positional": {
"arg": "ID",
"field": "key_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "key",
"summary": "Creates a key; the signer generates its first version.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "key.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "key.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "key.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "key.spec.rotation_period",
"flag": "--spec.rotation-period",
"summary": "Rotate automatically this often; unset means rotate only on request.",
"type": "duration"
},
{
"field": "key.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While true, Delete fails with DELETION_PROTECTED. Default true.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{key.name=orgs/*/projects/*/envs/*/keys/*}",
"method": "keys.keys.update",
"permission": "keys:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "key.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}"
},
"resource_field": "key",
"sends_etag": true,
"summary": "Updates a key's rotation period, deletion protection, or metadata.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete every child Resource; without it a parent with children fails with FAILED_PRECONDITION.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/keys/*}",
"method": "keys.keys.delete",
"permission": "keys:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}"
},
"summary": "Deletes a key and schedules every version's destruction.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Rotate only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/keys/*}:rotate",
"method": "keys.keys.rotate",
"permission": "keys:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}"
},
"summary": "Rotates a key: adds a version and makes it primary. Older versions keep verifying and decrypting until destroyed.",
"verb": "rotate",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "read",
"flags": [
{
"field": "key_version",
"flag": "--key-version",
"summary": "The version to use; default the primary version.",
"type": "string"
},
{
"field": "data",
"flag": "--data",
"summary": "The message to sign, at most 64 KiB. Set exactly one of `data` and `digest`.",
"type": "string"
},
{
"field": "digest",
"flag": "--digest",
"summary": "The digest of the message under the algorithm's hash.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/keys/*}:sign",
"method": "keys.keys.sign",
"permission": "keys:sign",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}"
},
"summary": "Signs data or a digest with a SIGN key. Every use is audited.",
"verb": "sign"
},
{
"effect": "read",
"flags": [
{
"field": "key_version",
"flag": "--key-version",
"summary": "The version to use; default the primary version; the signature names none.",
"type": "string"
},
{
"field": "data",
"flag": "--data",
"summary": "The signed message. Set exactly one of `data` and `digest`.",
"type": "string"
},
{
"field": "digest",
"flag": "--digest",
"summary": "The digest of the signed message.",
"type": "string"
},
{
"field": "signature",
"flag": "--signature",
"required": true,
"summary": "The signature to check.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/keys/*}:verify",
"method": "keys.keys.verify",
"permission": "keys:verify",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}"
},
"summary": "Verifies a signature made by a SIGN key.",
"verb": "verify"
},
{
"effect": "read",
"flags": [
{
"field": "plaintext",
"flag": "--plaintext",
"required": true,
"sensitive": true,
"summary": "The plaintext, at most 64 KiB.",
"type": "string"
},
{
"field": "additional_authenticated_data",
"flag": "--additional-authenticated-data",
"summary": "Data bound to the ciphertext and required again to decrypt it.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/keys/*}:encrypt",
"method": "keys.keys.encrypt",
"permission": "keys:encrypt",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}"
},
"summary": "Encrypts data with an ENCRYPT key.",
"verb": "encrypt"
},
{
"effect": "read",
"flags": [
{
"field": "ciphertext",
"flag": "--ciphertext",
"required": true,
"summary": "The ciphertext from Encrypt.",
"type": "string"
},
{
"field": "additional_authenticated_data",
"flag": "--additional-authenticated-data",
"summary": "The additional authenticated data given to Encrypt.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/keys/*}:decrypt",
"method": "keys.keys.decrypt",
"permission": "keys:decrypt",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}"
},
"summary": "Decrypts a ciphertext made by Encrypt with this key.",
"verb": "decrypt"
},
{
"effect": "read",
"flags": [
{
"field": "key_version",
"flag": "--key-version",
"summary": "The version to use; default the primary version.",
"type": "string"
},
{
"field": "data",
"flag": "--data",
"required": true,
"summary": "The message, at most 64 KiB.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/keys/*}:macSign",
"method": "keys.keys.mac_sign",
"permission": "keys:sign",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}"
},
"summary": "Computes a MAC of data with a MAC key.",
"verb": "mac-sign"
},
{
"effect": "read",
"flags": [
{
"field": "key_version",
"flag": "--key-version",
"summary": "The version to use; default the primary version.",
"type": "string"
},
{
"field": "data",
"flag": "--data",
"required": true,
"summary": "The message.",
"type": "string"
},
{
"field": "mac",
"flag": "--mac",
"required": true,
"summary": "The MAC to check.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/keys/*}:macVerify",
"method": "keys.keys.mac_verify",
"permission": "keys:verify",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}"
},
"summary": "Verifies a MAC made by a MAC key, in constant time.",
"verb": "mac-verify"
}
],
"noun": "keys",
"resource_type": "keys.sylphx.com/Key"
},
{
"collection": "key_versions",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/keys/*/key_versions/*}",
"method": "keys.key_versions.get",
"permission": "keys:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}/key_versions/{key_version}"
},
"summary": "Gets a key version.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/keys/*}/key_versions",
"method": "keys.key_versions.list",
"paginates": true,
"permission": "keys:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}"
},
"summary": "Lists a key's versions.",
"verb": "list"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Destroy only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/keys/*/key_versions/*}:destroy",
"method": "keys.key_versions.destroy",
"permission": "keys:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}/key_versions/{key_version}"
},
"summary": "Schedules a key version's destruction after a 24-hour grace; the primary version cannot be destroyed.",
"verb": "destroy"
}
],
"noun": "key-versions",
"resource_type": "keys.sylphx.com/KeyVersion"
}
],
"commands": [],
"display_name": "Sylphx Keys",
"noun": "keys",
"stage": "preview"
},
{
"collections": [
{
"collection": "catalogs",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/catalogs/*}",
"method": "localization.catalogs.get",
"permission": "localization:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/catalogs/{catalog}"
},
"summary": "Gets a catalog.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/catalogs",
"method": "localization.catalogs.list",
"paginates": true,
"permission": "localization:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists catalogs.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "catalog.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "catalog.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "catalog.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "catalog.spec.source_locale",
"flag": "--spec.source-locale",
"required": true,
"summary": "The locale the source texts are written in, a BCP 47 tag such as `en`.",
"type": "string"
},
{
"field": "catalog.spec.target_locales",
"flag": "--spec.target-locales",
"repeated": true,
"summary": "The locales to translate into, BCP 47 tags. `zh-Hant-HK` and `zh-Hant-TW` are separate locales. At most 60, each once.",
"type": "string"
},
{
"field": "catalog.spec.pseudo_locales",
"flag": "--spec.pseudo-locales",
"repeated": true,
"summary": "Pseudo-locales to generate at export. They are never stored or translated.",
"type": "enum",
"values": [
"accented",
"bidi",
"wide"
]
},
{
"field": "catalog.spec.tone",
"flag": "--spec.tone",
"summary": "The brand voice every translation follows, at most 2000 characters.",
"type": "string"
},
{
"field": "catalog.spec.locale_guidance",
"flag": "--spec.locale-guidance",
"repeated": true,
"summary": "Extra instructions per target locale, for example the vocabulary of a region. Keys are target locales; at most 60 entries, each at most 2000 characters.",
"type": "key=value"
},
{
"field": "catalog.spec.glossaries",
"flag": "--spec.glossaries",
"repeated": true,
"summary": "The glossaries this catalog applies, as Glossary names; at most 10.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/catalogs",
"method": "localization.catalogs.create",
"permission": "localization:write",
"positional": {
"arg": "ID",
"field": "catalog_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "catalog",
"summary": "Creates a catalog.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "catalog.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "catalog.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "catalog.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "catalog.spec.source_locale",
"flag": "--spec.source-locale",
"required": true,
"summary": "The locale the source texts are written in, a BCP 47 tag such as `en`.",
"type": "string"
},
{
"field": "catalog.spec.target_locales",
"flag": "--spec.target-locales",
"repeated": true,
"summary": "The locales to translate into, BCP 47 tags. `zh-Hant-HK` and `zh-Hant-TW` are separate locales. At most 60, each once.",
"type": "string"
},
{
"field": "catalog.spec.pseudo_locales",
"flag": "--spec.pseudo-locales",
"repeated": true,
"summary": "Pseudo-locales to generate at export. They are never stored or translated.",
"type": "enum",
"values": [
"accented",
"bidi",
"wide"
]
},
{
"field": "catalog.spec.tone",
"flag": "--spec.tone",
"summary": "The brand voice every translation follows, at most 2000 characters.",
"type": "string"
},
{
"field": "catalog.spec.locale_guidance",
"flag": "--spec.locale-guidance",
"repeated": true,
"summary": "Extra instructions per target locale, for example the vocabulary of a region. Keys are target locales; at most 60 entries, each at most 2000 characters.",
"type": "key=value"
},
{
"field": "catalog.spec.glossaries",
"flag": "--spec.glossaries",
"repeated": true,
"summary": "The glossaries this catalog applies, as Glossary names; at most 10.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the catalog when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{catalog.name=orgs/*/projects/*/envs/*/catalogs/*}",
"method": "localization.catalogs.update",
"permission": "localization:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "catalog.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/catalogs/{catalog}"
},
"resource_field": "catalog",
"sends_etag": true,
"summary": "Updates a catalog.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the catalog does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete the catalog's entries; without it, a catalog that has entries is refused with `INVALID_STATE`.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/catalogs/*}",
"method": "localization.catalogs.delete",
"permission": "localization:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/catalogs/{catalog}"
},
"summary": "Deletes a catalog.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "format",
"flag": "--format",
"required": true,
"summary": "The format of the files.",
"type": "enum",
"values": [
"sylphx_json",
"icu_json",
"gettext_po",
"xliff2"
]
},
{
"field": "sources",
"flag": "--sources",
"repeated": true,
"required": true,
"summary": "The source-locale files; 1 to 500.",
"type": "json"
},
{
"field": "translations",
"flag": "--translations",
"repeated": true,
"summary": "The committed target-locale files; at most 10000. A text that differs from the service's last export is recorded as a pinned human override.",
"type": "json"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/catalogs/*}:sync",
"method": "localization.catalogs.sync",
"permission": "localization:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/catalogs/{catalog}"
},
"summary": "Reads the source files and the committed translations into the catalog, then translates what is new or stale. Each call is idempotent and works within a bounded time; call again until `pending` is 0.",
"verb": "sync"
},
{
"effect": "read",
"flags": [
{
"field": "format",
"flag": "--format",
"required": true,
"summary": "The format of the files.",
"type": "enum",
"values": [
"sylphx_json",
"icu_json",
"gettext_po",
"xliff2"
]
},
{
"field": "locales",
"flag": "--locales",
"repeated": true,
"summary": "The locales to export; default every target locale and the pseudo-locales.",
"type": "string"
},
{
"field": "source_fallback",
"flag": "--source-fallback",
"summary": "Emit the source text for keys that have no passing translation, for runtimes that do not fall back to the source themselves.",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/catalogs/*}:export",
"method": "localization.catalogs.export",
"permission": "localization:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/catalogs/{catalog}"
},
"summary": "Returns the catalog's files per locale in the requested format, with the QA report. A read with a request body, like a query.",
"verb": "export"
}
],
"noun": "catalogs",
"resource_type": "localization.sylphx.com/Catalog"
},
{
"collection": "entries",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/catalogs/*/entries/*}",
"method": "localization.entries.get",
"permission": "localization:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/catalogs/{catalog}/entries/{entry}"
},
"summary": "Gets a catalog entry.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, limited to `state`, `locale`, and `qa_state`; for example `state = ENTRY_STATE_ACTIVE AND locale = \"ja\" AND qa_state = QA_STATE_FAILED`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/catalogs/*}/entries",
"method": "localization.entries.list",
"paginates": true,
"permission": "localization:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/catalogs/{catalog}"
},
"summary": "Lists catalog entries. The filter is limited to `state`, `locale`, and `qa_state`.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "locale",
"flag": "--locale",
"required": true,
"summary": "The target locale.",
"type": "string"
},
{
"field": "text",
"flag": "--text",
"required": true,
"summary": "The translated message, a Unicode MessageFormat 2 pattern.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/catalogs/*/entries/*}:pinTranslation",
"method": "localization.entries.pin_translation",
"permission": "localization:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/catalogs/{catalog}/entries/{entry}"
},
"summary": "Sets the text of one locale as a human override that AI never overwrites. QA runs on the text first; a text with a QA error is rejected with `INVALID_FIELD`, and the problem lists the findings.",
"verb": "pin-translation"
},
{
"effect": "write",
"flags": [
{
"field": "locale",
"flag": "--locale",
"required": true,
"summary": "The target locale.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/catalogs/*/entries/*}:unpinTranslation",
"method": "localization.entries.unpin_translation",
"permission": "localization:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/catalogs/{catalog}/entries/{entry}"
},
"summary": "Removes the human override of one locale; the next sync may translate it again.",
"verb": "unpin-translation"
}
],
"noun": "entries",
"resource_type": "localization.sylphx.com/CatalogEntry"
},
{
"collection": "glossaries",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/glossaries/*}",
"method": "localization.glossaries.get",
"permission": "localization:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/glossaries/{glossary}"
},
"summary": "Gets a glossary.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/glossaries",
"method": "localization.glossaries.list",
"paginates": true,
"permission": "localization:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists glossarys.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "glossary.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "glossary.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "glossary.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "glossary.spec.terms",
"flag": "--spec.terms",
"repeated": true,
"summary": "The terms; at most 5000.",
"type": "json"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/glossaries",
"method": "localization.glossaries.create",
"permission": "localization:write",
"positional": {
"arg": "ID",
"field": "glossary_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "glossary",
"summary": "Creates a glossary.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "glossary.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "glossary.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "glossary.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "glossary.spec.terms",
"flag": "--spec.terms",
"repeated": true,
"summary": "The terms; at most 5000.",
"type": "json"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the glossary when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{glossary.name=orgs/*/projects/*/envs/*/glossaries/*}",
"method": "localization.glossaries.update",
"permission": "localization:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "glossary.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/glossaries/{glossary}"
},
"resource_field": "glossary",
"sends_etag": true,
"summary": "Updates a glossary.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the glossary does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/glossaries/*}",
"method": "localization.glossaries.delete",
"permission": "localization:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/glossaries/{glossary}"
},
"summary": "Deletes a glossary.",
"verb": "delete"
}
],
"noun": "glossaries",
"resource_type": "localization.sylphx.com/Glossary"
}
],
"commands": [],
"display_name": "Sylphx Localization",
"noun": "localization",
"stage": "preview"
},
{
"collections": [
{
"collection": "price_catalogs",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/price_catalogs/*}",
"method": "money.price_catalogs.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/price_catalogs/{price_catalog}"
},
"summary": "Gets the environment's catalog.",
"verb": "get"
},
{
"effect": "write",
"flags": [
{
"field": "catalog.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "catalog.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "catalog.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "catalog.spec.features",
"flag": "--spec.features",
"repeated": true,
"summary": "What an entitlement can grant.",
"type": "json"
},
{
"field": "catalog.spec.products",
"flag": "--spec.products",
"repeated": true,
"summary": "What is sold.",
"type": "json"
},
{
"field": "catalog.spec.client_grant_ttl",
"flag": "--spec.client-grant-ttl",
"summary": "How long a signed store-purchase grant is valid, from the moment it is issued; a client re-verifies to renew it. Default 7 days, 1 hour to 30 days.",
"type": "duration"
},
{
"field": "catalog.spec.refund_claw_back",
"flag": "--spec.refund-claw-back",
"summary": "Whether a delivered one-time purchase whose money the store or processor takes back (a refund, a void, a chargeback) gives back its goods: its entitlements end, and the refund event asks the app to take back the assets it granted, up to what the subject still holds. Applies once the project is enabled for take-backs, to refunds dated from then on; unset then means on.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the catalog when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{catalog.name=orgs/*/projects/*/envs/*/price_catalogs/*}",
"method": "money.price_catalogs.update",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "catalog.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/price_catalogs/{price_catalog}"
},
"resource_field": "catalog",
"sends_etag": true,
"summary": "Updates the environment's catalog: its features and products, whole.",
"update_mask": "from-flags",
"verb": "update"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/price_catalogs/*}:sync",
"method": "money.price_catalogs.sync",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/price_catalogs/{price_catalog}"
},
"summary": "Pushes the catalog to the merchant account's processor now: products and prices by lookup key; an amount change makes a new price.",
"verb": "sync"
}
],
"noun": "price-catalogs",
"resource_type": "money.sylphx.com/PriceCatalog"
},
{
"collection": "checkout_policies",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/checkout_policies/*}",
"method": "money.checkout_policies.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/checkout_policies/{checkout_policy}"
},
"summary": "Gets the environment's checkout policy: which buyer countries consumer checkout refuses. An environment that never wrote one refuses none.",
"verb": "get"
},
{
"effect": "write",
"flags": [
{
"field": "checkout_policy.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "checkout_policy.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "checkout_policy.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "checkout_policy.spec.denied_country_codes",
"flag": "--spec.denied-country-codes",
"repeated": true,
"summary": "Buyer countries consumer checkout refuses: ISO 3166-1 alpha-2 codes (`DE`), or the group `EU` (the 27 member states). At most 300 entries. Empty refuses nobody.",
"type": "string"
},
{
"field": "checkout_policy.spec.allow_tax_id_buyers",
"flag": "--spec.allow-tax-id-buyers",
"summary": "Whether a buyer from a denied country who gives a tax id (a business) may still buy. Checkout then asks for the tax id; default false.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the policy when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{checkout_policy.name=orgs/*/projects/*/envs/*/checkout_policies/*}",
"method": "money.checkout_policies.update",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "checkout_policy.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/checkout_policies/{checkout_policy}"
},
"resource_field": "checkout_policy",
"sends_etag": true,
"summary": "Updates the environment's checkout policy, whole.",
"update_mask": "from-flags",
"verb": "update"
}
],
"noun": "checkout-policies",
"resource_type": "money.sylphx.com/CheckoutPolicy"
},
{
"collection": "store_connections",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/store_connections/*}",
"method": "money.store_connections.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/store_connections/{store_connection}"
},
"summary": "Gets a store connection.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/store_connections",
"method": "money.store_connections.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists store connections.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "store_connection.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "store_connection.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "store_connection.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.bundle_ids",
"flag": "--spec.app-store.bundle-ids",
"repeated": true,
"summary": "The apps' bundle ids.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.issuer_id",
"flag": "--spec.app-store.issuer-id",
"summary": "The App Store Connect issuer id.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.key_id",
"flag": "--spec.app-store.key-id",
"summary": "The In-App Purchase key id.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.private_key",
"flag": "--spec.app-store.private-key",
"sensitive": true,
"summary": "The In-App Purchase key (`.p8` PEM). Write-only: sealed on write, never returned; omit it on update to keep the stored key.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.app_apple_id",
"flag": "--spec.app-store.app-apple-id",
"summary": "The app's Apple id: when set, production notifications must carry it.",
"type": "int"
},
{
"field": "store_connection.spec.app_store.account_token_prefix",
"flag": "--spec.app-store.account-token-prefix",
"summary": "An earlier `appAccountToken` scheme the app's shipped builds use: the token is UUIDv5 in the URL namespace of this prefix followed by the subject id (for example `https://accounts.example.com/v2/`). Tokens in Money's own scheme are always accepted as well.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.environment",
"flag": "--spec.app-store.environment",
"summary": "The store environment this connection serves: `production` or `sandbox`. Only purchases signed for that environment are accepted (plus sandbox ones on a production connection with `allow_sandbox`), and each is read back from its own environment's App Store Server API. Xcode and local-testing signatures are refused either way. A connection created before this field existed serves `production`.",
"type": "string"
},
{
"field": "store_connection.spec.google_play.package_names",
"flag": "--spec.google-play.package-names",
"repeated": true,
"summary": "The apps' package names.",
"type": "string"
},
{
"field": "store_connection.spec.google_play.service_account_json",
"flag": "--spec.google-play.service-account-json",
"sensitive": true,
"summary": "The service account's JSON key. Write-only: sealed on write, never returned; omit it on update to keep the stored key.",
"type": "string"
},
{
"field": "store_connection.spec.google_play.notification_audience",
"flag": "--spec.google-play.notification-audience",
"summary": "The audience Play's Pub/Sub push token must carry for real-time developer notifications; unset refuses them.",
"type": "string"
},
{
"field": "store_connection.spec.google_play.notification_service_account",
"flag": "--spec.google-play.notification-service-account",
"summary": "The service account Pub/Sub pushes as.",
"type": "string"
},
{
"field": "store_connection.spec.allow_sandbox",
"flag": "--spec.allow-sandbox",
"summary": "Accept purchases the store marks as sandbox or license-test. Off: a sandbox purchase is refused. On a `production` App Store connection it also takes App Review and TestFlight purchases, read back from the sandbox and recorded and granted as `sandbox`, never as production.",
"type": "bool"
},
{
"field": "store_connection.spec.require_account_token",
"flag": "--spec.require-account-token",
"summary": "Refuse a purchase that does not carry the subject's account token (App Store `appAccountToken`, Play `obfuscatedAccountId`).",
"type": "bool"
},
{
"field": "store_connection.spec.client_verify",
"flag": "--spec.client-verify",
"summary": "Let an app with no server verify its own purchases against this connection (`store_purchases:clientVerify`, callable with a publishable key). Off by default, including for every connection created before this field existed; only a secret key holding `billing:write` can turn it on.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/store_connections",
"method": "money.store_connections.create",
"permission": "billing:write",
"positional": {
"arg": "ID",
"field": "store_connection_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "store_connection",
"summary": "Creates a store connection; its credential is sealed and never returned.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "store_connection.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "store_connection.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "store_connection.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.bundle_ids",
"flag": "--spec.app-store.bundle-ids",
"repeated": true,
"summary": "The apps' bundle ids.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.issuer_id",
"flag": "--spec.app-store.issuer-id",
"summary": "The App Store Connect issuer id.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.key_id",
"flag": "--spec.app-store.key-id",
"summary": "The In-App Purchase key id.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.private_key",
"flag": "--spec.app-store.private-key",
"sensitive": true,
"summary": "The In-App Purchase key (`.p8` PEM). Write-only: sealed on write, never returned; omit it on update to keep the stored key.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.app_apple_id",
"flag": "--spec.app-store.app-apple-id",
"summary": "The app's Apple id: when set, production notifications must carry it.",
"type": "int"
},
{
"field": "store_connection.spec.app_store.account_token_prefix",
"flag": "--spec.app-store.account-token-prefix",
"summary": "An earlier `appAccountToken` scheme the app's shipped builds use: the token is UUIDv5 in the URL namespace of this prefix followed by the subject id (for example `https://accounts.example.com/v2/`). Tokens in Money's own scheme are always accepted as well.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.environment",
"flag": "--spec.app-store.environment",
"summary": "The store environment this connection serves: `production` or `sandbox`. Only purchases signed for that environment are accepted (plus sandbox ones on a production connection with `allow_sandbox`), and each is read back from its own environment's App Store Server API. Xcode and local-testing signatures are refused either way. A connection created before this field existed serves `production`.",
"type": "string"
},
{
"field": "store_connection.spec.google_play.package_names",
"flag": "--spec.google-play.package-names",
"repeated": true,
"summary": "The apps' package names.",
"type": "string"
},
{
"field": "store_connection.spec.google_play.service_account_json",
"flag": "--spec.google-play.service-account-json",
"sensitive": true,
"summary": "The service account's JSON key. Write-only: sealed on write, never returned; omit it on update to keep the stored key.",
"type": "string"
},
{
"field": "store_connection.spec.google_play.notification_audience",
"flag": "--spec.google-play.notification-audience",
"summary": "The audience Play's Pub/Sub push token must carry for real-time developer notifications; unset refuses them.",
"type": "string"
},
{
"field": "store_connection.spec.google_play.notification_service_account",
"flag": "--spec.google-play.notification-service-account",
"summary": "The service account Pub/Sub pushes as.",
"type": "string"
},
{
"field": "store_connection.spec.allow_sandbox",
"flag": "--spec.allow-sandbox",
"summary": "Accept purchases the store marks as sandbox or license-test. Off: a sandbox purchase is refused. On a `production` App Store connection it also takes App Review and TestFlight purchases, read back from the sandbox and recorded and granted as `sandbox`, never as production.",
"type": "bool"
},
{
"field": "store_connection.spec.require_account_token",
"flag": "--spec.require-account-token",
"summary": "Refuse a purchase that does not carry the subject's account token (App Store `appAccountToken`, Play `obfuscatedAccountId`).",
"type": "bool"
},
{
"field": "store_connection.spec.client_verify",
"flag": "--spec.client-verify",
"summary": "Let an app with no server verify its own purchases against this connection (`store_purchases:clientVerify`, callable with a publishable key). Off by default, including for every connection created before this field existed; only a secret key holding `billing:write` can turn it on.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the store connection when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{store_connection.name=orgs/*/projects/*/envs/*/store_connections/*}",
"method": "money.store_connections.update",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "store_connection.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/store_connections/{store_connection}"
},
"resource_field": "store_connection",
"sends_etag": true,
"summary": "Updates a store connection; a new credential replaces the stored one.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "The ETag the caller read; the delete fails if it changed.",
"type": "string"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/store_connections/*}",
"method": "money.store_connections.delete",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/store_connections/{store_connection}"
},
"summary": "Deletes a store connection and its sealed credential.",
"verb": "delete"
}
],
"noun": "store-connections",
"resource_type": "money.sylphx.com/StoreConnection"
},
{
"collection": "store_purchases",
"commands": [
{
"effect": "write",
"flags": [
{
"field": "subject",
"flag": "--subject",
"required": true,
"summary": "Who bought it.",
"type": "json"
},
{
"field": "store",
"flag": "--store",
"required": true,
"summary": "`app_store` or `google_play`.",
"type": "string"
},
{
"field": "signed_transaction",
"flag": "--signed-transaction",
"summary": "App Store: the StoreKit 2 signed transaction (`jwsRepresentation`).",
"type": "string"
},
{
"field": "purchase_token",
"flag": "--purchase-token",
"summary": "Google Play: the purchase token.",
"type": "string"
},
{
"field": "product_id",
"flag": "--product-id",
"summary": "Google Play: the store product id (for a subscription, its id).",
"type": "string"
},
{
"field": "package_name",
"flag": "--package-name",
"summary": "Google Play: the package name, when the connection covers several.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "transaction_id",
"flag": "--transaction-id",
"summary": "App Store, instead of `signed_transaction`: the transaction id, for apps on original StoreKit whose receipts carry no signed transaction. Money reads the transaction from Apple with the connection's key; Apple's signed answer is the proof.",
"type": "string"
},
{
"field": "bundle_id",
"flag": "--bundle-id",
"summary": "App Store, with `transaction_id`: the app's bundle id.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/store_purchases:verify",
"method": "money.store_purchases.verify",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Verifies a store purchase with the store, binds it to the subject, and returns its record and a signed grant. Re-verifying returns the same record and grant. Called from the app's server with a secret key that holds `billing:write`; a publishable key cannot call it.",
"verb": "verify"
},
{
"effect": "write",
"flags": [
{
"field": "subject",
"flag": "--subject",
"required": true,
"summary": "Who bought it: `end_user` of `inst_` and a lower-case UUID.",
"type": "json"
},
{
"field": "store",
"flag": "--store",
"required": true,
"summary": "`app_store` or `google_play`.",
"type": "string"
},
{
"field": "signed_transaction",
"flag": "--signed-transaction",
"summary": "App Store: the StoreKit 2 signed transaction (`jwsRepresentation`).",
"type": "string"
},
{
"field": "purchase_token",
"flag": "--purchase-token",
"summary": "Google Play: the purchase token.",
"type": "string"
},
{
"field": "product_id",
"flag": "--product-id",
"summary": "Google Play: the store product id (for a subscription, its id).",
"type": "string"
},
{
"field": "package_name",
"flag": "--package-name",
"summary": "Google Play: the package name, when the connection covers several.",
"type": "string"
},
{
"field": "account_token",
"flag": "--account-token",
"summary": "The account token the app set at purchase (Play `obfuscatedAccountId`, App Store `appAccountToken`). A consistency check only: it must match the subject's derivation and the store's copy.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/store_purchases:clientVerify",
"method": "money.store_purchases.client_verify",
"permission": "billing:client",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Verifies a store purchase for an app with no server: called with the environment's publishable key (`billing:client`), the subject is an install id (`inst_` and a UUID), and Money completes the purchase with the store (acknowledges or consumes it) so the app never calls the store's server API. Works only on store connections that set `client_verify`. Re-calling returns the same record and grant.",
"verb": "client-verify"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/store_purchases/*}",
"method": "money.store_purchases.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/store_purchases/{store_purchase}"
},
"summary": "Gets a store purchase.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over filterable fields, for example `transaction_id = \"…\"`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/store_purchases",
"method": "money.store_purchases.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists store purchases, newest first.",
"verb": "list"
}
],
"noun": "store-purchases",
"resource_type": "money.sylphx.com/StorePurchase"
},
{
"collection": "customer_subscriptions",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/customer_subscriptions/*}",
"method": "money.customer_subscriptions.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_subscriptions/{customer_subscription}"
},
"summary": "Gets a customer subscription.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/customer_subscriptions",
"method": "money.customer_subscriptions.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists customer subscriptions, newest first.",
"verb": "list"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "at_period_end",
"flag": "--at-period-end",
"summary": "End it at the period end (true) or now (false).",
"type": "bool"
},
{
"field": "refund_last_payment",
"flag": "--refund-last-payment",
"summary": "Refund the last payment in full; only with `at_period_end` false.",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/customer_subscriptions/*}:cancel",
"method": "money.customer_subscriptions.cancel",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_subscriptions/{customer_subscription}"
},
"summary": "Cancels a web subscription, now or at the period end, and optionally refunds its last payment (for example a statutory cancellation window).",
"verb": "cancel"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/customer_subscriptions/*}:resume",
"method": "money.customer_subscriptions.resume",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_subscriptions/{customer_subscription}"
},
"summary": "Resumes a web subscription set to cancel at its period end.",
"verb": "resume"
},
{
"effect": "write",
"flags": [
{
"field": "quantity",
"flag": "--quantity",
"required": true,
"summary": "The new quantity (seats) of the subscription's one item; at least 1. To end the subscription, cancel it.",
"type": "int"
},
{
"field": "proration_behavior",
"flag": "--proration-behavior",
"summary": "How the change is billed; unspecified is `create_prorations`.",
"type": "enum",
"values": [
"create_prorations",
"none",
"always_invoice"
]
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/customer_subscriptions/*}:updateQuantity",
"method": "money.customer_subscriptions.update_quantity",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_subscriptions/{customer_subscription}"
},
"summary": "Changes the seat quantity of a web subscription, now, and syncs the processor's subscription item to it. A retry with the same `Idempotency-Key` (required) and the same request changes nothing twice.",
"verb": "update-quantity"
},
{
"effect": "write",
"flags": [
{
"field": "product",
"flag": "--product",
"required": true,
"summary": "The key of the catalog product to move to.",
"type": "string"
},
{
"field": "price",
"flag": "--price",
"summary": "The key of the product's recurring price (for example monthly or yearly). Optional when the product has one recurring price.",
"type": "string"
},
{
"field": "proration_behavior",
"flag": "--proration-behavior",
"summary": "How the change is billed; unspecified is `create_prorations`.",
"type": "enum",
"values": [
"create_prorations",
"none",
"always_invoice"
]
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/customer_subscriptions/*}:changePlan",
"method": "money.customer_subscriptions.change_plan",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_subscriptions/{customer_subscription}"
},
"summary": "Move a web subscription onto another recurring catalog plan.",
"verb": "change-plan"
}
],
"noun": "customer-subscriptions",
"resource_type": "money.sylphx.com/CustomerSubscription"
},
{
"collection": "entitlement_grants",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/entitlement_grants/*}",
"method": "money.entitlement_grants.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/entitlement_grants/{entitlement_grant}"
},
"summary": "Gets an entitlement grant.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over filterable fields, for example `feature = \"plus\"`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/entitlement_grants",
"method": "money.entitlement_grants.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists entitlement grants.",
"verb": "list"
},
{
"effect": "read",
"flags": [
{
"field": "subject",
"flag": "--subject",
"required": true,
"summary": "Who.",
"type": "json"
},
{
"field": "feature",
"flag": "--feature",
"required": true,
"summary": "The feature key.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/entitlement_grants:check",
"method": "money.entitlement_grants.check",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Answers whether a subject holds a feature now, and how much of it.",
"verb": "check"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "entitlement_grant.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "entitlement_grant.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "entitlement_grant.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "entitlement_grant.subject.end_user",
"flag": "--subject.end-user",
"summary": "An end user's id (Sylphx Auth, or the app's own OIDC issuer).",
"type": "string"
},
{
"field": "entitlement_grant.subject.customer_organization",
"flag": "--subject.customer-organization",
"summary": "A customer organization's id.",
"type": "string"
},
{
"field": "entitlement_grant.feature",
"flag": "--feature",
"summary": "The feature key.",
"type": "string"
},
{
"field": "entitlement_grant.expire_time",
"flag": "--expire-time",
"summary": "When it ends; unset for no end.",
"type": "timestamp"
},
{
"field": "entitlement_grant.campaign",
"flag": "--campaign",
"summary": "A manual grant's campaign (input on create, up to 64 characters).",
"type": "string"
},
{
"field": "entitlement_grant.reason",
"flag": "--reason",
"summary": "A manual grant's reason (input on create, up to 500 characters).",
"type": "string"
},
{
"field": "entitlement_grant.approval_ref",
"flag": "--approval-ref",
"summary": "A free-text reference to the approval, for example `CEO 2026-10-02` (input on create, up to 200 characters).",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/entitlement_grants",
"method": "money.entitlement_grants.create",
"permission": "billing:credits.approve",
"positional": {
"arg": "ID",
"field": "entitlement_grant_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "entitlement_grant",
"summary": "Creates a manual entitlement grant (support, comp, grace). Append-only; needs the approval-class scope. The approver recorded is the key's principal.",
"verb": "create"
}
],
"noun": "entitlement-grants",
"resource_type": "money.sylphx.com/EntitlementGrant"
},
{
"collection": "merchant_accounts",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/merchant_accounts/*}",
"method": "money.merchant_accounts.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/merchant_accounts/{merchant_account}"
},
"summary": "Gets a merchant account.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/merchant_accounts",
"method": "money.merchant_accounts.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists merchant accounts.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "merchant_account_id",
"flag": "--merchant-account-id",
"summary": "The merchant account id; default `default`.",
"type": "string"
},
{
"field": "return_url",
"flag": "--return-url",
"summary": "Where the browser returns after the processor, with `status` and, on success, `merchant_account` in the query. HTTPS only. Required for the OAuth connection; unused, and so optional, with `restricted_key`.",
"type": "string"
},
{
"field": "restricted_key",
"flag": "--restricted-key",
"sensitive": true,
"summary": "A Stripe restricted key (`rk_test_…` or `rk_live_…`); when set, no OAuth happens: the account is read and connected at once. Write-only: sealed on write, never returned, never logged. A secret key (`sk_…`) is refused, because a restricted key can be limited to what payments need.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/merchant_accounts:connect",
"method": "money.merchant_accounts.connect",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Starts connecting a Stripe account: returns the processor's authorisation URL for an org owner to open, which the processor's redirect completes. With a restricted key in the request the account connects at once instead, and the connected merchant account comes back in the response.",
"verb": "connect"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/merchant_accounts/*}:refresh",
"method": "money.merchant_accounts.refresh",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/merchant_accounts/{merchant_account}"
},
"summary": "Reads the connected account back from the processor.",
"verb": "refresh"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/merchant_accounts/*}:disconnect",
"method": "money.merchant_accounts.disconnect",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/merchant_accounts/{merchant_account}"
},
"summary": "Disconnects the account: Sylphx loses access; checkout is refused.",
"verb": "disconnect"
},
{
"effect": "write",
"flags": [
{
"field": "merchant_account.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "merchant_account.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "merchant_account.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "merchant_account.automatic_tax",
"flag": "--automatic-tax",
"summary": "Whether Stripe computes tax on this merchant's checkouts and usage invoices (its own cost decision: Stripe Tax charges per transaction). Off by default. Writable through `UpdateMerchantAccount` (`update_mask = \"automatic_tax\"`). Turning it on is refused while a live `post_tax_settlement` credit grant exists.",
"type": "bool"
}
],
"http": "PATCH /v1/{merchant_account.name=orgs/*/projects/*/envs/*/merchant_accounts/*}",
"method": "money.merchant_accounts.update",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "merchant_account.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/merchant_accounts/{merchant_account}"
},
"resource_field": "merchant_account",
"sends_etag": true,
"summary": "Updates the merchant account's own settings: the fields named in `update_mask`.",
"update_mask": "from-flags",
"verb": "update"
}
],
"noun": "merchant-accounts",
"resource_type": "money.sylphx.com/MerchantAccount"
},
{
"collection": "checkout_sessions",
"commands": [
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "checkout_session.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "checkout_session.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "checkout_session.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "checkout_session.subject.end_user",
"flag": "--subject.end-user",
"summary": "An end user's id (Sylphx Auth, or the app's own OIDC issuer).",
"type": "string"
},
{
"field": "checkout_session.subject.customer_organization",
"flag": "--subject.customer-organization",
"summary": "A customer organization's id.",
"type": "string"
},
{
"field": "checkout_session.line_items",
"flag": "--line-items",
"repeated": true,
"required": true,
"summary": "What is bought: catalog prices by lookup key. One recurring price makes a subscription; one-time prices make an order.",
"type": "json"
},
{
"field": "checkout_session.success_url",
"flag": "--success-url",
"required": true,
"summary": "Where the buyer lands after paying; `{CHECKOUT_SESSION_ID}` is replaced by the processor's session id. HTTPS only.",
"type": "string"
},
{
"field": "checkout_session.cancel_url",
"flag": "--cancel-url",
"summary": "Where the buyer lands on cancel. HTTPS only.",
"type": "string"
},
{
"field": "checkout_session.currency_code",
"flag": "--currency-code",
"summary": "The currency to charge in, upper-case ISO 4217; default the processor's choice for the buyer among the prices' currencies.",
"type": "string"
},
{
"field": "checkout_session.locale",
"flag": "--locale",
"summary": "The page language, for example `en` or `zh-HK`; default automatic.",
"type": "string"
},
{
"field": "checkout_session.metadata",
"flag": "--metadata",
"repeated": true,
"summary": "Copied to the subscription or order, for example attribution (`utm_source`, `ref`). At most 20 keys.",
"type": "key=value"
},
{
"field": "checkout_session.allow_promotion_codes",
"flag": "--allow-promotion-codes",
"summary": "Whether the buyer may enter a promotion code.",
"type": "bool"
},
{
"field": "checkout_session.buyer_country_code",
"flag": "--buyer-country-code",
"summary": "Where the buyer is, upper-case ISO 3166-1 alpha-2, when the caller knows it (for example from the request's IP address). A country the environment's checkout policy denies is refused here, before any page is made, unless the policy lets a business buy. Not trusted for anything else: the billing address the buyer gives is checked again when the payment completes.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/checkout_sessions",
"method": "money.checkout_sessions.create",
"permission": "billing:write",
"positional": {
"arg": "ID",
"field": "checkout_session_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "checkout_session",
"summary": "Creates a hosted checkout for a subject.",
"verb": "create"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/checkout_sessions/*}",
"method": "money.checkout_sessions.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/checkout_sessions/{checkout_session}"
},
"summary": "Gets a checkout session.",
"verb": "get"
}
],
"noun": "checkout-sessions",
"resource_type": "money.sylphx.com/CheckoutSession"
},
{
"collection": "tax_threshold_statuses",
"commands": [
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/tax_threshold_statuses",
"method": "money.tax_threshold_statuses.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists where the environment's consumer sales stand against each jurisdiction's digital-services tax registration threshold, per its own window. EU and UK have no threshold and are not tracked.",
"verb": "list"
}
],
"noun": "tax-threshold-statuses",
"resource_type": "money.sylphx.com/TaxThresholdStatus"
},
{
"collection": "portal_sessions",
"commands": [
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "portal_session.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "portal_session.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "portal_session.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "portal_session.subject.end_user",
"flag": "--subject.end-user",
"summary": "An end user's id (Sylphx Auth, or the app's own OIDC issuer).",
"type": "string"
},
{
"field": "portal_session.subject.customer_organization",
"flag": "--subject.customer-organization",
"summary": "A customer organization's id.",
"type": "string"
},
{
"field": "portal_session.return_url",
"flag": "--return-url",
"required": true,
"summary": "Where the portal's back link goes. HTTPS only.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/portal_sessions",
"method": "money.portal_sessions.create",
"permission": "billing:write",
"positional": {
"arg": "ID",
"field": "portal_session_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "portal_session",
"summary": "Creates a customer portal session for a subject.",
"verb": "create"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/portal_sessions/*}",
"method": "money.portal_sessions.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/portal_sessions/{portal_session}"
},
"summary": "Gets a portal session.",
"verb": "get"
}
],
"noun": "portal-sessions",
"resource_type": "money.sylphx.com/PortalSession"
},
{
"collection": "licence_keys",
"commands": [
{
"effect": "write",
"flags": [
{
"field": "licence_key_id",
"flag": "--licence-key-id",
"summary": "The key's id; `^[a-z]([a-z0-9_-]{0,61}[a-z0-9])?$`. Empty: Money assigns one.",
"type": "string"
},
{
"field": "spec",
"flag": "--spec",
"summary": "Shown to operators.",
"type": "json"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/licence_keys:generate",
"method": "money.licence_keys.generate",
"permission": "billing:licence_keys.approve",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Generates a licence key: Money creates the Ed25519 key, seals it, and never returns the private half. Needs the approval-class scope, which the developer role does not hold.",
"verb": "generate"
},
{
"effect": "write",
"flags": [
{
"field": "licence_key_id",
"flag": "--licence-key-id",
"required": true,
"summary": "The key's id; as on GenerateLicenceKeyRequest. Required.",
"type": "string"
},
{
"field": "private_key_pkcs8",
"flag": "--private-key-pkcs8",
"required": true,
"sensitive": true,
"summary": "The Ed25519 private key as PKCS8 DER in standard base64. Write-only: sealed on import, never returned.",
"type": "string"
},
{
"field": "expected_public_key",
"flag": "--expected-public-key",
"required": true,
"summary": "The public key shipped clients pin, raw base64url without padding. The import is refused unless it is the public half of the imported key.",
"type": "string"
},
{
"field": "spec",
"flag": "--spec",
"summary": "Shown to operators.",
"type": "json"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/licence_keys:import",
"method": "money.licence_keys.import",
"permission": "billing:licence_keys.approve",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Imports an existing Ed25519 key (PKCS8), for a key already pinned in shipped clients. Refused unless the expected public key is the imported key's public half.",
"verb": "import"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/licence_keys/*}:retire",
"method": "money.licence_keys.retire",
"permission": "billing:licence_keys.approve",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/licence_keys/{licence_key}"
},
"summary": "Retires a licence key: it stops signing new terms and stays exported for verification.",
"verb": "retire"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/licence_keys/*}",
"method": "money.licence_keys.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/licence_keys/{licence_key}"
},
"summary": "Gets a licence key (its public half, never the private).",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/licence_keys",
"method": "money.licence_keys.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists licence keys, newest first.",
"verb": "list"
}
],
"noun": "licence-keys",
"resource_type": "money.sylphx.com/LicenceKey"
},
{
"collection": "licence_tokens",
"commands": [
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter. It must name whose tokens (else `INVALID_FIELD`): `end_user = \"…\"` or `customer_organization = \"…\"`; `token_product = \"…\"` (joined with `AND`) keeps only that product, and no `token_product` lists every product.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/licence_tokens",
"method": "money.licence_tokens.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists a subject's unexpired offline licence tokens of paid orders, for support. Re-derived from the frozen terms: the same bytes as at purchase.",
"verb": "list"
}
],
"noun": "licence-tokens",
"resource_type": "money.sylphx.com/LicenceToken"
},
{
"collection": "usage_settings",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/usage_settings/*}",
"method": "money.usage_settings.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/usage_settings/{usage_settings}"
},
"summary": "Gets the environment's usage settings.",
"verb": "get"
},
{
"effect": "write",
"flags": [
{
"field": "usage_settings.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "usage_settings.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "usage_settings.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "usage_settings.currency_code",
"flag": "--currency-code",
"required": true,
"summary": "The currency usage is rated and invoiced in (ISO 4217, upper case).",
"type": "string"
},
{
"field": "usage_settings.enforcement_enabled",
"flag": "--enforcement-enabled",
"summary": "While false a reservation is always granted and a would-be refusal is only recorded. Off until the merchant's admin turns it on.",
"type": "bool"
},
{
"field": "usage_settings.free_allowance_nano",
"flag": "--free-allowance-nano",
"summary": "What a subject with no payment method may use each month, nano-minor, as a decimal string.",
"type": "string"
},
{
"field": "usage_settings.past_due_grace_days",
"flag": "--past-due-grace-days",
"summary": "Days after an invoice's due time before the subject is past due.",
"type": "int"
},
{
"field": "usage_settings.suspend_grace_days",
"flag": "--suspend-grace-days",
"summary": "Days after an invoice's due time before the subject is suspended.",
"type": "int"
},
{
"field": "usage_settings.extra_issuer",
"flag": "--extra-issuer",
"summary": "A further token issuer (the merchant's own OIDC provider) besides Sylphx Auth; empty for Sylphx Auth only. It needs `extra_issuer_jwks_url`.",
"type": "string"
},
{
"field": "usage_settings.extra_issuer_jwks_url",
"flag": "--extra-issuer-jwks-url",
"summary": "The issuer's HTTPS JWKS URL.",
"type": "string"
},
{
"field": "usage_settings.extra_issuer_audience",
"flag": "--extra-issuer-audience",
"summary": "The audience that issuer's tokens must carry; required with `extra_issuer`.",
"type": "string"
},
{
"field": "usage_settings.extra_issuer_org_claim",
"flag": "--extra-issuer-org-claim",
"summary": "The claim that names a customer organization in that issuer's tokens; empty means the issuer proves no organization subject.",
"type": "string"
}
],
"http": "PATCH /v1/{usage_settings.name=orgs/*/projects/*/envs/*/usage_settings/*}",
"method": "money.usage_settings.update",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "usage_settings.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/usage_settings/{usage_settings}"
},
"resource_field": "usage_settings",
"sends_etag": true,
"summary": "Updates the usage settings, the enforcement switch included. A change is recorded with who made it.",
"update_mask": "from-flags",
"verb": "update"
}
],
"noun": "usage-settings",
"resource_type": "money.sylphx.com/UsageSettings"
},
{
"collection": "usage_tiers",
"commands": [
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, for example `subject = \"…\"`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/usage_tiers",
"method": "money.usage_tiers.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists usage tiers.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "usage_tier.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "usage_tier.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "usage_tier.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "usage_tier.rank",
"flag": "--rank",
"required": true,
"summary": "Order of tiers; 0 is the base tier.",
"type": "int"
},
{
"field": "usage_tier.daily_limit_minor",
"flag": "--daily-limit-minor",
"summary": "Daily exposure limit in minor units, a decimal string; empty for none.",
"type": "string"
},
{
"field": "usage_tier.monthly_limit_minor",
"flag": "--monthly-limit-minor",
"summary": "Monthly exposure limit in minor units, a decimal string; empty for none.",
"type": "string"
},
{
"field": "usage_tier.threshold_minor",
"flag": "--threshold-minor",
"required": true,
"summary": "The amount an invoice would make due at which a threshold invoice is cut.",
"type": "string"
},
{
"field": "usage_tier.requires_paid_invoices",
"flag": "--requires-paid-invoices",
"summary": "Paid invoices needed to reach this tier.",
"type": "int"
},
{
"field": "usage_tier.requires_paid_minor",
"flag": "--requires-paid-minor",
"summary": "Paid total, minor units, needed to reach this tier.",
"type": "string"
}
],
"http": "PATCH /v1/{usage_tier.name=orgs/*/projects/*/envs/*/usage_tiers/*}",
"method": "money.usage_tiers.update",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "usage_tier.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/usage_tiers/{usage_tier}"
},
"resource_field": "usage_tier",
"sends_etag": true,
"summary": "Creates or updates a usage tier.",
"update_mask": "from-flags",
"verb": "update"
}
],
"noun": "usage-tiers",
"resource_type": "money.sylphx.com/UsageTier"
},
{
"collection": "usage_reservations",
"commands": [
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "usage_reservation.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "usage_reservation.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "usage_reservation.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "usage_reservation.subject.end_user",
"flag": "--subject.end-user",
"summary": "An end user's id (Sylphx Auth, or the app's own OIDC issuer).",
"type": "string"
},
{
"field": "usage_reservation.subject.customer_organization",
"flag": "--subject.customer-organization",
"summary": "A customer organization's id.",
"type": "string"
},
{
"field": "usage_reservation.subject_proof",
"flag": "--subject-proof",
"required": true,
"summary": "The acting end user's access token, required on every reserve: Money proves the subject itself, fresh, with the caller's own key (`auth:sessions:verify`) or the merchant's configured issuer. Never stored. A raw id is refused with PERMISSION_DENIED (reason `subject_unverified`).",
"type": "string"
},
{
"field": "usage_reservation.actor_proof",
"flag": "--actor-proof",
"summary": "For a customer organization: the token of the acting user, whose membership of the organization is checked fresh. The subject is Sylphx Auth's bare organization id (`acme`), never a resource name. Never stored.",
"type": "string"
},
{
"field": "usage_reservation.meter",
"flag": "--meter",
"required": true,
"summary": "The meter's lookup key.",
"type": "string"
},
{
"field": "usage_reservation.max_quantity",
"flag": "--max-quantity",
"required": true,
"summary": "The most the work may use, in the meter's base unit.",
"type": "int"
},
{
"field": "usage_reservation.ttl",
"flag": "--ttl",
"summary": "How long the hold lasts, at most `600s`; default `600s`.",
"type": "duration"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/usage_reservations",
"method": "money.usage_reservations.create",
"permission": "billing:metering:write",
"positional": null,
"resource_field": "usage_reservation",
"summary": "Reserves usage before the work starts. Refused with PLAN_LIMIT_REACHED (spend limit, no payment method) or INVALID_STATE (suspended) only while enforcement is on; while it is dark the reservation is granted and the refusal is recorded.",
"verb": "create"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/usage_reservations/*}",
"method": "money.usage_reservations.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/usage_reservations/{usage_reservation}"
},
"summary": "Gets a usage reservation.",
"verb": "get"
},
{
"effect": "write",
"flags": [
{
"field": "quantity_used",
"flag": "--quantity-used",
"required": true,
"summary": "What was used, in the meter's base unit; 0 to the granted quantity, or more after expiry (the work happened).",
"type": "int"
},
{
"field": "occurred_time",
"flag": "--occurred-time",
"summary": "When the work happened; now when absent.",
"type": "timestamp"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/usage_reservations/*}:settle",
"method": "money.usage_reservations.settle",
"permission": "billing:metering:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/usage_reservations/{usage_reservation}"
},
"summary": "Settles a reservation with what was used; the unused part returns to headroom. A settle after expiry still records the usage.",
"verb": "settle"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/usage_reservations/*}:release",
"method": "money.usage_reservations.release",
"permission": "billing:metering:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/usage_reservations/{usage_reservation}"
},
"summary": "Releases a reservation that used nothing.",
"verb": "release"
}
],
"noun": "usage-reservations",
"resource_type": "money.sylphx.com/UsageReservation"
},
{
"collection": "usage_events",
"commands": [
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "usage_event.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "usage_event.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "usage_event.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "usage_event.subject.end_user",
"flag": "--subject.end-user",
"summary": "An end user's id (Sylphx Auth, or the app's own OIDC issuer).",
"type": "string"
},
{
"field": "usage_event.subject.customer_organization",
"flag": "--subject.customer-organization",
"summary": "A customer organization's id.",
"type": "string"
},
{
"field": "usage_event.subject_proof",
"flag": "--subject-proof",
"required": true,
"summary": "As on UsageReservation.",
"type": "string"
},
{
"field": "usage_event.actor_proof",
"flag": "--actor-proof",
"summary": "As on UsageReservation.",
"type": "string"
},
{
"field": "usage_event.meter",
"flag": "--meter",
"required": true,
"summary": "The meter's lookup key.",
"type": "string"
},
{
"field": "usage_event.quantity",
"flag": "--quantity",
"required": true,
"summary": "How much, in the meter's base unit.",
"type": "int"
},
{
"field": "usage_event.occurred_time",
"flag": "--occurred-time",
"required": true,
"summary": "When the work happened.",
"type": "timestamp"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/usage_events",
"method": "money.usage_events.create",
"permission": "billing:metering:write",
"positional": null,
"resource_field": "usage_event",
"summary": "Records usage directly, only for a meter the merchant marked reservation-optional.",
"verb": "create"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, for example `subject = \"…\"`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/usage_events",
"method": "money.usage_events.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists usage events, newest first.",
"verb": "list"
},
{
"effect": "read",
"flags": [
{
"field": "subject",
"flag": "--subject",
"required": true,
"summary": "Whose standing.",
"type": "json"
},
{
"field": "subject_proof",
"flag": "--subject-proof",
"required": true,
"summary": "As on UsageReservation: a verified token for the subject.",
"type": "string"
},
{
"field": "actor_proof",
"flag": "--actor-proof",
"summary": "For a customer organization: the acting user's token.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/usage_events:checkStanding",
"method": "money.usage_events.check_standing",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Reads a subject's standing: active, past due or suspended, whether a payment method is on file, headroom and the threshold.",
"verb": "check-standing"
}
],
"noun": "usage-events",
"resource_type": "money.sylphx.com/UsageEvent"
},
{
"collection": "credit_grants",
"commands": [
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "credit_grant.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "credit_grant.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "credit_grant.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "credit_grant.subject.end_user",
"flag": "--subject.end-user",
"summary": "An end user's id (Sylphx Auth, or the app's own OIDC issuer).",
"type": "string"
},
{
"field": "credit_grant.subject.customer_organization",
"flag": "--subject.customer-organization",
"summary": "A customer organization's id.",
"type": "string"
},
{
"field": "credit_grant.kind",
"flag": "--kind",
"required": true,
"summary": "`amount` (a total) or `monthly_cap` (up to the amount in each month).",
"type": "string"
},
{
"field": "credit_grant.amount_minor",
"flag": "--amount-minor",
"required": true,
"summary": "Minor units, a decimal string.",
"type": "string"
},
{
"field": "credit_grant.start_time",
"flag": "--start-time",
"required": true,
"summary": "When it starts applying.",
"type": "timestamp"
},
{
"field": "credit_grant.expire_time",
"flag": "--expire-time",
"required": true,
"summary": "When it stops applying; required. Not renewing is how charging starts.",
"type": "timestamp"
},
{
"field": "credit_grant.approver",
"flag": "--approver",
"required": true,
"summary": "Who approved it.",
"type": "string"
},
{
"field": "credit_grant.reason",
"flag": "--reason",
"required": true,
"summary": "Why.",
"type": "string"
},
{
"field": "credit_grant.supersedes",
"flag": "--supersedes",
"summary": "The grant this one replaces.",
"type": "string"
},
{
"field": "credit_grant.tax_treatment",
"flag": "--tax-treatment",
"required": true,
"summary": "`undecided`, `price_reduction`, or `post_tax_settlement`; no default. `post_tax_settlement` is refused while the merchant has automatic tax on.",
"type": "string"
},
{
"field": "credit_grant.collection_mode",
"flag": "--collection-mode",
"required": true,
"summary": "`standard` or `hold`; no default. Over the credit, a held invoice stays due but is not collected until an explicit audited release.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/credit_grants",
"method": "money.credit_grants.create",
"permission": "billing:credits.approve",
"positional": null,
"resource_field": "credit_grant",
"summary": "Gives a subject credit. Append-only: a change is a new grant that supersedes the old. Refused with INVALID_STATE (`tax_treatment_unsupported`) for `post_tax_settlement` while the merchant has automatic tax on.",
"verb": "create"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/credit_grants/*}",
"method": "money.credit_grants.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/credit_grants/{credit_grant}"
},
"summary": "Gets a credit grant.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, for example `subject = \"…\"`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/credit_grants",
"method": "money.credit_grants.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists credit grants.",
"verb": "list"
}
],
"noun": "credit-grants",
"resource_type": "money.sylphx.com/CreditGrant"
},
{
"collection": "usage_invoices",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/usage_invoices/*}",
"method": "money.usage_invoices.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/usage_invoices/{usage_invoice}"
},
"summary": "Gets a usage invoice.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, for example `subject = \"…\"`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/usage_invoices",
"method": "money.usage_invoices.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists usage invoices, newest first.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "reason",
"flag": "--reason",
"required": true,
"summary": "Who releases it, and why: both are kept.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/usage_invoices/*}:releaseCollection",
"method": "money.usage_invoices.release_collection",
"permission": "billing:credits.approve",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/usage_invoices/{usage_invoice}"
},
"summary": "Releases a held invoice for collection, audited with who and why. Grant expiry or replacement never does.",
"verb": "release-collection"
}
],
"noun": "usage-invoices",
"resource_type": "money.sylphx.com/UsageInvoice"
},
{
"collection": "usage_meters",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/usage_meters/*}",
"method": "money.usage_meters.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/usage_meters/{usage_meter}"
},
"summary": "Gets a usage meter.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/usage_meters",
"method": "money.usage_meters.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists usage meters.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "usage_meter.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "usage_meter.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "usage_meter.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "usage_meter.unit",
"flag": "--unit",
"required": true,
"summary": "The unit of one quantity, for example `token`. It cannot change once the meter has recorded usage.",
"type": "string"
},
{
"field": "usage_meter.display_name",
"flag": "--display-name",
"summary": "A name for people.",
"type": "string"
},
{
"field": "usage_meter.reservation_optional",
"flag": "--reservation-optional",
"summary": "Whether usage may be recorded without a reservation.",
"type": "bool"
},
{
"field": "usage_meter.active",
"flag": "--active",
"summary": "A retired meter (false) refuses new usage; its history stays.",
"type": "bool"
}
],
"http": "PATCH /v1/{usage_meter.name=orgs/*/projects/*/envs/*/usage_meters/*}",
"method": "money.usage_meters.update",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "usage_meter.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/usage_meters/{usage_meter}"
},
"resource_field": "usage_meter",
"sends_etag": true,
"summary": "Creates or updates a usage meter. The unit cannot change once it has recorded usage.",
"update_mask": "from-flags",
"verb": "update"
}
],
"noun": "usage-meters",
"resource_type": "money.sylphx.com/UsageMeter"
},
{
"collection": "usage_meter_prices",
"commands": [
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "usage_meter_price.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "usage_meter_price.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "usage_meter_price.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "usage_meter_price.meter",
"flag": "--meter",
"required": true,
"summary": "The meter's key.",
"type": "string"
},
{
"field": "usage_meter_price.currency_code",
"flag": "--currency-code",
"required": true,
"summary": "ISO 4217; it must be the environment's currency.",
"type": "string"
},
{
"field": "usage_meter_price.unit_price_nano",
"flag": "--unit-price-nano",
"required": true,
"summary": "List price of one unit, nano-minor (a billionth of a minor unit), a decimal string.",
"type": "string"
},
{
"field": "usage_meter_price.effective_time",
"flag": "--effective-time",
"summary": "When it starts applying; now when absent. Not in the past, and after the meter's latest price.",
"type": "timestamp"
},
{
"field": "usage_meter_price.tax_code",
"flag": "--tax-code",
"summary": "The processor's tax code for the usage line; empty for the merchant's default.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/usage_meter_prices",
"method": "money.usage_meter_prices.create",
"permission": "billing:write",
"positional": null,
"resource_field": "usage_meter_price",
"summary": "Appends a price to a meter's history. It applies from its effective time on and never rewrites usage already rated.",
"verb": "create"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, for example `meter = \"tokens\"`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/usage_meter_prices",
"method": "money.usage_meter_prices.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists meter prices, newest first; filter by `meter`.",
"verb": "list"
}
],
"noun": "usage-meter-prices",
"resource_type": "money.sylphx.com/UsageMeterPrice"
}
],
"commands": [],
"display_name": "Sylphx Money",
"noun": "money",
"stage": "preview"
},
{
"collections": [
{
"collection": "domains",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/domains/*}",
"method": "network.domains.get",
"permission": "network:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/domains/{domain}"
},
"summary": "Gets a domain.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*}/domains",
"method": "network.domains.list",
"paginates": true,
"permission": "network:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Lists domains in a project.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "domain.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "domain.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "domain.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "domain.spec.domain_name",
"flag": "--spec.domain-name",
"required": true,
"summary": "The fully qualified name, for example `example.com`. Wildcards are refused.",
"type": "string"
},
{
"field": "domain.spec.verification_method",
"flag": "--spec.verification-method",
"summary": "How control is proven; default TXT.",
"type": "enum",
"values": [
"txt",
"cname"
]
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*}/domains",
"method": "network.domains.create",
"permission": "network:write",
"positional": {
"arg": "ID",
"field": "domain_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "domain",
"summary": "Creates a domain. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "domain.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "domain.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "domain.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "domain.spec.verification_method",
"flag": "--spec.verification-method",
"summary": "How control is proven; default TXT.",
"type": "enum",
"values": [
"txt",
"cname"
]
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{domain.name=orgs/*/projects/*/domains/*}",
"method": "network.domains.update",
"permission": "network:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "domain.name",
"pattern": "orgs/{org}/projects/{project}/domains/{domain}"
},
"resource_field": "domain",
"sends_etag": true,
"summary": "Updates a domain.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/domains/*}",
"method": "network.domains.delete",
"permission": "network:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/domains/{domain}"
},
"summary": "Deletes a domain.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/domains/*}:verify",
"method": "network.domains.verify",
"permission": "network:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/domains/{domain}"
},
"summary": "Checks the verification record now instead of at the next sweep.",
"verb": "verify",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "domains",
"resource_type": "network.sylphx.com/Domain"
},
{
"collection": "certificates",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/certificates/*}",
"method": "network.certificates.get",
"permission": "network:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/certificates/{certificate}"
},
"summary": "Gets a certificate.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*}/certificates",
"method": "network.certificates.list",
"paginates": true,
"permission": "network:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Lists certificates in a project.",
"verb": "list"
}
],
"noun": "certificates",
"resource_type": "network.sylphx.com/Certificate"
},
{
"collection": "routes",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/routes/*}",
"method": "network.routes.get",
"permission": "network:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/routes/{route}"
},
"summary": "Gets a route.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/routes",
"method": "network.routes.list",
"paginates": true,
"permission": "network:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists routes in a environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "route.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "route.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "route.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "route.spec.host",
"flag": "--spec.host",
"required": true,
"summary": "The exact host: a verified Domain or a subdomain of one.",
"type": "string"
},
{
"field": "route.spec.path_prefix",
"flag": "--spec.path-prefix",
"summary": "The path prefix; default `/`.",
"type": "string"
},
{
"field": "route.spec.service",
"flag": "--spec.service",
"summary": "A Hosting Service.",
"type": "string"
},
{
"field": "route.spec.redirect.target_uri",
"flag": "--spec.redirect.target-uri",
"summary": "The absolute URL to redirect to.",
"type": "string"
},
{
"field": "route.spec.redirect.status_code",
"flag": "--spec.redirect.status-code",
"summary": "301, 302, 307, or 308; default 308.",
"type": "int"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/routes",
"method": "network.routes.create",
"permission": "network:write",
"positional": {
"arg": "ID",
"field": "route_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "route",
"summary": "Creates a route. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "route.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "route.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "route.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "route.spec.host",
"flag": "--spec.host",
"required": true,
"summary": "The exact host: a verified Domain or a subdomain of one.",
"type": "string"
},
{
"field": "route.spec.path_prefix",
"flag": "--spec.path-prefix",
"summary": "The path prefix; default `/`.",
"type": "string"
},
{
"field": "route.spec.service",
"flag": "--spec.service",
"summary": "A Hosting Service.",
"type": "string"
},
{
"field": "route.spec.redirect.target_uri",
"flag": "--spec.redirect.target-uri",
"summary": "The absolute URL to redirect to.",
"type": "string"
},
{
"field": "route.spec.redirect.status_code",
"flag": "--spec.redirect.status-code",
"summary": "301, 302, 307, or 308; default 308.",
"type": "int"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{route.name=orgs/*/projects/*/envs/*/routes/*}",
"method": "network.routes.update",
"permission": "network:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "route.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/routes/{route}"
},
"resource_field": "route",
"sends_etag": true,
"summary": "Updates a route.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/routes/*}",
"method": "network.routes.delete",
"permission": "network:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/routes/{route}"
},
"summary": "Deletes a route.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "routes",
"resource_type": "network.sylphx.com/Route"
},
{
"collection": "egress_identities",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/egress_identities/*}",
"method": "network.egress_identities.get",
"permission": "network:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/egress_identities/{egress_identity}"
},
"summary": "Gets an egress identity.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*}/egress_identities",
"method": "network.egress_identities.list",
"paginates": true,
"permission": "network:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Lists egress identitys in a project.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "egress_identity.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "egress_identity.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "egress_identity.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "egress_identity.spec.region",
"flag": "--spec.region",
"required": true,
"summary": "The region the addresses live in.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*}/egress_identities",
"method": "network.egress_identities.create",
"permission": "network:write",
"positional": {
"arg": "ID",
"field": "egress_identity_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "egress_identity",
"summary": "Creates an egress identity. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "egress_identity.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "egress_identity.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "egress_identity.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{egress_identity.name=orgs/*/projects/*/egress_identities/*}",
"method": "network.egress_identities.update",
"permission": "network:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "egress_identity.name",
"pattern": "orgs/{org}/projects/{project}/egress_identities/{egress_identity}"
},
"resource_field": "egress_identity",
"sends_etag": true,
"summary": "Updates an egress identity.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/egress_identities/*}",
"method": "network.egress_identities.delete",
"permission": "network:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/egress_identities/{egress_identity}"
},
"summary": "Deletes an egress identity.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "egress-identities",
"resource_type": "network.sylphx.com/EgressIdentity"
},
{
"collection": "private_links",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/private_links/*}",
"method": "network.private_links.get",
"permission": "network:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/private_links/{private_link}"
},
"summary": "Gets a private link.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/private_links",
"method": "network.private_links.list",
"paginates": true,
"permission": "network:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists private links in a environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "private_link.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "private_link.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "private_link.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "private_link.spec.service",
"flag": "--spec.service",
"required": true,
"summary": "The Hosting Service exposed.",
"type": "string"
},
{
"field": "private_link.spec.region",
"flag": "--spec.region",
"required": true,
"summary": "The region of the link.",
"type": "string"
},
{
"field": "private_link.spec.allowed_consumers",
"flag": "--spec.allowed-consumers",
"repeated": true,
"required": true,
"summary": "The customer network accounts allowed to connect.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/private_links",
"method": "network.private_links.create",
"permission": "network:write",
"positional": {
"arg": "ID",
"field": "private_link_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "private_link",
"summary": "Creates a private link. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "private_link.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "private_link.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "private_link.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "private_link.spec.allowed_consumers",
"flag": "--spec.allowed-consumers",
"repeated": true,
"required": true,
"summary": "The customer network accounts allowed to connect.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{private_link.name=orgs/*/projects/*/envs/*/private_links/*}",
"method": "network.private_links.update",
"permission": "network:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "private_link.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/private_links/{private_link}"
},
"resource_field": "private_link",
"sends_etag": true,
"summary": "Updates a private link.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/private_links/*}",
"method": "network.private_links.delete",
"permission": "network:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/private_links/{private_link}"
},
"summary": "Deletes a private link.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "private-links",
"resource_type": "network.sylphx.com/PrivateLink"
}
],
"commands": [],
"display_name": "Sylphx Network",
"noun": "network",
"served": false,
"stage": "preview"
},
{
"collections": [
{
"collection": "mail_domains",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/mail_domains/*}",
"method": "notify.mail_domains.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mail_domains/{mail_domain}"
},
"summary": "Gets an email domain.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/mail_domains",
"method": "notify.mail_domains.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists email domains.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "email_domain.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "email_domain.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "email_domain.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "email_domain.spec.domain",
"flag": "--spec.domain",
"required": true,
"summary": "The domain, for example `mail.example.com`.",
"type": "string"
},
{
"field": "email_domain.spec.return_path_label",
"flag": "--spec.return-path-label",
"summary": "The return-path (bounce) subdomain label; default `bounces`.",
"type": "string"
},
{
"field": "email_domain.spec.sending.enabled",
"flag": "--spec.sending.enabled",
"summary": "Send from the domain. Default true.",
"type": "bool"
},
{
"field": "email_domain.spec.receiving.enabled",
"flag": "--spec.receiving.enabled",
"summary": "Receive mail for the domain; needs every MX record at the platform.",
"type": "bool"
},
{
"field": "email_domain.spec.receiving.mode",
"flag": "--spec.receiving.mode",
"summary": "How the domain's mail reaches the platform; `ALL` when unset.",
"type": "enum",
"values": [
"all"
]
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/mail_domains",
"method": "notify.mail_domains.create",
"permission": "notify:write",
"positional": {
"arg": "ID",
"field": "email_domain_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "email_domain",
"summary": "Creates an email domain.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "email_domain.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "email_domain.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "email_domain.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "email_domain.spec.return_path_label",
"flag": "--spec.return-path-label",
"summary": "The return-path (bounce) subdomain label; default `bounces`.",
"type": "string"
},
{
"field": "email_domain.spec.sending.enabled",
"flag": "--spec.sending.enabled",
"summary": "Send from the domain. Default true.",
"type": "bool"
},
{
"field": "email_domain.spec.receiving.enabled",
"flag": "--spec.receiving.enabled",
"summary": "Receive mail for the domain; needs every MX record at the platform.",
"type": "bool"
},
{
"field": "email_domain.spec.receiving.mode",
"flag": "--spec.receiving.mode",
"summary": "How the domain's mail reaches the platform; `ALL` when unset.",
"type": "enum",
"values": [
"all"
]
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the email domain when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{email_domain.name=orgs/*/projects/*/envs/*/mail_domains/*}",
"method": "notify.mail_domains.update",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "email_domain.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mail_domains/{mail_domain}"
},
"resource_field": "email_domain",
"sends_etag": true,
"summary": "Updates an email domain.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the email domain does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete the domain's routes.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/mail_domains/*}",
"method": "notify.mail_domains.delete",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mail_domains/{mail_domain}"
},
"summary": "Deletes an email domain.",
"verb": "delete"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/mail_domains/*}:verify",
"method": "notify.mail_domains.verify",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mail_domains/{mail_domain}"
},
"summary": "Checks the domain's DNS records now instead of on the next sweep.",
"verb": "verify"
}
],
"noun": "mail-domains",
"resource_type": "notify.sylphx.com/EmailDomain"
},
{
"collection": "mail_routes",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/mail_domains/*/mail_routes/*}",
"method": "notify.mail_routes.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mail_domains/{mail_domain}/mail_routes/{mail_route}"
},
"summary": "Gets a route.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/mail_domains/*}/mail_routes",
"method": "notify.mail_routes.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mail_domains/{mail_domain}"
},
"summary": "Lists an email domain's routes.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mail_domains/{mail_domain}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "route.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "route.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "route.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "route.spec.match.address",
"flag": "--spec.match.address",
"summary": "A local part, for example `support`. A local part with a `+tag` also matches its route.",
"type": "string"
},
{
"field": "route.spec.match.pattern",
"flag": "--spec.match.pattern",
"summary": "A glob on the local part, for example `billing-*`.",
"type": "string"
},
{
"field": "route.spec.match.catch_all",
"flag": "--spec.match.catch-all",
"summary": "Every local part no other route matches.",
"type": "bool"
},
{
"field": "route.spec.actions",
"flag": "--spec.actions",
"repeated": true,
"required": true,
"summary": "What happens to the mail: one or more mailbox and forward actions, or one reject.",
"type": "json"
},
{
"field": "route.spec.spam",
"flag": "--spec.spam",
"summary": "What happens to mail the spam filter judges spam; `DELIVER` when unset.",
"type": "enum",
"values": [
"deliver",
"drop",
"reject"
]
},
{
"field": "route.spec.enabled",
"flag": "--spec.enabled",
"summary": "A disabled route matches nothing.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/mail_domains/*}/mail_routes",
"method": "notify.mail_routes.create",
"permission": "notify:write",
"positional": {
"arg": "ID",
"field": "route_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "route",
"summary": "Creates a route.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "route.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "route.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "route.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "route.spec.match.address",
"flag": "--spec.match.address",
"summary": "A local part, for example `support`. A local part with a `+tag` also matches its route.",
"type": "string"
},
{
"field": "route.spec.match.pattern",
"flag": "--spec.match.pattern",
"summary": "A glob on the local part, for example `billing-*`.",
"type": "string"
},
{
"field": "route.spec.match.catch_all",
"flag": "--spec.match.catch-all",
"summary": "Every local part no other route matches.",
"type": "bool"
},
{
"field": "route.spec.actions",
"flag": "--spec.actions",
"repeated": true,
"required": true,
"summary": "What happens to the mail: one or more mailbox and forward actions, or one reject.",
"type": "json"
},
{
"field": "route.spec.spam",
"flag": "--spec.spam",
"summary": "What happens to mail the spam filter judges spam; `DELIVER` when unset.",
"type": "enum",
"values": [
"deliver",
"drop",
"reject"
]
},
{
"field": "route.spec.enabled",
"flag": "--spec.enabled",
"summary": "A disabled route matches nothing.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the route when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{route.name=orgs/*/projects/*/envs/*/mail_domains/*/mail_routes/*}",
"method": "notify.mail_routes.update",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "route.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mail_domains/{mail_domain}/mail_routes/{mail_route}"
},
"resource_field": "route",
"sends_etag": true,
"summary": "Updates a route.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the route does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/mail_domains/*/mail_routes/*}",
"method": "notify.mail_routes.delete",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mail_domains/{mail_domain}/mail_routes/{mail_route}"
},
"summary": "Deletes a route.",
"verb": "delete"
}
],
"noun": "mail-routes",
"resource_type": "notify.sylphx.com/Route"
},
{
"collection": "senders",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/senders/*}",
"method": "notify.senders.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/senders/{sender}"
},
"summary": "Gets a sender.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/senders",
"method": "notify.senders.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists senders.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "sender.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "sender.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "sender.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "sender.spec.sms.phone_number",
"flag": "--spec.sms.phone-number",
"summary": "An E.164 number.",
"type": "string"
},
{
"field": "sender.spec.sms.sender_key",
"flag": "--spec.sms.sender-key",
"summary": "An alphanumeric sender id, where the region allows one.",
"type": "string"
},
{
"field": "sender.spec.sms.region_codes",
"flag": "--spec.sms.region-codes",
"repeated": true,
"summary": "CLDR region codes the origin is registered for.",
"type": "string"
},
{
"field": "sender.spec.push.platform",
"flag": "--spec.push.platform",
"summary": "The push platform.",
"type": "enum",
"values": [
"apns",
"fcm",
"web_push"
]
},
{
"field": "sender.spec.push.connection",
"flag": "--spec.push.connection",
"summary": "The Connection holding the APNs, FCM, or VAPID credentials.",
"type": "string"
},
{
"field": "sender.spec.push.app_key",
"flag": "--spec.push.app-key",
"summary": "The bundle id, package name, or web origin.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/senders",
"method": "notify.senders.create",
"permission": "notify:write",
"positional": {
"arg": "ID",
"field": "sender_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "sender",
"summary": "Creates a sender.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "sender.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "sender.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "sender.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "sender.spec.sms.phone_number",
"flag": "--spec.sms.phone-number",
"summary": "An E.164 number.",
"type": "string"
},
{
"field": "sender.spec.sms.sender_key",
"flag": "--spec.sms.sender-key",
"summary": "An alphanumeric sender id, where the region allows one.",
"type": "string"
},
{
"field": "sender.spec.sms.region_codes",
"flag": "--spec.sms.region-codes",
"repeated": true,
"summary": "CLDR region codes the origin is registered for.",
"type": "string"
},
{
"field": "sender.spec.push.platform",
"flag": "--spec.push.platform",
"summary": "The push platform.",
"type": "enum",
"values": [
"apns",
"fcm",
"web_push"
]
},
{
"field": "sender.spec.push.connection",
"flag": "--spec.push.connection",
"summary": "The Connection holding the APNs, FCM, or VAPID credentials.",
"type": "string"
},
{
"field": "sender.spec.push.app_key",
"flag": "--spec.push.app-key",
"summary": "The bundle id, package name, or web origin.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the sender when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{sender.name=orgs/*/projects/*/envs/*/senders/*}",
"method": "notify.senders.update",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "sender.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/senders/{sender}"
},
"resource_field": "sender",
"sends_etag": true,
"summary": "Updates a sender.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the sender does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/senders/*}",
"method": "notify.senders.delete",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/senders/{sender}"
},
"summary": "Deletes a sender.",
"verb": "delete"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/senders/*}:verify",
"method": "notify.senders.verify",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/senders/{sender}"
},
"summary": "Re-checks the sender's registration or credentials now.",
"verb": "verify"
}
],
"noun": "senders",
"resource_type": "notify.sylphx.com/Sender"
},
{
"collection": "recipients",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/recipients/*}",
"method": "notify.recipients.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}"
},
"summary": "Gets a recipient.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/recipients",
"method": "notify.recipients.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists recipients.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "recipient.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "recipient.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "recipient.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "recipient.external_key",
"flag": "--external-key",
"summary": "The customer's own id for this user, for example an Auth end user name.",
"type": "string"
},
{
"field": "recipient.email_addresses",
"flag": "--email-addresses",
"repeated": true,
"summary": "Email addresses, first is preferred.",
"type": "string"
},
{
"field": "recipient.phone_numbers",
"flag": "--phone-numbers",
"repeated": true,
"summary": "E.164 phone numbers, first is preferred.",
"type": "string"
},
{
"field": "recipient.devices",
"flag": "--devices",
"repeated": true,
"summary": "Push devices.",
"type": "json"
},
{
"field": "recipient.language_code",
"flag": "--language-code",
"summary": "BCP 47 language for templates; default the environment's.",
"type": "string"
},
{
"field": "recipient.time_zone",
"flag": "--time-zone",
"summary": "IANA time zone for quiet hours and digests.",
"type": "string"
},
{
"field": "recipient.test",
"flag": "--test",
"summary": "A test recipient: its messages are rendered and captured on the Message, never delivered. An email address whose local part carries `+sylphx_test` is a test address whatever this says.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/recipients",
"method": "notify.recipients.create",
"permission": "notify:write",
"positional": {
"arg": "ID",
"field": "recipient_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "recipient",
"summary": "Creates a recipient.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "recipient.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "recipient.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "recipient.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "recipient.external_key",
"flag": "--external-key",
"summary": "The customer's own id for this user, for example an Auth end user name.",
"type": "string"
},
{
"field": "recipient.email_addresses",
"flag": "--email-addresses",
"repeated": true,
"summary": "Email addresses, first is preferred.",
"type": "string"
},
{
"field": "recipient.phone_numbers",
"flag": "--phone-numbers",
"repeated": true,
"summary": "E.164 phone numbers, first is preferred.",
"type": "string"
},
{
"field": "recipient.devices",
"flag": "--devices",
"repeated": true,
"summary": "Push devices.",
"type": "json"
},
{
"field": "recipient.language_code",
"flag": "--language-code",
"summary": "BCP 47 language for templates; default the environment's.",
"type": "string"
},
{
"field": "recipient.time_zone",
"flag": "--time-zone",
"summary": "IANA time zone for quiet hours and digests.",
"type": "string"
},
{
"field": "recipient.test",
"flag": "--test",
"summary": "A test recipient: its messages are rendered and captured on the Message, never delivered. An email address whose local part carries `+sylphx_test` is a test address whatever this says.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the recipient when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{recipient.name=orgs/*/projects/*/envs/*/recipients/*}",
"method": "notify.recipients.update",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "recipient.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}"
},
"resource_field": "recipient",
"sends_etag": true,
"summary": "Updates a recipient.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the recipient does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete the recipient's preferences and inbox items.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/recipients/*}",
"method": "notify.recipients.delete",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}"
},
"summary": "Deletes a recipient.",
"verb": "delete"
}
],
"noun": "recipients",
"resource_type": "notify.sylphx.com/Recipient"
},
{
"collection": "preferences",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/recipients/*/preferences/*}",
"method": "notify.preferences.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}/preferences/{preference}"
},
"summary": "Gets a preference.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/recipients/*}/preferences",
"method": "notify.preferences.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}"
},
"summary": "Lists preferences.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "preference.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "preference.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "preference.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "preference.channels",
"flag": "--channels",
"repeated": true,
"summary": "Channels the topic may use; empty mutes the topic.",
"type": "enum",
"values": [
"email",
"sms",
"push",
"inbox"
]
},
{
"field": "preference.digest_interval",
"flag": "--digest-interval",
"summary": "Batch this topic into a digest at most this often; unset sends each message.",
"type": "duration"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the preference when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{preference.name=orgs/*/projects/*/envs/*/recipients/*/preferences/*}",
"method": "notify.preferences.update",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "preference.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}/preferences/{preference}"
},
"resource_field": "preference",
"sends_etag": true,
"summary": "Updates a preference.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the preference does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/recipients/*/preferences/*}",
"method": "notify.preferences.delete",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}/preferences/{preference}"
},
"summary": "Deletes a preference.",
"verb": "delete"
}
],
"noun": "preferences",
"resource_type": "notify.sylphx.com/Preference"
},
{
"collection": "suppressions",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/suppressions/*}",
"method": "notify.suppressions.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/suppressions/{suppression}"
},
"summary": "Gets a suppression.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/suppressions",
"method": "notify.suppressions.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists suppressions.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "suppression.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "suppression.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "suppression.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "suppression.channel",
"flag": "--channel",
"required": true,
"summary": "The channel.",
"type": "enum",
"values": [
"email",
"sms",
"push",
"inbox"
]
},
{
"field": "suppression.address",
"flag": "--address",
"required": true,
"summary": "The suppressed address, number, or device token.",
"type": "string"
},
{
"field": "suppression.reason",
"flag": "--reason",
"required": true,
"summary": "Why.",
"type": "enum",
"values": [
"bounce",
"complaint",
"carrier_opt_out",
"unsubscribe",
"uninstalled",
"manual"
]
},
{
"field": "suppression.topic",
"flag": "--topic",
"summary": "Limit the suppression to one topic; unset suppresses every topic.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/suppressions",
"method": "notify.suppressions.create",
"permission": "notify:write",
"positional": {
"arg": "ID",
"field": "suppression_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "suppression",
"summary": "Creates a suppression.",
"verb": "create"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the suppression does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/suppressions/*}",
"method": "notify.suppressions.delete",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/suppressions/{suppression}"
},
"summary": "Deletes a suppression.",
"verb": "delete"
}
],
"noun": "suppressions",
"resource_type": "notify.sylphx.com/Suppression"
},
{
"collection": "templates",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/templates/*}",
"method": "notify.templates.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/templates/{template}"
},
"summary": "Gets a template.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/templates",
"method": "notify.templates.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists templates.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "template.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "template.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "template.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "template.spec.email.sender_address",
"flag": "--spec.email.sender-address",
"summary": "The From address; its domain is a verified Email Domain.",
"type": "string"
},
{
"field": "template.spec.email.subject",
"flag": "--spec.email.subject",
"summary": "The subject.",
"type": "string"
},
{
"field": "template.spec.email.html_body",
"flag": "--spec.email.html-body",
"summary": "The HTML body.",
"type": "string"
},
{
"field": "template.spec.email.text_body",
"flag": "--spec.email.text-body",
"summary": "The plain-text body.",
"type": "string"
},
{
"field": "template.spec.email.sender_name",
"flag": "--spec.email.sender-name",
"summary": "The From display name, for example the app's name.",
"type": "string"
},
{
"field": "template.spec.sms.sender",
"flag": "--spec.sms.sender",
"summary": "The SMS Sender.",
"type": "string"
},
{
"field": "template.spec.sms.body",
"flag": "--spec.sms.body",
"summary": "The body.",
"type": "string"
},
{
"field": "template.spec.push.title",
"flag": "--spec.push.title",
"summary": "The title.",
"type": "string"
},
{
"field": "template.spec.push.body",
"flag": "--spec.push.body",
"summary": "The body.",
"type": "string"
},
{
"field": "template.spec.push.data",
"flag": "--spec.push.data",
"summary": "Data delivered with the notification.",
"type": "json"
},
{
"field": "template.spec.inbox.title",
"flag": "--spec.inbox.title",
"summary": "The title.",
"type": "string"
},
{
"field": "template.spec.inbox.body",
"flag": "--spec.inbox.body",
"summary": "The body.",
"type": "string"
},
{
"field": "template.spec.inbox.action_uri",
"flag": "--spec.inbox.action-uri",
"summary": "Where the item links.",
"type": "string"
},
{
"field": "template.spec.send_limit.min_interval",
"flag": "--spec.send-limit.min-interval",
"summary": "At least this long between two messages to one recipient.",
"type": "duration"
},
{
"field": "template.spec.send_limit.max_per_hour",
"flag": "--spec.send-limit.max-per-hour",
"summary": "At most this many messages to one recipient in any hour; 0 is no limit.",
"type": "int"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/templates",
"method": "notify.templates.create",
"permission": "notify:write",
"positional": {
"arg": "ID",
"field": "template_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "template",
"summary": "Creates a template.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "template.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "template.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "template.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "template.spec.email.sender_address",
"flag": "--spec.email.sender-address",
"summary": "The From address; its domain is a verified Email Domain.",
"type": "string"
},
{
"field": "template.spec.email.subject",
"flag": "--spec.email.subject",
"summary": "The subject.",
"type": "string"
},
{
"field": "template.spec.email.html_body",
"flag": "--spec.email.html-body",
"summary": "The HTML body.",
"type": "string"
},
{
"field": "template.spec.email.text_body",
"flag": "--spec.email.text-body",
"summary": "The plain-text body.",
"type": "string"
},
{
"field": "template.spec.email.sender_name",
"flag": "--spec.email.sender-name",
"summary": "The From display name, for example the app's name.",
"type": "string"
},
{
"field": "template.spec.sms.sender",
"flag": "--spec.sms.sender",
"summary": "The SMS Sender.",
"type": "string"
},
{
"field": "template.spec.sms.body",
"flag": "--spec.sms.body",
"summary": "The body.",
"type": "string"
},
{
"field": "template.spec.push.title",
"flag": "--spec.push.title",
"summary": "The title.",
"type": "string"
},
{
"field": "template.spec.push.body",
"flag": "--spec.push.body",
"summary": "The body.",
"type": "string"
},
{
"field": "template.spec.push.data",
"flag": "--spec.push.data",
"summary": "Data delivered with the notification.",
"type": "json"
},
{
"field": "template.spec.inbox.title",
"flag": "--spec.inbox.title",
"summary": "The title.",
"type": "string"
},
{
"field": "template.spec.inbox.body",
"flag": "--spec.inbox.body",
"summary": "The body.",
"type": "string"
},
{
"field": "template.spec.inbox.action_uri",
"flag": "--spec.inbox.action-uri",
"summary": "Where the item links.",
"type": "string"
},
{
"field": "template.spec.send_limit.min_interval",
"flag": "--spec.send-limit.min-interval",
"summary": "At least this long between two messages to one recipient.",
"type": "duration"
},
{
"field": "template.spec.send_limit.max_per_hour",
"flag": "--spec.send-limit.max-per-hour",
"summary": "At most this many messages to one recipient in any hour; 0 is no limit.",
"type": "int"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the template when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{template.name=orgs/*/projects/*/envs/*/templates/*}",
"method": "notify.templates.update",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "template.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/templates/{template}"
},
"resource_field": "template",
"sends_etag": true,
"summary": "Updates a template.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the template does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/templates/*}",
"method": "notify.templates.delete",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/templates/{template}"
},
"summary": "Deletes a template.",
"verb": "delete"
}
],
"noun": "templates",
"resource_type": "notify.sylphx.com/Template"
},
{
"collection": "messages",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/messages/*}",
"method": "notify.messages.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/messages/{message}"
},
"summary": "Gets a message.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/messages",
"method": "notify.messages.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists messages.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "message.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "message.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "message.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "message.recipient",
"flag": "--recipient",
"required": true,
"summary": "The recipient.",
"type": "string"
},
{
"field": "message.topic",
"flag": "--topic",
"required": true,
"summary": "The topic preferences are checked against, for example `billing`.",
"type": "string"
},
{
"field": "message.template",
"flag": "--template",
"summary": "The template to render; required unless `mailbox` and `content` are set.",
"type": "string"
},
{
"field": "message.data",
"flag": "--data",
"summary": "Template variables.",
"type": "json"
},
{
"field": "message.channels",
"flag": "--channels",
"repeated": true,
"summary": "Restrict to these channels, in fallback order; empty uses the recipient's preferences.",
"type": "enum",
"values": [
"email",
"sms",
"push",
"inbox"
]
},
{
"field": "message.send_time",
"flag": "--send-time",
"summary": "Send no earlier than this.",
"type": "timestamp"
},
{
"field": "message.delivery_deadline_time",
"flag": "--delivery-deadline-time",
"summary": "Deliver no later than this; a delivery still open then fails with `expired`. Unset retries for up to a day. The message record is kept.",
"type": "timestamp"
},
{
"field": "message.mailbox",
"flag": "--mailbox",
"summary": "Send as this mailbox (its address, display name and, for a connected mailbox, its own SMTP) instead of a verified Email Domain.",
"type": "string"
},
{
"field": "message.content.subject",
"flag": "--content.subject",
"summary": "The subject.",
"type": "string"
},
{
"field": "message.content.text_body",
"flag": "--content.text-body",
"summary": "The plain-text body.",
"type": "string"
},
{
"field": "message.content.html_body",
"flag": "--content.html-body",
"summary": "The HTML body.",
"type": "string"
},
{
"field": "message.parent_message_id",
"flag": "--parent-message-id",
"summary": "In-Reply-To: the Message-ID this answers, without angle brackets.",
"type": "string"
},
{
"field": "message.references",
"flag": "--references",
"repeated": true,
"summary": "The thread's Message-IDs, oldest first, without angle brackets.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/messages",
"method": "notify.messages.create",
"permission": "notify:send",
"positional": {
"arg": "ID",
"field": "message_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "message",
"summary": "Sends a Message.",
"verb": "send"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/messages/*}:cancel",
"method": "notify.messages.cancel",
"permission": "notify:send",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/messages/{message}"
},
"summary": "Cancels a Message whose deliveries have not been handed off.",
"verb": "cancel"
}
],
"noun": "messages",
"resource_type": "notify.sylphx.com/Message"
},
{
"collection": "mailboxes",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/mailboxes/*}",
"method": "notify.mailboxes.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mailboxes/{mailbox}"
},
"summary": "Gets a mailbox.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/mailboxes",
"method": "notify.mailboxes.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists mailboxes.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "mailbox.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "mailbox.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "mailbox.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "mailbox.spec.kind",
"flag": "--spec.kind",
"required": true,
"summary": "Connected or hosted.",
"type": "enum",
"values": [
"connected",
"hosted"
]
},
{
"field": "mailbox.spec.address",
"flag": "--spec.address",
"required": true,
"summary": "The address, for example `support@example.com`.",
"type": "string"
},
{
"field": "mailbox.spec.display_name",
"flag": "--spec.display-name",
"summary": "The From display name of mail sent as this mailbox.",
"type": "string"
},
{
"field": "mailbox.spec.imap.host",
"flag": "--spec.imap.host",
"summary": "The host name.",
"type": "string"
},
{
"field": "mailbox.spec.imap.port",
"flag": "--spec.imap.port",
"summary": "The port; IMAP 993 and SMTP 465 when unset.",
"type": "int"
},
{
"field": "mailbox.spec.imap.username",
"flag": "--spec.imap.username",
"summary": "The login user; the mailbox address when unset.",
"type": "string"
},
{
"field": "mailbox.spec.imap.security",
"flag": "--spec.imap.security",
"summary": "How the connection is secured.",
"type": "enum",
"values": [
"tls",
"starttls"
]
},
{
"field": "mailbox.spec.smtp.host",
"flag": "--spec.smtp.host",
"summary": "The host name.",
"type": "string"
},
{
"field": "mailbox.spec.smtp.port",
"flag": "--spec.smtp.port",
"summary": "The port; IMAP 993 and SMTP 465 when unset.",
"type": "int"
},
{
"field": "mailbox.spec.smtp.username",
"flag": "--spec.smtp.username",
"summary": "The login user; the mailbox address when unset.",
"type": "string"
},
{
"field": "mailbox.spec.smtp.security",
"flag": "--spec.smtp.security",
"summary": "How the connection is secured.",
"type": "enum",
"values": [
"tls",
"starttls"
]
},
{
"field": "mailbox.spec.password",
"flag": "--spec.password",
"sensitive": true,
"summary": "The login password of both servers; write-only, sealed at rest.",
"type": "string"
},
{
"field": "mailbox.spec.append_sent",
"flag": "--spec.append-sent",
"summary": "Save a copy of mail sent as this mailbox to its Sent folder (IMAP APPEND); off when the provider saves one itself.",
"type": "bool"
},
{
"field": "mailbox.spec.backfill_start_time",
"flag": "--spec.backfill-start-time",
"summary": "Read mail received on or after this day on the first poll.",
"type": "timestamp"
},
{
"field": "mailbox.spec.enabled",
"flag": "--spec.enabled",
"summary": "Poll and send; a disabled mailbox keeps its records.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/mailboxes",
"method": "notify.mailboxes.create",
"permission": "notify:write",
"positional": {
"arg": "ID",
"field": "mailbox_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "mailbox",
"summary": "Creates a mailbox.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "mailbox.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "mailbox.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "mailbox.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "mailbox.spec.display_name",
"flag": "--spec.display-name",
"summary": "The From display name of mail sent as this mailbox.",
"type": "string"
},
{
"field": "mailbox.spec.imap.host",
"flag": "--spec.imap.host",
"summary": "The host name.",
"type": "string"
},
{
"field": "mailbox.spec.imap.port",
"flag": "--spec.imap.port",
"summary": "The port; IMAP 993 and SMTP 465 when unset.",
"type": "int"
},
{
"field": "mailbox.spec.imap.username",
"flag": "--spec.imap.username",
"summary": "The login user; the mailbox address when unset.",
"type": "string"
},
{
"field": "mailbox.spec.imap.security",
"flag": "--spec.imap.security",
"summary": "How the connection is secured.",
"type": "enum",
"values": [
"tls",
"starttls"
]
},
{
"field": "mailbox.spec.smtp.host",
"flag": "--spec.smtp.host",
"summary": "The host name.",
"type": "string"
},
{
"field": "mailbox.spec.smtp.port",
"flag": "--spec.smtp.port",
"summary": "The port; IMAP 993 and SMTP 465 when unset.",
"type": "int"
},
{
"field": "mailbox.spec.smtp.username",
"flag": "--spec.smtp.username",
"summary": "The login user; the mailbox address when unset.",
"type": "string"
},
{
"field": "mailbox.spec.smtp.security",
"flag": "--spec.smtp.security",
"summary": "How the connection is secured.",
"type": "enum",
"values": [
"tls",
"starttls"
]
},
{
"field": "mailbox.spec.password",
"flag": "--spec.password",
"sensitive": true,
"summary": "The login password of both servers; write-only, sealed at rest.",
"type": "string"
},
{
"field": "mailbox.spec.append_sent",
"flag": "--spec.append-sent",
"summary": "Save a copy of mail sent as this mailbox to its Sent folder (IMAP APPEND); off when the provider saves one itself.",
"type": "bool"
},
{
"field": "mailbox.spec.backfill_start_time",
"flag": "--spec.backfill-start-time",
"summary": "Read mail received on or after this day on the first poll.",
"type": "timestamp"
},
{
"field": "mailbox.spec.enabled",
"flag": "--spec.enabled",
"summary": "Poll and send; a disabled mailbox keeps its records.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the mailbox when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{mailbox.name=orgs/*/projects/*/envs/*/mailboxes/*}",
"method": "notify.mailboxes.update",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "mailbox.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mailboxes/{mailbox}"
},
"resource_field": "mailbox",
"sends_etag": true,
"summary": "Updates a mailbox.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the mailbox does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Delete its inbound email with it; a mailbox holding inbound email is not deleted without it.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/mailboxes/*}",
"method": "notify.mailboxes.delete",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mailboxes/{mailbox}"
},
"summary": "Deletes a mailbox and its inbound email.",
"verb": "delete"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "address",
"flag": "--address",
"required": true,
"summary": "The email address whose data is removed.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/mailboxes/*}:eraseAddress",
"method": "notify.mailboxes.erase_address",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mailboxes/{mailbox}"
},
"summary": "Removes an address's personal data from every inbound email of the mailbox that it sent or that names it, keeping the dedupe keys so a poll never brings the mail back.",
"verb": "erase-address"
}
],
"noun": "mailboxes",
"resource_type": "notify.sylphx.com/Mailbox"
},
{
"collection": "inbound_emails",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/mailboxes/*/inbound_emails/*}",
"method": "notify.inbound_emails.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mailboxes/{mailbox}/inbound_emails/{inbound_email}"
},
"summary": "Gets an inbound email.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/mailboxes/*}/inbound_emails",
"method": "notify.inbound_emails.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mailboxes/{mailbox}"
},
"summary": "Lists a mailbox's inbound email in feed order, oldest first.",
"verb": "list"
}
],
"noun": "inbound-emails",
"resource_type": "notify.sylphx.com/InboundEmail"
},
{
"collection": "inbox_items",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/recipients/*/inbox_items/*}",
"method": "notify.inbox_items.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}/inbox_items/{inbox_item}"
},
"summary": "Gets an inbox item.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/recipients/*}/inbox_items",
"method": "notify.inbox_items.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}"
},
"summary": "Lists inbox items.",
"verb": "list"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/recipients/*/inbox_items/*}:markRead",
"method": "notify.inbox_items.mark_read",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}/inbox_items/{inbox_item}"
},
"summary": "Marks an inbox item read.",
"verb": "mark-read"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/recipients/*/inbox_items/*}:markUnread",
"method": "notify.inbox_items.mark_unread",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}/inbox_items/{inbox_item}"
},
"summary": "Marks an inbox item unread.",
"verb": "mark-unread"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/recipients/*/inbox_items/*}:archive",
"method": "notify.inbox_items.archive",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}/inbox_items/{inbox_item}"
},
"summary": "Archives an inbox item.",
"verb": "archive"
}
],
"noun": "inbox-items",
"resource_type": "notify.sylphx.com/InboxItem"
},
{
"collection": "broadcasts",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/broadcasts/*}",
"method": "notify.broadcasts.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/broadcasts/{broadcast}"
},
"summary": "Gets a broadcast.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/broadcasts",
"method": "notify.broadcasts.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists broadcasts.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "broadcast.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "broadcast.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "broadcast.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "broadcast.spec.topic",
"flag": "--spec.topic",
"required": true,
"summary": "The topic every message carries.",
"type": "string"
},
{
"field": "broadcast.spec.template",
"flag": "--spec.template",
"required": true,
"summary": "The template to render.",
"type": "string"
},
{
"field": "broadcast.spec.segment_filter",
"flag": "--spec.segment-filter",
"required": true,
"summary": "AIP-160 filter over recipient labels and fields selecting the segment.",
"type": "string"
},
{
"field": "broadcast.spec.data",
"flag": "--spec.data",
"summary": "Template variables shared by every message.",
"type": "json"
},
{
"field": "broadcast.spec.send_time",
"flag": "--spec.send-time",
"summary": "When to send; unset sends only on `:send`.",
"type": "timestamp"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/broadcasts",
"method": "notify.broadcasts.create",
"permission": "notify:write",
"positional": {
"arg": "ID",
"field": "broadcast_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "broadcast",
"summary": "Creates a broadcast.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "broadcast.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "broadcast.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "broadcast.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "broadcast.spec.topic",
"flag": "--spec.topic",
"required": true,
"summary": "The topic every message carries.",
"type": "string"
},
{
"field": "broadcast.spec.template",
"flag": "--spec.template",
"required": true,
"summary": "The template to render.",
"type": "string"
},
{
"field": "broadcast.spec.segment_filter",
"flag": "--spec.segment-filter",
"required": true,
"summary": "AIP-160 filter over recipient labels and fields selecting the segment.",
"type": "string"
},
{
"field": "broadcast.spec.data",
"flag": "--spec.data",
"summary": "Template variables shared by every message.",
"type": "json"
},
{
"field": "broadcast.spec.send_time",
"flag": "--spec.send-time",
"summary": "When to send; unset sends only on `:send`.",
"type": "timestamp"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the broadcast when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{broadcast.name=orgs/*/projects/*/envs/*/broadcasts/*}",
"method": "notify.broadcasts.update",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "broadcast.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/broadcasts/{broadcast}"
},
"resource_field": "broadcast",
"sends_etag": true,
"summary": "Updates a broadcast.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the broadcast does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/broadcasts/*}",
"method": "notify.broadcasts.delete",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/broadcasts/{broadcast}"
},
"summary": "Deletes a broadcast.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/broadcasts/*}:send",
"method": "notify.broadcasts.send",
"permission": "notify:send",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/broadcasts/{broadcast}"
},
"summary": "Sends a Broadcast now.",
"verb": "send"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/broadcasts/*}:cancel",
"method": "notify.broadcasts.cancel",
"permission": "notify:send",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/broadcasts/{broadcast}"
},
"summary": "Cancels a Broadcast; messages already admitted still deliver.",
"verb": "cancel"
}
],
"noun": "broadcasts",
"resource_type": "notify.sylphx.com/Broadcast"
}
],
"commands": [],
"display_name": "Sylphx Notify",
"noun": "notify",
"stage": "preview"
},
{
"collections": [
{
"collection": "log_entries",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/log_entries/*}",
"method": "observability.log_entries.get",
"permission": "observability:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/log_entries/{log_entry}"
},
"summary": "Gets a log entry.",
"verb": "get"
},
{
"effect": "write",
"flags": [
{
"field": "log_entries",
"flag": "--log-entries",
"repeated": true,
"required": true,
"summary": "The entries, at most 1000; only record fields are read.",
"type": "json"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/log_entries:write",
"method": "observability.log_entries.write",
"permission": "observability:ingest",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Ingests a batch of log entries atomically. The same `Idempotency-Key` and digest replays the same batch; a different digest under the key conflicts.",
"verb": "write"
},
{
"effect": "read",
"flags": [
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over the typed, allowlisted fields.",
"type": "string"
},
{
"field": "start_time",
"flag": "--start-time",
"required": true,
"summary": "The interval start; required, at most 31 days before `end_time`.",
"type": "timestamp"
},
{
"field": "end_time",
"flag": "--end-time",
"summary": "The interval end; default now.",
"type": "timestamp"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "`time desc` (default) or `time asc`.",
"type": "string"
},
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 100, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page; bound to tenant, interval, filter, and order.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/log_entries:query",
"method": "observability.log_entries.query",
"permission": "observability:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Queries the environment's log entries over a bounded interval; follow a trace with `trace_id = \"...\"`.",
"verb": "query"
}
],
"noun": "log-entries",
"resource_type": "observability.sylphx.com/LogEntry"
},
{
"collection": "traces",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/traces/*}",
"method": "observability.traces.get",
"permission": "observability:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/traces/{trace}"
},
"summary": "Gets a trace.",
"verb": "get"
},
{
"effect": "write",
"flags": [
{
"field": "spans",
"flag": "--spans",
"repeated": true,
"required": true,
"summary": "The spans, at most 1000.",
"type": "json"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/traces:writeSpans",
"method": "observability.traces.write_spans",
"permission": "observability:ingest",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Ingests a batch of spans atomically; a span's parent and time invariants are validated. Replay rules are those of WriteLogEntries.",
"verb": "write-spans"
},
{
"effect": "read",
"flags": [
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over the typed, allowlisted fields.",
"type": "string"
},
{
"field": "start_time",
"flag": "--start-time",
"required": true,
"summary": "The interval start; required, at most 31 days before `end_time`.",
"type": "timestamp"
},
{
"field": "end_time",
"flag": "--end-time",
"summary": "The interval end; default now.",
"type": "timestamp"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "`time desc` (default) or `time asc`.",
"type": "string"
},
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 100, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page; bound to tenant, interval, filter, and order.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/traces:query",
"method": "observability.traces.query",
"permission": "observability:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Queries the environment's traces over a bounded interval, returning summaries without spans.",
"verb": "query"
}
],
"noun": "traces",
"resource_type": "observability.sylphx.com/Trace"
},
{
"collection": "error_groups",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/error_groups/*}",
"method": "observability.error_groups.get",
"permission": "observability:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/error_groups/{error_group}"
},
"summary": "Gets an error group.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/error_groups",
"method": "observability.error_groups.list",
"paginates": true,
"permission": "observability:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists error groups; filter by `state`, `service_name`, and `last_seen_time`.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "error_event",
"flag": "--error-event",
"required": true,
"summary": "The occurrence; only record fields are read.",
"type": "json"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/error_groups:capture",
"method": "observability.error_groups.capture",
"permission": "observability:ingest",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Captures one error occurrence. It is grouped by `fingerprint` when the caller sets one, else by exception type and the symbolicated in-app stack; release is never part of the group. A new occurrence reopens a resolved group. Secrets and personal data are scrubbed by the environment's Scrubbing Policy before storage. A fingerprint-equal replay bills no second new-error unit. Under quota pressure the response says what to sample. Browsers call it with a publishable key that holds `observability:ingest` (CORS allowed, rate-limited per environment).",
"verb": "capture"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/error_groups/*}:acknowledge",
"method": "observability.error_groups.acknowledge",
"permission": "observability:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/error_groups/{error_group}"
},
"summary": "Acknowledges an error group.",
"verb": "acknowledge"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/error_groups/*}:resolve",
"method": "observability.error_groups.resolve",
"permission": "observability:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/error_groups/{error_group}"
},
"summary": "Resolves an error group; a new occurrence reopens it.",
"verb": "resolve"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/error_groups/*}:reopen",
"method": "observability.error_groups.reopen",
"permission": "observability:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/error_groups/{error_group}"
},
"summary": "Reopens a resolved or acknowledged error group.",
"verb": "reopen"
}
],
"noun": "error-groups",
"resource_type": "observability.sylphx.com/ErrorGroup"
},
{
"collection": "error_events",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/error_groups/*/error_events/*}",
"method": "observability.error_events.get",
"permission": "observability:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/error_groups/{error_group}/error_events/{error_event}"
},
"summary": "Gets an error event.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/error_groups/*}/error_events",
"method": "observability.error_events.list",
"paginates": true,
"permission": "observability:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/error_groups/{error_group}"
},
"summary": "Lists error events.",
"verb": "list"
}
],
"noun": "error-events",
"resource_type": "observability.sylphx.com/ErrorEvent"
},
{
"collection": "source_maps",
"commands": [
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "source_map.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "source_map.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "source_map.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "source_map.release",
"flag": "--release",
"required": true,
"summary": "The release the map belongs to, as sent in `ErrorEvent.release`.",
"type": "string"
},
{
"field": "source_map.file_url",
"flag": "--file-url",
"required": true,
"summary": "The minified file the map describes: its URL (`https://app.example.com/assets/index-3f2a.js`) or its path (`/assets/index-3f2a.js`). A frame matches on the URL path.",
"type": "string"
},
{
"field": "source_map.content",
"flag": "--content",
"required": true,
"summary": "The source map JSON (revision 3), at most 16 MiB. Written, never read back.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/source_maps",
"method": "observability.source_maps.create",
"permission": "observability:write",
"positional": null,
"resource_field": "source_map",
"summary": "Uploads a source map for one release and minified file. Uploading the same release and file again replaces it.",
"verb": "create"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/source_maps/*}",
"method": "observability.source_maps.get",
"permission": "observability:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/source_maps/{source_map}"
},
"summary": "Gets a source map (without its content).",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many, up to 100.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "The `next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter; `release = \"…\"` only.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/source_maps",
"method": "observability.source_maps.list",
"paginates": true,
"permission": "observability:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists source maps, newest first; filter by `release`.",
"verb": "list"
}
],
"noun": "source-maps",
"resource_type": "observability.sylphx.com/SourceMap"
},
{
"collection": "scrubbing_policies",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/scrubbing_policies/*}",
"method": "observability.scrubbing_policies.get",
"permission": "observability:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/scrubbing_policies/{scrubbing_policy}"
},
"summary": "Gets the environment's scrubbing policy (`scrubbing_policies/default`).",
"verb": "get"
},
{
"effect": "write",
"flags": [
{
"field": "scrubbing_policy.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "scrubbing_policy.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "scrubbing_policy.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "scrubbing_policy.denied_fields",
"flag": "--denied-fields",
"repeated": true,
"summary": "More field names to replace with `[Filtered]` wherever they appear in tags, extra data, request data, or breadcrumb data (case-insensitive, matched as a substring), at most 64.",
"type": "string"
},
{
"field": "scrubbing_policy.keep_emails",
"flag": "--keep-emails",
"summary": "Keep email addresses instead of replacing them with `[email]`.",
"type": "bool"
}
],
"http": "PATCH /v1/{scrubbing_policy.name=orgs/*/projects/*/envs/*/scrubbing_policies/*}",
"method": "observability.scrubbing_policies.update",
"permission": "observability:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "scrubbing_policy.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/scrubbing_policies/{scrubbing_policy}"
},
"resource_field": "scrubbing_policy",
"sends_etag": true,
"summary": "Updates the environment's scrubbing policy.",
"update_mask": "from-flags",
"verb": "update"
}
],
"noun": "scrubbing-policies",
"resource_type": "observability.sylphx.com/ScrubbingPolicy"
}
],
"commands": [],
"display_name": "Sylphx Observability",
"noun": "observability",
"stage": "preview"
},
{
"collections": [
{
"collection": "releases",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/releases/*}",
"method": "release.releases.get",
"permission": "release:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/releases/{release}"
},
"summary": "Gets a release.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/releases",
"method": "release.releases.list",
"paginates": true,
"permission": "release:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists releases in an environment, newest first by default.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "release.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "release.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "release.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "release.spec.members",
"flag": "--spec.members",
"repeated": true,
"required": true,
"summary": "The workloads, each by artifact digest. A member that names a tag or an unverified Artifact is refused.",
"type": "json"
},
{
"field": "release.spec.rollout_policy.bake_duration",
"flag": "--spec.rollout-policy.bake-duration",
"summary": "How long each wave bakes, healthy, before the next starts; default 10 minutes.",
"type": "duration"
},
{
"field": "release.spec.rollout_policy.halt_on_failure",
"flag": "--spec.rollout-policy.halt-on-failure",
"summary": "Halt the rollout when a wave's health gate fails; default true.",
"type": "bool"
},
{
"field": "release.spec.rollout_policy.skip_waves",
"flag": "--spec.rollout-policy.skip-waves",
"summary": "Skip the waves and apply to every cell together: break-glass only, and refused for any other principal.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/releases",
"method": "release.releases.create",
"permission": "release:write",
"positional": {
"arg": "ID",
"field": "release_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "release",
"summary": "Creates a release: admits it and rolls it out in waves. The Operation is done when the release is live or halted.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "releases",
"resource_type": "release.sylphx.com/Release"
},
{
"collection": "rollouts",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/rollouts/*}",
"method": "release.rollouts.get",
"permission": "release:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/rollouts/{rollout}"
},
"summary": "Gets a rollout.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/rollouts",
"method": "release.rollouts.list",
"paginates": true,
"permission": "release:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists rollouts in an environment.",
"verb": "list"
}
],
"noun": "rollouts",
"resource_type": "release.sylphx.com/Rollout"
}
],
"commands": [],
"display_name": "Sylphx Release",
"noun": "release",
"served": false,
"stage": "preview"
},
{
"collections": [
{
"collection": "scale_sets",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/scale_sets/*}",
"method": "runners.scale_sets.get",
"permission": "runners:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/scale_sets/{scale_set}"
},
"summary": "Gets a scale set.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/scale_sets",
"method": "runners.scale_sets.list",
"paginates": true,
"permission": "runners:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists scale sets in a org.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "scale_set.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "scale_set.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "scale_set.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "scale_set.spec.connection",
"flag": "--spec.connection",
"required": true,
"summary": "The Sylphx Runners installation Connection.",
"type": "string"
},
{
"field": "scale_set.spec.runner_class",
"flag": "--spec.runner-class",
"required": true,
"summary": "The class, `sylphx-<os>-<size>`, for example `sylphx-linux-standard`. It is the label workflows ask for.",
"type": "string"
},
{
"field": "scale_set.spec.runner_group",
"flag": "--spec.runner-group",
"summary": "The forge runner group to register in; default the installation's default group.",
"type": "string"
},
{
"field": "scale_set.spec.max_runners",
"flag": "--spec.max-runners",
"summary": "Concurrent runners at most; 0 means the plan's limit.",
"type": "int"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*}/scale_sets",
"method": "runners.scale_sets.create",
"permission": "runners:write",
"positional": {
"arg": "ID",
"field": "scale_set_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "scale_set",
"summary": "Creates a scale set. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "scale_set.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "scale_set.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "scale_set.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "scale_set.spec.runner_group",
"flag": "--spec.runner-group",
"summary": "The forge runner group to register in; default the installation's default group.",
"type": "string"
},
{
"field": "scale_set.spec.max_runners",
"flag": "--spec.max-runners",
"summary": "Concurrent runners at most; 0 means the plan's limit.",
"type": "int"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{scale_set.name=orgs/*/scale_sets/*}",
"method": "runners.scale_sets.update",
"permission": "runners:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "scale_set.name",
"pattern": "orgs/{org}/scale_sets/{scale_set}"
},
"resource_field": "scale_set",
"sends_etag": true,
"summary": "Updates a scale set.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete every child Resource; without it a parent with children fails with FAILED_PRECONDITION.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/scale_sets/*}",
"method": "runners.scale_sets.delete",
"permission": "runners:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/scale_sets/{scale_set}"
},
"summary": "Deletes a scale set.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "scale-sets",
"resource_type": "runners.sylphx.com/ScaleSet"
},
{
"collection": "runners",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/scale_sets/*/runners/*}",
"method": "runners.runners.get",
"permission": "runners:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/scale_sets/{scale_set}/runners/{runner}"
},
"summary": "Gets a runner.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/scale_sets/*}/runners",
"method": "runners.runners.list",
"paginates": true,
"permission": "runners:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/scale_sets/{scale_set}"
},
"summary": "Lists runners in a scale set.",
"verb": "list"
}
],
"noun": "runners",
"resource_type": "runners.sylphx.com/Runner"
}
],
"commands": [],
"display_name": "Sylphx Runners",
"noun": "runners",
"served": false,
"stage": "preview"
},
{
"collections": [
{
"collection": "sandbox_shapes",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=sandbox_shapes/*}",
"method": "sandboxes.sandbox_shapes.get",
"permission": "sandboxes:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "sandbox_shapes/{shape}"
},
"summary": "Gets a shape.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/sandbox_shapes",
"method": "sandboxes.sandbox_shapes.list",
"paginates": true,
"permission": "sandboxes:read",
"positional": null,
"summary": "Lists shapes.",
"verb": "list"
}
],
"noun": "sandbox-shapes",
"resource_type": "sandboxes.sylphx.com/Shape"
},
{
"collection": "pools",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/pools/*}",
"method": "sandboxes.pools.get",
"permission": "sandboxes:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/pools/{pool}"
},
"summary": "Gets a pool.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/pools",
"method": "sandboxes.pools.list",
"paginates": true,
"permission": "sandboxes:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists pools in a environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "pool.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "pool.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "pool.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "pool.spec.shape",
"flag": "--spec.shape",
"required": true,
"summary": "The shape.",
"type": "string"
},
{
"field": "pool.spec.image",
"flag": "--spec.image",
"required": true,
"summary": "The image: an artifact in Sylphx Artifacts, by digest, or `template:<name>`.",
"type": "string"
},
{
"field": "pool.spec.warm.min",
"flag": "--spec.warm.min",
"summary": "Warm machines kept booted.",
"type": "int"
},
{
"field": "pool.spec.warm.max",
"flag": "--spec.warm.max",
"summary": "Warm machines at most; at most 10 on free and 100 on Pro.",
"type": "int"
},
{
"field": "pool.spec.max_age",
"flag": "--spec.max-age",
"summary": "Warm machines older than this are recycled; 5 minutes to 2 hours.",
"type": "duration"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/pools",
"method": "sandboxes.pools.create",
"permission": "sandboxes:write",
"positional": {
"arg": "ID",
"field": "pool_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "pool",
"summary": "Creates a pool. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "pool.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "pool.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "pool.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "pool.spec.image",
"flag": "--spec.image",
"required": true,
"summary": "The image: an artifact in Sylphx Artifacts, by digest, or `template:<name>`.",
"type": "string"
},
{
"field": "pool.spec.warm.min",
"flag": "--spec.warm.min",
"summary": "Warm machines kept booted.",
"type": "int"
},
{
"field": "pool.spec.warm.max",
"flag": "--spec.warm.max",
"summary": "Warm machines at most; at most 10 on free and 100 on Pro.",
"type": "int"
},
{
"field": "pool.spec.max_age",
"flag": "--spec.max-age",
"summary": "Warm machines older than this are recycled; 5 minutes to 2 hours.",
"type": "duration"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{pool.name=orgs/*/projects/*/envs/*/pools/*}",
"method": "sandboxes.pools.update",
"permission": "sandboxes:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "pool.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/pools/{pool}"
},
"resource_field": "pool",
"sends_etag": true,
"summary": "Updates a pool.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/pools/*}",
"method": "sandboxes.pools.delete",
"permission": "sandboxes:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/pools/{pool}"
},
"summary": "Deletes a pool.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "pools",
"resource_type": "sandboxes.sylphx.com/Pool"
},
{
"collection": "leases",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/leases/*}",
"method": "sandboxes.leases.get",
"permission": "sandboxes:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Gets a lease.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/leases",
"method": "sandboxes.leases.list",
"paginates": true,
"permission": "sandboxes:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists leases in a environment. Filter on `meta.labels` (for example `labels.agent = \"a_123\"`), `status.state`, and `spec.kind`.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "lease.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "lease.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "lease.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "lease.spec.shape",
"flag": "--spec.shape",
"required": true,
"summary": "The shape.",
"type": "string"
},
{
"field": "lease.spec.image",
"flag": "--spec.image",
"summary": "The image: an artifact in Sylphx Artifacts, by digest, or `template:<name>` (`base`, `desktop`, `browser`, `android`). Ignored when `source_snapshot` is set.",
"type": "string"
},
{
"field": "lease.spec.kind",
"flag": "--spec.kind",
"summary": "What the machine serves; default GENERAL.",
"type": "enum",
"values": [
"general",
"browser",
"desktop",
"android"
]
},
{
"field": "lease.spec.region",
"flag": "--spec.region",
"summary": "The region; default the project's home region.",
"type": "string"
},
{
"field": "lease.spec.pool",
"flag": "--spec.pool",
"summary": "The Pool to take a warm machine from; default the platform pool for the shape and image.",
"type": "string"
},
{
"field": "lease.spec.ttl",
"flag": "--spec.ttl",
"required": true,
"summary": "The maximum wall time from grant: 1 minute to 24 hours for microVMs, 24 hours to 30 days for macOS. `:renew` extends it within the shape's bound. Reaching it ends the lease EXPIRED.",
"type": "duration"
},
{
"field": "lease.spec.idle_timeout",
"flag": "--spec.idle-timeout",
"summary": "End the lease IDLE after no data-plane call, stream input, or exec for this long; unset never idles out.",
"type": "duration"
},
{
"field": "lease.spec.network.egress",
"flag": "--spec.network.egress",
"summary": "Default ALLOW.",
"type": "enum",
"values": [
"allow",
"deny",
"allowlist"
]
},
{
"field": "lease.spec.network.allowed_domains",
"flag": "--spec.network.allowed-domains",
"repeated": true,
"summary": "Hosts reachable when `egress` is ALLOWLIST: exact names or one leading `*.` wildcard label, for example `api.openai.com`, `*.github.com`.",
"type": "string"
},
{
"field": "lease.spec.network.allowed_cidrs",
"flag": "--spec.network.allowed-cidrs",
"repeated": true,
"summary": "Public CIDRs reachable when `egress` is ALLOWLIST.",
"type": "string"
},
{
"field": "lease.spec.ports",
"flag": "--spec.ports",
"repeated": true,
"summary": "Guest ports to expose.",
"type": "json"
},
{
"field": "lease.spec.env",
"flag": "--spec.env",
"repeated": true,
"summary": "Plain environment variables. Secrets bind through Sylphx Secrets, never here.",
"type": "key=value"
},
{
"field": "lease.spec.volumes",
"flag": "--spec.volumes",
"repeated": true,
"summary": "Volumes attached at grant, each by name. A volume is attached to at most one lease at a time; a volume already attached refuses the lease with RESOURCE_IN_USE.",
"type": "json"
},
{
"field": "lease.spec.budget.max_cpu_seconds",
"flag": "--spec.budget.max-cpu-seconds",
"summary": "End CPU_BUDGET after this many vCPU-seconds of guest CPU time.",
"type": "int"
},
{
"field": "lease.spec.budget.max_cost_micros",
"flag": "--spec.budget.max-cost-micros",
"summary": "End COST_BUDGET once the shape's list price times wall seconds reaches this many millionths of a US dollar.",
"type": "int"
},
{
"field": "lease.spec.display.width",
"flag": "--spec.display.width",
"summary": "Logical width in pixels; default 1280.",
"type": "int"
},
{
"field": "lease.spec.display.height",
"flag": "--spec.display.height",
"summary": "Logical height in pixels; default 800.",
"type": "int"
},
{
"field": "lease.spec.display.dpi",
"flag": "--spec.display.dpi",
"summary": "Dots per inch; default 96.",
"type": "int"
},
{
"field": "lease.spec.browser.headless",
"flag": "--spec.browser.headless",
"summary": "Run headless instead of on the display. A headless browser has no stream and no computer actions; CDP only.",
"type": "bool"
},
{
"field": "lease.spec.browser.user_data_dir",
"flag": "--spec.browser.user-data-dir",
"summary": "The profile directory; put it on a volume to keep cookies and storage across leases. Default a fresh profile.",
"type": "string"
},
{
"field": "lease.spec.browser.start_url",
"flag": "--spec.browser.start-url",
"summary": "The page opened at start; default `about:blank`.",
"type": "string"
},
{
"field": "lease.spec.source_snapshot",
"flag": "--spec.source-snapshot",
"summary": "Boot from this Snapshot's disk and image instead of `image`.",
"type": "string"
},
{
"field": "lease.spec.webhook.uri",
"flag": "--spec.webhook.uri",
"summary": "The HTTPS URL that receives the POSTs.",
"type": "string"
},
{
"field": "lease.spec.webhook.kinds",
"flag": "--spec.webhook.kinds",
"repeated": true,
"summary": "Deliver only these kinds; default every kind.",
"type": "enum",
"values": [
"granted",
"ready",
"refused",
"ended",
"renewed",
"network_changed",
"control_acquired",
"control_released",
"control_expired",
"budget_warning",
"paused",
"resumed"
]
},
{
"field": "lease.spec.device.model",
"flag": "--spec.device.model",
"summary": "A model id from the device catalog, e.g. `pixel_7`; default `pixel_7`.",
"type": "string"
},
{
"field": "lease.spec.device.os_version",
"flag": "--spec.device.os-version",
"summary": "The OS version, e.g. `14`; default the newest offered.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "skip_wait_ready",
"flag": "--skip-wait-ready",
"summary": "Return as soon as the machine is granted instead of when the guest is ready. Default false: wait for READY, at most 60 seconds.",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/leases",
"method": "sandboxes.leases.create",
"permission": "sandboxes:write",
"positional": {
"arg": "ID",
"field": "lease_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "lease",
"summary": "Creates a lease: granted now and returned READY (or GRANTED when `wait_ready` is false), or refused with a typed error. There is no queue.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "ttl",
"flag": "--ttl",
"required": true,
"summary": "The new time to live from now.",
"type": "duration"
},
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:renew",
"method": "sandboxes.leases.renew",
"permission": "sandboxes:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Extends `expire_time`, never past the shape's longest lease. Does not change the generation.",
"verb": "renew"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:release",
"method": "sandboxes.leases.release",
"permission": "sandboxes:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Ends a lease with END_REASON_RELEASED; the machine is destroyed and never leased again, and attached volumes are detached.",
"verb": "release"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:pause",
"method": "sandboxes.leases.pause",
"permission": "sandboxes:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Pauses a lease: its disk is kept and its machine destroyed; the generation increases. Process memory is not kept.",
"verb": "pause"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:resume",
"method": "sandboxes.leases.resume",
"permission": "sandboxes:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Resumes a paused lease on a machine granted now, or refuses it; the generation increases.",
"verb": "resume"
},
{
"effect": "write",
"flags": [
{
"field": "network",
"flag": "--network",
"required": true,
"summary": "The new outbound policy; replaces the old one whole.",
"type": "json"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:setNetwork",
"method": "sandboxes.leases.set_network",
"permission": "sandboxes:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Replaces a running lease's outbound policy. The generation does not change; the new policy applies before the call returns.",
"verb": "set-network"
},
{
"effect": "write",
"flags": [
{
"field": "scopes",
"flag": "--scopes",
"repeated": true,
"required": true,
"summary": "What the token admits.",
"type": "enum",
"values": [
"guest",
"ports",
"cdp",
"computer"
]
},
{
"field": "ttl",
"flag": "--ttl",
"summary": "At most 1 hour and never past the lease's `expire_time`.",
"type": "duration"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:mintToken",
"method": "sandboxes.leases.mint_token",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Mints a lease token for the data plane, bound to the current generation. Hand it to a process that must not hold the Access key.",
"verb": "mint-token"
},
{
"effect": "write",
"flags": [
{
"field": "command",
"flag": "--command",
"repeated": true,
"required": true,
"summary": "The program and its arguments. Use `[\"bash\", \"-lc\", \"…\"]` for a shell.",
"type": "string"
},
{
"field": "working_directory",
"flag": "--working-directory",
"summary": "The working directory; default the user's home.",
"type": "string"
},
{
"field": "env",
"flag": "--env",
"repeated": true,
"summary": "Extra environment variables.",
"type": "key=value"
},
{
"field": "stdin",
"flag": "--stdin",
"summary": "Bytes written to standard input.",
"type": "string"
},
{
"field": "timeout",
"flag": "--timeout",
"summary": "Kill the process after this long; default 60 seconds, at most 10 minutes.",
"type": "duration"
},
{
"field": "user",
"flag": "--user",
"summary": "The guest user; default `user`. `root` is allowed: the whole machine belongs to the lessee.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:exec",
"method": "sandboxes.leases.exec",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Runs one command in the lease to completion and returns its output, capped at 1 MiB per stream. Long-running or interactive processes use the guest protocol at `status.endpoints.guest_uri`.",
"verb": "exec"
},
{
"effect": "read",
"flags": [
{
"field": "path",
"flag": "--path",
"required": true,
"summary": "The absolute path in the guest.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:readFile",
"method": "sandboxes.leases.read_file",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Reads one file from the lease, at most 16 MiB; larger files use the guest's `/files`.",
"verb": "read-file"
},
{
"effect": "write",
"flags": [
{
"field": "path",
"flag": "--path",
"required": true,
"summary": "The absolute path in the guest.",
"type": "string"
},
{
"field": "content",
"flag": "--content",
"required": true,
"summary": "The file's bytes.",
"type": "string"
},
{
"field": "mode",
"flag": "--mode",
"summary": "The file mode bits; default 0644.",
"type": "int"
},
{
"field": "append",
"flag": "--append",
"summary": "Append `content` to the file (created when absent) instead of replacing it, so a file larger than one call uploads in chunks.",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:writeFile",
"method": "sandboxes.leases.write_file",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Writes one file in the lease, at most 16 MiB, creating parent directories.",
"verb": "write-file"
},
{
"effect": "read",
"flags": [
{
"field": "path",
"flag": "--path",
"required": true,
"summary": "The absolute directory path in the guest.",
"type": "string"
},
{
"field": "depth",
"flag": "--depth",
"summary": "Descend this many levels; default 1.",
"type": "int"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:listFiles",
"method": "sandboxes.leases.list_files",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Lists one directory in the lease.",
"verb": "list-files"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "path",
"flag": "--path",
"required": true,
"summary": "The absolute path in the guest.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:removeFile",
"method": "sandboxes.leases.remove_file",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Removes one file or directory tree in the lease.",
"verb": "remove-file"
},
{
"effect": "write",
"flags": [
{
"field": "port",
"flag": "--port",
"required": true,
"summary": "The port to expose.",
"type": "json"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:openPort",
"method": "sandboxes.leases.open_port",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Exposes a guest port.",
"verb": "open-port"
},
{
"effect": "write",
"flags": [
{
"field": "port",
"flag": "--port",
"required": true,
"summary": "The guest port.",
"type": "int"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:closePort",
"method": "sandboxes.leases.close_port",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Stops exposing a guest port.",
"verb": "close-port"
},
{
"effect": "write",
"flags": [
{
"field": "actions",
"flag": "--actions",
"repeated": true,
"summary": "The actions, performed in order; at most 64. An empty list with `screenshot` set only takes a screenshot.",
"type": "json"
},
{
"field": "screenshot",
"flag": "--screenshot",
"summary": "Take a screenshot after the last action and return it.",
"type": "json"
},
{
"field": "lease_generation",
"flag": "--lease-generation",
"summary": "Refuse STALE_GENERATION unless the lease is at this generation; 0 skips the check.",
"type": "int"
},
{
"field": "control_epoch",
"flag": "--control-epoch",
"summary": "Act under this AGENT control epoch; 0 acts only while nobody holds control.",
"type": "int"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:act",
"method": "sandboxes.leases.act",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Performs computer actions on a DESKTOP, BROWSER, or ANDROID lease, in order, and returns each action's result and, when `screenshot` is set, the screenshot taken after the last action. The actions are the Anthropic computer tool's and OpenAI computer use's, one-to-one (docs/services/sandboxes/computer-use.md). Refused CONTROL_HELD_BY_HUMAN while a human holds control.",
"verb": "act"
},
{
"effect": "write",
"flags": [
{
"field": "ttl",
"flag": "--ttl",
"summary": "How long the token admits a new connection; at most and default 5 minutes. A connected stream ends when the lease generation changes or the token is revoked.",
"type": "duration"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:openStream",
"method": "sandboxes.leases.open_stream",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Opens a read-only live view of a lease's display: a short-lived viewer token bound to the lease and its generation, an embeddable URL, and the WebRTC signaling endpoint with ICE servers. Input needs control (AcquireLeaseControl).",
"verb": "open-stream"
},
{
"effect": "write",
"flags": [
{
"field": "holder",
"flag": "--holder",
"required": true,
"summary": "HUMAN or AGENT.",
"type": "enum",
"values": [
"agent",
"human"
]
},
{
"field": "ttl",
"flag": "--ttl",
"summary": "How long; default 10 minutes, capped at 30 minutes.",
"type": "duration"
},
{
"field": "holder_label",
"flag": "--holder-label",
"summary": "A label for the holder, for example the person's user id; recorded in the audit events.",
"type": "string"
},
{
"field": "preempt",
"flag": "--preempt",
"summary": "For HUMAN: take control from another human.",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:acquireControl",
"method": "sandboxes.leases.acquire_control",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Takes exclusive input control of a lease's display. A HUMAN acquire preempts an AGENT holder and returns a controller stream; an AGENT acquire is refused CONTROL_HELD_BY_HUMAN while a human holds control. Control lapses at `ttl`, which the platform caps at 30 minutes.",
"verb": "acquire-control"
},
{
"effect": "write",
"flags": [
{
"field": "epoch",
"flag": "--epoch",
"required": true,
"summary": "The epoch AcquireLeaseControl returned.",
"type": "int"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:releaseControl",
"method": "sandboxes.leases.release_control",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Releases control held under `epoch`; its controller tokens stop working.",
"verb": "release-control"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/leases/*}:getControl",
"method": "sandboxes.leases.get_control",
"permission": "sandboxes:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Gets who holds control of a lease's display.",
"verb": "get-control"
},
{
"effect": "write",
"flags": [
{
"field": "apk_path",
"flag": "--apk-path",
"required": true,
"summary": "The APK's path in the lease (write it with WriteLeaseFile first).",
"type": "string"
},
{
"field": "grant_permissions",
"flag": "--grant-permissions",
"summary": "Grant every runtime permission the app declares.",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:installApp",
"method": "sandboxes.leases.install_app",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Installs an Android app (APK) on an ANDROID lease.",
"verb": "install-app"
}
],
"noun": "leases",
"resource_type": "sandboxes.sylphx.com/Lease"
},
{
"collection": "lease_events",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/leases/*/lease_events/*}",
"method": "sandboxes.lease_events.get",
"permission": "sandboxes:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}/lease_events/{lease_event}"
},
"summary": "Gets one lease event.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over `kind`.",
"type": "string"
},
{
"field": "wait",
"flag": "--wait",
"summary": "Block up to this long (at most 60 seconds) when there is no event after `page_token`.",
"type": "duration"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/leases/*}/lease_events",
"method": "sandboxes.lease_events.list",
"paginates": true,
"permission": "sandboxes:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Lists a lease's events in order. With `wait`, blocks up to that long for an event after `page_token` (long poll).",
"verb": "list"
}
],
"noun": "lease-events",
"resource_type": "sandboxes.sylphx.com/LeaseEvent"
},
{
"collection": "volumes",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/volumes/*}",
"method": "sandboxes.volumes.get",
"permission": "sandboxes:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/volumes/{volume}"
},
"summary": "Gets a volume.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/volumes",
"method": "sandboxes.volumes.list",
"paginates": true,
"permission": "sandboxes:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists volumes in a environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "volume.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "volume.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "volume.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "volume.spec.size_gib",
"flag": "--spec.size-gib",
"required": true,
"summary": "Size in GiB, 1 to 1024; it may grow and never shrink. A `local` volume never grows.",
"type": "int"
},
{
"field": "volume.spec.storage_class",
"flag": "--spec.storage-class",
"summary": "The storage class; unset means `standard`. `standard`: replicated network storage, encrypted at rest with its own key, attachable on any node. `local`: fast node-local storage, not replicated, for warm build workspaces. The guest gets it as an ext4 filesystem it formats on first use. It pins every lease that attaches it to its node, is not encrypted at rest, cannot grow, cannot be mounted read-only, and is lost with its node: keep only caches on it.",
"type": "string"
},
{
"field": "volume.spec.region",
"flag": "--spec.region",
"summary": "The region whose Cell holds the volume; default the project's home region. A lease mounts the volume only in the same region.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/volumes",
"method": "sandboxes.volumes.create",
"permission": "sandboxes:write",
"positional": {
"arg": "ID",
"field": "volume_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "volume",
"summary": "Creates a volume.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "volume.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "volume.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "volume.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "volume.spec.size_gib",
"flag": "--spec.size-gib",
"required": true,
"summary": "Size in GiB, 1 to 1024; it may grow and never shrink. A `local` volume never grows.",
"type": "int"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{volume.name=orgs/*/projects/*/envs/*/volumes/*}",
"method": "sandboxes.volumes.update",
"permission": "sandboxes:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "volume.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/volumes/{volume}"
},
"resource_field": "volume",
"sends_etag": true,
"summary": "Updates a volume: grows `spec.size_gib` and edits metadata.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/volumes/*}",
"method": "sandboxes.volumes.delete",
"permission": "sandboxes:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/volumes/{volume}"
},
"summary": "Deletes a volume and destroys its data. Refused RESOURCE_IN_USE while it is attached.",
"verb": "delete"
}
],
"noun": "volumes",
"resource_type": "sandboxes.sylphx.com/Volume"
},
{
"collection": "snapshots",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/snapshots/*}",
"method": "sandboxes.snapshots.get",
"permission": "sandboxes:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/snapshots/{snapshot}"
},
"summary": "Gets a snapshot.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/snapshots",
"method": "sandboxes.snapshots.list",
"paginates": true,
"permission": "sandboxes:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists snapshots in a environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "snapshot.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "snapshot.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "snapshot.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "snapshot.spec.source_lease",
"flag": "--spec.source-lease",
"required": true,
"summary": "The running lease to capture.",
"type": "string"
},
{
"field": "snapshot.spec.include_memory",
"flag": "--spec.include-memory",
"summary": "Capture process memory too. Refused UNIMPLEMENTED until the microVM runtime exposes memory snapshots.",
"type": "bool"
},
{
"field": "snapshot.spec.retention",
"flag": "--spec.retention",
"summary": "Delete the snapshot after this long; default 7 days, at most 30 days.",
"type": "duration"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/snapshots",
"method": "sandboxes.snapshots.create",
"permission": "sandboxes:write",
"positional": {
"arg": "ID",
"field": "snapshot_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "snapshot",
"summary": "Captures a running lease's disk as a snapshot.",
"verb": "create"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/snapshots/*}",
"method": "sandboxes.snapshots.delete",
"permission": "sandboxes:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/snapshots/{snapshot}"
},
"summary": "Deletes a snapshot.",
"verb": "delete"
}
],
"noun": "snapshots",
"resource_type": "sandboxes.sylphx.com/Snapshot"
}
],
"commands": [],
"display_name": "Sylphx Sandboxes",
"noun": "sandboxes",
"stage": "preview"
},
{
"collections": [
{
"collection": "secrets",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/secrets/*}",
"method": "secrets.secrets.get",
"permission": "secrets:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secrets/{secret}"
},
"summary": "Gets a secret.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/secrets",
"method": "secrets.secrets.list",
"paginates": true,
"permission": "secrets:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists secrets in an environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "secret.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "secret.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "secret.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "secret.spec.encryption_key",
"flag": "--spec.encryption-key",
"summary": "The ENCRYPT Key the values are envelope-encrypted with; unset means the environment's default Key.",
"type": "string"
},
{
"field": "secret.spec.rotation_period",
"flag": "--spec.rotation-period",
"summary": "How often the value should be rotated; the Secret reports Ready=FALSE with reason `RotationDue` once the latest version is older.",
"type": "duration"
},
{
"field": "secret.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While true, Delete fails with DELETION_PROTECTED. Default true.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/secrets",
"method": "secrets.secrets.create",
"permission": "secrets:write",
"positional": {
"arg": "ID",
"field": "secret_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "secret",
"summary": "Creates a secret, without a value; add one with CreateSecretVersion.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "secret.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "secret.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "secret.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "secret.spec.rotation_period",
"flag": "--spec.rotation-period",
"summary": "How often the value should be rotated; the Secret reports Ready=FALSE with reason `RotationDue` once the latest version is older.",
"type": "duration"
},
{
"field": "secret.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While true, Delete fails with DELETION_PROTECTED. Default true.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{secret.name=orgs/*/projects/*/envs/*/secrets/*}",
"method": "secrets.secrets.update",
"permission": "secrets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "secret.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secrets/{secret}"
},
"resource_field": "secret",
"sends_etag": true,
"summary": "Updates a secret.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete every child Resource; without it a parent with children fails with FAILED_PRECONDITION.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/secrets/*}",
"method": "secrets.secrets.delete",
"permission": "secrets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secrets/{secret}"
},
"summary": "Deletes a secret and destroys every version.",
"verb": "delete"
}
],
"noun": "secrets",
"resource_type": "secrets.sylphx.com/Secret"
},
{
"collection": "secret_versions",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/secrets/*/secret_versions/*}",
"method": "secrets.secret_versions.get",
"permission": "secrets:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secrets/{secret}/secret_versions/{secret_version}"
},
"summary": "Gets a secret version.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/secrets/*}/secret_versions",
"method": "secrets.secret_versions.list",
"paginates": true,
"permission": "secrets:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secrets/{secret}"
},
"summary": "Lists a secret's versions.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secrets/{secret}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "secret_version.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "secret_version.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "secret_version.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "secret_version.payload",
"flag": "--payload",
"required": true,
"sensitive": true,
"summary": "The value, at most 64 KiB. Write-only.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/secrets/*}/secret_versions",
"method": "secrets.secret_versions.create",
"permission": "secrets:write",
"positional": null,
"resource_field": "secret_version",
"summary": "Adds a value to a secret as its newest version. The value is never returned.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Disable only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/secrets/*/secret_versions/*}:disable",
"method": "secrets.secret_versions.disable",
"permission": "secrets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secrets/{secret}/secret_versions/{secret_version}"
},
"summary": "Disables a secret version: bindings stop delivering it.",
"verb": "disable"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Enable only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/secrets/*/secret_versions/*}:enable",
"method": "secrets.secret_versions.enable",
"permission": "secrets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secrets/{secret}/secret_versions/{secret_version}"
},
"summary": "Enables a disabled secret version.",
"verb": "enable"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Destroy only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/secrets/*/secret_versions/*}:destroy",
"method": "secrets.secret_versions.destroy",
"permission": "secrets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secrets/{secret}/secret_versions/{secret_version}"
},
"summary": "Destroys a secret version's value irrecoverably.",
"verb": "destroy"
},
{
"effect": "read",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/secrets/*/secret_versions/*}:access",
"method": "secrets.secret_versions.access",
"permission": "secrets:access",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secrets/{secret}/secret_versions/{secret_version}"
},
"summary": "Reads a secret version's value back. Break-glass: a separate permission, audited on every call, and never exposed to MCP.",
"verb": "access"
}
],
"noun": "secret-versions",
"resource_type": "secrets.sylphx.com/SecretVersion"
},
{
"collection": "secret_bindings",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/secret_bindings/*}",
"method": "secrets.secret_bindings.get",
"permission": "secrets:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secret_bindings/{secret_binding}"
},
"summary": "Gets a secret binding.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/secret_bindings",
"method": "secrets.secret_bindings.list",
"paginates": true,
"permission": "secrets:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists secret bindings in an environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "secret_binding.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "secret_binding.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "secret_binding.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "secret_binding.spec.secret",
"flag": "--spec.secret",
"required": true,
"summary": "The Secret to deliver, in the same environment.",
"type": "string"
},
{
"field": "secret_binding.spec.version",
"flag": "--spec.version",
"summary": "A pinned version; unset delivers the Secret's latest enabled version.",
"type": "string"
},
{
"field": "secret_binding.spec.workload",
"flag": "--spec.workload",
"required": true,
"summary": "The name of the Resource that consumes the value, for example a Hosting service.",
"type": "string"
},
{
"field": "secret_binding.spec.env_var.variable",
"flag": "--spec.env-var.variable",
"summary": "The variable name, for example `DATABASE_PASSWORD`.",
"type": "string"
},
{
"field": "secret_binding.spec.file.path",
"flag": "--spec.file.path",
"summary": "The absolute path, for example `/run/secrets/tls.key`.",
"type": "string"
},
{
"field": "secret_binding.spec.egress.hosts",
"flag": "--spec.egress.hosts",
"repeated": true,
"summary": "The hosts the value may be sent to, for example `api.example.com`.",
"type": "string"
},
{
"field": "secret_binding.spec.egress.header",
"flag": "--spec.egress.header",
"summary": "The request header to set, for example `Authorization`.",
"type": "string"
},
{
"field": "secret_binding.spec.egress.header_template",
"flag": "--spec.egress.header-template",
"summary": "The header value, with `{value}` standing for the Secret, for example `Bearer {value}`; default `{value}`.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/secret_bindings",
"method": "secrets.secret_bindings.create",
"permission": "secrets:write",
"positional": {
"arg": "ID",
"field": "secret_binding_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "secret_binding",
"summary": "Creates a secret binding.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "secret_binding.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "secret_binding.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "secret_binding.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "secret_binding.spec.secret",
"flag": "--spec.secret",
"required": true,
"summary": "The Secret to deliver, in the same environment.",
"type": "string"
},
{
"field": "secret_binding.spec.version",
"flag": "--spec.version",
"summary": "A pinned version; unset delivers the Secret's latest enabled version.",
"type": "string"
},
{
"field": "secret_binding.spec.workload",
"flag": "--spec.workload",
"required": true,
"summary": "The name of the Resource that consumes the value, for example a Hosting service.",
"type": "string"
},
{
"field": "secret_binding.spec.env_var.variable",
"flag": "--spec.env-var.variable",
"summary": "The variable name, for example `DATABASE_PASSWORD`.",
"type": "string"
},
{
"field": "secret_binding.spec.file.path",
"flag": "--spec.file.path",
"summary": "The absolute path, for example `/run/secrets/tls.key`.",
"type": "string"
},
{
"field": "secret_binding.spec.egress.hosts",
"flag": "--spec.egress.hosts",
"repeated": true,
"summary": "The hosts the value may be sent to, for example `api.example.com`.",
"type": "string"
},
{
"field": "secret_binding.spec.egress.header",
"flag": "--spec.egress.header",
"summary": "The request header to set, for example `Authorization`.",
"type": "string"
},
{
"field": "secret_binding.spec.egress.header_template",
"flag": "--spec.egress.header-template",
"summary": "The header value, with `{value}` standing for the Secret, for example `Bearer {value}`; default `{value}`.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{secret_binding.name=orgs/*/projects/*/envs/*/secret_bindings/*}",
"method": "secrets.secret_bindings.update",
"permission": "secrets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "secret_binding.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secret_bindings/{secret_binding}"
},
"resource_field": "secret_binding",
"sends_etag": true,
"summary": "Updates a secret binding.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/secret_bindings/*}",
"method": "secrets.secret_bindings.delete",
"permission": "secrets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secret_bindings/{secret_binding}"
},
"summary": "Deletes a secret binding.",
"verb": "delete"
}
],
"noun": "secret-bindings",
"resource_type": "secrets.sylphx.com/SecretBinding"
}
],
"commands": [],
"display_name": "Sylphx Secrets",
"noun": "secrets",
"stage": "preview"
},
{
"collections": [
{
"collection": "workflows",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/workflows/*}",
"method": "workflows.workflows.get",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}"
},
"summary": "Gets a workflow.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/workflows",
"method": "workflows.workflows.list",
"paginates": true,
"permission": "workflows:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists workflows.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "workflow.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "workflow.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "workflow.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "workflow.spec.handler_uri",
"flag": "--spec.handler-uri",
"summary": "An HTTPS URI on port 443 whose host is a verified Network Domain of this project or a Hosting route the project owns.",
"type": "string"
},
{
"field": "workflow.spec.service_handler.service",
"flag": "--spec.service-handler.service",
"summary": "The Hosting Service in the same environment.",
"type": "string"
},
{
"field": "workflow.spec.service_handler.path",
"flag": "--spec.service-handler.path",
"summary": "The request path, for example `/api/sylphx/workflows`.",
"type": "string"
},
{
"field": "workflow.spec.retry_policy.max_attempts",
"flag": "--spec.retry-policy.max-attempts",
"summary": "Attempts per step, 1 to 100; default 10.",
"type": "int"
},
{
"field": "workflow.spec.retry_policy.initial_interval",
"flag": "--spec.retry-policy.initial-interval",
"summary": "The first backoff; default 1s.",
"type": "duration"
},
{
"field": "workflow.spec.retry_policy.backoff_coefficient",
"flag": "--spec.retry-policy.backoff-coefficient",
"summary": "Backoff growth, 1.0 to 10.0; default 2.0.",
"type": "number"
},
{
"field": "workflow.spec.retry_policy.max_interval",
"flag": "--spec.retry-policy.max-interval",
"summary": "The largest backoff; default 10m.",
"type": "duration"
},
{
"field": "workflow.spec.timeouts.invocation_timeout",
"flag": "--spec.timeouts.invocation-timeout",
"summary": "One handler invocation, 1s to 900s; default 60s.",
"type": "duration"
},
{
"field": "workflow.spec.timeouts.run_timeout",
"flag": "--spec.timeouts.run-timeout",
"summary": "The whole Run, at most 365d; default 30d.",
"type": "duration"
},
{
"field": "workflow.spec.max_concurrent_runs",
"flag": "--spec.max-concurrent-runs",
"summary": "At most this many running Runs of this Workflow; 0 is unlimited within the plan.",
"type": "int"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/workflows",
"method": "workflows.workflows.create",
"permission": "workflows:write",
"positional": {
"arg": "ID",
"field": "workflow_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "workflow",
"summary": "Creates a workflow.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "workflow.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "workflow.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "workflow.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "workflow.spec.handler_uri",
"flag": "--spec.handler-uri",
"summary": "An HTTPS URI on port 443 whose host is a verified Network Domain of this project or a Hosting route the project owns.",
"type": "string"
},
{
"field": "workflow.spec.service_handler.service",
"flag": "--spec.service-handler.service",
"summary": "The Hosting Service in the same environment.",
"type": "string"
},
{
"field": "workflow.spec.service_handler.path",
"flag": "--spec.service-handler.path",
"summary": "The request path, for example `/api/sylphx/workflows`.",
"type": "string"
},
{
"field": "workflow.spec.retry_policy.max_attempts",
"flag": "--spec.retry-policy.max-attempts",
"summary": "Attempts per step, 1 to 100; default 10.",
"type": "int"
},
{
"field": "workflow.spec.retry_policy.initial_interval",
"flag": "--spec.retry-policy.initial-interval",
"summary": "The first backoff; default 1s.",
"type": "duration"
},
{
"field": "workflow.spec.retry_policy.backoff_coefficient",
"flag": "--spec.retry-policy.backoff-coefficient",
"summary": "Backoff growth, 1.0 to 10.0; default 2.0.",
"type": "number"
},
{
"field": "workflow.spec.retry_policy.max_interval",
"flag": "--spec.retry-policy.max-interval",
"summary": "The largest backoff; default 10m.",
"type": "duration"
},
{
"field": "workflow.spec.timeouts.invocation_timeout",
"flag": "--spec.timeouts.invocation-timeout",
"summary": "One handler invocation, 1s to 900s; default 60s.",
"type": "duration"
},
{
"field": "workflow.spec.timeouts.run_timeout",
"flag": "--spec.timeouts.run-timeout",
"summary": "The whole Run, at most 365d; default 30d.",
"type": "duration"
},
{
"field": "workflow.spec.max_concurrent_runs",
"flag": "--spec.max-concurrent-runs",
"summary": "At most this many running Runs of this Workflow; 0 is unlimited within the plan.",
"type": "int"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the workflow when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{workflow.name=orgs/*/projects/*/envs/*/workflows/*}",
"method": "workflows.workflows.update",
"permission": "workflows:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "workflow.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}"
},
"resource_field": "workflow",
"sends_etag": true,
"summary": "Updates a workflow.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the workflow does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also cancel and delete the Workflow's Runs and Schedules; without it a Workflow with open Runs or Schedules fails with INVALID_STATE.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/workflows/*}",
"method": "workflows.workflows.delete",
"permission": "workflows:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}"
},
"summary": "Deletes a workflow.",
"verb": "delete"
}
],
"noun": "workflows",
"resource_type": "workflows.sylphx.com/Workflow"
},
{
"collection": "schedules",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/schedules/*}",
"method": "workflows.schedules.get",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/schedules/{schedule}"
},
"summary": "Gets a schedule.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/schedules",
"method": "workflows.schedules.list",
"paginates": true,
"permission": "workflows:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists schedules.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "schedule.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "schedule.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "schedule.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "schedule.spec.workflow",
"flag": "--spec.workflow",
"required": true,
"summary": "The Workflow the Schedule starts, in the same environment.",
"type": "string"
},
{
"field": "schedule.spec.input",
"flag": "--spec.input",
"summary": "The input of every Run, at most 64 KiB of JSON.",
"type": "json"
},
{
"field": "schedule.spec.calendar.cron",
"flag": "--spec.calendar.cron",
"summary": "A 5-field cron expression, for example `0 3 * * *`.",
"type": "string"
},
{
"field": "schedule.spec.calendar.time_zone",
"flag": "--spec.calendar.time-zone",
"summary": "IANA time zone; default `UTC`.",
"type": "string"
},
{
"field": "schedule.spec.interval.every",
"flag": "--spec.interval.every",
"summary": "The period, 1s to 365d.",
"type": "duration"
},
{
"field": "schedule.spec.interval.offset",
"flag": "--spec.interval.offset",
"summary": "Phase offset within each period.",
"type": "duration"
},
{
"field": "schedule.spec.jitter",
"flag": "--spec.jitter",
"summary": "Random delay added to each fire, at most min(interval, 1h).",
"type": "duration"
},
{
"field": "schedule.spec.overlap_policy",
"flag": "--spec.overlap-policy",
"summary": "What a fire does while a previous Run is still running.",
"type": "enum",
"values": [
"skip",
"buffer_one",
"buffer_all",
"cancel_other",
"allow"
]
},
{
"field": "schedule.spec.catchup_window",
"flag": "--spec.catchup-window",
"summary": "Missed fires older than this are skipped; 10s to 365d.",
"type": "duration"
},
{
"field": "schedule.spec.paused",
"flag": "--spec.paused",
"summary": "Whether fires are paused.",
"type": "bool"
},
{
"field": "schedule.spec.pause_note",
"flag": "--spec.pause-note",
"summary": "Why the Schedule is paused; shown in status.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/schedules",
"method": "workflows.schedules.create",
"permission": "workflows:write",
"positional": {
"arg": "ID",
"field": "schedule_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "schedule",
"summary": "Creates a schedule.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "schedule.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "schedule.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "schedule.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "schedule.spec.workflow",
"flag": "--spec.workflow",
"required": true,
"summary": "The Workflow the Schedule starts, in the same environment.",
"type": "string"
},
{
"field": "schedule.spec.input",
"flag": "--spec.input",
"summary": "The input of every Run, at most 64 KiB of JSON.",
"type": "json"
},
{
"field": "schedule.spec.calendar.cron",
"flag": "--spec.calendar.cron",
"summary": "A 5-field cron expression, for example `0 3 * * *`.",
"type": "string"
},
{
"field": "schedule.spec.calendar.time_zone",
"flag": "--spec.calendar.time-zone",
"summary": "IANA time zone; default `UTC`.",
"type": "string"
},
{
"field": "schedule.spec.interval.every",
"flag": "--spec.interval.every",
"summary": "The period, 1s to 365d.",
"type": "duration"
},
{
"field": "schedule.spec.interval.offset",
"flag": "--spec.interval.offset",
"summary": "Phase offset within each period.",
"type": "duration"
},
{
"field": "schedule.spec.jitter",
"flag": "--spec.jitter",
"summary": "Random delay added to each fire, at most min(interval, 1h).",
"type": "duration"
},
{
"field": "schedule.spec.overlap_policy",
"flag": "--spec.overlap-policy",
"summary": "What a fire does while a previous Run is still running.",
"type": "enum",
"values": [
"skip",
"buffer_one",
"buffer_all",
"cancel_other",
"allow"
]
},
{
"field": "schedule.spec.catchup_window",
"flag": "--spec.catchup-window",
"summary": "Missed fires older than this are skipped; 10s to 365d.",
"type": "duration"
},
{
"field": "schedule.spec.paused",
"flag": "--spec.paused",
"summary": "Whether fires are paused.",
"type": "bool"
},
{
"field": "schedule.spec.pause_note",
"flag": "--spec.pause-note",
"summary": "Why the Schedule is paused; shown in status.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the schedule when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{schedule.name=orgs/*/projects/*/envs/*/schedules/*}",
"method": "workflows.schedules.update",
"permission": "workflows:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "schedule.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/schedules/{schedule}"
},
"resource_field": "schedule",
"sends_etag": true,
"summary": "Updates a schedule.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the schedule does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/schedules/*}",
"method": "workflows.schedules.delete",
"permission": "workflows:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/schedules/{schedule}"
},
"summary": "Deletes a schedule.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "pause_note",
"flag": "--pause-note",
"summary": "Why the Schedule is paused.",
"type": "string"
},
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/schedules/*}:pause",
"method": "workflows.schedules.pause",
"permission": "workflows:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/schedules/{schedule}"
},
"summary": "Pauses a Schedule: no fire starts a Run until it is resumed.",
"verb": "pause",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/schedules/*}:resume",
"method": "workflows.schedules.resume",
"permission": "workflows:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/schedules/{schedule}"
},
"summary": "Resumes a paused Schedule; missed fires follow `catchup_window`.",
"verb": "resume",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "schedules",
"resource_type": "workflows.sylphx.com/Schedule"
},
{
"collection": "runs",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/workflows/*/runs/*}",
"method": "workflows.runs.get",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}/runs/{run}"
},
"summary": "Gets a run.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/workflows/*}/runs",
"method": "workflows.runs.list",
"paginates": true,
"permission": "workflows:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}"
},
"summary": "Lists runs.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "run.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "run.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "run.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "run.input",
"flag": "--input",
"summary": "The Run input, at most 256 KiB of JSON.",
"type": "json"
},
{
"field": "run.start_delay",
"flag": "--start-delay",
"summary": "Delay the first invocation by this much.",
"type": "duration"
},
{
"field": "run.schedule_time",
"flag": "--schedule-time",
"summary": "When the first invocation is due: set it directly, or through `start_delay`; at most 365 days ahead. A Run cancelled before then closes `cancelled` with no invocation.",
"type": "timestamp"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/workflows/*}/runs",
"method": "workflows.runs.create",
"permission": "workflows:run",
"positional": {
"arg": "ID",
"field": "run_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "run",
"summary": "Starts a Run of a Workflow.",
"verb": "start"
},
{
"effect": "write",
"flags": [
{
"field": "inputs",
"flag": "--inputs",
"repeated": true,
"required": true,
"summary": "The inputs, one child Run each; at most 10 000.",
"type": "json"
},
{
"field": "max_concurrency",
"flag": "--max-concurrency",
"summary": "At most this many children run at once; 0 is the Workflow's limit.",
"type": "int"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/workflows/*}/runs:startBatch",
"method": "workflows.runs.start_batch",
"permission": "workflows:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}"
},
"summary": "Starts a batch: a parent Run that fans out one child Run per item, each with a stable index and count.",
"verb": "start-batch"
},
{
"effect": "write",
"flags": [
{
"field": "signal",
"flag": "--signal",
"required": true,
"summary": "The signal name the handler waits on.",
"type": "string"
},
{
"field": "payload",
"flag": "--payload",
"summary": "The signal payload, at most 64 KiB of JSON.",
"type": "json"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/workflows/*/runs/*}:signal",
"method": "workflows.runs.signal",
"permission": "workflows:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}/runs/{run}"
},
"summary": "Sends a named signal to a running Run; a `wait` op for that name resumes with its payload. A signal to a closed Run fails with INVALID_STATE.",
"verb": "signal"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "reason",
"flag": "--reason",
"summary": "Why the Run is cancelled.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/workflows/*/runs/*}:cancel",
"method": "workflows.runs.cancel",
"permission": "workflows:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}/runs/{run}"
},
"summary": "Requests cancellation. Timers and waits stop; a running invocation is not interrupted: the handler receives one final invocation with `cancel: true`, and the Run ends `cancelled` when it answers.",
"verb": "cancel"
},
{
"effect": "read",
"flags": [
{
"field": "timeout",
"flag": "--timeout",
"summary": "How long to wait; default 30s, at most 60s.",
"type": "duration"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/workflows/*/runs/*}:wait",
"method": "workflows.runs.wait",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}/runs/{run}"
},
"summary": "Waits up to `timeout` (at most 60s) for the Run to close, then returns it, closed or not.",
"verb": "wait"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 100, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
}
],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/workflows/*/runs/*}:readHistory",
"method": "workflows.runs.read_history",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}/runs/{run}"
},
"summary": "Reads a page of the Run's immutable history, projected to Sylphx events.",
"verb": "read-history"
}
],
"noun": "runs",
"resource_type": "workflows.sylphx.com/Run"
},
{
"collection": "jobs",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/jobs/*}",
"method": "workflows.jobs.get",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/jobs/{job}"
},
"summary": "Gets a job.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/jobs",
"method": "workflows.jobs.list",
"paginates": true,
"permission": "workflows:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists jobs.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "job.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "job.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "job.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "job.spec.service",
"flag": "--spec.service",
"required": true,
"summary": "The Hosting Service whose env and Secret bindings every run takes, and whose live Release image it runs unless `image` or `build` names another, so a Job never runs code the environment does not serve.",
"type": "string"
},
{
"field": "job.spec.image",
"flag": "--spec.image",
"summary": "A digest-pinned image from this org's Artifacts, in place of the service's image. Exclusive with `build`.",
"type": "string"
},
{
"field": "job.spec.command",
"flag": "--spec.command",
"repeated": true,
"summary": "The entrypoint; empty keeps the image's.",
"type": "string"
},
{
"field": "job.spec.args",
"flag": "--spec.args",
"repeated": true,
"summary": "Arguments; a run may replace them.",
"type": "string"
},
{
"field": "job.spec.env",
"flag": "--spec.env",
"repeated": true,
"summary": "Environment overrides on top of the service's env and Secret bindings.",
"type": "key=value"
},
{
"field": "job.spec.instance_type",
"flag": "--spec.instance-type",
"summary": "A Hosting instance type; default `standard`.",
"type": "string"
},
{
"field": "job.spec.timeout",
"flag": "--spec.timeout",
"summary": "One attempt's deadline, 10s to 24h; default 1h.",
"type": "duration"
},
{
"field": "job.spec.max_retries",
"flag": "--spec.max-retries",
"summary": "Re-runs after a non-zero exit, 0 to 10; backoff 30s doubling.",
"type": "int"
},
{
"field": "job.spec.concurrency",
"flag": "--spec.concurrency",
"summary": "What a start does while a run is active; default forbid.",
"type": "enum",
"values": [
"forbid",
"queue",
"allow"
]
},
{
"field": "job.spec.build",
"flag": "--spec.build",
"summary": "A build the project declares: its latest built image, in place of the service's; the image needs no running service of its own. Exclusive with `image`.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/jobs",
"method": "workflows.jobs.create",
"permission": "workflows:write",
"positional": {
"arg": "ID",
"field": "job_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "job",
"summary": "Creates a job.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "job.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "job.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "job.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "job.spec.service",
"flag": "--spec.service",
"required": true,
"summary": "The Hosting Service whose env and Secret bindings every run takes, and whose live Release image it runs unless `image` or `build` names another, so a Job never runs code the environment does not serve.",
"type": "string"
},
{
"field": "job.spec.image",
"flag": "--spec.image",
"summary": "A digest-pinned image from this org's Artifacts, in place of the service's image. Exclusive with `build`.",
"type": "string"
},
{
"field": "job.spec.command",
"flag": "--spec.command",
"repeated": true,
"summary": "The entrypoint; empty keeps the image's.",
"type": "string"
},
{
"field": "job.spec.args",
"flag": "--spec.args",
"repeated": true,
"summary": "Arguments; a run may replace them.",
"type": "string"
},
{
"field": "job.spec.env",
"flag": "--spec.env",
"repeated": true,
"summary": "Environment overrides on top of the service's env and Secret bindings.",
"type": "key=value"
},
{
"field": "job.spec.instance_type",
"flag": "--spec.instance-type",
"summary": "A Hosting instance type; default `standard`.",
"type": "string"
},
{
"field": "job.spec.timeout",
"flag": "--spec.timeout",
"summary": "One attempt's deadline, 10s to 24h; default 1h.",
"type": "duration"
},
{
"field": "job.spec.max_retries",
"flag": "--spec.max-retries",
"summary": "Re-runs after a non-zero exit, 0 to 10; backoff 30s doubling.",
"type": "int"
},
{
"field": "job.spec.concurrency",
"flag": "--spec.concurrency",
"summary": "What a start does while a run is active; default forbid.",
"type": "enum",
"values": [
"forbid",
"queue",
"allow"
]
},
{
"field": "job.spec.build",
"flag": "--spec.build",
"summary": "A build the project declares: its latest built image, in place of the service's; the image needs no running service of its own. Exclusive with `image`.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the job when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{job.name=orgs/*/projects/*/envs/*/jobs/*}",
"method": "workflows.jobs.update",
"permission": "workflows:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "job.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/jobs/{job}"
},
"resource_field": "job",
"sends_etag": true,
"summary": "Updates a job. Runs already started keep the generation they pinned.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the job does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also cancel active runs and delete Schedules targeting the job; without it a job with an active run or a Schedule fails with INVALID_STATE.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/jobs/*}",
"method": "workflows.jobs.delete",
"permission": "workflows:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/jobs/{job}"
},
"summary": "Deletes a job.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "jobs",
"resource_type": "workflows.sylphx.com/Job"
},
{
"collection": "job_runs",
"commands": [
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/jobs/{job}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "job_run.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "job_run.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "job_run.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "job_run.args",
"flag": "--args",
"repeated": true,
"summary": "Arguments of this run (the Job's when empty).",
"type": "string"
},
{
"field": "job_run.env",
"flag": "--env",
"repeated": true,
"summary": "Environment overrides of this run.",
"type": "key=value"
},
{
"field": "job_run.schedule_time",
"flag": "--schedule-time",
"summary": "Start no earlier than this: set it directly, or through `start_delay`; at most 365 days ahead. A run cancelled before then makes no attempt.",
"type": "timestamp"
},
{
"field": "job_run.start_delay",
"flag": "--start-delay",
"summary": "Start no earlier than this long after the request.",
"type": "duration"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/jobs/*}/job_runs",
"method": "workflows.job_runs.create",
"permission": "workflows:run",
"positional": {
"arg": "ID",
"field": "job_run_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "job_run",
"summary": "Starts a run of a Job now. The same `Idempotency-Key` returns the same run for 24h; a Schedule fire uses `{job}:{intended time}`. With concurrency `forbid`, a start while a run is active fails with INVALID_STATE.",
"verb": "run"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/jobs/*/job_runs/*}",
"method": "workflows.job_runs.get",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/jobs/{job}/job_runs/{job_run}"
},
"summary": "Gets a job run.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/jobs/*}/job_runs",
"method": "workflows.job_runs.list",
"paginates": true,
"permission": "workflows:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/jobs/{job}"
},
"summary": "Lists a job's runs, newest first.",
"verb": "list"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "reason",
"flag": "--reason",
"summary": "Why the run is cancelled.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/jobs/*/job_runs/*}:cancel",
"method": "workflows.job_runs.cancel",
"permission": "workflows:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/jobs/{job}/job_runs/{job_run}"
},
"summary": "Cancels a job run: SIGTERM, then SIGKILL after 30s. A closed run fails with INVALID_STATE.",
"verb": "cancel"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many lines; default 500, clamped to 5000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "wait",
"flag": "--wait",
"summary": "On a running run, wait up to this long (at most 30s) for new lines before returning an empty page.",
"type": "duration"
}
],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/jobs/*/job_runs/*}:readLogs",
"method": "workflows.job_runs.read_logs",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/jobs/{job}/job_runs/{job_run}"
},
"summary": "Reads a page of a job run's log lines, oldest first. With `wait`, an empty page on a running run waits up to that long for new lines, so a client follows the log by passing each `next_page_token` back.",
"verb": "read-logs"
}
],
"noun": "job-runs",
"resource_type": "workflows.sylphx.com/JobRun"
},
{
"collection": "distributed_jobs",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/distributed_jobs/*}",
"method": "workflows.distributed_jobs.get",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/distributed_jobs/{distributed_job}"
},
"summary": "Gets a distributed job.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/distributed_jobs",
"method": "workflows.distributed_jobs.list",
"paginates": true,
"permission": "workflows:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists distributed jobs.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "distributed_job.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "distributed_job.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "distributed_job.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.service",
"flag": "--spec.worker.service",
"required": true,
"summary": "The Hosting Service whose env and Secret bindings every run takes, and whose live Release image it runs unless `image` or `build` names another, so a Job never runs code the environment does not serve.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.image",
"flag": "--spec.worker.image",
"summary": "A digest-pinned image from this org's Artifacts, in place of the service's image. Exclusive with `build`.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.command",
"flag": "--spec.worker.command",
"repeated": true,
"summary": "The entrypoint; empty keeps the image's.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.args",
"flag": "--spec.worker.args",
"repeated": true,
"summary": "Arguments; a run may replace them.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.env",
"flag": "--spec.worker.env",
"repeated": true,
"summary": "Environment overrides on top of the service's env and Secret bindings.",
"type": "key=value"
},
{
"field": "distributed_job.spec.worker.instance_type",
"flag": "--spec.worker.instance-type",
"summary": "A Hosting instance type; default `standard`.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.timeout",
"flag": "--spec.worker.timeout",
"summary": "One attempt's deadline, 10s to 24h; default 1h.",
"type": "duration"
},
{
"field": "distributed_job.spec.worker.max_retries",
"flag": "--spec.worker.max-retries",
"summary": "Re-runs after a non-zero exit, 0 to 10; backoff 30s doubling.",
"type": "int"
},
{
"field": "distributed_job.spec.worker.concurrency",
"flag": "--spec.worker.concurrency",
"summary": "What a start does while a run is active; default forbid.",
"type": "enum",
"values": [
"forbid",
"queue",
"allow"
]
},
{
"field": "distributed_job.spec.worker.build",
"flag": "--spec.worker.build",
"summary": "A build the project declares: its latest built image, in place of the service's; the image needs no running service of its own. Exclusive with `image`.",
"type": "string"
},
{
"field": "distributed_job.spec.worker_class",
"flag": "--spec.worker-class",
"summary": "Price and preemption class; default scavenger.",
"type": "enum",
"values": [
"scavenger",
"standard"
]
},
{
"field": "distributed_job.spec.scale.min_workers",
"flag": "--spec.scale.min-workers",
"summary": "Workers kept while shards remain; default 1.",
"type": "int"
},
{
"field": "distributed_job.spec.scale.max_workers",
"flag": "--spec.scale.max-workers",
"summary": "The most workers at once; the Cell and the org quota cap it too. Default 1.",
"type": "int"
},
{
"field": "distributed_job.spec.scratch_gib",
"flag": "--spec.scratch-gib",
"summary": "Local scratch disk at `/scratch` per worker, GiB; 0 is none.",
"type": "int"
},
{
"field": "distributed_job.spec.shard_count",
"flag": "--spec.shard-count",
"summary": "A run that brings no shards of its own gets this many index-only shards.",
"type": "int"
},
{
"field": "distributed_job.spec.shard_timeout",
"flag": "--spec.shard-timeout",
"summary": "The longest one lease may live without the shard ending; default 30m.",
"type": "duration"
},
{
"field": "distributed_job.spec.shard_retries",
"flag": "--spec.shard-retries",
"summary": "Attempts a shard gets after a failure; a preemption is not one. Default 3.",
"type": "int"
},
{
"field": "distributed_job.spec.max_failed_shards",
"flag": "--spec.max-failed-shards",
"summary": "Failed shards the run tolerates before it fails; default 0.",
"type": "int"
},
{
"field": "distributed_job.spec.run_timeout",
"flag": "--spec.run-timeout",
"summary": "The whole run's deadline; default 48h.",
"type": "duration"
},
{
"field": "distributed_job.spec.checkpoint_uri",
"flag": "--spec.checkpoint-uri",
"summary": "`data://<bucket>/<prefix>/`: checkpoints go under `<run>/<shard>/`.",
"type": "string"
},
{
"field": "distributed_job.spec.output_uri",
"flag": "--spec.output-uri",
"summary": "`data://<bucket>/<prefix>/`: outputs go under `<run>/<shard>/`.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/distributed_jobs",
"method": "workflows.distributed_jobs.create",
"permission": "workflows:write",
"positional": {
"arg": "ID",
"field": "distributed_job_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "distributed_job",
"summary": "Creates a distributed job.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "distributed_job.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "distributed_job.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "distributed_job.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.service",
"flag": "--spec.worker.service",
"required": true,
"summary": "The Hosting Service whose env and Secret bindings every run takes, and whose live Release image it runs unless `image` or `build` names another, so a Job never runs code the environment does not serve.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.image",
"flag": "--spec.worker.image",
"summary": "A digest-pinned image from this org's Artifacts, in place of the service's image. Exclusive with `build`.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.command",
"flag": "--spec.worker.command",
"repeated": true,
"summary": "The entrypoint; empty keeps the image's.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.args",
"flag": "--spec.worker.args",
"repeated": true,
"summary": "Arguments; a run may replace them.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.env",
"flag": "--spec.worker.env",
"repeated": true,
"summary": "Environment overrides on top of the service's env and Secret bindings.",
"type": "key=value"
},
{
"field": "distributed_job.spec.worker.instance_type",
"flag": "--spec.worker.instance-type",
"summary": "A Hosting instance type; default `standard`.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.timeout",
"flag": "--spec.worker.timeout",
"summary": "One attempt's deadline, 10s to 24h; default 1h.",
"type": "duration"
},
{
"field": "distributed_job.spec.worker.max_retries",
"flag": "--spec.worker.max-retries",
"summary": "Re-runs after a non-zero exit, 0 to 10; backoff 30s doubling.",
"type": "int"
},
{
"field": "distributed_job.spec.worker.concurrency",
"flag": "--spec.worker.concurrency",
"summary": "What a start does while a run is active; default forbid.",
"type": "enum",
"values": [
"forbid",
"queue",
"allow"
]
},
{
"field": "distributed_job.spec.worker.build",
"flag": "--spec.worker.build",
"summary": "A build the project declares: its latest built image, in place of the service's; the image needs no running service of its own. Exclusive with `image`.",
"type": "string"
},
{
"field": "distributed_job.spec.worker_class",
"flag": "--spec.worker-class",
"summary": "Price and preemption class; default scavenger.",
"type": "enum",
"values": [
"scavenger",
"standard"
]
},
{
"field": "distributed_job.spec.scale.min_workers",
"flag": "--spec.scale.min-workers",
"summary": "Workers kept while shards remain; default 1.",
"type": "int"
},
{
"field": "distributed_job.spec.scale.max_workers",
"flag": "--spec.scale.max-workers",
"summary": "The most workers at once; the Cell and the org quota cap it too. Default 1.",
"type": "int"
},
{
"field": "distributed_job.spec.scratch_gib",
"flag": "--spec.scratch-gib",
"summary": "Local scratch disk at `/scratch` per worker, GiB; 0 is none.",
"type": "int"
},
{
"field": "distributed_job.spec.shard_count",
"flag": "--spec.shard-count",
"summary": "A run that brings no shards of its own gets this many index-only shards.",
"type": "int"
},
{
"field": "distributed_job.spec.shard_timeout",
"flag": "--spec.shard-timeout",
"summary": "The longest one lease may live without the shard ending; default 30m.",
"type": "duration"
},
{
"field": "distributed_job.spec.shard_retries",
"flag": "--spec.shard-retries",
"summary": "Attempts a shard gets after a failure; a preemption is not one. Default 3.",
"type": "int"
},
{
"field": "distributed_job.spec.max_failed_shards",
"flag": "--spec.max-failed-shards",
"summary": "Failed shards the run tolerates before it fails; default 0.",
"type": "int"
},
{
"field": "distributed_job.spec.run_timeout",
"flag": "--spec.run-timeout",
"summary": "The whole run's deadline; default 48h.",
"type": "duration"
},
{
"field": "distributed_job.spec.checkpoint_uri",
"flag": "--spec.checkpoint-uri",
"summary": "`data://<bucket>/<prefix>/`: checkpoints go under `<run>/<shard>/`.",
"type": "string"
},
{
"field": "distributed_job.spec.output_uri",
"flag": "--spec.output-uri",
"summary": "`data://<bucket>/<prefix>/`: outputs go under `<run>/<shard>/`.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the distributed job when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{distributed_job.name=orgs/*/projects/*/envs/*/distributed_jobs/*}",
"method": "workflows.distributed_jobs.update",
"permission": "workflows:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "distributed_job.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/distributed_jobs/{distributed_job}"
},
"resource_field": "distributed_job",
"sends_etag": true,
"summary": "Updates a distributed job. Runs already started keep the generation they pinned.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the distributed job does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also cancel active runs; without it a job with an active run fails with INVALID_STATE.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/distributed_jobs/*}",
"method": "workflows.distributed_jobs.delete",
"permission": "workflows:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/distributed_jobs/{distributed_job}"
},
"summary": "Deletes a distributed job.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "distributed-jobs",
"resource_type": "workflows.sylphx.com/DistributedJob"
},
{
"collection": "distributed_runs",
"commands": [
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/distributed_jobs/{distributed_job}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "distributed_run.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "distributed_run.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "distributed_run.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "distributed_run.args",
"flag": "--args",
"repeated": true,
"summary": "Arguments of every worker of this run (the job's when empty).",
"type": "string"
},
{
"field": "distributed_run.env",
"flag": "--env",
"repeated": true,
"summary": "Environment overrides of this run.",
"type": "key=value"
},
{
"field": "distributed_run.shards",
"flag": "--shards",
"repeated": true,
"summary": "The run's own shards (the customer's planner output); without them the job's `shard_count` makes index-only shards.",
"type": "json"
},
{
"field": "distributed_run.open_manifest",
"flag": "--open-manifest",
"summary": "Keep the manifest open: `:addShards` appends until it is closed.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/distributed_jobs/*}/distributed_runs",
"method": "workflows.distributed_runs.create",
"permission": "workflows:run",
"positional": {
"arg": "ID",
"field": "distributed_run_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "distributed_run",
"summary": "Starts a run of a distributed job. The same `Idempotency-Key` returns the same run for 24h.",
"verb": "run"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/distributed_jobs/*/distributed_runs/*}",
"method": "workflows.distributed_runs.get",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/distributed_jobs/{distributed_job}/distributed_runs/{distributed_run}"
},
"summary": "Gets a distributed run: its state, shard and worker counts, and usage.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/distributed_jobs/*}/distributed_runs",
"method": "workflows.distributed_runs.list",
"paginates": true,
"permission": "workflows:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/distributed_jobs/{distributed_job}"
},
"summary": "Lists a distributed job's runs, newest first.",
"verb": "list"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "reason",
"flag": "--reason",
"summary": "Why the run is cancelled.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/distributed_jobs/*/distributed_runs/*}:cancel",
"method": "workflows.distributed_runs.cancel",
"permission": "workflows:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/distributed_jobs/{distributed_job}/distributed_runs/{distributed_run}"
},
"summary": "Cancels a distributed run: workers get SIGTERM and 30s, then leases are released; finished shards are kept. A closed run fails with INVALID_STATE.",
"verb": "cancel"
},
{
"effect": "write",
"flags": [
{
"field": "shards",
"flag": "--shards",
"repeated": true,
"summary": "The shards to append.",
"type": "json"
},
{
"field": "close",
"flag": "--close",
"summary": "Close the manifest: the run ends once its shards are done.",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/distributed_jobs/*/distributed_runs/*}:addShards",
"method": "workflows.distributed_runs.add_shards",
"permission": "workflows:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/distributed_jobs/{distributed_job}/distributed_runs/{distributed_run}"
},
"summary": "Appends shards to a run started with an open manifest; `close` ends the manifest, and the run ends once those shards are done.",
"verb": "add-shards"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 100, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "state_filter",
"flag": "--state-filter",
"summary": "Only shards in this state; unset reads every shard.",
"type": "enum",
"values": [
"pending",
"leased",
"succeeded",
"failed"
]
}
],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/distributed_jobs/*/distributed_runs/*}:readShards",
"method": "workflows.distributed_runs.read_shards",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/distributed_jobs/{distributed_job}/distributed_runs/{distributed_run}"
},
"summary": "Reads a page of the run's shards, in queue order.",
"verb": "read-shards"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 100, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
}
],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/distributed_jobs/*/distributed_runs/*}:readWorkers",
"method": "workflows.distributed_runs.read_workers",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/distributed_jobs/{distributed_job}/distributed_runs/{distributed_run}"
},
"summary": "Reads a page of the run's workers.",
"verb": "read-workers"
}
],
"noun": "distributed-runs",
"resource_type": "workflows.sylphx.com/DistributedRun"
}
],
"commands": [],
"display_name": "Sylphx Workflows",
"noun": "workflows",
"stage": "preview"
}
],
"usage": "sylphx <service> <collection> <verb> [NAME|PARENT] [--flags]"
}