{
    "name": "logfire",
    "displayName": "Logfire",
    "description": "A Pulumi package for creating and managing logfire cloud resources.",
    "keywords": [
        "logfire",
        "category/cloud"
    ],
    "homepage": "https://pydantic.dev/logfire",
    "license": "Apache-2.0",
    "attribution": "This Pulumi package is based on the [`logfire` Terraform Provider](https://github.com/pydantic/terraform-provider-logfire).",
    "repository": "https://github.com/pydantic/pulumi-logfire",
    "logoUrl": "https://avatars.githubusercontent.com/u/110818415?s=200\u0026v=4",
    "pluginDownloadURL": "github://api.github.com/pydantic/pulumi-logfire",
    "publisher": "Pydantic",
    "meta": {
        "moduleFormat": "(.*)(?:/[^/]*)"
    },
    "language": {
        "go": {
            "importBasePath": "github.com/pydantic/pulumi-logfire/sdk/go/logfire",
            "generateResourceContainerTypes": true,
            "generateExtraInputTypes": true,
            "respectSchemaVersion": true
        },
        "nodejs": {
            "packageName": "@pydantic/pulumi-logfire",
            "packageDescription": "A Pulumi package for creating and managing logfire cloud resources.",
            "readme": "\u003e This provider is a derived work of the [Terraform Provider](https://github.com/pydantic/terraform-provider-logfire)\n\u003e distributed under [MPL 2.0](https://www.mozilla.org/en-US/MPL/2.0/). If you encounter a bug or missing feature,\n\u003e first check the [`pulumi-logfire` repo](https://github.com/pydantic/pulumi-logfire/issues); however, if that doesn't turn up anything,\n\u003e please consult the source [`terraform-provider-logfire` repo](https://github.com/pydantic/terraform-provider-logfire/issues).",
            "compatibility": "tfbridge20",
            "disableUnionOutputTypes": true,
            "respectSchemaVersion": true
        },
        "python": {
            "packageName": "pulumi_logfire",
            "readme": "\u003e This provider is a derived work of the [Terraform Provider](https://github.com/pydantic/terraform-provider-logfire)\n\u003e distributed under [MPL 2.0](https://www.mozilla.org/en-US/MPL/2.0/). If you encounter a bug or missing feature,\n\u003e first check the [`pulumi-logfire` repo](https://github.com/pydantic/pulumi-logfire/issues); however, if that doesn't turn up anything,\n\u003e please consult the source [`terraform-provider-logfire` repo](https://github.com/pydantic/terraform-provider-logfire/issues).",
            "compatibility": "tfbridge20",
            "respectSchemaVersion": true,
            "pyproject": {
                "enabled": true
            }
        }
    },
    "config": {
        "variables": {
            "apiKey": {
                "type": "string",
                "description": "Bearer token. If omitted, the LOGFIRE_API_KEY environment variable is used.",
                "secret": true
            },
            "baseUrl": {
                "type": "string",
                "description": "Base URL for the Logfire API. If omitted, the provider uses LOGFIRE_BASE_URL or infers the SaaS endpoint from the\u003cspan pulumi-lang-nodejs=\" apiKey \" pulumi-lang-dotnet=\" ApiKey \" pulumi-lang-go=\" apiKey \" pulumi-lang-python=\" api_key \" pulumi-lang-yaml=\" apiKey \" pulumi-lang-java=\" apiKey \"\u003e api_key \u003c/span\u003eregion. Self-hosted customers should set this explicitly."
            },
            "customHeaders": {
                "type": "object",
                "additionalProperties": {
                    "type": "string"
                },
                "description": "Additional HTTP headers to include on every Logfire API request. Intended for proxy, gateway, or edge authentication. Provider-managed headers cannot be overridden.",
                "secret": true
            }
        }
    },
    "types": {
        "logfire:index/ApiKeyGateway:ApiKeyGateway": {
            "properties": {
                "cacheEnabled": {
                    "type": "boolean",
                    "description": "Whether gateway responses are cached. Null inherits the project default.\n"
                },
                "spendingLimitDaily": {
                    "type": "integer",
                    "description": "Maximum gateway spend in whole US dollars per day. Null means no limit.\n"
                },
                "spendingLimitMonthly": {
                    "type": "integer",
                    "description": "Maximum gateway spend in whole US dollars per month. Null means no limit.\n"
                },
                "spendingLimitTotal": {
                    "type": "integer",
                    "description": "Maximum lifetime gateway spend in whole US dollars. Null means no limit.\n"
                },
                "spendingLimitWeekly": {
                    "type": "integer",
                    "description": "Maximum gateway spend in whole US dollars per week. Null means no limit.\n"
                }
            },
            "type": "object"
        },
        "logfire:index/ChannelConfig:ChannelConfig": {
            "properties": {
                "authKey": {
                    "type": "string",
                    "description": "Opsgenie API key.\n",
                    "secret": true
                },
                "channelId": {
                    "type": "string",
                    "description": "Slack channel ID (for example `C0123456789`) the notifications are posted to. The Logfire Slack bot must already be a member of the channel.\n"
                },
                "format": {
                    "type": "string",
                    "description": "Webhook payload format.\n"
                },
                "includeAgentPrompt": {
                    "type": "boolean",
                    "description": "Whether Slack issue notifications include the \"Ask your agent\" MCP prompt line. Defaults to \u003cspan pulumi-lang-nodejs=\"`true`\" pulumi-lang-dotnet=\"`True`\" pulumi-lang-go=\"`true`\" pulumi-lang-python=\"`true`\" pulumi-lang-yaml=\"`true`\" pulumi-lang-java=\"`true`\"\u003e`true`\u003c/span\u003e when omitted.\n"
                },
                "installId": {
                    "type": "string",
                    "description": "ID of the organization's Slack App or PagerDuty App installation, created by connecting the platform in the Logfire UI (Organization Settings \u003e Connections). The installation must belong to the same organization, be active, and match the channel type.\n"
                },
                "region": {
                    "type": "string",
                    "description": "PagerDuty account region (\u003cspan pulumi-lang-nodejs=\"`us`\" pulumi-lang-dotnet=\"`Us`\" pulumi-lang-go=\"`us`\" pulumi-lang-python=\"`us`\" pulumi-lang-yaml=\"`us`\" pulumi-lang-java=\"`us`\"\u003e`us`\u003c/span\u003e or \u003cspan pulumi-lang-nodejs=\"`eu`\" pulumi-lang-dotnet=\"`Eu`\" pulumi-lang-go=\"`eu`\" pulumi-lang-python=\"`eu`\" pulumi-lang-yaml=\"`eu`\" pulumi-lang-java=\"`eu`\"\u003e`eu`\u003c/span\u003e). When omitted, Logfire uses the US Events API endpoint. Only for \u003cspan pulumi-lang-nodejs=\"`pagerduty`\" pulumi-lang-dotnet=\"`Pagerduty`\" pulumi-lang-go=\"`pagerduty`\" pulumi-lang-python=\"`pagerduty`\" pulumi-lang-yaml=\"`pagerduty`\" pulumi-lang-java=\"`pagerduty`\"\u003e`pagerduty`\u003c/span\u003e channels; a `pagerduty-integration` channel takes its region from the connected account.\n"
                },
                "routingKey": {
                    "type": "string",
                    "description": "PagerDuty Events API v2 integration routing key. Only for \u003cspan pulumi-lang-nodejs=\"`pagerduty`\" pulumi-lang-dotnet=\"`Pagerduty`\" pulumi-lang-go=\"`pagerduty`\" pulumi-lang-python=\"`pagerduty`\" pulumi-lang-yaml=\"`pagerduty`\" pulumi-lang-java=\"`pagerduty`\"\u003e`pagerduty`\u003c/span\u003e channels; `pagerduty-integration` channels resolve the key from the installation instead.\n",
                    "secret": true
                },
                "serviceId": {
                    "type": "string",
                    "description": "Logfire's ID (a UUID) for the PagerDuty service incidents are opened on, as approved for the installation when connecting PagerDuty. This is not PagerDuty's own service ID. Required for `pagerduty-integration` channels.\n"
                },
                "type": {
                    "type": "string",
                    "description": "Channel type (\u003cspan pulumi-lang-nodejs=\"`webhook`\" pulumi-lang-dotnet=\"`Webhook`\" pulumi-lang-go=\"`webhook`\" pulumi-lang-python=\"`webhook`\" pulumi-lang-yaml=\"`webhook`\" pulumi-lang-java=\"`webhook`\"\u003e`webhook`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`opsgenie`\" pulumi-lang-dotnet=\"`Opsgenie`\" pulumi-lang-go=\"`opsgenie`\" pulumi-lang-python=\"`opsgenie`\" pulumi-lang-yaml=\"`opsgenie`\" pulumi-lang-java=\"`opsgenie`\"\u003e`opsgenie`\u003c/span\u003e, \u003cspan pulumi-lang-nodejs=\"`pagerduty`\" pulumi-lang-dotnet=\"`Pagerduty`\" pulumi-lang-go=\"`pagerduty`\" pulumi-lang-python=\"`pagerduty`\" pulumi-lang-yaml=\"`pagerduty`\" pulumi-lang-java=\"`pagerduty`\"\u003e`pagerduty`\u003c/span\u003e, `pagerduty-integration`, or `slack-integration`).\n"
                },
                "url": {
                    "type": "string",
                    "description": "Webhook URL endpoint.\n"
                }
            },
            "type": "object",
            "required": [
                "type"
            ]
        }
    },
    "provider": {
        "description": "The provider type for the logfire package. By default, resources use package-wide configuration\nsettings, however an explicit `Provider` instance may be created and passed during resource\nconstruction to achieve fine-grained programmatic control over provider settings. See the\n[documentation](https://www.pulumi.com/docs/reference/programming-model/#providers) for more information.\n",
        "properties": {
            "apiKey": {
                "type": "string",
                "description": "Bearer token. If omitted, the LOGFIRE_API_KEY environment variable is used.",
                "secret": true
            },
            "baseUrl": {
                "type": "string",
                "description": "Base URL for the Logfire API. If omitted, the provider uses LOGFIRE_BASE_URL or infers the SaaS endpoint from the\u003cspan pulumi-lang-nodejs=\" apiKey \" pulumi-lang-dotnet=\" ApiKey \" pulumi-lang-go=\" apiKey \" pulumi-lang-python=\" api_key \" pulumi-lang-yaml=\" apiKey \" pulumi-lang-java=\" apiKey \"\u003e api_key \u003c/span\u003eregion. Self-hosted customers should set this explicitly."
            },
            "customHeaders": {
                "type": "object",
                "additionalProperties": {
                    "type": "string"
                },
                "description": "Additional HTTP headers to include on every Logfire API request. Intended for proxy, gateway, or edge authentication. Provider-managed headers cannot be overridden.",
                "secret": true
            }
        },
        "inputProperties": {
            "apiKey": {
                "type": "string",
                "description": "Bearer token. If omitted, the LOGFIRE_API_KEY environment variable is used.",
                "secret": true
            },
            "baseUrl": {
                "type": "string",
                "description": "Base URL for the Logfire API. If omitted, the provider uses LOGFIRE_BASE_URL or infers the SaaS endpoint from the\u003cspan pulumi-lang-nodejs=\" apiKey \" pulumi-lang-dotnet=\" ApiKey \" pulumi-lang-go=\" apiKey \" pulumi-lang-python=\" api_key \" pulumi-lang-yaml=\" apiKey \" pulumi-lang-java=\" apiKey \"\u003e api_key \u003c/span\u003eregion. Self-hosted customers should set this explicitly."
            },
            "customHeaders": {
                "type": "object",
                "additionalProperties": {
                    "type": "string"
                },
                "description": "Additional HTTP headers to include on every Logfire API request. Intended for proxy, gateway, or edge authentication. Provider-managed headers cannot be overridden.",
                "secret": true
            }
        },
        "methods": {
            "terraformConfig": "pulumi:providers:logfire/terraformConfig"
        }
    },
    "resources": {
        "logfire:index/alert:Alert": {
            "description": "Manages a Logfire alert.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as logfire from \"@pydantic/pulumi-logfire\";\n\nconst exampleProject = new logfire.Project(\"exampleProject\", {});\nconst exampleChannel = new logfire.Channel(\"exampleChannel\", {config: [{\n    type: \"webhook\",\n    format: \"auto\",\n    url: \"https://example.com/logfire-webhook\",\n}]});\nconst exampleAlert = new logfire.Alert(\"exampleAlert\", {\n    projectId: exampleProject.id,\n    description: \"Alert on exception spans\",\n    query: `select\n  service_name,\n  trace_id,\n  otel_status_message as exception_message\nfrom records\nwhere level = 'error'\norder by start_timestamp desc\n`,\n    timeWindow: \"1h\",\n    frequency: \"15m\",\n    environments: [\"production\"],\n    channelIds: [exampleChannel.id],\n    notifyWhen: \"has_matches\",\n    active: true,\n});\n```\n```python\nimport pulumi\nimport pulumi_logfire as logfire\n\nexample_project = logfire.Project(\"exampleProject\")\nexample_channel = logfire.Channel(\"exampleChannel\", config=[{\n    \"type\": \"webhook\",\n    \"format\": \"auto\",\n    \"url\": \"https://example.com/logfire-webhook\",\n}])\nexample_alert = logfire.Alert(\"exampleAlert\",\n    project_id=example_project.id,\n    description=\"Alert on exception spans\",\n    query=\"\"\"select\n  service_name,\n  trace_id,\n  otel_status_message as exception_message\nfrom records\nwhere level = 'error'\norder by start_timestamp desc\n\"\"\",\n    time_window=\"1h\",\n    frequency=\"15m\",\n    environments=[\"production\"],\n    channel_ids=[example_channel.id],\n    notify_when=\"has_matches\",\n    active=True)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Logfire = Pulumi.Logfire;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var exampleProject = new Logfire.Project(\"exampleProject\");\n\n    var exampleChannel = new Logfire.Channel(\"exampleChannel\", new()\n    {\n        Config = new[]\n        {\n            \n            {\n                { \"type\", \"webhook\" },\n                { \"format\", \"auto\" },\n                { \"url\", \"https://example.com/logfire-webhook\" },\n            },\n        },\n    });\n\n    var exampleAlert = new Logfire.Alert(\"exampleAlert\", new()\n    {\n        ProjectId = exampleProject.Id,\n        Description = \"Alert on exception spans\",\n        Query = @\"select\n  service_name,\n  trace_id,\n  otel_status_message as exception_message\nfrom records\nwhere level = 'error'\norder by start_timestamp desc\n\",\n        TimeWindow = \"1h\",\n        Frequency = \"15m\",\n        Environments = new[]\n        {\n            \"production\",\n        },\n        ChannelIds = new[]\n        {\n            exampleChannel.Id,\n        },\n        NotifyWhen = \"has_matches\",\n        Active = true,\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n\t\"github.com/pydantic/pulumi-logfire/sdk/go/logfire\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\texampleProject, err := logfire.NewProject(ctx, \"exampleProject\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\texampleChannel, err := logfire.NewChannel(ctx, \"exampleChannel\", \u0026logfire.ChannelArgs{\n\t\t\tConfig: logfire.ChannelConfigArgs{\n\t\t\t\tmap[string]interface{}{\n\t\t\t\t\t\"type\":   \"webhook\",\n\t\t\t\t\t\"format\": \"auto\",\n\t\t\t\t\t\"url\":    \"https://example.com/logfire-webhook\",\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = logfire.NewAlert(ctx, \"exampleAlert\", \u0026logfire.AlertArgs{\n\t\t\tProjectId:   exampleProject.ID(),\n\t\t\tDescription: pulumi.String(\"Alert on exception spans\"),\n\t\t\tQuery: pulumi.String(`select\n  service_name,\n  trace_id,\n  otel_status_message as exception_message\nfrom records\nwhere level = 'error'\norder by start_timestamp desc\n`),\n\t\t\tTimeWindow: pulumi.String(\"1h\"),\n\t\t\tFrequency:  pulumi.String(\"15m\"),\n\t\t\tEnvironments: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"production\"),\n\t\t\t},\n\t\t\tChannelIds: pulumi.StringArray{\n\t\t\t\texampleChannel.ID(),\n\t\t\t},\n\t\t\tNotifyWhen: pulumi.String(\"has_matches\"),\n\t\t\tActive:     pulumi.Bool(true),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.logfire.Project;\nimport com.pulumi.logfire.Channel;\nimport com.pulumi.logfire.ChannelArgs;\nimport com.pulumi.logfire.Alert;\nimport com.pulumi.logfire.AlertArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        var exampleProject = new Project(\"exampleProject\");\n\n        var exampleChannel = new Channel(\"exampleChannel\", ChannelArgs.builder()\n            .config(ChannelConfigArgs.builder()\n                .type(\"webhook\")\n                .format(\"auto\")\n                .url(\"https://example.com/logfire-webhook\")\n                .build())\n            .build());\n\n        var exampleAlert = new Alert(\"exampleAlert\", AlertArgs.builder()\n            .projectId(exampleProject.id())\n            .description(\"Alert on exception spans\")\n            .query(\"\"\"\nselect\n  service_name,\n  trace_id,\n  otel_status_message as exception_message\nfrom records\nwhere level = 'error'\norder by start_timestamp desc\n            \"\"\")\n            .timeWindow(\"1h\")\n            .frequency(\"15m\")\n            .environments(\"production\")\n            .channelIds(exampleChannel.id())\n            .notifyWhen(\"has_matches\")\n            .active(true)\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  exampleProject:\n    type: logfire:Project\n  exampleChannel:\n    type: logfire:Channel\n    properties:\n      config:\n        - type: webhook\n          format: auto\n          url: https://example.com/logfire-webhook\n  exampleAlert:\n    type: logfire:Alert\n    properties:\n      projectId: ${exampleProject.id}\n      description: Alert on exception spans\n      query: |\n        select\n          service_name,\n          trace_id,\n          otel_status_message as exception_message\n        from records\n        where level = 'error'\n        order by start_timestamp desc\n      timeWindow: 1h\n      frequency: 15m\n      environments:\n        - production\n      channelIds:\n        - ${exampleChannel.id}\n      notifyWhen: has_matches\n      active: true\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nImport by project name and alert name:\n\n```sh\n$ pulumi import logfire:index/alert:Alert example \"example-project/error-alert\"\n```\nProject UUID/alert UUID imports are also supported.\n\n",
            "properties": {
                "active": {
                    "type": "boolean",
                    "description": "Whether the alert is active (defaults to true on creation).\n"
                },
                "channelIds": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    },
                    "description": "Set of channel IDs to notify.\n"
                },
                "description": {
                    "type": "string",
                    "description": "Alert description.\n"
                },
                "environments": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    },
                    "description": "Deployment environments to scope the query to. Empty = all environments (no filter).\n"
                },
                "frequency": {
                    "type": "string",
                    "description": "Evaluation frequency. Allowed values: 1m, 2m, 5m, 10m, 15m, 30m, 1h, 6h, 12h, 24h.\n"
                },
                "name": {
                    "type": "string",
                    "description": "Alert name (unique per project).\n"
                },
                "notifyWhen": {
                    "type": "string",
                    "description": "Notification rule. Must match API enum.\n"
                },
                "projectId": {
                    "type": "string",
                    "description": "Project ID (UUID) used for alert API paths.\n"
                },
                "query": {
                    "type": "string",
                    "description": "SQL / query string used by the alert.\n"
                },
                "timeWindow": {
                    "type": "string",
                    "description": "Lookback window. Allowed values: 1m, 2m, 5m, 10m, 15m, 30m, 1h, 6h, 12h, 24h, 7d, 30d.\n"
                },
                "watermark": {
                    "type": "string",
                    "description": "Provider-managed watermark (lateness tolerance) sent to the API.\n"
                }
            },
            "required": [
                "active",
                "channelIds",
                "frequency",
                "name",
                "notifyWhen",
                "projectId",
                "query",
                "timeWindow",
                "watermark"
            ],
            "inputProperties": {
                "active": {
                    "type": "boolean",
                    "description": "Whether the alert is active (defaults to true on creation).\n"
                },
                "channelIds": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    },
                    "description": "Set of channel IDs to notify.\n"
                },
                "description": {
                    "type": "string",
                    "description": "Alert description.\n"
                },
                "environments": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    },
                    "description": "Deployment environments to scope the query to. Empty = all environments (no filter).\n"
                },
                "frequency": {
                    "type": "string",
                    "description": "Evaluation frequency. Allowed values: 1m, 2m, 5m, 10m, 15m, 30m, 1h, 6h, 12h, 24h.\n"
                },
                "name": {
                    "type": "string",
                    "description": "Alert name (unique per project).\n"
                },
                "notifyWhen": {
                    "type": "string",
                    "description": "Notification rule. Must match API enum.\n"
                },
                "projectId": {
                    "type": "string",
                    "description": "Project ID (UUID) used for alert API paths.\n"
                },
                "query": {
                    "type": "string",
                    "description": "SQL / query string used by the alert.\n"
                },
                "timeWindow": {
                    "type": "string",
                    "description": "Lookback window. Allowed values: 1m, 2m, 5m, 10m, 15m, 30m, 1h, 6h, 12h, 24h, 7d, 30d.\n"
                }
            },
            "requiredInputs": [
                "channelIds",
                "frequency",
                "notifyWhen",
                "projectId",
                "query",
                "timeWindow"
            ],
            "stateInputs": {
                "description": "Input properties used for looking up and filtering Alert resources.\n",
                "properties": {
                    "active": {
                        "type": "boolean",
                        "description": "Whether the alert is active (defaults to true on creation).\n"
                    },
                    "channelIds": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "description": "Set of channel IDs to notify.\n"
                    },
                    "description": {
                        "type": "string",
                        "description": "Alert description.\n"
                    },
                    "environments": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "description": "Deployment environments to scope the query to. Empty = all environments (no filter).\n"
                    },
                    "frequency": {
                        "type": "string",
                        "description": "Evaluation frequency. Allowed values: 1m, 2m, 5m, 10m, 15m, 30m, 1h, 6h, 12h, 24h.\n"
                    },
                    "name": {
                        "type": "string",
                        "description": "Alert name (unique per project).\n"
                    },
                    "notifyWhen": {
                        "type": "string",
                        "description": "Notification rule. Must match API enum.\n"
                    },
                    "projectId": {
                        "type": "string",
                        "description": "Project ID (UUID) used for alert API paths.\n"
                    },
                    "query": {
                        "type": "string",
                        "description": "SQL / query string used by the alert.\n"
                    },
                    "timeWindow": {
                        "type": "string",
                        "description": "Lookback window. Allowed values: 1m, 2m, 5m, 10m, 15m, 30m, 1h, 6h, 12h, 24h, 7d, 30d.\n"
                    },
                    "watermark": {
                        "type": "string",
                        "description": "Provider-managed watermark (lateness tolerance) sent to the API.\n"
                    }
                },
                "type": "object"
            }
        },
        "logfire:index/apiKey:ApiKey": {
            "description": "Manages a Logfire API key. Write tokens (`project:write_otlp`), read tokens (`project:read_otlp`), gateway keys (`project:gateway_proxy`), and management keys are all API keys with different scopes. The new key can never exceed the provider credential's own grant: its scopes must be a subset of the provider \u003cspan pulumi-lang-nodejs=\"`apiKey`\" pulumi-lang-dotnet=\"`ApiKey`\" pulumi-lang-go=\"`apiKey`\" pulumi-lang-python=\"`api_key`\" pulumi-lang-yaml=\"`apiKey`\" pulumi-lang-java=\"`apiKey`\"\u003e`api_key`\u003c/span\u003e scopes, so the provider key needs `organization:create_api_key` plus every scope it delegates.\n\n## Import\n\nThe `pulumi import` command can be used, for example:\n\nImport an existing API key by its UUID. Key names are not unique across the\n\norganization, so the import is UUID-only. The UUID comes from the API key\n\nlist endpoint (the API never returns the plaintext token again, so an import\n\nrecovers the key without its token):\n\n  curl -s -H \"Authorization: Bearer $LOGFIRE_API_KEY\" \\\n\n    \"$LOGFIRE_BASE_URL/api/v1/api-keys/\" | jq '.[] | {id, name}'\n\n```sh\n$ pulumi import logfire:index/apiKey:ApiKey example' \"9f9b2f9e-aaaa-bbbb-cccc-ddddeeeeffff\"\n```\n\n",
            "properties": {
                "active": {
                    "type": "boolean"
                },
                "allProjects": {
                    "type": "boolean",
                    "description": "True for org-wide keys with no project scope.\n"
                },
                "createdAt": {
                    "type": "string",
                    "description": "Timestamp when the key was created.\n"
                },
                "createdByName": {
                    "type": "string",
                    "description": "Display name of the user that created the key, when known.\n"
                },
                "description": {
                    "type": "string",
                    "description": "Free-form description. Can be updated in place; setting it to null clears it.\n"
                },
                "expiresAt": {
                    "type": "string",
                    "description": "Optional RFC3339 expiration timestamp (for example `2026-12-31T23:59:59Z`). If omitted, the key does not expire. Changing it replaces the key: expiry cannot be updated in place (an expired key cannot be re-enabled; create a new key instead).\n"
                },
                "gateway": {
                    "$ref": "#/types/logfire:index/ApiKeyGateway:ApiKeyGateway",
                    "description": "Gateway per-scope settings for keys with the `project:gateway_proxy` scope. Updatable in place. Removing the block clears every cap the key carries.\n"
                },
                "name": {
                    "type": "string",
                    "description": "Display name for the key. Can be updated in place.\n"
                },
                "projectId": {
                    "type": "string",
                    "description": "UUID of the project the key is scoped to. Omit for an org-wide key. Changing the project replaces the key. Scopes `project:read_otlp`, `project:write_otlp`, and `project:gateway_proxy` require a project.\n"
                },
                "projectName": {
                    "type": "string",
                    "description": "Name of the project the key is scoped to, if any.\n"
                },
                "scopes": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    },
                    "description": "OAuth scopes granted to the key (for example `project:write_otlp`). Changing scopes replaces the key: scopes cannot be updated in place.\n"
                },
                "token": {
                    "type": "string",
                    "description": "The plaintext API key. Only returned on creation; never returned again by the API.\n",
                    "secret": true
                }
            },
            "required": [
                "active",
                "allProjects",
                "createdAt",
                "createdByName",
                "name",
                "projectName",
                "scopes",
                "token"
            ],
            "inputProperties": {
                "description": {
                    "type": "string",
                    "description": "Free-form description. Can be updated in place; setting it to null clears it.\n"
                },
                "expiresAt": {
                    "type": "string",
                    "description": "Optional RFC3339 expiration timestamp (for example `2026-12-31T23:59:59Z`). If omitted, the key does not expire. Changing it replaces the key: expiry cannot be updated in place (an expired key cannot be re-enabled; create a new key instead).\n"
                },
                "gateway": {
                    "$ref": "#/types/logfire:index/ApiKeyGateway:ApiKeyGateway",
                    "description": "Gateway per-scope settings for keys with the `project:gateway_proxy` scope. Updatable in place. Removing the block clears every cap the key carries.\n"
                },
                "name": {
                    "type": "string",
                    "description": "Display name for the key. Can be updated in place.\n"
                },
                "projectId": {
                    "type": "string",
                    "description": "UUID of the project the key is scoped to. Omit for an org-wide key. Changing the project replaces the key. Scopes `project:read_otlp`, `project:write_otlp`, and `project:gateway_proxy` require a project.\n"
                },
                "scopes": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    },
                    "description": "OAuth scopes granted to the key (for example `project:write_otlp`). Changing scopes replaces the key: scopes cannot be updated in place.\n"
                }
            },
            "requiredInputs": [
                "scopes"
            ],
            "stateInputs": {
                "description": "Input properties used for looking up and filtering ApiKey resources.\n",
                "properties": {
                    "active": {
                        "type": "boolean"
                    },
                    "allProjects": {
                        "type": "boolean",
                        "description": "True for org-wide keys with no project scope.\n"
                    },
                    "createdAt": {
                        "type": "string",
                        "description": "Timestamp when the key was created.\n"
                    },
                    "createdByName": {
                        "type": "string",
                        "description": "Display name of the user that created the key, when known.\n"
                    },
                    "description": {
                        "type": "string",
                        "description": "Free-form description. Can be updated in place; setting it to null clears it.\n"
                    },
                    "expiresAt": {
                        "type": "string",
                        "description": "Optional RFC3339 expiration timestamp (for example `2026-12-31T23:59:59Z`). If omitted, the key does not expire. Changing it replaces the key: expiry cannot be updated in place (an expired key cannot be re-enabled; create a new key instead).\n"
                    },
                    "gateway": {
                        "$ref": "#/types/logfire:index/ApiKeyGateway:ApiKeyGateway",
                        "description": "Gateway per-scope settings for keys with the `project:gateway_proxy` scope. Updatable in place. Removing the block clears every cap the key carries.\n"
                    },
                    "name": {
                        "type": "string",
                        "description": "Display name for the key. Can be updated in place.\n"
                    },
                    "projectId": {
                        "type": "string",
                        "description": "UUID of the project the key is scoped to. Omit for an org-wide key. Changing the project replaces the key. Scopes `project:read_otlp`, `project:write_otlp`, and `project:gateway_proxy` require a project.\n"
                    },
                    "projectName": {
                        "type": "string",
                        "description": "Name of the project the key is scoped to, if any.\n"
                    },
                    "scopes": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "description": "OAuth scopes granted to the key (for example `project:write_otlp`). Changing scopes replaces the key: scopes cannot be updated in place.\n"
                    },
                    "token": {
                        "type": "string",
                        "description": "The plaintext API key. Only returned on creation; never returned again by the API.\n",
                        "secret": true
                    }
                },
                "type": "object"
            }
        },
        "logfire:index/channel:Channel": {
            "description": "Manages a Logfire alert channel. Import accepts the channel UUID or its name (label).\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as logfire from \"@pydantic/pulumi-logfire\";\n\nconst config = new pulumi.Config();\nconst pagerdutyRoutingKey = config.require(\"pagerdutyRoutingKey\");\nconst example = new logfire.Channel(\"example\", {\n    active: true,\n    config: [{\n        type: \"webhook\",\n        format: \"auto\",\n        url: \"https://example.com/logfire-webhook\",\n    }],\n});\nconst pagerduty = new logfire.Channel(\"pagerduty\", {\n    active: true,\n    config: [{\n        type: \"pagerduty\",\n        routingKey: pagerdutyRoutingKey,\n        region: \"us\",\n    }],\n});\nconst slackApp = new logfire.Channel(\"slackApp\", {\n    active: true,\n    config: [{\n        type: \"slack-integration\",\n        installId: \"018f9a6a-1234-7890-abcd-ef0123456789\",\n        channelId: \"C0123456789\",\n    }],\n});\nconst onCall = logfire.getPagerdutyService({\n    accountSubdomain: \"acme\",\n    region: \"us\",\n    pagerdutyServiceId: \"PABC123\",\n});\nconst pagerdutyApp = new logfire.Channel(\"pagerdutyApp\", {\n    active: true,\n    config: [{\n        type: \"pagerduty-integration\",\n        installId: onCall.then(onCall =\u003e onCall.installId),\n        serviceId: onCall.then(onCall =\u003e onCall.serviceId),\n    }],\n});\n```\n```python\nimport pulumi\nimport pulumi_logfire as logfire\n\nconfig = pulumi.Config()\npagerduty_routing_key = config.require(\"pagerdutyRoutingKey\")\nexample = logfire.Channel(\"example\",\n    active=True,\n    config=[{\n        \"type\": \"webhook\",\n        \"format\": \"auto\",\n        \"url\": \"https://example.com/logfire-webhook\",\n    }])\npagerduty = logfire.Channel(\"pagerduty\",\n    active=True,\n    config=[{\n        \"type\": \"pagerduty\",\n        \"routingKey\": pagerduty_routing_key,\n        \"region\": \"us\",\n    }])\nslack_app = logfire.Channel(\"slackApp\",\n    active=True,\n    config=[{\n        \"type\": \"slack-integration\",\n        \"installId\": \"018f9a6a-1234-7890-abcd-ef0123456789\",\n        \"channelId\": \"C0123456789\",\n    }])\non_call = logfire.get_pagerduty_service(account_subdomain=\"acme\",\n    region=\"us\",\n    pagerduty_service_id=\"PABC123\")\npagerduty_app = logfire.Channel(\"pagerdutyApp\",\n    active=True,\n    config=[{\n        \"type\": \"pagerduty-integration\",\n        \"installId\": on_call.install_id,\n        \"serviceId\": on_call.service_id,\n    }])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Logfire = Pulumi.Logfire;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var config = new Config();\n    var pagerdutyRoutingKey = config.Require(\"pagerdutyRoutingKey\");\n    var example = new Logfire.Channel(\"example\", new()\n    {\n        Active = true,\n        Config = new[]\n        {\n            \n            {\n                { \"type\", \"webhook\" },\n                { \"format\", \"auto\" },\n                { \"url\", \"https://example.com/logfire-webhook\" },\n            },\n        },\n    });\n\n    var pagerduty = new Logfire.Channel(\"pagerduty\", new()\n    {\n        Active = true,\n        Config = new[]\n        {\n            \n            {\n                { \"type\", \"pagerduty\" },\n                { \"routingKey\", pagerdutyRoutingKey },\n                { \"region\", \"us\" },\n            },\n        },\n    });\n\n    var slackApp = new Logfire.Channel(\"slackApp\", new()\n    {\n        Active = true,\n        Config = new[]\n        {\n            \n            {\n                { \"type\", \"slack-integration\" },\n                { \"installId\", \"018f9a6a-1234-7890-abcd-ef0123456789\" },\n                { \"channelId\", \"C0123456789\" },\n            },\n        },\n    });\n\n    var onCall = Logfire.GetPagerdutyService.Invoke(new()\n    {\n        AccountSubdomain = \"acme\",\n        Region = \"us\",\n        PagerdutyServiceId = \"PABC123\",\n    });\n\n    var pagerdutyApp = new Logfire.Channel(\"pagerdutyApp\", new()\n    {\n        Active = true,\n        Config = new[]\n        {\n            \n            {\n                { \"type\", \"pagerduty-integration\" },\n                { \"installId\", onCall.Apply(getPagerdutyServiceResult =\u003e getPagerdutyServiceResult.InstallId) },\n                { \"serviceId\", onCall.Apply(getPagerdutyServiceResult =\u003e getPagerdutyServiceResult.ServiceId) },\n            },\n        },\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi/config\"\n\t\"github.com/pydantic/pulumi-logfire/sdk/go/logfire\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tcfg := config.New(ctx, \"\")\n\t\tpagerdutyRoutingKey := cfg.Require(\"pagerdutyRoutingKey\")\n\t\t_, err := logfire.NewChannel(ctx, \"example\", \u0026logfire.ChannelArgs{\n\t\t\tActive: pulumi.Bool(true),\n\t\t\tConfig: logfire.ChannelConfigArgs{\n\t\t\t\tmap[string]interface{}{\n\t\t\t\t\t\"type\":   \"webhook\",\n\t\t\t\t\t\"format\": \"auto\",\n\t\t\t\t\t\"url\":    \"https://example.com/logfire-webhook\",\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = logfire.NewChannel(ctx, \"pagerduty\", \u0026logfire.ChannelArgs{\n\t\t\tActive: pulumi.Bool(true),\n\t\t\tConfig: logfire.ChannelConfigArgs{\n\t\t\t\tmap[string]interface{}{\n\t\t\t\t\t\"type\":       \"pagerduty\",\n\t\t\t\t\t\"routingKey\": pagerdutyRoutingKey,\n\t\t\t\t\t\"region\":     \"us\",\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = logfire.NewChannel(ctx, \"slackApp\", \u0026logfire.ChannelArgs{\n\t\t\tActive: pulumi.Bool(true),\n\t\t\tConfig: logfire.ChannelConfigArgs{\n\t\t\t\tmap[string]interface{}{\n\t\t\t\t\t\"type\":      \"slack-integration\",\n\t\t\t\t\t\"installId\": \"018f9a6a-1234-7890-abcd-ef0123456789\",\n\t\t\t\t\t\"channelId\": \"C0123456789\",\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tonCall, err := logfire.GetPagerdutyService(ctx, \u0026logfire.GetPagerdutyServiceArgs{\n\t\t\tAccountSubdomain:   \"acme\",\n\t\t\tRegion:             pulumi.StringRef(\"us\"),\n\t\t\tPagerdutyServiceId: \"PABC123\",\n\t\t}, nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = logfire.NewChannel(ctx, \"pagerdutyApp\", \u0026logfire.ChannelArgs{\n\t\t\tActive: pulumi.Bool(true),\n\t\t\tConfig: logfire.ChannelConfigArgs{\n\t\t\t\tmap[string]interface{}{\n\t\t\t\t\t\"type\":      \"pagerduty-integration\",\n\t\t\t\t\t\"installId\": onCall.InstallId,\n\t\t\t\t\t\"serviceId\": onCall.ServiceId,\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.logfire.Channel;\nimport com.pulumi.logfire.ChannelArgs;\nimport com.pulumi.logfire.LogfireFunctions;\nimport com.pulumi.logfire.inputs.GetPagerdutyServiceArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        final var config = ctx.config();\n        final var pagerdutyRoutingKey = config.get(\"pagerdutyRoutingKey\");\n        var example = new Channel(\"example\", ChannelArgs.builder()\n            .active(true)\n            .config(ChannelConfigArgs.builder()\n                .type(\"webhook\")\n                .format(\"auto\")\n                .url(\"https://example.com/logfire-webhook\")\n                .build())\n            .build());\n\n        var pagerduty = new Channel(\"pagerduty\", ChannelArgs.builder()\n            .active(true)\n            .config(ChannelConfigArgs.builder()\n                .type(\"pagerduty\")\n                .routingKey(pagerdutyRoutingKey)\n                .region(\"us\")\n                .build())\n            .build());\n\n        var slackApp = new Channel(\"slackApp\", ChannelArgs.builder()\n            .active(true)\n            .config(ChannelConfigArgs.builder()\n                .type(\"slack-integration\")\n                .installId(\"018f9a6a-1234-7890-abcd-ef0123456789\")\n                .channelId(\"C0123456789\")\n                .build())\n            .build());\n\n        final var onCall = LogfireFunctions.getPagerdutyService(GetPagerdutyServiceArgs.builder()\n            .accountSubdomain(\"acme\")\n            .region(\"us\")\n            .pagerdutyServiceId(\"PABC123\")\n            .build());\n\n        var pagerdutyApp = new Channel(\"pagerdutyApp\", ChannelArgs.builder()\n            .active(true)\n            .config(ChannelConfigArgs.builder()\n                .type(\"pagerduty-integration\")\n                .installId(onCall.installId())\n                .serviceId(onCall.serviceId())\n                .build())\n            .build());\n\n    }\n}\n```\n```yaml\nconfiguration:\n  pagerdutyRoutingKey:\n    type: string\nresources:\n  example:\n    type: logfire:Channel\n    properties:\n      active: true\n      config:\n        - type: webhook\n          format: auto\n          url: https://example.com/logfire-webhook\n  pagerduty:\n    type: logfire:Channel\n    properties:\n      active: true\n      config:\n        - type: pagerduty\n          routingKey: ${pagerdutyRoutingKey}\n          region: us\n  slackApp:\n    type: logfire:Channel\n    properties:\n      active: true\n      config:\n        - type: slack-integration\n          installId: 018f9a6a-1234-7890-abcd-ef0123456789\n          channelId: C0123456789\n  pagerdutyApp:\n    type: logfire:Channel\n    properties:\n      active: true\n      config:\n        - type: pagerduty-integration\n          installId: ${onCall.installId}\n          serviceId: ${onCall.serviceId}\nvariables:\n  onCall:\n    fn::invoke:\n      function: logfire:getPagerdutyService\n      arguments:\n        accountSubdomain: acme\n        region: us\n        pagerdutyServiceId: PABC123\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nThe `pulumi import` command can be used, for example:\n\nImport an existing channel by its UUID, or by its name (label).\n\nThe UUID comes from the channel list endpoint:\n\n  curl -s -H \"Authorization: Bearer $LOGFIRE_API_KEY\" \\\n\n    \"$LOGFIRE_BASE_URL/api/v1/channels/\" | jq '.[] | {id, label}'\n\nBy name:\n\n```sh\n$ pulumi import logfire:index/channel:Channel example' \"alerts-webhook\"\n```\n\nBy UUID:\n\n```sh\n$ pulumi import logfire:index/channel:Channel example' \"9f9b2f9e-aaaa-bbbb-cccc-ddddeeeeffff\"\n```\n\n",
            "properties": {
                "active": {
                    "type": "boolean",
                    "description": "Whether the channel is active.\n"
                },
                "config": {
                    "$ref": "#/types/logfire:index/ChannelConfig:ChannelConfig",
                    "description": "Required channel configuration.\n"
                },
                "name": {
                    "type": "string",
                    "description": "Channel name.\n"
                }
            },
            "required": [
                "active",
                "name"
            ],
            "inputProperties": {
                "active": {
                    "type": "boolean",
                    "description": "Whether the channel is active.\n"
                },
                "config": {
                    "$ref": "#/types/logfire:index/ChannelConfig:ChannelConfig",
                    "description": "Required channel configuration.\n"
                },
                "name": {
                    "type": "string",
                    "description": "Channel name.\n"
                }
            },
            "stateInputs": {
                "description": "Input properties used for looking up and filtering Channel resources.\n",
                "properties": {
                    "active": {
                        "type": "boolean",
                        "description": "Whether the channel is active.\n"
                    },
                    "config": {
                        "$ref": "#/types/logfire:index/ChannelConfig:ChannelConfig",
                        "description": "Required channel configuration.\n"
                    },
                    "name": {
                        "type": "string",
                        "description": "Channel name.\n"
                    }
                },
                "type": "object"
            }
        },
        "logfire:index/dashboard:Dashboard": {
            "description": "Manages a Logfire dashboard.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as fs from \"fs\";\nimport * as logfire from \"@pydantic/pulumi-logfire\";\n\nconst exampleProject = new logfire.Project(\"exampleProject\", {});\nconst exampleDashboard = new logfire.Dashboard(\"exampleDashboard\", {\n    projectId: exampleProject.id,\n    slug: \"example-dashboard\",\n    definition: fs.readFileSync(\"dashboard.json\", \"utf8\"),\n});\n```\n```python\nimport pulumi\nimport pulumi_logfire as logfire\n\nexample_project = logfire.Project(\"exampleProject\")\nexample_dashboard = logfire.Dashboard(\"exampleDashboard\",\n    project_id=example_project.id,\n    slug=\"example-dashboard\",\n    definition=(lambda path: open(path).read())(\"dashboard.json\"))\n```\n```csharp\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing Pulumi;\nusing Logfire = Pulumi.Logfire;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var exampleProject = new Logfire.Project(\"exampleProject\");\n\n    var exampleDashboard = new Logfire.Dashboard(\"exampleDashboard\", new()\n    {\n        ProjectId = exampleProject.Id,\n        Slug = \"example-dashboard\",\n        Definition = File.ReadAllText(\"dashboard.json\"),\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"os\"\n\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n\t\"github.com/pydantic/pulumi-logfire/sdk/go/logfire\"\n)\n\nfunc readFileOrPanic(path string) pulumi.StringPtrInput {\n\tdata, err := os.ReadFile(path)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\treturn pulumi.String(string(data))\n}\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\texampleProject, err := logfire.NewProject(ctx, \"exampleProject\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = logfire.NewDashboard(ctx, \"exampleDashboard\", \u0026logfire.DashboardArgs{\n\t\t\tProjectId:  exampleProject.ID(),\n\t\t\tSlug:       pulumi.String(\"example-dashboard\"),\n\t\t\tDefinition: pulumi.String(readFileOrPanic(\"dashboard.json\")),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.logfire.Project;\nimport com.pulumi.logfire.Dashboard;\nimport com.pulumi.logfire.DashboardArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        var exampleProject = new Project(\"exampleProject\");\n\n        var exampleDashboard = new Dashboard(\"exampleDashboard\", DashboardArgs.builder()\n            .projectId(exampleProject.id())\n            .slug(\"example-dashboard\")\n            .definition(Files.readString(Paths.get(\"dashboard.json\")))\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  exampleProject:\n    type: logfire:Project\n  exampleDashboard:\n    type: logfire:Dashboard\n    properties:\n      projectId: ${exampleProject.id}\n      slug: example-dashboard\n      definition:\n        fn::readFile: dashboard.json\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nImport by project name and dashboard slug:\n\n```sh\n$ pulumi import logfire:index/dashboard:Dashboard example \"example-project/example-dashboard\"\n```\nProject UUID/dashboard UUID/slug imports are also supported.\n\n",
            "properties": {
                "definition": {
                    "type": "string",
                    "description": "Dashboard definition JSON payload.\n"
                },
                "name": {
                    "type": "string",
                    "description": "Dashboard display name.\n"
                },
                "projectId": {
                    "type": "string",
                    "description": "Project UUID used for API paths.\n"
                },
                "slug": {
                    "type": "string",
                    "description": "Dashboard slug used in URLs.\n"
                }
            },
            "required": [
                "definition",
                "name",
                "projectId",
                "slug"
            ],
            "inputProperties": {
                "definition": {
                    "type": "string",
                    "description": "Dashboard definition JSON payload.\n"
                },
                "name": {
                    "type": "string",
                    "description": "Dashboard display name.\n"
                },
                "projectId": {
                    "type": "string",
                    "description": "Project UUID used for API paths.\n"
                },
                "slug": {
                    "type": "string",
                    "description": "Dashboard slug used in URLs.\n"
                }
            },
            "requiredInputs": [
                "definition",
                "projectId",
                "slug"
            ],
            "stateInputs": {
                "description": "Input properties used for looking up and filtering Dashboard resources.\n",
                "properties": {
                    "definition": {
                        "type": "string",
                        "description": "Dashboard definition JSON payload.\n"
                    },
                    "name": {
                        "type": "string",
                        "description": "Dashboard display name.\n"
                    },
                    "projectId": {
                        "type": "string",
                        "description": "Project UUID used for API paths.\n"
                    },
                    "slug": {
                        "type": "string",
                        "description": "Dashboard slug used in URLs.\n"
                    }
                },
                "type": "object"
            }
        },
        "logfire:index/frontendApplication:FrontendApplication": {
            "description": "Experimental: the backing management API is currently enabled only in Logfire staging environments. Manages an immutable Logfire frontend application identity and exposes one active restricted browser token. Use \u003cspan pulumi-lang-nodejs=\"`logfire.FrontendApplicationToken`\" pulumi-lang-dotnet=\"`logfire.FrontendApplicationToken`\" pulumi-lang-go=\"`FrontendApplicationToken`\" pulumi-lang-python=\"`FrontendApplicationToken`\" pulumi-lang-yaml=\"`logfire.FrontendApplicationToken`\" pulumi-lang-java=\"`logfire.FrontendApplicationToken`\"\u003e`logfire.FrontendApplicationToken`\u003c/span\u003e for two-phase rotation. Creation is not retried automatically because the operation is not idempotent; after an uncertain failure, list the applications and import the matching identity instead of applying again.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as logfire from \"@pydantic/pulumi-logfire\";\n\nconst example = new logfire.Project(\"example\", {});\nconst browser = new logfire.FrontendApplication(\"browser\", {\n    projectId: example.id,\n    serviceNamespace: \"storefront\",\n    environment: \"production\",\n});\nexport const browserWriteToken = browser.token;\n```\n```python\nimport pulumi\nimport pulumi_logfire as logfire\n\nexample = logfire.Project(\"example\")\nbrowser = logfire.FrontendApplication(\"browser\",\n    project_id=example.id,\n    service_namespace=\"storefront\",\n    environment=\"production\")\npulumi.export(\"browserWriteToken\", browser.token)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Logfire = Pulumi.Logfire;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var example = new Logfire.Project(\"example\");\n\n    var browser = new Logfire.FrontendApplication(\"browser\", new()\n    {\n        ProjectId = example.Id,\n        ServiceNamespace = \"storefront\",\n        Environment = \"production\",\n    });\n\n    return new Dictionary\u003cstring, object?\u003e\n    {\n        [\"browserWriteToken\"] = browser.Token,\n    };\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n\t\"github.com/pydantic/pulumi-logfire/sdk/go/logfire\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\texample, err := logfire.NewProject(ctx, \"example\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tbrowser, err := logfire.NewFrontendApplication(ctx, \"browser\", \u0026logfire.FrontendApplicationArgs{\n\t\t\tProjectId:        example.ID(),\n\t\t\tServiceNamespace: pulumi.String(\"storefront\"),\n\t\t\tEnvironment:      pulumi.String(\"production\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tctx.Export(\"browserWriteToken\", browser.Token)\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.logfire.Project;\nimport com.pulumi.logfire.FrontendApplication;\nimport com.pulumi.logfire.FrontendApplicationArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        var example = new Project(\"example\");\n\n        var browser = new FrontendApplication(\"browser\", FrontendApplicationArgs.builder()\n            .projectId(example.id())\n            .serviceNamespace(\"storefront\")\n            .environment(\"production\")\n            .build());\n\n        ctx.export(\"browserWriteToken\", browser.token());\n    }\n}\n```\n```yaml\nresources:\n  example:\n    type: logfire:Project\n  browser:\n    type: logfire:FrontendApplication\n    properties:\n      projectId: ${example.id}\n      serviceNamespace: storefront\n      environment: production\noutputs:\n  browserWriteToken: ${browser.token}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nThe `pulumi import` command can be used, for example:\n\n```sh\n$ pulumi import logfire:index/frontendApplication:FrontendApplication browser \"project-id/application-id\"\n```\n\n",
            "properties": {
                "adoptExistingServiceName": {
                    "type": "boolean",
                    "description": "Allow creation when telemetry already reports under \u003cspan pulumi-lang-nodejs=\"`name`\" pulumi-lang-dotnet=\"`Name`\" pulumi-lang-go=\"`name`\" pulumi-lang-python=\"`name`\" pulumi-lang-yaml=\"`name`\" pulumi-lang-java=\"`name`\"\u003e`name`\u003c/span\u003e. Set this before replacing \u003cspan pulumi-lang-nodejs=\"`serviceNamespace`\" pulumi-lang-dotnet=\"`ServiceNamespace`\" pulumi-lang-go=\"`serviceNamespace`\" pulumi-lang-python=\"`service_namespace`\" pulumi-lang-yaml=\"`serviceNamespace`\" pulumi-lang-java=\"`serviceNamespace`\"\u003e`service_namespace`\u003c/span\u003e or \u003cspan pulumi-lang-nodejs=\"`environment`\" pulumi-lang-dotnet=\"`Environment`\" pulumi-lang-go=\"`environment`\" pulumi-lang-python=\"`environment`\" pulumi-lang-yaml=\"`environment`\" pulumi-lang-java=\"`environment`\"\u003e`environment`\u003c/span\u003e without changing \u003cspan pulumi-lang-nodejs=\"`name`\" pulumi-lang-dotnet=\"`Name`\" pulumi-lang-go=\"`name`\" pulumi-lang-python=\"`name`\" pulumi-lang-yaml=\"`name`\" pulumi-lang-java=\"`name`\"\u003e`name`\u003c/span\u003e.\n"
                },
                "createdAt": {
                    "type": "string",
                    "description": "Timestamp when the application was created.\n"
                },
                "environment": {
                    "type": "string",
                    "description": "Immutable value used to overwrite `deployment.environment.name` when set.\n"
                },
                "name": {
                    "type": "string",
                    "description": "Immutable application name. Logfire overwrites `service.name` with this value.\n"
                },
                "projectId": {
                    "type": "string",
                    "description": "UUID of the project that owns the application.\n"
                },
                "serviceNamespace": {
                    "type": "string",
                    "description": "Immutable value used to overwrite `service.namespace` when set.\n"
                },
                "token": {
                    "type": "string",
                    "description": "An active restricted browser token. The provider recovers this value on refresh and import.\n",
                    "secret": true
                },
                "tokenId": {
                    "type": "string",
                    "description": "Identifier of an active restricted browser token.\n"
                }
            },
            "required": [
                "createdAt",
                "name",
                "projectId",
                "token",
                "tokenId"
            ],
            "inputProperties": {
                "adoptExistingServiceName": {
                    "type": "boolean",
                    "description": "Allow creation when telemetry already reports under \u003cspan pulumi-lang-nodejs=\"`name`\" pulumi-lang-dotnet=\"`Name`\" pulumi-lang-go=\"`name`\" pulumi-lang-python=\"`name`\" pulumi-lang-yaml=\"`name`\" pulumi-lang-java=\"`name`\"\u003e`name`\u003c/span\u003e. Set this before replacing \u003cspan pulumi-lang-nodejs=\"`serviceNamespace`\" pulumi-lang-dotnet=\"`ServiceNamespace`\" pulumi-lang-go=\"`serviceNamespace`\" pulumi-lang-python=\"`service_namespace`\" pulumi-lang-yaml=\"`serviceNamespace`\" pulumi-lang-java=\"`serviceNamespace`\"\u003e`service_namespace`\u003c/span\u003e or \u003cspan pulumi-lang-nodejs=\"`environment`\" pulumi-lang-dotnet=\"`Environment`\" pulumi-lang-go=\"`environment`\" pulumi-lang-python=\"`environment`\" pulumi-lang-yaml=\"`environment`\" pulumi-lang-java=\"`environment`\"\u003e`environment`\u003c/span\u003e without changing \u003cspan pulumi-lang-nodejs=\"`name`\" pulumi-lang-dotnet=\"`Name`\" pulumi-lang-go=\"`name`\" pulumi-lang-python=\"`name`\" pulumi-lang-yaml=\"`name`\" pulumi-lang-java=\"`name`\"\u003e`name`\u003c/span\u003e.\n"
                },
                "environment": {
                    "type": "string",
                    "description": "Immutable value used to overwrite `deployment.environment.name` when set.\n"
                },
                "name": {
                    "type": "string",
                    "description": "Immutable application name. Logfire overwrites `service.name` with this value.\n"
                },
                "projectId": {
                    "type": "string",
                    "description": "UUID of the project that owns the application.\n"
                },
                "serviceNamespace": {
                    "type": "string",
                    "description": "Immutable value used to overwrite `service.namespace` when set.\n"
                }
            },
            "requiredInputs": [
                "projectId"
            ],
            "stateInputs": {
                "description": "Input properties used for looking up and filtering FrontendApplication resources.\n",
                "properties": {
                    "adoptExistingServiceName": {
                        "type": "boolean",
                        "description": "Allow creation when telemetry already reports under \u003cspan pulumi-lang-nodejs=\"`name`\" pulumi-lang-dotnet=\"`Name`\" pulumi-lang-go=\"`name`\" pulumi-lang-python=\"`name`\" pulumi-lang-yaml=\"`name`\" pulumi-lang-java=\"`name`\"\u003e`name`\u003c/span\u003e. Set this before replacing \u003cspan pulumi-lang-nodejs=\"`serviceNamespace`\" pulumi-lang-dotnet=\"`ServiceNamespace`\" pulumi-lang-go=\"`serviceNamespace`\" pulumi-lang-python=\"`service_namespace`\" pulumi-lang-yaml=\"`serviceNamespace`\" pulumi-lang-java=\"`serviceNamespace`\"\u003e`service_namespace`\u003c/span\u003e or \u003cspan pulumi-lang-nodejs=\"`environment`\" pulumi-lang-dotnet=\"`Environment`\" pulumi-lang-go=\"`environment`\" pulumi-lang-python=\"`environment`\" pulumi-lang-yaml=\"`environment`\" pulumi-lang-java=\"`environment`\"\u003e`environment`\u003c/span\u003e without changing \u003cspan pulumi-lang-nodejs=\"`name`\" pulumi-lang-dotnet=\"`Name`\" pulumi-lang-go=\"`name`\" pulumi-lang-python=\"`name`\" pulumi-lang-yaml=\"`name`\" pulumi-lang-java=\"`name`\"\u003e`name`\u003c/span\u003e.\n"
                    },
                    "createdAt": {
                        "type": "string",
                        "description": "Timestamp when the application was created.\n"
                    },
                    "environment": {
                        "type": "string",
                        "description": "Immutable value used to overwrite `deployment.environment.name` when set.\n"
                    },
                    "name": {
                        "type": "string",
                        "description": "Immutable application name. Logfire overwrites `service.name` with this value.\n"
                    },
                    "projectId": {
                        "type": "string",
                        "description": "UUID of the project that owns the application.\n"
                    },
                    "serviceNamespace": {
                        "type": "string",
                        "description": "Immutable value used to overwrite `service.namespace` when set.\n"
                    },
                    "token": {
                        "type": "string",
                        "description": "An active restricted browser token. The provider recovers this value on refresh and import.\n",
                        "secret": true
                    },
                    "tokenId": {
                        "type": "string",
                        "description": "Identifier of an active restricted browser token.\n"
                    }
                },
                "type": "object"
            }
        },
        "logfire:index/frontendApplicationToken:FrontendApplicationToken": {
            "description": "Experimental: the backing management API is currently enabled only in Logfire staging environments. Manages one active token for a Logfire frontend application. Rotate in two applies with two resource blocks: add the replacement and deploy its \u003cspan pulumi-lang-nodejs=\"`token`\" pulumi-lang-dotnet=\"`Token`\" pulumi-lang-go=\"`token`\" pulumi-lang-python=\"`token`\" pulumi-lang-yaml=\"`token`\" pulumi-lang-java=\"`token`\"\u003e`token`\u003c/span\u003e, then remove the old resource to revoke it. The provider never revokes an old token while creating a new one. Token issuance is not retried automatically because the operation is not idempotent; after an uncertain failure, list the application's tokens and adopt the one unambiguous new active token. Before destroying the whole application tree, set the last token's \u003cspan pulumi-lang-nodejs=\"`revokeOnDestroy`\" pulumi-lang-dotnet=\"`RevokeOnDestroy`\" pulumi-lang-go=\"`revokeOnDestroy`\" pulumi-lang-python=\"`revoke_on_destroy`\" pulumi-lang-yaml=\"`revokeOnDestroy`\" pulumi-lang-java=\"`revokeOnDestroy`\"\u003e`revoke_on_destroy`\u003c/span\u003e to \u003cspan pulumi-lang-nodejs=\"`false`\" pulumi-lang-dotnet=\"`False`\" pulumi-lang-go=\"`false`\" pulumi-lang-python=\"`false`\" pulumi-lang-yaml=\"`false`\" pulumi-lang-java=\"`false`\"\u003e`false`\u003c/span\u003e in a separate apply; application deletion then revokes every attached token.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as logfire from \"@pydantic/pulumi-logfire\";\n\nconst current = new logfire.FrontendApplicationToken(\"current\", {\n    projectId: logfire_frontend_application.browser.project_id,\n    applicationId: logfire_frontend_application.browser.id,\n    adoptTokenId: logfire_frontend_application.browser.token_id,\n});\n// First apply with both resources. Deploy the replacement output everywhere.\n// Then remove `current` and apply again to revoke the previous token.\nconst replacement = new logfire.FrontendApplicationToken(\"replacement\", {\n    projectId: logfire_frontend_application.browser.project_id,\n    applicationId: logfire_frontend_application.browser.id,\n    revokeOnDestroy: true,\n});\nexport const rotatedBrowserWriteToken = replacement.token;\n```\n```python\nimport pulumi\nimport pulumi_logfire as logfire\n\ncurrent = logfire.FrontendApplicationToken(\"current\",\n    project_id=logfire_frontend_application[\"browser\"][\"project_id\"],\n    application_id=logfire_frontend_application[\"browser\"][\"id\"],\n    adopt_token_id=logfire_frontend_application[\"browser\"][\"token_id\"])\n# First apply with both resources. Deploy the replacement output everywhere.\n# Then remove `current` and apply again to revoke the previous token.\nreplacement = logfire.FrontendApplicationToken(\"replacement\",\n    project_id=logfire_frontend_application[\"browser\"][\"project_id\"],\n    application_id=logfire_frontend_application[\"browser\"][\"id\"],\n    revoke_on_destroy=True)\npulumi.export(\"rotatedBrowserWriteToken\", replacement.token)\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Logfire = Pulumi.Logfire;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var current = new Logfire.FrontendApplicationToken(\"current\", new()\n    {\n        ProjectId = logfire_frontend_application.Browser.Project_id,\n        ApplicationId = logfire_frontend_application.Browser.Id,\n        AdoptTokenId = logfire_frontend_application.Browser.Token_id,\n    });\n\n    // First apply with both resources. Deploy the replacement output everywhere.\n    // Then remove `current` and apply again to revoke the previous token.\n    var replacement = new Logfire.FrontendApplicationToken(\"replacement\", new()\n    {\n        ProjectId = logfire_frontend_application.Browser.Project_id,\n        ApplicationId = logfire_frontend_application.Browser.Id,\n        RevokeOnDestroy = true,\n    });\n\n    return new Dictionary\u003cstring, object?\u003e\n    {\n        [\"rotatedBrowserWriteToken\"] = replacement.Token,\n    };\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n\t\"github.com/pydantic/pulumi-logfire/sdk/go/logfire\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := logfire.NewFrontendApplicationToken(ctx, \"current\", \u0026logfire.FrontendApplicationTokenArgs{\n\t\t\tProjectId:     pulumi.Any(logfire_frontend_application.Browser.Project_id),\n\t\t\tApplicationId: pulumi.Any(logfire_frontend_application.Browser.Id),\n\t\t\tAdoptTokenId:  pulumi.Any(logfire_frontend_application.Browser.Token_id),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// First apply with both resources. Deploy the replacement output everywhere.\n\t\t// Then remove `current` and apply again to revoke the previous token.\n\t\treplacement, err := logfire.NewFrontendApplicationToken(ctx, \"replacement\", \u0026logfire.FrontendApplicationTokenArgs{\n\t\t\tProjectId:       pulumi.Any(logfire_frontend_application.Browser.Project_id),\n\t\t\tApplicationId:   pulumi.Any(logfire_frontend_application.Browser.Id),\n\t\t\tRevokeOnDestroy: pulumi.Bool(true),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tctx.Export(\"rotatedBrowserWriteToken\", replacement.Token)\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.logfire.FrontendApplicationToken;\nimport com.pulumi.logfire.FrontendApplicationTokenArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        var current = new FrontendApplicationToken(\"current\", FrontendApplicationTokenArgs.builder()\n            .projectId(logfire_frontend_application.browser().project_id())\n            .applicationId(logfire_frontend_application.browser().id())\n            .adoptTokenId(logfire_frontend_application.browser().token_id())\n            .build());\n\n        // First apply with both resources. Deploy the replacement output everywhere.\n        // Then remove `current` and apply again to revoke the previous token.\n        var replacement = new FrontendApplicationToken(\"replacement\", FrontendApplicationTokenArgs.builder()\n            .projectId(logfire_frontend_application.browser().project_id())\n            .applicationId(logfire_frontend_application.browser().id())\n            .revokeOnDestroy(true)\n            .build());\n\n        ctx.export(\"rotatedBrowserWriteToken\", replacement.token());\n    }\n}\n```\n```yaml\nresources:\n  current:\n    type: logfire:FrontendApplicationToken\n    properties:\n      projectId: ${logfire_frontend_application.browser.project_id}\n      applicationId: ${logfire_frontend_application.browser.id}\n      adoptTokenId: ${logfire_frontend_application.browser.token_id}\n  # First apply with both resources. Deploy the replacement output everywhere.\n  # Then remove `current` and apply again to revoke the previous token.\n  replacement:\n    type: logfire:FrontendApplicationToken\n    properties:\n      projectId: ${logfire_frontend_application.browser.project_id}\n      applicationId: ${logfire_frontend_application.browser.id}\n      # Before destroying the whole application tree, set this to false and apply.\n      #   # The following destroy can then let application deletion revoke this last token.\n      revokeOnDestroy: true\noutputs:\n  rotatedBrowserWriteToken: ${replacement.token}\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nThe `pulumi import` command can be used, for example:\n\n```sh\n$ pulumi import logfire:index/frontendApplicationToken:FrontendApplicationToken current \"project-id/application-id/token-id\"\n```\n\n",
            "properties": {
                "adoptTokenId": {
                    "type": "string",
                    "description": "Existing active token to adopt instead of issuing another. Use the application's \u003cspan pulumi-lang-nodejs=\"`tokenId`\" pulumi-lang-dotnet=\"`TokenId`\" pulumi-lang-go=\"`tokenId`\" pulumi-lang-python=\"`token_id`\" pulumi-lang-yaml=\"`tokenId`\" pulumi-lang-java=\"`tokenId`\"\u003e`token_id`\u003c/span\u003e for the initial handoff, then remove this resource only after a separately managed replacement has been deployed.\n"
                },
                "applicationId": {
                    "type": "string",
                    "description": "UUID of the frontend application.\n"
                },
                "createdAt": {
                    "type": "string",
                    "description": "Timestamp when the token was created.\n"
                },
                "lastUsedAt": {
                    "type": "string",
                    "description": "Timestamp when the token was last used, when known.\n"
                },
                "projectId": {
                    "type": "string",
                    "description": "UUID of the project that owns the application.\n"
                },
                "revokeOnDestroy": {
                    "type": "boolean",
                    "description": "Revoke this token when its resource is destroyed. Before destroying the entire application tree, set this to \u003cspan pulumi-lang-nodejs=\"`false`\" pulumi-lang-dotnet=\"`False`\" pulumi-lang-go=\"`false`\" pulumi-lang-python=\"`false`\" pulumi-lang-yaml=\"`false`\" pulumi-lang-java=\"`false`\"\u003e`false`\u003c/span\u003e in a separate apply for the last token so application deletion can revoke all attached tokens.\n"
                },
                "status": {
                    "type": "string",
                    "description": "Token status. A managed token remains in state only while active.\n"
                },
                "token": {
                    "type": "string",
                    "description": "Active restricted browser token. The provider recovers this value on refresh and import.\n",
                    "secret": true
                }
            },
            "required": [
                "applicationId",
                "createdAt",
                "lastUsedAt",
                "projectId",
                "revokeOnDestroy",
                "status",
                "token"
            ],
            "inputProperties": {
                "adoptTokenId": {
                    "type": "string",
                    "description": "Existing active token to adopt instead of issuing another. Use the application's \u003cspan pulumi-lang-nodejs=\"`tokenId`\" pulumi-lang-dotnet=\"`TokenId`\" pulumi-lang-go=\"`tokenId`\" pulumi-lang-python=\"`token_id`\" pulumi-lang-yaml=\"`tokenId`\" pulumi-lang-java=\"`tokenId`\"\u003e`token_id`\u003c/span\u003e for the initial handoff, then remove this resource only after a separately managed replacement has been deployed.\n"
                },
                "applicationId": {
                    "type": "string",
                    "description": "UUID of the frontend application.\n"
                },
                "projectId": {
                    "type": "string",
                    "description": "UUID of the project that owns the application.\n"
                },
                "revokeOnDestroy": {
                    "type": "boolean",
                    "description": "Revoke this token when its resource is destroyed. Before destroying the entire application tree, set this to \u003cspan pulumi-lang-nodejs=\"`false`\" pulumi-lang-dotnet=\"`False`\" pulumi-lang-go=\"`false`\" pulumi-lang-python=\"`false`\" pulumi-lang-yaml=\"`false`\" pulumi-lang-java=\"`false`\"\u003e`false`\u003c/span\u003e in a separate apply for the last token so application deletion can revoke all attached tokens.\n"
                }
            },
            "requiredInputs": [
                "applicationId",
                "projectId"
            ],
            "stateInputs": {
                "description": "Input properties used for looking up and filtering FrontendApplicationToken resources.\n",
                "properties": {
                    "adoptTokenId": {
                        "type": "string",
                        "description": "Existing active token to adopt instead of issuing another. Use the application's \u003cspan pulumi-lang-nodejs=\"`tokenId`\" pulumi-lang-dotnet=\"`TokenId`\" pulumi-lang-go=\"`tokenId`\" pulumi-lang-python=\"`token_id`\" pulumi-lang-yaml=\"`tokenId`\" pulumi-lang-java=\"`tokenId`\"\u003e`token_id`\u003c/span\u003e for the initial handoff, then remove this resource only after a separately managed replacement has been deployed.\n"
                    },
                    "applicationId": {
                        "type": "string",
                        "description": "UUID of the frontend application.\n"
                    },
                    "createdAt": {
                        "type": "string",
                        "description": "Timestamp when the token was created.\n"
                    },
                    "lastUsedAt": {
                        "type": "string",
                        "description": "Timestamp when the token was last used, when known.\n"
                    },
                    "projectId": {
                        "type": "string",
                        "description": "UUID of the project that owns the application.\n"
                    },
                    "revokeOnDestroy": {
                        "type": "boolean",
                        "description": "Revoke this token when its resource is destroyed. Before destroying the entire application tree, set this to \u003cspan pulumi-lang-nodejs=\"`false`\" pulumi-lang-dotnet=\"`False`\" pulumi-lang-go=\"`false`\" pulumi-lang-python=\"`false`\" pulumi-lang-yaml=\"`false`\" pulumi-lang-java=\"`false`\"\u003e`false`\u003c/span\u003e in a separate apply for the last token so application deletion can revoke all attached tokens.\n"
                    },
                    "status": {
                        "type": "string",
                        "description": "Token status. A managed token remains in state only while active.\n"
                    },
                    "token": {
                        "type": "string",
                        "description": "Active restricted browser token. The provider recovers this value on refresh and import.\n",
                        "secret": true
                    }
                },
                "type": "object"
            }
        },
        "logfire:index/gatewayApiKey:GatewayApiKey": {
            "description": "Manages a project-scoped AI Gateway API key (`project:gateway_proxy` scope). Do not confuse this with \u003cspan pulumi-lang-nodejs=\"`logfire.GatewayProvider`\" pulumi-lang-dotnet=\"`logfire.GatewayProvider`\" pulumi-lang-go=\"`GatewayProvider`\" pulumi-lang-python=\"`GatewayProvider`\" pulumi-lang-yaml=\"`logfire.GatewayProvider`\" pulumi-lang-java=\"`logfire.GatewayProvider`\"\u003e`logfire.GatewayProvider`\u003c/span\u003e, which configures an upstream LLM provider credential. The provider credential needs `organization:create_api_key` plus `project:gateway_proxy` delegation.\n\n## Import\n\nThe `pulumi import` command can be used, for example:\n\nImport an existing gateway API key by its UUID. Key names are not unique\n\nacross the organization, so the import is UUID-only. The UUID comes from the\n\nAPI key list endpoint (the API never returns the plaintext token again, so an\n\nimport recovers the key without its token):\n\n  curl -s -H \"Authorization: Bearer $LOGFIRE_API_KEY\" \\\n\n    \"$LOGFIRE_BASE_URL/api/v1/api-keys/\" | jq '.[] | {id, name}'\n\n```sh\n$ pulumi import logfire:index/gatewayApiKey:GatewayApiKey example' \"9f9b2f9e-aaaa-bbbb-cccc-ddddeeeeffff\"\n```\n\n",
            "properties": {
                "active": {
                    "type": "boolean"
                },
                "cacheEnabled": {
                    "type": "boolean",
                    "description": "Whether gateway responses are cached. Null inherits the project default. Can be updated in place; setting it to null restores the default.\n"
                },
                "createdAt": {
                    "type": "string",
                    "description": "Timestamp when the key was created.\n"
                },
                "description": {
                    "type": "string",
                    "description": "Free-form description. Can be updated in place; setting it to null clears it.\n"
                },
                "expiresAt": {
                    "type": "string",
                    "description": "Optional RFC3339 expiration timestamp (for example `2026-12-31T23:59:59Z`). If omitted, the key does not expire. Changing it replaces the key.\n"
                },
                "name": {
                    "type": "string",
                    "description": "Display name for the key. Can be updated in place.\n"
                },
                "projectId": {
                    "type": "string",
                    "description": "UUID of the project the key proxies for. Gateway keys always require a project. Changing it replaces the key.\n"
                },
                "projectName": {
                    "type": "string",
                    "description": "Name of the project the key proxies for.\n"
                },
                "spendingLimitDaily": {
                    "type": "integer",
                    "description": "Maximum gateway spend in whole US dollars per day. Null means no limit. Can be updated in place; setting it to null clears it.\n"
                },
                "spendingLimitMonthly": {
                    "type": "integer",
                    "description": "Maximum gateway spend in whole US dollars per month. Null means no limit. Can be updated in place; setting it to null clears it.\n"
                },
                "spendingLimitTotal": {
                    "type": "integer",
                    "description": "Maximum gateway spend in whole US dollars per lifetime. Null means no limit. Can be updated in place; setting it to null clears it.\n"
                },
                "spendingLimitWeekly": {
                    "type": "integer",
                    "description": "Maximum gateway spend in whole US dollars per week. Null means no limit. Can be updated in place; setting it to null clears it.\n"
                },
                "token": {
                    "type": "string",
                    "description": "The plaintext gateway API key. Only returned on creation; never returned again by the API.\n",
                    "secret": true
                }
            },
            "required": [
                "active",
                "createdAt",
                "name",
                "projectId",
                "projectName",
                "token"
            ],
            "inputProperties": {
                "cacheEnabled": {
                    "type": "boolean",
                    "description": "Whether gateway responses are cached. Null inherits the project default. Can be updated in place; setting it to null restores the default.\n"
                },
                "description": {
                    "type": "string",
                    "description": "Free-form description. Can be updated in place; setting it to null clears it.\n"
                },
                "expiresAt": {
                    "type": "string",
                    "description": "Optional RFC3339 expiration timestamp (for example `2026-12-31T23:59:59Z`). If omitted, the key does not expire. Changing it replaces the key.\n"
                },
                "name": {
                    "type": "string",
                    "description": "Display name for the key. Can be updated in place.\n"
                },
                "projectId": {
                    "type": "string",
                    "description": "UUID of the project the key proxies for. Gateway keys always require a project. Changing it replaces the key.\n"
                },
                "spendingLimitDaily": {
                    "type": "integer",
                    "description": "Maximum gateway spend in whole US dollars per day. Null means no limit. Can be updated in place; setting it to null clears it.\n"
                },
                "spendingLimitMonthly": {
                    "type": "integer",
                    "description": "Maximum gateway spend in whole US dollars per month. Null means no limit. Can be updated in place; setting it to null clears it.\n"
                },
                "spendingLimitTotal": {
                    "type": "integer",
                    "description": "Maximum gateway spend in whole US dollars per lifetime. Null means no limit. Can be updated in place; setting it to null clears it.\n"
                },
                "spendingLimitWeekly": {
                    "type": "integer",
                    "description": "Maximum gateway spend in whole US dollars per week. Null means no limit. Can be updated in place; setting it to null clears it.\n"
                }
            },
            "requiredInputs": [
                "projectId"
            ],
            "stateInputs": {
                "description": "Input properties used for looking up and filtering GatewayApiKey resources.\n",
                "properties": {
                    "active": {
                        "type": "boolean"
                    },
                    "cacheEnabled": {
                        "type": "boolean",
                        "description": "Whether gateway responses are cached. Null inherits the project default. Can be updated in place; setting it to null restores the default.\n"
                    },
                    "createdAt": {
                        "type": "string",
                        "description": "Timestamp when the key was created.\n"
                    },
                    "description": {
                        "type": "string",
                        "description": "Free-form description. Can be updated in place; setting it to null clears it.\n"
                    },
                    "expiresAt": {
                        "type": "string",
                        "description": "Optional RFC3339 expiration timestamp (for example `2026-12-31T23:59:59Z`). If omitted, the key does not expire. Changing it replaces the key.\n"
                    },
                    "name": {
                        "type": "string",
                        "description": "Display name for the key. Can be updated in place.\n"
                    },
                    "projectId": {
                        "type": "string",
                        "description": "UUID of the project the key proxies for. Gateway keys always require a project. Changing it replaces the key.\n"
                    },
                    "projectName": {
                        "type": "string",
                        "description": "Name of the project the key proxies for.\n"
                    },
                    "spendingLimitDaily": {
                        "type": "integer",
                        "description": "Maximum gateway spend in whole US dollars per day. Null means no limit. Can be updated in place; setting it to null clears it.\n"
                    },
                    "spendingLimitMonthly": {
                        "type": "integer",
                        "description": "Maximum gateway spend in whole US dollars per month. Null means no limit. Can be updated in place; setting it to null clears it.\n"
                    },
                    "spendingLimitTotal": {
                        "type": "integer",
                        "description": "Maximum gateway spend in whole US dollars per lifetime. Null means no limit. Can be updated in place; setting it to null clears it.\n"
                    },
                    "spendingLimitWeekly": {
                        "type": "integer",
                        "description": "Maximum gateway spend in whole US dollars per week. Null means no limit. Can be updated in place; setting it to null clears it.\n"
                    },
                    "token": {
                        "type": "string",
                        "description": "The plaintext gateway API key. Only returned on creation; never returned again by the API.\n",
                        "secret": true
                    }
                },
                "type": "object"
            }
        },
        "logfire:index/gatewayProvider:GatewayProvider": {
            "description": "\n\n## Import\n\nImport a provider by UUID using the same organization's management token:\n\nterraform\n\nimport {\n\n  to = logfire_gateway_provider.openai\n\n  id = \"018f45c0-3cab-7b2f-a8f7-8a0b55a7ed11\"\n\n}\n\nOr use the command line:\n\nImport an existing Gateway provider by its UUID, or by its organization-unique slug.\n\nThe UUID comes from the provider list endpoint:\n\n  curl -s -H \"Authorization: Bearer $LOGFIRE_API_KEY\" \\\n\n    \"$LOGFIRE_BASE_URL/api/v1/gateway/providers/\" | jq '.providers[] | {id, slug}'\n\nBy slug:\n\n```sh\n$ pulumi import logfire:index/gatewayProvider:GatewayProvider openai' \"openai\"\n```\n\nBy UUID:\n\n```sh\n$ pulumi import logfire:index/gatewayProvider:GatewayProvider openai' \"018f45c0-3cab-7b2f-a8f7-8a0b55a7ed11\"\n```\n\nImport reads public configuration only. Set `api_key` in your configuration;\n\nthe next apply writes that key to the imported provider. Import does not recover\n\nthe existing secret.\n\n",
            "properties": {
                "apiKey": {
                    "type": "string",
                    "secret": true
                },
                "bedrockApi": {
                    "type": "string",
                    "description": "Bedrock API variant: runtime or mantle. Required only for bedrock; can be updated in place.\n"
                },
                "bedrockRegion": {
                    "type": "string",
                    "description": "AWS region used to derive the Bedrock endpoint, for example us-east-1. Required only for bedrock; can be updated in place.\n"
                },
                "createdAt": {
                    "type": "string",
                    "description": "Timestamp when the provider was created.\n"
                },
                "requirePricing": {
                    "type": "boolean",
                    "description": "Require known model pricing before forwarding requests. Defaults to true.\n"
                },
                "slug": {
                    "type": "string",
                    "description": "Organization-unique provider slug. Changing it replaces the provider.\n"
                },
                "vendor": {
                    "type": "string",
                    "description": "Upstream vendor: openai, anthropic, bedrock, doubleword, groq, huggingface, or mistral. Changing it replaces the provider.\n"
                }
            },
            "required": [
                "apiKey",
                "createdAt",
                "requirePricing",
                "slug",
                "vendor"
            ],
            "inputProperties": {
                "apiKey": {
                    "type": "string",
                    "secret": true
                },
                "bedrockApi": {
                    "type": "string",
                    "description": "Bedrock API variant: runtime or mantle. Required only for bedrock; can be updated in place.\n"
                },
                "bedrockRegion": {
                    "type": "string",
                    "description": "AWS region used to derive the Bedrock endpoint, for example us-east-1. Required only for bedrock; can be updated in place.\n"
                },
                "requirePricing": {
                    "type": "boolean",
                    "description": "Require known model pricing before forwarding requests. Defaults to true.\n"
                },
                "slug": {
                    "type": "string",
                    "description": "Organization-unique provider slug. Changing it replaces the provider.\n"
                },
                "vendor": {
                    "type": "string",
                    "description": "Upstream vendor: openai, anthropic, bedrock, doubleword, groq, huggingface, or mistral. Changing it replaces the provider.\n"
                }
            },
            "requiredInputs": [
                "apiKey",
                "slug",
                "vendor"
            ],
            "stateInputs": {
                "description": "Input properties used for looking up and filtering GatewayProvider resources.\n",
                "properties": {
                    "apiKey": {
                        "type": "string",
                        "secret": true
                    },
                    "bedrockApi": {
                        "type": "string",
                        "description": "Bedrock API variant: runtime or mantle. Required only for bedrock; can be updated in place.\n"
                    },
                    "bedrockRegion": {
                        "type": "string",
                        "description": "AWS region used to derive the Bedrock endpoint, for example us-east-1. Required only for bedrock; can be updated in place.\n"
                    },
                    "createdAt": {
                        "type": "string",
                        "description": "Timestamp when the provider was created.\n"
                    },
                    "requirePricing": {
                        "type": "boolean",
                        "description": "Require known model pricing before forwarding requests. Defaults to true.\n"
                    },
                    "slug": {
                        "type": "string",
                        "description": "Organization-unique provider slug. Changing it replaces the provider.\n"
                    },
                    "vendor": {
                        "type": "string",
                        "description": "Upstream vendor: openai, anthropic, bedrock, doubleword, groq, huggingface, or mistral. Changing it replaces the provider.\n"
                    }
                },
                "type": "object"
            }
        },
        "logfire:index/organization:Organization": {
            "description": "Manages a Logfire organization. This resource is only available for self-hosted deployments and requires an API key created in the admin organization (the one with the admin panel) carrying the `organization:admin` scope. A key minted inside another organization cannot manage organizations regardless of its scopes. Reading, updating, and deleting an organization authenticates with a short-lived organization-scoped token exchanged from that key, and the same exchange backs setting \u003cspan pulumi-lang-nodejs=\"`billingEmail`\" pulumi-lang-dotnet=\"`BillingEmail`\" pulumi-lang-go=\"`billingEmail`\" pulumi-lang-python=\"`billing_email`\" pulumi-lang-yaml=\"`billingEmail`\" pulumi-lang-java=\"`billingEmail`\"\u003e`billing_email`\u003c/span\u003e at creation, so every operation beyond creating and listing requires a Logfire backend from 2026-06-25 (v2026-06-25.01) or newer; creating and listing organizations require 2026-06-03 (v2026-06-03.01) or newer.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as logfire from \"@pydantic/pulumi-logfire\";\n\nconst example = new logfire.Organization(\"example\", {\n    deletionProtection: false,\n    displayName: \"Terraform Example Org\",\n});\n```\n```python\nimport pulumi\nimport pulumi_logfire as logfire\n\nexample = logfire.Organization(\"example\",\n    deletion_protection=False,\n    display_name=\"Terraform Example Org\")\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Logfire = Pulumi.Logfire;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var example = new Logfire.Organization(\"example\", new()\n    {\n        DeletionProtection = false,\n        DisplayName = \"Terraform Example Org\",\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n\t\"github.com/pydantic/pulumi-logfire/sdk/go/logfire\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := logfire.NewOrganization(ctx, \"example\", \u0026logfire.OrganizationArgs{\n\t\t\tDeletionProtection: pulumi.Bool(false),\n\t\t\tDisplayName:        pulumi.String(\"Terraform Example Org\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.logfire.Organization;\nimport com.pulumi.logfire.OrganizationArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        var example = new Organization(\"example\", OrganizationArgs.builder()\n            .deletionProtection(false)\n            .displayName(\"Terraform Example Org\")\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  example:\n    type: logfire:Organization\n    properties:\n      # This defaults to true. Set false to allow destroy.\n      deletionProtection: false\n      displayName: Terraform Example Org\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nThe `pulumi import` command can be used, for example:\n\nImport an existing organization by name or UUID. The provider credential must be\n\nan API key from the admin organization carrying the `organization:admin` scope.\n\nBy name:\n\n```sh\n$ pulumi import logfire:index/organization:Organization example' \"terraform-example-org\"\n```\n\nBy UUID:\n\n```sh\n$ pulumi import logfire:index/organization:Organization example' \"9f9b2f9e-aaaa-bbbb-cccc-ddddeeeeffff\"\n```\n\n",
            "properties": {
                "aiEnabled": {
                    "type": "boolean",
                    "description": "Whether AI features are enabled.\n"
                },
                "avatar": {
                    "type": "string",
                    "description": "Avatar URL.\n"
                },
                "billingEmail": {
                    "type": "string",
                    "description": "Billing contact email.\n"
                },
                "createdAt": {
                    "type": "string",
                    "description": "Timestamp when the organization was created.\n"
                },
                "deletionProtection": {
                    "type": "boolean",
                    "description": "Prevents accidental destroy when true (defaults to true). Set to false and apply before deleting this resource.\n"
                },
                "description": {
                    "type": "string",
                    "description": "Organization description.\n"
                },
                "displayName": {
                    "type": "string",
                    "description": "Display name shown in the UI.\n"
                },
                "gatewayEnabled": {
                    "type": "boolean",
                    "description": "Whether gateway features are enabled.\n"
                },
                "githubHandle": {
                    "type": "string",
                    "description": "Organization GitHub handle.\n"
                },
                "hasAdminPanel": {
                    "type": "boolean",
                    "description": "Whether the organization has access to the admin panel.\n"
                },
                "location": {
                    "type": "string",
                    "description": "Organization location.\n"
                },
                "name": {
                    "type": "string",
                    "description": "Organization name/slug.\n"
                },
                "updatedAt": {
                    "type": "string",
                    "description": "Timestamp when the organization was last updated.\n"
                }
            },
            "required": [
                "aiEnabled",
                "avatar",
                "billingEmail",
                "createdAt",
                "deletionProtection",
                "description",
                "displayName",
                "gatewayEnabled",
                "githubHandle",
                "hasAdminPanel",
                "location",
                "name",
                "updatedAt"
            ],
            "inputProperties": {
                "avatar": {
                    "type": "string",
                    "description": "Avatar URL.\n"
                },
                "billingEmail": {
                    "type": "string",
                    "description": "Billing contact email.\n"
                },
                "deletionProtection": {
                    "type": "boolean",
                    "description": "Prevents accidental destroy when true (defaults to true). Set to false and apply before deleting this resource.\n"
                },
                "description": {
                    "type": "string",
                    "description": "Organization description.\n"
                },
                "displayName": {
                    "type": "string",
                    "description": "Display name shown in the UI.\n"
                },
                "githubHandle": {
                    "type": "string",
                    "description": "Organization GitHub handle.\n"
                },
                "location": {
                    "type": "string",
                    "description": "Organization location.\n"
                },
                "name": {
                    "type": "string",
                    "description": "Organization name/slug.\n"
                }
            },
            "stateInputs": {
                "description": "Input properties used for looking up and filtering Organization resources.\n",
                "properties": {
                    "aiEnabled": {
                        "type": "boolean",
                        "description": "Whether AI features are enabled.\n"
                    },
                    "avatar": {
                        "type": "string",
                        "description": "Avatar URL.\n"
                    },
                    "billingEmail": {
                        "type": "string",
                        "description": "Billing contact email.\n"
                    },
                    "createdAt": {
                        "type": "string",
                        "description": "Timestamp when the organization was created.\n"
                    },
                    "deletionProtection": {
                        "type": "boolean",
                        "description": "Prevents accidental destroy when true (defaults to true). Set to false and apply before deleting this resource.\n"
                    },
                    "description": {
                        "type": "string",
                        "description": "Organization description.\n"
                    },
                    "displayName": {
                        "type": "string",
                        "description": "Display name shown in the UI.\n"
                    },
                    "gatewayEnabled": {
                        "type": "boolean",
                        "description": "Whether gateway features are enabled.\n"
                    },
                    "githubHandle": {
                        "type": "string",
                        "description": "Organization GitHub handle.\n"
                    },
                    "hasAdminPanel": {
                        "type": "boolean",
                        "description": "Whether the organization has access to the admin panel.\n"
                    },
                    "location": {
                        "type": "string",
                        "description": "Organization location.\n"
                    },
                    "name": {
                        "type": "string",
                        "description": "Organization name/slug.\n"
                    },
                    "updatedAt": {
                        "type": "string",
                        "description": "Timestamp when the organization was last updated.\n"
                    }
                },
                "type": "object"
            }
        },
        "logfire:index/project:Project": {
            "description": "Manages a Logfire project.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as logfire from \"@pydantic/pulumi-logfire\";\n\nconst example = new logfire.Project(\"example\", {description: \"Managed by Pulumi\"});\n```\n```python\nimport pulumi\nimport pulumi_logfire as logfire\n\nexample = logfire.Project(\"example\", description=\"Managed by Pulumi\")\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Logfire = Pulumi.Logfire;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var example = new Logfire.Project(\"example\", new()\n    {\n        Description = \"Managed by Pulumi\",\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n\t\"github.com/pydantic/pulumi-logfire/sdk/go/logfire\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\t_, err := logfire.NewProject(ctx, \"example\", \u0026logfire.ProjectArgs{\n\t\t\tDescription: pulumi.String(\"Managed by Pulumi\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.logfire.Project;\nimport com.pulumi.logfire.ProjectArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        var example = new Project(\"example\", ProjectArgs.builder()\n            .description(\"Managed by Pulumi\")\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  example:\n    type: logfire:Project\n    properties:\n      description: Managed by Pulumi\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nImport by organization name and project name:\n\n```sh\n$ pulumi import logfire:index/project:Project example \"acme/example-project\"\n```\nSingle project UUID/name imports are also supported.\n\n",
            "properties": {
                "description": {
                    "type": "string",
                    "description": "Project description.\n"
                },
                "name": {
                    "type": "string",
                    "description": "Project name/slug. Must be unique within the organization.\n"
                },
                "organization": {
                    "type": "string",
                    "description": "Organization name. Computed from the API and cannot be set.\n"
                },
                "visibility": {
                    "type": "string",
                    "description": "Project visibility (\u003cspan pulumi-lang-nodejs=\"`public`\" pulumi-lang-dotnet=\"`Public`\" pulumi-lang-go=\"`public`\" pulumi-lang-python=\"`public`\" pulumi-lang-yaml=\"`public`\" pulumi-lang-java=\"`public`\"\u003e`public`\u003c/span\u003e or \u003cspan pulumi-lang-nodejs=\"`private`\" pulumi-lang-dotnet=\"`Private`\" pulumi-lang-go=\"`private`\" pulumi-lang-python=\"`private`\" pulumi-lang-yaml=\"`private`\" pulumi-lang-java=\"`private`\"\u003e`private`\u003c/span\u003e).\n"
                }
            },
            "required": [
                "name",
                "organization",
                "visibility"
            ],
            "inputProperties": {
                "description": {
                    "type": "string",
                    "description": "Project description.\n"
                },
                "name": {
                    "type": "string",
                    "description": "Project name/slug. Must be unique within the organization.\n"
                },
                "visibility": {
                    "type": "string",
                    "description": "Project visibility (\u003cspan pulumi-lang-nodejs=\"`public`\" pulumi-lang-dotnet=\"`Public`\" pulumi-lang-go=\"`public`\" pulumi-lang-python=\"`public`\" pulumi-lang-yaml=\"`public`\" pulumi-lang-java=\"`public`\"\u003e`public`\u003c/span\u003e or \u003cspan pulumi-lang-nodejs=\"`private`\" pulumi-lang-dotnet=\"`Private`\" pulumi-lang-go=\"`private`\" pulumi-lang-python=\"`private`\" pulumi-lang-yaml=\"`private`\" pulumi-lang-java=\"`private`\"\u003e`private`\u003c/span\u003e).\n"
                }
            },
            "stateInputs": {
                "description": "Input properties used for looking up and filtering Project resources.\n",
                "properties": {
                    "description": {
                        "type": "string",
                        "description": "Project description.\n"
                    },
                    "name": {
                        "type": "string",
                        "description": "Project name/slug. Must be unique within the organization.\n"
                    },
                    "organization": {
                        "type": "string",
                        "description": "Organization name. Computed from the API and cannot be set.\n"
                    },
                    "visibility": {
                        "type": "string",
                        "description": "Project visibility (\u003cspan pulumi-lang-nodejs=\"`public`\" pulumi-lang-dotnet=\"`Public`\" pulumi-lang-go=\"`public`\" pulumi-lang-python=\"`public`\" pulumi-lang-yaml=\"`public`\" pulumi-lang-java=\"`public`\"\u003e`public`\u003c/span\u003e or \u003cspan pulumi-lang-nodejs=\"`private`\" pulumi-lang-dotnet=\"`Private`\" pulumi-lang-go=\"`private`\" pulumi-lang-python=\"`private`\" pulumi-lang-yaml=\"`private`\" pulumi-lang-java=\"`private`\"\u003e`private`\u003c/span\u003e).\n"
                    }
                },
                "type": "object"
            }
        },
        "logfire:index/readToken:ReadToken": {
            "description": "## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as logfire from \"@pydantic/pulumi-logfire\";\n\nconst exampleProject = new logfire.Project(\"exampleProject\", {});\nconst exampleReadToken = new logfire.ReadToken(\"exampleReadToken\", {\n    projectId: exampleProject.id,\n    expiresAt: \"2099-12-31T23:59:59Z\",\n});\n```\n```python\nimport pulumi\nimport pulumi_logfire as logfire\n\nexample_project = logfire.Project(\"exampleProject\")\nexample_read_token = logfire.ReadToken(\"exampleReadToken\",\n    project_id=example_project.id,\n    expires_at=\"2099-12-31T23:59:59Z\")\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Logfire = Pulumi.Logfire;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var exampleProject = new Logfire.Project(\"exampleProject\");\n\n    var exampleReadToken = new Logfire.ReadToken(\"exampleReadToken\", new()\n    {\n        ProjectId = exampleProject.Id,\n        ExpiresAt = \"2099-12-31T23:59:59Z\",\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n\t\"github.com/pydantic/pulumi-logfire/sdk/go/logfire\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\texampleProject, err := logfire.NewProject(ctx, \"exampleProject\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = logfire.NewReadToken(ctx, \"exampleReadToken\", \u0026logfire.ReadTokenArgs{\n\t\t\tProjectId: exampleProject.ID(),\n\t\t\tExpiresAt: pulumi.String(\"2099-12-31T23:59:59Z\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.logfire.Project;\nimport com.pulumi.logfire.ReadToken;\nimport com.pulumi.logfire.ReadTokenArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        var exampleProject = new Project(\"exampleProject\");\n\n        var exampleReadToken = new ReadToken(\"exampleReadToken\", ReadTokenArgs.builder()\n            .projectId(exampleProject.id())\n            .expiresAt(\"2099-12-31T23:59:59Z\")\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  exampleProject:\n    type: logfire:Project\n  exampleReadToken:\n    type: logfire:ReadToken\n    properties:\n      projectId: ${exampleProject.id}\n      expiresAt: 2099-12-31T23:59:59Z\n```\n\u003c!--End PulumiCodeChooser --\u003e\n",
            "properties": {
                "createdAt": {
                    "type": "string",
                    "description": "Timestamp when the token was created.\n"
                },
                "createdByName": {
                    "type": "string",
                    "description": "Display name of the user that created the token.\n"
                },
                "description": {
                    "type": "string",
                    "description": "Description is fixed to \"Created by Public API\" for provider-managed tokens.\n"
                },
                "expiresAt": {
                    "type": "string",
                    "description": "Optional RFC3339 expiration timestamp for the token (for example `2026-12-31T23:59:59Z`). If omitted, the token does not expire.\n"
                },
                "projectId": {
                    "type": "string",
                    "description": "UUID of the project that owns the token.\n"
                },
                "projectName": {
                    "type": "string",
                    "description": "Name of the project that owns the token.\n"
                },
                "token": {
                    "type": "string",
                    "description": "The generated read token. Only returned on creation.\n",
                    "secret": true
                },
                "tokenPrefix": {
                    "type": "string",
                    "description": "Prefix of the generated read token.\n"
                }
            },
            "required": [
                "createdAt",
                "createdByName",
                "description",
                "projectId",
                "projectName",
                "token",
                "tokenPrefix"
            ],
            "inputProperties": {
                "expiresAt": {
                    "type": "string",
                    "description": "Optional RFC3339 expiration timestamp for the token (for example `2026-12-31T23:59:59Z`). If omitted, the token does not expire.\n"
                },
                "projectId": {
                    "type": "string",
                    "description": "UUID of the project that owns the token.\n"
                }
            },
            "requiredInputs": [
                "projectId"
            ],
            "stateInputs": {
                "description": "Input properties used for looking up and filtering ReadToken resources.\n",
                "properties": {
                    "createdAt": {
                        "type": "string",
                        "description": "Timestamp when the token was created.\n"
                    },
                    "createdByName": {
                        "type": "string",
                        "description": "Display name of the user that created the token.\n"
                    },
                    "description": {
                        "type": "string",
                        "description": "Description is fixed to \"Created by Public API\" for provider-managed tokens.\n"
                    },
                    "expiresAt": {
                        "type": "string",
                        "description": "Optional RFC3339 expiration timestamp for the token (for example `2026-12-31T23:59:59Z`). If omitted, the token does not expire.\n"
                    },
                    "projectId": {
                        "type": "string",
                        "description": "UUID of the project that owns the token.\n"
                    },
                    "projectName": {
                        "type": "string",
                        "description": "Name of the project that owns the token.\n"
                    },
                    "token": {
                        "type": "string",
                        "description": "The generated read token. Only returned on creation.\n",
                        "secret": true
                    },
                    "tokenPrefix": {
                        "type": "string",
                        "description": "Prefix of the generated read token.\n"
                    }
                },
                "type": "object"
            }
        },
        "logfire:index/slo:Slo": {
            "description": "Manages a Logfire SLO (Service Level Objective).\n\n\u003e **Experimental:** this resource is backed by a Logfire API that is not yet stable. Its schema and behavior may change in backwards-incompatible ways in future releases. SLOs also require a Logfire plan that includes them.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as logfire from \"@pydantic/pulumi-logfire\";\n\nconst exampleProject = new logfire.Project(\"exampleProject\", {});\nconst oncall = new logfire.Channel(\"oncall\", {config: [{\n    type: \"webhook\",\n    format: \"auto\",\n    url: \"https://hooks.example.com/oncall\",\n}]});\nconst exampleSlo = new logfire.Slo(\"exampleSlo\", {\n    projectId: exampleProject.id,\n    scopeValue: \"payments-api\",\n    description: \"Successful request ratio for the payments API\",\n    totalQuery: \"parent_span_id IS NULL\",\n    badQuery: \"otel_status_code = 'ERROR'\",\n    targetPercent: \"99.9\",\n    rollingWindow: \"30d\",\n    environments: [\"prod\"],\n    pageChannelIds: [oncall.id],\n    ticketChannelIds: [oncall.id],\n});\n// A histogram-threshold metric SLI: \"95% of queue-latency observations under\n// 60s\". Uses `threshold` + `comparison` instead of `bad_query`, and requires\n// `source = \"metrics\"`.\nconst queueLatency = new logfire.Slo(\"queueLatency\", {\n    projectId: exampleProject.id,\n    scopeValue: \"ingest\",\n    source: \"metrics\",\n    metricAggregation: \"histogram_threshold\",\n    totalQuery: \"metric_name = 'queue.latency'\",\n    threshold: \"60000\",\n    comparison: \"less_than\",\n    targetPercent: \"95\",\n    rollingWindow: \"30d\",\n});\n```\n```python\nimport pulumi\nimport pulumi_logfire as logfire\n\nexample_project = logfire.Project(\"exampleProject\")\noncall = logfire.Channel(\"oncall\", config=[{\n    \"type\": \"webhook\",\n    \"format\": \"auto\",\n    \"url\": \"https://hooks.example.com/oncall\",\n}])\nexample_slo = logfire.Slo(\"exampleSlo\",\n    project_id=example_project.id,\n    scope_value=\"payments-api\",\n    description=\"Successful request ratio for the payments API\",\n    total_query=\"parent_span_id IS NULL\",\n    bad_query=\"otel_status_code = 'ERROR'\",\n    target_percent=\"99.9\",\n    rolling_window=\"30d\",\n    environments=[\"prod\"],\n    page_channel_ids=[oncall.id],\n    ticket_channel_ids=[oncall.id])\n# A histogram-threshold metric SLI: \"95% of queue-latency observations under\n# 60s\". Uses `threshold` + `comparison` instead of `bad_query`, and requires\n# `source = \"metrics\"`.\nqueue_latency = logfire.Slo(\"queueLatency\",\n    project_id=example_project.id,\n    scope_value=\"ingest\",\n    source=\"metrics\",\n    metric_aggregation=\"histogram_threshold\",\n    total_query=\"metric_name = 'queue.latency'\",\n    threshold=\"60000\",\n    comparison=\"less_than\",\n    target_percent=\"95\",\n    rolling_window=\"30d\")\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Logfire = Pulumi.Logfire;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var exampleProject = new Logfire.Project(\"exampleProject\");\n\n    var oncall = new Logfire.Channel(\"oncall\", new()\n    {\n        Config = new[]\n        {\n            \n            {\n                { \"type\", \"webhook\" },\n                { \"format\", \"auto\" },\n                { \"url\", \"https://hooks.example.com/oncall\" },\n            },\n        },\n    });\n\n    var exampleSlo = new Logfire.Slo(\"exampleSlo\", new()\n    {\n        ProjectId = exampleProject.Id,\n        ScopeValue = \"payments-api\",\n        Description = \"Successful request ratio for the payments API\",\n        TotalQuery = \"parent_span_id IS NULL\",\n        BadQuery = \"otel_status_code = 'ERROR'\",\n        TargetPercent = \"99.9\",\n        RollingWindow = \"30d\",\n        Environments = new[]\n        {\n            \"prod\",\n        },\n        PageChannelIds = new[]\n        {\n            oncall.Id,\n        },\n        TicketChannelIds = new[]\n        {\n            oncall.Id,\n        },\n    });\n\n    // A histogram-threshold metric SLI: \"95% of queue-latency observations under\n    // 60s\". Uses `threshold` + `comparison` instead of `bad_query`, and requires\n    // `source = \"metrics\"`.\n    var queueLatency = new Logfire.Slo(\"queueLatency\", new()\n    {\n        ProjectId = exampleProject.Id,\n        ScopeValue = \"ingest\",\n        Source = \"metrics\",\n        MetricAggregation = \"histogram_threshold\",\n        TotalQuery = \"metric_name = 'queue.latency'\",\n        Threshold = \"60000\",\n        Comparison = \"less_than\",\n        TargetPercent = \"95\",\n        RollingWindow = \"30d\",\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n\t\"github.com/pydantic/pulumi-logfire/sdk/go/logfire\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\texampleProject, err := logfire.NewProject(ctx, \"exampleProject\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\toncall, err := logfire.NewChannel(ctx, \"oncall\", \u0026logfire.ChannelArgs{\n\t\t\tConfig: logfire.ChannelConfigArgs{\n\t\t\t\tmap[string]interface{}{\n\t\t\t\t\t\"type\":   \"webhook\",\n\t\t\t\t\t\"format\": \"auto\",\n\t\t\t\t\t\"url\":    \"https://hooks.example.com/oncall\",\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = logfire.NewSlo(ctx, \"exampleSlo\", \u0026logfire.SloArgs{\n\t\t\tProjectId:     exampleProject.ID(),\n\t\t\tScopeValue:    pulumi.String(\"payments-api\"),\n\t\t\tDescription:   pulumi.String(\"Successful request ratio for the payments API\"),\n\t\t\tTotalQuery:    pulumi.String(\"parent_span_id IS NULL\"),\n\t\t\tBadQuery:      pulumi.String(\"otel_status_code = 'ERROR'\"),\n\t\t\tTargetPercent: pulumi.String(\"99.9\"),\n\t\t\tRollingWindow: pulumi.String(\"30d\"),\n\t\t\tEnvironments: pulumi.StringArray{\n\t\t\t\tpulumi.String(\"prod\"),\n\t\t\t},\n\t\t\tPageChannelIds: pulumi.StringArray{\n\t\t\t\toncall.ID(),\n\t\t\t},\n\t\t\tTicketChannelIds: pulumi.StringArray{\n\t\t\t\toncall.ID(),\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// A histogram-threshold metric SLI: \"95% of queue-latency observations under\n\t\t// 60s\". Uses `threshold` + `comparison` instead of `bad_query`, and requires\n\t\t// `source = \"metrics\"`.\n\t\t_, err = logfire.NewSlo(ctx, \"queueLatency\", \u0026logfire.SloArgs{\n\t\t\tProjectId:         exampleProject.ID(),\n\t\t\tScopeValue:        pulumi.String(\"ingest\"),\n\t\t\tSource:            pulumi.String(\"metrics\"),\n\t\t\tMetricAggregation: pulumi.String(\"histogram_threshold\"),\n\t\t\tTotalQuery:        pulumi.String(\"metric_name = 'queue.latency'\"),\n\t\t\tThreshold:         pulumi.String(\"60000\"),\n\t\t\tComparison:        pulumi.String(\"less_than\"),\n\t\t\tTargetPercent:     pulumi.String(\"95\"),\n\t\t\tRollingWindow:     pulumi.String(\"30d\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.logfire.Project;\nimport com.pulumi.logfire.Channel;\nimport com.pulumi.logfire.ChannelArgs;\nimport com.pulumi.logfire.Slo;\nimport com.pulumi.logfire.SloArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        var exampleProject = new Project(\"exampleProject\");\n\n        var oncall = new Channel(\"oncall\", ChannelArgs.builder()\n            .config(ChannelConfigArgs.builder()\n                .type(\"webhook\")\n                .format(\"auto\")\n                .url(\"https://hooks.example.com/oncall\")\n                .build())\n            .build());\n\n        var exampleSlo = new Slo(\"exampleSlo\", SloArgs.builder()\n            .projectId(exampleProject.id())\n            .scopeValue(\"payments-api\")\n            .description(\"Successful request ratio for the payments API\")\n            .totalQuery(\"parent_span_id IS NULL\")\n            .badQuery(\"otel_status_code = 'ERROR'\")\n            .targetPercent(\"99.9\")\n            .rollingWindow(\"30d\")\n            .environments(\"prod\")\n            .pageChannelIds(oncall.id())\n            .ticketChannelIds(oncall.id())\n            .build());\n\n        // A histogram-threshold metric SLI: \"95% of queue-latency observations under\n        // 60s\". Uses `threshold` + `comparison` instead of `bad_query`, and requires\n        // `source = \"metrics\"`.\n        var queueLatency = new Slo(\"queueLatency\", SloArgs.builder()\n            .projectId(exampleProject.id())\n            .scopeValue(\"ingest\")\n            .source(\"metrics\")\n            .metricAggregation(\"histogram_threshold\")\n            .totalQuery(\"metric_name = 'queue.latency'\")\n            .threshold(\"60000\")\n            .comparison(\"less_than\")\n            .targetPercent(\"95\")\n            .rollingWindow(\"30d\")\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  exampleProject:\n    type: logfire:Project\n  oncall:\n    type: logfire:Channel\n    properties:\n      config:\n        - type: webhook\n          format: auto\n          url: https://hooks.example.com/oncall\n  exampleSlo:\n    type: logfire:Slo\n    properties:\n      projectId: ${exampleProject.id}\n      scopeValue: payments-api\n      description: Successful request ratio for the payments API\n      totalQuery: parent_span_id IS NULL\n      badQuery: otel_status_code = 'ERROR'\n      targetPercent: '99.9'\n      rollingWindow: 30d\n      environments:\n        - prod\n      # Seed the generated burn-rate alerts' delivery channels (create-time only;\n      #   # delivery is alert-owned afterwards).\n      pageChannelIds:\n        - ${oncall.id}\n      ticketChannelIds:\n        - ${oncall.id}\n  # A histogram-threshold metric SLI: \"95% of queue-latency observations under\n  # 60s\". Uses `threshold` + `comparison` instead of `bad_query`, and requires\n  # `source = \"metrics\"`.\n  queueLatency:\n    type: logfire:Slo\n    properties:\n      projectId: ${exampleProject.id}\n      scopeValue: ingest\n      source: metrics\n      metricAggregation: histogram_threshold\n      totalQuery: metric_name = 'queue.latency'\n      threshold: '60000'\n      comparison: less_than\n      targetPercent: '95'\n      rollingWindow: 30d\n```\n\u003c!--End PulumiCodeChooser --\u003e\n\n## Import\n\nIn Terraform v1.5.0 and later, the `import` block can be used with the `id` attribute, for example:\n\nterraform\n\nimport {\n\n  to = logfire_slo.example\n\n  id = \"example-project/payments-availability\"\n\n}\n\nThe `pulumi import` command can be used, for example:\n\nImport by project name and SLO name.\n\n```sh\n$ pulumi import logfire:index/slo:Slo example \"example-project/payments-availability\"\n```\n\n",
            "properties": {
                "badQuery": {
                    "type": "string",
                    "description": "SQL boolean expression selecting the bad events counted by the SLO. Required for every mode except \u003cspan pulumi-lang-nodejs=\"`metricAggregation \" pulumi-lang-dotnet=\"`MetricAggregation \" pulumi-lang-go=\"`metricAggregation \" pulumi-lang-python=\"`metric_aggregation \" pulumi-lang-yaml=\"`metricAggregation \" pulumi-lang-java=\"`metricAggregation \"\u003e`metric_aggregation \u003c/span\u003e= \u003cspan pulumi-lang-nodejs=\"\"histogramThreshold\"\" pulumi-lang-dotnet=\"\"HistogramThreshold\"\" pulumi-lang-go=\"\"histogramThreshold\"\" pulumi-lang-python=\"\"histogram_threshold\"\" pulumi-lang-yaml=\"\"histogramThreshold\"\" pulumi-lang-java=\"\"histogramThreshold\"\"\u003e\"histogram_threshold\"\u003c/span\u003e`, which uses \u003cspan pulumi-lang-nodejs=\"`threshold`\" pulumi-lang-dotnet=\"`Threshold`\" pulumi-lang-go=\"`threshold`\" pulumi-lang-python=\"`threshold`\" pulumi-lang-yaml=\"`threshold`\" pulumi-lang-java=\"`threshold`\"\u003e`threshold`\u003c/span\u003e and \u003cspan pulumi-lang-nodejs=\"`comparison`\" pulumi-lang-dotnet=\"`Comparison`\" pulumi-lang-go=\"`comparison`\" pulumi-lang-python=\"`comparison`\" pulumi-lang-yaml=\"`comparison`\" pulumi-lang-java=\"`comparison`\"\u003e`comparison`\u003c/span\u003e instead.\n"
                },
                "comparison": {
                    "type": "string",
                    "description": "For \u003cspan pulumi-lang-nodejs=\"`metricAggregation \" pulumi-lang-dotnet=\"`MetricAggregation \" pulumi-lang-go=\"`metricAggregation \" pulumi-lang-python=\"`metric_aggregation \" pulumi-lang-yaml=\"`metricAggregation \" pulumi-lang-java=\"`metricAggregation \"\u003e`metric_aggregation \u003c/span\u003e= \u003cspan pulumi-lang-nodejs=\"\"histogramThreshold\"\" pulumi-lang-dotnet=\"\"HistogramThreshold\"\" pulumi-lang-go=\"\"histogramThreshold\"\" pulumi-lang-python=\"\"histogram_threshold\"\" pulumi-lang-yaml=\"\"histogramThreshold\"\" pulumi-lang-java=\"\"histogramThreshold\"\"\u003e\"histogram_threshold\"\u003c/span\u003e`: the good side of the \u003cspan pulumi-lang-nodejs=\"`threshold`\" pulumi-lang-dotnet=\"`Threshold`\" pulumi-lang-go=\"`threshold`\" pulumi-lang-python=\"`threshold`\" pulumi-lang-yaml=\"`threshold`\" pulumi-lang-java=\"`threshold`\"\u003e`threshold`\u003c/span\u003e. \u003cspan pulumi-lang-nodejs=\"`lessThan`\" pulumi-lang-dotnet=\"`LessThan`\" pulumi-lang-go=\"`lessThan`\" pulumi-lang-python=\"`less_than`\" pulumi-lang-yaml=\"`lessThan`\" pulumi-lang-java=\"`lessThan`\"\u003e`less_than`\u003c/span\u003e (good is below the threshold, the latency case) or \u003cspan pulumi-lang-nodejs=\"`greaterThan`\" pulumi-lang-dotnet=\"`GreaterThan`\" pulumi-lang-go=\"`greaterThan`\" pulumi-lang-python=\"`greater_than`\" pulumi-lang-yaml=\"`greaterThan`\" pulumi-lang-java=\"`greaterThan`\"\u003e`greater_than`\u003c/span\u003e. Required for that mode, and must be omitted otherwise.\n"
                },
                "description": {
                    "type": "string",
                    "description": "SLO description.\n"
                },
                "environments": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    },
                    "description": "Deployment environments the SLO is scoped to. Omit to cover all environments.\n"
                },
                "metricAggregation": {
                    "type": "string",
                    "description": "How a \u003cspan pulumi-lang-nodejs=\"`metrics`\" pulumi-lang-dotnet=\"`Metrics`\" pulumi-lang-go=\"`metrics`\" pulumi-lang-python=\"`metrics`\" pulumi-lang-yaml=\"`metrics`\" pulumi-lang-java=\"`metrics`\"\u003e`metrics`\u003c/span\u003e SLO aggregates its SLI: \u003cspan pulumi-lang-nodejs=\"`additive`\" pulumi-lang-dotnet=\"`Additive`\" pulumi-lang-go=\"`additive`\" pulumi-lang-python=\"`additive`\" pulumi-lang-yaml=\"`additive`\" pulumi-lang-java=\"`additive`\"\u003e`additive`\u003c/span\u003e (sum of scalar values, for delta-count metrics), \u003cspan pulumi-lang-nodejs=\"`gaugeFraction`\" pulumi-lang-dotnet=\"`GaugeFraction`\" pulumi-lang-go=\"`gaugeFraction`\" pulumi-lang-python=\"`gauge_fraction`\" pulumi-lang-yaml=\"`gaugeFraction`\" pulumi-lang-java=\"`gaugeFraction`\"\u003e`gauge_fraction`\u003c/span\u003e (fraction of samples meeting the condition, for gauges), \u003cspan pulumi-lang-nodejs=\"`counterRate`\" pulumi-lang-dotnet=\"`CounterRate`\" pulumi-lang-go=\"`counterRate`\" pulumi-lang-python=\"`counter_rate`\" pulumi-lang-yaml=\"`counterRate`\" pulumi-lang-java=\"`counterRate`\"\u003e`counter_rate`\u003c/span\u003e (sum of per-series increases, for cumulative counters), or \u003cspan pulumi-lang-nodejs=\"`histogramThreshold`\" pulumi-lang-dotnet=\"`HistogramThreshold`\" pulumi-lang-go=\"`histogramThreshold`\" pulumi-lang-python=\"`histogram_threshold`\" pulumi-lang-yaml=\"`histogramThreshold`\" pulumi-lang-java=\"`histogramThreshold`\"\u003e`histogram_threshold`\u003c/span\u003e (fraction of histogram observations past a threshold; uses \u003cspan pulumi-lang-nodejs=\"`threshold`\" pulumi-lang-dotnet=\"`Threshold`\" pulumi-lang-go=\"`threshold`\" pulumi-lang-python=\"`threshold`\" pulumi-lang-yaml=\"`threshold`\" pulumi-lang-java=\"`threshold`\"\u003e`threshold`\u003c/span\u003e and \u003cspan pulumi-lang-nodejs=\"`comparison`\" pulumi-lang-dotnet=\"`Comparison`\" pulumi-lang-go=\"`comparison`\" pulumi-lang-python=\"`comparison`\" pulumi-lang-yaml=\"`comparison`\" pulumi-lang-java=\"`comparison`\"\u003e`comparison`\u003c/span\u003e instead of \u003cspan pulumi-lang-nodejs=\"`badQuery`\" pulumi-lang-dotnet=\"`BadQuery`\" pulumi-lang-go=\"`badQuery`\" pulumi-lang-python=\"`bad_query`\" pulumi-lang-yaml=\"`badQuery`\" pulumi-lang-java=\"`badQuery`\"\u003e`bad_query`\u003c/span\u003e, and requires `source = \"metrics\"`). Ignored when `source = \"records\"`. Defaults to \u003cspan pulumi-lang-nodejs=\"`additive`\" pulumi-lang-dotnet=\"`Additive`\" pulumi-lang-go=\"`additive`\" pulumi-lang-python=\"`additive`\" pulumi-lang-yaml=\"`additive`\" pulumi-lang-java=\"`additive`\"\u003e`additive`\u003c/span\u003e.\n"
                },
                "name": {
                    "type": "string",
                    "description": "SLO name (unique per project).\n"
                },
                "pageChannelIds": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                },
                "projectId": {
                    "type": "string",
                    "description": "Project ID (UUID) used for SLO API paths.\n"
                },
                "rollingWindow": {
                    "type": "string",
                    "description": "Rolling evaluation window as a duration string (e.g. `\"24h\"`, `\"30d\"`). Must be between 1h and 90d. The API enforces a lower effective cap: the window cannot exceed your subscription plan's maximum SLO window, nor the project's data retention for the SLO source (\u003cspan pulumi-lang-nodejs=\"`records`\" pulumi-lang-dotnet=\"`Records`\" pulumi-lang-go=\"`records`\" pulumi-lang-python=\"`records`\" pulumi-lang-yaml=\"`records`\" pulumi-lang-java=\"`records`\"\u003e`records`\u003c/span\u003e or \u003cspan pulumi-lang-nodejs=\"`metrics`\" pulumi-lang-dotnet=\"`Metrics`\" pulumi-lang-go=\"`metrics`\" pulumi-lang-python=\"`metrics`\" pulumi-lang-yaml=\"`metrics`\" pulumi-lang-java=\"`metrics`\"\u003e`metrics`\u003c/span\u003e) — a longer window would compute against missing data. Requests over either cap are rejected with a validation error.\n"
                },
                "scopeKind": {
                    "type": "string",
                    "description": "What the SLO is anchored to: a service (\u003cspan pulumi-lang-nodejs=\"`service`\" pulumi-lang-dotnet=\"`Service`\" pulumi-lang-go=\"`service`\" pulumi-lang-python=\"`service`\" pulumi-lang-yaml=\"`service`\" pulumi-lang-java=\"`service`\"\u003e`service`\u003c/span\u003e) or an LLM provider (\u003cspan pulumi-lang-nodejs=\"`provider`\" pulumi-lang-dotnet=\"`Provider`\" pulumi-lang-go=\"`provider`\" pulumi-lang-python=\"`provider`\" pulumi-lang-yaml=\"`provider`\" pulumi-lang-java=\"`provider`\"\u003e`provider`\u003c/span\u003e). Defaults to \u003cspan pulumi-lang-nodejs=\"`service`\" pulumi-lang-dotnet=\"`Service`\" pulumi-lang-go=\"`service`\" pulumi-lang-python=\"`service`\" pulumi-lang-yaml=\"`service`\" pulumi-lang-java=\"`service`\"\u003e`service`\u003c/span\u003e. Changing it forces a new SLO.\n"
                },
                "scopeValue": {
                    "type": "string",
                    "description": "The service name (\u003cspan pulumi-lang-nodejs=\"`scopeKind \" pulumi-lang-dotnet=\"`ScopeKind \" pulumi-lang-go=\"`scopeKind \" pulumi-lang-python=\"`scope_kind \" pulumi-lang-yaml=\"`scopeKind \" pulumi-lang-java=\"`scopeKind \"\u003e`scope_kind \u003c/span\u003e= \"service\"`) or provider slug like \u003cspan pulumi-lang-nodejs=\"`openai`\" pulumi-lang-dotnet=\"`Openai`\" pulumi-lang-go=\"`openai`\" pulumi-lang-python=\"`openai`\" pulumi-lang-yaml=\"`openai`\" pulumi-lang-java=\"`openai`\"\u003e`openai`\u003c/span\u003e (\u003cspan pulumi-lang-nodejs=\"`scopeKind \" pulumi-lang-dotnet=\"`ScopeKind \" pulumi-lang-go=\"`scopeKind \" pulumi-lang-python=\"`scope_kind \" pulumi-lang-yaml=\"`scopeKind \" pulumi-lang-java=\"`scopeKind \"\u003e`scope_kind \u003c/span\u003e= \"provider\"`). Changing it forces a new SLO.\n"
                },
                "source": {
                    "type": "string",
                    "description": "Whether the SLO ratio is computed over span events (\u003cspan pulumi-lang-nodejs=\"`records`\" pulumi-lang-dotnet=\"`Records`\" pulumi-lang-go=\"`records`\" pulumi-lang-python=\"`records`\" pulumi-lang-yaml=\"`records`\" pulumi-lang-java=\"`records`\"\u003e`records`\u003c/span\u003e) or metric values (\u003cspan pulumi-lang-nodejs=\"`metrics`\" pulumi-lang-dotnet=\"`Metrics`\" pulumi-lang-go=\"`metrics`\" pulumi-lang-python=\"`metrics`\" pulumi-lang-yaml=\"`metrics`\" pulumi-lang-java=\"`metrics`\"\u003e`metrics`\u003c/span\u003e). Defaults to \u003cspan pulumi-lang-nodejs=\"`records`\" pulumi-lang-dotnet=\"`Records`\" pulumi-lang-go=\"`records`\" pulumi-lang-python=\"`records`\" pulumi-lang-yaml=\"`records`\" pulumi-lang-java=\"`records`\"\u003e`records`\u003c/span\u003e.\n"
                },
                "targetPercent": {
                    "type": "string",
                    "description": "Target percentage as a decimal string, exclusively between 0 and 100 (e.g. `\"99.9\"`).\n"
                },
                "threshold": {
                    "type": "string",
                    "description": "For \u003cspan pulumi-lang-nodejs=\"`metricAggregation \" pulumi-lang-dotnet=\"`MetricAggregation \" pulumi-lang-go=\"`metricAggregation \" pulumi-lang-python=\"`metric_aggregation \" pulumi-lang-yaml=\"`metricAggregation \" pulumi-lang-java=\"`metricAggregation \"\u003e`metric_aggregation \u003c/span\u003e= \u003cspan pulumi-lang-nodejs=\"\"histogramThreshold\"\" pulumi-lang-dotnet=\"\"HistogramThreshold\"\" pulumi-lang-go=\"\"histogramThreshold\"\" pulumi-lang-python=\"\"histogram_threshold\"\" pulumi-lang-yaml=\"\"histogramThreshold\"\" pulumi-lang-java=\"\"histogramThreshold\"\"\u003e\"histogram_threshold\"\u003c/span\u003e`: the cutoff in the metric's native unit, as a decimal string (e.g. `\"60000\"` on a `_ms` latency metric). Required for that mode, and must be omitted otherwise.\n"
                },
                "ticketChannelIds": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                },
                "totalQuery": {
                    "type": "string",
                    "description": "SQL boolean expression selecting all events counted by the SLO.\n"
                }
            },
            "required": [
                "metricAggregation",
                "name",
                "projectId",
                "rollingWindow",
                "scopeKind",
                "scopeValue",
                "source",
                "targetPercent",
                "totalQuery"
            ],
            "inputProperties": {
                "badQuery": {
                    "type": "string",
                    "description": "SQL boolean expression selecting the bad events counted by the SLO. Required for every mode except \u003cspan pulumi-lang-nodejs=\"`metricAggregation \" pulumi-lang-dotnet=\"`MetricAggregation \" pulumi-lang-go=\"`metricAggregation \" pulumi-lang-python=\"`metric_aggregation \" pulumi-lang-yaml=\"`metricAggregation \" pulumi-lang-java=\"`metricAggregation \"\u003e`metric_aggregation \u003c/span\u003e= \u003cspan pulumi-lang-nodejs=\"\"histogramThreshold\"\" pulumi-lang-dotnet=\"\"HistogramThreshold\"\" pulumi-lang-go=\"\"histogramThreshold\"\" pulumi-lang-python=\"\"histogram_threshold\"\" pulumi-lang-yaml=\"\"histogramThreshold\"\" pulumi-lang-java=\"\"histogramThreshold\"\"\u003e\"histogram_threshold\"\u003c/span\u003e`, which uses \u003cspan pulumi-lang-nodejs=\"`threshold`\" pulumi-lang-dotnet=\"`Threshold`\" pulumi-lang-go=\"`threshold`\" pulumi-lang-python=\"`threshold`\" pulumi-lang-yaml=\"`threshold`\" pulumi-lang-java=\"`threshold`\"\u003e`threshold`\u003c/span\u003e and \u003cspan pulumi-lang-nodejs=\"`comparison`\" pulumi-lang-dotnet=\"`Comparison`\" pulumi-lang-go=\"`comparison`\" pulumi-lang-python=\"`comparison`\" pulumi-lang-yaml=\"`comparison`\" pulumi-lang-java=\"`comparison`\"\u003e`comparison`\u003c/span\u003e instead.\n"
                },
                "comparison": {
                    "type": "string",
                    "description": "For \u003cspan pulumi-lang-nodejs=\"`metricAggregation \" pulumi-lang-dotnet=\"`MetricAggregation \" pulumi-lang-go=\"`metricAggregation \" pulumi-lang-python=\"`metric_aggregation \" pulumi-lang-yaml=\"`metricAggregation \" pulumi-lang-java=\"`metricAggregation \"\u003e`metric_aggregation \u003c/span\u003e= \u003cspan pulumi-lang-nodejs=\"\"histogramThreshold\"\" pulumi-lang-dotnet=\"\"HistogramThreshold\"\" pulumi-lang-go=\"\"histogramThreshold\"\" pulumi-lang-python=\"\"histogram_threshold\"\" pulumi-lang-yaml=\"\"histogramThreshold\"\" pulumi-lang-java=\"\"histogramThreshold\"\"\u003e\"histogram_threshold\"\u003c/span\u003e`: the good side of the \u003cspan pulumi-lang-nodejs=\"`threshold`\" pulumi-lang-dotnet=\"`Threshold`\" pulumi-lang-go=\"`threshold`\" pulumi-lang-python=\"`threshold`\" pulumi-lang-yaml=\"`threshold`\" pulumi-lang-java=\"`threshold`\"\u003e`threshold`\u003c/span\u003e. \u003cspan pulumi-lang-nodejs=\"`lessThan`\" pulumi-lang-dotnet=\"`LessThan`\" pulumi-lang-go=\"`lessThan`\" pulumi-lang-python=\"`less_than`\" pulumi-lang-yaml=\"`lessThan`\" pulumi-lang-java=\"`lessThan`\"\u003e`less_than`\u003c/span\u003e (good is below the threshold, the latency case) or \u003cspan pulumi-lang-nodejs=\"`greaterThan`\" pulumi-lang-dotnet=\"`GreaterThan`\" pulumi-lang-go=\"`greaterThan`\" pulumi-lang-python=\"`greater_than`\" pulumi-lang-yaml=\"`greaterThan`\" pulumi-lang-java=\"`greaterThan`\"\u003e`greater_than`\u003c/span\u003e. Required for that mode, and must be omitted otherwise.\n"
                },
                "description": {
                    "type": "string",
                    "description": "SLO description.\n"
                },
                "environments": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    },
                    "description": "Deployment environments the SLO is scoped to. Omit to cover all environments.\n"
                },
                "metricAggregation": {
                    "type": "string",
                    "description": "How a \u003cspan pulumi-lang-nodejs=\"`metrics`\" pulumi-lang-dotnet=\"`Metrics`\" pulumi-lang-go=\"`metrics`\" pulumi-lang-python=\"`metrics`\" pulumi-lang-yaml=\"`metrics`\" pulumi-lang-java=\"`metrics`\"\u003e`metrics`\u003c/span\u003e SLO aggregates its SLI: \u003cspan pulumi-lang-nodejs=\"`additive`\" pulumi-lang-dotnet=\"`Additive`\" pulumi-lang-go=\"`additive`\" pulumi-lang-python=\"`additive`\" pulumi-lang-yaml=\"`additive`\" pulumi-lang-java=\"`additive`\"\u003e`additive`\u003c/span\u003e (sum of scalar values, for delta-count metrics), \u003cspan pulumi-lang-nodejs=\"`gaugeFraction`\" pulumi-lang-dotnet=\"`GaugeFraction`\" pulumi-lang-go=\"`gaugeFraction`\" pulumi-lang-python=\"`gauge_fraction`\" pulumi-lang-yaml=\"`gaugeFraction`\" pulumi-lang-java=\"`gaugeFraction`\"\u003e`gauge_fraction`\u003c/span\u003e (fraction of samples meeting the condition, for gauges), \u003cspan pulumi-lang-nodejs=\"`counterRate`\" pulumi-lang-dotnet=\"`CounterRate`\" pulumi-lang-go=\"`counterRate`\" pulumi-lang-python=\"`counter_rate`\" pulumi-lang-yaml=\"`counterRate`\" pulumi-lang-java=\"`counterRate`\"\u003e`counter_rate`\u003c/span\u003e (sum of per-series increases, for cumulative counters), or \u003cspan pulumi-lang-nodejs=\"`histogramThreshold`\" pulumi-lang-dotnet=\"`HistogramThreshold`\" pulumi-lang-go=\"`histogramThreshold`\" pulumi-lang-python=\"`histogram_threshold`\" pulumi-lang-yaml=\"`histogramThreshold`\" pulumi-lang-java=\"`histogramThreshold`\"\u003e`histogram_threshold`\u003c/span\u003e (fraction of histogram observations past a threshold; uses \u003cspan pulumi-lang-nodejs=\"`threshold`\" pulumi-lang-dotnet=\"`Threshold`\" pulumi-lang-go=\"`threshold`\" pulumi-lang-python=\"`threshold`\" pulumi-lang-yaml=\"`threshold`\" pulumi-lang-java=\"`threshold`\"\u003e`threshold`\u003c/span\u003e and \u003cspan pulumi-lang-nodejs=\"`comparison`\" pulumi-lang-dotnet=\"`Comparison`\" pulumi-lang-go=\"`comparison`\" pulumi-lang-python=\"`comparison`\" pulumi-lang-yaml=\"`comparison`\" pulumi-lang-java=\"`comparison`\"\u003e`comparison`\u003c/span\u003e instead of \u003cspan pulumi-lang-nodejs=\"`badQuery`\" pulumi-lang-dotnet=\"`BadQuery`\" pulumi-lang-go=\"`badQuery`\" pulumi-lang-python=\"`bad_query`\" pulumi-lang-yaml=\"`badQuery`\" pulumi-lang-java=\"`badQuery`\"\u003e`bad_query`\u003c/span\u003e, and requires `source = \"metrics\"`). Ignored when `source = \"records\"`. Defaults to \u003cspan pulumi-lang-nodejs=\"`additive`\" pulumi-lang-dotnet=\"`Additive`\" pulumi-lang-go=\"`additive`\" pulumi-lang-python=\"`additive`\" pulumi-lang-yaml=\"`additive`\" pulumi-lang-java=\"`additive`\"\u003e`additive`\u003c/span\u003e.\n"
                },
                "name": {
                    "type": "string",
                    "description": "SLO name (unique per project).\n"
                },
                "pageChannelIds": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                },
                "projectId": {
                    "type": "string",
                    "description": "Project ID (UUID) used for SLO API paths.\n"
                },
                "rollingWindow": {
                    "type": "string",
                    "description": "Rolling evaluation window as a duration string (e.g. `\"24h\"`, `\"30d\"`). Must be between 1h and 90d. The API enforces a lower effective cap: the window cannot exceed your subscription plan's maximum SLO window, nor the project's data retention for the SLO source (\u003cspan pulumi-lang-nodejs=\"`records`\" pulumi-lang-dotnet=\"`Records`\" pulumi-lang-go=\"`records`\" pulumi-lang-python=\"`records`\" pulumi-lang-yaml=\"`records`\" pulumi-lang-java=\"`records`\"\u003e`records`\u003c/span\u003e or \u003cspan pulumi-lang-nodejs=\"`metrics`\" pulumi-lang-dotnet=\"`Metrics`\" pulumi-lang-go=\"`metrics`\" pulumi-lang-python=\"`metrics`\" pulumi-lang-yaml=\"`metrics`\" pulumi-lang-java=\"`metrics`\"\u003e`metrics`\u003c/span\u003e) — a longer window would compute against missing data. Requests over either cap are rejected with a validation error.\n"
                },
                "scopeKind": {
                    "type": "string",
                    "description": "What the SLO is anchored to: a service (\u003cspan pulumi-lang-nodejs=\"`service`\" pulumi-lang-dotnet=\"`Service`\" pulumi-lang-go=\"`service`\" pulumi-lang-python=\"`service`\" pulumi-lang-yaml=\"`service`\" pulumi-lang-java=\"`service`\"\u003e`service`\u003c/span\u003e) or an LLM provider (\u003cspan pulumi-lang-nodejs=\"`provider`\" pulumi-lang-dotnet=\"`Provider`\" pulumi-lang-go=\"`provider`\" pulumi-lang-python=\"`provider`\" pulumi-lang-yaml=\"`provider`\" pulumi-lang-java=\"`provider`\"\u003e`provider`\u003c/span\u003e). Defaults to \u003cspan pulumi-lang-nodejs=\"`service`\" pulumi-lang-dotnet=\"`Service`\" pulumi-lang-go=\"`service`\" pulumi-lang-python=\"`service`\" pulumi-lang-yaml=\"`service`\" pulumi-lang-java=\"`service`\"\u003e`service`\u003c/span\u003e. Changing it forces a new SLO.\n"
                },
                "scopeValue": {
                    "type": "string",
                    "description": "The service name (\u003cspan pulumi-lang-nodejs=\"`scopeKind \" pulumi-lang-dotnet=\"`ScopeKind \" pulumi-lang-go=\"`scopeKind \" pulumi-lang-python=\"`scope_kind \" pulumi-lang-yaml=\"`scopeKind \" pulumi-lang-java=\"`scopeKind \"\u003e`scope_kind \u003c/span\u003e= \"service\"`) or provider slug like \u003cspan pulumi-lang-nodejs=\"`openai`\" pulumi-lang-dotnet=\"`Openai`\" pulumi-lang-go=\"`openai`\" pulumi-lang-python=\"`openai`\" pulumi-lang-yaml=\"`openai`\" pulumi-lang-java=\"`openai`\"\u003e`openai`\u003c/span\u003e (\u003cspan pulumi-lang-nodejs=\"`scopeKind \" pulumi-lang-dotnet=\"`ScopeKind \" pulumi-lang-go=\"`scopeKind \" pulumi-lang-python=\"`scope_kind \" pulumi-lang-yaml=\"`scopeKind \" pulumi-lang-java=\"`scopeKind \"\u003e`scope_kind \u003c/span\u003e= \"provider\"`). Changing it forces a new SLO.\n"
                },
                "source": {
                    "type": "string",
                    "description": "Whether the SLO ratio is computed over span events (\u003cspan pulumi-lang-nodejs=\"`records`\" pulumi-lang-dotnet=\"`Records`\" pulumi-lang-go=\"`records`\" pulumi-lang-python=\"`records`\" pulumi-lang-yaml=\"`records`\" pulumi-lang-java=\"`records`\"\u003e`records`\u003c/span\u003e) or metric values (\u003cspan pulumi-lang-nodejs=\"`metrics`\" pulumi-lang-dotnet=\"`Metrics`\" pulumi-lang-go=\"`metrics`\" pulumi-lang-python=\"`metrics`\" pulumi-lang-yaml=\"`metrics`\" pulumi-lang-java=\"`metrics`\"\u003e`metrics`\u003c/span\u003e). Defaults to \u003cspan pulumi-lang-nodejs=\"`records`\" pulumi-lang-dotnet=\"`Records`\" pulumi-lang-go=\"`records`\" pulumi-lang-python=\"`records`\" pulumi-lang-yaml=\"`records`\" pulumi-lang-java=\"`records`\"\u003e`records`\u003c/span\u003e.\n"
                },
                "targetPercent": {
                    "type": "string",
                    "description": "Target percentage as a decimal string, exclusively between 0 and 100 (e.g. `\"99.9\"`).\n"
                },
                "threshold": {
                    "type": "string",
                    "description": "For \u003cspan pulumi-lang-nodejs=\"`metricAggregation \" pulumi-lang-dotnet=\"`MetricAggregation \" pulumi-lang-go=\"`metricAggregation \" pulumi-lang-python=\"`metric_aggregation \" pulumi-lang-yaml=\"`metricAggregation \" pulumi-lang-java=\"`metricAggregation \"\u003e`metric_aggregation \u003c/span\u003e= \u003cspan pulumi-lang-nodejs=\"\"histogramThreshold\"\" pulumi-lang-dotnet=\"\"HistogramThreshold\"\" pulumi-lang-go=\"\"histogramThreshold\"\" pulumi-lang-python=\"\"histogram_threshold\"\" pulumi-lang-yaml=\"\"histogramThreshold\"\" pulumi-lang-java=\"\"histogramThreshold\"\"\u003e\"histogram_threshold\"\u003c/span\u003e`: the cutoff in the metric's native unit, as a decimal string (e.g. `\"60000\"` on a `_ms` latency metric). Required for that mode, and must be omitted otherwise.\n"
                },
                "ticketChannelIds": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                },
                "totalQuery": {
                    "type": "string",
                    "description": "SQL boolean expression selecting all events counted by the SLO.\n"
                }
            },
            "requiredInputs": [
                "projectId",
                "rollingWindow",
                "scopeValue",
                "targetPercent",
                "totalQuery"
            ],
            "stateInputs": {
                "description": "Input properties used for looking up and filtering Slo resources.\n",
                "properties": {
                    "badQuery": {
                        "type": "string",
                        "description": "SQL boolean expression selecting the bad events counted by the SLO. Required for every mode except \u003cspan pulumi-lang-nodejs=\"`metricAggregation \" pulumi-lang-dotnet=\"`MetricAggregation \" pulumi-lang-go=\"`metricAggregation \" pulumi-lang-python=\"`metric_aggregation \" pulumi-lang-yaml=\"`metricAggregation \" pulumi-lang-java=\"`metricAggregation \"\u003e`metric_aggregation \u003c/span\u003e= \u003cspan pulumi-lang-nodejs=\"\"histogramThreshold\"\" pulumi-lang-dotnet=\"\"HistogramThreshold\"\" pulumi-lang-go=\"\"histogramThreshold\"\" pulumi-lang-python=\"\"histogram_threshold\"\" pulumi-lang-yaml=\"\"histogramThreshold\"\" pulumi-lang-java=\"\"histogramThreshold\"\"\u003e\"histogram_threshold\"\u003c/span\u003e`, which uses \u003cspan pulumi-lang-nodejs=\"`threshold`\" pulumi-lang-dotnet=\"`Threshold`\" pulumi-lang-go=\"`threshold`\" pulumi-lang-python=\"`threshold`\" pulumi-lang-yaml=\"`threshold`\" pulumi-lang-java=\"`threshold`\"\u003e`threshold`\u003c/span\u003e and \u003cspan pulumi-lang-nodejs=\"`comparison`\" pulumi-lang-dotnet=\"`Comparison`\" pulumi-lang-go=\"`comparison`\" pulumi-lang-python=\"`comparison`\" pulumi-lang-yaml=\"`comparison`\" pulumi-lang-java=\"`comparison`\"\u003e`comparison`\u003c/span\u003e instead.\n"
                    },
                    "comparison": {
                        "type": "string",
                        "description": "For \u003cspan pulumi-lang-nodejs=\"`metricAggregation \" pulumi-lang-dotnet=\"`MetricAggregation \" pulumi-lang-go=\"`metricAggregation \" pulumi-lang-python=\"`metric_aggregation \" pulumi-lang-yaml=\"`metricAggregation \" pulumi-lang-java=\"`metricAggregation \"\u003e`metric_aggregation \u003c/span\u003e= \u003cspan pulumi-lang-nodejs=\"\"histogramThreshold\"\" pulumi-lang-dotnet=\"\"HistogramThreshold\"\" pulumi-lang-go=\"\"histogramThreshold\"\" pulumi-lang-python=\"\"histogram_threshold\"\" pulumi-lang-yaml=\"\"histogramThreshold\"\" pulumi-lang-java=\"\"histogramThreshold\"\"\u003e\"histogram_threshold\"\u003c/span\u003e`: the good side of the \u003cspan pulumi-lang-nodejs=\"`threshold`\" pulumi-lang-dotnet=\"`Threshold`\" pulumi-lang-go=\"`threshold`\" pulumi-lang-python=\"`threshold`\" pulumi-lang-yaml=\"`threshold`\" pulumi-lang-java=\"`threshold`\"\u003e`threshold`\u003c/span\u003e. \u003cspan pulumi-lang-nodejs=\"`lessThan`\" pulumi-lang-dotnet=\"`LessThan`\" pulumi-lang-go=\"`lessThan`\" pulumi-lang-python=\"`less_than`\" pulumi-lang-yaml=\"`lessThan`\" pulumi-lang-java=\"`lessThan`\"\u003e`less_than`\u003c/span\u003e (good is below the threshold, the latency case) or \u003cspan pulumi-lang-nodejs=\"`greaterThan`\" pulumi-lang-dotnet=\"`GreaterThan`\" pulumi-lang-go=\"`greaterThan`\" pulumi-lang-python=\"`greater_than`\" pulumi-lang-yaml=\"`greaterThan`\" pulumi-lang-java=\"`greaterThan`\"\u003e`greater_than`\u003c/span\u003e. Required for that mode, and must be omitted otherwise.\n"
                    },
                    "description": {
                        "type": "string",
                        "description": "SLO description.\n"
                    },
                    "environments": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "description": "Deployment environments the SLO is scoped to. Omit to cover all environments.\n"
                    },
                    "metricAggregation": {
                        "type": "string",
                        "description": "How a \u003cspan pulumi-lang-nodejs=\"`metrics`\" pulumi-lang-dotnet=\"`Metrics`\" pulumi-lang-go=\"`metrics`\" pulumi-lang-python=\"`metrics`\" pulumi-lang-yaml=\"`metrics`\" pulumi-lang-java=\"`metrics`\"\u003e`metrics`\u003c/span\u003e SLO aggregates its SLI: \u003cspan pulumi-lang-nodejs=\"`additive`\" pulumi-lang-dotnet=\"`Additive`\" pulumi-lang-go=\"`additive`\" pulumi-lang-python=\"`additive`\" pulumi-lang-yaml=\"`additive`\" pulumi-lang-java=\"`additive`\"\u003e`additive`\u003c/span\u003e (sum of scalar values, for delta-count metrics), \u003cspan pulumi-lang-nodejs=\"`gaugeFraction`\" pulumi-lang-dotnet=\"`GaugeFraction`\" pulumi-lang-go=\"`gaugeFraction`\" pulumi-lang-python=\"`gauge_fraction`\" pulumi-lang-yaml=\"`gaugeFraction`\" pulumi-lang-java=\"`gaugeFraction`\"\u003e`gauge_fraction`\u003c/span\u003e (fraction of samples meeting the condition, for gauges), \u003cspan pulumi-lang-nodejs=\"`counterRate`\" pulumi-lang-dotnet=\"`CounterRate`\" pulumi-lang-go=\"`counterRate`\" pulumi-lang-python=\"`counter_rate`\" pulumi-lang-yaml=\"`counterRate`\" pulumi-lang-java=\"`counterRate`\"\u003e`counter_rate`\u003c/span\u003e (sum of per-series increases, for cumulative counters), or \u003cspan pulumi-lang-nodejs=\"`histogramThreshold`\" pulumi-lang-dotnet=\"`HistogramThreshold`\" pulumi-lang-go=\"`histogramThreshold`\" pulumi-lang-python=\"`histogram_threshold`\" pulumi-lang-yaml=\"`histogramThreshold`\" pulumi-lang-java=\"`histogramThreshold`\"\u003e`histogram_threshold`\u003c/span\u003e (fraction of histogram observations past a threshold; uses \u003cspan pulumi-lang-nodejs=\"`threshold`\" pulumi-lang-dotnet=\"`Threshold`\" pulumi-lang-go=\"`threshold`\" pulumi-lang-python=\"`threshold`\" pulumi-lang-yaml=\"`threshold`\" pulumi-lang-java=\"`threshold`\"\u003e`threshold`\u003c/span\u003e and \u003cspan pulumi-lang-nodejs=\"`comparison`\" pulumi-lang-dotnet=\"`Comparison`\" pulumi-lang-go=\"`comparison`\" pulumi-lang-python=\"`comparison`\" pulumi-lang-yaml=\"`comparison`\" pulumi-lang-java=\"`comparison`\"\u003e`comparison`\u003c/span\u003e instead of \u003cspan pulumi-lang-nodejs=\"`badQuery`\" pulumi-lang-dotnet=\"`BadQuery`\" pulumi-lang-go=\"`badQuery`\" pulumi-lang-python=\"`bad_query`\" pulumi-lang-yaml=\"`badQuery`\" pulumi-lang-java=\"`badQuery`\"\u003e`bad_query`\u003c/span\u003e, and requires `source = \"metrics\"`). Ignored when `source = \"records\"`. Defaults to \u003cspan pulumi-lang-nodejs=\"`additive`\" pulumi-lang-dotnet=\"`Additive`\" pulumi-lang-go=\"`additive`\" pulumi-lang-python=\"`additive`\" pulumi-lang-yaml=\"`additive`\" pulumi-lang-java=\"`additive`\"\u003e`additive`\u003c/span\u003e.\n"
                    },
                    "name": {
                        "type": "string",
                        "description": "SLO name (unique per project).\n"
                    },
                    "pageChannelIds": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "projectId": {
                        "type": "string",
                        "description": "Project ID (UUID) used for SLO API paths.\n"
                    },
                    "rollingWindow": {
                        "type": "string",
                        "description": "Rolling evaluation window as a duration string (e.g. `\"24h\"`, `\"30d\"`). Must be between 1h and 90d. The API enforces a lower effective cap: the window cannot exceed your subscription plan's maximum SLO window, nor the project's data retention for the SLO source (\u003cspan pulumi-lang-nodejs=\"`records`\" pulumi-lang-dotnet=\"`Records`\" pulumi-lang-go=\"`records`\" pulumi-lang-python=\"`records`\" pulumi-lang-yaml=\"`records`\" pulumi-lang-java=\"`records`\"\u003e`records`\u003c/span\u003e or \u003cspan pulumi-lang-nodejs=\"`metrics`\" pulumi-lang-dotnet=\"`Metrics`\" pulumi-lang-go=\"`metrics`\" pulumi-lang-python=\"`metrics`\" pulumi-lang-yaml=\"`metrics`\" pulumi-lang-java=\"`metrics`\"\u003e`metrics`\u003c/span\u003e) — a longer window would compute against missing data. Requests over either cap are rejected with a validation error.\n"
                    },
                    "scopeKind": {
                        "type": "string",
                        "description": "What the SLO is anchored to: a service (\u003cspan pulumi-lang-nodejs=\"`service`\" pulumi-lang-dotnet=\"`Service`\" pulumi-lang-go=\"`service`\" pulumi-lang-python=\"`service`\" pulumi-lang-yaml=\"`service`\" pulumi-lang-java=\"`service`\"\u003e`service`\u003c/span\u003e) or an LLM provider (\u003cspan pulumi-lang-nodejs=\"`provider`\" pulumi-lang-dotnet=\"`Provider`\" pulumi-lang-go=\"`provider`\" pulumi-lang-python=\"`provider`\" pulumi-lang-yaml=\"`provider`\" pulumi-lang-java=\"`provider`\"\u003e`provider`\u003c/span\u003e). Defaults to \u003cspan pulumi-lang-nodejs=\"`service`\" pulumi-lang-dotnet=\"`Service`\" pulumi-lang-go=\"`service`\" pulumi-lang-python=\"`service`\" pulumi-lang-yaml=\"`service`\" pulumi-lang-java=\"`service`\"\u003e`service`\u003c/span\u003e. Changing it forces a new SLO.\n"
                    },
                    "scopeValue": {
                        "type": "string",
                        "description": "The service name (\u003cspan pulumi-lang-nodejs=\"`scopeKind \" pulumi-lang-dotnet=\"`ScopeKind \" pulumi-lang-go=\"`scopeKind \" pulumi-lang-python=\"`scope_kind \" pulumi-lang-yaml=\"`scopeKind \" pulumi-lang-java=\"`scopeKind \"\u003e`scope_kind \u003c/span\u003e= \"service\"`) or provider slug like \u003cspan pulumi-lang-nodejs=\"`openai`\" pulumi-lang-dotnet=\"`Openai`\" pulumi-lang-go=\"`openai`\" pulumi-lang-python=\"`openai`\" pulumi-lang-yaml=\"`openai`\" pulumi-lang-java=\"`openai`\"\u003e`openai`\u003c/span\u003e (\u003cspan pulumi-lang-nodejs=\"`scopeKind \" pulumi-lang-dotnet=\"`ScopeKind \" pulumi-lang-go=\"`scopeKind \" pulumi-lang-python=\"`scope_kind \" pulumi-lang-yaml=\"`scopeKind \" pulumi-lang-java=\"`scopeKind \"\u003e`scope_kind \u003c/span\u003e= \"provider\"`). Changing it forces a new SLO.\n"
                    },
                    "source": {
                        "type": "string",
                        "description": "Whether the SLO ratio is computed over span events (\u003cspan pulumi-lang-nodejs=\"`records`\" pulumi-lang-dotnet=\"`Records`\" pulumi-lang-go=\"`records`\" pulumi-lang-python=\"`records`\" pulumi-lang-yaml=\"`records`\" pulumi-lang-java=\"`records`\"\u003e`records`\u003c/span\u003e) or metric values (\u003cspan pulumi-lang-nodejs=\"`metrics`\" pulumi-lang-dotnet=\"`Metrics`\" pulumi-lang-go=\"`metrics`\" pulumi-lang-python=\"`metrics`\" pulumi-lang-yaml=\"`metrics`\" pulumi-lang-java=\"`metrics`\"\u003e`metrics`\u003c/span\u003e). Defaults to \u003cspan pulumi-lang-nodejs=\"`records`\" pulumi-lang-dotnet=\"`Records`\" pulumi-lang-go=\"`records`\" pulumi-lang-python=\"`records`\" pulumi-lang-yaml=\"`records`\" pulumi-lang-java=\"`records`\"\u003e`records`\u003c/span\u003e.\n"
                    },
                    "targetPercent": {
                        "type": "string",
                        "description": "Target percentage as a decimal string, exclusively between 0 and 100 (e.g. `\"99.9\"`).\n"
                    },
                    "threshold": {
                        "type": "string",
                        "description": "For \u003cspan pulumi-lang-nodejs=\"`metricAggregation \" pulumi-lang-dotnet=\"`MetricAggregation \" pulumi-lang-go=\"`metricAggregation \" pulumi-lang-python=\"`metric_aggregation \" pulumi-lang-yaml=\"`metricAggregation \" pulumi-lang-java=\"`metricAggregation \"\u003e`metric_aggregation \u003c/span\u003e= \u003cspan pulumi-lang-nodejs=\"\"histogramThreshold\"\" pulumi-lang-dotnet=\"\"HistogramThreshold\"\" pulumi-lang-go=\"\"histogramThreshold\"\" pulumi-lang-python=\"\"histogram_threshold\"\" pulumi-lang-yaml=\"\"histogramThreshold\"\" pulumi-lang-java=\"\"histogramThreshold\"\"\u003e\"histogram_threshold\"\u003c/span\u003e`: the cutoff in the metric's native unit, as a decimal string (e.g. `\"60000\"` on a `_ms` latency metric). Required for that mode, and must be omitted otherwise.\n"
                    },
                    "ticketChannelIds": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "totalQuery": {
                        "type": "string",
                        "description": "SQL boolean expression selecting all events counted by the SLO.\n"
                    }
                },
                "type": "object"
            }
        },
        "logfire:index/writeToken:WriteToken": {
            "description": "## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as logfire from \"@pydantic/pulumi-logfire\";\n\nconst exampleProject = new logfire.Project(\"exampleProject\", {});\nconst exampleWriteToken = new logfire.WriteToken(\"exampleWriteToken\", {\n    projectId: exampleProject.id,\n    expiresAt: \"2099-12-31T23:59:59Z\",\n});\n```\n```python\nimport pulumi\nimport pulumi_logfire as logfire\n\nexample_project = logfire.Project(\"exampleProject\")\nexample_write_token = logfire.WriteToken(\"exampleWriteToken\",\n    project_id=example_project.id,\n    expires_at=\"2099-12-31T23:59:59Z\")\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Logfire = Pulumi.Logfire;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var exampleProject = new Logfire.Project(\"exampleProject\");\n\n    var exampleWriteToken = new Logfire.WriteToken(\"exampleWriteToken\", new()\n    {\n        ProjectId = exampleProject.Id,\n        ExpiresAt = \"2099-12-31T23:59:59Z\",\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n\t\"github.com/pydantic/pulumi-logfire/sdk/go/logfire\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\texampleProject, err := logfire.NewProject(ctx, \"exampleProject\", nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = logfire.NewWriteToken(ctx, \"exampleWriteToken\", \u0026logfire.WriteTokenArgs{\n\t\t\tProjectId: exampleProject.ID(),\n\t\t\tExpiresAt: pulumi.String(\"2099-12-31T23:59:59Z\"),\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.logfire.Project;\nimport com.pulumi.logfire.WriteToken;\nimport com.pulumi.logfire.WriteTokenArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        var exampleProject = new Project(\"exampleProject\");\n\n        var exampleWriteToken = new WriteToken(\"exampleWriteToken\", WriteTokenArgs.builder()\n            .projectId(exampleProject.id())\n            .expiresAt(\"2099-12-31T23:59:59Z\")\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  exampleProject:\n    type: logfire:Project\n  exampleWriteToken:\n    type: logfire:WriteToken\n    properties:\n      projectId: ${exampleProject.id}\n      expiresAt: 2099-12-31T23:59:59Z\n```\n\u003c!--End PulumiCodeChooser --\u003e\n",
            "properties": {
                "createdAt": {
                    "type": "string",
                    "description": "Timestamp when the token was created.\n"
                },
                "createdByName": {
                    "type": "string",
                    "description": "Display name of the user that created the token.\n"
                },
                "description": {
                    "type": "string",
                    "description": "Description is fixed to \"Created by Public API\" for provider-managed tokens.\n"
                },
                "expiresAt": {
                    "type": "string",
                    "description": "Optional RFC3339 expiration timestamp for the token (for example `2026-12-31T23:59:59Z`). If omitted, the token does not expire.\n"
                },
                "projectId": {
                    "type": "string",
                    "description": "UUID of the project that owns the token.\n"
                },
                "projectName": {
                    "type": "string",
                    "description": "Name of the project that owns the token.\n"
                },
                "token": {
                    "type": "string",
                    "description": "The generated write token. Only returned on creation.\n",
                    "secret": true
                },
                "tokenPrefix": {
                    "type": "string",
                    "description": "Prefix of the generated write token.\n"
                }
            },
            "required": [
                "createdAt",
                "createdByName",
                "description",
                "projectId",
                "projectName",
                "token",
                "tokenPrefix"
            ],
            "inputProperties": {
                "expiresAt": {
                    "type": "string",
                    "description": "Optional RFC3339 expiration timestamp for the token (for example `2026-12-31T23:59:59Z`). If omitted, the token does not expire.\n"
                },
                "projectId": {
                    "type": "string",
                    "description": "UUID of the project that owns the token.\n"
                }
            },
            "requiredInputs": [
                "projectId"
            ],
            "stateInputs": {
                "description": "Input properties used for looking up and filtering WriteToken resources.\n",
                "properties": {
                    "createdAt": {
                        "type": "string",
                        "description": "Timestamp when the token was created.\n"
                    },
                    "createdByName": {
                        "type": "string",
                        "description": "Display name of the user that created the token.\n"
                    },
                    "description": {
                        "type": "string",
                        "description": "Description is fixed to \"Created by Public API\" for provider-managed tokens.\n"
                    },
                    "expiresAt": {
                        "type": "string",
                        "description": "Optional RFC3339 expiration timestamp for the token (for example `2026-12-31T23:59:59Z`). If omitted, the token does not expire.\n"
                    },
                    "projectId": {
                        "type": "string",
                        "description": "UUID of the project that owns the token.\n"
                    },
                    "projectName": {
                        "type": "string",
                        "description": "Name of the project that owns the token.\n"
                    },
                    "token": {
                        "type": "string",
                        "description": "The generated write token. Only returned on creation.\n",
                        "secret": true
                    },
                    "tokenPrefix": {
                        "type": "string",
                        "description": "Prefix of the generated write token.\n"
                    }
                },
                "type": "object"
            }
        }
    },
    "functions": {
        "logfire:index/getPagerdutyService:getPagerdutyService": {
            "description": "Resolves a PagerDuty service approved through a Logfire connection to the IDs required by a `pagerduty-integration` channel. PagerDuty's external service ID is resolved to Logfire's internal installation and resource IDs. The provider API key requires the `organization:read_channel` scope.\n\n## Example Usage\n\n\u003c!--Start PulumiCodeChooser --\u003e\n```typescript\nimport * as pulumi from \"@pulumi/pulumi\";\nimport * as logfire from \"@pydantic/pulumi-logfire\";\n\nconst onCall = logfire.getPagerdutyService({\n    accountSubdomain: \"acme\",\n    region: \"us\",\n    pagerdutyServiceId: \"PABC123\",\n});\nconst pagerdutyApp = new logfire.Channel(\"pagerdutyApp\", {config: [{\n    type: \"pagerduty-integration\",\n    installId: onCall.then(onCall =\u003e onCall.installId),\n    serviceId: onCall.then(onCall =\u003e onCall.serviceId),\n}]});\n```\n```python\nimport pulumi\nimport pulumi_logfire as logfire\n\non_call = logfire.get_pagerduty_service(account_subdomain=\"acme\",\n    region=\"us\",\n    pagerduty_service_id=\"PABC123\")\npagerduty_app = logfire.Channel(\"pagerdutyApp\", config=[{\n    \"type\": \"pagerduty-integration\",\n    \"installId\": on_call.install_id,\n    \"serviceId\": on_call.service_id,\n}])\n```\n```csharp\nusing System.Collections.Generic;\nusing System.Linq;\nusing Pulumi;\nusing Logfire = Pulumi.Logfire;\n\nreturn await Deployment.RunAsync(() =\u003e \n{\n    var onCall = Logfire.GetPagerdutyService.Invoke(new()\n    {\n        AccountSubdomain = \"acme\",\n        Region = \"us\",\n        PagerdutyServiceId = \"PABC123\",\n    });\n\n    var pagerdutyApp = new Logfire.Channel(\"pagerdutyApp\", new()\n    {\n        Config = new[]\n        {\n            \n            {\n                { \"type\", \"pagerduty-integration\" },\n                { \"installId\", onCall.Apply(getPagerdutyServiceResult =\u003e getPagerdutyServiceResult.InstallId) },\n                { \"serviceId\", onCall.Apply(getPagerdutyServiceResult =\u003e getPagerdutyServiceResult.ServiceId) },\n            },\n        },\n    });\n\n});\n```\n```go\npackage main\n\nimport (\n\t\"github.com/pulumi/pulumi/sdk/v3/go/pulumi\"\n\t\"github.com/pydantic/pulumi-logfire/sdk/go/logfire\"\n)\n\nfunc main() {\n\tpulumi.Run(func(ctx *pulumi.Context) error {\n\t\tonCall, err := logfire.GetPagerdutyService(ctx, \u0026logfire.GetPagerdutyServiceArgs{\n\t\t\tAccountSubdomain:   \"acme\",\n\t\t\tRegion:             pulumi.StringRef(\"us\"),\n\t\t\tPagerdutyServiceId: \"PABC123\",\n\t\t}, nil)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t_, err = logfire.NewChannel(ctx, \"pagerdutyApp\", \u0026logfire.ChannelArgs{\n\t\t\tConfig: logfire.ChannelConfigArgs{\n\t\t\t\tmap[string]interface{}{\n\t\t\t\t\t\"type\":      \"pagerduty-integration\",\n\t\t\t\t\t\"installId\": onCall.InstallId,\n\t\t\t\t\t\"serviceId\": onCall.ServiceId,\n\t\t\t\t},\n\t\t\t},\n\t\t})\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn nil\n\t})\n}\n```\n```java\npackage generated_program;\n\nimport com.pulumi.Context;\nimport com.pulumi.Pulumi;\nimport com.pulumi.core.Output;\nimport com.pulumi.logfire.LogfireFunctions;\nimport com.pulumi.logfire.inputs.GetPagerdutyServiceArgs;\nimport com.pulumi.logfire.Channel;\nimport com.pulumi.logfire.ChannelArgs;\nimport java.util.List;\nimport java.util.ArrayList;\nimport java.util.Map;\nimport java.io.File;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\n\npublic class App {\n    public static void main(String[] args) {\n        Pulumi.run(App::stack);\n    }\n\n    public static void stack(Context ctx) {\n        final var onCall = LogfireFunctions.getPagerdutyService(GetPagerdutyServiceArgs.builder()\n            .accountSubdomain(\"acme\")\n            .region(\"us\")\n            .pagerdutyServiceId(\"PABC123\")\n            .build());\n\n        var pagerdutyApp = new Channel(\"pagerdutyApp\", ChannelArgs.builder()\n            .config(ChannelConfigArgs.builder()\n                .type(\"pagerduty-integration\")\n                .installId(onCall.installId())\n                .serviceId(onCall.serviceId())\n                .build())\n            .build());\n\n    }\n}\n```\n```yaml\nresources:\n  pagerdutyApp:\n    type: logfire:Channel\n    properties:\n      config:\n        - type: pagerduty-integration\n          installId: ${onCall.installId}\n          serviceId: ${onCall.serviceId}\nvariables:\n  onCall:\n    fn::invoke:\n      function: logfire:getPagerdutyService\n      arguments:\n        accountSubdomain: acme\n        region: us\n        pagerdutyServiceId: PABC123\n```\n\u003c!--End PulumiCodeChooser --\u003e\n",
            "inputs": {
                "description": "A collection of arguments for invoking getPagerdutyService.\n",
                "properties": {
                    "accountSubdomain": {
                        "type": "string",
                        "description": "PagerDuty account subdomain, such as \u003cspan pulumi-lang-nodejs=\"`acme`\" pulumi-lang-dotnet=\"`Acme`\" pulumi-lang-go=\"`acme`\" pulumi-lang-python=\"`acme`\" pulumi-lang-yaml=\"`acme`\" pulumi-lang-java=\"`acme`\"\u003e`acme`\u003c/span\u003e from `acme.pagerduty.com`.\n"
                    },
                    "pagerdutyServiceId": {
                        "type": "string",
                        "description": "PagerDuty's service ID, such as `PABC123`.\n"
                    },
                    "region": {
                        "type": "string",
                        "description": "PagerDuty account region (\u003cspan pulumi-lang-nodejs=\"`us`\" pulumi-lang-dotnet=\"`Us`\" pulumi-lang-go=\"`us`\" pulumi-lang-python=\"`us`\" pulumi-lang-yaml=\"`us`\" pulumi-lang-java=\"`us`\"\u003e`us`\u003c/span\u003e or \u003cspan pulumi-lang-nodejs=\"`eu`\" pulumi-lang-dotnet=\"`Eu`\" pulumi-lang-go=\"`eu`\" pulumi-lang-python=\"`eu`\" pulumi-lang-yaml=\"`eu`\" pulumi-lang-java=\"`eu`\"\u003e`eu`\u003c/span\u003e). Defaults to \u003cspan pulumi-lang-nodejs=\"`us`\" pulumi-lang-dotnet=\"`Us`\" pulumi-lang-go=\"`us`\" pulumi-lang-python=\"`us`\" pulumi-lang-yaml=\"`us`\" pulumi-lang-java=\"`us`\"\u003e`us`\u003c/span\u003e.\n"
                    }
                },
                "type": "object",
                "required": [
                    "accountSubdomain",
                    "pagerdutyServiceId"
                ]
            },
            "outputs": {
                "description": "A collection of values returned by getPagerdutyService.\n",
                "properties": {
                    "accountSubdomain": {
                        "type": "string",
                        "description": "PagerDuty account subdomain, such as \u003cspan pulumi-lang-nodejs=\"`acme`\" pulumi-lang-dotnet=\"`Acme`\" pulumi-lang-go=\"`acme`\" pulumi-lang-python=\"`acme`\" pulumi-lang-yaml=\"`acme`\" pulumi-lang-java=\"`acme`\"\u003e`acme`\u003c/span\u003e from `acme.pagerduty.com`.\n"
                    },
                    "id": {
                        "type": "string",
                        "description": "The provider-assigned unique ID for this managed resource."
                    },
                    "installId": {
                        "type": "string",
                        "description": "Internal Logfire installation UUID for `logfire_channel.config.install_id`.\n"
                    },
                    "pagerdutyServiceId": {
                        "type": "string",
                        "description": "PagerDuty's service ID, such as `PABC123`.\n"
                    },
                    "region": {
                        "type": "string",
                        "description": "PagerDuty account region (\u003cspan pulumi-lang-nodejs=\"`us`\" pulumi-lang-dotnet=\"`Us`\" pulumi-lang-go=\"`us`\" pulumi-lang-python=\"`us`\" pulumi-lang-yaml=\"`us`\" pulumi-lang-java=\"`us`\"\u003e`us`\u003c/span\u003e or \u003cspan pulumi-lang-nodejs=\"`eu`\" pulumi-lang-dotnet=\"`Eu`\" pulumi-lang-go=\"`eu`\" pulumi-lang-python=\"`eu`\" pulumi-lang-yaml=\"`eu`\" pulumi-lang-java=\"`eu`\"\u003e`eu`\u003c/span\u003e). Defaults to \u003cspan pulumi-lang-nodejs=\"`us`\" pulumi-lang-dotnet=\"`Us`\" pulumi-lang-go=\"`us`\" pulumi-lang-python=\"`us`\" pulumi-lang-yaml=\"`us`\" pulumi-lang-java=\"`us`\"\u003e`us`\u003c/span\u003e.\n"
                    },
                    "serviceId": {
                        "type": "string",
                        "description": "Internal Logfire resource UUID for `logfire_channel.config.service_id`.\n"
                    },
                    "serviceName": {
                        "type": "string",
                        "description": "PagerDuty service name.\n"
                    }
                },
                "type": "object",
                "required": [
                    "accountSubdomain",
                    "installId",
                    "pagerdutyServiceId",
                    "region",
                    "serviceId",
                    "serviceName",
                    "id"
                ]
            }
        },
        "pulumi:providers:logfire/terraformConfig": {
            "description": "This function returns a Terraform config object with terraform-namecased keys,to be used with the Terraform Module Provider.",
            "inputs": {
                "properties": {
                    "__self__": {
                        "type": "ref",
                        "$ref": "#/provider"
                    }
                },
                "type": "pulumi:providers:logfire/terraformConfig",
                "required": [
                    "__self__"
                ]
            },
            "outputs": {
                "properties": {
                    "result": {
                        "additionalProperties": {
                            "$ref": "pulumi.json#/Any"
                        },
                        "type": "object"
                    }
                },
                "required": [
                    "result"
                ],
                "type": "object"
            }
        }
    }
}