{
"binary": "sylphx",
"generated": "@generated by sylphx-gen. 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": "project.spec.limits.ai_spend.monthly_usd_minor",
"flag": "--spec.limits.ai-spend.monthly-usd-minor",
"summary": "Most spend per calendar month, in USD cents.",
"type": "int"
},
{
"field": "project.spec.limits.ai_spend.daily_usd_minor",
"flag": "--spec.limits.ai-spend.daily-usd-minor",
"summary": "Most spend per calendar day, in USD cents.",
"type": "int"
},
{
"field": "project.spec.limits.requests_per_minute",
"flag": "--spec.limits.requests-per-minute",
"summary": "Requests per minute.",
"type": "int"
},
{
"field": "project.spec.limits.ai_tokens_per_minute",
"flag": "--spec.limits.ai-tokens-per-minute",
"summary": "Sylphx AI tokens per minute, input and output together.",
"type": "int"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "region",
"flag": "--region",
"summary": "The region the project lives in for its whole life. A region that cannot take new projects is refused, never replaced. Unset uses the default region.",
"type": "string"
}
],
"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": "project.spec.limits.ai_spend.monthly_usd_minor",
"flag": "--spec.limits.ai-spend.monthly-usd-minor",
"summary": "Most spend per calendar month, in USD cents.",
"type": "int"
},
{
"field": "project.spec.limits.ai_spend.daily_usd_minor",
"flag": "--spec.limits.ai-spend.daily-usd-minor",
"summary": "Most spend per calendar day, in USD cents.",
"type": "int"
},
{
"field": "project.spec.limits.requests_per_minute",
"flag": "--spec.limits.requests-per-minute",
"summary": "Requests per minute.",
"type": "int"
},
{
"field": "project.spec.limits.ai_tokens_per_minute",
"flag": "--spec.limits.ai-tokens-per-minute",
"summary": "Sylphx AI tokens per minute, input and output together.",
"type": "int"
},
{
"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, project, or 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"
},
{
"field": "api_key.spec.limits.ai_spend.monthly_usd_minor",
"flag": "--spec.limits.ai-spend.monthly-usd-minor",
"summary": "Most spend per calendar month, in USD cents.",
"type": "int"
},
{
"field": "api_key.spec.limits.ai_spend.daily_usd_minor",
"flag": "--spec.limits.ai-spend.daily-usd-minor",
"summary": "Most spend per calendar day, in USD cents.",
"type": "int"
},
{
"field": "api_key.spec.limits.requests_per_minute",
"flag": "--spec.limits.requests-per-minute",
"summary": "Requests per minute.",
"type": "int"
},
{
"field": "api_key.spec.limits.ai_tokens_per_minute",
"flag": "--spec.limits.ai-tokens-per-minute",
"summary": "Sylphx AI tokens per minute, input and output together.",
"type": "int"
}
],
"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": "api_key.spec.limits.ai_spend.monthly_usd_minor",
"flag": "--spec.limits.ai-spend.monthly-usd-minor",
"summary": "Most spend per calendar month, in USD cents.",
"type": "int"
},
{
"field": "api_key.spec.limits.ai_spend.daily_usd_minor",
"flag": "--spec.limits.ai-spend.daily-usd-minor",
"summary": "Most spend per calendar day, in USD cents.",
"type": "int"
},
{
"field": "api_key.spec.limits.requests_per_minute",
"flag": "--spec.limits.requests-per-minute",
"summary": "Requests per minute.",
"type": "int"
},
{
"field": "api_key.spec.limits.ai_tokens_per_minute",
"flag": "--spec.limits.ai-tokens-per-minute",
"summary": "Sylphx AI tokens per minute, input and output together.",
"type": "int"
},
{
"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": "transfers",
"commands": [
{
"effect": "write",
"flags": [
{
"field": "operation_id",
"flag": "--operation-id",
"required": true,
"summary": "Permanent caller identity; exact retries return the original transfer.",
"type": "string"
},
{
"field": "manifest",
"flag": "--manifest",
"required": true,
"summary": "sylphx.agents.session-continuity.v1 manifest. At most 256 parts of 256 KiB, and 64 MiB overall. Source epoch must be a positive signed int64.",
"type": "json"
},
{
"field": "source_fence_sha256",
"flag": "--source-fence-sha256",
"required": true,
"summary": "SHA-256 attestation of the original storage's durable writer marker.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/agent_sessions/*}/transfers:begin",
"method": "agents.transfers.begin",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"summary": "Stages a uniquely identified source epoch on an empty idle Session. The source adapter must already hold its durable one-writer fence.",
"verb": "begin"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*/transfers/*}",
"method": "agents.transfers.get",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}/transfers/{transfer}"
},
"summary": "Returns hashes and original/destination mappings, never private payload.",
"verb": "get"
},
{
"effect": "write",
"flags": [
{
"field": "index",
"flag": "--index",
"required": true,
"summary": "Zero-based declared part index.",
"type": "int"
},
{
"field": "data",
"flag": "--data",
"required": true,
"sensitive": true,
"summary": "Base64 on the JSON wire; exact binary bytes, at most 256 KiB decoded.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*/transfers/*}:writePart",
"method": "agents.transfers.write_part",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}/transfers/{transfer}"
},
"summary": "Stores at most 256 KiB of exact bytes under its declared part digest. An acknowledgement loss can repeat the identical part without mutation.",
"verb": "write-part"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*/transfers/*}:finalize",
"method": "agents.transfers.finalize",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}/transfers/{transfer}"
},
"summary": "Re-reads ordered parts, checks the whole snapshot and validates the portable state. An unknown effect stays held; this call never executes.",
"verb": "finalize"
},
{
"effect": "write",
"flags": [
{
"field": "receipt_sha256",
"flag": "--receipt-sha256",
"required": true,
"summary": "Exact read-back receipt durably recorded by the original source adapter.",
"type": "string"
},
{
"field": "source_fence_sha256",
"flag": "--source-fence-sha256",
"required": true,
"summary": "The original one-writer marker attestation bound at Begin.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*/transfers/*}:adopt",
"method": "agents.transfers.adopt",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}/transfers/{transfer}"
},
"summary": "After the source durably records the exact verified receipt under its writer fence, atomically projects conserved state without starting a turn. Unknown outcomes or incompatible pinned model context remain held.",
"verb": "adopt"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*/transfers/*}:abort",
"method": "agents.transfers.abort",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}/transfers/{transfer}"
},
"summary": "Releases only a destination that has not adopted source state. Immutable source bytes/epoch remain retained; source writer release is app-owned.",
"verb": "abort"
}
],
"noun": "transfers",
"resource_type": "agents.sylphx.com/AgentSessionTransfer"
},
{
"collection": "agents",
"commands": [
{
"effect": "write",
"flags": [
{
"field": "session",
"flag": "--session",
"required": true,
"summary": "The prospective or existing session to bind this handle to.",
"type": "string"
},
{
"field": "turn",
"flag": "--turn",
"required": true,
"summary": "The turn allowed to use the execution credential.",
"type": "int"
},
{
"field": "credential",
"flag": "--credential",
"required": true,
"sensitive": true,
"summary": "The existing caller-owned credential, stored encrypted and never logged.",
"type": "string"
},
{
"field": "expires_at",
"flag": "--expires-at",
"required": true,
"summary": "The issuer-provided expiry of the captured credential.",
"type": "timestamp"
},
{
"field": "allowed_tools",
"flag": "--allowed-tools",
"repeated": true,
"required": true,
"summary": "Pinned tool names allowed to inject this credential.",
"type": "string"
},
{
"field": "purpose",
"flag": "--purpose",
"required": true,
"summary": "execution, completion, or runtime; runtime handles never enter the guest.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/agents:capture-credential",
"method": "agents.agents.capture_credential",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Captures an existing grant for one session and purpose; never issues a key.",
"verb": "capture-credential"
},
{
"effect": "write",
"flags": [
{
"field": "handle",
"flag": "--handle",
"required": true,
"sensitive": true,
"summary": "The opaque handle whose captured credential is being replaced.",
"type": "string"
},
{
"field": "generation",
"flag": "--generation",
"required": true,
"summary": "The current handle generation; stale rotations are refused.",
"type": "int"
},
{
"field": "credential",
"flag": "--credential",
"required": true,
"sensitive": true,
"summary": "The replacement issuer-provided credential, stored encrypted.",
"type": "string"
},
{
"field": "expires_at",
"flag": "--expires-at",
"required": true,
"summary": "The issuer-provided expiry of the replacement credential.",
"type": "timestamp"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/agents:rotate-credential",
"method": "agents.agents.rotate_credential",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Rotates the captured value under the same handle with generation fencing.",
"verb": "rotate-credential"
},
{
"effect": "write",
"flags": [
{
"field": "handle",
"flag": "--handle",
"required": true,
"sensitive": true,
"summary": "The opaque handle to revoke; repeated revocation is harmless.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/agents:revoke-credential",
"method": "agents.agents.revoke_credential",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Revokes one captured handle. Repeating the revocation is harmless.",
"verb": "revoke-credential"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/agents/*}",
"method": "agents.agents.get",
"permission": "agents:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agents/{agent}"
},
"summary": "Gets an agent.",
"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/*}/agents",
"method": "agents.agents.list",
"paginates": true,
"permission": "agents:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists agents.",
"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": "agent.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "agent.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "agent.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "agent.spec.instructions",
"flag": "--spec.instructions",
"summary": "The system instructions, at most 256 KiB.",
"type": "string"
},
{
"field": "agent.spec.tools",
"flag": "--spec.tools",
"repeated": true,
"summary": "The tools the agent may call, at most 128, each `name` once.",
"type": "json"
},
{
"field": "agent.spec.mcp_servers",
"flag": "--spec.mcp-servers",
"repeated": true,
"summary": "The MCP servers whose tools the agent may call, at most 32.",
"type": "json"
},
{
"field": "agent.spec.skills",
"flag": "--spec.skills",
"repeated": true,
"summary": "Skills: instruction packs the agent loads when relevant, at most 64.",
"type": "json"
},
{
"field": "agent.spec.memory_stores",
"flag": "--spec.memory-stores",
"repeated": true,
"summary": "The memory stores the agent recalls from and writes to, as MemoryStore names; at most 8.",
"type": "string"
},
{
"field": "agent.spec.tool_policy.default_decision",
"flag": "--spec.tool-policy.default-decision",
"summary": "The decision for a call no rule matches; default allow.",
"type": "enum",
"values": [
"allow",
"deny",
"ask"
]
},
{
"field": "agent.spec.tool_policy.rules",
"flag": "--spec.tool-policy.rules",
"repeated": true,
"summary": "Rules in order; the first match decides. At most 256.",
"type": "json"
},
{
"field": "agent.spec.tool_policy.approval_timeout",
"flag": "--spec.tool-policy.approval-timeout",
"summary": "How long a call waits for a person's answer before it is denied, 1m to 7d; default 24h.",
"type": "duration"
},
{
"field": "agent.spec.tool_policy.egress_allow_hosts",
"flag": "--spec.tool-policy.egress-allow-hosts",
"repeated": true,
"summary": "Hosts every network call of the agent's tools may reach, beyond the tools' own endpoints; `*.example.com` matches subdomains. Private and internal addresses are refused whatever this says.",
"type": "string"
},
{
"field": "agent.spec.budget.max_steps_per_turn",
"flag": "--spec.budget.max-steps-per-turn",
"summary": "Model and tool steps per turn, 1 to 1000; default 100.",
"type": "int"
},
{
"field": "agent.spec.budget.turn_timeout",
"flag": "--spec.budget.turn-timeout",
"summary": "One turn's wall-clock deadline, 10s to 24h; default 30m.",
"type": "duration"
},
{
"field": "agent.spec.budget.max_session_spend_micros",
"flag": "--spec.budget.max-session-spend-micros",
"summary": "Spend per session in micro-USD, models and tools together; 0 is the project's spend limit only.",
"type": "int"
},
{
"field": "agent.spec.end_user_access",
"flag": "--spec.end-user-access",
"summary": "Whether end-user session access is intended for this agent. Reserved until the backend enforces end-user ownership; all contract methods currently require a secret key.",
"type": "bool"
},
{
"field": "agent.spec.environment.shape",
"flag": "--spec.environment.shape",
"summary": "A Sylphx Sandboxes shape; empty gives sessions no environment.",
"type": "string"
},
{
"field": "agent.spec.environment.idle_standby",
"flag": "--spec.environment.idle-standby",
"summary": "Put the environment in standby after this long idle, 1m to 24h; default 10m.",
"type": "duration"
},
{
"field": "agent.spec.environment.template",
"flag": "--spec.environment.template",
"summary": "The Sandboxes image: `template:<name>` or an artifact image by digest, passed unchanged to the lease's `image` field.",
"type": "string"
},
{
"field": "agent.spec.environment.repo.uri",
"flag": "--spec.environment.repo.uri",
"summary": "The repository URI. Access uses the session's bound credential handles.",
"type": "string"
},
{
"field": "agent.spec.environment.repo.revision",
"flag": "--spec.environment.repo.revision",
"summary": "The commit or ref to check out; empty uses the repository's default branch.",
"type": "string"
},
{
"field": "agent.spec.environment.egress.egress",
"flag": "--spec.environment.egress.egress",
"summary": "Default ALLOW.",
"type": "enum",
"values": [
"allow",
"deny",
"allowlist"
]
},
{
"field": "agent.spec.environment.egress.allowed_domains",
"flag": "--spec.environment.egress.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": "agent.spec.environment.egress.allowed_cidrs",
"flag": "--spec.environment.egress.allowed-cidrs",
"repeated": true,
"summary": "Public CIDRs reachable when `egress` is ALLOWLIST.",
"type": "string"
},
{
"field": "agent.spec.environment.budget.max_cpu_seconds",
"flag": "--spec.environment.budget.max-cpu-seconds",
"summary": "End CPU_BUDGET after this many vCPU-seconds of guest CPU time.",
"type": "int"
},
{
"field": "agent.spec.environment.budget.max_cost_micros",
"flag": "--spec.environment.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": "agent.spec.environment.ttl",
"flag": "--spec.environment.ttl",
"summary": "The lease's maximum wall time, passed to Sandboxes as `ttl`. The lease is released when the session ends even if this bound has not been reached.",
"type": "duration"
},
{
"field": "agent.spec.models.primary",
"flag": "--spec.models.primary",
"required": true,
"summary": "The exact Sylphx AI catalog id (`ai_models`) of the owner model, pinned for the life of a session; the runtime never remaps it.",
"type": "string"
},
{
"field": "agent.spec.models.light",
"flag": "--spec.models.light",
"required": true,
"summary": "The exact catalog id of the cheap model used only for owner-briefed `subcall.*` tools and in-loop compaction; never an owner.",
"type": "string"
},
{
"field": "agent.spec.read_only",
"flag": "--spec.read-only",
"summary": "Read-only: the version holds no write grant, so it may verify another agent's work but never own it. Create and update refuse memory stores, MCP servers, `app_function` and `client` tools, the `memory`, `browser` and `computer` built-ins, and an HTTP tool whose pinned operation is not GET or HEAD unless it is `runtime_only`. The `shell` and `files` built-ins, and a `claude_code` or `codex` harness (which bring their own), need `environment.egress` that denies by default: `DENY`, or `ALLOWLIST` of the configured Sylphx API and inference gateways and the version's GET or HEAD tool hosts, with no CIDRs. Session create, `:send` and `:run` check the version and the session's effective environment again, and refuse any model-facing credential that is not a captured Access key holding only `<service>:read` and `ai:inference` scopes; a renewal's `credential_updates` value for a model-facing binding is held to the same rule. A run's `completion.result_fields` never map into the completion tool's path or query parameters. An OwnerPool never qualifies the version.",
"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/*}/agents",
"method": "agents.agents.create",
"permission": "agents:write",
"positional": {
"arg": "ID",
"field": "agent_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "agent",
"summary": "Creates an agent and its version 1.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "agent.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "agent.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "agent.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "agent.spec.instructions",
"flag": "--spec.instructions",
"summary": "The system instructions, at most 256 KiB.",
"type": "string"
},
{
"field": "agent.spec.tools",
"flag": "--spec.tools",
"repeated": true,
"summary": "The tools the agent may call, at most 128, each `name` once.",
"type": "json"
},
{
"field": "agent.spec.mcp_servers",
"flag": "--spec.mcp-servers",
"repeated": true,
"summary": "The MCP servers whose tools the agent may call, at most 32.",
"type": "json"
},
{
"field": "agent.spec.skills",
"flag": "--spec.skills",
"repeated": true,
"summary": "Skills: instruction packs the agent loads when relevant, at most 64.",
"type": "json"
},
{
"field": "agent.spec.memory_stores",
"flag": "--spec.memory-stores",
"repeated": true,
"summary": "The memory stores the agent recalls from and writes to, as MemoryStore names; at most 8.",
"type": "string"
},
{
"field": "agent.spec.tool_policy.default_decision",
"flag": "--spec.tool-policy.default-decision",
"summary": "The decision for a call no rule matches; default allow.",
"type": "enum",
"values": [
"allow",
"deny",
"ask"
]
},
{
"field": "agent.spec.tool_policy.rules",
"flag": "--spec.tool-policy.rules",
"repeated": true,
"summary": "Rules in order; the first match decides. At most 256.",
"type": "json"
},
{
"field": "agent.spec.tool_policy.approval_timeout",
"flag": "--spec.tool-policy.approval-timeout",
"summary": "How long a call waits for a person's answer before it is denied, 1m to 7d; default 24h.",
"type": "duration"
},
{
"field": "agent.spec.tool_policy.egress_allow_hosts",
"flag": "--spec.tool-policy.egress-allow-hosts",
"repeated": true,
"summary": "Hosts every network call of the agent's tools may reach, beyond the tools' own endpoints; `*.example.com` matches subdomains. Private and internal addresses are refused whatever this says.",
"type": "string"
},
{
"field": "agent.spec.budget.max_steps_per_turn",
"flag": "--spec.budget.max-steps-per-turn",
"summary": "Model and tool steps per turn, 1 to 1000; default 100.",
"type": "int"
},
{
"field": "agent.spec.budget.turn_timeout",
"flag": "--spec.budget.turn-timeout",
"summary": "One turn's wall-clock deadline, 10s to 24h; default 30m.",
"type": "duration"
},
{
"field": "agent.spec.budget.max_session_spend_micros",
"flag": "--spec.budget.max-session-spend-micros",
"summary": "Spend per session in micro-USD, models and tools together; 0 is the project's spend limit only.",
"type": "int"
},
{
"field": "agent.spec.end_user_access",
"flag": "--spec.end-user-access",
"summary": "Whether end-user session access is intended for this agent. Reserved until the backend enforces end-user ownership; all contract methods currently require a secret key.",
"type": "bool"
},
{
"field": "agent.spec.environment.shape",
"flag": "--spec.environment.shape",
"summary": "A Sylphx Sandboxes shape; empty gives sessions no environment.",
"type": "string"
},
{
"field": "agent.spec.environment.idle_standby",
"flag": "--spec.environment.idle-standby",
"summary": "Put the environment in standby after this long idle, 1m to 24h; default 10m.",
"type": "duration"
},
{
"field": "agent.spec.environment.template",
"flag": "--spec.environment.template",
"summary": "The Sandboxes image: `template:<name>` or an artifact image by digest, passed unchanged to the lease's `image` field.",
"type": "string"
},
{
"field": "agent.spec.environment.repo.uri",
"flag": "--spec.environment.repo.uri",
"summary": "The repository URI. Access uses the session's bound credential handles.",
"type": "string"
},
{
"field": "agent.spec.environment.repo.revision",
"flag": "--spec.environment.repo.revision",
"summary": "The commit or ref to check out; empty uses the repository's default branch.",
"type": "string"
},
{
"field": "agent.spec.environment.egress.egress",
"flag": "--spec.environment.egress.egress",
"summary": "Default ALLOW.",
"type": "enum",
"values": [
"allow",
"deny",
"allowlist"
]
},
{
"field": "agent.spec.environment.egress.allowed_domains",
"flag": "--spec.environment.egress.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": "agent.spec.environment.egress.allowed_cidrs",
"flag": "--spec.environment.egress.allowed-cidrs",
"repeated": true,
"summary": "Public CIDRs reachable when `egress` is ALLOWLIST.",
"type": "string"
},
{
"field": "agent.spec.environment.budget.max_cpu_seconds",
"flag": "--spec.environment.budget.max-cpu-seconds",
"summary": "End CPU_BUDGET after this many vCPU-seconds of guest CPU time.",
"type": "int"
},
{
"field": "agent.spec.environment.budget.max_cost_micros",
"flag": "--spec.environment.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": "agent.spec.environment.ttl",
"flag": "--spec.environment.ttl",
"summary": "The lease's maximum wall time, passed to Sandboxes as `ttl`. The lease is released when the session ends even if this bound has not been reached.",
"type": "duration"
},
{
"field": "agent.spec.models.primary",
"flag": "--spec.models.primary",
"required": true,
"summary": "The exact Sylphx AI catalog id (`ai_models`) of the owner model, pinned for the life of a session; the runtime never remaps it.",
"type": "string"
},
{
"field": "agent.spec.models.light",
"flag": "--spec.models.light",
"required": true,
"summary": "The exact catalog id of the cheap model used only for owner-briefed `subcall.*` tools and in-loop compaction; never an owner.",
"type": "string"
},
{
"field": "agent.spec.read_only",
"flag": "--spec.read-only",
"summary": "Read-only: the version holds no write grant, so it may verify another agent's work but never own it. Create and update refuse memory stores, MCP servers, `app_function` and `client` tools, the `memory`, `browser` and `computer` built-ins, and an HTTP tool whose pinned operation is not GET or HEAD unless it is `runtime_only`. The `shell` and `files` built-ins, and a `claude_code` or `codex` harness (which bring their own), need `environment.egress` that denies by default: `DENY`, or `ALLOWLIST` of the configured Sylphx API and inference gateways and the version's GET or HEAD tool hosts, with no CIDRs. Session create, `:send` and `:run` check the version and the session's effective environment again, and refuse any model-facing credential that is not a captured Access key holding only `<service>:read` and `ai:inference` scopes; a renewal's `credential_updates` value for a model-facing binding is held to the same rule. A run's `completion.result_fields` never map into the completion tool's path or query parameters. An OwnerPool never qualifies the version.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the agent 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/{agent.name=orgs/*/projects/*/envs/*/agents/*}",
"method": "agents.agents.update",
"permission": "agents:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "agent.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agents/{agent}"
},
"resource_field": "agent",
"sends_etag": true,
"summary": "Updates an agent. A change to `spec` mints the next AgentVersion; sessions already started keep the version they pinned.",
"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 agent 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 agent's sessions; without it, an agent with sessions is refused with `INVALID_STATE`.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/agents/*}",
"method": "agents.agents.delete",
"permission": "agents:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agents/{agent}"
},
"summary": "Deletes an agent and its versions. An agent with sessions is refused with `INVALID_STATE` unless `force` is set, which deletes them too.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "agent_version",
"flag": "--agent-version",
"required": true,
"summary": "The immutable agent version pinned for this task attempt.",
"type": "string"
},
{
"field": "agent_session_id",
"flag": "--agent-session-id",
"required": true,
"summary": "The stable session identifier; reusing it for another attempt is refused.",
"type": "string"
},
{
"field": "message",
"flag": "--message",
"required": true,
"summary": "The initial task message appended atomically with session acceptance.",
"type": "json"
},
{
"field": "environment",
"flag": "--environment",
"summary": "Optional overrides of the environment in the pinned AgentVersion's frozen spec, never the Agent's current head. Omitted or empty with no mask keeps that default unchanged. Only selected fields are overlaid; see environment_mask. The effective environment must have a supported shape, finite positive TTL and valid repository, network and budget before admission.",
"type": "json"
},
{
"field": "credentials",
"flag": "--credentials",
"repeated": true,
"summary": "Captured credential bindings by alias; credentials never enter context.",
"type": "key=value"
},
{
"field": "profiles",
"flag": "--profiles",
"repeated": true,
"summary": "Granted profile mounts for the fresh session lease.",
"type": "json"
},
{
"field": "completion",
"flag": "--completion",
"required": true,
"summary": "The pinned tool call used by the runtime to deliver the terminal result.",
"type": "json"
},
{
"field": "workspace_knowledge",
"flag": "--workspace-knowledge",
"summary": "Opaque, claim-pinned workspace knowledge, including its rendered instruction.",
"type": "json"
},
{
"field": "task_ref",
"flag": "--task-ref",
"summary": "Caller-owned opaque reference, not interpreted by Agents.",
"type": "string"
},
{
"field": "renewal",
"flag": "--renewal",
"summary": "Optional pinned grant-renewal call, owned by the runtime after acceptance.",
"type": "json"
},
{
"field": "runtime_credential_handle",
"flag": "--runtime-credential-handle",
"required": true,
"sensitive": true,
"summary": "Same-session handle to a caller-owned scoped Access credential. Runtime only, never installed in the guest or sent to the model.",
"type": "string"
},
{
"field": "environment_mask",
"flag": "--environment-mask",
"summary": "Fields of environment to overlay, relative to EnvironmentSpec, using proto snake_case paths such as ttl, repo.uri, repo.revision, egress.allowed_domains and budget.max_cost_micros. The wire value is a comma-separated string; SDK property naming does not change these paths. Omitted or empty infers populated serialized leaf fields recursively, preserving unselected siblings from the pinned version. Proto defaults (including empty lists) need an explicit mask to reset a selected field. Selected lists replace, rather than append to, the inherited list. The sole path \"*\" replaces the whole environment, resetting unpopulated fields. Unknown, invalid and output-only paths are rejected, as is a nonempty mask without environment. Effective validation also applies to explicit resets and whole-environment replacement.",
"type": "json"
},
{
"field": "item_key",
"flag": "--item-key",
"summary": "The caller's stable identity of the work item, not interpreted otherwise. Every session and attempt with the same item key works on one repository branch derived from it, so a new attempt continues the pushed work. Omitted, the session is the item.",
"type": "string"
},
{
"field": "owner_pool",
"flag": "--owner-pool",
"summary": "The OwnerPool this run owns work for. Admission refuses with `INVALID_STATE` unless `agent_version` is a `QUALIFIED` member at that moment; later turns of the session are not re-checked.",
"type": "string"
},
{
"field": "verifies",
"flag": "--verifies",
"repeated": true,
"summary": "The maker sessions this run verifies, 1 to 16; empty for an ordinary run. Admission refuses with `PERMISSION_DENIED` unless `agent_version` is read-only and its Agent differs from every maker session's Agent. The verifier session never receives a maker transcript. Set at most one of `owner_pool` and `verifies`.",
"type": "string"
},
{
"field": "organization_layer",
"flag": "--organization-layer",
"summary": "The organization layer the caller binds at assignment, read from its own versioned store. The session pins it; see AgentSession.organization_layer.",
"type": "json"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agents/*}:run",
"method": "agents.agents.run",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agents/{agent}"
},
"summary": "Atomically admits a pinned task session, initial event and pending turn.",
"verb": "run"
}
],
"noun": "agents",
"resource_type": "agents.sylphx.com/Agent"
},
{
"collection": "agent_versions",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/agents/*/agent_versions/*}",
"method": "agents.agent_versions.get",
"permission": "agents:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agents/{agent}/agent_versions/{agent_version}"
},
"summary": "Gets an agent 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, limited to `version_number`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/agents/*}/agent_versions",
"method": "agents.agent_versions.list",
"paginates": true,
"permission": "agents:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agents/{agent}"
},
"summary": "Lists an agent's versions, newest first.",
"verb": "list"
}
],
"noun": "agent-versions",
"resource_type": "agents.sylphx.com/AgentVersion"
},
{
"collection": "agent_sessions",
"commands": [
{
"effect": "write",
"flags": [
{
"field": "turn",
"flag": "--turn",
"required": true,
"summary": "The live turn whose execution capability authorizes the call.",
"type": "int"
},
{
"field": "tool",
"flag": "--tool",
"required": true,
"summary": "The tool name in the session's pinned agent version.",
"type": "string"
},
{
"field": "arguments",
"flag": "--arguments",
"required": true,
"summary": "The tool input, validated against its pinned input schema.",
"type": "json"
},
{
"field": "op_id",
"flag": "--op-id",
"required": true,
"summary": "The stable operation identifier, reused for idempotent tool-call retries.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*}:invoke-tool",
"method": "agents.agent_sessions.invoke_tool",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"summary": "Guest execution capability authentication, not an Access management key. Preserve any JSON tool result, including scalars and arrays.",
"verb": "invoke-tool"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*}:tool-catalog",
"method": "agents.agent_sessions.tool_catalog",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"summary": "The immutable pinned HTTP-tool catalog exposed to the guest's MCP bridge.",
"verb": "tool-catalog"
},
{
"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": "agent_session.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "agent_session.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "agent_session.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "agent_session.agent",
"flag": "--agent",
"required": true,
"summary": "The Agent the session talks to.",
"type": "string"
},
{
"field": "agent_session.agent_version",
"flag": "--agent-version",
"summary": "The AgentVersion the session pinned; the Agent's current version when unset at create.",
"type": "string"
},
{
"field": "agent_session.title",
"flag": "--title",
"summary": "A short title; set by the caller or summarised by the runtime.",
"type": "string"
},
{
"field": "agent_session.environment.shape",
"flag": "--environment.shape",
"summary": "A Sylphx Sandboxes shape; empty gives sessions no environment.",
"type": "string"
},
{
"field": "agent_session.environment.idle_standby",
"flag": "--environment.idle-standby",
"summary": "Put the environment in standby after this long idle, 1m to 24h; default 10m.",
"type": "duration"
},
{
"field": "agent_session.environment.template",
"flag": "--environment.template",
"summary": "The Sandboxes image: `template:<name>` or an artifact image by digest, passed unchanged to the lease's `image` field.",
"type": "string"
},
{
"field": "agent_session.environment.repo.uri",
"flag": "--environment.repo.uri",
"summary": "The repository URI. Access uses the session's bound credential handles.",
"type": "string"
},
{
"field": "agent_session.environment.repo.revision",
"flag": "--environment.repo.revision",
"summary": "The commit or ref to check out; empty uses the repository's default branch.",
"type": "string"
},
{
"field": "agent_session.environment.egress.egress",
"flag": "--environment.egress.egress",
"summary": "Default ALLOW.",
"type": "enum",
"values": [
"allow",
"deny",
"allowlist"
]
},
{
"field": "agent_session.environment.egress.allowed_domains",
"flag": "--environment.egress.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": "agent_session.environment.egress.allowed_cidrs",
"flag": "--environment.egress.allowed-cidrs",
"repeated": true,
"summary": "Public CIDRs reachable when `egress` is ALLOWLIST.",
"type": "string"
},
{
"field": "agent_session.environment.budget.max_cpu_seconds",
"flag": "--environment.budget.max-cpu-seconds",
"summary": "End CPU_BUDGET after this many vCPU-seconds of guest CPU time.",
"type": "int"
},
{
"field": "agent_session.environment.budget.max_cost_micros",
"flag": "--environment.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": "agent_session.environment.ttl",
"flag": "--environment.ttl",
"summary": "The lease's maximum wall time, passed to Sandboxes as `ttl`. The lease is released when the session ends even if this bound has not been reached.",
"type": "duration"
},
{
"field": "agent_session.credentials",
"flag": "--credentials",
"repeated": true,
"summary": "Session-scoped credential bindings, keyed by the tool or MCP credential name. Values are references or opaque handles, never secret values.",
"type": "key=value"
},
{
"field": "agent_session.profiles",
"flag": "--profiles",
"repeated": true,
"summary": "Granted platform Profiles to mount when the session starts, each by resource name and mode. The runtime never puts profile values in events.",
"type": "json"
},
{
"field": "agent_session.organization_layer.instructions",
"flag": "--organization-layer.instructions",
"summary": "Always loaded organization instructions, at most 256 KiB.",
"type": "string"
},
{
"field": "agent_session.organization_layer.skills",
"flag": "--organization-layer.skills",
"repeated": true,
"summary": "Up to 256 skills with unique names; the layer is at most 1 MiB in total.",
"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/*}/agent_sessions",
"method": "agents.agent_sessions.create",
"permission": "agents:sessions",
"positional": {
"arg": "ID",
"field": "agent_session_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "agent_session",
"summary": "Starts a session of an agent, pinned to its current version unless `agent_version` names another. Requires a secret key until end-user ownership is implemented. The session starts idle; `:send` starts its first turn.",
"verb": "create"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*}",
"method": "agents.agent_sessions.get",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_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, limited to `agent`, `end_user` and `state`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/agent_sessions",
"method": "agents.agent_sessions.list",
"paginates": true,
"permission": "agents:sessions",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists sessions, newest first. With a publishable key, only the caller's end user's sessions.",
"verb": "list"
},
{
"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 session 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": "Interrupt a running turn and delete; without it, a running session is refused with `INVALID_STATE`.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*}",
"method": "agents.agent_sessions.delete",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"summary": "Deletes a session and its events. A session whose turn is running is refused with `INVALID_STATE` unless `force` is set, which interrupts it first.",
"verb": "delete"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*}:archive",
"method": "agents.agent_sessions.archive",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"summary": "Archives a session: the session and its event log stay readable, but no new turn may start and the session's captured credential handles are revoked. An idle or failed session archives at once; a running turn is refused with `INVALID_STATE` (interrupt it first). Repeating the call with the same `Idempotency-Key` returns the same session.",
"verb": "archive"
},
{
"effect": "write",
"flags": [
{
"field": "execution",
"flag": "--execution",
"required": true,
"summary": "Existing handles captured by this caller for this exact future turn.",
"type": "json"
},
{
"field": "goal",
"flag": "--goal",
"summary": "Exact current Goal, or empty only when the Session has no Goal.",
"type": "string"
},
{
"field": "expected_goal_version",
"flag": "--expected-goal-version",
"summary": "Required for a Goal; its observed contract version when granting authority.",
"type": "int"
},
{
"field": "operation_id",
"flag": "--operation-id",
"required": true,
"summary": "Permanent caller mutation identity, at most 128 bytes.",
"type": "string"
},
{
"field": "expected_generation",
"flag": "--expected-generation",
"summary": "Zero on first creation; replacing authority requires its exact generation.",
"type": "int"
},
{
"field": "automatic",
"flag": "--automatic",
"summary": "Explicitly authorize automatic ready-wait resume with these exact captures. Default false only reserves them. Requires captured agents:sessions as well as runtime permissions; owner holds and ordinary admission still apply.",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*}:queueExecution",
"method": "agents.agent_sessions.queue_execution",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"summary": "Explicitly reserves existing captured authority for one future turn, without executing it.",
"verb": "queue-execution"
},
{
"effect": "write",
"flags": [
{
"field": "operation_id",
"flag": "--operation-id",
"required": true,
"summary": "Permanent caller mutation identity, at most 128 bytes.",
"type": "string"
},
{
"field": "waits",
"flag": "--waits",
"repeated": true,
"required": true,
"summary": "Exact ready owners, 1 to 16; must include all outstanding Session waits.",
"type": "string"
},
{
"field": "execution",
"flag": "--execution",
"required": true,
"summary": "Fresh handles captured for this exact next turn; no Task is required.",
"type": "json"
},
{
"field": "queued_execution_generation",
"flag": "--queued-execution-generation",
"summary": "Nonzero for automatic continuation: require this exact queued authority generation, caller, Goal terms and execution. Zero is explicit fresh caller admission. A delayed automatic callback never selects a replacement.",
"type": "int"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*}:resume",
"method": "agents.agent_sessions.resume",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"summary": "Consumes all ready owners atomically with fresh exact-next-turn authority.",
"verb": "resume"
},
{
"effect": "write",
"flags": [
{
"field": "message",
"flag": "--message",
"required": true,
"summary": "The message, 1 to 64 parts.",
"type": "json"
},
{
"field": "execution",
"flag": "--execution",
"summary": "Captured authority for a new hosted turn. Required when starting a turn with the hosted runtime; an active-turn steer must omit it. Admission checks the exact turn and pins these inputs atomically with the message.",
"type": "json"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*}:send",
"method": "agents.agent_sessions.send",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"summary": "Sends a user message. On an idle or failed session it starts a new turn; while a turn runs it is refused with `INVALID_STATE` (use `:steer`). The same `Idempotency-Key` returns the same event.",
"verb": "send"
},
{
"effect": "write",
"flags": [
{
"field": "message",
"flag": "--message",
"required": true,
"summary": "The message, 1 to 64 parts.",
"type": "json"
},
{
"field": "execution",
"flag": "--execution",
"summary": "Captured authority for a new hosted turn. Required when starting a turn with the hosted runtime; an active-turn steer must omit it. Admission checks the exact turn and pins these inputs atomically with the message.",
"type": "json"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*}:steer",
"method": "agents.agent_sessions.steer",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"summary": "Sends a message into the running turn; the agent reads it at its next step. On an idle session it is the same as `:send`.",
"verb": "steer"
},
{
"effect": "write",
"flags": [
{
"field": "reason",
"flag": "--reason",
"summary": "Why, recorded on the status event; at most 500 characters.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*}:interrupt",
"method": "agents.agent_sessions.interrupt",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"summary": "Stops the running turn at its current step. Calls already made keep their results; the session becomes idle. A no-op on an idle session.",
"verb": "interrupt"
},
{
"effect": "write",
"flags": [
{
"field": "call_id",
"flag": "--call-id",
"required": true,
"summary": "The waiting ToolCall's `id`.",
"type": "string"
},
{
"field": "decision",
"flag": "--decision",
"required": true,
"summary": "The answer.",
"type": "enum",
"values": [
"approve",
"reject"
]
},
{
"field": "remember",
"flag": "--remember",
"summary": "Also allow later calls of the same tool in this session without asking (\"always allow\"); only with APPROVE.",
"type": "bool"
},
{
"field": "reason",
"flag": "--reason",
"summary": "Why, at most 500 characters; the agent reads it with a rejection.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*}:decideApproval",
"method": "agents.agent_sessions.decide_approval",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"served": false,
"summary": "Answers a tool call waiting for approval; the turn continues.",
"verb": "decide-approval"
},
{
"effect": "write",
"flags": [
{
"field": "call_id",
"flag": "--call-id",
"required": true,
"summary": "The waiting client ToolCall's `id`.",
"type": "string"
},
{
"field": "output",
"flag": "--output",
"required": true,
"summary": "The result, at most 1 MiB of JSON.",
"type": "json"
},
{
"field": "error",
"flag": "--error",
"summary": "Whether the call failed; `output` then holds the error.",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*}:submitToolResult",
"method": "agents.agent_sessions.submit_tool_result",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"summary": "Returns the result of a client tool call; the turn continues.",
"verb": "submit-tool-result"
}
],
"noun": "agent-sessions",
"resource_type": "agents.sylphx.com/AgentSession"
},
{
"collection": "goals",
"commands": [
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "agent_session_goal.objective",
"flag": "--objective",
"required": true,
"summary": "The objective, nonempty and at most 4,000 characters.",
"type": "string"
},
{
"field": "agent_session_goal.token_budget",
"flag": "--token-budget",
"summary": "Omit unless the caller explicitly requests a positive token budget.",
"type": "int"
},
{
"field": "operation_id",
"flag": "--operation-id",
"required": true,
"summary": "Caller-stable mutation identity, nonempty and at most 128 bytes.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/agent_sessions/*}/goals",
"method": "agents.goals.create",
"permission": "agents:sessions",
"positional": null,
"resource_field": "agent_session_goal",
"summary": "Creates an optional objective owned by this Session, without an external Task. The operation_id keeps the original receipt beyond request replay expiry.",
"verb": "create"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*/goals/*}",
"method": "agents.goals.get",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}/goals/{goal}"
},
"summary": "Reads the exact Goal, including its terminal receipt after a successor starts.",
"verb": "get"
},
{
"effect": "write",
"flags": [
{
"field": "expected_version",
"flag": "--expected-version",
"required": true,
"summary": "The acceptance-contract version observed by the caller.",
"type": "int"
},
{
"field": "state",
"flag": "--state",
"required": true,
"summary": "Only COMPLETED and FAILED settle a Goal. Waiting is not success.",
"type": "enum",
"values": [
"working",
"waiting",
"completed",
"failed"
]
},
{
"field": "receipt",
"flag": "--receipt",
"required": true,
"summary": "An actual observation at the delivered environment surface.",
"type": "json"
},
{
"field": "operation_id",
"flag": "--operation-id",
"required": true,
"summary": "Caller-stable mutation identity, nonempty and at most 128 bytes.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*/goals/*}:settle",
"method": "agents.goals.settle",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}/goals/{goal}"
},
"summary": "Settles only the named Goal/version with an observed environment receipt. Replaying operation_id returns its original receipt, never its successor.",
"verb": "settle"
},
{
"effect": "write",
"flags": [
{
"field": "expected_version",
"flag": "--expected-version",
"required": true,
"summary": "The contract version observed by the owner.",
"type": "int"
},
{
"field": "action",
"flag": "--action",
"required": true,
"summary": "Explicit owner action. Only AMEND accepts objective/budget changes.",
"type": "enum",
"values": [
"pause",
"resume",
"amend"
]
},
{
"field": "operation_id",
"flag": "--operation-id",
"required": true,
"summary": "Caller-stable mutation identity, nonempty and at most 128 bytes.",
"type": "string"
},
{
"field": "objective",
"flag": "--objective",
"summary": "New objective, only when amending. Omission preserves the existing text.",
"type": "string"
},
{
"field": "token_budget",
"flag": "--token-budget",
"summary": "New explicit token budget, only when amending. Omission preserves it.",
"type": "int"
},
{
"field": "clear_token_budget",
"flag": "--clear-token-budget",
"summary": "Explicitly remove a budget when amending; incompatible with token_budget.",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*/goals/*}:control",
"method": "agents.goals.control",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}/goals/{goal}"
},
"summary": "Applies an explicit owner control to this exact Goal/version. Pause interrupts only its current execution; resume does not resolve a wait or clear observed usage. Amend changes only supplied objective/budget fields.",
"verb": "control"
}
],
"noun": "goals",
"resource_type": "agents.sylphx.com/AgentSessionGoal"
},
{
"collection": "waits",
"commands": [
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "agent_session_wait.goal",
"flag": "--goal",
"summary": "Optional exact Goal in this Session, never a current-Goal selector.",
"type": "string"
},
{
"field": "agent_session_wait.type",
"flag": "--type",
"required": true,
"summary": "time or signal. Other producer types require their own admitted adapter.",
"type": "string"
},
{
"field": "agent_session_wait.reference",
"flag": "--reference",
"summary": "Exact source reference for a signal; empty for a timer.",
"type": "string"
},
{
"field": "agent_session_wait.deadline",
"flag": "--deadline",
"summary": "Actual future due time; required only for a timer.",
"type": "timestamp"
},
{
"field": "agent_session_wait.resume_prompt",
"flag": "--resume-prompt",
"required": true,
"summary": "What to do after observing this wait's evidence, at most 16 KiB.",
"type": "string"
},
{
"field": "operation_id",
"flag": "--operation-id",
"required": true,
"summary": "Permanent caller mutation identity, at most 128 bytes.",
"type": "string"
},
{
"field": "expected_goal_version",
"flag": "--expected-goal-version",
"summary": "Required when the wait names a Goal; its exact observed contract version.",
"type": "int"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/agent_sessions/*}/waits",
"method": "agents.waits.create",
"permission": "agents:sessions",
"positional": null,
"resource_field": "agent_session_wait",
"summary": "Creates a durable wait on an idle Session, with permanent operation replay.",
"verb": "create"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*/waits/*}",
"method": "agents.waits.get",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}/waits/{wait}"
},
"summary": "Reads an exact wait and its retained evidence.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "Default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "The preceding response's next_page_token.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/agent_sessions/*}/waits",
"method": "agents.waits.list",
"paginates": true,
"permission": "agents:sessions",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"summary": "Lists durable waits, including ready undelivered owners.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "operation_id",
"flag": "--operation-id",
"required": true,
"summary": "Permanent caller mutation identity, at most 128 bytes.",
"type": "string"
},
{
"field": "reference",
"flag": "--reference",
"summary": "Exact recorded signal source; omitted for a timer.",
"type": "string"
},
{
"field": "evidence",
"flag": "--evidence",
"summary": "Nonempty observed signal evidence; omitted for a timer.",
"type": "json"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*/waits/*}:resolve",
"method": "agents.waits.resolve",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}/waits/{wait}"
},
"summary": "Records observed signal evidence or checks a timer against its actual due time.",
"verb": "resolve"
},
{
"effect": "write",
"flags": [
{
"field": "operation_id",
"flag": "--operation-id",
"required": true,
"summary": "Permanent caller mutation identity, at most 128 bytes.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*/waits/*}:cancel",
"method": "agents.waits.cancel",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}/waits/{wait}"
},
"summary": "Cancels only this exact undelivered wait; repeated operations retain receipts.",
"verb": "cancel"
}
],
"noun": "waits",
"resource_type": "agents.sylphx.com/AgentSessionWait"
},
{
"collection": "queued_executions",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*/queued_executions/*}",
"method": "agents.queued_executions.get",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}/queued_executions/{turn}"
},
"summary": "Reads the state of an exact future-turn authorization.",
"verb": "get"
},
{
"effect": "write",
"flags": [
{
"field": "operation_id",
"flag": "--operation-id",
"required": true,
"summary": "Permanent caller mutation identity, at most 128 bytes.",
"type": "string"
},
{
"field": "expected_generation",
"flag": "--expected-generation",
"required": true,
"summary": "The exact authority generation to cancel, never a newest-row selector.",
"type": "int"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*/queued_executions/*}:cancel",
"method": "agents.queued_executions.cancel",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}/queued_executions/{turn}"
},
"summary": "Cancels only a queued future execution; an already admitted turn retains its receipt.",
"verb": "cancel"
}
],
"noun": "queued-executions",
"resource_type": "agents.sylphx.com/QueuedSessionExecution"
},
{
"collection": "session_events",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*/session_events/*}",
"method": "agents.session_events.get",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}/session_events/{session_event}"
},
"summary": "Gets a session 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, limited to `type` and `sequence`; for example `sequence > 42`.",
"type": "string"
},
{
"field": "wait",
"flag": "--wait",
"summary": "When no event matches the filter, wait up to this long for one, at most 60s; unset answers at once.",
"type": "duration"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/agent_sessions/*}/session_events",
"method": "agents.session_events.list",
"paginates": true,
"permission": "agents:sessions",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"summary": "Lists a session's events in sequence order. To follow a session, call again with the filter `sequence > N`, N the last sequence read; `wait` holds the call open until a newer event is appended or the wait ends.",
"verb": "list"
}
],
"noun": "session-events",
"resource_type": "agents.sylphx.com/SessionEvent"
},
{
"collection": "memory_stores",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/memory_stores/*}",
"method": "agents.memory_stores.get",
"permission": "agents:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/memory_stores/{memory_store}"
},
"summary": "Gets a memory store.",
"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/*}/memory_stores",
"method": "agents.memory_stores.list",
"paginates": true,
"permission": "agents:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists memory stores.",
"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": "memory_store.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "memory_store.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "memory_store.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "memory_store.spec.description",
"flag": "--spec.description",
"summary": "What the store is for, shown to agents; at most 1024 characters.",
"type": "string"
},
{
"field": "memory_store.spec.scope",
"flag": "--spec.scope",
"required": true,
"summary": "Whose memories are kept apart.",
"type": "enum",
"values": [
"project",
"agent",
"end_user"
]
},
{
"field": "memory_store.spec.retention",
"flag": "--spec.retention",
"summary": "Memories older than this since their last update are deleted, 1d to 3650d; unset keeps them until deleted. Not accepted yet: memories are Knowledge episodes and Knowledge has no time-based deletion, so a set value is refused with `INVALID_FIELD`.",
"type": "duration"
},
{
"field": "memory_store.spec.agent_writes",
"flag": "--spec.agent-writes",
"summary": "Whether agents write memories themselves after each turn; otherwise only callers write them. Not accepted yet: the turn runtime has no after-turn memory hook, so `true` is refused with `INVALID_FIELD`.",
"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/*}/memory_stores",
"method": "agents.memory_stores.create",
"permission": "agents:write",
"positional": {
"arg": "ID",
"field": "memory_store_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "memory_store",
"summary": "Creates a memory store.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "memory_store.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "memory_store.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "memory_store.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "memory_store.spec.description",
"flag": "--spec.description",
"summary": "What the store is for, shown to agents; at most 1024 characters.",
"type": "string"
},
{
"field": "memory_store.spec.scope",
"flag": "--spec.scope",
"required": true,
"summary": "Whose memories are kept apart.",
"type": "enum",
"values": [
"project",
"agent",
"end_user"
]
},
{
"field": "memory_store.spec.retention",
"flag": "--spec.retention",
"summary": "Memories older than this since their last update are deleted, 1d to 3650d; unset keeps them until deleted. Not accepted yet: memories are Knowledge episodes and Knowledge has no time-based deletion, so a set value is refused with `INVALID_FIELD`.",
"type": "duration"
},
{
"field": "memory_store.spec.agent_writes",
"flag": "--spec.agent-writes",
"summary": "Whether agents write memories themselves after each turn; otherwise only callers write them. Not accepted yet: the turn runtime has no after-turn memory hook, so `true` is refused with `INVALID_FIELD`.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the memory store 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/{memory_store.name=orgs/*/projects/*/envs/*/memory_stores/*}",
"method": "agents.memory_stores.update",
"permission": "agents:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "memory_store.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/memory_stores/{memory_store}"
},
"resource_field": "memory_store",
"sends_etag": true,
"summary": "Updates a memory store.",
"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 memory store 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 store's memories; without it, a store with memories is refused with `INVALID_STATE`.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/memory_stores/*}",
"method": "agents.memory_stores.delete",
"permission": "agents:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/memory_stores/{memory_store}"
},
"summary": "Deletes a memory store. A store an agent names is refused with `RESOURCE_IN_USE`; a store with memories is refused with `INVALID_STATE` unless `force` is set, which deletes them too.",
"verb": "delete"
}
],
"noun": "memory-stores",
"resource_type": "agents.sylphx.com/MemoryStore"
},
{
"collection": "memories",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/memory_stores/*/memories/*}",
"method": "agents.memories.get",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/memory_stores/{memory_store}/memories/{memory}"
},
"summary": "Gets a memory.",
"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 `end_user` and `agent`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/memory_stores/*}/memories",
"method": "agents.memories.list",
"paginates": true,
"permission": "agents:sessions",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/memory_stores/{memory_store}"
},
"summary": "Lists a store's memories, newest first. With a publishable key, only the caller's end user's memories.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/memory_stores/{memory_store}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "memory.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "memory.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "memory.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "memory.content",
"flag": "--content",
"required": true,
"summary": "The memory, at most 16 KiB of text.",
"type": "string"
},
{
"field": "memory.end_user",
"flag": "--end-user",
"summary": "The end user it is about, for a store scoped to end users.",
"type": "string"
},
{
"field": "memory.agent",
"flag": "--agent",
"summary": "The agent it belongs to, for a store scoped to agents.",
"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/*/memory_stores/*}/memories",
"method": "agents.memories.create",
"permission": "agents:write",
"positional": {
"arg": "ID",
"field": "memory_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "memory",
"summary": "Writes a memory.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "memory.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "memory.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "memory.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "memory.content",
"flag": "--content",
"required": true,
"summary": "The memory, at most 16 KiB of text.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{memory.name=orgs/*/projects/*/envs/*/memory_stores/*/memories/*}",
"method": "agents.memories.update",
"permission": "agents:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "memory.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/memory_stores/{memory_store}/memories/{memory}"
},
"resource_field": "memory",
"sends_etag": true,
"summary": "Changes a memory's content.",
"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 memory 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/*/memory_stores/*/memories/*}",
"method": "agents.memories.delete",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/memory_stores/{memory_store}/memories/{memory}"
},
"summary": "Deletes a memory. An end user may delete their own.",
"verb": "delete"
},
{
"effect": "read",
"flags": [
{
"field": "query",
"flag": "--query",
"required": true,
"summary": "What to recall, 1 to 2000 characters.",
"type": "string"
},
{
"field": "end_user",
"flag": "--end-user",
"summary": "Only memories about this end user.",
"type": "string"
},
{
"field": "agent",
"flag": "--agent",
"summary": "Only memories of this agent.",
"type": "string"
},
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 10, clamped to 100.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/memory_stores/*}/memories:search",
"method": "agents.memories.search",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/memory_stores/{memory_store}"
},
"summary": "Recalls the memories that best match a query, by hybrid full-text and vector search. With a publishable key, only the caller's end user's memories. A read with a request body, like a query.",
"verb": "search"
}
],
"noun": "memories",
"resource_type": "agents.sylphx.com/Memory"
},
{
"collection": "owner_pools",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/owner_pools/*}",
"method": "agents.owner_pools.get",
"permission": "agents:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/owner_pools/{owner_pool}"
},
"summary": "Gets an owner pool with its members.",
"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/*}/owner_pools",
"method": "agents.owner_pools.list",
"paginates": true,
"permission": "agents:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists owner pools, newest first.",
"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": "owner_pool.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "owner_pool.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "owner_pool.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "owner_pool.spec.admission.suite",
"flag": "--spec.admission.suite",
"required": true,
"summary": "The suite's id, matched exactly by `:qualify`; at most 200 characters.",
"type": "string"
},
{
"field": "owner_pool.spec.admission.min_scores",
"flag": "--spec.admission.min-scores",
"repeated": true,
"required": true,
"summary": "Minimum score per suite metric, higher is better; 1 to 64 metrics. A member qualifies only when every metric is reported at or above its minimum.",
"type": "key=value"
},
{
"field": "owner_pool.spec.admission.suite_version",
"flag": "--spec.admission.suite-version",
"required": true,
"summary": "The suite's version, matched exactly by `:qualify`; at most 200 characters.",
"type": "string"
},
{
"field": "owner_pool.spec.demotion",
"flag": "--spec.demotion",
"repeated": true,
"summary": "Live-metric rules that demote a member; at most 16, each metric once.",
"type": "json"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/owner_pools",
"method": "agents.owner_pools.create",
"permission": "agents:admin",
"positional": {
"arg": "ID",
"field": "owner_pool_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "owner_pool",
"summary": "Creates an owner pool with no members. Its minimums and demotion rules are governance, so the caller needs `agents:admin`.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "owner_pool.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "owner_pool.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "owner_pool.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "owner_pool.spec.admission.suite",
"flag": "--spec.admission.suite",
"required": true,
"summary": "The suite's id, matched exactly by `:qualify`; at most 200 characters.",
"type": "string"
},
{
"field": "owner_pool.spec.admission.min_scores",
"flag": "--spec.admission.min-scores",
"repeated": true,
"required": true,
"summary": "Minimum score per suite metric, higher is better; 1 to 64 metrics. A member qualifies only when every metric is reported at or above its minimum.",
"type": "key=value"
},
{
"field": "owner_pool.spec.admission.suite_version",
"flag": "--spec.admission.suite-version",
"required": true,
"summary": "The suite's version, matched exactly by `:qualify`; at most 200 characters.",
"type": "string"
},
{
"field": "owner_pool.spec.demotion",
"flag": "--spec.demotion",
"repeated": true,
"summary": "Live-metric rules that demote a member; at most 16, each metric once.",
"type": "json"
}
],
"http": "PATCH /v1/{owner_pool.name=orgs/*/projects/*/envs/*/owner_pools/*}",
"method": "agents.owner_pools.update",
"permission": "agents:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "owner_pool.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/owner_pools/{owner_pool}"
},
"resource_field": "owner_pool",
"sends_etag": true,
"summary": "Replaces an owner pool's spec (`agents:admin`). Members keep their standing; a changed suite or minimum applies from the next `:qualify`.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/owner_pools/*}",
"method": "agents.owner_pools.delete",
"permission": "agents:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/owner_pools/{owner_pool}"
},
"summary": "Deletes an owner pool and its members (`agents:admin`). Sessions already admitted keep running.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "agent_version",
"flag": "--agent-version",
"required": true,
"summary": "The Agent version that ran the suite, in the pool's environment.",
"type": "string"
},
{
"field": "suite",
"flag": "--suite",
"required": true,
"summary": "The suite that ran; must equal the pool's `admission.suite`.",
"type": "string"
},
{
"field": "scores",
"flag": "--scores",
"repeated": true,
"required": true,
"summary": "The score per suite metric; at most 64.",
"type": "key=value"
},
{
"field": "suite_version",
"flag": "--suite-version",
"required": true,
"summary": "The suite version that ran; must equal the pool's `admission.suite_version`.",
"type": "string"
},
{
"field": "result",
"flag": "--result",
"required": true,
"summary": "The grader's id of this suite run, for example its evidence record; 1 to 200 characters. Each result is recorded once per member.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/owner_pools/*}:qualify",
"method": "agents.owner_pools.qualify",
"permission": "agents:qualify",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/owner_pools/{owner_pool}"
},
"summary": "Records an admission suite result for an Agent version. The caller holds `agents:qualify` and is not the principal whose create or update minted the version (`PERMISSION_DENIED`). Every minimum met: the member is `QUALIFIED`. Any score missing or below its minimum: the member is recorded `REFUSED` with the reason. Each qualification is recorded with its suite, suite version, result and caller; a `result` already recorded for the member is refused with `INVALID_FIELD`, so a demoted member returns only with a new suite result. A read-only version is refused with `PERMISSION_DENIED`; a suite or suite version other than the pool's with `INVALID_FIELD`. Re-qualifying keeps the member's baseline: the baseline belongs to the version and its pinned model.",
"verb": "qualify"
},
{
"effect": "write",
"flags": [
{
"field": "agent_version",
"flag": "--agent-version",
"required": true,
"summary": "The member version.",
"type": "string"
},
{
"field": "metrics",
"flag": "--metrics",
"repeated": true,
"required": true,
"summary": "The observed value per metric over the caller's window, lower is better; 1 to 64. A demotion rule's metric is never negative.",
"type": "key=value"
},
{
"field": "samples",
"flag": "--samples",
"required": true,
"summary": "The number of outcomes the values summarize.",
"type": "int"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/owner_pools/*}:observe",
"method": "agents.owner_pools.observe",
"permission": "agents:qualify",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/owner_pools/{owner_pool}"
},
"summary": "Records a live-metric observation for a member and applies the pool's demotion rules (`agents:qualify`, refused to the version's authors as in `:qualify`). The platform computes each rule's baseline: the median of the member's first `baseline_observations` counted observations of the metric, set only when it is finite and positive. Values of a rule metric are lower-is-better and must not be negative. Once the baseline is set, a metric past `baseline * (1 + max_regression)` demotes a qualified member. Only `:qualify` brings a demoted member back.",
"verb": "observe"
}
],
"noun": "owner-pools",
"resource_type": "agents.sylphx.com/OwnerPool"
}
],
"commands": [],
"display_name": "Sylphx Agents",
"noun": "agents",
"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": "analytics_events",
"commands": [
{
"effect": "write",
"flags": [
{
"field": "events",
"flag": "--events",
"repeated": true,
"required": true,
"summary": "The events, 1 to 500.",
"type": "json"
},
{
"field": "sent_time",
"flag": "--sent-time",
"summary": "When the sender built the batch, on its clock. When it differs from the receive time by more than 10 minutes, every event time is shifted by the difference.",
"type": "timestamp"
},
{
"field": "consent",
"flag": "--consent",
"summary": "The app's current analytics consent; events are stored only when GRANTED. A publishable-key batch that is not GRANTED has every event rejected `consent_not_granted` (still 200, nothing stored). A secret-key batch with UNSPECIFIED counts as granted (the tenant's server attests); DENIED is always refused.",
"type": "enum",
"values": [
"granted",
"denied"
]
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/analytics_events:batch",
"method": "analytics.analytics_events.batch",
"permission": "analytics:ingest",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Records a batch of events. Each event is judged alone: a bad event is reported in `results` and the rest are stored. A duplicate `event_id` (in this or an earlier batch) is counted once. The response is sent only after the store holds the accepted events.",
"verb": "batch"
},
{
"effect": "read",
"flags": [
{
"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": "event_name",
"flag": "--event-name",
"summary": "Only events with this name.",
"type": "string"
},
{
"field": "subject_id",
"flag": "--subject-id",
"summary": "Only events of this subject (the user id, else the anon id).",
"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 the tenant, interval and filters.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/analytics_events",
"method": "analytics.analytics_events.list",
"paginates": true,
"permission": "analytics:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists the environment's raw events in a time range, newest first.",
"verb": "list"
}
],
"noun": "analytics-events",
"resource_type": "analytics.sylphx.com/AnalyticsEvent"
}
],
"commands": [],
"display_name": "Sylphx Analytics",
"noun": "analytics",
"served": false,
"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"
},
{
"field": "managed_upload",
"flag": "--managed-upload",
"summary": "The bytes were pushed to this project's managed upload reference, so the registry is asked before the digest is registered: it must hold the manifest for `digest` in the project's managed repository, with this `media_type` and `size_bytes`. The record then carries the pull `reference`. Unset, the artifact is registered as given (generic registration), and `reference` stays empty.",
"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"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{parent=orgs/*/projects/*}/artifacts:prepareUpload",
"method": "artifacts.artifacts.prepare_upload",
"permission": "artifacts:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Mints one short-lived registry credential and the unique image reference for an upload of this project. The repository is derived from the caller's grant and this parent, never from the caller; the tag is unique per call, so uploads of the same project never collide. Push to the reference, then register the pushed digest with CreateArtifact.",
"verb": "prepare-upload"
},
{
"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",
"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": "auth_config.spec.test_email_pattern",
"flag": "--spec.test-email-pattern",
"summary": "The address pattern of this environment's test accounts (a regular expression over the whole lower-cased address); unset means the environment has none. It must end in `@` and one of the environment's DNS-verified customer-organization domains, escaped (`qa\\+[a-z0-9-]{1,40}@example\\.com`), and must not match `probe@example.com`; it is stored as `^(?:<local part>)@<domain>$`. An end user is a test account (`synthetic_time`) only when it signed up with a matching address and proved that address by a link or code; changing the pattern never makes an existing end user one.",
"type": "string"
},
{
"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": "trusted_issuers",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/trusted_issuers/*}",
"method": "auth.trusted_issuers.get",
"permission": "auth:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/trusted_issuers/{trusted_issuer}"
},
"summary": "Gets an trusted issuer.",
"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/*}/trusted_issuers",
"method": "auth.trusted_issuers.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 trusted issuers.",
"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": "trusted_issuer.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "trusted_issuer.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "trusted_issuer.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "trusted_issuer.issuer",
"flag": "--issuer",
"required": true,
"summary": "The exact `iss` the issuer's tokens carry, an HTTPS URL, for example `https://clerk.example.com` or `https://securetoken.google.com/<project>`. One Trusted Issuer per issuer in an environment.",
"type": "string"
},
{
"field": "trusted_issuer.jwks_uri",
"flag": "--jwks-uri",
"required": true,
"summary": "The HTTPS URL of the issuer's JSON Web Key Set. Only Auth fetches it.",
"type": "string"
},
{
"field": "trusted_issuer.audiences",
"flag": "--audiences",
"repeated": true,
"required": true,
"summary": "A token's `aud` must contain one of these, for example the Firebase project id or the Auth0 API identifier.",
"type": "string"
},
{
"field": "trusted_issuer.app_metadata_claims",
"flag": "--app-metadata-claims",
"repeated": true,
"summary": "Token claims copied into the end user's `app_metadata`, the claim policies read (for example the issuer's `org_role` as `roles`). Map only claims the issuer's admin sets, never ones the user can write.",
"type": "json"
},
{
"field": "trusted_issuer.disabled",
"flag": "--disabled",
"summary": "A disabled issuer's tokens are refused; its users keep their ids and data.",
"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/*}/trusted_issuers",
"method": "auth.trusted_issuers.create",
"permission": "auth:write",
"positional": {
"arg": "ID",
"field": "trusted_issuer_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "trusted_issuer",
"summary": "Creates an trusted issuer.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "trusted_issuer.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "trusted_issuer.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "trusted_issuer.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "trusted_issuer.jwks_uri",
"flag": "--jwks-uri",
"required": true,
"summary": "The HTTPS URL of the issuer's JSON Web Key Set. Only Auth fetches it.",
"type": "string"
},
{
"field": "trusted_issuer.audiences",
"flag": "--audiences",
"repeated": true,
"required": true,
"summary": "A token's `aud` must contain one of these, for example the Firebase project id or the Auth0 API identifier.",
"type": "string"
},
{
"field": "trusted_issuer.app_metadata_claims",
"flag": "--app-metadata-claims",
"repeated": true,
"summary": "Token claims copied into the end user's `app_metadata`, the claim policies read (for example the issuer's `org_role` as `roles`). Map only claims the issuer's admin sets, never ones the user can write.",
"type": "json"
},
{
"field": "trusted_issuer.disabled",
"flag": "--disabled",
"summary": "A disabled issuer's tokens are refused; its users keep their ids and data.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{trusted_issuer.name=orgs/*/projects/*/envs/*/trusted_issuers/*}",
"method": "auth.trusted_issuers.update",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "trusted_issuer.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/trusted_issuers/{trusted_issuer}"
},
"resource_field": "trusted_issuer",
"sends_etag": true,
"summary": "Updates an trusted issuer.",
"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 trusted issuer 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/*/trusted_issuers/*}",
"method": "auth.trusted_issuers.delete",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/trusted_issuers/{trusted_issuer}"
},
"summary": "Deletes an trusted issuer.",
"verb": "delete"
}
],
"noun": "trusted-issuers",
"resource_type": "auth.sylphx.com/TrustedIssuer"
},
{
"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": "invitation.metadata",
"flag": "--metadata",
"summary": "Immutable application context, a JSON object of at most 16 KiB when compactly UTF-8 encoded. Omitted metadata is returned as an empty object. This is application data, never a permission grant. The application must recheck authoritative organization and project membership before acting.",
"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/*/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 public plan, for example `plans/pro`. Card accounts activate Pro by payment; approved invoice accounts may select it without a card.",
"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": "Clears the self spend cap; never lifts a tier or reviewed credit limit.",
"type": "bool"
},
{
"field": "billing_account.spec.billing_email",
"flag": "--spec.billing-email",
"summary": "Where invoices and payment notices are sent.",
"type": "string"
},
{
"field": "billing_account.spec.payment_method",
"flag": "--spec.payment-method",
"summary": "Collection choice: `card` (default), or `invoice` with approved net terms.",
"type": "string"
},
{
"field": "billing_account.spec.invoice_terms_days",
"flag": "--spec.invoice-terms-days",
"summary": "Net days from finalization, 1..365. Changes require billing:terms:approve and affect only newly finalized invoices, never frozen history.",
"type": "int"
},
{
"field": "billing_account.spec.invoice_terms_approved",
"flag": "--spec.invoice-terms-approved",
"summary": "Credit approval is an ordinary account setting, not a company flag. Writing this field requires billing:terms:approve in addition to admin.",
"type": "bool"
},
{
"field": "billing_account.spec.credit_limit.currency_code",
"flag": "--spec.credit-limit.currency-code",
"summary": "ISO 4217 currency, for example `USD`.",
"type": "string"
},
{
"field": "billing_account.spec.credit_limit.units_minor",
"flag": "--spec.credit-limit.units-minor",
"summary": "The amount in the currency's minor unit (cents for USD).",
"type": "int"
},
{
"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": "write",
"flags": [
{
"field": "payment_method",
"flag": "--payment-method",
"required": true,
"summary": "card or invoice debits cash; internal_settlement debits a dedicated noncash journal account, never cash or promotional/customer credit.",
"type": "string"
},
{
"field": "settlement_reference",
"flag": "--settlement-reference",
"required": true,
"summary": "Bank/provider/journal reference, 1..200 bytes, unique per org and method.",
"type": "string"
},
{
"field": "amount",
"flag": "--amount",
"required": true,
"summary": "Positive exact full outstanding balance in USD integer minor units.",
"type": "json"
}
],
"http": "POST /v1/{name=orgs/*/invoices/*}:recordPayment",
"method": "billing.invoices.record_payment",
"permission": "billing:payments:record",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/invoices/{invoice}"
},
"summary": "A seller operator records an externally verified full invoice payment. The platform-only scope cannot be granted by customer owners/admins. The invoice name identifies the customer, not the seller. References are immutable and idempotent per org and method; conflicting reuse is refused.",
"verb": "record-payment"
},
{
"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"
},
{
"field": "group_end_customers",
"flag": "--group-end-customers",
"summary": "Group by optional opaque end-customer attribution, not a price dimension.",
"type": "bool"
}
],
"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: `orgs/{org}/connections/github-{installation_id}`, an active installation of the platform's GitHub App in the same org.",
"type": "string"
},
{
"field": "trust_policy.spec.subjects",
"flag": "--spec.subjects",
"repeated": true,
"required": true,
"summary": "The Access principals allowed to exchange, `orgs/{org}/principals/{id}` in the policy's org: the caller's own principal, or the accountable principal of a delegated grant. 1 to 64.",
"type": "string"
},
{
"field": "trust_policy.spec.permissions",
"flag": "--spec.permissions",
"repeated": true,
"required": true,
"summary": "The most a credential may carry, in GitHub repository permission names, for example `{\"contents\": \"write\", \"pull_requests\": \"write\"}`. `administration` is read only; organization permissions are refused. A policy with `actors` carries at most `contents` and `pull_requests`.",
"type": "key=value"
},
{
"field": "trust_policy.spec.repositories",
"flag": "--spec.repositories",
"repeated": true,
"required": true,
"summary": "The repositories a credential may cover: 1 to 1000 exact `owner/name` entries, no wildcard, each owned by the Connection's account. One exchange covers exactly one repository.",
"type": "string"
},
{
"field": "trust_policy.spec.credential_kind",
"flag": "--spec.credential-kind",
"required": true,
"summary": "What the credential service issues; `access_token` on the wire.",
"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": "trust_policy.spec.actors",
"flag": "--spec.actors",
"repeated": true,
"summary": "The Agents a delegated grant may act for: an Agent name `orgs/{org}/projects/{project}/envs/{env}/agents/{agent}`, or every Agent of an environment, `.../envs/{env}/agents/*`. 0 to 64. When set, only a delegated grant whose actor matches may exchange; a grant with no actor is refused. When empty, any grant of a subject may exchange, delegated or not.",
"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/*}/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: `orgs/{org}/connections/github-{installation_id}`, an active installation of the platform's GitHub App in the same org.",
"type": "string"
},
{
"field": "trust_policy.spec.subjects",
"flag": "--spec.subjects",
"repeated": true,
"required": true,
"summary": "The Access principals allowed to exchange, `orgs/{org}/principals/{id}` in the policy's org: the caller's own principal, or the accountable principal of a delegated grant. 1 to 64.",
"type": "string"
},
{
"field": "trust_policy.spec.permissions",
"flag": "--spec.permissions",
"repeated": true,
"required": true,
"summary": "The most a credential may carry, in GitHub repository permission names, for example `{\"contents\": \"write\", \"pull_requests\": \"write\"}`. `administration` is read only; organization permissions are refused. A policy with `actors` carries at most `contents` and `pull_requests`.",
"type": "key=value"
},
{
"field": "trust_policy.spec.repositories",
"flag": "--spec.repositories",
"repeated": true,
"required": true,
"summary": "The repositories a credential may cover: 1 to 1000 exact `owner/name` entries, no wildcard, each owned by the Connection's account. One exchange covers exactly one repository.",
"type": "string"
},
{
"field": "trust_policy.spec.credential_kind",
"flag": "--spec.credential-kind",
"required": true,
"summary": "What the credential service issues; `access_token` on the wire.",
"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": "trust_policy.spec.actors",
"flag": "--spec.actors",
"repeated": true,
"summary": "The Agents a delegated grant may act for: an Agent name `orgs/{org}/projects/{project}/envs/{env}/agents/{agent}`, or every Agent of an environment, `.../envs/{env}/agents/*`. 0 to 64. When set, only a delegated grant whose actor matches may exchange; a grant with no actor is refused. When empty, any grant of a subject may exchange, delegated or not.",
"type": "string"
},
{
"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": "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,
"required": true,
"summary": "The one repository this call needs, `owner/name`, one of the policy's.",
"type": "string"
},
{
"field": "ttl",
"flag": "--ttl",
"summary": "How long the credential should live, at most the policy's `max_ttl`. A GitHub installation token always lives one hour: unset or `3600s`.",
"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 Access grant for a short-lived provider credential under a trust policy (RFC 8693 token exchange): a GitHub App installation token for exactly one of the policy's repositories, narrowed to the requested permissions. The grant's principal (for a delegated grant, its accountable principal) must be a policy subject, its actor must match the policy's actors, and it must hold `broker:exchange` on this policy. Every call writes one TokenExchange record. A permission the Connection lacks is PERMISSION_DENIED with reason `CapabilityMissing`, never an outage.",
"verb": "exchange-token"
},
{
"effect": "write",
"flags": [
{
"field": "permissions",
"flag": "--permissions",
"repeated": true,
"summary": "The permissions this call needs, at most the policy's; empty means the policy's. Every resolved permission must be read-only.",
"type": "key=value"
},
{
"field": "repositories",
"flag": "--repositories",
"repeated": true,
"required": true,
"summary": "The one repository this call needs, `owner/name`, one of the policy's.",
"type": "string"
},
{
"field": "ttl",
"flag": "--ttl",
"summary": "How long the credential should live, at most the policy's `max_ttl`. A GitHub installation token always lives one hour: unset or `3600s`.",
"type": "duration"
}
],
"http": "POST /v1/{name=orgs/*/trust_policies/*}:exchangeReadToken",
"method": "broker.trust_policies.exchange_read_token",
"permission": "broker:exchange:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/trust_policies/{trust_policy}"
},
"summary": "Exchanges the caller's Access grant for a read-only GitHub App installation token. Requires the explicit `broker:exchange:read` scope on this policy, with the same subject, actor, Connection and repository checks as ExchangeToken. Every resolved permission must be read-only: omitting permissions inherits the policy and is refused if it has writes. The provider's returned permissions must confirm the requested ceiling. Writes one TokenExchange audit record; `broker:read` cannot issue tokens.",
"verb": "exchange-read-token"
}
],
"noun": "trust-policies",
"resource_type": "broker.sylphx.com/TrustPolicy"
},
{
"collection": "token_exchanges",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/trust_policies/*/token_exchanges/*}",
"method": "broker.token_exchanges.get",
"permission": "broker:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/trust_policies/{trust_policy}/token_exchanges/{token_exchange}"
},
"summary": "Gets the record of one issued credential.",
"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/*/trust_policies/*}/token_exchanges",
"method": "broker.token_exchanges.list",
"paginates": true,
"permission": "broker:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/trust_policies/{trust_policy}"
},
"summary": "Lists the credentials issued under a trust policy, newest first.",
"verb": "list"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [],
"http": "POST /v1/{name=orgs/*/trust_policies/*/token_exchanges/*}:revoke",
"method": "broker.token_exchanges.revoke",
"permission": "broker:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/trust_policies/{trust_policy}/token_exchanges/{token_exchange}"
},
"summary": "Revokes an issued credential at the provider by its record. The Broker uses the credential it holds sealed, so the caller needs no token and no live delegation. Idempotent: a credential already revoked or expired answers the record. Erases the sealed credential once the provider confirms.",
"verb": "revoke"
}
],
"noun": "token-exchanges",
"resource_type": "broker.sylphx.com/TokenExchange"
}
],
"commands": [],
"display_name": "Sylphx Broker",
"noun": "broker",
"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",
"porcelain": [
{
"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",
"path": [],
"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",
"path": [],
"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": "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",
"path": [
"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"
},
{
"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",
"path": [
"cache"
],
"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": "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",
"path": [
"caches"
],
"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"
}
}
],
"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 last received etag; only a different revision is sent.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/config_flags:watch",
"method": "config.config_flags.watch",
"permission": "config:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Streams the current ruleset etag and each changed revision as SSE. Reconnect with if_none_match or Last-Event-ID to skip the held revision.",
"verb": "watch"
},
{
"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": "write",
"flags": [
{
"field": "connection_provider_id",
"flag": "--connection-provider-id",
"required": true,
"summary": "Explicit immutable provider identity.",
"type": "string"
},
{
"field": "signing_key",
"flag": "--signing-key",
"required": true,
"summary": "Unused environment-scoped public Keys target in this organization.",
"type": "string"
},
{
"field": "webhook_secret",
"flag": "--webhook-secret",
"required": true,
"summary": "Environment-scoped Secrets custody target in this organization.",
"type": "string"
},
{
"field": "github_manifest",
"flag": "--github-manifest",
"required": true,
"summary": "Permissions, events and the declared platform webhook destination.",
"type": "json"
},
{
"field": "expected_github_app_slug",
"flag": "--expected-github-app-slug",
"required": true,
"summary": "Slug whose literal wrapped-import path has been enrolled in custody. Renaming the App at GitHub causes the callback to refuse before import.",
"type": "string"
},
{
"field": "github_organization",
"flag": "--github-organization",
"summary": "GitHub organization that will own the App; unset selects a personal account.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*}/connection_providers:beginRegistration",
"method": "connections.connection_providers.begin_registration",
"permission": "connections:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}"
},
"summary": "Begins an expiring, one-use GitHub manifest registration ceremony. Open registration_url to POST the bound, prefilled manifest to GitHub. github_organization selects organization ownership. The state-authorized callback is GET /v1/connections/github-manifest:callback?state=...&code=... and returns only provider metadata and an installation URL.",
"verb": "begin-registration"
},
{
"effect": "write",
"flags": [
{
"field": "connection_provider_id",
"flag": "--connection-provider-id",
"required": true,
"summary": "Explicit immutable provider identity.",
"type": "string"
},
{
"field": "github_app",
"flag": "--github-app",
"required": true,
"summary": "Existing App identity and unused full environment-scoped SIGN Key target. An optional webhook_secret must already name this organization's Secret.",
"type": "json"
},
{
"field": "reason",
"flag": "--reason",
"required": true,
"summary": "Accountable operator's reason for adopting the existing App.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*}/connection_providers:adopt",
"method": "connections.connection_providers.adopt",
"permission": "connections:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}"
},
"summary": "Adopts an existing GitHub App whose non-exportable custody already exists. The server observes public SPKI metadata and verifies signed GET /app before atomically registering the SIGN Key and provider. No private key is accepted.",
"verb": "adopt"
},
{
"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": [
{
"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": "connection_provider.spec.sharing_grants",
"flag": "--spec.sharing-grants",
"repeated": true,
"summary": "Organizations allowed to use specific installations of this provider. Removing a grant prevents subsequent Broker exchanges. Signing custody remains in the provider's organization and is never copied to a recipient.",
"type": "json"
},
{
"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 forget every child Resource; without it a parent with children fails with INVALID_STATE. This never uninstalls the App at GitHub.",
"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; force forgets its local connections only.",
"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",
"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": "read",
"flags": [
{
"field": "expected_generation",
"flag": "--expected-generation",
"summary": "A stale scheduled intent yields unknown without connecting.",
"type": "int"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/databases/*}:checkCatalogReadiness",
"method": "data.databases.check_catalog_readiness",
"permission": "data:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/databases/{database}"
},
"summary": "Observes aggregate-read coverage using the database's approved reader. Reads catalog metadata only; never accepts SQL, credentials or row data.",
"verb": "check-catalog-readiness"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "Maximum targets to return; defaults to 100 and is capped at 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "Opaque cursor from the preceding page in the same environment.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/databases:queryCatalogTargets",
"method": "data.databases.query_catalog_targets",
"permission": "data:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Pages the complete authorized production database population, including legacy bindings and protected resources which cannot be observed.",
"verb": "query-catalog-targets"
},
{
"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": "database.spec.client_allowlist",
"flag": "--spec.client-allowlist",
"repeated": true,
"summary": "Address ranges allowed to connect to the database's endpoint. An entry is an IPv4 or IPv6 range like `203.0.113.0/24` or `2001:db8::/32`, at most 50, applied on both the pooled and the direct host a connection can reach. A connection from any other address is refused at the endpoint with the database's own answer (SQLSTATE 28000), before it reaches Postgres; a connection from a listed address is served as usual. Empty serves every address (the field absent), so clearing it re-opens the endpoint. Send `client_allowlist_set` to store an empty list.",
"type": "string"
},
{
"field": "database.spec.client_allowlist_set",
"flag": "--spec.client-allowlist-set",
"summary": "Stores `client_allowlist` as given, including an empty list that re-opens the endpoint. An empty repeated field is not a change on its own, so Update sends `client_allowlist_set` (or `clientAllowlistSet`) as `true` when it means to clear the list; any non-empty `client_allowlist` is stored whether or not this is set. Reads always report `false`.",
"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": "database.spec.client_allowlist",
"flag": "--spec.client-allowlist",
"repeated": true,
"summary": "Address ranges allowed to connect to the database's endpoint. An entry is an IPv4 or IPv6 range like `203.0.113.0/24` or `2001:db8::/32`, at most 50, applied on both the pooled and the direct host a connection can reach. A connection from any other address is refused at the endpoint with the database's own answer (SQLSTATE 28000), before it reaches Postgres; a connection from a listed address is served as usual. Empty serves every address (the field absent), so clearing it re-opens the endpoint. Send `client_allowlist_set` to store an empty list.",
"type": "string"
},
{
"field": "database.spec.client_allowlist_set",
"flag": "--spec.client-allowlist-set",
"summary": "Stores `client_allowlist` as given, including an empty list that re-opens the endpoint. An empty repeated field is not a change on its own, so Update sends `client_allowlist_set` (or `clientAllowlistSet`) as `true` when it means to clear the list; any non-empty `client_allowlist` is stored whether or not this is set. Reads always report `false`.",
"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": "bucket.spec.cors",
"flag": "--spec.cors",
"repeated": true,
"summary": "Browser access (CORS) rules for the bucket's S3 endpoint, in order; the first rule matching an origin and method answers. Empty answers no cross-origin request. At most 20 rules.",
"type": "json"
},
{
"field": "bucket.spec.lifecycle.abort_incomplete_multipart_days",
"flag": "--spec.lifecycle.abort-incomplete-multipart-days",
"summary": "Abort a multipart upload that has not completed this many days after it started, and free its parts: 1 to 365. 0 keeps incomplete uploads until someone aborts them (and they are billed as stored bytes until then).",
"type": "int"
},
{
"field": "bucket.spec.lifecycle.expiration_rules",
"flag": "--spec.lifecycle.expiration-rules",
"repeated": true,
"summary": "Expire current objects by key prefix, at most 50 rules with distinct prefixes. On a versioned bucket an expiry writes a delete marker.",
"type": "json"
},
{
"field": "bucket.spec.public_access.mode",
"flag": "--spec.public-access.mode",
"summary": "Which objects are public.",
"type": "enum",
"values": [
"off",
"read",
"read_prefixes"
]
},
{
"field": "bucket.spec.public_access.prefixes",
"flag": "--spec.public-access.prefixes",
"repeated": true,
"summary": "Key prefixes whose objects are public when `mode` is `READ_PREFIXES`, at most 50, each at most 1024 bytes.",
"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/*}/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": "bucket.spec.cors",
"flag": "--spec.cors",
"repeated": true,
"summary": "Browser access (CORS) rules for the bucket's S3 endpoint, in order; the first rule matching an origin and method answers. Empty answers no cross-origin request. At most 20 rules.",
"type": "json"
},
{
"field": "bucket.spec.lifecycle.abort_incomplete_multipart_days",
"flag": "--spec.lifecycle.abort-incomplete-multipart-days",
"summary": "Abort a multipart upload that has not completed this many days after it started, and free its parts: 1 to 365. 0 keeps incomplete uploads until someone aborts them (and they are billed as stored bytes until then).",
"type": "int"
},
{
"field": "bucket.spec.lifecycle.expiration_rules",
"flag": "--spec.lifecycle.expiration-rules",
"repeated": true,
"summary": "Expire current objects by key prefix, at most 50 rules with distinct prefixes. On a versioned bucket an expiry writes a delete marker.",
"type": "json"
},
{
"field": "bucket.spec.public_access.mode",
"flag": "--spec.public-access.mode",
"summary": "Which objects are public.",
"type": "enum",
"values": [
"off",
"read",
"read_prefixes"
]
},
{
"field": "bucket.spec.public_access.prefixes",
"flag": "--spec.public-access.prefixes",
"repeated": true,
"summary": "Key prefixes whose objects are public when `mode` is `READ_PREFIXES`, at most 50, each at most 1024 bytes.",
"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/{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's `spec.deletion_protection`, `spec.cors` and `spec.lifecycle`; every other field is fixed at creation. A mask path replaces the whole field (`spec.cors` replaces every rule).",
"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": [
{
"field": "credential_ttl",
"flag": "--credential-ttl",
"summary": "How long the S3 keys last: `900s` to `604800s` (7 days), default `3600s`. Ask for what the work needs (a server that signs 7-day URLs asks for `604800s`); connect again for fresh keys, they are cheap.",
"type": "duration"
}
],
"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 where to reach the bucket: the Data API address, and, once the bucket is served over S3, an S3 endpoint with keys scoped to this one bucket (`s3`). It carries no username or password; each call mints new S3 keys, and a client signs with those.",
"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": "Revokes every S3 key `:connect` minted for the bucket, at once; connect again for new ones. Keys of other buckets are untouched.",
"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": "write",
"flags": [
{
"field": "parent",
"flag": "--parent",
"required": true,
"summary": "The consenting tenant environment: orgs/{org}/projects/{project}/envs/{env}.",
"type": "string"
},
{
"field": "event",
"flag": "--event",
"required": true,
"summary": "source must be sylphx.<service> and type must start with <service>.",
"type": "json"
},
{
"field": "webhook_uri",
"flag": "--webhook-uri",
"summary": "Exact registered https endpoint URI; empty uses ordinary environment fan-out.",
"type": "string"
}
],
"http": "POST /v1/events:publishServiceEvent",
"method": "events.events.publish_service_event",
"permission": "events:publish",
"positional": null,
"summary": "Publishes a service's own event into a consenting tenant environment. Requires events:publish and the exact events:platform:<service> scope. A webhook_uri selects exactly one registered endpoint in that environment; admission atomically stores its signed, retried delivery, or stores nothing.",
"verb": "publish-service-event"
},
{
"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": "webhook_endpoint.spec.consumer",
"flag": "--spec.consumer",
"summary": "Optional opaque customer identifier. A nonempty value receives only events whose CloudEvents consumer extension is the same string. Empty receives every consumer, including events without the extension.",
"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/*}/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": "webhook_endpoint.spec.consumer",
"flag": "--spec.consumer",
"summary": "Optional opaque customer identifier. A nonempty value receives only events whose CloudEvents consumer extension is the same string. Empty receives every consumer, including events without the extension.",
"type": "string"
},
{
"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": "realtime_channel.spec.chat.kind",
"flag": "--spec.chat.kind",
"summary": "Purpose of the conversation.",
"type": "enum",
"values": [
"world",
"room",
"guild",
"dm",
"support",
"group"
]
},
{
"field": "realtime_channel.spec.chat.terms_version",
"flag": "--spec.chat.terms-version",
"summary": "Code of conduct version every sending member must have accepted.",
"type": "string"
},
{
"field": "realtime_channel.spec.chat.messages_per_minute",
"flag": "--spec.chat.messages-per-minute",
"summary": "Per-member sliding-minute message ceiling; default 30, maximum 600.",
"type": "int"
},
{
"field": "realtime_channel.spec.chat.participant_ids",
"flag": "--spec.chat.participant-ids",
"repeated": true,
"summary": "Exact two participants for a DM or support; invited roster for groups. A player's empty group roster defaults to its creator. Backend-created groups with an empty roster admit authenticated players through join.",
"type": "string"
},
{
"field": "realtime_channel.spec.chat.title_id",
"flag": "--spec.chat.title-id",
"summary": "Optional originating title for world/room/guild/support. Empty is cross-title.",
"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/*}/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": "realtime_channel.spec.chat.kind",
"flag": "--spec.chat.kind",
"summary": "Purpose of the conversation.",
"type": "enum",
"values": [
"world",
"room",
"guild",
"dm",
"support",
"group"
]
},
{
"field": "realtime_channel.spec.chat.terms_version",
"flag": "--spec.chat.terms-version",
"summary": "Code of conduct version every sending member must have accepted.",
"type": "string"
},
{
"field": "realtime_channel.spec.chat.messages_per_minute",
"flag": "--spec.chat.messages-per-minute",
"summary": "Per-member sliding-minute message ceiling; default 30, maximum 600.",
"type": "int"
},
{
"field": "realtime_channel.spec.chat.participant_ids",
"flag": "--spec.chat.participant-ids",
"repeated": true,
"summary": "Exact two participants for a DM or support; invited roster for groups. A player's empty group roster defaults to its creator. Backend-created groups with an empty roster admit authenticated players through join.",
"type": "string"
},
{
"field": "realtime_channel.spec.chat.title_id",
"flag": "--spec.chat.title-id",
"summary": "Optional originating title for world/room/guild/support. Empty is cross-title.",
"type": "string"
},
{
"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"
},
{
"field": "content",
"flag": "--content",
"summary": "Required for Chat channels; generic channels continue to use data/message_type.",
"type": "json"
}
],
"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"
},
{
"effect": "write",
"flags": [
{
"field": "client_id",
"flag": "--client-id",
"required": true,
"summary": "Authenticated member identity.",
"type": "string"
},
{
"field": "role",
"flag": "--role",
"summary": "member or moderator; default member.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/realtime_channels/*}:join",
"method": "events.realtime_channels.join",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/realtime_channels/{realtime_channel}"
},
"summary": "Joins a persistent Chat conversation.",
"verb": "join"
},
{
"effect": "write",
"flags": [
{
"field": "client_id",
"flag": "--client-id",
"required": true,
"summary": "Authenticated member identity.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/realtime_channels/*}:leave",
"method": "events.realtime_channels.leave",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/realtime_channels/{realtime_channel}"
},
"summary": "Leaves Chat while retaining durable read state.",
"verb": "leave"
}
],
"noun": "realtime-channels",
"resource_type": "events.sylphx.com/RealtimeChannel"
},
{
"collection": "realtime_messages",
"commands": [
{
"effect": "read",
"flags": [
{
"field": "client_id",
"flag": "--client-id",
"summary": "Chat viewer; required on Chat channels.",
"type": "string"
}
],
"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"
},
{
"field": "client_id",
"flag": "--client-id",
"summary": "Chat viewer; required on Chat channels. The trusted tenant backend binds identity.",
"type": "string"
},
{
"field": "after_cursor",
"flag": "--after-cursor",
"summary": "Exclusive cursor, for forward recovery. Cannot combine with before_cursor or filter.",
"type": "string"
},
{
"field": "before_cursor",
"flag": "--before-cursor",
"summary": "Exclusive cursor, for backwards history, newest first. Cannot combine with after_cursor or filter.",
"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"
},
{
"effect": "write",
"flags": [
{
"field": "client_id",
"flag": "--client-id",
"summary": "Authenticated reacting member.",
"type": "string"
},
{
"field": "emoji",
"flag": "--emoji",
"summary": "Emoji, at most 32 UTF-8 bytes.",
"type": "string"
},
{
"field": "remove",
"flag": "--remove",
"summary": "Remove instead of add.",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/realtime_channels/*/realtime_messages/*}:react",
"method": "events.realtime_messages.react",
"permission": "events:write",
"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": "Adds or removes a member reaction on a visible Chat message.",
"verb": "react"
}
],
"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"
},
{
"effect": "write",
"flags": [
{
"field": "last_read_cursor",
"flag": "--last-read-cursor",
"summary": "Last visible message cursor; empty leaves the read cursor unchanged.",
"type": "string"
},
{
"field": "muted",
"flag": "--muted",
"summary": "Conversation notification preference; supplied on every call.",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/realtime_channels/*/realtime_members/*}:read",
"method": "events.realtime_members.read",
"permission": "events:write",
"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": "Advances a member read cursor monotonically and sets mute.",
"verb": "read"
}
],
"noun": "realtime-members",
"resource_type": "events.sylphx.com/RealtimeMember"
},
{
"collection": "chat_profiles",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/chat_profiles/*}",
"method": "events.chat_profiles.get",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/chat_profiles/{chat_profile}"
},
"summary": "Gets a Chat profile and fresh presence.",
"verb": "get"
},
{
"effect": "write",
"flags": [
{
"field": "terms_version",
"flag": "--terms-version",
"summary": "Accepted code of conduct version.",
"type": "string"
},
{
"field": "display_name",
"flag": "--display-name",
"summary": "User-visible name.",
"type": "string"
},
{
"field": "allow_stranger_images",
"flag": "--allow-stranger-images",
"summary": "Explicit opt-in; default false.",
"type": "bool"
},
{
"field": "quiet_hours_start_utc_minute",
"flag": "--quiet-hours-start-utc-minute",
"summary": "UTC quiet hours, optional as a pair; start equals end disables quiet hours.",
"type": "int"
},
{
"field": "quiet_hours_end_utc_minute",
"flag": "--quiet-hours-end-utc-minute",
"summary": "UTC exclusive end, including midnight as 1440.",
"type": "int"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/chat_profiles/*}:configure",
"method": "events.chat_profiles.configure",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/chat_profiles/{chat_profile}"
},
"summary": "Configures an authenticated Chat identity through its trusted backend.",
"verb": "configure"
},
{
"effect": "write",
"flags": [
{
"field": "peer_id",
"flag": "--peer-id",
"required": true,
"summary": "Other user's stable client id.",
"type": "string"
},
{
"field": "action",
"flag": "--action",
"required": true,
"summary": "request, accept, remove, block or unblock.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/chat_profiles/*}:setRelationship",
"method": "events.chat_profiles.set_relationship",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/chat_profiles/{chat_profile}"
},
"summary": "Changes friendship or a bilateral interaction block.",
"verb": "set-relationship"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "Maximum results; default 50, maximum 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "Previous response's next_page_token.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/chat_profiles/*}:listRelationships",
"method": "events.chat_profiles.list_relationships",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/chat_profiles/{chat_profile}"
},
"summary": "Lists friends and pending requests with presence.",
"verb": "list-relationships"
},
{
"effect": "write",
"flags": [
{
"field": "target_type",
"flag": "--target-type",
"summary": "message, image or user.",
"type": "string"
},
{
"field": "target_id",
"flag": "--target-id",
"summary": "Full message name, image SHA-256 or user id.",
"type": "string"
},
{
"field": "reason",
"flag": "--reason",
"summary": "Report reason.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/chat_profiles/*}:report",
"method": "events.chat_profiles.report",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/chat_profiles/{chat_profile}"
},
"summary": "Reports a message, image or user to the moderation queue.",
"verb": "report"
},
{
"effect": "write",
"flags": [
{
"field": "sha256",
"flag": "--sha256",
"summary": "Lowercase SHA-256 digest.",
"type": "string"
},
{
"field": "content_uri",
"flag": "--content-uri",
"summary": "Exact existing storage URI.",
"type": "string"
},
{
"field": "status",
"flag": "--status",
"summary": "pending registers an upload; approved or rejected is a backend moderation receipt.",
"type": "string"
},
{
"field": "reason",
"flag": "--reason",
"summary": "Administrator-only moderation reason; player status/reason are never trusted.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/chat_profiles/*}:reviewMedia",
"method": "events.chat_profiles.review_media",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/chat_profiles/{chat_profile}"
},
"summary": "Registers an image and its automated moderation receipt.",
"verb": "review-media"
},
{
"effect": "write",
"flags": [
{
"field": "official",
"flag": "--official",
"summary": "Verified status; regular profile configuration never changes this flag.",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/chat_profiles/*}:setOfficialStatus",
"method": "events.chat_profiles.set_official_status",
"permission": "events:chat:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/chat_profiles/{chat_profile}"
},
"summary": "Verifies an official account through a distinct administrator permission.",
"verb": "set-official-status"
},
{
"effect": "write",
"flags": [
{
"field": "source_client_id",
"flag": "--source-client-id",
"summary": "Title-scoped guest identity whose Auth link has been verified.",
"type": "string"
},
{
"field": "link_receipt_id",
"flag": "--link-receipt-id",
"summary": "Immutable receipt from the verified Auth link.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/chat_profiles/*}:bindIdentity",
"method": "events.chat_profiles.bind_identity",
"permission": "events:chat:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/chat_profiles/{chat_profile}"
},
"summary": "Records an exact Auth-verified guest-to-platform identity link grant.",
"verb": "bind-identity"
},
{
"effect": "write",
"flags": [
{
"field": "source_client_id",
"flag": "--source-client-id",
"summary": "Previously bound title-scoped guest identity.",
"type": "string"
},
{
"field": "link_receipt_id",
"flag": "--link-receipt-id",
"summary": "Exact prior Auth-verified source/target receipt binding.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/chat_profiles/*}:mergeIdentity",
"method": "events.chat_profiles.merge_identity",
"permission": "events:chat:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/chat_profiles/{chat_profile}"
},
"summary": "Rehomes linked guest state without discarding messages or relationships.",
"verb": "merge-identity"
},
{
"effect": "write",
"flags": [
{
"field": "ttl",
"flag": "--ttl",
"summary": "Lifetime, 60s to 3600s; default 3600s.",
"type": "duration"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/chat_profiles/*}:issueToken",
"method": "events.chat_profiles.issue_token",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/chat_profiles/{chat_profile}"
},
"summary": "Issues a bounded player capability after verified Auth token exchange.",
"verb": "issue-token"
}
],
"noun": "chat-profiles",
"resource_type": "events.sylphx.com/ChatProfile"
},
{
"collection": "chat_reports",
"commands": [
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "Maximum results; default 50, maximum 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "Previous response's next_page_token.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/chat_reports",
"method": "events.chat_reports.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 the moderation queue.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "status",
"flag": "--status",
"summary": "resolved or dismissed.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/chat_reports/*}:resolve",
"method": "events.chat_reports.resolve",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/chat_reports/{chat_report}"
},
"summary": "Records a moderation response.",
"verb": "resolve"
}
],
"noun": "chat-reports",
"resource_type": "events.sylphx.com/ChatReport"
}
],
"commands": [],
"display_name": "Sylphx Events",
"noun": "events",
"stage": "preview"
},
{
"collections": [
{
"collection": "uptime_manifests",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/uptime_manifests/*}",
"method": "hosting.uptime_manifests.get",
"permission": "hosting:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/uptime_manifests/{uptime_manifest}"
},
"summary": "Reads complete check declarations from the owner's selected source intent. Missing, unavailable or invalid sources are errors, never an empty set.",
"verb": "get"
}
],
"noun": "uptime-manifests",
"resource_type": "hosting.sylphx.com/UptimeManifest"
},
{
"collection": "serving_routes",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/serving_routes/*}",
"method": "hosting.serving_routes.get",
"permission": "hosting:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/serving_routes/{serving_route}"
},
"summary": "Gets an authorized public route observation.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most 100 routes; each retains its full host/rule population.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "Continuation bound to this parent and owner snapshot.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/serving_routes",
"method": "hosting.serving_routes.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 every authorized public route; follow all pages in one snapshot.",
"verb": "list"
}
],
"noun": "serving-routes",
"resource_type": "hosting.sylphx.com/ServingRoute"
},
{
"collection": "service_observations",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/service_observations/*}",
"method": "hosting.service_observations.get",
"permission": "hosting:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/service_observations/{service_observation}"
},
"summary": "Reads readiness without invoking or waking a service.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "method",
"flag": "--method",
"summary": "GET or HEAD; defaults to HEAD.",
"type": "string"
},
{
"field": "path",
"flag": "--path",
"summary": "Canonical safe path; defaults to /healthz.",
"type": "string"
},
{
"field": "expect_status",
"flag": "--expect-status",
"repeated": true,
"summary": "Allowed statuses; defaults to 200 through 299.",
"type": "int"
},
{
"field": "expect_body",
"flag": "--expect-body",
"summary": "Bounded literal body assertion for GET.",
"type": "string"
},
{
"field": "timeout",
"flag": "--timeout",
"summary": "1, 2, 5 or 10 seconds; defaults to 10 seconds.",
"type": "duration"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/service_observations/*}:probe",
"method": "hosting.service_observations.probe",
"permission": "hosting:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/service_observations/{service_observation}"
},
"summary": "Performs one safe same-environment transport observation. Unlike a readiness read, this explicitly requested HTTP instrument may activate an idle service. No caller credential is forwarded to the workload.",
"verb": "probe"
}
],
"noun": "service-observations",
"resource_type": "hosting.sylphx.com/ServiceObservation"
},
{
"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",
"served": false,
"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,
"served": false,
"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}"
},
"served": false,
"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}"
},
"served": false,
"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}"
},
"served": false,
"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",
"served": false,
"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}"
},
"served": false,
"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}"
},
"served": false,
"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}"
},
"served": false,
"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}"
},
"served": false,
"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}"
},
"served": false,
"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",
"served": false,
"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}"
},
"served": false,
"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}"
},
"served": false,
"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}"
},
"served": false,
"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",
"served": false,
"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,
"served": false,
"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}"
},
"served": false,
"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",
"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": "spaces",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/spaces/*}",
"method": "knowledge.spaces.get",
"permission": "knowledge:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}"
},
"summary": "Gets a space.",
"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/*}/spaces",
"method": "knowledge.spaces.list",
"paginates": true,
"permission": "knowledge:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists spaces.",
"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": "space.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "space.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "space.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "space.spec.kind",
"flag": "--spec.kind",
"required": true,
"summary": "What the space holds.",
"type": "enum",
"values": [
"workspace",
"project",
"team",
"end_user",
"agent",
"shared"
]
},
{
"field": "space.spec.parent",
"flag": "--spec.parent",
"summary": "The space this one inherits grants from, for example a project space under its workspace space. A reader of the parent reads this space.",
"type": "string"
},
{
"field": "space.spec.owner",
"flag": "--spec.owner",
"summary": "The principal a private space belongs to, as a share subject: `end_user:<id>` for `SPACE_KIND_END_USER`, `agent:<id>` or `agent:<id>/end_user:<id>` for `SPACE_KIND_AGENT`. Empty for a shared space. The owner is granted `owner` on the space.",
"type": "string"
},
{
"field": "space.spec.grants",
"flag": "--spec.grants",
"repeated": true,
"summary": "Who may read and write the space, beyond `owner` and what `parent` grants; at most 200. A repeated grant is stored once.",
"type": "json"
},
{
"field": "space.spec.sensitive",
"flag": "--spec.sensitive",
"summary": "The space holds customer personal data. Its records are never sent in embeddings outside the cell's model routes, and enter a context pack or an answer that spans spaces only for a reader that holds `reader` on this space directly. Only deterministic entity matches apply to it.",
"type": "bool"
},
{
"field": "space.spec.schemas",
"flag": "--spec.schemas",
"repeated": true,
"summary": "The Knowledge Schemas whose types the space accepts, as resource names; the core schema is always accepted. At most 20.",
"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/*}/spaces",
"method": "knowledge.spaces.create",
"permission": "knowledge:write",
"positional": {
"arg": "ID",
"field": "space_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "space",
"summary": "Creates a space.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "space.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "space.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "space.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "space.spec.kind",
"flag": "--spec.kind",
"required": true,
"summary": "What the space holds.",
"type": "enum",
"values": [
"workspace",
"project",
"team",
"end_user",
"agent",
"shared"
]
},
{
"field": "space.spec.parent",
"flag": "--spec.parent",
"summary": "The space this one inherits grants from, for example a project space under its workspace space. A reader of the parent reads this space.",
"type": "string"
},
{
"field": "space.spec.owner",
"flag": "--spec.owner",
"summary": "The principal a private space belongs to, as a share subject: `end_user:<id>` for `SPACE_KIND_END_USER`, `agent:<id>` or `agent:<id>/end_user:<id>` for `SPACE_KIND_AGENT`. Empty for a shared space. The owner is granted `owner` on the space.",
"type": "string"
},
{
"field": "space.spec.grants",
"flag": "--spec.grants",
"repeated": true,
"summary": "Who may read and write the space, beyond `owner` and what `parent` grants; at most 200. A repeated grant is stored once.",
"type": "json"
},
{
"field": "space.spec.sensitive",
"flag": "--spec.sensitive",
"summary": "The space holds customer personal data. Its records are never sent in embeddings outside the cell's model routes, and enter a context pack or an answer that spans spaces only for a reader that holds `reader` on this space directly. Only deterministic entity matches apply to it.",
"type": "bool"
},
{
"field": "space.spec.schemas",
"flag": "--spec.schemas",
"repeated": true,
"summary": "The Knowledge Schemas whose types the space accepts, as resource names; the core schema is always accepted. At most 20.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the space 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/{space.name=orgs/*/projects/*/envs/*/spaces/*}",
"method": "knowledge.spaces.update",
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "space.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}"
},
"resource_field": "space",
"sends_etag": true,
"summary": "Updates a space.",
"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 space 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 space's episodes and facts; without it, a space that holds records is refused with `INVALID_STATE`.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/spaces/*}",
"method": "knowledge.spaces.delete",
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}"
},
"summary": "Deletes a space. A space that still holds records is refused with `INVALID_STATE` unless `force` is set, which deletes its episodes and facts too.",
"verb": "delete"
}
],
"noun": "spaces",
"resource_type": "knowledge.sylphx.com/Space"
},
{
"collection": "knowledge_schemas",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/knowledge_schemas/*}",
"method": "knowledge.knowledge_schemas.get",
"permission": "knowledge:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/knowledge_schemas/{knowledge_schema}"
},
"summary": "Gets a knowledge schema.",
"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/*}/knowledge_schemas",
"method": "knowledge.knowledge_schemas.list",
"paginates": true,
"permission": "knowledge:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists knowledge schemas.",
"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": "knowledge_schema.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "knowledge_schema.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "knowledge_schema.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "knowledge_schema.spec.entity_types",
"flag": "--spec.entity-types",
"repeated": true,
"summary": "The entity types; at most 200.",
"type": "json"
},
{
"field": "knowledge_schema.spec.relation_types",
"flag": "--spec.relation-types",
"repeated": true,
"summary": "The relation types; at most 500.",
"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/*}/knowledge_schemas",
"method": "knowledge.knowledge_schemas.create",
"permission": "knowledge:write",
"positional": {
"arg": "ID",
"field": "knowledge_schema_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "knowledge_schema",
"summary": "Creates a knowledge schema.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "knowledge_schema.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "knowledge_schema.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "knowledge_schema.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "knowledge_schema.spec.entity_types",
"flag": "--spec.entity-types",
"repeated": true,
"summary": "The entity types; at most 200.",
"type": "json"
},
{
"field": "knowledge_schema.spec.relation_types",
"flag": "--spec.relation-types",
"repeated": true,
"summary": "The relation types; at most 500.",
"type": "json"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the knowledge schema 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/{knowledge_schema.name=orgs/*/projects/*/envs/*/knowledge_schemas/*}",
"method": "knowledge.knowledge_schemas.update",
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "knowledge_schema.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/knowledge_schemas/{knowledge_schema}"
},
"resource_field": "knowledge_schema",
"sends_etag": true,
"summary": "Updates a knowledge schema. An accepted update publishes a new revision; a change that would invalidate existing records is refused with `INVALID_FIELD`.",
"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 knowledge schema 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/*/knowledge_schemas/*}",
"method": "knowledge.knowledge_schemas.delete",
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/knowledge_schemas/{knowledge_schema}"
},
"summary": "Deletes a knowledge schema. A schema a space still accepts is refused with `RESOURCE_IN_USE`.",
"verb": "delete"
}
],
"noun": "knowledge-schemas",
"resource_type": "knowledge.sylphx.com/KnowledgeSchema"
},
{
"collection": "episodes",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/spaces/*/episodes/*}",
"method": "knowledge.episodes.get",
"permission": "knowledge:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}/episodes/{episode}"
},
"summary": "Gets an episode.",
"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` and `extraction`; for example `kind = EPISODE_KIND_NOTE AND extraction = EXTRACTION_DONE`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/spaces/*}/episodes",
"method": "knowledge.episodes.list",
"paginates": true,
"permission": "knowledge:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}"
},
"summary": "Lists a space's episodes, newest first. The filter is limited to `kind` and `extraction`.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "episode.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "episode.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "episode.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "episode.kind",
"flag": "--kind",
"required": true,
"summary": "What the episode is.",
"type": "enum",
"values": [
"note",
"message",
"step_result",
"document_chunk",
"imported_row",
"structured"
]
},
{
"field": "episode.text",
"flag": "--text",
"summary": "The text as written, at most 64 KiB. An episode has `text`, `data`, or both.",
"type": "string"
},
{
"field": "episode.data",
"flag": "--data",
"summary": "Structured content, for a caller that already knows the shape (an imported row, a form).",
"type": "json"
},
{
"field": "episode.occur_time",
"flag": "--occur-time",
"summary": "When it happened in the world; default the time it was recorded.",
"type": "timestamp"
},
{
"field": "episode.provenance.method",
"flag": "--provenance.method",
"summary": "How the content was produced; default `SOURCE_METHOD_STATED`. Only the service writes `SOURCE_METHOD_EXTRACTED`.",
"type": "enum",
"values": [
"stated",
"extracted",
"imported"
]
},
{
"field": "episode.provenance.references",
"flag": "--provenance.references",
"repeated": true,
"summary": "References to where the content came from: a run and step, a work item, a message, a URL. At most 20.",
"type": "json"
},
{
"field": "episode.entities",
"flag": "--entities",
"repeated": true,
"summary": "The entities the caller says the episode is about, as resource names; extraction adds the ones it finds. At most 50.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "skip_extraction",
"flag": "--skip-extraction",
"summary": "Record the episode without extraction, for content that is already structured or must not be read by a model.",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/spaces/*}/episodes",
"method": "knowledge.episodes.create",
"permission": "knowledge:write",
"positional": {
"arg": "ID",
"field": "episode_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "episode",
"summary": "Records an episode and returns at once (`remember`); extraction reads it afterwards.",
"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 episode 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/*/spaces/*/episodes/*}",
"method": "knowledge.episodes.delete",
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}/episodes/{episode}"
},
"summary": "Deletes an episode, the facts that cite only it, and its search and embedding entries; facts that also cite other episodes are re-scored.",
"verb": "delete"
}
],
"noun": "episodes",
"resource_type": "knowledge.sylphx.com/Episode"
},
{
"collection": "entities",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/entities/*}",
"method": "knowledge.entities.get",
"permission": "knowledge:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/entities/{entity}"
},
"summary": "Gets an entity.",
"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 `entity_type` and `lifecycle`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/entities",
"method": "knowledge.entities.list",
"paginates": true,
"permission": "knowledge:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists the entities the caller may see. The filter is limited to `entity_type` and `lifecycle`.",
"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": "entity.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "entity.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "entity.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "entity.entity_type",
"flag": "--entity-type",
"required": true,
"summary": "The type: a core type (`person`, `organisation`, `customer`, `contact`, `product`, `project`, `document`, `decision`, `playbook`, `case`, `topic`) or a type of an accepted Knowledge Schema, `<schema>.<type>`.",
"type": "string"
},
{
"field": "entity.title",
"flag": "--title",
"required": true,
"summary": "The name people use for it.",
"type": "string"
},
{
"field": "entity.aliases",
"flag": "--aliases",
"repeated": true,
"summary": "Other names it is known by; at most 50.",
"type": "string"
},
{
"field": "entity.properties",
"flag": "--properties",
"summary": "Properties, valid against the type's JSON Schema.",
"type": "json"
},
{
"field": "entity.external_ids",
"flag": "--external-ids",
"repeated": true,
"summary": "Identifiers in other systems. Two writes with the same external id in one graph are the same entity (deterministic resolution). At most 50.",
"type": "json"
},
{
"field": "entity.space",
"flag": "--space",
"required": true,
"summary": "The space the entity was first stated 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/*/envs/*}/entities",
"method": "knowledge.entities.create",
"permission": "knowledge:write",
"positional": {
"arg": "ID",
"field": "entity_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "entity",
"summary": "Creates an entity in a space. An entity whose external id already names one in the graph is refused with `RESOURCE_ALREADY_EXISTS`, which names it; use Update with `allow_missing` to upsert.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "entity.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "entity.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "entity.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "entity.entity_type",
"flag": "--entity-type",
"required": true,
"summary": "The type: a core type (`person`, `organisation`, `customer`, `contact`, `product`, `project`, `document`, `decision`, `playbook`, `case`, `topic`) or a type of an accepted Knowledge Schema, `<schema>.<type>`.",
"type": "string"
},
{
"field": "entity.title",
"flag": "--title",
"required": true,
"summary": "The name people use for it.",
"type": "string"
},
{
"field": "entity.aliases",
"flag": "--aliases",
"repeated": true,
"summary": "Other names it is known by; at most 50.",
"type": "string"
},
{
"field": "entity.properties",
"flag": "--properties",
"summary": "Properties, valid against the type's JSON Schema.",
"type": "json"
},
{
"field": "entity.external_ids",
"flag": "--external-ids",
"repeated": true,
"summary": "Identifiers in other systems. Two writes with the same external id in one graph are the same entity (deterministic resolution). At most 50.",
"type": "json"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the entity when no entity matches (`upsert_entity`): the name, or else `external_ids`, identifies it.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{entity.name=orgs/*/projects/*/envs/*/entities/*}",
"method": "knowledge.entities.update",
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "entity.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/entities/{entity}"
},
"resource_field": "entity",
"sends_etag": true,
"summary": "Updates an entity. With `allow_missing` it is the structured upsert (`upsert_entity`): an entity matched by `external_ids` is updated, otherwise one is created.",
"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 entity 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 episodes this person wrote (a data-rights erasure).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/entities/*}",
"method": "knowledge.entities.delete",
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/entities/{entity}"
},
"summary": "Deletes an entity and every fact about it. With `force` it is a data-rights erasure: the episodes the person wrote are deleted too, with their search and embedding entries.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "entities",
"flag": "--entities",
"repeated": true,
"required": true,
"summary": "The entities to merge into it; 1 to 20.",
"type": "string"
},
{
"field": "reason",
"flag": "--reason",
"summary": "Why they are the same, recorded with the merge; at most 1000 characters.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/entities/*}:merge",
"method": "knowledge.entities.merge",
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/entities/{entity}"
},
"summary": "Merges other entities into this one: their facts and external ids resolve to it. The merge is recorded and reversible with `:split`; it is never a silent rewrite.",
"verb": "merge"
},
{
"effect": "write",
"flags": [
{
"field": "entity",
"flag": "--entity",
"required": true,
"summary": "The merged entity to restore.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/entities/*}:split",
"method": "knowledge.entities.split",
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/entities/{entity}"
},
"summary": "Splits a merged entity back out of this one, with the facts and external ids it brought.",
"verb": "split"
},
{
"effect": "read",
"flags": [
{
"field": "valid_time",
"flag": "--valid-time",
"summary": "The profile as it was valid at this time; default now.",
"type": "timestamp"
},
{
"field": "max_episodes",
"flag": "--max-episodes",
"summary": "At most this many recent episodes; default 20, clamped to 100.",
"type": "int"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/entities/*}:profile",
"method": "knowledge.entities.profile",
"permission": "knowledge:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/entities/{entity}"
},
"summary": "Returns one entity's profile in one call (`entity`): the entity, its current facts in both directions, the entities they name and the recent episodes about it, trimmed to what the caller may see. A read with a request body.",
"verb": "profile"
},
{
"effect": "read",
"flags": [
{
"field": "query",
"flag": "--query",
"required": true,
"summary": "What to recall, in natural language; 1 to 4000 characters.",
"type": "string"
},
{
"field": "spaces",
"flag": "--spaces",
"repeated": true,
"summary": "The spaces to search, as resource names; default every space the caller may read. At most 50.",
"type": "string"
},
{
"field": "entity_types",
"flag": "--entity-types",
"repeated": true,
"summary": "Only entities of these types; default every type.",
"type": "string"
},
{
"field": "valid_time",
"flag": "--valid-time",
"summary": "Recall the graph as it was valid at this time; default now.",
"type": "timestamp"
},
{
"field": "max_hops",
"flag": "--max-hops",
"summary": "How many hops to expand from the top entities, 0 to 2; default 2.",
"type": "int"
},
{
"field": "max_facts",
"flag": "--max-facts",
"summary": "At most this many facts in the pack; default 30, clamped to 200.",
"type": "int"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/entities:recall",
"method": "knowledge.entities.recall",
"permission": "knowledge:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Searches the graph (`recall`): hybrid lexical and semantic search over episodes and facts, fused by reciprocal rank, then at most two hops of expansion from the top entities. Returns a context pack with citations, built only from records the caller may see.",
"verb": "recall"
},
{
"effect": "read",
"flags": [
{
"field": "question",
"flag": "--question",
"required": true,
"summary": "The question, in natural language; 1 to 4000 characters.",
"type": "string"
},
{
"field": "spaces",
"flag": "--spaces",
"repeated": true,
"summary": "The spaces to answer from, as resource names; default every space the caller may read. At most 50.",
"type": "string"
},
{
"field": "valid_time",
"flag": "--valid-time",
"summary": "Answer about the graph as it was valid at this time; default now.",
"type": "timestamp"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/entities:ask",
"method": "knowledge.entities.ask",
"permission": "knowledge:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Answers a question through Sylphx AI (`ask`), from a context pack built only from records the caller may see, with citations to its episodes.",
"verb": "ask"
}
],
"noun": "entities",
"resource_type": "knowledge.sylphx.com/Entity"
},
{
"collection": "relations",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/spaces/*/relations/*}",
"method": "knowledge.relations.get",
"permission": "knowledge:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}/relations/{relation}"
},
"summary": "Gets a relation.",
"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 `subject`, `predicate`, `object` and `provenance.channel`.",
"type": "string"
},
{
"field": "valid_time",
"flag": "--valid-time",
"summary": "List facts as they were valid at this time, including facts closed since; default now.",
"type": "timestamp"
},
{
"field": "show_superseded",
"flag": "--show-superseded",
"summary": "Also list facts that a newer record replaced.",
"type": "bool"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/spaces/*}/relations",
"method": "knowledge.relations.list",
"paginates": true,
"permission": "knowledge:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}"
},
"summary": "Lists a space's facts. The filter is limited to `subject`, `predicate`, `object` and `provenance.channel`; superseded facts are listed only with `show_superseded`.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "relation.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "relation.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "relation.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "relation.subject",
"flag": "--subject",
"required": true,
"summary": "The entity the fact is about.",
"type": "string"
},
{
"field": "relation.predicate",
"flag": "--predicate",
"required": true,
"summary": "The relation type, snake_case, for example `works_at` or `prefers`; a core predicate or one of an accepted Knowledge Schema.",
"type": "string"
},
{
"field": "relation.object",
"flag": "--object",
"summary": "The other entity, for an edge. A fact has `object`, `value`, or both.",
"type": "string"
},
{
"field": "relation.value",
"flag": "--value",
"summary": "The value, for a fact about one entity.",
"type": "json"
},
{
"field": "relation.statement",
"flag": "--statement",
"summary": "The fact as one sentence, used for search and shown with citations.",
"type": "string"
},
{
"field": "relation.valid_start_time",
"flag": "--valid-start-time",
"summary": "When the fact starts to hold in the world; default when it was recorded.",
"type": "timestamp"
},
{
"field": "relation.valid_end_time",
"flag": "--valid-end-time",
"summary": "When the fact stopped holding in the world; unset while it holds.",
"type": "timestamp"
},
{
"field": "relation.episodes",
"flag": "--episodes",
"repeated": true,
"summary": "The episodes the fact comes from. A structured write with none records its own episode and cites it; an extracted fact cites the episodes it was read from.",
"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/*/spaces/*}/relations",
"method": "knowledge.relations.create",
"permission": "knowledge:write",
"positional": {
"arg": "ID",
"field": "relation_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "relation",
"summary": "Records a fact in a space (`relate`). A fact that contradicts a current one with the same subject and a single-valued predicate closes the older fact; nothing is overwritten.",
"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 relation 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/*/spaces/*/relations/*}",
"method": "knowledge.relations.delete",
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}/relations/{relation}"
},
"summary": "Deletes a fact. Deletion is for data that must go; a fact that stopped being true is closed with `:close`.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "valid_end_time",
"flag": "--valid-end-time",
"summary": "When the fact stopped holding in the world; default now.",
"type": "timestamp"
},
{
"field": "etag",
"flag": "--etag",
"summary": "Close only if the current etag matches.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/spaces/*/relations/*}:close",
"method": "knowledge.relations.close",
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}/relations/{relation}"
},
"summary": "Closes a fact (`close_fact`): it stopped holding in the world at `valid_end_time`. The fact stays readable for questions about the time before the close.",
"verb": "close"
}
],
"noun": "relations",
"resource_type": "knowledge.sylphx.com/Relation"
}
],
"commands": [],
"display_name": "Sylphx Knowledge",
"noun": "knowledge",
"porcelain": [
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "episode.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "episode.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "episode.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "episode.kind",
"flag": "--kind",
"required": true,
"summary": "What the episode is.",
"type": "enum",
"values": [
"note",
"message",
"step_result",
"document_chunk",
"imported_row",
"structured"
]
},
{
"field": "episode.text",
"flag": "--text",
"summary": "The text as written, at most 64 KiB. An episode has `text`, `data`, or both.",
"type": "string"
},
{
"field": "episode.data",
"flag": "--data",
"summary": "Structured content, for a caller that already knows the shape (an imported row, a form).",
"type": "json"
},
{
"field": "episode.occur_time",
"flag": "--occur-time",
"summary": "When it happened in the world; default the time it was recorded.",
"type": "timestamp"
},
{
"field": "episode.provenance.method",
"flag": "--provenance.method",
"summary": "How the content was produced; default `SOURCE_METHOD_STATED`. Only the service writes `SOURCE_METHOD_EXTRACTED`.",
"type": "enum",
"values": [
"stated",
"extracted",
"imported"
]
},
{
"field": "episode.provenance.references",
"flag": "--provenance.references",
"repeated": true,
"summary": "References to where the content came from: a run and step, a work item, a message, a URL. At most 20.",
"type": "json"
},
{
"field": "episode.entities",
"flag": "--entities",
"repeated": true,
"summary": "The entities the caller says the episode is about, as resource names; extraction adds the ones it finds. At most 50.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "skip_extraction",
"flag": "--skip-extraction",
"summary": "Record the episode without extraction, for content that is already structured or must not be read by a model.",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/spaces/*}/episodes",
"method": "knowledge.episodes.create",
"path": [],
"permission": "knowledge:write",
"positional": {
"arg": "ID",
"field": "episode_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "episode",
"summary": "Records an episode and returns at once (`remember`); extraction reads it afterwards.",
"verb": "remember"
},
{
"effect": "read",
"flags": [
{
"field": "valid_time",
"flag": "--valid-time",
"summary": "The profile as it was valid at this time; default now.",
"type": "timestamp"
},
{
"field": "max_episodes",
"flag": "--max-episodes",
"summary": "At most this many recent episodes; default 20, clamped to 100.",
"type": "int"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/entities/*}:profile",
"method": "knowledge.entities.profile",
"path": [],
"permission": "knowledge:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/entities/{entity}"
},
"summary": "Returns one entity's profile in one call (`entity`): the entity, its current facts in both directions, the entities they name and the recent episodes about it, trimmed to what the caller may see. A read with a request body.",
"verb": "entity"
},
{
"effect": "read",
"flags": [
{
"field": "query",
"flag": "--query",
"required": true,
"summary": "What to recall, in natural language; 1 to 4000 characters.",
"type": "string"
},
{
"field": "spaces",
"flag": "--spaces",
"repeated": true,
"summary": "The spaces to search, as resource names; default every space the caller may read. At most 50.",
"type": "string"
},
{
"field": "entity_types",
"flag": "--entity-types",
"repeated": true,
"summary": "Only entities of these types; default every type.",
"type": "string"
},
{
"field": "valid_time",
"flag": "--valid-time",
"summary": "Recall the graph as it was valid at this time; default now.",
"type": "timestamp"
},
{
"field": "max_hops",
"flag": "--max-hops",
"summary": "How many hops to expand from the top entities, 0 to 2; default 2.",
"type": "int"
},
{
"field": "max_facts",
"flag": "--max-facts",
"summary": "At most this many facts in the pack; default 30, clamped to 200.",
"type": "int"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/entities:recall",
"method": "knowledge.entities.recall",
"path": [],
"permission": "knowledge:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Searches the graph (`recall`): hybrid lexical and semantic search over episodes and facts, fused by reciprocal rank, then at most two hops of expansion from the top entities. Returns a context pack with citations, built only from records the caller may see.",
"verb": "recall"
},
{
"effect": "read",
"flags": [
{
"field": "question",
"flag": "--question",
"required": true,
"summary": "The question, in natural language; 1 to 4000 characters.",
"type": "string"
},
{
"field": "spaces",
"flag": "--spaces",
"repeated": true,
"summary": "The spaces to answer from, as resource names; default every space the caller may read. At most 50.",
"type": "string"
},
{
"field": "valid_time",
"flag": "--valid-time",
"summary": "Answer about the graph as it was valid at this time; default now.",
"type": "timestamp"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/entities:ask",
"method": "knowledge.entities.ask",
"path": [],
"permission": "knowledge:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Answers a question through Sylphx AI (`ask`), from a context pack built only from records the caller may see, with citations to its episodes.",
"verb": "ask"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "relation.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "relation.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "relation.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "relation.subject",
"flag": "--subject",
"required": true,
"summary": "The entity the fact is about.",
"type": "string"
},
{
"field": "relation.predicate",
"flag": "--predicate",
"required": true,
"summary": "The relation type, snake_case, for example `works_at` or `prefers`; a core predicate or one of an accepted Knowledge Schema.",
"type": "string"
},
{
"field": "relation.object",
"flag": "--object",
"summary": "The other entity, for an edge. A fact has `object`, `value`, or both.",
"type": "string"
},
{
"field": "relation.value",
"flag": "--value",
"summary": "The value, for a fact about one entity.",
"type": "json"
},
{
"field": "relation.statement",
"flag": "--statement",
"summary": "The fact as one sentence, used for search and shown with citations.",
"type": "string"
},
{
"field": "relation.valid_start_time",
"flag": "--valid-start-time",
"summary": "When the fact starts to hold in the world; default when it was recorded.",
"type": "timestamp"
},
{
"field": "relation.valid_end_time",
"flag": "--valid-end-time",
"summary": "When the fact stopped holding in the world; unset while it holds.",
"type": "timestamp"
},
{
"field": "relation.episodes",
"flag": "--episodes",
"repeated": true,
"summary": "The episodes the fact comes from. A structured write with none records its own episode and cites it; an extracted fact cites the episodes it was read from.",
"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/*/spaces/*}/relations",
"method": "knowledge.relations.create",
"path": [],
"permission": "knowledge:write",
"positional": {
"arg": "ID",
"field": "relation_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "relation",
"summary": "Records a fact in a space (`relate`). A fact that contradicts a current one with the same subject and a single-valued predicate closes the older fact; nothing is overwritten.",
"verb": "relate"
},
{
"effect": "write",
"flags": [
{
"field": "valid_end_time",
"flag": "--valid-end-time",
"summary": "When the fact stopped holding in the world; default now.",
"type": "timestamp"
},
{
"field": "etag",
"flag": "--etag",
"summary": "Close only if the current etag matches.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/spaces/*/relations/*}:close",
"method": "knowledge.relations.close",
"path": [],
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}/relations/{relation}"
},
"summary": "Closes a fact (`close_fact`): it stopped holding in the world at `valid_end_time`. The fact stays readable for questions about the time before the close.",
"verb": "close-fact"
}
],
"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": "processor_events",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/processor_events/*}",
"method": "money.processor_events.get",
"permission": "billing:processor_events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/processor_events/{processor_event}"
},
"summary": "Gets one stored processor hint, with its safe hold reason.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "Default 50, at most 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "Token from the preceding page, bound to environment and filter.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "Only `state = \"held\"` (the default), `pending`, `applied`, or `dismissed`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/processor_events",
"method": "money.processor_events.list",
"paginates": true,
"permission": "billing:processor_events:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists stored processor hints; defaults to held events.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"required": true,
"summary": "The event's current meta.etag, required to avoid racing another decision.",
"type": "string"
},
{
"field": "reason",
"flag": "--reason",
"required": true,
"summary": "`operator_retry` or `permissions_restored`.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/processor_events/*}:retry",
"method": "money.processor_events.retry",
"permission": "billing:processor_events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/processor_events/{processor_event}"
},
"summary": "Schedules a held event through the existing idempotent application path. The decision is audited; an etag is required.",
"verb": "retry"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"required": true,
"summary": "The event's current meta.etag.",
"type": "string"
},
{
"field": "reason",
"flag": "--reason",
"required": true,
"summary": "Must be `test_processor_observation`.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/processor_events/*}:dismiss",
"method": "money.processor_events.dismiss",
"permission": "billing:processor_events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/processor_events/{processor_event}"
},
"summary": "Dismisses only a held test-mode payout observation, retaining the row and audit. Live, unknown-mode and payment events are refused.",
"verb": "dismiss"
}
],
"noun": "processor-events",
"resource_type": "money.sylphx.com/ProcessorEvent"
},
{
"collection": "merchant_accounts",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/merchant_accounts/*}:checkProcessorPermissions",
"method": "money.merchant_accounts.check_processor_permissions",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/merchant_accounts/{merchant_account}"
},
"summary": "Checks Payouts and Balance read without modifying a merchant, its key or checkout.",
"verb": "check-processor-permissions"
},
{
"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": "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": "catalog.spec.application_data",
"flag": "--spec.application-data",
"summary": "Caller-owned, publicly readable application data published atomically with the products in this revision. Money preserves it without interpreting its schema or using it for prices, grants, checkout or processor reconciliation. The caller validates its schema and version. At most 65536 UTF-8 bytes when serialized as compact JSON; must be an object. Never include secrets or personal data: the public catalog exposes this field.",
"type": "json"
},
{
"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. Continuation tokens reject collection changes with ETAG_MISMATCH; restart without a page token after a conflict.",
"verb": "list"
},
{
"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 of this snapshot.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over entitlement grant fields.",
"type": "string"
},
{
"field": "snapshot_revision",
"flag": "--snapshot-revision",
"summary": "Expected environment-wide collection revision, as a canonical decimal string. Empty selects the current source snapshot; any nonempty value, including \"0\", requires equality or returns HTTP 409 ETAG_MISMATCH. Send the first response's revision on every subsequent page. Page tokens also fence that revision and cannot be reused after a collection change.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/entitlement_grants:snapshot",
"method": "money.entitlement_grants.snapshot",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Reads a coherent entitlement snapshot with an environment-wide source revision. Discard every page and restart after ETAG_MISMATCH.",
"verb": "snapshot"
},
{
"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). A test grant's (`test/<id>`) is set by the server, `synthetic:<env>:<synthetic_time>`, and the input is ignored.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/entitlement_grants",
"method": "money.entitlement_grants.create",
"permission": "billing:test_grants:write",
"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. The subject decides what it needs: an end user the env's Sylphx Auth stamped as a born-synthetic test account gets a test grant (`test/<id>`, at most 90 days, approval_ref set by the server) with `billing:test_grants:write`; any other subject needs the approval-class `billing:credits.approve` and is refused PERMISSION_DENIED (`subject_not_synthetic`) otherwise. The approver recorded is the key's principal.",
"verb": "create"
}
],
"noun": "entitlement-grants",
"resource_type": "money.sylphx.com/EntitlementGrant"
},
{
"collection": "test_clocks",
"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": "test_clock.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": "test_clock.subject.customer_organization",
"flag": "--subject.customer-organization",
"summary": "A customer organization's id.",
"type": "string"
},
{
"field": "test_clock.frozen_time",
"flag": "--frozen-time",
"required": true,
"summary": "Initial simulated time on create; current Stripe time on reads. Required on create. Only whole seconds are supported.",
"type": "timestamp"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/test_clocks",
"method": "money.test_clocks.create",
"permission": "billing:write",
"positional": {
"arg": "ID",
"field": "test_clock_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "test_clock",
"summary": "Creates a test-only Stripe simulation before the subject's first checkout. No catalogue, payment, subscription, or entitlement is changed.",
"verb": "create"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/test_clocks/*}",
"method": "money.test_clocks.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/test_clocks/{test_clock}"
},
"summary": "Reads the owned test clock back from Stripe. Live keys are refused.",
"verb": "get"
},
{
"effect": "write",
"flags": [
{
"field": "frozen_time",
"flag": "--frozen-time",
"required": true,
"summary": "Target simulated time. Whole seconds; must not precede current time. Repeating an already reached target is idempotent.",
"type": "timestamp"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/test_clocks/*}:advance",
"method": "money.test_clocks.advance",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/test_clocks/{test_clock}"
},
"summary": "Advances Stripe time, never entitlements. Stripe processes asynchronously; poll GetTestClock until ready, then observe the genuine webhook's effects. Time only moves forward, within Stripe's subscription-interval bound.",
"verb": "advance"
}
],
"noun": "test-clocks",
"resource_type": "money.sylphx.com/TestClock"
},
{
"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"
},
{
"field": "checkout_session.shipping_country_codes",
"flag": "--shipping-country-codes",
"repeated": true,
"summary": "Countries whose shipping address the hosted page collects, upper-case ISO 3166-1 alpha-2. Empty means no shipping address is collected.",
"type": "string"
},
{
"field": "checkout_session.consent_collection.terms_required",
"flag": "--consent-collection.terms-required",
"summary": "Require a tick accepting `terms_text` before the buyer can pay. The merchant's Stripe account needs a terms of service URL in its public business details; without one the create fails with `processor_terms_url_missing`.",
"type": "bool"
},
{
"field": "checkout_session.consent_collection.terms_text",
"flag": "--consent-collection.terms-text",
"summary": "The wording shown next to the tick; at most 1200 characters. Required with `terms_required`.",
"type": "string"
},
{
"field": "checkout_session.consent_collection.terms_version",
"flag": "--consent-collection.terms-version",
"summary": "Which version of the wording this is, recorded with the consent as evidence; at most 64 characters. Required with `terms_required`.",
"type": "string"
},
{
"field": "checkout_session.consent_collection.promotions",
"flag": "--consent-collection.promotions",
"summary": "Offer the buyer an opt-in to promotional email where the processor allows it.",
"type": "bool"
}
],
"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"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/checkout_sessions/*}:expire",
"method": "money.checkout_sessions.expire",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/checkout_sessions/{checkout_session}"
},
"summary": "Expires an open hosted checkout so it can no longer be paid.",
"verb": "expire"
},
{
"effect": "write",
"flags": [
{
"field": "amount_minor",
"flag": "--amount-minor",
"summary": "Optional partial amount in minor units; empty refunds the remaining amount.",
"type": "int"
},
{
"field": "reason",
"flag": "--reason",
"summary": "Optional processor refund reason.",
"type": "string"
},
{
"field": "metadata",
"flag": "--metadata",
"repeated": true,
"summary": "Caller metadata, such as the app's return and order ids. At most 20 keys.",
"type": "key=value"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/checkout_sessions/*}:refund",
"method": "money.checkout_sessions.refund",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/checkout_sessions/{checkout_session}"
},
"summary": "Refund all or part of a paid one-time checkout.",
"verb": "refund"
}
],
"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": "write",
"flags": [
{
"field": "usage_events",
"flag": "--usage-events",
"repeated": true,
"required": true,
"summary": "1 to 500 events.",
"type": "json"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/usage_events:batchIngest",
"method": "money.usage_events.batch_ingest",
"permission": "billing:metering:ingest",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Records a batch of already-incurred usage from the merchant's own servers (Stripe's meter-event model): the caller is a key of the merchant's own org holding the exact grant `billing:metering:ingest`, which no wildcard covers, and each event names its subject with no subject proof. Each event is keyed by its project, meter, meter version and event id: a replay is a no-op (`duplicate`), and the same key with different content is a `conflict` and never counted. One result per event, in request order.",
"verb": "batch-ingest"
},
{
"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"
},
{
"collection": "revenue_sources",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/revenue_sources/*}",
"method": "money.revenue_sources.get",
"permission": "revenue:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/revenue_sources/{revenue_source}"
},
"summary": "Gets a revenue source, with its freshness. Revenue reporting (docs/adr/ADR-01M40HRQT0VSXZ1WANP8M318F2) is org-wide: `revenue:read` or `revenue:write`, held by an org-wide key or an org owner's or admin's session only; a project or environment key is refused.",
"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/*}/revenue_sources",
"method": "money.revenue_sources.list",
"paginates": true,
"permission": "revenue:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists the org's revenue sources, with their freshness.",
"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": "revenue_source.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "revenue_source.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "revenue_source.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "revenue_source.spec.kind",
"flag": "--spec.kind",
"required": true,
"summary": "`money`, `stripe`, `google_play`, `app_store`, `ad_network`, `file` or `manual`. Set on create and never changed; `money` is never created.",
"type": "string"
},
{
"field": "revenue_source.spec.display_name",
"flag": "--spec.display-name",
"summary": "Shown on summaries and in the console.",
"type": "string"
},
{
"field": "revenue_source.spec.paused",
"flag": "--spec.paused",
"summary": "A paused source is not synced and cannot be run; its facts still count.",
"type": "bool"
},
{
"field": "revenue_source.spec.config",
"flag": "--spec.config",
"repeated": true,
"summary": "The connector's settings (an account id, a bucket, a column mapping), never a credential. At most 32 entries.",
"type": "key=value"
},
{
"field": "revenue_source.spec.credential",
"flag": "--spec.credential",
"sensitive": true,
"summary": "The connector's credential, such as a Stripe live restricted key with read access to balance transactions and payouts. Shared by all connector kinds: sealed on write, never returned; omit it on update to keep it.",
"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/*}/revenue_sources",
"method": "money.revenue_sources.create",
"permission": "revenue:write",
"positional": {
"arg": "ID",
"field": "revenue_source_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "revenue_source",
"summary": "Registers a revenue source. The `money` source is implicit and never created here.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "revenue_source.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "revenue_source.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "revenue_source.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "revenue_source.spec.display_name",
"flag": "--spec.display-name",
"summary": "Shown on summaries and in the console.",
"type": "string"
},
{
"field": "revenue_source.spec.paused",
"flag": "--spec.paused",
"summary": "A paused source is not synced and cannot be run; its facts still count.",
"type": "bool"
},
{
"field": "revenue_source.spec.config",
"flag": "--spec.config",
"repeated": true,
"summary": "The connector's settings (an account id, a bucket, a column mapping), never a credential. At most 32 entries.",
"type": "key=value"
},
{
"field": "revenue_source.spec.credential",
"flag": "--spec.credential",
"sensitive": true,
"summary": "The connector's credential, such as a Stripe live restricted key with read access to balance transactions and payouts. Shared by all connector kinds: sealed on write, never returned; omit it on update to keep it.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{revenue_source.name=orgs/*/revenue_sources/*}",
"method": "money.revenue_sources.update",
"permission": "revenue:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "revenue_source.name",
"pattern": "orgs/{org}/revenue_sources/{revenue_source}"
},
"resource_field": "revenue_source",
"sends_etag": true,
"summary": "Renames, pauses or resumes a revenue source, or changes its settings.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "The current etag; when set, the delete happens only if it 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/*/revenue_sources/*}",
"method": "money.revenue_sources.delete",
"permission": "revenue:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/revenue_sources/{revenue_source}"
},
"summary": "Deletes a revenue source and the facts it reported. The `money` source cannot be deleted; pause it instead.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "mode",
"flag": "--mode",
"summary": "`sync` (default) reads what is new; `backfill` re-reads the period `start_day` to `end_day`.",
"type": "string"
},
{
"field": "start_day",
"flag": "--start-day",
"summary": "The first day of a backfill, `YYYY-MM-DD`.",
"type": "string"
},
{
"field": "end_day",
"flag": "--end-day",
"summary": "The last day of a backfill, `YYYY-MM-DD`, inclusive.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/revenue_sources/*}:run",
"method": "money.revenue_sources.run",
"permission": "revenue:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/revenue_sources/{revenue_source}"
},
"summary": "Syncs a revenue source now, or backfills a period. A `money` source fills any booked fact its environment's ledger holds and the facts lack; a paused source, or one whose connector has not shipped yet, is refused (`INVALID_STATE`).",
"verb": "run"
}
],
"noun": "revenue-sources",
"resource_type": "money.sylphx.com/RevenueSource"
},
{
"collection": "revenue",
"commands": [
{
"effect": "read",
"flags": [
{
"field": "period",
"flag": "--period",
"summary": "`today`, `mtd` (month to date, the default), `month` (with `month`), or `range` (with `start_day` and `end_day`). Days are UTC.",
"type": "string"
},
{
"field": "month",
"flag": "--month",
"summary": "The month of a `month` period, `YYYY-MM`.",
"type": "string"
},
{
"field": "start_day",
"flag": "--start-day",
"summary": "The first day of a `range`, `YYYY-MM-DD`.",
"type": "string"
},
{
"field": "end_day",
"flag": "--end-day",
"summary": "The last day of a `range`, inclusive; at most 400 days after the first.",
"type": "string"
},
{
"field": "group_by",
"flag": "--group-by",
"summary": "`day` (the default) or `month`.",
"type": "string"
},
{
"field": "split",
"flag": "--by",
"summary": "`none` (the default), `source` or `product`.",
"type": "string"
},
{
"field": "amount",
"flag": "--amount",
"summary": "`net` (the default) or `gross`.",
"type": "string"
},
{
"field": "currency_code",
"flag": "--currency",
"summary": "The reporting currency, ISO 4217; default `USD`.",
"type": "string"
}
],
"http": "GET /v1/{name=orgs/*/revenue}",
"method": "money.revenue.get",
"permission": "revenue:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "name",
"optional": true,
"pattern": "orgs/{org}",
"suffix": "revenue"
},
"summary": "Gets the org's revenue over a period: totals by day or month, split by source or product, gross or net, in one reporting currency, with the basis of each bucket, the sources that report late, and what has no rate yet. Reads only the daily roll-up, bounded by a 5 second statement timeout. For example `sylphx money revenue summary --period mtd --split source`.",
"verb": "summary"
}
],
"noun": "revenue",
"resource_type": "money.sylphx.com/RevenueSummary"
},
{
"collection": "revenue_facts",
"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, comparisons joined with `AND`: `source = \"…\"` (a source id or name), `basis`, `store_kind`, `product_ref` (each `=`), and `day >= \"YYYY-MM-DD\"`, `day <= \"YYYY-MM-DD\"`. The days default to the 31 days to today (UTC), and span at most 400 days.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/revenue_facts",
"method": "money.revenue_facts.list",
"paginates": true,
"permission": "revenue:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists the org's revenue facts, newest day first, for audit and export.",
"verb": "list"
}
],
"noun": "revenue-facts",
"resource_type": "money.sylphx.com/RevenueFact"
},
{
"collection": "exchange_rates",
"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, comparisons joined with `AND`: `currency_code = \"EUR\"`, `day >= \"YYYY-MM-DD\"`, `day <= \"YYYY-MM-DD\"`. The days default to the 31 days to today (UTC), and span at most 400 days.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/exchange_rates",
"method": "money.exchange_rates.list",
"paginates": true,
"permission": "revenue:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists the exchange rates Money converts at (units per US dollar by day), for any reader that converts revenue.",
"verb": "list"
}
],
"noun": "exchange-rates",
"resource_type": "money.sylphx.com/ExchangeRate"
}
],
"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": "phone_numbers",
"commands": [
{
"effect": "write",
"flags": [
{
"field": "phone_number_id",
"flag": "--phone-number-id",
"required": true,
"summary": "Stable caller-chosen id; retries reuse this id.",
"type": "string"
},
{
"field": "phone_number",
"flag": "--phone-number",
"required": true,
"summary": "Existing E.164 number.",
"type": "string"
},
{
"field": "provider_session_token",
"flag": "--provider-session-token",
"required": true,
"sensitive": true,
"summary": "Existing provider session, held only for this synchronous request. Never stored, logged, included in command hashes, or refreshed. Issuer lifetime is provider-owned; transient custody does not assert a shorter lifetime.",
"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/*}/phone_numbers:connect",
"method": "notify.phone_numbers.connect",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "ConnectPhoneNumber: existing provider-managed lines; execution credentials are transient.",
"verb": "connect"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/phone_numbers/*}",
"method": "notify.phone_numbers.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/phone_numbers/{phone_number}"
},
"summary": "GetPhoneNumber: existing provider-managed lines; execution credentials are transient.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "Page size, default 50, maximum 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "Continuation token.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/phone_numbers",
"method": "notify.phone_numbers.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": "ListPhoneNumbers: existing provider-managed lines; execution credentials are transient.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "operation_id",
"flag": "--operation-id",
"required": true,
"summary": "Stable logical operation id. A different route needs a different id.",
"type": "string"
},
{
"field": "voicemail",
"flag": "--voicemail",
"required": true,
"summary": "Desired voicemail settings.",
"type": "json"
},
{
"field": "provider_session_token",
"flag": "--provider-session-token",
"required": true,
"sensitive": true,
"summary": "Transient provider session; excluded from every durable command/hash.",
"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/*/phone_numbers/*}:applyRoute",
"method": "notify.phone_numbers.apply_route",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/phone_numbers/{phone_number}"
},
"summary": "ApplyPhoneNumberRoute: existing provider-managed lines; execution credentials are transient.",
"verb": "apply-route"
},
{
"effect": "write",
"flags": [
{
"field": "start_day",
"flag": "--start-day",
"required": true,
"summary": "First provider-local calendar day, YYYY-MM-DD.",
"type": "string"
},
{
"field": "end_day",
"flag": "--end-day",
"required": true,
"summary": "Last day inclusive; at most one day after start_day.",
"type": "string"
},
{
"field": "provider_session_token",
"flag": "--provider-session-token",
"required": true,
"sensitive": true,
"summary": "Transient provider session.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/phone_numbers/*}:probe",
"method": "notify.phone_numbers.probe",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/phone_numbers/{phone_number}"
},
"summary": "ProbePhoneNumber: existing provider-managed lines; execution credentials are transient.",
"verb": "probe"
},
{
"effect": "read",
"flags": [
{
"field": "provider_call_id",
"flag": "--provider-call-id",
"required": true,
"summary": "Stable provider receipt id already held by this line.",
"type": "string"
},
{
"field": "start_day",
"flag": "--start-day",
"required": true,
"summary": "Day window to re-establish receipt ownership.",
"type": "string"
},
{
"field": "end_day",
"flag": "--end-day",
"required": true,
"summary": "Last day inclusive, at most one day after start_day.",
"type": "string"
},
{
"field": "provider_session_token",
"flag": "--provider-session-token",
"required": true,
"sensitive": true,
"summary": "Transient provider session.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/phone_numbers/*}:readVoicemail",
"method": "notify.phone_numbers.read_voicemail",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/phone_numbers/{phone_number}"
},
"summary": "ReadPhoneNumberVoicemail: existing provider-managed lines; execution credentials are transient.",
"verb": "read-voicemail"
}
],
"noun": "phone-numbers",
"resource_type": "notify.sylphx.com/PhoneNumber"
},
{
"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": "message_topics",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/message_topics/*}",
"method": "notify.message_topics.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/message_topics/{message_topic}"
},
"summary": "Gets a message 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/*}/message_topics",
"method": "notify.message_topics.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 message topics.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "message_topic.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "message_topic.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "message_topic.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "message_topic.required_feature",
"flag": "--required-feature",
"summary": "A Money feature key the recipient must hold (`entitlement_grants:check` for the Recipient's `external_key` as the end user). A message to a recipient that does not hold it is recorded `SUPPRESSED` with `state_reason` `entitlement`; when Money cannot answer, the create fails with 503 and writes nothing. The sending key must also hold `billing:read`. Unset admits every recipient.",
"type": "string"
},
{
"field": "message_topic.send_limit_feature",
"flag": "--send-limit-feature",
"summary": "A Money `limit` feature whose allowance is the most messages on this topic one recipient receives per `send_limit_window`. A message over it, or to a recipient that holds no allowance, is recorded `RATE_LIMITED` and its create answers 429. Unset: no topic limit.",
"type": "string"
},
{
"field": "message_topic.send_limit_window",
"flag": "--send-limit-window",
"summary": "The window the allowance counts over: 1 minute to 24 hours; default 24 hours.",
"type": "duration"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the message 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/{message_topic.name=orgs/*/projects/*/envs/*/message_topics/*}",
"method": "notify.message_topics.update",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "message_topic.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/message_topics/{message_topic}"
},
"resource_field": "message_topic",
"sends_etag": true,
"summary": "Updates a message topic; with `allow_missing`, creates it.",
"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 message topic 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/*/message_topics/*}",
"method": "notify.message_topics.delete",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/message_topics/{message_topic}"
},
"summary": "Deletes a message topic; its messages are admitted with no gate or topic limit.",
"verb": "delete"
}
],
"noun": "message-topics",
"resource_type": "notify.sylphx.com/MessageTopic"
},
{
"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": "mailbox.spec.auth_kind",
"flag": "--spec.auth-kind",
"summary": "How a connected mailbox logs in to both servers; unset means `PASSWORD`.",
"type": "enum",
"values": [
"password",
"oauth"
]
},
{
"field": "mailbox.spec.oauth_provider",
"flag": "--spec.oauth-provider",
"summary": "The OAuth provider, for `OAUTH`; the environment's Mailbox OAuth App of this provider is the client the grant belongs to. With `imap` or `smtp` unset the provider's own servers are used: Google `imap.gmail.com:993` and `smtp.gmail.com:465`, Microsoft `outlook.office365.com:993` and `smtp.office365.com:587` (STARTTLS).",
"type": "enum",
"values": [
"google",
"microsoft"
]
},
{
"field": "mailbox.spec.oauth_refresh_token",
"flag": "--spec.oauth-refresh-token",
"sensitive": true,
"summary": "The OAuth refresh token, for `OAUTH`; write-only, sealed at rest like the password, never returned. A connect link sets it without the caller ever holding it; a caller that ran its own consent may set it directly, when the token was issued to the environment's Mailbox OAuth App.",
"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/*}/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": "mailbox.spec.auth_kind",
"flag": "--spec.auth-kind",
"summary": "How a connected mailbox logs in to both servers; unset means `PASSWORD`.",
"type": "enum",
"values": [
"password",
"oauth"
]
},
{
"field": "mailbox.spec.oauth_provider",
"flag": "--spec.oauth-provider",
"summary": "The OAuth provider, for `OAUTH`; the environment's Mailbox OAuth App of this provider is the client the grant belongs to. With `imap` or `smtp` unset the provider's own servers are used: Google `imap.gmail.com:993` and `smtp.gmail.com:465`, Microsoft `outlook.office365.com:993` and `smtp.office365.com:587` (STARTTLS).",
"type": "enum",
"values": [
"google",
"microsoft"
]
},
{
"field": "mailbox.spec.oauth_refresh_token",
"flag": "--spec.oauth-refresh-token",
"sensitive": true,
"summary": "The OAuth refresh token, for `OAUTH`; write-only, sealed at rest like the password, never returned. A connect link sets it without the caller ever holding it; a caller that ran its own consent may set it directly, when the token was issued to the environment's Mailbox OAuth App.",
"type": "string"
},
{
"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": "mailbox_oauth_apps",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/mailbox_oauth_apps/*}",
"method": "notify.mailbox_oauth_apps.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mailbox_oauth_apps/{mailbox_oauth_app}"
},
"summary": "Gets a mailbox OAuth app.",
"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/*}/mailbox_oauth_apps",
"method": "notify.mailbox_oauth_apps.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 mailbox OAuth apps.",
"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_oauth_app.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "mailbox_oauth_app.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "mailbox_oauth_app.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "mailbox_oauth_app.spec.provider",
"flag": "--spec.provider",
"required": true,
"summary": "The provider.",
"type": "enum",
"values": [
"google",
"microsoft"
]
},
{
"field": "mailbox_oauth_app.spec.client_id",
"flag": "--spec.client-id",
"required": true,
"summary": "The client id the provider issued.",
"type": "string"
},
{
"field": "mailbox_oauth_app.spec.client_secret",
"flag": "--spec.client-secret",
"sensitive": true,
"summary": "The client secret; write-only, sealed at rest, never returned.",
"type": "string"
},
{
"field": "mailbox_oauth_app.spec.tenant",
"flag": "--spec.tenant",
"summary": "Microsoft only: who may consent, `common` (the default: any work, school or personal account), `organizations`, `consumers`, or one tenant 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/*/projects/*/envs/*}/mailbox_oauth_apps",
"method": "notify.mailbox_oauth_apps.create",
"permission": "notify:write",
"positional": {
"arg": "ID",
"field": "mailbox_oauth_app_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "mailbox_oauth_app",
"summary": "Creates a mailbox OAuth app.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "mailbox_oauth_app.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "mailbox_oauth_app.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "mailbox_oauth_app.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "mailbox_oauth_app.spec.client_id",
"flag": "--spec.client-id",
"required": true,
"summary": "The client id the provider issued.",
"type": "string"
},
{
"field": "mailbox_oauth_app.spec.client_secret",
"flag": "--spec.client-secret",
"sensitive": true,
"summary": "The client secret; write-only, sealed at rest, never returned.",
"type": "string"
},
{
"field": "mailbox_oauth_app.spec.tenant",
"flag": "--spec.tenant",
"summary": "Microsoft only: who may consent, `common` (the default: any work, school or personal account), `organizations`, `consumers`, or one tenant id.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the mailbox OAuth app 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_oauth_app.name=orgs/*/projects/*/envs/*/mailbox_oauth_apps/*}",
"method": "notify.mailbox_oauth_apps.update",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "mailbox_oauth_app.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mailbox_oauth_apps/{mailbox_oauth_app}"
},
"resource_field": "mailbox_oauth_app",
"sends_etag": true,
"summary": "Updates a mailbox OAuth app.",
"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 OAuth app 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/*/mailbox_oauth_apps/*}",
"method": "notify.mailbox_oauth_apps.delete",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mailbox_oauth_apps/{mailbox_oauth_app}"
},
"summary": "Deletes a mailbox OAuth app; refused while a mailbox uses it.",
"verb": "delete"
}
],
"noun": "mailbox-oauth-apps",
"resource_type": "notify.sylphx.com/MailboxOauthApp"
},
{
"collection": "mailbox_connect_links",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/mailbox_connect_links/*}",
"method": "notify.mailbox_connect_links.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mailbox_connect_links/{mailbox_connect_link}"
},
"summary": "Gets a mailbox connect 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 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/*}/mailbox_connect_links",
"method": "notify.mailbox_connect_links.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 mailbox connect links.",
"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_connect_link.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "mailbox_connect_link.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "mailbox_connect_link.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "mailbox_connect_link.provider",
"flag": "--provider",
"required": true,
"summary": "The provider whose consent the page opens; the environment needs that provider's Mailbox OAuth App.",
"type": "enum",
"values": [
"google",
"microsoft"
]
},
{
"field": "mailbox_connect_link.mailbox",
"flag": "--mailbox",
"summary": "The mailbox to reconnect, keeping its id and feed; it must be signed in as the same address. Empty creates a new connected mailbox.",
"type": "string"
},
{
"field": "mailbox_connect_link.mailbox_id",
"flag": "--mailbox-id",
"summary": "The id of the new mailbox; the server assigns one when empty.",
"type": "string"
},
{
"field": "mailbox_connect_link.display_name",
"flag": "--display-name",
"summary": "The From display name of the new mailbox.",
"type": "string"
},
{
"field": "mailbox_connect_link.backfill_start_time",
"flag": "--backfill-start-time",
"summary": "The new mailbox reads mail received on or after this day on its first poll.",
"type": "timestamp"
},
{
"field": "mailbox_connect_link.login_hint",
"flag": "--login-hint",
"summary": "The address to suggest on the consent screen (`login_hint`); the mailbox takes the address the provider confirms, whatever this says.",
"type": "string"
},
{
"field": "mailbox_connect_link.return_url",
"flag": "--return-url",
"required": true,
"summary": "Where the end user lands when done, HTTPS, with `connect_link={id}` and `result=connected` or `result=failed` added to the query. The query proves nothing: read the link back with your key for the outcome.",
"type": "string"
},
{
"field": "mailbox_connect_link.refresh_url",
"flag": "--refresh-url",
"summary": "Where a claimed or expired link sends the end user, HTTPS; your server mints a new link there. Empty shows a page saying the link has expired.",
"type": "string"
},
{
"field": "mailbox_connect_link.ttl",
"flag": "--ttl",
"summary": "How long the link stays open; default 1 hour, at most 7 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/*}/mailbox_connect_links",
"method": "notify.mailbox_connect_links.create",
"permission": "notify:write",
"positional": {
"arg": "ID",
"field": "mailbox_connect_link_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "mailbox_connect_link",
"summary": "Mints a mailbox connect link for one end user; the response carries its `url`, which no later call returns.",
"verb": "create"
}
],
"noun": "mailbox-connect-links",
"resource_type": "notify.sylphx.com/MailboxConnectLink"
},
{
"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"
},
{
"collection": "sms_numbers",
"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": "sms_number.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "sms_number.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "sms_number.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "sms_number.spec.region_code",
"flag": "--spec.region-code",
"required": true,
"summary": "ISO two-letter country code.",
"type": "string"
},
{
"field": "sms_number.spec.number_type",
"flag": "--spec.number-type",
"required": true,
"summary": "local, mobile, toll_free, national or shared_cost.",
"type": "string"
},
{
"field": "sms_number.spec.provider",
"flag": "--spec.provider",
"required": true,
"summary": "The carrier; Telnyx is supported.",
"type": "string"
},
{
"field": "sms_number.spec.upfront_cost_limit",
"flag": "--spec.upfront-cost-limit",
"required": true,
"summary": "Maximum one-time USD price, as a decimal string. No quote over it is ordered.",
"type": "string"
},
{
"field": "sms_number.spec.monthly_cost_limit",
"flag": "--spec.monthly-cost-limit",
"required": true,
"summary": "Maximum recurring monthly USD price, as a decimal string.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/sms_numbers",
"method": "notify.sms_numbers.create",
"permission": "notify:write",
"positional": {
"arg": "ID",
"field": "sms_number_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "sms_number",
"summary": "Provisions one carrier number within explicit cost limits and receives its SMS.",
"verb": "create"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/sms_numbers/*}",
"method": "notify.sms_numbers.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/sms_numbers/{sms_number}"
},
"summary": "Gets an SMS number 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"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/sms_numbers",
"method": "notify.sms_numbers.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 an environment's SMS number bindings.",
"verb": "list"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/sms_numbers/*}",
"method": "notify.sms_numbers.delete",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/sms_numbers/{sms_number}"
},
"summary": "Requests carrier release and stops recurring number billing. Read status until retired_time is set. Historical messages stay readable.",
"verb": "delete"
}
],
"noun": "sms-numbers",
"resource_type": "notify.sylphx.com/SmsNumber"
},
{
"collection": "inbound_sms",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/sms_numbers/*/inbound_sms/*}",
"method": "notify.inbound_sms.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/sms_numbers/{sms_number}/inbound_sms/{inbound_sms}"
},
"summary": "Gets one inbound SMS.",
"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"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/sms_numbers/*}/inbound_sms",
"method": "notify.inbound_sms.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/sms_numbers/{sms_number}"
},
"summary": "Lists a number's inbound SMS in feed order, oldest first.",
"verb": "list"
}
],
"noun": "inbound-sms",
"resource_type": "notify.sylphx.com/InboundSms"
}
],
"commands": [],
"display_name": "Sylphx Notify",
"noun": "notify",
"stage": "preview"
},
{
"collections": [
{
"collection": "uptime_sources",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/uptime_sources/*}",
"method": "observability.uptime_sources.get",
"permission": "observability:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/uptime_sources/{uptime_source}"
},
"summary": "Gets the environment's manifest subscription (`uptime_sources/manifest`).",
"verb": "get"
},
{
"effect": "write",
"flags": [
{
"field": "uptime_source.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "uptime_source.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "uptime_source.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "uptime_source.spec.execution_delegation",
"flag": "--spec.execution-delegation",
"required": true,
"summary": "Exact Access delegation reference; credentials never enter this resource.",
"type": "string"
},
{
"field": "uptime_source.spec.paused",
"flag": "--spec.paused",
"summary": "Stops source reconciliation; existing checks keep their own pause policy.",
"type": "bool"
}
],
"http": "PATCH /v1/{uptime_source.name=orgs/*/projects/*/envs/*/uptime_sources/*}",
"method": "observability.uptime_sources.update",
"permission": "observability:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "uptime_source.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/uptime_sources/{uptime_source}"
},
"resource_field": "uptime_source",
"sends_etag": true,
"summary": "Configures manifest reconciliation; absent subscriptions require an empty etag.",
"update_mask": "from-flags",
"verb": "update"
}
],
"noun": "uptime-sources",
"resource_type": "observability.sylphx.com/UptimeSource"
},
{
"collection": "uptime_checks",
"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": "uptime_check.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "uptime_check.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "uptime_check.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "uptime_check.spec.public_uri",
"flag": "--spec.public-uri",
"summary": "HTTPS public URL, without credentials, query, fragment or redirects.",
"type": "string"
},
{
"field": "uptime_check.spec.service",
"flag": "--spec.service",
"summary": "Same-environment Hosting Service resource name.",
"type": "string"
},
{
"field": "uptime_check.spec.bound_public_revisions",
"flag": "--spec.bound-public-revisions",
"summary": "True enumerates every authorized bound public Host/path and compares independent public response identity with the selected serving Release.",
"type": "bool"
},
{
"field": "uptime_check.spec.instrument",
"flag": "--spec.instrument",
"summary": "HTTP, READY, JOURNEY or CONDITION. READY requires service, JOURNEY requires job, and CONDITION requires condition_source_uri and observes typed facts.",
"type": "string"
},
{
"field": "uptime_check.spec.method",
"flag": "--spec.method",
"summary": "GET or HEAD; defaults to HEAD (CONDITION uses GET). No credentials/body.",
"type": "string"
},
{
"field": "uptime_check.spec.path",
"flag": "--spec.path",
"summary": "Private HTTP path; defaults to /healthz. Not used by READY.",
"type": "string"
},
{
"field": "uptime_check.spec.interval",
"flag": "--spec.interval",
"summary": "30, 60, 300 or 900 seconds; defaults to 60 seconds.",
"type": "duration"
},
{
"field": "uptime_check.spec.timeout",
"flag": "--spec.timeout",
"summary": "HTTP: 1, 2, 5 or 10 seconds. Journey: 10 through 900 seconds, including admission and execution. Defaults to 10 seconds.",
"type": "duration"
},
{
"field": "uptime_check.spec.expect_status",
"flag": "--spec.expect-status",
"repeated": true,
"summary": "Transport successes; defaults to 200 through 299. Denial and rate limits always remain unknown, even when included here.",
"type": "int"
},
{
"field": "uptime_check.spec.expect_body",
"flag": "--spec.expect-body",
"summary": "Bounded literal substring, only with GET.",
"type": "string"
},
{
"field": "uptime_check.spec.failures_before_alert",
"flag": "--spec.failures-before-alert",
"summary": "Consecutive known failures before a transport alert; defaults to two.",
"type": "int"
},
{
"field": "uptime_check.spec.paused",
"flag": "--spec.paused",
"summary": "Paused checks dispatch nothing and accrue no expected slots.",
"type": "bool"
},
{
"field": "uptime_check.spec.severity",
"flag": "--spec.severity",
"summary": "ticket or page; defaults to ticket.",
"type": "string"
},
{
"field": "uptime_check.spec.notify",
"flag": "--spec.notify",
"repeated": true,
"summary": "Existing email: or registered webhook: targets. Events owns signing, delivery and replay. No unregistered callback is silently considered sent.",
"type": "string"
},
{
"field": "uptime_check.spec.execution_delegation",
"flag": "--spec.execution-delegation",
"required": true,
"summary": "Access delegation naming Observability's workload principal, confined to this environment and the needed read/invoke permissions. Every dispatch exchanges it afresh; expiration or revocation prevents outbound work.",
"type": "string"
},
{
"field": "uptime_check.spec.job",
"flag": "--spec.job",
"summary": "Same-environment Workflows Job containing a versioned journey bundle. It runs once per slot with no retries; it is not an HTTP request body.",
"type": "string"
},
{
"field": "uptime_check.spec.condition_source_uri",
"flag": "--spec.condition-source-uri",
"summary": "HTTPS source of typed, paginated condition facts. GET without arbitrary headers or credentials; transport errors are unavailable, not breach.",
"type": "string"
},
{
"field": "uptime_check.spec.condition_max_age",
"flag": "--spec.condition-max-age",
"summary": "Maximum age and validity of condition facts, 1–900 seconds; default 60. Only valid with condition_source_uri. Stale facts do not fire or resolve.",
"type": "duration"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/uptime_checks",
"method": "observability.uptime_checks.create",
"permission": "observability:write",
"positional": {
"arg": "ID",
"field": "uptime_check_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "uptime_check",
"summary": "Creates one tenant uptime check.",
"verb": "create"
},
{
"effect": "read",
"flags": [
{
"field": "target_page_token",
"flag": "--target-page-token",
"summary": "Continue the latest target population from status.next_target_page_token.",
"type": "string"
}
],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/uptime_checks/*}",
"method": "observability.uptime_checks.get",
"permission": "observability:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/uptime_checks/{uptime_check}"
},
"summary": "Gets one tenant uptime check.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most 100 checks per page.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "Opaque continuation from this exact parent.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/uptime_checks",
"method": "observability.uptime_checks.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 checks and aggregate status. GetUptimeCheck reads target pages.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "uptime_check.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "uptime_check.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "uptime_check.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "uptime_check.spec.public_uri",
"flag": "--spec.public-uri",
"summary": "HTTPS public URL, without credentials, query, fragment or redirects.",
"type": "string"
},
{
"field": "uptime_check.spec.service",
"flag": "--spec.service",
"summary": "Same-environment Hosting Service resource name.",
"type": "string"
},
{
"field": "uptime_check.spec.bound_public_revisions",
"flag": "--spec.bound-public-revisions",
"summary": "True enumerates every authorized bound public Host/path and compares independent public response identity with the selected serving Release.",
"type": "bool"
},
{
"field": "uptime_check.spec.instrument",
"flag": "--spec.instrument",
"summary": "HTTP, READY, JOURNEY or CONDITION. READY requires service, JOURNEY requires job, and CONDITION requires condition_source_uri and observes typed facts.",
"type": "string"
},
{
"field": "uptime_check.spec.method",
"flag": "--spec.method",
"summary": "GET or HEAD; defaults to HEAD (CONDITION uses GET). No credentials/body.",
"type": "string"
},
{
"field": "uptime_check.spec.path",
"flag": "--spec.path",
"summary": "Private HTTP path; defaults to /healthz. Not used by READY.",
"type": "string"
},
{
"field": "uptime_check.spec.interval",
"flag": "--spec.interval",
"summary": "30, 60, 300 or 900 seconds; defaults to 60 seconds.",
"type": "duration"
},
{
"field": "uptime_check.spec.timeout",
"flag": "--spec.timeout",
"summary": "HTTP: 1, 2, 5 or 10 seconds. Journey: 10 through 900 seconds, including admission and execution. Defaults to 10 seconds.",
"type": "duration"
},
{
"field": "uptime_check.spec.expect_status",
"flag": "--spec.expect-status",
"repeated": true,
"summary": "Transport successes; defaults to 200 through 299. Denial and rate limits always remain unknown, even when included here.",
"type": "int"
},
{
"field": "uptime_check.spec.expect_body",
"flag": "--spec.expect-body",
"summary": "Bounded literal substring, only with GET.",
"type": "string"
},
{
"field": "uptime_check.spec.failures_before_alert",
"flag": "--spec.failures-before-alert",
"summary": "Consecutive known failures before a transport alert; defaults to two.",
"type": "int"
},
{
"field": "uptime_check.spec.paused",
"flag": "--spec.paused",
"summary": "Paused checks dispatch nothing and accrue no expected slots.",
"type": "bool"
},
{
"field": "uptime_check.spec.severity",
"flag": "--spec.severity",
"summary": "ticket or page; defaults to ticket.",
"type": "string"
},
{
"field": "uptime_check.spec.notify",
"flag": "--spec.notify",
"repeated": true,
"summary": "Existing email: or registered webhook: targets. Events owns signing, delivery and replay. No unregistered callback is silently considered sent.",
"type": "string"
},
{
"field": "uptime_check.spec.execution_delegation",
"flag": "--spec.execution-delegation",
"required": true,
"summary": "Access delegation naming Observability's workload principal, confined to this environment and the needed read/invoke permissions. Every dispatch exchanges it afresh; expiration or revocation prevents outbound work.",
"type": "string"
},
{
"field": "uptime_check.spec.job",
"flag": "--spec.job",
"summary": "Same-environment Workflows Job containing a versioned journey bundle. It runs once per slot with no retries; it is not an HTTP request body.",
"type": "string"
},
{
"field": "uptime_check.spec.condition_source_uri",
"flag": "--spec.condition-source-uri",
"summary": "HTTPS source of typed, paginated condition facts. GET without arbitrary headers or credentials; transport errors are unavailable, not breach.",
"type": "string"
},
{
"field": "uptime_check.spec.condition_max_age",
"flag": "--spec.condition-max-age",
"summary": "Maximum age and validity of condition facts, 1–900 seconds; default 60. Only valid with condition_source_uri. Stale facts do not fire or resolve.",
"type": "duration"
}
],
"http": "PATCH /v1/{uptime_check.name=orgs/*/projects/*/envs/*/uptime_checks/*}",
"method": "observability.uptime_checks.update",
"permission": "observability:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "uptime_check.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/uptime_checks/{uptime_check}"
},
"resource_field": "uptime_check",
"sends_etag": true,
"summary": "Updates one tenant uptime check.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Current resource etag.",
"type": "string"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/uptime_checks/*}",
"method": "observability.uptime_checks.delete",
"permission": "observability:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/uptime_checks/{uptime_check}"
},
"summary": "Deletes one tenant uptime check.",
"verb": "delete"
}
],
"noun": "uptime-checks",
"resource_type": "observability.sylphx.com/UptimeCheck"
},
{
"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": "generations",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/generations/*}",
"method": "observability.generations.get",
"permission": "observability:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/generations/{generation}"
},
"summary": "Gets a generation: one Sylphx AI call.",
"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 `tags.<key>`.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields; default `start_time desc`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/generations",
"method": "observability.generations.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 the environment's Sylphx AI calls, newest first, within the trace retention; filter by `request_model`, `outcome`, `api_key`, `start_time`, `tags.<key>` and the other filterable fields.",
"verb": "list"
}
],
"noun": "generations",
"resource_type": "observability.sylphx.com/Generation"
},
{
"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": [],
"commands": [],
"display_name": "Sylphx Realtime",
"noun": "realtime",
"served": false,
"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,
"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",
"served": false,
"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"
}
},
{
"effect": "write",
"flags": [
{
"field": "commit",
"flag": "--commit",
"summary": "The full 40-character commit SHA to deploy. Missing builds may start before a commit_not_fully_built refusal. Empty reuses live members, or the newest recorded commit when there is no live Release. A commit that would move a live service to an artifact built at a commit that is not this one or one of its ancestors is refused.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/releases:deploy",
"method": "release.releases.deploy",
"permission": "release:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Deploys through the existing redeploy writer. An explicit commit can start missing native builds and provision declared resources, then refuse with commit_not_fully_built before recording a Release. That response returns no pending operation or build IDs; read progress before resubmitting. Without `commit`, reuse live members, or the newest recorded commit if no live Release exists. With no prior Release, require an explicit commit. A recorded Release still needs normal admission and post-merge proof. The Operation is done once the Release is recorded; its `status.state` then follows admission and rollout.",
"verb": "deploy",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "release",
"flag": "--release",
"summary": "The earlier served Release to return to; empty selects the newest one that served and differs from the live Release.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/releases:rollback",
"method": "release.releases.rollback",
"permission": "release:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Rolls the environment back without a build: a new Release, admitted at once, carrying the exact artifacts and configuration versions of the newest earlier Release that served and differs from the live one, or of `release`. The database is not rolled back. The Operation is done once the Release is recorded; its `status.state` then follows the rollout.",
"verb": "rollback",
"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}"
},
"served": false,
"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}"
},
"served": false,
"summary": "Lists rollouts in an environment.",
"verb": "list"
}
],
"noun": "rollouts",
"resource_type": "release.sylphx.com/Rollout"
}
],
"commands": [],
"display_name": "Sylphx Release",
"noun": "release",
"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": "Optional floor over automatic demand sizing; defaults to zero.",
"type": "int"
},
{
"field": "pool.spec.warm.max",
"flag": "--spec.warm.max",
"summary": "Optional ceiling over automatic demand sizing; zero uses the deployment limit.",
"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": "Optional floor over automatic demand sizing; defaults to zero.",
"type": "int"
},
{
"field": "pool.spec.warm.max",
"flag": "--spec.warm.max",
"summary": "Optional ceiling over automatic demand sizing; zero uses the deployment limit.",
"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",
"summary": "The shape; when unset the platform resolves one from `kind` and the image: `linux-s` for a GENERAL lease, `linux-m` for BROWSER, `linux-l` for DESKTOP or ANDROID, and `build-standard` for the `template:build` image. An explicit shape must serve `kind`.",
"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`, `build`). Default the template of `kind`. 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",
"ios"
]
},
{
"field": "lease.spec.region",
"flag": "--spec.region",
"summary": "Optional placement override. Unpinned ephemeral leases use eligible capacity; leases mounting volumes retain the home region unless explicitly pinned.",
"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",
"summary": "The maximum wall time from grant, bounded by the selected shape. Default 300 seconds (1800 for IOS); at least 60 seconds. The Simulator shape permits at most 3600 seconds. `:renew` stays 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 from the selected kind's catalog: an Android id such as `pixel_7`, or a Simulator device type such as `com.apple.CoreSimulator.SimDeviceType.iPhone-15-Plus`. Unset selects the kind's default model.",
"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": "lease.spec.device.architecture",
"flag": "--spec.device.architecture",
"summary": "The required Simulator architecture; unset selects the offered architecture.",
"type": "string"
},
{
"field": "lease.spec.device.vulkan_enabled",
"flag": "--spec.device.vulkan-enabled",
"summary": "Enable Vulkan on an Android emulator for native graphics tests. Default false: Chrome WebGL uses the OpenGL ES path. Refused on IOS leases.",
"type": "bool"
},
{
"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 30 minutes, and never past the lease's `expire_time`.",
"type": "duration"
},
{
"field": "user",
"flag": "--user",
"summary": "The guest user; default `user`. `root` is allowed: the whole machine belongs to the lessee.",
"type": "string"
},
{
"field": "idempotency_key",
"flag": "--idempotency-key",
"summary": "Stable execution identity, 1-255 printable ASCII characters. Required here or in the Idempotency-Key header (this field takes precedence). Persist it with the complete request before sending; use the same key and request to recover after any disconnect or caller restart. The first call claims the key before the command starts; a later call with the same key and request returns the recorded result (also after the lease ended), `IDEMPOTENCY_IN_PROGRESS` while the first still runs (the command continues after the call returns), and `EXEC_OUTCOME_UNKNOWN` when the outcome was lost after dispatch. The same key with another request is `IDEMPOTENCY_KEY_REUSED`. A refusal before the command started releases the key.",
"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": "Dispatches one command at most once per lease and execution key. Each HTTP response waits at most 20 seconds: repeat the exact request and key after IDEMPOTENCY_IN_PROGRESS, honoring Retry-After, until the recorded result or a terminal error arrives. Pending observations do not consume the client's transient-error retry budget. Disconnect only stops waiting. Results (capped at 1 MiB per stream) remain replayable after lease expiry. An unknown outcome is never dispatched again. Interactive processes use the guest protocol at `status.endpoints.guest_uri`.",
"verb": "exec"
},
{
"effect": "write",
"flags": [
{
"field": "idempotency_key",
"flag": "--idempotency-key",
"required": true,
"summary": "The execution key from the original ExecLease request.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:cancelExec",
"method": "sandboxes.leases.cancel_exec",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Requests cancellation of the existing execution key. This acknowledgement means the request was recorded, not that the process has stopped. Observe the exact original ExecLease request for its confirmed terminal result. An already completed result wins; an unknown outcome remains unknown.",
"verb": "cancel-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",
"summary": "An Android APK uploaded to the lease. Exactly one app path is required.",
"type": "string"
},
{
"field": "grant_permissions",
"flag": "--grant-permissions",
"summary": "Grant every Android runtime permission the app declares.",
"type": "bool"
},
{
"field": "app_path",
"flag": "--app-path",
"summary": "A ZIP containing one Simulator .app, uploaded to an IOS lease.",
"type": "string"
},
{
"field": "artifact_sha256",
"flag": "--artifact-sha256",
"summary": "The exact ZIP SHA256; required for a Simulator install.",
"type": "string"
},
{
"field": "source_revision",
"flag": "--source-revision",
"summary": "The caller's immutable source revision, returned in the install receipt.",
"type": "string"
}
],
"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"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Archive 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/*/volumes/*}:archive",
"method": "sandboxes.volumes.archive",
"permission": "sandboxes:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/volumes/{volume}"
},
"summary": "Archives an idle standard workspace without changing its identity or destroying its files. Ordinary attachment restores the retained copy. Validation reports eligibility and copy coverage without changing state.",
"verb": "archive"
},
{
"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"
},
{
"collection": "profiles",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/profiles/*}",
"method": "secrets.profiles.get",
"permission": "secrets:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/profiles/{profile}"
},
"summary": "Gets a profile: its kind, grants, sites and latest version; never a value.",
"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/*}/profiles",
"method": "secrets.profiles.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 the profiles of 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": "profile.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "profile.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "profile.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "profile.spec.kind",
"flag": "--spec.kind",
"required": true,
"summary": "What the profile holds.",
"type": "enum",
"values": [
"browser",
"computer"
]
},
{
"field": "profile.spec.grants",
"flag": "--spec.grants",
"repeated": true,
"summary": "Who may mount it and how. A principal with no grant cannot mount it, whatever its scopes.",
"type": "json"
},
{
"field": "profile.spec.paths",
"flag": "--spec.paths",
"repeated": true,
"summary": "For a `computer` profile: the paths under the sandbox's home directory its archive holds, for example `.config/app`.",
"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/*}/profiles",
"method": "secrets.profiles.create",
"permission": "secrets:write",
"positional": {
"arg": "ID",
"field": "profile_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "profile",
"summary": "Creates an empty profile; its first version is written by a write-back mount (`:open` with WRITE_BACK, then `:commit`).",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "profile.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "profile.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "profile.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "profile.spec.grants",
"flag": "--spec.grants",
"repeated": true,
"summary": "Who may mount it and how. A principal with no grant cannot mount it, whatever its scopes.",
"type": "json"
},
{
"field": "profile.spec.paths",
"flag": "--spec.paths",
"repeated": true,
"summary": "For a `computer` profile: the paths under the sandbox's home directory its archive holds, for example `.config/app`.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{profile.name=orgs/*/projects/*/envs/*/profiles/*}",
"method": "secrets.profiles.update",
"permission": "secrets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "profile.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/profiles/{profile}"
},
"resource_field": "profile",
"sends_etag": true,
"summary": "Updates a profile's grants or declared paths. Granting a mount is this call: nothing else adds a grant.",
"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 destroy every version; without it a profile with versions fails with INVALID_STATE.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/profiles/*}",
"method": "secrets.profiles.delete",
"permission": "secrets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/profiles/{profile}"
},
"summary": "Deletes a profile; with `force`, a profile that has versions too, which destroys every version.",
"verb": "delete"
},
{
"effect": "read",
"flags": [
{
"field": "mode",
"flag": "--mode",
"summary": "READ_ONLY (the default) or WRITE_BACK.",
"type": "enum",
"values": [
"read_only",
"write_back"
]
},
{
"field": "version",
"flag": "--version",
"summary": "A version to mount; unset mounts the latest.",
"type": "string"
},
{
"field": "ttl",
"flag": "--ttl",
"summary": "How long a WRITE_BACK attachment may commit; default 1 hour, at most 12 hours. A lost session cannot write back after it.",
"type": "duration"
},
{
"field": "context",
"flag": "--context",
"repeated": true,
"summary": "Who mounts it, for the audit trail: for example `run`, `step`, `member`. At most 16 entries; keys and values are names, never values.",
"type": "key=value"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/profiles/*}:open",
"method": "secrets.profiles.open",
"permission": "secrets:mount",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/profiles/{profile}"
},
"summary": "Mounts a profile for one session: returns the state of one version and, for WRITE_BACK, an attachment that `:commit` writes through until it expires. Every call is audited with the caller's context; the caller's principal needs a grant of at least the requested mode.",
"verb": "open"
},
{
"effect": "write",
"flags": [
{
"field": "attachment",
"flag": "--attachment",
"required": true,
"summary": "The `attachment` OpenProfile returned with WRITE_BACK.",
"type": "string"
},
{
"field": "state",
"flag": "--state",
"required": true,
"sensitive": true,
"summary": "The whole state to write, in the profile kind's form, at most 2 MiB.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/profiles/*}:commit",
"method": "secrets.profiles.commit",
"permission": "secrets:mount",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/profiles/{profile}"
},
"summary": "Writes a mounted profile back as a new version, by compare-and-set on the version the attachment was opened at (or last committed). When another write landed first, nothing is lost: the result is still a new version, merged site by site with the newer write winning, and marked as a conflict.",
"verb": "commit"
}
],
"noun": "profiles",
"resource_type": "secrets.sylphx.com/Profile"
},
{
"collection": "profile_versions",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/profiles/*/profile_versions/*}",
"method": "secrets.profile_versions.get",
"permission": "secrets:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/profiles/{profile}/profile_versions/{profile_version}"
},
"summary": "Gets a profile version: its sites and lineage; never a value.",
"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/*/profiles/*}/profile_versions",
"method": "secrets.profile_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}/profiles/{profile}"
},
"summary": "Lists a profile's versions, newest first.",
"verb": "list"
}
],
"noun": "profile-versions",
"resource_type": "secrets.sylphx.com/ProfileVersion"
}
],
"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": "workflow.spec.job_handler.image",
"flag": "--spec.job-handler.image",
"summary": "The image reference.",
"type": "string"
},
{
"field": "workflow.spec.job_handler.command",
"flag": "--spec.job-handler.command",
"repeated": true,
"summary": "The entrypoint; empty keeps the image's.",
"type": "string"
},
{
"field": "workflow.spec.callers",
"flag": "--spec.callers",
"summary": "Who may start, signal, wait on and cancel its Runs (`callable_by` in `sylphx.toml`); unset is `SERVER`. Not served yet: the server refuses the field, set to any value, until end-user sessions are admitted.",
"type": "enum",
"values": [
"server",
"users"
]
},
{
"field": "workflow.spec.permission",
"flag": "--spec.permission",
"summary": "The app permission an end user's session must hold to call the Run methods of this Workflow; required when `callers` is `USERS`. Not served yet, like `callers`.",
"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/*}/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": "workflow.spec.job_handler.image",
"flag": "--spec.job-handler.image",
"summary": "The image reference.",
"type": "string"
},
{
"field": "workflow.spec.job_handler.command",
"flag": "--spec.job-handler.command",
"repeated": true,
"summary": "The entrypoint; empty keeps the image's.",
"type": "string"
},
{
"field": "workflow.spec.callers",
"flag": "--spec.callers",
"summary": "Who may start, signal, wait on and cancel its Runs (`callable_by` in `sylphx.toml`); unset is `SERVER`. Not served yet: the server refuses the field, set to any value, until end-user sessions are admitted.",
"type": "enum",
"values": [
"server",
"users"
]
},
{
"field": "workflow.spec.permission",
"flag": "--spec.permission",
"summary": "The app permission an end user's session must hold to call the Run methods of this Workflow; required when `callers` is `USERS`. Not served yet, like `callers`.",
"type": "string"
},
{
"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; with `allow_missing` it creates the schedule when it does not exist, so its short name `schedule` is an upsert by name.",
"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, now or after `start_delay` or at `schedule_time`. `run_id` is the caller's key: the same key and intent return the same Run, a changed intent is refused. An end user's session may call it on a Workflow whose `callers` is `USERS` when the session holds the Workflow's `permission`.",
"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. An end user's session may call it on a Workflow whose `callers` is `USERS` when the session holds the Workflow's `permission`.",
"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. An end user's session may call it on a Workflow whose `callers` is `USERS` when the session holds the Workflow's `permission`.",
"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. Its short name is `result`: the closed Run carries the handler's output or error. An end user's session may call it on a Workflow whose `callers` is `USERS` when the session holds the Workflow's `permission`.",
"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"
},
{
"field": "expected_job_uid",
"flag": "--expected-job-uid",
"summary": "Require this immutable Job identity, checked again at insertion.",
"type": "string"
},
{
"field": "expected_job_generation",
"flag": "--expected-job-generation",
"summary": "Require this generation of the frozen Job spec.",
"type": "int"
},
{
"field": "create_not_after",
"flag": "--create-not-after",
"summary": "A new run can be inserted only before this instant. Identical replay is still available afterward. Exact GET serializes with in-flight insertion.",
"type": "timestamp"
}
],
"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": "write",
"flags": [
{
"field": "job_run_id",
"flag": "--job-run-id",
"required": true,
"summary": "Permanent caller-selected run id, distinct from the server-assigned UID.",
"type": "string"
},
{
"field": "job_run",
"flag": "--job-run",
"required": true,
"summary": "The run to start: `args` and `env` override the Job's for this run.",
"type": "json"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "expected_job_uid",
"flag": "--expected-job-uid",
"required": true,
"summary": "Require this immutable Job identity, checked again at insertion.",
"type": "string"
},
{
"field": "expected_job_generation",
"flag": "--expected-job-generation",
"required": true,
"summary": "Require this generation of the frozen Job spec.",
"type": "int"
},
{
"field": "create_not_after",
"flag": "--create-not-after",
"required": true,
"summary": "A new run can be inserted only before this instant. Identical replay is still available afterward. Exact GET serializes with in-flight insertion.",
"type": "timestamp"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/jobs/*}/job_runs:createPinned",
"method": "workflows.job_runs.create_pinned",
"permission": "workflows:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/jobs/{job}"
},
"summary": "Starts exactly the pinned Job snapshot under a permanent caller-selected run id. Predecessor servers do not serve this route, so unsupported pins cannot silently start work. Replays return the original immutable run.",
"verb": "create-pinned"
},
{
"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:run",
"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",
"porcelain": [
{
"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",
"path": [],
"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; with `allow_missing` it creates the schedule when it does not exist, so its short name `schedule` is an upsert by name.",
"update_mask": "from-flags",
"verb": "schedule",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"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",
"path": [],
"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, now or after `start_delay` or at `schedule_time`. `run_id` is the caller's key: the same key and intent return the same Run, a changed intent is refused. An end user's session may call it on a Workflow whose `callers` is `USERS` when the session holds the Workflow's `permission`.",
"verb": "start"
},
{
"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",
"path": [],
"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. An end user's session may call it on a Workflow whose `callers` is `USERS` when the session holds the Workflow's `permission`.",
"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",
"path": [],
"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. An end user's session may call it on a Workflow whose `callers` is `USERS` when the session holds the Workflow's `permission`.",
"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",
"path": [],
"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. Its short name is `result`: the closed Run carries the handler's output or error. An end user's session may call it on a Workflow whose `callers` is `USERS` when the session holds the Workflow's `permission`.",
"verb": "result"
}
],
"stage": "preview"
}
],
"usage": "sylphx <service> <collection> <verb> [NAME|PARENT] [--flags]"
}