diff --git a/.github/workflows/check-openapi-spec.yml b/.github/workflows/check-openapi-spec.yml index 3d185da..73f1b75 100644 --- a/.github/workflows/check-openapi-spec.yml +++ b/.github/workflows/check-openapi-spec.yml @@ -2,7 +2,7 @@ name: Check OpenAPI Spec on: schedule: - - cron: '0 9 * * 1' # Weekly on Monday at 9am UTC + - cron: "0 9 * * 1" # Weekly on Monday at 9am UTC workflow_dispatch: permissions: @@ -14,39 +14,40 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 - - - name: Install the latest version of uv - uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e # v6 - with: - version: "latest" - enable-cache: true - - - name: Fetch latest spec and regenerate models - run: | - curl -sS https://api.vantage.sh/v2/oas_v3.json -o openapi_spec.json - uv run datamodel-codegen - - - name: Check for differences - id: diff - run: | - if [[ -n "$(git status --porcelain --untracked-files=all -- vantage_sdk/models/gen_models/)" ]]; then - echo "changed=true" >> "$GITHUB_OUTPUT" - else - echo "changed=false" >> "$GITHUB_OUTPUT" - fi - - - name: Create pull request - if: steps.diff.outputs.changed == 'true' - uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7 - with: - token: ${{ secrets.GITHUB_TOKEN }} - commit-message: "chore: update OpenAPI spec and regenerate models" - title: "chore: update OpenAPI spec and regenerate models" - body: | - The upstream Vantage OpenAPI spec has changed. This PR updates `openapi_spec.json` and regenerates the models in `vantage_sdk/models/gen_models/`. - - Please review the generated model changes for any breaking impacts. - branch: chore/update-openapi-spec - signoff: true - delete-branch: true \ No newline at end of file + - uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4 + + - name: Install the latest version of uv + uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e # v6 + with: + version: "latest" + enable-cache: true + + - name: Install just + uses: extractions/setup-just@53165ef7e734c5c07cb06b3c8e7b647c5aa16db3 # v4 + + - name: Fetch latest spec and regenerate models + run: just regenerate-models + + - name: Check for differences + id: diff + run: | + if [[ -n "$(git status --porcelain --untracked-files=all -- vantage_sdk/models/gen_models/)" ]]; then + echo "changed=true" >> "$GITHUB_OUTPUT" + else + echo "changed=false" >> "$GITHUB_OUTPUT" + fi + + - name: Create pull request + if: steps.diff.outputs.changed == 'true' + uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: "chore: update OpenAPI spec and regenerate models" + title: "chore: update OpenAPI spec and regenerate models" + body: | + The upstream Vantage OpenAPI spec has changed. This PR updates `openapi_spec.json` and regenerates the models in `vantage_sdk/models/gen_models/`. + + Please review the generated model changes for any breaking impacts. + branch: chore/update-openapi-spec + signoff: true + delete-branch: true diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 2ba9fa9..ad2f911 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -24,11 +24,14 @@ All tests are integration tests that call the actual Vantage API. For an SDK, th 2. Generate an API key from the Vantage console under Settings -> API Access Tokens 3. Copy your workspace token from the URL bar (the `wrkspc_*` value) or from Settings -> Workspaces 4. Copy `.sample.env` to `.env` at the project root and fill in the values: + ``` VANTAGE_API_KEY= WORKSPACE_TOKEN= ``` + 5. Verify the setup by running a single test against the live API: + ```bash just test tests/test_main.py::test_get_me ``` @@ -38,7 +41,7 @@ All tests are integration tests that call the actual Vantage API. For an SDK, th Use the `just` recipes to run tests locally or in CI: | Command | Description | -|---|---| +| --- | --- | | `just test` | Run tests against the live API | | `just test-vcr` | Run tests using recorded cassettes (no network) | | `just test-vcr-record` | Record cassettes for tests that don't have one yet | @@ -54,6 +57,7 @@ just test-vcr-rewrite tests/test_main.py::test_get_dashboard ``` Some tests require polling endpoints and take longer to complete: + - Run only slow tests: `just test -- -m slow` - Exclude slow tests: `just test -- -k 'not slow'` @@ -80,6 +84,7 @@ In CI (`noxfile.py`), when `CI=true` is set, VCR is auto-enabled with `--record- ### When to re-record cassettes Re-record cassettes when: + - You add a new test function (use `just test-vcr-record tests/test_main.py::test_your_new_test`) - An API response schema changes (use `just test-vcr-rewrite tests/test_main.py::test_affected_test`) - A fixture changes the request payload (field values, resource names, etc.) @@ -89,7 +94,7 @@ Re-record cassettes when: Releases are automated via [release-please](https://github.com/googleapis/release-please). PR titles must use [Conventional Commits](https://www.conventionalcommits.org/) prefixes, and PRs must be squash-merged so the title becomes the commit message. | Prefix | Version bump | Example | -|---|---|---| +| --- | --- | --- | | `fix:` | Patch (1.1.1 -> 1.1.2) | `fix: handle null chart_settings in cost reports` | | `feat:` | Minor (1.1.1 -> 1.2.0) | `feat: add dashboard endpoints` | | `feat!:` | Major (1.1.1 -> 2.0.0) | `feat!: rename VantageSDK to VantageClient` | @@ -104,6 +109,7 @@ When commits land on `main`, release-please opens (or updates) a Release PR that > **Important:** Do not manually edit files in `vantage_sdk/models/gen_models/`. Any changes will be overwritten when models are regenerated. If you encounter type issues, bugs in the generated models, or need to extend functionality: + 1. Overload the class in `vantage_sdk/models/common.py` by inheriting from the generated model. 2. Add your overrides (using `# pyright: ignore[reportIncompatibleVariableOverride]` if changing types). 3. Import your new class in `vantage_sdk/models/__init__.py` so it overrides the generated version in the package interface. @@ -113,7 +119,22 @@ See `vantage_sdk/models/common.py` for detailed instructions and examples. To regenerate the models: ```bash -just generate-models +just regenerate-models ``` This fetches the latest OpenAPI spec from `https://api.vantage.sh/v2/oas_v3.json` and generates Pydantic v2 models. + +### Name collisions in generated models + +We do not control the upstream spec, and sometimes it forces `datamodel-codegen` to mangle names. When two schemas resolve to the same class name, codegen deduplicates by appending a numeric suffix, and the wildcard re-exports in `gen_models/__init__.py` mangle both colliding names. + +Example: the spec defines the virtual tag value object twice — once inline in `createVirtualTagConfig.values` / `updateVirtualTagConfig.values`, and once as the named schemas `createVirtualTagConfigValue` / `updateVirtualTagConfigValue` (used by the standalone `/virtual_tag_configs/{token}/values` endpoints). Both resolve to `CreateVirtualTagConfigValue` / `UpdateVirtualTagConfigValue`, so codegen emits `*_value1_*` modules for one of the twins, and the package-level exports become `UpdateVirtualTagConfigValueUpdateVirtualTagConfigValue` and `UpdateVirtualTagConfigValue1UpdateVirtualTagConfigValue` — the plain name disappears from the public interface entirely. + +When this happens, do not edit the generated files. Pin a stable alias in `vantage_sdk/models/common.py` that imports the correct class from its specific module and re-export it in `vantage_sdk/models/__init__.py`: + +```python +# common.py — pin the public name to the model referenced by UpdateVirtualTagConfig.values +UpdateVirtualTagConfigValue = update_virtual_tag_config_value_model.UpdateVirtualTagConfigValue +``` + +The collisions disappear on their own if the upstream spec is fixed to `$ref` the shared schema instead of duplicating it inline; the alias keeps working either way. diff --git a/justfile b/justfile index 3b80f2a..b804b78 100644 --- a/justfile +++ b/justfile @@ -44,11 +44,6 @@ setup: # --- Code Generation --- -generate-models: - uv run datamodel-codegen \ - --url https://api.vantage.sh/v2/oas_v3.json \ - --output vantage_sdk/models/gen_models/ - fetch-spec: curl -sS https://api.vantage.sh/v2/oas_v3.json -o openapi_spec.json diff --git a/tests/cassettes/test_anomaly_notification_with_different_threshold.yaml b/tests/cassettes/test_anomaly_notification_with_different_threshold.yaml index 62ea304..8d768c5 100644 --- a/tests/cassettes/test_anomaly_notification_with_different_threshold.yaml +++ b/tests/cassettes/test_anomaly_notification_with_different_threshold.yaml @@ -21,8 +21,8 @@ interactions: uri: https://api.vantage.sh/v2/cost_reports response: body: - string: '{"token":"rprt_3d65f0787f8de5e9","title":"test_cost_report_vcr","folder_token":null,"saved_filter_tokens":[],"business_metric_tokens_with_metadata":[],"filter":"costs.provider - = ''aws''","groupings":"provider,service","settings":{"include_credits":true,"include_refunds":true,"include_discounts":true,"include_tax":true,"amortize":true,"unallocated":false,"aggregate_by":"cost","show_previous_period":true},"created_at":"2026-02-08T18:32:16Z","workspace_token":"wrkspc_576fafc861f024a4","previous_period_start_date":null,"previous_period_end_date":null,"start_date":"2025-11-01","end_date":"2026-02-06","date_interval":"last_3_months","chart_type":"line","date_bin":"month","chart_settings":{"y_axis_dimension":"cost","x_axis_dimension":["date"]}}' + string: '{"token":"rprt_c4e599377977d997","title":"test_cost_report_vcr","folder_token":null,"saved_filter_tokens":[],"business_metric_tokens_with_metadata":[],"default_forecast":{"kind":"baseline"},"filter":"costs.provider + = ''aws''","groupings":"provider,service","settings":{"include_credits":true,"include_refunds":true,"include_discounts":true,"include_tax":true,"amortize":true,"unallocated":false,"aggregate_by":"cost","show_previous_period":true,"complete_period":false},"created_at":"2026-08-18T18:05:39Z","workspace_token":"wrkspc_576fafc861f024a4","previous_period_start_date":null,"previous_period_end_date":null,"start_date":"2026-05-01","end_date":"2026-08-16","date_interval":"last_3_months","chart_type":"line","date_bin":"month","chart_settings":{"y_axis_dimension":"cost","x_axis_dimension":["date"]}}' headers: Access-Control-Allow-Origin: - '*' @@ -33,17 +33,17 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json ETag: - - W/"c3030e5cef5760a35f539e270b701d64" + - W/"6e3a19ab8ff65032c692fc2456273db9" Set-Cookie: - - _stratus_session=rcTvq%2Fdl2%2F3eDnJPXNE%2BFUGtCaAg79KU705sw4EnQttzuzuvoDcZIJDkg%2BJiknLS40kTsjSBKML3QVsUCW6uEJfZizP0%2Bl%2BEkG4mUR0gLoCX551TlBL%2BFsLqsmuknB1zxVd%2FKQlisPOoHFuDi6y0%2FAXDD5aGsFdi%2BNtKj1SuCiFWunx3JgpkFCpw%2Fq%2BeEd%2BgUA4avbDMjE8%3D--lT9qVicIZbvUGqeC--bTPAViX9avmVGnAWcdF%2B0A%3D%3D; + - _stratus_session=tQ%2FhfZBD0W%2BDFVjlVzjuYjY%2BKjqf8qyYGPt7uBFZqbwBzXUx8bBdCK75K8ogDy8KdEdkgKyU137lXvtZLL1thSKHHXuXdAHswhaWye%2BOAXFPJ%2FeTXFmaVcQmuiJGy7dPxoqgXAPoNQYxBymfL0vBrpVx6zaWqTmHNtvsGNHGCIx8Kbl9%2BeU%2BBnhPxYWEAEAoI6%2BvdOpLhvA%3D--W29HncSp36i3wm4I--nSCdetAOF2yN86l8TFuNQQ%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -52,18 +52,18 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '357' + - '982' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.353831' + - '0.405066' content-length: - - '745' + - '808' status: code: 201 message: Created - request: - body: '{"cost_report_token":"rprt_3d65f0787f8de5e9","threshold":2000,"recipient_channels":["#test-anomaly-notifications"]}' + body: '{"cost_report_token":"rprt_c4e599377977d997","threshold":2000,"recipient_channels":["#test-anomaly-notifications"]}' headers: Accept: - application/json @@ -76,7 +76,7 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=rcTvq%2Fdl2%2F3eDnJPXNE%2BFUGtCaAg79KU705sw4EnQttzuzuvoDcZIJDkg%2BJiknLS40kTsjSBKML3QVsUCW6uEJfZizP0%2Bl%2BEkG4mUR0gLoCX551TlBL%2BFsLqsmuknB1zxVd%2FKQlisPOoHFuDi6y0%2FAXDD5aGsFdi%2BNtKj1SuCiFWunx3JgpkFCpw%2Fq%2BeEd%2BgUA4avbDMjE8%3D--lT9qVicIZbvUGqeC--bTPAViX9avmVGnAWcdF%2B0A%3D%3D + - _stratus_session=tQ%2FhfZBD0W%2BDFVjlVzjuYjY%2BKjqf8qyYGPt7uBFZqbwBzXUx8bBdCK75K8ogDy8KdEdkgKyU137lXvtZLL1thSKHHXuXdAHswhaWye%2BOAXFPJ%2FeTXFmaVcQmuiJGy7dPxoqgXAPoNQYxBymfL0vBrpVx6zaWqTmHNtvsGNHGCIx8Kbl9%2BeU%2BBnhPxYWEAEAoI6%2BvdOpLhvA%3D--W29HncSp36i3wm4I--nSCdetAOF2yN86l8TFuNQQ%3D%3D Host: - api.vantage.sh User-Agent: @@ -85,7 +85,7 @@ interactions: uri: https://api.vantage.sh/v2/anomaly_notifications response: body: - string: '{"token":"rprt_alrt_907d1589528a13cc","cost_report_token":"rprt_3d65f0787f8de5e9","created_at":"2026-02-08T18:32:17Z","updated_at":"2026-02-08T18:32:17Z","threshold":2000,"user_tokens":[],"recipient_channels":[]}' + string: '{"token":"rprt_alrt_a387ddb77ed328f0","cost_report_token":"rprt_c4e599377977d997","created_at":"2026-08-18T18:05:40Z","updated_at":"2026-08-18T18:05:40Z","threshold":2000,"user_tokens":[],"recipient_emails":[],"recipient_channels":[]}' headers: Access-Control-Allow-Origin: - '*' @@ -96,17 +96,17 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json ETag: - - W/"5a19ff283ebdccf20e61f5c9452ad30d" + - W/"ce6be04602b7ee64ae9f5023aca7deff" Set-Cookie: - - _stratus_session=gXefDrnCsEDlxsYRFW4pcGTWhoj0nrXp96Bvgz3WSdm9ghybqMmV1TmqXBhCSmO3X28yHq3%2FzBd14Ei8LWaqsJebEOF75RMiIpMxPlkbt7UQ7Y%2FFDjgvl6j5ASUbIZBnMQmuuxmbs1S0DhkzF8aM4p9fbmSrPBMcwdIPfMrac2C3i1GDYw5Ej2WyWKc2jrTHbUm%2F03k3KZc%3D--Pg4gSYnyP0g3cp2o--e5md26FNxE4m%2BKZ0UpTqCw%3D%3D; + - _stratus_session=8%2FEZ2WYwaeXMHJUKb97JQK0CbJ7YD79yzd7npKbWm9H2yGAYE0QsgLehLNVi5jkgJNW2IP1byCq%2BBvmDBzHC92LJWGx%2Bvm9ArspaERm3cU4ub019Q6hS3NByd1FPHCGAZZVvslkhEdOzvLnFCr6WUXfu1hebFcPEl0QKBs7A78UWippPwKOLBXOHcO8dApglM2lB%2F3L6W20%3D--%2FqNQLqo7pup%2BFYT6--Ipreb1jxMrPV7qAsKLR2Yw%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -115,13 +115,13 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '356' + - '981' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.113727' + - '0.131239' content-length: - - '212' + - '234' status: code: 201 message: Created @@ -137,13 +137,13 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=gXefDrnCsEDlxsYRFW4pcGTWhoj0nrXp96Bvgz3WSdm9ghybqMmV1TmqXBhCSmO3X28yHq3%2FzBd14Ei8LWaqsJebEOF75RMiIpMxPlkbt7UQ7Y%2FFDjgvl6j5ASUbIZBnMQmuuxmbs1S0DhkzF8aM4p9fbmSrPBMcwdIPfMrac2C3i1GDYw5Ej2WyWKc2jrTHbUm%2F03k3KZc%3D--Pg4gSYnyP0g3cp2o--e5md26FNxE4m%2BKZ0UpTqCw%3D%3D + - _stratus_session=8%2FEZ2WYwaeXMHJUKb97JQK0CbJ7YD79yzd7npKbWm9H2yGAYE0QsgLehLNVi5jkgJNW2IP1byCq%2BBvmDBzHC92LJWGx%2Bvm9ArspaERm3cU4ub019Q6hS3NByd1FPHCGAZZVvslkhEdOzvLnFCr6WUXfu1hebFcPEl0QKBs7A78UWippPwKOLBXOHcO8dApglM2lB%2F3L6W20%3D--%2FqNQLqo7pup%2BFYT6--Ipreb1jxMrPV7qAsKLR2Yw%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: DELETE - uri: https://api.vantage.sh/v2/anomaly_notifications/rprt_alrt_907d1589528a13cc + uri: https://api.vantage.sh/v2/anomaly_notifications/rprt_alrt_a387ddb77ed328f0 response: body: string: '' @@ -157,24 +157,24 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Set-Cookie: - - _stratus_session=K4CemELLAZ3Bl%2Bga%2FFrPBeNdJfYbNQ0Eygs5kcoqARojasFk27OC2SF8k%2FsEqd2RUJ88rqhnzL0q7lLWcxdkuGhGkVkE7I8li4L0A%2FW6X3UNWTAK0LaLYAs8tRPMtK7xwDh9wA9yNeMYoEE3bFBCchMgxD2QRBRmeEMtyxRuFvFmnA9mb2AmE1EnOWZMAWubvx6ADzBiKR8%3D--6gnSQfU50ZJ%2BiY53--TTO9Khy7aIlSp18mOPRLxA%3D%3D; + - _stratus_session=%2FSUutw5FnNhDii19%2BFcpaFReauNqLy%2BntncyGsuCz1AMB5uj%2FjvhZm1uHfd5ugYxqL17LTMTMi9iJULrC4UwKBVEBp%2BPr1RJVHitPPXW9Juv8cd%2F5513yplqhE0jutIh68INkhYNq3kBZv4NH7uO4nXiytehKJocZRcs8ex0FN%2BfUSylnCMJtWbk7705%2FSGfu0wxnccKOlM%3D--QubMd00bkLw2q8vV--ayGgTei8udhLay8OK%2Fk7Pw%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '355' + - '980' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.042498' + - '0.083206' status: code: 204 message: No Content @@ -190,16 +190,16 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=K4CemELLAZ3Bl%2Bga%2FFrPBeNdJfYbNQ0Eygs5kcoqARojasFk27OC2SF8k%2FsEqd2RUJ88rqhnzL0q7lLWcxdkuGhGkVkE7I8li4L0A%2FW6X3UNWTAK0LaLYAs8tRPMtK7xwDh9wA9yNeMYoEE3bFBCchMgxD2QRBRmeEMtyxRuFvFmnA9mb2AmE1EnOWZMAWubvx6ADzBiKR8%3D--6gnSQfU50ZJ%2BiY53--TTO9Khy7aIlSp18mOPRLxA%3D%3D + - _stratus_session=%2FSUutw5FnNhDii19%2BFcpaFReauNqLy%2BntncyGsuCz1AMB5uj%2FjvhZm1uHfd5ugYxqL17LTMTMi9iJULrC4UwKBVEBp%2BPr1RJVHitPPXW9Juv8cd%2F5513yplqhE0jutIh68INkhYNq3kBZv4NH7uO4nXiytehKJocZRcs8ex0FN%2BfUSylnCMJtWbk7705%2FSGfu0wxnccKOlM%3D--QubMd00bkLw2q8vV--ayGgTei8udhLay8OK%2Fk7Pw%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: GET - uri: https://api.vantage.sh/v2/anomaly_notifications/rprt_alrt_907d1589528a13cc + uri: https://api.vantage.sh/v2/anomaly_notifications/rprt_alrt_a387ddb77ed328f0 response: body: - string: '{"errors":["Anomaly Notification rprt_alrt_907d1589528a13cc not found."]}' + string: '{"errors":["Anomaly Notification rprt_alrt_a387ddb77ed328f0 not found."]}' headers: Access-Control-Allow-Origin: - '*' @@ -210,15 +210,15 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json Set-Cookie: - - _stratus_session=t9PPWi4a8Opk%2FIyhX8vg%2F6dH0W0eBsrtsV17fV46EDV9P3EEfH1jdGTwY6hTcXw7YPgFeqniT6SA863wVvI9s398ym2GjT%2Btm4rwRaG5ZA9qGIEMinrYjKR3uaPsWazX%2BhrT3Rnb4J0SFqGa0D%2FH6sHelt2Nav%2F0c7R5f%2BAtcPS4s2zQ02F09MJoiVqZ11mddqnzuHZr3is%3D--g5sb%2FWmCiKiha%2FYN--EBpFpZhtUTnLcjwsVsvKHQ%3D%3D; + - _stratus_session=nidhxQN5%2BwYfGFhxc9I1ZfM5SESFkQXAvlODJqqFu%2Fk%2Biuz0bU8rjtyHMbyj72teptUnARDQtUssoQiaKz4IZlRvFJtKqGcb%2BV4WYbPns4TWbdlcyezmEb4QN2%2BA6fFOrvXXqD5RVrISxc%2B2XoVNup0WpAzcK4Cvfpv2xE%2FNQaz04V9bijbvcXABOvidcOndBp%2F8a51glm0%3D--x0ex9tlhOFWnJagQ--jsC3b9OntwLo6JZVP0h8wg%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -229,11 +229,11 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '354' + - '979' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.050935' + - '0.038999' content-length: - '73' status: @@ -251,13 +251,13 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=t9PPWi4a8Opk%2FIyhX8vg%2F6dH0W0eBsrtsV17fV46EDV9P3EEfH1jdGTwY6hTcXw7YPgFeqniT6SA863wVvI9s398ym2GjT%2Btm4rwRaG5ZA9qGIEMinrYjKR3uaPsWazX%2BhrT3Rnb4J0SFqGa0D%2FH6sHelt2Nav%2F0c7R5f%2BAtcPS4s2zQ02F09MJoiVqZ11mddqnzuHZr3is%3D--g5sb%2FWmCiKiha%2FYN--EBpFpZhtUTnLcjwsVsvKHQ%3D%3D + - _stratus_session=nidhxQN5%2BwYfGFhxc9I1ZfM5SESFkQXAvlODJqqFu%2Fk%2Biuz0bU8rjtyHMbyj72teptUnARDQtUssoQiaKz4IZlRvFJtKqGcb%2BV4WYbPns4TWbdlcyezmEb4QN2%2BA6fFOrvXXqD5RVrISxc%2B2XoVNup0WpAzcK4Cvfpv2xE%2FNQaz04V9bijbvcXABOvidcOndBp%2F8a51glm0%3D--x0ex9tlhOFWnJagQ--jsC3b9OntwLo6JZVP0h8wg%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: DELETE - uri: https://api.vantage.sh/v2/cost_reports/rprt_3d65f0787f8de5e9 + uri: https://api.vantage.sh/v2/cost_reports/rprt_c4e599377977d997 response: body: string: '' @@ -271,24 +271,24 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Set-Cookie: - - _stratus_session=5i5xHYODmhZHUz7P4NAI7MUgpBfMH00AFYBae%2FbMjuxiK8kQSaqUgAtp2ox85Cn1LPBXufe6WInuHvw%2B0Tfc1F6Ju%2FR%2By5aMryB3WONwgrO60tau5CYKe2rg4dSNtVsEqCfQTYEtP8z%2Fm1cFpjAW3w2lN1vGAmAWqZM19G7uBoOmng2hWso1xd%2FIplFp50icBcGtxQ2Rw3M%3D--qh%2BxZ9jhh%2BZC1CWV--W%2FP%2F2d5sD%2FOTviKEmvwtAg%3D%3D; + - _stratus_session=Mq4U9bcuDnOXH%2Bz1dlo04Jt8XZ7qyG2xzstSgexw8c%2BqoQlEioK7DZWfwizPRrsigI%2F4%2BsnQsFAMtuHlNG8sSuguQBvVEI%2FeV7r4RUna5asJAzl%2FJ2ERU3G3x%2BjF%2B8qyidqCtwHd3fz5Xa1H1wOqLEWKzeiTESHsktNZb8faay3d92lnHV%2FmGWEe9ijGyftETMFuGyLXOSM%3D--5cbQjc9sWWVw1M%2FE--1yKo9s5ndmsAOnYW%2BMqwnQ%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '353' + - '978' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.070853' + - '0.160643' status: code: 204 message: No Content @@ -304,16 +304,16 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=5i5xHYODmhZHUz7P4NAI7MUgpBfMH00AFYBae%2FbMjuxiK8kQSaqUgAtp2ox85Cn1LPBXufe6WInuHvw%2B0Tfc1F6Ju%2FR%2By5aMryB3WONwgrO60tau5CYKe2rg4dSNtVsEqCfQTYEtP8z%2Fm1cFpjAW3w2lN1vGAmAWqZM19G7uBoOmng2hWso1xd%2FIplFp50icBcGtxQ2Rw3M%3D--qh%2BxZ9jhh%2BZC1CWV--W%2FP%2F2d5sD%2FOTviKEmvwtAg%3D%3D + - _stratus_session=Mq4U9bcuDnOXH%2Bz1dlo04Jt8XZ7qyG2xzstSgexw8c%2BqoQlEioK7DZWfwizPRrsigI%2F4%2BsnQsFAMtuHlNG8sSuguQBvVEI%2FeV7r4RUna5asJAzl%2FJ2ERU3G3x%2BjF%2B8qyidqCtwHd3fz5Xa1H1wOqLEWKzeiTESHsktNZb8faay3d92lnHV%2FmGWEe9ijGyftETMFuGyLXOSM%3D--5cbQjc9sWWVw1M%2FE--1yKo9s5ndmsAOnYW%2BMqwnQ%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: GET - uri: https://api.vantage.sh/v2/cost_reports/rprt_3d65f0787f8de5e9 + uri: https://api.vantage.sh/v2/cost_reports/rprt_c4e599377977d997 response: body: - string: '{"errors":["CostReport rprt_3d65f0787f8de5e9 not found."]}' + string: '{"errors":["CostReport rprt_c4e599377977d997 not found."]}' headers: Access-Control-Allow-Origin: - '*' @@ -324,15 +324,15 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json Set-Cookie: - - _stratus_session=fsSUcGogG4nG%2B7dTbVthXnOBhC89K12fiE9XyMeBoR0Tsw4ZcvgR7vHFodqf8lhtzYn5CA0bt1EQCAQLnLwh69wEqG604TauIqaVQ4BsgV61CUOKZsEKONr6s4GAT%2FQFIOGWj%2Bqm6YpaB98MMayj0K1NAqER2fHzZqe723bHjyt07if0m%2BcCAJhEkPJdl2aBXTySJhPhBkc%3D--4LdAq8iDKLfHYj3G--cPIilbFJpzEYwp6PgXIquw%3D%3D; + - _stratus_session=YpM7grbcYP8nXZ6jpYEL%2F2X5UMhIcQ0tmpVGXfukypIWozwJcfHmsMPSVAgaVKAHZwlUh78pgcETrRbWJQ%2FOtGJazlOsoCBX5los%2Bp2Tpu9eOFEUOpiwpScaJCsGZYmj4ZdmDh4U%2FkHruvQUHQJxDaj5DpxDIoEsRLVbDqCxi0TO73v63HM3PNF%2BL8aV8gA6XOCukninaD8%3D--pC8tSQ8osrrh6I3C--hnbRv2J%2FFiVVfG7y4UNZ0g%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -345,9 +345,9 @@ interactions: X-Rate-Limit-Remaining: - '10000' X-Rate-Limit-Reset: - - '1770579139' + - '1787079942' X-Runtime: - - '0.026266' + - '0.034250' content-length: - '58' status: diff --git a/tests/cassettes/test_get_all_virtual_tags.yaml b/tests/cassettes/test_get_all_virtual_tags.yaml index 88a2d09..95d4dd9 100644 --- a/tests/cassettes/test_get_all_virtual_tags.yaml +++ b/tests/cassettes/test_get_all_virtual_tags.yaml @@ -1,6 +1,6 @@ interactions: - request: - body: '{"key":"test_vtag_vcr","overridable":false,"backfill_until":"2026-07-14","collapsed_tag_keys":[{"key":"team","providers":["aws"]}],"values":[{"filter":"costs.provider + body: '{"key":"test_vtag_vcr","overridable":false,"backfill_until":"2026-08-18","collapsed_tag_keys":[{"key":"team","providers":["aws"]}],"values":[{"filter":"costs.provider = ''aws''","name":"Primary"}]}' headers: Accept: @@ -21,7 +21,7 @@ interactions: uri: https://api.vantage.sh/v2/virtual_tag_configs response: body: - string: '{"token":"vtag_59745793610aeba5","created_by_token":"team_ef9127d498c66db2","key":"test_vtag_vcr","overridable":false,"backfill_until":"2026-07-01","collapsed_tag_keys":[{"key":"team","providers":["aws"],"filter":null}],"values":[{"filter":"costs.provider + string: '{"token":"vtag_d2f6741c6405a8ea","created_by_token":"team_ef9127d498c66db2","key":"test_vtag_vcr","hidden":false,"preferred":false,"overridable":false,"backfill_until":"2026-08-01","collapsed_tag_keys":[{"key":"team","providers":["aws"],"filter":null}],"values":[{"token":"vtag_val_b707c91b335d1f56","filter":"costs.provider = ''aws''","name":"Primary","label_transforms":[],"percentages":[],"date_ranges":[]}]}' headers: Access-Control-Allow-Origin: @@ -37,13 +37,13 @@ interactions: https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' - https: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json ETag: - - W/"2b3dd8c10d5b7f8f0e2766e6faf861cb" + - W/"2aceb2bb24ff85370234d9b1a6d801ab" Set-Cookie: - - _stratus_session=fDjyGhFySon6hqd5CM6qXJG3NC0zd7Mig0uC%2B4uHREQjGd%2BijZJVohFg4tqr9iJo%2F0vjXo0AvWHvgDP0FB%2BNR0Prq43qG47u3eOt0oi7JNMUdIcc0lc3JFaxi9tMhjWwZfAsAFogqlOC5F9%2FfCN6ORtDMRi3sjajkTgoOdKelxTqDOz1cJu8mtR6oHDCInfg6GqHxeAjRwo%3D--W6l1JvzNw%2BjgRYEJ--8%2FUPPWHV0GApFNcgH%2FEXiw%3D%3D; + - _stratus_session=iV6Fj8MIvGb%2B3p6Kk7fQ2Cw4mAY5k3WJ09Mi7imQoGLPhfFBx7hse7CKnme0qxj9IUF%2B7snJOESK%2FXc%2BXFn3gNurcalWhVTc84nYj2E8T1RVspSEe4kRAMHg6k0mIlkZmNelXpOu9cGO%2FQ1MYpHY%2FNbnMaXtiCkx8xswJVbTNzGQ2WrMkARFdO%2F74PcqABHu72H%2BKOEwwGQ%3D--fk2W4h4R%2BAWdQTDG--S4EmgGObqGaIlZePBwnPRA%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -52,13 +52,13 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '999' + - '992' X-Rate-Limit-Reset: - - '1784092011' + - '1787079927' X-Runtime: - - '0.438707' + - '0.485884' content-length: - - '340' + - '409' status: code: 201 message: Created @@ -74,7 +74,7 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=fDjyGhFySon6hqd5CM6qXJG3NC0zd7Mig0uC%2B4uHREQjGd%2BijZJVohFg4tqr9iJo%2F0vjXo0AvWHvgDP0FB%2BNR0Prq43qG47u3eOt0oi7JNMUdIcc0lc3JFaxi9tMhjWwZfAsAFogqlOC5F9%2FfCN6ORtDMRi3sjajkTgoOdKelxTqDOz1cJu8mtR6oHDCInfg6GqHxeAjRwo%3D--W6l1JvzNw%2BjgRYEJ--8%2FUPPWHV0GApFNcgH%2FEXiw%3D%3D + - _stratus_session=iV6Fj8MIvGb%2B3p6Kk7fQ2Cw4mAY5k3WJ09Mi7imQoGLPhfFBx7hse7CKnme0qxj9IUF%2B7snJOESK%2FXc%2BXFn3gNurcalWhVTc84nYj2E8T1RVspSEe4kRAMHg6k0mIlkZmNelXpOu9cGO%2FQ1MYpHY%2FNbnMaXtiCkx8xswJVbTNzGQ2WrMkARFdO%2F74PcqABHu72H%2BKOEwwGQ%3D--fk2W4h4R%2BAWdQTDG--S4EmgGObqGaIlZePBwnPRA%3D%3D Host: - api.vantage.sh User-Agent: @@ -83,7 +83,7 @@ interactions: uri: https://api.vantage.sh/v2/virtual_tag_configs?q=test_vtag_vcr response: body: - string: '{"virtual_tag_configs":[{"token":"vtag_59745793610aeba5","created_by_token":"team_ef9127d498c66db2","key":"test_vtag_vcr","overridable":false,"backfill_until":"2026-07-01","collapsed_tag_keys":[{"key":"team","providers":["aws"],"filter":null}],"values":[{"filter":"costs.provider + string: '{"virtual_tag_configs":[{"token":"vtag_d2f6741c6405a8ea","created_by_token":"team_ef9127d498c66db2","key":"test_vtag_vcr","hidden":false,"preferred":false,"overridable":false,"backfill_until":"2026-08-01","collapsed_tag_keys":[{"key":"team","providers":["aws"],"filter":null}],"values":[{"token":"vtag_val_b707c91b335d1f56","filter":"costs.provider = ''aws''","name":"Primary","label_transforms":[],"percentages":[],"date_ranges":[]}]}]}' headers: Access-Control-Allow-Origin: @@ -99,13 +99,13 @@ interactions: https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' - https: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json ETag: - - W/"71f6e261bbb9049d6ebd8ebdb0006413" + - W/"20931b38f7995440cf96fb11589047ef" Set-Cookie: - - _stratus_session=BOszLlFuJsFmjQjzcEPZO0n30MB8uNAl6doraERTnCoMpEouml3mumvZIj%2B4I2SI34YnUR4HaS47TwYk4twPen35kUmm3KtjOS%2FIpSaKs6VAoA%2BzKxZQKq2it%2BQEiZDIGaFvmSdzlo2j9PomRkfHTYW9lQNgYEc%2BoDyThgc0MggcO%2BiX%2Fc8NzdU06BUtyfGsRB5xHr9unD8%3D--aMEpnRQGgJVIRFAx--byuJ6MZyUhron5ICKjeeAQ%3D%3D; + - _stratus_session=ql9sANXm1%2FYIp0bghLjsyu7TDjOcMjS4s88BCY0u5PaKHDdaEoHerf3ybyY7rR978DY7KZuAAZS2iAt%2F1bdv9L8V5Xdaus6d39pUgQU90Ztkpb199dxDm8rNptP2KGR1mwEiw0IEJwqlFPdsZlKMaP%2BbLO9XXDA8tnWez5xWat%2BDKoHVW8XZWAjPJkFFW4Rt6Y100%2FX9Rrw%3D--1bGYFbNlNO2EN%2F7u--f83oREJp2GF5E915atmOMQ%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -114,13 +114,13 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '998' + - '991' X-Rate-Limit-Reset: - - '1784092011' + - '1787079927' X-Runtime: - - '0.074795' + - '0.074806' content-length: - - '366' + - '435' status: code: 200 message: OK @@ -136,13 +136,13 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=BOszLlFuJsFmjQjzcEPZO0n30MB8uNAl6doraERTnCoMpEouml3mumvZIj%2B4I2SI34YnUR4HaS47TwYk4twPen35kUmm3KtjOS%2FIpSaKs6VAoA%2BzKxZQKq2it%2BQEiZDIGaFvmSdzlo2j9PomRkfHTYW9lQNgYEc%2BoDyThgc0MggcO%2BiX%2Fc8NzdU06BUtyfGsRB5xHr9unD8%3D--aMEpnRQGgJVIRFAx--byuJ6MZyUhron5ICKjeeAQ%3D%3D + - _stratus_session=ql9sANXm1%2FYIp0bghLjsyu7TDjOcMjS4s88BCY0u5PaKHDdaEoHerf3ybyY7rR978DY7KZuAAZS2iAt%2F1bdv9L8V5Xdaus6d39pUgQU90Ztkpb199dxDm8rNptP2KGR1mwEiw0IEJwqlFPdsZlKMaP%2BbLO9XXDA8tnWez5xWat%2BDKoHVW8XZWAjPJkFFW4Rt6Y100%2FX9Rrw%3D--1bGYFbNlNO2EN%2F7u--f83oREJp2GF5E915atmOMQ%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: DELETE - uri: https://api.vantage.sh/v2/virtual_tag_configs/vtag_59745793610aeba5 + uri: https://api.vantage.sh/v2/virtual_tag_configs/vtag_d2f6741c6405a8ea response: body: string: '' @@ -160,20 +160,20 @@ interactions: https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' - https: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Set-Cookie: - - _stratus_session=WA33mb%2BttialgHSCb3fH5kr%2FWaof6BgP3QWTrK1PZfYNYE6reqzyveDSwq3e%2Bo7q%2B2mBhhfGuWTEic4Ubzo0Dx1v2ZwGsAmEXF5bXST%2BrZqgg6EO5JZW2sF%2Bafxa7qin%2FG6v1DJWXZHYWPJqLGHnWa7Tc%2BTqoIaRZnPvj%2FOq7LLyBFOlLt%2FhhD7pBSCnwMXv%2F0U%2B1gUTQRA%3D--MnGNhi%2BCD42nuING--Y5BE1QGusucy7LPtgQHw2w%3D%3D; + - _stratus_session=dlOdMs9JEa0uVHgQY7QmuLRlg2%2FjDGET8pdWj55mnqXMpDmyABep5rj1KKVTtt7qDQPrajyfShDqUPg0otPHHI8H4f9oRPnbg7zZfYJWzlc4by16WVt0lZcnHx4nHInY4WyO8uz3IGO6MgoBKQGDiBCdw8rUf%2BNFAhP8vYWY8LeN43Q6nPSYSkSLIgyUt%2B43en%2Flep8AgXw%3D--eelj97PyuJPEWphH--n30552gPIbhOET67P8cn8Q%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '997' + - '990' X-Rate-Limit-Reset: - - '1784092011' + - '1787079927' X-Runtime: - - '0.368633' + - '0.348322' status: code: 204 message: No Content @@ -189,16 +189,16 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=WA33mb%2BttialgHSCb3fH5kr%2FWaof6BgP3QWTrK1PZfYNYE6reqzyveDSwq3e%2Bo7q%2B2mBhhfGuWTEic4Ubzo0Dx1v2ZwGsAmEXF5bXST%2BrZqgg6EO5JZW2sF%2Bafxa7qin%2FG6v1DJWXZHYWPJqLGHnWa7Tc%2BTqoIaRZnPvj%2FOq7LLyBFOlLt%2FhhD7pBSCnwMXv%2F0U%2B1gUTQRA%3D--MnGNhi%2BCD42nuING--Y5BE1QGusucy7LPtgQHw2w%3D%3D + - _stratus_session=dlOdMs9JEa0uVHgQY7QmuLRlg2%2FjDGET8pdWj55mnqXMpDmyABep5rj1KKVTtt7qDQPrajyfShDqUPg0otPHHI8H4f9oRPnbg7zZfYJWzlc4by16WVt0lZcnHx4nHInY4WyO8uz3IGO6MgoBKQGDiBCdw8rUf%2BNFAhP8vYWY8LeN43Q6nPSYSkSLIgyUt%2B43en%2Flep8AgXw%3D--eelj97PyuJPEWphH--n30552gPIbhOET67P8cn8Q%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: GET - uri: https://api.vantage.sh/v2/virtual_tag_configs/vtag_59745793610aeba5 + uri: https://api.vantage.sh/v2/virtual_tag_configs/vtag_d2f6741c6405a8ea response: body: - string: '{"errors":["VirtualTagConfig vtag_59745793610aeba5 not found."]}' + string: '{"errors":["VirtualTagConfig vtag_d2f6741c6405a8ea not found."]}' headers: Access-Control-Allow-Origin: - '*' @@ -213,11 +213,11 @@ interactions: https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' - https: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json Set-Cookie: - - _stratus_session=Uiwb4d9kN%2Fy66NqGIvoPHrQ4PfLi7BXJ98z05voCfH8LD68WmGZey3bTDJwUiWZvPpLI8UZt3FKz6CwLwulUTo6IsfaUuYzvwljegpDGH27s50TG04ElPhXWmcTmEhn0udRI4g3LRjCfwGVDTczsqCPDiX%2Fs2IJ6NbCqZEG%2Fz4RoOvuoWwKRC2%2FVaITMyi%2F1bVO08naw7nY%3D--N9kDnhAhUrTeh8B3--oLuWI3krItCfgqfKpRURKw%3D%3D; + - _stratus_session=feIhe9b%2Bc%2Fs3t1UhdTqSKq4RdYBYblyL1P9QS9VYvF0Pc%2FKEbz6xRthtwAOjPiHD9m%2F9irR%2BEdFNkL%2Bs7PBUB7wGGLWzIlzod0qTpqtraGcp%2Fj%2BTBmCUtECeLK90rj8el6gQ963M0g0rpZhHIihIfmDAiMd4fZOK0YGKdXkXcB0h1EyN4pqlonoKjVL4yInSBcvW73%2BMB9U%3D--qIVScvo%2F1yVv3DrX--jDKwTdZ7NDvcteukfLGhQQ%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -228,11 +228,11 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '996' + - '989' X-Rate-Limit-Reset: - - '1784092011' + - '1787079927' X-Runtime: - - '0.034807' + - '0.047470' content-length: - '64' status: diff --git a/tests/cassettes/test_get_anomaly_notification.yaml b/tests/cassettes/test_get_anomaly_notification.yaml index 3c9ae6f..79b34bf 100644 --- a/tests/cassettes/test_get_anomaly_notification.yaml +++ b/tests/cassettes/test_get_anomaly_notification.yaml @@ -21,8 +21,8 @@ interactions: uri: https://api.vantage.sh/v2/cost_reports response: body: - string: '{"token":"rprt_8f9228a3eff34f54","title":"test_cost_report_vcr","folder_token":null,"saved_filter_tokens":[],"business_metric_tokens_with_metadata":[],"filter":"costs.provider - = ''aws''","groupings":"provider,service","settings":{"include_credits":true,"include_refunds":true,"include_discounts":true,"include_tax":true,"amortize":true,"unallocated":false,"aggregate_by":"cost","show_previous_period":true},"created_at":"2026-02-08T18:32:14Z","workspace_token":"wrkspc_576fafc861f024a4","previous_period_start_date":null,"previous_period_end_date":null,"start_date":"2025-11-01","end_date":"2026-02-06","date_interval":"last_3_months","chart_type":"line","date_bin":"month","chart_settings":{"y_axis_dimension":"cost","x_axis_dimension":["date"]}}' + string: '{"token":"rprt_72064348da8e66ac","title":"test_cost_report_vcr","folder_token":null,"saved_filter_tokens":[],"business_metric_tokens_with_metadata":[],"default_forecast":{"kind":"baseline"},"filter":"costs.provider + = ''aws''","groupings":"provider,service","settings":{"include_credits":true,"include_refunds":true,"include_discounts":true,"include_tax":true,"amortize":true,"unallocated":false,"aggregate_by":"cost","show_previous_period":true,"complete_period":false},"created_at":"2026-08-18T18:05:35Z","workspace_token":"wrkspc_576fafc861f024a4","previous_period_start_date":null,"previous_period_end_date":null,"start_date":"2026-05-01","end_date":"2026-08-16","date_interval":"last_3_months","chart_type":"line","date_bin":"month","chart_settings":{"y_axis_dimension":"cost","x_axis_dimension":["date"]}}' headers: Access-Control-Allow-Origin: - '*' @@ -33,17 +33,17 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json ETag: - - W/"f1267ab682d2cbd549544c2ca5b8eb3b" + - W/"aaba65611f546dac80501a1c067950d0" Set-Cookie: - - _stratus_session=H0MXo7n5Js%2FIi4OCatFJ7JSD6qc8nyyXK5Jow2YTmptp%2BpAEHdBa906rB8Gl4andPQ80sNUUTOiTGKy41tsnlWb15cgkV2c0QmLs%2FJ3RT3RvpnuUt%2B9Kjo5xkJjENRH2IHdPT0Ce0iD9KA4%2F8AvTRHGD4jnmVeBlfxl7Rp%2Bhm436gjSGeqk7RCPzstRcOTc4lHaHrjqS1oU%3D--%2B2FdPNg3N5hmgIdV--B80lDzKylwXgBi4t61s%2FHg%3D%3D; + - _stratus_session=0LG9wuRC7FV6zwbsNrYmMAJXTkd1FkGsvV4kNULa8KJWOeB%2FNLWi09y7Grocu26o4BLH6ZJuHsfralsvoODIMjYd%2BOS7AJnP8b%2Ft9UcLDIykkXZu9rykSUQvFi9%2BPTBj7zk60ro9FQMZviir0jNiy8qSWx6GZW2e1vY75IfCClcoD1qvYOnQQCAsiSFgDkvHMmE9fvERbjA%3D--aZXEeOIEwYh6qH4S--jC8O1FSVQsvzjsaAah4SpQ%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -52,18 +52,18 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '363' + - '988' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.387462' + - '0.323223' content-length: - - '745' + - '808' status: code: 201 message: Created - request: - body: '{"cost_report_token":"rprt_8f9228a3eff34f54","threshold":1000,"recipient_channels":["#test-anomaly-notifications"]}' + body: '{"cost_report_token":"rprt_72064348da8e66ac","threshold":1000,"recipient_channels":["#test-anomaly-notifications"]}' headers: Accept: - application/json @@ -76,7 +76,7 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=H0MXo7n5Js%2FIi4OCatFJ7JSD6qc8nyyXK5Jow2YTmptp%2BpAEHdBa906rB8Gl4andPQ80sNUUTOiTGKy41tsnlWb15cgkV2c0QmLs%2FJ3RT3RvpnuUt%2B9Kjo5xkJjENRH2IHdPT0Ce0iD9KA4%2F8AvTRHGD4jnmVeBlfxl7Rp%2Bhm436gjSGeqk7RCPzstRcOTc4lHaHrjqS1oU%3D--%2B2FdPNg3N5hmgIdV--B80lDzKylwXgBi4t61s%2FHg%3D%3D + - _stratus_session=0LG9wuRC7FV6zwbsNrYmMAJXTkd1FkGsvV4kNULa8KJWOeB%2FNLWi09y7Grocu26o4BLH6ZJuHsfralsvoODIMjYd%2BOS7AJnP8b%2Ft9UcLDIykkXZu9rykSUQvFi9%2BPTBj7zk60ro9FQMZviir0jNiy8qSWx6GZW2e1vY75IfCClcoD1qvYOnQQCAsiSFgDkvHMmE9fvERbjA%3D--aZXEeOIEwYh6qH4S--jC8O1FSVQsvzjsaAah4SpQ%3D%3D Host: - api.vantage.sh User-Agent: @@ -85,7 +85,7 @@ interactions: uri: https://api.vantage.sh/v2/anomaly_notifications response: body: - string: '{"token":"rprt_alrt_c856800a3b819af3","cost_report_token":"rprt_8f9228a3eff34f54","created_at":"2026-02-08T18:32:14Z","updated_at":"2026-02-08T18:32:14Z","threshold":1000,"user_tokens":[],"recipient_channels":[]}' + string: '{"token":"rprt_alrt_c5b92dcf36cf6bf4","cost_report_token":"rprt_72064348da8e66ac","created_at":"2026-08-18T18:05:36Z","updated_at":"2026-08-18T18:05:36Z","threshold":1000,"user_tokens":[],"recipient_emails":[],"recipient_channels":[]}' headers: Access-Control-Allow-Origin: - '*' @@ -96,17 +96,17 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json ETag: - - W/"3397470926830f075f7c2c8e3d9e928e" + - W/"8814062d6d9aa3d1114f78c955918db6" Set-Cookie: - - _stratus_session=gO2aTUCiOQ3x28Xl1%2BhzXD8ikly%2FAdQSR3Tpnb6gGvtbw9XOAe4FpFTRcsuQgiu7UgKUvH5xwnTCA1pY%2B6dwVYh2n5aIJrX%2FZo3kY1VRVnpKy3MkijvUapzRclv4eD0rxV20Iuc0VyivPyyS6W938%2B8TyBq1%2BDjZvSMEbKo7KsIdKn9l%2F%2BlRvpuMkQByBsFuj9q%2FKvE%2FYes%3D--WUZ7yZLiB%2F295Qi8--c3wAjwVsdZUbgRVXbFiR9A%3D%3D; + - _stratus_session=anITWVw94KN3rEhZlztTtP4Y2yTWimYML8jxOyL98T0t7hcqlOgGTFE%2BM23w3%2BvKrQsq5pS8lTwIc20NiEL2edvtPZG1vWz7VySbRtKN9q4LvsPBLnWxrnJywNr3Qi3HhvLoQ6BF0SGJGhvbAk9vvWhxByc8%2F58ANf1tL%2B23MTtZ55xHES4s%2Fk%2FOODHg%2FmBtAZ2kXb4UspU%3D--Ls02ANLmFW%2FlB0f9--nwVSh1AFzHkdJ8YT%2FsRfwQ%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -115,13 +115,13 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '362' + - '987' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.103929' + - '0.186207' content-length: - - '212' + - '234' status: code: 201 message: Created @@ -137,16 +137,16 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=gO2aTUCiOQ3x28Xl1%2BhzXD8ikly%2FAdQSR3Tpnb6gGvtbw9XOAe4FpFTRcsuQgiu7UgKUvH5xwnTCA1pY%2B6dwVYh2n5aIJrX%2FZo3kY1VRVnpKy3MkijvUapzRclv4eD0rxV20Iuc0VyivPyyS6W938%2B8TyBq1%2BDjZvSMEbKo7KsIdKn9l%2F%2BlRvpuMkQByBsFuj9q%2FKvE%2FYes%3D--WUZ7yZLiB%2F295Qi8--c3wAjwVsdZUbgRVXbFiR9A%3D%3D + - _stratus_session=anITWVw94KN3rEhZlztTtP4Y2yTWimYML8jxOyL98T0t7hcqlOgGTFE%2BM23w3%2BvKrQsq5pS8lTwIc20NiEL2edvtPZG1vWz7VySbRtKN9q4LvsPBLnWxrnJywNr3Qi3HhvLoQ6BF0SGJGhvbAk9vvWhxByc8%2F58ANf1tL%2B23MTtZ55xHES4s%2Fk%2FOODHg%2FmBtAZ2kXb4UspU%3D--Ls02ANLmFW%2FlB0f9--nwVSh1AFzHkdJ8YT%2FsRfwQ%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: GET - uri: https://api.vantage.sh/v2/anomaly_notifications/rprt_alrt_c856800a3b819af3 + uri: https://api.vantage.sh/v2/anomaly_notifications/rprt_alrt_c5b92dcf36cf6bf4 response: body: - string: '{"token":"rprt_alrt_c856800a3b819af3","cost_report_token":"rprt_8f9228a3eff34f54","created_at":"2026-02-08T18:32:14Z","updated_at":"2026-02-08T18:32:14Z","threshold":1000,"user_tokens":[],"recipient_channels":[]}' + string: '{"token":"rprt_alrt_c5b92dcf36cf6bf4","cost_report_token":"rprt_72064348da8e66ac","created_at":"2026-08-18T18:05:36Z","updated_at":"2026-08-18T18:05:36Z","threshold":1000,"user_tokens":[],"recipient_emails":[],"recipient_channels":[]}' headers: Access-Control-Allow-Origin: - '*' @@ -157,17 +157,17 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json ETag: - - W/"d567a21bd2326544ad57dc11e5c6006b" + - W/"b8b5739660710b053ef2cf86098f8922" Set-Cookie: - - _stratus_session=QMor5gek8TRUNpwFLBEEMdTNPKOvGSJ8WE7%2BCrRkS3Ijl2FxoeuiYfvrI51T3%2BwhcVqcQBPlhj%2FuZeTfnzHL8VO%2FucfYHkx2QLuKlE26xjR9i7cmhwJfKdpVGdlElzkAZ6FBSSTkg%2BWyIldw1qZ85GOYCutwol62jKfBi%2BiNAsmaXezQmBPu38N6NjaU1MhLJfx6ZRX94TU%3D--G%2BWMEJ20%2FK3zXkys--wNL6fEmBt%2Bxuv8llWN3IKQ%3D%3D; + - _stratus_session=U9k8bCaKsJyxqJG40bHoRK9TtXmqKmyBBUFvofzEki3e7SKWNCYauTLkhySRdJXT7cFcRrCgB06%2BWLhamdO18k9ZWDsUEEfTv%2F4pJC7HYwKHI%2BRba7eZijA8nyIcz7n42%2FgQ6oj7WRt6oelOzpg5v6FzOmhGtpuUXx0K9wA4rgBqIPpsrPnlDWrBvhWoJh1GJ9PXwPhqbRI%3D--v%2FFbpPb12iQs7m20--5mRITBnLYjk1bdwq55NxHQ%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -176,13 +176,13 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '361' + - '986' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.059552' + - '0.066006' content-length: - - '212' + - '234' status: code: 200 message: OK @@ -198,13 +198,13 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=QMor5gek8TRUNpwFLBEEMdTNPKOvGSJ8WE7%2BCrRkS3Ijl2FxoeuiYfvrI51T3%2BwhcVqcQBPlhj%2FuZeTfnzHL8VO%2FucfYHkx2QLuKlE26xjR9i7cmhwJfKdpVGdlElzkAZ6FBSSTkg%2BWyIldw1qZ85GOYCutwol62jKfBi%2BiNAsmaXezQmBPu38N6NjaU1MhLJfx6ZRX94TU%3D--G%2BWMEJ20%2FK3zXkys--wNL6fEmBt%2Bxuv8llWN3IKQ%3D%3D + - _stratus_session=U9k8bCaKsJyxqJG40bHoRK9TtXmqKmyBBUFvofzEki3e7SKWNCYauTLkhySRdJXT7cFcRrCgB06%2BWLhamdO18k9ZWDsUEEfTv%2F4pJC7HYwKHI%2BRba7eZijA8nyIcz7n42%2FgQ6oj7WRt6oelOzpg5v6FzOmhGtpuUXx0K9wA4rgBqIPpsrPnlDWrBvhWoJh1GJ9PXwPhqbRI%3D--v%2FFbpPb12iQs7m20--5mRITBnLYjk1bdwq55NxHQ%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: DELETE - uri: https://api.vantage.sh/v2/anomaly_notifications/rprt_alrt_c856800a3b819af3 + uri: https://api.vantage.sh/v2/anomaly_notifications/rprt_alrt_c5b92dcf36cf6bf4 response: body: string: '' @@ -218,24 +218,24 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Set-Cookie: - - _stratus_session=qsDsbVqQv5u8luNY8MkBygm7EeBiVWJft6gnQadrCy6IlKpuZN12qkW9QFcS2Gu%2B3L37ndpcTwxkxbSwwwRHSUqnRnnTjN7aeMA%2BUja%2BVmPAhccxhfFpjU4Q93uaKfGLyPjD%2B%2B0z6DLj1BqlQ4DMov7hYYCwDo%2FH8EI%2BUR93jktvq8jq3C%2FsXiWfmYJGg9PxHI9Fr4mV8A4%3D--t2r3OOjLDHaY3Yfv--zxjClKbGiyf3aWwAiWsXEA%3D%3D; + - _stratus_session=oWhhLZdaw9t9y3f9evklgZdQ6%2BQeaPf0keZfhV3PMPSlUOFo4Gw4P4ujYaNdF3%2BNaCqQmhf2vPcMvWmwlb0vZwrUZl%2FiUvNaD%2Bi%2BJPZPK%2F2A6MlgKBDSoY%2BNWqIE1eibcSI5gRsubBIP8TJnpBZbTDZ4X0aGbNwfPMi6466%2FVWVQ7mcLFqR68xPvkV99GF35XV1xsgg%2F%2FVc%3D--O7uFy4cf50ZcC1zo--CpaL4GTzPOgLQZUcjqrJvA%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '360' + - '985' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.043809' + - '0.094747' status: code: 204 message: No Content @@ -251,16 +251,16 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=qsDsbVqQv5u8luNY8MkBygm7EeBiVWJft6gnQadrCy6IlKpuZN12qkW9QFcS2Gu%2B3L37ndpcTwxkxbSwwwRHSUqnRnnTjN7aeMA%2BUja%2BVmPAhccxhfFpjU4Q93uaKfGLyPjD%2B%2B0z6DLj1BqlQ4DMov7hYYCwDo%2FH8EI%2BUR93jktvq8jq3C%2FsXiWfmYJGg9PxHI9Fr4mV8A4%3D--t2r3OOjLDHaY3Yfv--zxjClKbGiyf3aWwAiWsXEA%3D%3D + - _stratus_session=oWhhLZdaw9t9y3f9evklgZdQ6%2BQeaPf0keZfhV3PMPSlUOFo4Gw4P4ujYaNdF3%2BNaCqQmhf2vPcMvWmwlb0vZwrUZl%2FiUvNaD%2Bi%2BJPZPK%2F2A6MlgKBDSoY%2BNWqIE1eibcSI5gRsubBIP8TJnpBZbTDZ4X0aGbNwfPMi6466%2FVWVQ7mcLFqR68xPvkV99GF35XV1xsgg%2F%2FVc%3D--O7uFy4cf50ZcC1zo--CpaL4GTzPOgLQZUcjqrJvA%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: GET - uri: https://api.vantage.sh/v2/anomaly_notifications/rprt_alrt_c856800a3b819af3 + uri: https://api.vantage.sh/v2/anomaly_notifications/rprt_alrt_c5b92dcf36cf6bf4 response: body: - string: '{"errors":["Anomaly Notification rprt_alrt_c856800a3b819af3 not found."]}' + string: '{"errors":["Anomaly Notification rprt_alrt_c5b92dcf36cf6bf4 not found."]}' headers: Access-Control-Allow-Origin: - '*' @@ -271,15 +271,15 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json Set-Cookie: - - _stratus_session=Js0fbm77nfJUoPbzovvXXTRegKaVyAAhPJwdgDZTgYxU38SI%2Br5Lw2asMxtkxmR%2FMrDEyAMLTxIEaPUfz4QApzft14cXm48vAFNidMSWaWjMK0OYCMifYnERMXoyrvC8vwVBuR7G6PcIpusLpuYY06RQC%2B3W98z0WQsOICS0qtumc34zGk9XfrAOW4Jb%2FvgUQhJkYweFgz8%3D--46r3H9%2BAyLS8QDPb--xs6Jj0i%2FUQjYSIKm7AuqvQ%3D%3D; + - _stratus_session=xSsThaBwD1ALWi1aJVu3%2BDyl88qcJ2j16fFzQTmxohsEbG21IsbGRgDSCrWM8eoRazH546QhrPH9uji6tftVMsIu5uGWKctLr9Fq61oUnP2s8tv2rULdgwtPZrA%2FstdZp1QqTo0FPCqOBhWXUnh84R%2BMig71ouJsgqrpx7BbbvsXH89v6sH7dWcklStB7WeSLxZO%2B4PMnxQ%3D--VzRy%2FHO0rT1f17wT--1FpncCCaqdEWYVv1nyevYw%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -290,11 +290,11 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '359' + - '984' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.026988' + - '0.044850' content-length: - '73' status: @@ -312,13 +312,13 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=Js0fbm77nfJUoPbzovvXXTRegKaVyAAhPJwdgDZTgYxU38SI%2Br5Lw2asMxtkxmR%2FMrDEyAMLTxIEaPUfz4QApzft14cXm48vAFNidMSWaWjMK0OYCMifYnERMXoyrvC8vwVBuR7G6PcIpusLpuYY06RQC%2B3W98z0WQsOICS0qtumc34zGk9XfrAOW4Jb%2FvgUQhJkYweFgz8%3D--46r3H9%2BAyLS8QDPb--xs6Jj0i%2FUQjYSIKm7AuqvQ%3D%3D + - _stratus_session=xSsThaBwD1ALWi1aJVu3%2BDyl88qcJ2j16fFzQTmxohsEbG21IsbGRgDSCrWM8eoRazH546QhrPH9uji6tftVMsIu5uGWKctLr9Fq61oUnP2s8tv2rULdgwtPZrA%2FstdZp1QqTo0FPCqOBhWXUnh84R%2BMig71ouJsgqrpx7BbbvsXH89v6sH7dWcklStB7WeSLxZO%2B4PMnxQ%3D--VzRy%2FHO0rT1f17wT--1FpncCCaqdEWYVv1nyevYw%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: DELETE - uri: https://api.vantage.sh/v2/cost_reports/rprt_8f9228a3eff34f54 + uri: https://api.vantage.sh/v2/cost_reports/rprt_72064348da8e66ac response: body: string: '' @@ -332,24 +332,24 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Set-Cookie: - - _stratus_session=HeGqG4o5AJG4pFnXcYYKKYIxRCfWaMNtxDMWKOo5XVbUhRDdspix9b3o2rvYU7atWoefxQIcqT%2FoE4ETf8t%2FDW0W2jBNwIjVJPz3kItD5f0hZRKa6GfWbZ0ja9V6AmP8DPvN18CANPXtqMgoI7AXuWEl9n9vgT7PzTo2wSkdKJCUlpgoRxTNIb3hYUEOxWa%2Fi98lCjqhkSw%3D--sPH4JrUIJijtgUgV--GP9JEuxb9AEThkYdbOA2Bw%3D%3D; + - _stratus_session=YG7mvdfcPCG6yd3yFRU8YPHUNDKGKqmMU%2F0PKKKegWVZYq72IkU2KlPX2uOA6xMC7lyhptAiJzrtGVLwZhF%2FopG42WP1KiIosmtaomeqAxbDCbULsJw2DLT7BEybbtpPIzMFW0LYSp%2F8Hd2CPSvd1Tkcfuo8osLk%2BYMNkUce8%2BrGlLE3RmOL%2Be%2FbZxSCkVFnmJ%2FGYjGuCm8%3D--x%2BdU%2FRIvqYWkuDnS--B7FAKzfnr%2BsSfA8xNFD4XA%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '358' + - '983' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.049835' + - '0.078358' status: code: 204 message: No Content @@ -365,16 +365,16 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=HeGqG4o5AJG4pFnXcYYKKYIxRCfWaMNtxDMWKOo5XVbUhRDdspix9b3o2rvYU7atWoefxQIcqT%2FoE4ETf8t%2FDW0W2jBNwIjVJPz3kItD5f0hZRKa6GfWbZ0ja9V6AmP8DPvN18CANPXtqMgoI7AXuWEl9n9vgT7PzTo2wSkdKJCUlpgoRxTNIb3hYUEOxWa%2Fi98lCjqhkSw%3D--sPH4JrUIJijtgUgV--GP9JEuxb9AEThkYdbOA2Bw%3D%3D + - _stratus_session=YG7mvdfcPCG6yd3yFRU8YPHUNDKGKqmMU%2F0PKKKegWVZYq72IkU2KlPX2uOA6xMC7lyhptAiJzrtGVLwZhF%2FopG42WP1KiIosmtaomeqAxbDCbULsJw2DLT7BEybbtpPIzMFW0LYSp%2F8Hd2CPSvd1Tkcfuo8osLk%2BYMNkUce8%2BrGlLE3RmOL%2Be%2FbZxSCkVFnmJ%2FGYjGuCm8%3D--x%2BdU%2FRIvqYWkuDnS--B7FAKzfnr%2BsSfA8xNFD4XA%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: GET - uri: https://api.vantage.sh/v2/cost_reports/rprt_8f9228a3eff34f54 + uri: https://api.vantage.sh/v2/cost_reports/rprt_72064348da8e66ac response: body: - string: '{"errors":["CostReport rprt_8f9228a3eff34f54 not found."]}' + string: '{"errors":["CostReport rprt_72064348da8e66ac not found."]}' headers: Access-Control-Allow-Origin: - '*' @@ -385,15 +385,15 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json Set-Cookie: - - _stratus_session=qJl0JyrIw9T330RzUs9dOedswbxq%2BYK%2B9p6RDIXDsRt%2FyThkFjlr1P%2F59b%2BwABzI1QmNoDMYxFnL%2BzCikuqbXK%2BhI%2B%2Bh4rWIAj0rJq3xnx0ZrrUxu2Dos4COSIbZWdl4oHKxnNL%2B1BNA1jVkx5qUXmN3JvvEMAjmUDwmMCVKMq%2BgphVU1XZAuWXqJqoFFccDdWDDmI1fo0s%3D--WblXe6PK6nVOTDxb--F6uQU8af8UN%2FLao4I7EMQQ%3D%3D; + - _stratus_session=dE9gCfJhiSjCY9mjQ8TX6SW5IUqhZUTc8PFrZSv1QJMdsTL757eNGqsjf%2FsPcCpa4ZU2AVk54LcZFv%2FiwRhUPUJxgQASF63mXANh1S%2F2Phj83ehOxqJkXzkqibt3Xnj0Ry9x4FAiBsbaqGg8AbPMyFNOxsHgddvEwu%2BDar9xuivYqVz12X6IQGOdp52kCpXjyUqT%2B88ypHk%3D--Kh67zaormI5oa%2Bzt--zo9a3T%2BArBlnFtp6FtjSiQ%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -406,9 +406,9 @@ interactions: X-Rate-Limit-Remaining: - '10000' X-Rate-Limit-Reset: - - '1770579136' + - '1787079939' X-Runtime: - - '0.028285' + - '0.025707' content-length: - '58' status: diff --git a/tests/cassettes/test_get_budget_alert.yaml b/tests/cassettes/test_get_budget_alert.yaml index 38cb924..33e3123 100644 --- a/tests/cassettes/test_get_budget_alert.yaml +++ b/tests/cassettes/test_get_budget_alert.yaml @@ -21,8 +21,8 @@ interactions: uri: https://api.vantage.sh/v2/cost_reports response: body: - string: '{"token":"rprt_597aae522c6e82fd","title":"test_cost_report_vcr","folder_token":null,"saved_filter_tokens":[],"business_metric_tokens_with_metadata":[],"filter":"costs.provider - = ''aws''","groupings":"provider,service","settings":{"include_credits":true,"include_refunds":true,"include_discounts":true,"include_tax":true,"amortize":true,"unallocated":false,"aggregate_by":"cost","show_previous_period":true},"created_at":"2026-02-08T18:32:32Z","workspace_token":"wrkspc_576fafc861f024a4","previous_period_start_date":null,"previous_period_end_date":null,"start_date":"2025-11-01","end_date":"2026-02-06","date_interval":"last_3_months","chart_type":"line","date_bin":"month","chart_settings":{"y_axis_dimension":"cost","x_axis_dimension":["date"]}}' + string: '{"token":"rprt_a3b0a52c72cf7c2d","title":"test_cost_report_vcr","folder_token":null,"saved_filter_tokens":[],"business_metric_tokens_with_metadata":[],"default_forecast":{"kind":"baseline"},"filter":"costs.provider + = ''aws''","groupings":"provider,service","settings":{"include_credits":true,"include_refunds":true,"include_discounts":true,"include_tax":true,"amortize":true,"unallocated":false,"aggregate_by":"cost","show_previous_period":true,"complete_period":false},"created_at":"2026-08-18T18:05:47Z","workspace_token":"wrkspc_576fafc861f024a4","previous_period_start_date":null,"previous_period_end_date":null,"start_date":"2026-05-01","end_date":"2026-08-16","date_interval":"last_3_months","chart_type":"line","date_bin":"month","chart_settings":{"y_axis_dimension":"cost","x_axis_dimension":["date"]}}' headers: Access-Control-Allow-Origin: - '*' @@ -33,17 +33,17 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json ETag: - - W/"6ed6efd4988e57a887cd1c7a8fedca8d" + - W/"863f341bcb1b39f9c30fd836abbbcfd8" Set-Cookie: - - _stratus_session=YjM2AL92GjMCRWixi4AUtD0hw%2FjyW0JOuoKffyShkdX46ausXvj7UiuEBjAjcBvnSt9fcrdyJb%2F4Wjz04fJQyE1hkTWjOw%2BTEZ9rqxPyIKa9HjaYwsM%2BgQTTsLXKT6Vb4iMjKSHdCEwSWZns6ghlGP2ppMRHOrRUTrktFzL2WqJfur05q2POYiyNOqYOMWz%2FihlMYb20B%2Fw%3D--KZOgSD9sXMXDHJA5--hJHRKn0lGl7hPkDCiEBHZg%3D%3D; + - _stratus_session=VTwWjFs7yIPMNeuna9lUX1PePjS9UecCn3ng2%2BnS5sqJrk6%2BBrkguQOAxOCCUWtujtHOFgiAREqhX5kVQjk0xdg2XFcr0cZUjRC%2FKiCaxJjMfou7aEys2%2Fas1nqVJtnKc9hunlozl6zNUunZfL850qWbSAqa8%2BDp2qeU628aM%2F1Tsk6SPCkKHom%2FIx7XGBQu%2Fr%2F%2FBWG7JXE%3D--yxc7WGGwq1YY2eks--%2FhTzF5zNkqzFIi1ALtp67w%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -52,18 +52,18 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '323' + - '970' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.298902' + - '0.376614' content-length: - - '745' + - '808' status: code: 201 message: Created - request: - body: '{"name":"test_budget_vcr","workspace_token":"wrkspc_576fafc861f024a4","cost_report_token":"rprt_597aae522c6e82fd","periods":[{"start_at":"2026-02-08","end_at":"2026-02-08","amount":10000.0}]}' + body: '{"name":"test_budget_vcr","workspace_token":"wrkspc_576fafc861f024a4","cost_report_token":"rprt_a3b0a52c72cf7c2d","periods":[{"start_at":"2026-08-18","end_at":"2026-08-18","amount":10000.0}]}' headers: Accept: - application/json @@ -76,7 +76,7 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=YjM2AL92GjMCRWixi4AUtD0hw%2FjyW0JOuoKffyShkdX46ausXvj7UiuEBjAjcBvnSt9fcrdyJb%2F4Wjz04fJQyE1hkTWjOw%2BTEZ9rqxPyIKa9HjaYwsM%2BgQTTsLXKT6Vb4iMjKSHdCEwSWZns6ghlGP2ppMRHOrRUTrktFzL2WqJfur05q2POYiyNOqYOMWz%2FihlMYb20B%2Fw%3D--KZOgSD9sXMXDHJA5--hJHRKn0lGl7hPkDCiEBHZg%3D%3D + - _stratus_session=VTwWjFs7yIPMNeuna9lUX1PePjS9UecCn3ng2%2BnS5sqJrk6%2BBrkguQOAxOCCUWtujtHOFgiAREqhX5kVQjk0xdg2XFcr0cZUjRC%2FKiCaxJjMfou7aEys2%2Fas1nqVJtnKc9hunlozl6zNUunZfL850qWbSAqa8%2BDp2qeU628aM%2F1Tsk6SPCkKHom%2FIx7XGBQu%2Fr%2F%2FBWG7JXE%3D--yxc7WGGwq1YY2eks--%2FhTzF5zNkqzFIi1ALtp67w%3D%3D Host: - api.vantage.sh User-Agent: @@ -85,7 +85,7 @@ interactions: uri: https://api.vantage.sh/v2/budgets response: body: - string: '{"token":"bdgt_4e341aada4c629a5","name":"test_budget_vcr","workspace_token":"wrkspc_576fafc861f024a4","user_token":null,"created_by_token":"team_ef9127d498c66db2","cost_report_token":"rprt_597aae522c6e82fd","created_at":"2026-02-08T18:32:33Z","budget_alert_tokens":[],"child_budget_tokens":[],"periods":[{"start_at":"2026-02-01","end_at":"2026-02-28","amount":"10000.0"}],"performance":[]}' + string: '{"token":"bdgt_299978e32c94b24b","name":"test_budget_vcr","workspace_token":"wrkspc_576fafc861f024a4","user_token":null,"created_by_token":"team_ef9127d498c66db2","cost_report_token":"rprt_a3b0a52c72cf7c2d","created_at":"2026-08-18T18:05:47Z","budget_alert_tokens":[],"child_budget_tokens":[],"periods":[{"start_at":"2026-08-18","end_at":"2026-08-18","amount":"10000.0"}],"performance":[]}' headers: Access-Control-Allow-Origin: - '*' @@ -96,17 +96,17 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json ETag: - - W/"5757facae78f3be06381152c70c7ec7f" + - W/"1c68f2b2233c4dcaaafef3a6aff2e257" Set-Cookie: - - _stratus_session=OISxSE49tDPBCpaEqIHA2ZxGzFUb3lNhDKegY0oxjwY9T9J%2BNZSTx4kTUiuMlkPQcht0n0x7uC5yp%2BhnABcjBcG0eHSqj2mzfVoEP1jo68aqa6EnNLjnXceymccPLGRll%2F0qBWIA2Vr0m0K95VtWd5sqMzr6xgg3gnhbcXrJCyJSWFi7Yzto87wRfrIdH9CcoAekv%2Fa%2BFhk%3D--Mqv4kZs2b7R3pLRz--VovL6UHyA3l0bWugb1o4kA%3D%3D; + - _stratus_session=RL19EHGml8pEyIrz7Ke6rUdgKx3JVY%2Fe9XdPVFZbQQenBAAjFsq3mcyTlk3rbVh2qswGM75Y4IZswWN%2F0eFnc9nHBa7Cr7wvDmQDGEEXTGvT%2Flws1GV6lPKeizUETwNFNcot4p6VjMnV8s4NC5or7ybkSpJi6kDVNNymDy5bdvI0VcXeEeB4E5wODJCgbHY49IJMlDydUjc%3D--YhYxbYNK7ytHHEGT--1m7No3ShReo4ZCajM1qJyw%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -115,11 +115,11 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '322' + - '969' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.156130' + - '0.160346' content-length: - '389' status: @@ -137,7 +137,7 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=OISxSE49tDPBCpaEqIHA2ZxGzFUb3lNhDKegY0oxjwY9T9J%2BNZSTx4kTUiuMlkPQcht0n0x7uC5yp%2BhnABcjBcG0eHSqj2mzfVoEP1jo68aqa6EnNLjnXceymccPLGRll%2F0qBWIA2Vr0m0K95VtWd5sqMzr6xgg3gnhbcXrJCyJSWFi7Yzto87wRfrIdH9CcoAekv%2Fa%2BFhk%3D--Mqv4kZs2b7R3pLRz--VovL6UHyA3l0bWugb1o4kA%3D%3D + - _stratus_session=RL19EHGml8pEyIrz7Ke6rUdgKx3JVY%2Fe9XdPVFZbQQenBAAjFsq3mcyTlk3rbVh2qswGM75Y4IZswWN%2F0eFnc9nHBa7Cr7wvDmQDGEEXTGvT%2Flws1GV6lPKeizUETwNFNcot4p6VjMnV8s4NC5or7ybkSpJi6kDVNNymDy5bdvI0VcXeEeB4E5wODJCgbHY49IJMlDydUjc%3D--YhYxbYNK7ytHHEGT--1m7No3ShReo4ZCajM1qJyw%3D%3D Host: - api.vantage.sh User-Agent: @@ -147,7 +147,7 @@ interactions: response: body: string: '{"links":{"self":"https://api.vantage.sh/v2/users?page=1","first":"https://api.vantage.sh/v2/users?page=1","next":null,"last":"https://api.vantage.sh/v2/users?page=1","prev":null},"users":[{"token":"usr_3b8e93c36c581811","name":"Block - Open Source","email":"blockopensource@gmail.com","role":"Owner","last_seen_at":"2025-11-25"}]}' + Open Source","email":"blockopensource@gmail.com","role":"Owner","default_dashboard_token":null,"last_seen_at":"2025-11-25"}]}' headers: Access-Control-Allow-Origin: - '*' @@ -158,17 +158,17 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json ETag: - - W/"45831f54595cd60285645990db0d6deb" + - W/"7a5443350834881deb5208f770e9b609" Set-Cookie: - - _stratus_session=OwwSvO7JBVyku2Q9qog7CQo60wjLYTrc5yJgFOw5v5lDzaJUcAlvQuzolUTWjJtX0iTk%2BAr%2BusW%2FxPcZ0yjP1uqpMgKtT6CAgIKu2tpq%2FMA24zPOdGyVsoSe%2BB2DnQEo5tnHaZQE1ZdTviBmvxnt2Oslx391xYpKjqYNEvyS6bG71igcbuErqedGbSHLSUD2ztod2jDoNbo%3D--zVH4vch5Tr7yE3Ng--ILeMtO5iPZ%2FMT3tlWcin9Q%3D%3D; + - _stratus_session=epoLGD6yMIgOMThtOZPN62FuEnsk%2BLixQdcsc12wDxA0n8LjAxwDbyLHrQgg23rvc%2BMYT51gAipqXP1Lhm7%2F1Hc4S%2BFohpDWrGzELtDlF98gUcHlYQsmgj8NKUUH4Vw3m2RcUgbzHQw6x9MYo4QUYHj89yTtYdq4xkoa3ahkOVxcU1bBtN2CnKvEeTRN31ZJGRvZBikWsCQ%3D--2WUVdYze7SLitqTo--Z3U86g6yvlYS7txxTOY3rg%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -177,18 +177,18 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '321' + - '968' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.061483' + - '0.053005' content-length: - - '329' + - '360' status: code: 200 message: OK - request: - body: '{"budget_tokens":["bdgt_4e341aada4c629a5"],"threshold":50,"user_tokens":["usr_3b8e93c36c581811"],"duration_in_days":"30","workspace_token":"wrkspc_576fafc861f024a4"}' + body: '{"budget_tokens":["bdgt_299978e32c94b24b"],"threshold":50,"user_tokens":["usr_3b8e93c36c581811"],"duration_in_days":"30","workspace_token":"wrkspc_576fafc861f024a4"}' headers: Accept: - application/json @@ -201,7 +201,7 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=OwwSvO7JBVyku2Q9qog7CQo60wjLYTrc5yJgFOw5v5lDzaJUcAlvQuzolUTWjJtX0iTk%2BAr%2BusW%2FxPcZ0yjP1uqpMgKtT6CAgIKu2tpq%2FMA24zPOdGyVsoSe%2BB2DnQEo5tnHaZQE1ZdTviBmvxnt2Oslx391xYpKjqYNEvyS6bG71igcbuErqedGbSHLSUD2ztod2jDoNbo%3D--zVH4vch5Tr7yE3Ng--ILeMtO5iPZ%2FMT3tlWcin9Q%3D%3D + - _stratus_session=epoLGD6yMIgOMThtOZPN62FuEnsk%2BLixQdcsc12wDxA0n8LjAxwDbyLHrQgg23rvc%2BMYT51gAipqXP1Lhm7%2F1Hc4S%2BFohpDWrGzELtDlF98gUcHlYQsmgj8NKUUH4Vw3m2RcUgbzHQw6x9MYo4QUYHj89yTtYdq4xkoa3ahkOVxcU1bBtN2CnKvEeTRN31ZJGRvZBikWsCQ%3D--2WUVdYze7SLitqTo--Z3U86g6yvlYS7txxTOY3rg%3D%3D Host: - api.vantage.sh User-Agent: @@ -210,7 +210,7 @@ interactions: uri: https://api.vantage.sh/v2/budget_alerts response: body: - string: '{"token":"bdgt_alrt_2613b967cd557d60","budget_tokens":["bdgt_4e341aada4c629a5"],"created_at":"2026-02-08T18:32:34Z","workspace_token":"wrkspc_576fafc861f024a4","user_token":"team_ef9127d498c66db2","user_tokens":["usr_3b8e93c36c581811"],"duration_in_days":30,"threshold":50,"period_to_track":"start_of_the_month","integration_provider":null,"recipient_channels":[]}' + string: '{"token":"bdgt_alrt_fd2aba0f1f06a552","budget_tokens":["bdgt_299978e32c94b24b"],"created_at":"2026-08-18T18:05:48Z","workspace_token":"wrkspc_576fafc861f024a4","user_token":"team_ef9127d498c66db2","user_tokens":["usr_3b8e93c36c581811"],"recipient_emails":["blockopensource@gmail.com"],"duration_in_days":30,"threshold":50,"period_to_track":"start_of_the_month","integration_provider":null,"recipient_channels":[]}' headers: Access-Control-Allow-Origin: - '*' @@ -221,17 +221,17 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json ETag: - - W/"569d1f0dcb85bffc80220f2aae855f5e" + - W/"f26e02f28045c4ee12218803da00c31b" Set-Cookie: - - _stratus_session=ysZ8IdPwI48Ywl7Agzvx%2BITMZVqOZangEooZA9pMV7sElxUYTVOAySubzQS%2BW0EJFGZUZBk2vLvGmDmmQ%2BLLFHoNFBBJviROhgLRa6h1LWq5Htu9Vp38CHinZb7lMKwwdAk0CPn1g4FHISHpn1SkfXJe5g749aMG27AbVcK%2BOldV8vv6OCch2mD0G2aJRdHfYiEK9Sbh3Vg%3D--Ys0udygmDHfsbjHY--wv%2FM5TKTLiqw13JhiUjQAw%3D%3D; + - _stratus_session=8%2F08AqAqag4UapJyGpWUIunDkJl2383uE0vhfMRWvWEA%2Fy5PKrWypNxf736bhvYpWlJk8ZBEc34DY1Z96PH9%2BAZOzID4nJfxX7E%2FeTZQ776Bt0mU16WI35AoQMaOHM1DFj3HuXwPTO6EoD987cgNw9ridfFlizmvUsmNjlOX4JiJOmZKjqrgOgQVjuSPq57R95yvuuJTAtU%3D--D9k%2FGDNj0HSYcBNa--JzHoT7sIbi%2FJYFFrLZ9BnA%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -240,13 +240,13 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '320' + - '967' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.270579' + - '0.315396' content-length: - - '364' + - '413' status: code: 201 message: Created @@ -262,16 +262,16 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=ysZ8IdPwI48Ywl7Agzvx%2BITMZVqOZangEooZA9pMV7sElxUYTVOAySubzQS%2BW0EJFGZUZBk2vLvGmDmmQ%2BLLFHoNFBBJviROhgLRa6h1LWq5Htu9Vp38CHinZb7lMKwwdAk0CPn1g4FHISHpn1SkfXJe5g749aMG27AbVcK%2BOldV8vv6OCch2mD0G2aJRdHfYiEK9Sbh3Vg%3D--Ys0udygmDHfsbjHY--wv%2FM5TKTLiqw13JhiUjQAw%3D%3D + - _stratus_session=8%2F08AqAqag4UapJyGpWUIunDkJl2383uE0vhfMRWvWEA%2Fy5PKrWypNxf736bhvYpWlJk8ZBEc34DY1Z96PH9%2BAZOzID4nJfxX7E%2FeTZQ776Bt0mU16WI35AoQMaOHM1DFj3HuXwPTO6EoD987cgNw9ridfFlizmvUsmNjlOX4JiJOmZKjqrgOgQVjuSPq57R95yvuuJTAtU%3D--D9k%2FGDNj0HSYcBNa--JzHoT7sIbi%2FJYFFrLZ9BnA%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: GET - uri: https://api.vantage.sh/v2/budget_alerts/bdgt_alrt_2613b967cd557d60 + uri: https://api.vantage.sh/v2/budget_alerts/bdgt_alrt_fd2aba0f1f06a552 response: body: - string: '{"token":"bdgt_alrt_2613b967cd557d60","budget_tokens":["bdgt_4e341aada4c629a5"],"created_at":"2026-02-08T18:32:34Z","workspace_token":"wrkspc_576fafc861f024a4","user_token":"team_ef9127d498c66db2","user_tokens":["usr_3b8e93c36c581811"],"duration_in_days":30,"threshold":50,"period_to_track":"start_of_the_month","integration_provider":null,"recipient_channels":[]}' + string: '{"token":"bdgt_alrt_fd2aba0f1f06a552","budget_tokens":["bdgt_299978e32c94b24b"],"created_at":"2026-08-18T18:05:48Z","workspace_token":"wrkspc_576fafc861f024a4","user_token":"team_ef9127d498c66db2","user_tokens":["usr_3b8e93c36c581811"],"recipient_emails":["blockopensource@gmail.com"],"duration_in_days":30,"threshold":50,"period_to_track":"start_of_the_month","integration_provider":null,"recipient_channels":[]}' headers: Access-Control-Allow-Origin: - '*' @@ -282,17 +282,17 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json ETag: - - W/"569d1f0dcb85bffc80220f2aae855f5e" + - W/"f26e02f28045c4ee12218803da00c31b" Set-Cookie: - - _stratus_session=tW0FQIjcFm9Y8qMxyVsRUAslFjpWibTLVkjKBwbIiz3tvRaW3Cr2lGW1FRQ%2FsuoMSVNbZNaBrPgpO8yu%2F0VKBVs680XqHVHjExzTCL7IS%2FrNMiR7mMvploWRuKcOP7qlKuEAWiDYUcdSK8UTnDqu%2FioA5Q3UzJLc%2F3FosxyV6dTTprb17rzR%2BU4zH0th3nwbhxF7WxRztjk%3D--RZ9UJG0sNGXM7RN%2B--7%2B4ZLb2VNMucROnd%2Bvx75w%3D%3D; + - _stratus_session=TlYS%2FTd1M9N%2B9iu3N2Ap1Gvl%2F0PzQl3vaGycxKksHiJDOdJ6OoSUwZgRNuOYTaf2nvJ4hxPoLXqXMBPJ7JE0MjJtdg5ynuLfxzdrcouirRa%2F39EGBnE8BtHbksCqSVBhkjOSBU1H4FD0AR8fmYhmKEXUKqaytinLUUm9fXuy8VZ5EtCMjkWaGeYn%2Fl%2BWMaArBiSl7QHwjxw%3D--xCJOS9Q1WApqfVDO--OZ%2BK9xHLTttDaPyqCZH7Wg%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -301,13 +301,13 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '319' + - '966' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.083854' + - '0.047130' content-length: - - '364' + - '413' status: code: 200 message: OK @@ -323,13 +323,13 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=tW0FQIjcFm9Y8qMxyVsRUAslFjpWibTLVkjKBwbIiz3tvRaW3Cr2lGW1FRQ%2FsuoMSVNbZNaBrPgpO8yu%2F0VKBVs680XqHVHjExzTCL7IS%2FrNMiR7mMvploWRuKcOP7qlKuEAWiDYUcdSK8UTnDqu%2FioA5Q3UzJLc%2F3FosxyV6dTTprb17rzR%2BU4zH0th3nwbhxF7WxRztjk%3D--RZ9UJG0sNGXM7RN%2B--7%2B4ZLb2VNMucROnd%2Bvx75w%3D%3D + - _stratus_session=TlYS%2FTd1M9N%2B9iu3N2Ap1Gvl%2F0PzQl3vaGycxKksHiJDOdJ6OoSUwZgRNuOYTaf2nvJ4hxPoLXqXMBPJ7JE0MjJtdg5ynuLfxzdrcouirRa%2F39EGBnE8BtHbksCqSVBhkjOSBU1H4FD0AR8fmYhmKEXUKqaytinLUUm9fXuy8VZ5EtCMjkWaGeYn%2Fl%2BWMaArBiSl7QHwjxw%3D--xCJOS9Q1WApqfVDO--OZ%2BK9xHLTttDaPyqCZH7Wg%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: DELETE - uri: https://api.vantage.sh/v2/budget_alerts/bdgt_alrt_2613b967cd557d60 + uri: https://api.vantage.sh/v2/budget_alerts/bdgt_alrt_fd2aba0f1f06a552 response: body: string: '' @@ -343,24 +343,24 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Set-Cookie: - - _stratus_session=qY3J%2FRwTphg3Y%2FboAicWDtq9LRCjymCMYml8hrZqaBh58P2rhHyrY8YrBSEtxC3LBfXrjo6JJ5mnMmoIOSKby9dbix8jnHSHguzCBKCIBUI0914KFrCRespDlA2PwGdG4ut22VKx064w09cEsijqIib96a5BLeMHh2mLm7cY9nQUQZ8yx%2B%2BOh9j8bkceRc2c59G3SF1g3mc%3D--mYDVRgPAAlUlEvAH--UmCfFe6tJj5hnKIu%2Bnd86g%3D%3D; + - _stratus_session=PMyrrolhFnlx7%2B5o3m%2FjbtW%2FDb2QufMt%2BWee2HrP%2BAYjcGrfsnVTuE5voJwBSPH9CbszZKMC4lxVlcCgmvWhKwYfr7kgU3vXzKHduxGEmT0kOF%2BrpijqGztg9Ieb6gfBPT5j3Chejjary63544nRd83%2B3tlapGUs3KfJB%2BKlQystZIhv51mkiRP5Ds9Xl5rNelZq4ciPIyg%3D--9s6%2FCoPRfDzrfWhT--K3wExOCq9W8YxzeSepnkHA%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '318' + - '965' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.077902' + - '0.092611' status: code: 204 message: No Content @@ -376,16 +376,16 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=qY3J%2FRwTphg3Y%2FboAicWDtq9LRCjymCMYml8hrZqaBh58P2rhHyrY8YrBSEtxC3LBfXrjo6JJ5mnMmoIOSKby9dbix8jnHSHguzCBKCIBUI0914KFrCRespDlA2PwGdG4ut22VKx064w09cEsijqIib96a5BLeMHh2mLm7cY9nQUQZ8yx%2B%2BOh9j8bkceRc2c59G3SF1g3mc%3D--mYDVRgPAAlUlEvAH--UmCfFe6tJj5hnKIu%2Bnd86g%3D%3D + - _stratus_session=PMyrrolhFnlx7%2B5o3m%2FjbtW%2FDb2QufMt%2BWee2HrP%2BAYjcGrfsnVTuE5voJwBSPH9CbszZKMC4lxVlcCgmvWhKwYfr7kgU3vXzKHduxGEmT0kOF%2BrpijqGztg9Ieb6gfBPT5j3Chejjary63544nRd83%2B3tlapGUs3KfJB%2BKlQystZIhv51mkiRP5Ds9Xl5rNelZq4ciPIyg%3D--9s6%2FCoPRfDzrfWhT--K3wExOCq9W8YxzeSepnkHA%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: GET - uri: https://api.vantage.sh/v2/budget_alerts/bdgt_alrt_2613b967cd557d60 + uri: https://api.vantage.sh/v2/budget_alerts/bdgt_alrt_fd2aba0f1f06a552 response: body: - string: '{"errors":["Budget Alert bdgt_alrt_2613b967cd557d60 not found."]}' + string: '{"errors":["Budget Alert bdgt_alrt_fd2aba0f1f06a552 not found."]}' headers: Access-Control-Allow-Origin: - '*' @@ -396,15 +396,15 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json Set-Cookie: - - _stratus_session=mh7tP7A2j%2FatuFY7mVGbsul9JnogRT13zaHmDtVRFik%2FD0BU77UQtoAeQyt%2Fg4xwTF7yg1dMnGpDPou8XmlvaO5j2pKCXa3EsogxVmeca7h%2BhDEebDDip6YSsaXrnibWmMnzdPmVw7L8yZRulUKGdffpI1PeByPav3IRQFodd0Q0ZzNfhCPcvXbnl2GQcpiAtSb5WN9bedI%3D--95mmNAVTXErSQq6r--dIe4%2FHkPuH9EMV4sNG3XdA%3D%3D; + - _stratus_session=yygAZezYP3PJurNT3tbx6cSUe3gooQDy2DrHYmkDKZYFXusjcgOj1dt%2FP6GsKjX8eDAtqRbpOwyJ8VUR3Ztdh4pbI5s5nbjqNjfyvX%2FVEJjl%2FJPH9YUu73ezxxYyoCJ5UyNbr0neRMgwWe2Ho7Y90APEn%2B3tIMp8JmHYgXioGUvT%2FAv9dW7maf8m9XFZvj4eUSBrKLGS7cY%3D--%2BGvPUbj3aYB5VkGE--h3UkZcIBHqOdFSwUYSKUaQ%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -415,11 +415,11 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '317' + - '964' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.045160' + - '0.025032' content-length: - '65' status: @@ -437,13 +437,13 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=mh7tP7A2j%2FatuFY7mVGbsul9JnogRT13zaHmDtVRFik%2FD0BU77UQtoAeQyt%2Fg4xwTF7yg1dMnGpDPou8XmlvaO5j2pKCXa3EsogxVmeca7h%2BhDEebDDip6YSsaXrnibWmMnzdPmVw7L8yZRulUKGdffpI1PeByPav3IRQFodd0Q0ZzNfhCPcvXbnl2GQcpiAtSb5WN9bedI%3D--95mmNAVTXErSQq6r--dIe4%2FHkPuH9EMV4sNG3XdA%3D%3D + - _stratus_session=yygAZezYP3PJurNT3tbx6cSUe3gooQDy2DrHYmkDKZYFXusjcgOj1dt%2FP6GsKjX8eDAtqRbpOwyJ8VUR3Ztdh4pbI5s5nbjqNjfyvX%2FVEJjl%2FJPH9YUu73ezxxYyoCJ5UyNbr0neRMgwWe2Ho7Y90APEn%2B3tIMp8JmHYgXioGUvT%2FAv9dW7maf8m9XFZvj4eUSBrKLGS7cY%3D--%2BGvPUbj3aYB5VkGE--h3UkZcIBHqOdFSwUYSKUaQ%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: DELETE - uri: https://api.vantage.sh/v2/budgets/bdgt_4e341aada4c629a5 + uri: https://api.vantage.sh/v2/budgets/bdgt_299978e32c94b24b response: body: string: '' @@ -457,24 +457,24 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Set-Cookie: - - _stratus_session=693u06yboqqsez1pvPH3SGvHTLSBZjF3tU3o0IB1lwikWU7vb6T%2Fep4fXrozKB8kTo%2F9kD%2FaPXFd43TMrm1Wg4sw%2F5A02FTEZb5HSPm9YpTwZhCdLoJx4iioOHmhgrdHYnKnbNEz%2FJlp5ZnO11Y8%2FpND8GP0K7y8REe7%2FAvnigiLEwbb9rS7FERHPf1YTzLFx8uGWb0z5EQ%3D--uDKInihLOyCoM9Ut--8IHfUwBddlT3Q7bvPuzPpQ%3D%3D; + - _stratus_session=jPa3UOSEw3%2Bvt5eddaUjGGRp%2F4PIboV5qrS1MG6m%2Bqjz5jhNmjulI%2BjaqO3mzmVL2Zwmy54w8XE8bz9Dnlt%2BebBZLAJ%2F4ZEY1Qchwu3u3Wd7aKIZsuwf8xectY0UZRJpOP0e%2FG0KUqAG8C6DkF9RISxdPKmdfLCVYe5Xke7z1AhMl31lDVMpJxr%2BumalktQKiJ2iQHl9JeM%3D--ZB7dfoU%2Bi5I0fWKE--kaXJv7cAa6VFyt3VynQjtw%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '316' + - '963' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.053074' + - '0.075875' status: code: 204 message: No Content @@ -490,16 +490,16 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=693u06yboqqsez1pvPH3SGvHTLSBZjF3tU3o0IB1lwikWU7vb6T%2Fep4fXrozKB8kTo%2F9kD%2FaPXFd43TMrm1Wg4sw%2F5A02FTEZb5HSPm9YpTwZhCdLoJx4iioOHmhgrdHYnKnbNEz%2FJlp5ZnO11Y8%2FpND8GP0K7y8REe7%2FAvnigiLEwbb9rS7FERHPf1YTzLFx8uGWb0z5EQ%3D--uDKInihLOyCoM9Ut--8IHfUwBddlT3Q7bvPuzPpQ%3D%3D + - _stratus_session=jPa3UOSEw3%2Bvt5eddaUjGGRp%2F4PIboV5qrS1MG6m%2Bqjz5jhNmjulI%2BjaqO3mzmVL2Zwmy54w8XE8bz9Dnlt%2BebBZLAJ%2F4ZEY1Qchwu3u3Wd7aKIZsuwf8xectY0UZRJpOP0e%2FG0KUqAG8C6DkF9RISxdPKmdfLCVYe5Xke7z1AhMl31lDVMpJxr%2BumalktQKiJ2iQHl9JeM%3D--ZB7dfoU%2Bi5I0fWKE--kaXJv7cAa6VFyt3VynQjtw%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: GET - uri: https://api.vantage.sh/v2/budgets/bdgt_4e341aada4c629a5 + uri: https://api.vantage.sh/v2/budgets/bdgt_299978e32c94b24b response: body: - string: '{"errors":["Budget bdgt_4e341aada4c629a5 not found."]}' + string: '{"errors":["Budget bdgt_299978e32c94b24b not found."]}' headers: Access-Control-Allow-Origin: - '*' @@ -510,15 +510,15 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json Set-Cookie: - - _stratus_session=bJbTtyuzJ0i3wC3wnfy%2BRvwBhZhCyyCyvyMo9grKPCs74s%2FWXT7Z4kbvQM6m044CU1D49lPeEY61sRwgOEX3fQKCqH0T6p%2FZsaWwtXdPHT8KQDdkVSfZ5sLuAEeWwbSsWZW2rfU%2B0BoftMXLmfoU7X1ZSJrTKOPGAucOc6tcz6LwCPtE6Wfzcvr%2FJLC2nFj3kwjf%2FbiH0NA%3D--nk5LcSmWl%2FyhCYVf--BDEbzPSSzgqBhczeBRShGg%3D%3D; + - _stratus_session=M0r1wYRNfsDsht1JYrlhbKhQzlUyagfR0r4ZTKPAWB38rlFjhlnCQICuq%2FfORhy5IvfDetsyqgtARCVC6gsSDQQJpwwPsiUX3goc4tBZwTcwQPTQeSPlaNauXog6e5t4wzTCscY8%2Fw5dvhDZI8KJUTErWI7zWvLMjhDl34xy03yQeKsLEBtK0BX7N6FKa7ZZbYT%2Bd%2BiQcsE%3D--KGRTTAAkCm9z3HAa--89ivFAZTa%2Flz4ew%2BzArj1Q%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -529,11 +529,11 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '315' + - '962' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.030095' + - '0.039148' content-length: - '54' status: @@ -551,13 +551,13 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=bJbTtyuzJ0i3wC3wnfy%2BRvwBhZhCyyCyvyMo9grKPCs74s%2FWXT7Z4kbvQM6m044CU1D49lPeEY61sRwgOEX3fQKCqH0T6p%2FZsaWwtXdPHT8KQDdkVSfZ5sLuAEeWwbSsWZW2rfU%2B0BoftMXLmfoU7X1ZSJrTKOPGAucOc6tcz6LwCPtE6Wfzcvr%2FJLC2nFj3kwjf%2FbiH0NA%3D--nk5LcSmWl%2FyhCYVf--BDEbzPSSzgqBhczeBRShGg%3D%3D + - _stratus_session=M0r1wYRNfsDsht1JYrlhbKhQzlUyagfR0r4ZTKPAWB38rlFjhlnCQICuq%2FfORhy5IvfDetsyqgtARCVC6gsSDQQJpwwPsiUX3goc4tBZwTcwQPTQeSPlaNauXog6e5t4wzTCscY8%2Fw5dvhDZI8KJUTErWI7zWvLMjhDl34xy03yQeKsLEBtK0BX7N6FKa7ZZbYT%2Bd%2BiQcsE%3D--KGRTTAAkCm9z3HAa--89ivFAZTa%2Flz4ew%2BzArj1Q%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: DELETE - uri: https://api.vantage.sh/v2/cost_reports/rprt_597aae522c6e82fd + uri: https://api.vantage.sh/v2/cost_reports/rprt_a3b0a52c72cf7c2d response: body: string: '' @@ -571,24 +571,24 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Set-Cookie: - - _stratus_session=zdkPJqE%2BRvTy2WoGtshYHQTnsvCmSNtfVuHu5YMAcvl263fkRmhw5NXXswe7dAkZoHeQC3BLphRAgnM37IZb4ZK6mwS2XGe2WrknGQqh41S0al%2BpUowHcOPHolAnYDPahwulk4yjBGR2UyBHteSaVrXHu%2BNyWX71KTcjhopA54l7x7y6D4mH609VX8aH9CM4jXXR%2BYrdE6A%3D--lrFqOrCKdCR4oyIO--2nN4n1meNLqyoeGOXBePRA%3D%3D; + - _stratus_session=sN50728H3yU7Qr4QEvOtRA0wcms4P5FyroHFV88YduuMDZ0oc41uG%2FfQKhhb40%2BA%2FjQzspfBrJ66FS8rVes6La2F8Po%2Fhlr6IeV6EcV%2FNeioTF56syavm9MLX0zJR5YxAJ1tRYm4zmm8vDjJEF9Oen7hFX30uSF1hvwSoVQOW2J%2B%2FjVPQYtt0fQz3q1omqAkd93Kr5HL7pA%3D--KbzCZVu33krEUrWH--O72Is5FxbaEyYWGx3PKLpg%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '314' + - '961' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.045765' + - '0.059448' status: code: 204 message: No Content @@ -604,16 +604,16 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=zdkPJqE%2BRvTy2WoGtshYHQTnsvCmSNtfVuHu5YMAcvl263fkRmhw5NXXswe7dAkZoHeQC3BLphRAgnM37IZb4ZK6mwS2XGe2WrknGQqh41S0al%2BpUowHcOPHolAnYDPahwulk4yjBGR2UyBHteSaVrXHu%2BNyWX71KTcjhopA54l7x7y6D4mH609VX8aH9CM4jXXR%2BYrdE6A%3D--lrFqOrCKdCR4oyIO--2nN4n1meNLqyoeGOXBePRA%3D%3D + - _stratus_session=sN50728H3yU7Qr4QEvOtRA0wcms4P5FyroHFV88YduuMDZ0oc41uG%2FfQKhhb40%2BA%2FjQzspfBrJ66FS8rVes6La2F8Po%2Fhlr6IeV6EcV%2FNeioTF56syavm9MLX0zJR5YxAJ1tRYm4zmm8vDjJEF9Oen7hFX30uSF1hvwSoVQOW2J%2B%2FjVPQYtt0fQz3q1omqAkd93Kr5HL7pA%3D--KbzCZVu33krEUrWH--O72Is5FxbaEyYWGx3PKLpg%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: GET - uri: https://api.vantage.sh/v2/cost_reports/rprt_597aae522c6e82fd + uri: https://api.vantage.sh/v2/cost_reports/rprt_a3b0a52c72cf7c2d response: body: - string: '{"errors":["CostReport rprt_597aae522c6e82fd not found."]}' + string: '{"errors":["CostReport rprt_a3b0a52c72cf7c2d not found."]}' headers: Access-Control-Allow-Origin: - '*' @@ -624,15 +624,15 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json Set-Cookie: - - _stratus_session=Cm%2FhubNHrTJZazwpvygUNlLVUsKKPujjhz1ViHbeosLpNkJsvXm%2BoGUExc0RfYhz5arbK4%2FVY0Tggg7tM6wSdJC10OtNIyD25LTJPaHi5ehVBd0cGo3QVxWBRtRhCaPbw70%2Bfx%2FPgvDQ46JKUbchlojoyEdw2DnfRXeVizsrHfZZD3n%2B46krSBQSFQV6qeCPx9EmnIDStJM%3D--FErpbO6tyCIt0pA%2F--%2Fla7rMH4UN1IzgcWRCy1PA%3D%3D; + - _stratus_session=KETqXhOPZIVmIFlTcN25Az%2F8Wg%2Ft3Cg%2BmsH%2BsMxEjb9t%2BJtF7xX9QWf%2FNLMVeh6eQd3aTq2Szn8Spt7T%2Bx1%2BM35aKaPZ1QHFNnMifCe0opmNHNO2L8mwumq0irbWQh%2Fyi0AM6c4htHVApdIungIZB6Hhgt3XrkxnGqRaG0Vh23GppOMAmr2i9ZC4vHvvDMKdzRzgWdK07Xw%3D--aSwEdKLWjAe2qM31--zkZ6YZAwHpaBqyiazo4JXA%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -645,9 +645,9 @@ interactions: X-Rate-Limit-Remaining: - '10000' X-Rate-Limit-Reset: - - '1770579156' + - '1787079952' X-Runtime: - - '0.037158' + - '0.038906' content-length: - '58' status: diff --git a/tests/cassettes/test_get_virtual_tag.yaml b/tests/cassettes/test_get_virtual_tag.yaml index 0790e30..ef198b5 100644 --- a/tests/cassettes/test_get_virtual_tag.yaml +++ b/tests/cassettes/test_get_virtual_tag.yaml @@ -1,6 +1,6 @@ interactions: - request: - body: '{"key":"test_vtag_vcr","overridable":false,"backfill_until":"2026-02-08","collapsed_tag_keys":[{"key":"team","providers":["aws"]}],"values":[{"filter":"costs.provider + body: '{"key":"test_vtag_vcr","overridable":false,"backfill_until":"2026-08-18","collapsed_tag_keys":[{"key":"team","providers":["aws"]}],"values":[{"filter":"costs.provider = ''aws''","name":"Primary"}]}' headers: Accept: @@ -21,8 +21,8 @@ interactions: uri: https://api.vantage.sh/v2/virtual_tag_configs response: body: - string: '{"token":"vtag_233a17dace2330ca","created_by_token":"team_ef9127d498c66db2","key":"test_vtag_vcr","overridable":false,"backfill_until":"2026-02-01","collapsed_tag_keys":[{"key":"team","providers":["aws"]}],"values":[{"filter":"costs.provider - = ''aws''","name":"Primary"}]}' + string: '{"token":"vtag_3f1344c9c01af5b1","created_by_token":"team_ef9127d498c66db2","key":"test_vtag_vcr","hidden":false,"preferred":false,"overridable":false,"backfill_until":"2026-08-01","collapsed_tag_keys":[{"key":"team","providers":["aws"],"filter":null}],"values":[{"token":"vtag_val_ad9d1215a222a4f2","filter":"costs.provider + = ''aws''","name":"Primary","label_transforms":[],"percentages":[],"date_ranges":[]}]}' headers: Access-Control-Allow-Origin: - '*' @@ -33,17 +33,17 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json ETag: - - W/"25c292311fce7a069fbdeedad511dc9b" + - W/"fd769e7c7c8df59538d865c6e8f35ae3" Set-Cookie: - - _stratus_session=g4sYIRs0Tf8nypY3IpNK7A7e5wH62AIJe5iAf%2BUVdO%2FaKizMbGyY13YIvH%2B0Jb4ndxxBBiG945ay88AkCMy3Sf1Yc6RcRqC7%2FcJzXRt2p8pg3lNNE4ofLR5o1dQyUgWQwy9%2BCUvICIUkAU53Wp5Ts1bGtIiQ6wKfYVe65LbJhGKo0Ou2pogMV%2F%2F21dbcA64mgEKcLtqLoao%3D--e8F3IYdo4VfgjaOk--qJnisrITMWNSkx7nZRq3QQ%3D%3D; + - _stratus_session=Y14zWpk3%2BJwPrk25uXAdPrWEmLnR3j4uZoPBArX8vD46U2YrfmmoKyl3MarjwrZAmmLeHS4LnUJogzxdGCpLmDHF5U5tOE9gR2kgG6Dm9GFsgyvy3tdMDS50S7P1N%2FM2WmAwtDss6r9O1odHYt8p7KlJRmxuJwjRti8t40M9PL3dLJy0hTWheykkxl86D%2BK1eTixYKNlBCg%3D--7DVr7mOes2KGU6Xj--yyP%2FngqaPCqSS4WXZK6ECw%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -52,13 +52,13 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '401' + - '1000' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.303784' + - '0.493137' content-length: - - '270' + - '409' status: code: 201 message: Created @@ -74,17 +74,17 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=g4sYIRs0Tf8nypY3IpNK7A7e5wH62AIJe5iAf%2BUVdO%2FaKizMbGyY13YIvH%2B0Jb4ndxxBBiG945ay88AkCMy3Sf1Yc6RcRqC7%2FcJzXRt2p8pg3lNNE4ofLR5o1dQyUgWQwy9%2BCUvICIUkAU53Wp5Ts1bGtIiQ6wKfYVe65LbJhGKo0Ou2pogMV%2F%2F21dbcA64mgEKcLtqLoao%3D--e8F3IYdo4VfgjaOk--qJnisrITMWNSkx7nZRq3QQ%3D%3D + - _stratus_session=Y14zWpk3%2BJwPrk25uXAdPrWEmLnR3j4uZoPBArX8vD46U2YrfmmoKyl3MarjwrZAmmLeHS4LnUJogzxdGCpLmDHF5U5tOE9gR2kgG6Dm9GFsgyvy3tdMDS50S7P1N%2FM2WmAwtDss6r9O1odHYt8p7KlJRmxuJwjRti8t40M9PL3dLJy0hTWheykkxl86D%2BK1eTixYKNlBCg%3D--7DVr7mOes2KGU6Xj--yyP%2FngqaPCqSS4WXZK6ECw%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: GET - uri: https://api.vantage.sh/v2/virtual_tag_configs/vtag_233a17dace2330ca + uri: https://api.vantage.sh/v2/virtual_tag_configs/vtag_3f1344c9c01af5b1 response: body: - string: '{"token":"vtag_233a17dace2330ca","created_by_token":"team_ef9127d498c66db2","key":"test_vtag_vcr","overridable":false,"backfill_until":"2026-02-01","collapsed_tag_keys":[{"key":"team","providers":["aws"]}],"values":[{"filter":"costs.provider - = ''aws''","name":"Primary"}]}' + string: '{"token":"vtag_3f1344c9c01af5b1","created_by_token":"team_ef9127d498c66db2","key":"test_vtag_vcr","hidden":false,"preferred":false,"overridable":false,"backfill_until":"2026-08-01","collapsed_tag_keys":[{"key":"team","providers":["aws"],"filter":null}],"values":[{"token":"vtag_val_ad9d1215a222a4f2","filter":"costs.provider + = ''aws''","name":"Primary","label_transforms":[],"percentages":[],"date_ranges":[]}]}' headers: Access-Control-Allow-Origin: - '*' @@ -95,17 +95,17 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json ETag: - - W/"fae6428c7a34dbdaf888c0163f9b49c4" + - W/"326c23e4adb797ca068e5e8212116ad6" Set-Cookie: - - _stratus_session=ZZOFaPFcqNsCi%2BHrTeeUhjn2QVHQPRKwXR%2B%2Bv%2BVhsRzvYFBhviHQqCeQx%2Bte7UATcbGXG8adq%2FAmU5dVDkqE1t3BDCvtVMv2GCrxObMiCkx3eDGzeDby%2FpW3m13I3L7UxVflx1izKD0QHGXnCUwLCdlPQjZXTEMyNggJpx%2F%2BTznfA7c23G2IPLvgiUcwKNi1qQfC%2BtLxTEU%3D--fJ7fA%2BKOrwprlK1S--bT8pz7NYATjHy5KhEMFSKg%3D%3D; + - _stratus_session=X4a%2FV19voe%2Br3u2I9YzypUCTX2YEC8VLVZc5Nilezffe0kRqcfCE75rayFNgk5n9MhnOaE%2B9uDDvjce254Jl2ROMchumKUqHCWrW5ALbx1yMmwtIOM8HWE3KqKxpB%2B%2BHdMWJMIkSxV9hgMBtgKiiKrIugowG5xDy6zG3AYtgtvyfTR96xb2mFq3BKAncddBNgnjrMR2H14c%3D--BJ38D%2BGufcouFV2g--MzM19j%2FC82ZhSlSvOHuQqA%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -114,13 +114,13 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '400' + - '999' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.061086' + - '0.101497' content-length: - - '270' + - '409' status: code: 200 message: OK @@ -136,13 +136,13 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=ZZOFaPFcqNsCi%2BHrTeeUhjn2QVHQPRKwXR%2B%2Bv%2BVhsRzvYFBhviHQqCeQx%2Bte7UATcbGXG8adq%2FAmU5dVDkqE1t3BDCvtVMv2GCrxObMiCkx3eDGzeDby%2FpW3m13I3L7UxVflx1izKD0QHGXnCUwLCdlPQjZXTEMyNggJpx%2F%2BTznfA7c23G2IPLvgiUcwKNi1qQfC%2BtLxTEU%3D--fJ7fA%2BKOrwprlK1S--bT8pz7NYATjHy5KhEMFSKg%3D%3D + - _stratus_session=X4a%2FV19voe%2Br3u2I9YzypUCTX2YEC8VLVZc5Nilezffe0kRqcfCE75rayFNgk5n9MhnOaE%2B9uDDvjce254Jl2ROMchumKUqHCWrW5ALbx1yMmwtIOM8HWE3KqKxpB%2B%2BHdMWJMIkSxV9hgMBtgKiiKrIugowG5xDy6zG3AYtgtvyfTR96xb2mFq3BKAncddBNgnjrMR2H14c%3D--BJ38D%2BGufcouFV2g--MzM19j%2FC82ZhSlSvOHuQqA%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: DELETE - uri: https://api.vantage.sh/v2/virtual_tag_configs/vtag_233a17dace2330ca + uri: https://api.vantage.sh/v2/virtual_tag_configs/vtag_3f1344c9c01af5b1 response: body: string: '' @@ -156,24 +156,24 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Set-Cookie: - - _stratus_session=8OJBaTrrfCHh92NmJs2GoJiYbwNNVJJQB5ChgTqNJU4lJcUKCkrwvpbD%2FTN38sw2SJXt6diEbn1eLi2czm8O8xTHWzcewKlwHE0v0Ask2ClyELBcO7lVoFnc3MhjP3%2BwBv4DxjkUYIKXqbuN4NwMhLMfQNYxwuGaf9Qxm6%2FNuQeXLf7qh4KYHmpeORWxMsssYWAir0o744A%3D--Z9GNay0tAXQPmAu8--1LaN0UUX4Q8I2a5zPR76%2FQ%3D%3D; + - _stratus_session=9R7YmnsAAoceTjnJc%2B44bANlkzTGZ3%2BHnWFmEG07VTJI7z8HkswHn7q0s5LDxYWRW%2Fm8QoFJSMfze%2Fa0CfNP3IqbsZn%2FAcFSri25gtYip7zIm%2Br%2FlSTfdPvODOsHimEn2ADrhlR41RoX%2BGxpQlcZaRIMQ2N60bo6Odt5smeXbrs%2F23jGwhJDFWM%2Bu7ejbH1j5Mjb55PMhFA%3D--xftAuFC377%2FtKbK%2B--Mml5kxxrbkJMG%2BSrRrdXtA%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '399' + - '998' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.158305' + - '0.210534' status: code: 204 message: No Content @@ -189,16 +189,16 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=8OJBaTrrfCHh92NmJs2GoJiYbwNNVJJQB5ChgTqNJU4lJcUKCkrwvpbD%2FTN38sw2SJXt6diEbn1eLi2czm8O8xTHWzcewKlwHE0v0Ask2ClyELBcO7lVoFnc3MhjP3%2BwBv4DxjkUYIKXqbuN4NwMhLMfQNYxwuGaf9Qxm6%2FNuQeXLf7qh4KYHmpeORWxMsssYWAir0o744A%3D--Z9GNay0tAXQPmAu8--1LaN0UUX4Q8I2a5zPR76%2FQ%3D%3D + - _stratus_session=9R7YmnsAAoceTjnJc%2B44bANlkzTGZ3%2BHnWFmEG07VTJI7z8HkswHn7q0s5LDxYWRW%2Fm8QoFJSMfze%2Fa0CfNP3IqbsZn%2FAcFSri25gtYip7zIm%2Br%2FlSTfdPvODOsHimEn2ADrhlR41RoX%2BGxpQlcZaRIMQ2N60bo6Odt5smeXbrs%2F23jGwhJDFWM%2Bu7ejbH1j5Mjb55PMhFA%3D--xftAuFC377%2FtKbK%2B--Mml5kxxrbkJMG%2BSrRrdXtA%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: GET - uri: https://api.vantage.sh/v2/virtual_tag_configs/vtag_233a17dace2330ca + uri: https://api.vantage.sh/v2/virtual_tag_configs/vtag_3f1344c9c01af5b1 response: body: - string: '{"errors":["VirtualTagConfig vtag_233a17dace2330ca not found."]}' + string: '{"errors":["VirtualTagConfig vtag_3f1344c9c01af5b1 not found."]}' headers: Access-Control-Allow-Origin: - '*' @@ -209,15 +209,15 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json Set-Cookie: - - _stratus_session=xEPpwxTOWRMXyvInmR0qafIZG996gDL4q79kmzrhzCtGI%2BPSEJFI7rFMDJw74lZO%2FHM5njwHrqXWu1smBfhHWFnrSinnPQVm5R7UXfQXfYjktYKw72Juyb359lOvSJthb90odGkKaKtxwXtZuWn4S65JgnYE%2BaevOsDbScW9y56Dzvy7O7b8E3SFF9l14hbVXAQmyr%2Bo%2FYg%3D--uQLnOVjmxb9vvGZ7--kQeEbXsKXseDK%2B8Mfx9C1A%3D%3D; + - _stratus_session=bSJIfr5g4hmmmZawJejqWhgmm6Up1saQQqxH0fbrfEo9Xu3WkoOG7cw8%2BixX2E8NmQiWSBGaz0hMXwOz2lrLmLbu%2FcqF%2Fd7a2szfqkySOzpCIHUg6Q9wD2SjIyJe8au%2FlHbYgLiJ2JCkWQ07qfWaBm1%2B19VevFiO2o3fxOKbKcmg%2FvS3Rtk9b%2FApfCPzfKqjiaKOZNnHPII%3D--Et7id7hiW5LJdgTu--H20Oh1FwXRkPrlOYP4A2Ng%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -228,11 +228,11 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '398' + - '997' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.027426' + - '0.056838' content-length: - '64' status: diff --git a/tests/cassettes/test_update_anomaly_notification.yaml b/tests/cassettes/test_update_anomaly_notification.yaml index 48f8a55..144ab04 100644 --- a/tests/cassettes/test_update_anomaly_notification.yaml +++ b/tests/cassettes/test_update_anomaly_notification.yaml @@ -21,8 +21,8 @@ interactions: uri: https://api.vantage.sh/v2/cost_reports response: body: - string: '{"token":"rprt_e5b8cb21d4f39de7","title":"test_cost_report_vcr","folder_token":null,"saved_filter_tokens":[],"business_metric_tokens_with_metadata":[],"filter":"costs.provider - = ''aws''","groupings":"provider,service","settings":{"include_credits":true,"include_refunds":true,"include_discounts":true,"include_tax":true,"amortize":true,"unallocated":false,"aggregate_by":"cost","show_previous_period":true},"created_at":"2026-02-08T18:32:19Z","workspace_token":"wrkspc_576fafc861f024a4","previous_period_start_date":null,"previous_period_end_date":null,"start_date":"2025-11-01","end_date":"2026-02-06","date_interval":"last_3_months","chart_type":"line","date_bin":"month","chart_settings":{"y_axis_dimension":"cost","x_axis_dimension":["date"]}}' + string: '{"token":"rprt_67d9898382edad67","title":"test_cost_report_vcr","folder_token":null,"saved_filter_tokens":[],"business_metric_tokens_with_metadata":[],"default_forecast":{"kind":"baseline"},"filter":"costs.provider + = ''aws''","groupings":"provider,service","settings":{"include_credits":true,"include_refunds":true,"include_discounts":true,"include_tax":true,"amortize":true,"unallocated":false,"aggregate_by":"cost","show_previous_period":true,"complete_period":false},"created_at":"2026-08-18T18:05:43Z","workspace_token":"wrkspc_576fafc861f024a4","previous_period_start_date":null,"previous_period_end_date":null,"start_date":"2026-05-01","end_date":"2026-08-16","date_interval":"last_3_months","chart_type":"line","date_bin":"month","chart_settings":{"y_axis_dimension":"cost","x_axis_dimension":["date"]}}' headers: Access-Control-Allow-Origin: - '*' @@ -33,17 +33,17 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json ETag: - - W/"21ce51abdfff3ec4658cdfcc47dd0cbf" + - W/"234e29f90527161455241d81878b60d6" Set-Cookie: - - _stratus_session=Fu%2F8SmHo9NXCsIDKngBir6WWHT6Co2yBJmUyPYW0rMJAnROGo5iJ7H6SZGMAvU7zyfafumhl9VGGTzTMc2HooR%2FYcx9Pq58Giv7Mr%2FZfWyFOSN0XHO9lAHq6A2pSK374FqFL5PS7%2FHkv5DXHZrCu1LgJPOw6Cy%2FrTofw92UF84TB7WYKdNnFERQYFcHa5K390QDOwPF%2Fquo%3D--DmETWsJnEbVRKdZg--nh3PWViaZklMueXSizt6Cg%3D%3D; + - _stratus_session=oeQH1nJmNTt1Zk0FgpGZd8FBaRQ%2FOI8nI5XMszvN%2BwcLYhUl6jkYFIKofOXFdQVIBRa4jFEG65vUcq6%2F71Dy0VUVbJoG6eJLlSvTgkAVbXmdJd7pj0x4Ex%2BBIopqC%2FoZQiSuFiJnB%2B0XvKYdG6KIdV05vIfTKhctP2oWdz3lp%2F0%2Btfkee%2Bhcq0IrvWh47kbAvcvo2PopdbE%3D--wMnEv5tqSm%2FmJfUg--27kszR4%2BcdQr5mofPim3nw%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -52,18 +52,18 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '352' + - '977' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.300311' + - '0.383785' content-length: - - '745' + - '808' status: code: 201 message: Created - request: - body: '{"cost_report_token":"rprt_e5b8cb21d4f39de7","threshold":1000,"recipient_channels":["#test-anomaly-notifications"]}' + body: '{"cost_report_token":"rprt_67d9898382edad67","threshold":1000,"recipient_channels":["#test-anomaly-notifications"]}' headers: Accept: - application/json @@ -76,7 +76,7 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=Fu%2F8SmHo9NXCsIDKngBir6WWHT6Co2yBJmUyPYW0rMJAnROGo5iJ7H6SZGMAvU7zyfafumhl9VGGTzTMc2HooR%2FYcx9Pq58Giv7Mr%2FZfWyFOSN0XHO9lAHq6A2pSK374FqFL5PS7%2FHkv5DXHZrCu1LgJPOw6Cy%2FrTofw92UF84TB7WYKdNnFERQYFcHa5K390QDOwPF%2Fquo%3D--DmETWsJnEbVRKdZg--nh3PWViaZklMueXSizt6Cg%3D%3D + - _stratus_session=oeQH1nJmNTt1Zk0FgpGZd8FBaRQ%2FOI8nI5XMszvN%2BwcLYhUl6jkYFIKofOXFdQVIBRa4jFEG65vUcq6%2F71Dy0VUVbJoG6eJLlSvTgkAVbXmdJd7pj0x4Ex%2BBIopqC%2FoZQiSuFiJnB%2B0XvKYdG6KIdV05vIfTKhctP2oWdz3lp%2F0%2Btfkee%2Bhcq0IrvWh47kbAvcvo2PopdbE%3D--wMnEv5tqSm%2FmJfUg--27kszR4%2BcdQr5mofPim3nw%3D%3D Host: - api.vantage.sh User-Agent: @@ -85,7 +85,7 @@ interactions: uri: https://api.vantage.sh/v2/anomaly_notifications response: body: - string: '{"token":"rprt_alrt_63a8d5c0bb14aeae","cost_report_token":"rprt_e5b8cb21d4f39de7","created_at":"2026-02-08T18:32:20Z","updated_at":"2026-02-08T18:32:20Z","threshold":1000,"user_tokens":[],"recipient_channels":[]}' + string: '{"token":"rprt_alrt_d17af1048db1835a","cost_report_token":"rprt_67d9898382edad67","created_at":"2026-08-18T18:05:43Z","updated_at":"2026-08-18T18:05:43Z","threshold":1000,"user_tokens":[],"recipient_emails":[],"recipient_channels":[]}' headers: Access-Control-Allow-Origin: - '*' @@ -96,17 +96,17 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json ETag: - - W/"79184d0aaac747eed7579a908fcf54c6" + - W/"2052dea4dd81fe5f8b9729e60b54bcd4" Set-Cookie: - - _stratus_session=Zm7ARDbpQKskgNCZJ0futsB5fTJ0kbLJ2WhdoytYqrn8Pf3wd39hl6eOri57CmqTfrsTjUwsal07NiuAXyK6KH6ZhIAc9wDgnlBpD9JdM%2FETEsfQ7CT13jTLLN7%2FfFkev%2FMIrbYX4PB3rGFsgtOkDeqlItCYcGMH7OQZb53pFMqgpF7fij5Y13gIjvAB187mQQeBD0qwKmM%3D--VnE64%2BF%2Bf%2FZKRBRj--%2FH7T396%2BcdcuGQl6eSgfmQ%3D%3D; + - _stratus_session=ah2GG%2FjqO4Yt73TV8L4Fm4DfxWC54anwQTJU7n3Nkq%2BsiTiFUN8bHtKuEAWpV5cChwEiuNZ%2BGPTUz11j1qEyh5lqPSZP5AiMgRFlfxxQ6It%2BCo7sNZP5QEsdedqW7YMLIm2y5RE9cjbNLAiTCmahN5xz5gVDwsrvS2Zy8dkcOUoBPeU1d6AGmrIS4DX4KUjMDdWkXLaNROc%3D--ip7wvad9ooFaFPsq--gt2bYXEQfmVNZP%2FHYq64fQ%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -115,13 +115,13 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '351' + - '976' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.104039' + - '0.107776' content-length: - - '212' + - '234' status: code: 201 message: Created @@ -139,16 +139,16 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=Zm7ARDbpQKskgNCZJ0futsB5fTJ0kbLJ2WhdoytYqrn8Pf3wd39hl6eOri57CmqTfrsTjUwsal07NiuAXyK6KH6ZhIAc9wDgnlBpD9JdM%2FETEsfQ7CT13jTLLN7%2FfFkev%2FMIrbYX4PB3rGFsgtOkDeqlItCYcGMH7OQZb53pFMqgpF7fij5Y13gIjvAB187mQQeBD0qwKmM%3D--VnE64%2BF%2Bf%2FZKRBRj--%2FH7T396%2BcdcuGQl6eSgfmQ%3D%3D + - _stratus_session=ah2GG%2FjqO4Yt73TV8L4Fm4DfxWC54anwQTJU7n3Nkq%2BsiTiFUN8bHtKuEAWpV5cChwEiuNZ%2BGPTUz11j1qEyh5lqPSZP5AiMgRFlfxxQ6It%2BCo7sNZP5QEsdedqW7YMLIm2y5RE9cjbNLAiTCmahN5xz5gVDwsrvS2Zy8dkcOUoBPeU1d6AGmrIS4DX4KUjMDdWkXLaNROc%3D--ip7wvad9ooFaFPsq--gt2bYXEQfmVNZP%2FHYq64fQ%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: PUT - uri: https://api.vantage.sh/v2/anomaly_notifications/rprt_alrt_63a8d5c0bb14aeae + uri: https://api.vantage.sh/v2/anomaly_notifications/rprt_alrt_d17af1048db1835a response: body: - string: '{"token":"rprt_alrt_63a8d5c0bb14aeae","cost_report_token":"rprt_e5b8cb21d4f39de7","created_at":"2026-02-08T18:32:20Z","updated_at":"2026-02-08T18:32:20Z","threshold":3000,"user_tokens":[],"recipient_channels":[]}' + string: '{"token":"rprt_alrt_d17af1048db1835a","cost_report_token":"rprt_67d9898382edad67","created_at":"2026-08-18T18:05:43Z","updated_at":"2026-08-18T18:05:44Z","threshold":3000,"user_tokens":[],"recipient_emails":[],"recipient_channels":[]}' headers: Access-Control-Allow-Origin: - '*' @@ -159,17 +159,17 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json ETag: - - W/"62a5d91af6afe518108e6764fadb762f" + - W/"8a1cf35510c603d2f932267819b191ec" Set-Cookie: - - _stratus_session=rpMWRjp8b57I1Y8mpEoSSPV8Trc48Q%2FbEqJ3clo%2F2G7sEks0wdjxyOYMcLEyA%2BOfAlZoRy6RHIty%2BfyRRfb0D8AUxqqeMeBWPtndsk2E183F%2FYSSi5Fp3SXJdvZla6H7JwzjlV3kv9OmO4maiWp6v%2FJufiGH4UPoRv9yK7cm0qjd7j%2FUKD7sXzAvemUA0RSs1xwG5KLgpo4%3D--mWyou%2FGBEDoSLbPk--9tZgURCsv0en1GHn53BVVw%3D%3D; + - _stratus_session=4rCMiQ5duC4%2BWKzsJ%2BXLLqN%2B1MeKu7OIiPaT%2Bg84OO6wXiKKF3Vz39GZBo0yhzYxvowJzI%2FVC344O2fQecZTJd9O3GOiPCXWtdaMhFSV367hV%2FcNldicUUOzsTUDhyC0NYFiXaYt3Iy1e4R58owg4DP5xswPio03RP%2FwljTZVMpFOzBYxKQg32EKUvv459j2MMK7I2wng2U%3D--sK7PXiiRLc%2BZ1lvV--3ABcQp%2FEOMRD3jjQ1es4eQ%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -178,13 +178,13 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '350' + - '975' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.076288' + - '0.097136' content-length: - - '212' + - '234' status: code: 200 message: OK @@ -202,16 +202,16 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=rpMWRjp8b57I1Y8mpEoSSPV8Trc48Q%2FbEqJ3clo%2F2G7sEks0wdjxyOYMcLEyA%2BOfAlZoRy6RHIty%2BfyRRfb0D8AUxqqeMeBWPtndsk2E183F%2FYSSi5Fp3SXJdvZla6H7JwzjlV3kv9OmO4maiWp6v%2FJufiGH4UPoRv9yK7cm0qjd7j%2FUKD7sXzAvemUA0RSs1xwG5KLgpo4%3D--mWyou%2FGBEDoSLbPk--9tZgURCsv0en1GHn53BVVw%3D%3D + - _stratus_session=4rCMiQ5duC4%2BWKzsJ%2BXLLqN%2B1MeKu7OIiPaT%2Bg84OO6wXiKKF3Vz39GZBo0yhzYxvowJzI%2FVC344O2fQecZTJd9O3GOiPCXWtdaMhFSV367hV%2FcNldicUUOzsTUDhyC0NYFiXaYt3Iy1e4R58owg4DP5xswPio03RP%2FwljTZVMpFOzBYxKQg32EKUvv459j2MMK7I2wng2U%3D--sK7PXiiRLc%2BZ1lvV--3ABcQp%2FEOMRD3jjQ1es4eQ%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: PUT - uri: https://api.vantage.sh/v2/anomaly_notifications/rprt_alrt_63a8d5c0bb14aeae + uri: https://api.vantage.sh/v2/anomaly_notifications/rprt_alrt_d17af1048db1835a response: body: - string: '{"token":"rprt_alrt_63a8d5c0bb14aeae","cost_report_token":"rprt_e5b8cb21d4f39de7","created_at":"2026-02-08T18:32:20Z","updated_at":"2026-02-08T18:32:20Z","threshold":1000,"user_tokens":[],"recipient_channels":[]}' + string: '{"token":"rprt_alrt_d17af1048db1835a","cost_report_token":"rprt_67d9898382edad67","created_at":"2026-08-18T18:05:43Z","updated_at":"2026-08-18T18:05:44Z","threshold":1000,"user_tokens":[],"recipient_emails":[],"recipient_channels":[]}' headers: Access-Control-Allow-Origin: - '*' @@ -222,17 +222,17 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json ETag: - - W/"79184d0aaac747eed7579a908fcf54c6" + - W/"8ac1ba512b6ed17c4fac5a574056fec0" Set-Cookie: - - _stratus_session=7xp%2Bh%2F%2FVXoc94DH7DjDoeqjr1BzRkCoemyqCdlgAW6gA9%2Bg4KehQ1E5H6HGbp7dckvU1dp4mOnnFsRJA5JxBfapYZTzzkr4lMvfq1V4su4tPJwWJcalBWOpp%2FmGlMauUAoHzHoA3v0zvvUyqxSruzpKofcNpSMqSJ80vIS7I2tyOoxkNlIpauPCZUSL%2FHKNGnSebt5LPpBY%3D--jxrGQ0fB0px%2BQ9zG--NaD4ULhRrQbjRd37nlEJ%2FA%3D%3D; + - _stratus_session=OPZLWf%2FyMDzzYuQJYrV%2F7ru5V5m%2BvrqG2UvEtuBBsXS2umcd7il%2F7Sr7VNjrtN3SeoGl%2FXD1TajPSRl2WKgbBA0Vl0UFC0S8adC5%2FVINjoSMZscieh873%2F4KU1V9f9hhhk6Cw4TO%2Fwu1PbQF22uDef037re%2F6kHE6enx2N%2FgN47wBDO%2FWlsRTZ1j2A69tP%2Fz5s8v6cyMlJg%3D--MRgiXuKmvxcTP64Z--BmLWbq3XlX9dAqts2RUoIQ%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -241,13 +241,13 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '349' + - '974' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.073362' + - '0.057601' content-length: - - '212' + - '234' status: code: 200 message: OK @@ -263,13 +263,13 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=7xp%2Bh%2F%2FVXoc94DH7DjDoeqjr1BzRkCoemyqCdlgAW6gA9%2Bg4KehQ1E5H6HGbp7dckvU1dp4mOnnFsRJA5JxBfapYZTzzkr4lMvfq1V4su4tPJwWJcalBWOpp%2FmGlMauUAoHzHoA3v0zvvUyqxSruzpKofcNpSMqSJ80vIS7I2tyOoxkNlIpauPCZUSL%2FHKNGnSebt5LPpBY%3D--jxrGQ0fB0px%2BQ9zG--NaD4ULhRrQbjRd37nlEJ%2FA%3D%3D + - _stratus_session=OPZLWf%2FyMDzzYuQJYrV%2F7ru5V5m%2BvrqG2UvEtuBBsXS2umcd7il%2F7Sr7VNjrtN3SeoGl%2FXD1TajPSRl2WKgbBA0Vl0UFC0S8adC5%2FVINjoSMZscieh873%2F4KU1V9f9hhhk6Cw4TO%2Fwu1PbQF22uDef037re%2F6kHE6enx2N%2FgN47wBDO%2FWlsRTZ1j2A69tP%2Fz5s8v6cyMlJg%3D--MRgiXuKmvxcTP64Z--BmLWbq3XlX9dAqts2RUoIQ%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: DELETE - uri: https://api.vantage.sh/v2/anomaly_notifications/rprt_alrt_63a8d5c0bb14aeae + uri: https://api.vantage.sh/v2/anomaly_notifications/rprt_alrt_d17af1048db1835a response: body: string: '' @@ -283,24 +283,24 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Set-Cookie: - - _stratus_session=PLyYK0Lb2TzsKuGmCHouZQr9kwK6bZhgYb%2BtL%2F9zYEkw064ZM%2BNtHBO2Nv4tncYNDlO72IoUjbecokkgbMF9gbH9TRv2W5iJ4PSUsHEBWAdzfminw3r%2FHF92jjx0acMqbUftEwYU5JV7NiAheDDmfKBLeTb4aZLhSSypBDGt6eMEQaEHYW7n%2FgS8yHzV%2BhWGWRxIbsypybY%3D--reMdYddw0qqSSKH%2F--BpRdRaK75uETFx%2BVnKO7Xg%3D%3D; + - _stratus_session=ZlKN1Xad5mYP1dMBgcFVfgeU200p5xr8%2Bmi7x0xJOPDwCofxGCPV6dt3dSqK6nw55hwFcQKLl1L4iOB%2Bvh1SeCEzquZ1u3%2BwZNZyvc9imen3yklrOA0if0cKPBQz%2F%2FScl2EOboWlVxKiCg27LOzCRBfoBVO87YczLEM9PUjUI68cWqwN1njvjx8C9NyLVvI%2FYFHVmnd75cc%3D--vVOgjzp1vhFfjcmy--RbLuCkMoHBiamTU99nQ74w%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '348' + - '973' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.029372' + - '0.087550' status: code: 204 message: No Content @@ -316,16 +316,16 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=PLyYK0Lb2TzsKuGmCHouZQr9kwK6bZhgYb%2BtL%2F9zYEkw064ZM%2BNtHBO2Nv4tncYNDlO72IoUjbecokkgbMF9gbH9TRv2W5iJ4PSUsHEBWAdzfminw3r%2FHF92jjx0acMqbUftEwYU5JV7NiAheDDmfKBLeTb4aZLhSSypBDGt6eMEQaEHYW7n%2FgS8yHzV%2BhWGWRxIbsypybY%3D--reMdYddw0qqSSKH%2F--BpRdRaK75uETFx%2BVnKO7Xg%3D%3D + - _stratus_session=ZlKN1Xad5mYP1dMBgcFVfgeU200p5xr8%2Bmi7x0xJOPDwCofxGCPV6dt3dSqK6nw55hwFcQKLl1L4iOB%2Bvh1SeCEzquZ1u3%2BwZNZyvc9imen3yklrOA0if0cKPBQz%2F%2FScl2EOboWlVxKiCg27LOzCRBfoBVO87YczLEM9PUjUI68cWqwN1njvjx8C9NyLVvI%2FYFHVmnd75cc%3D--vVOgjzp1vhFfjcmy--RbLuCkMoHBiamTU99nQ74w%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: GET - uri: https://api.vantage.sh/v2/anomaly_notifications/rprt_alrt_63a8d5c0bb14aeae + uri: https://api.vantage.sh/v2/anomaly_notifications/rprt_alrt_d17af1048db1835a response: body: - string: '{"errors":["Anomaly Notification rprt_alrt_63a8d5c0bb14aeae not found."]}' + string: '{"errors":["Anomaly Notification rprt_alrt_d17af1048db1835a not found."]}' headers: Access-Control-Allow-Origin: - '*' @@ -336,15 +336,15 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json Set-Cookie: - - _stratus_session=EeAeSjNMPimdCIbY%2FIMxMUKBWzJzBkOwC1zJQTofpuR%2FrKyxZckR9djHQVBnoO%2BpgbPdR4sZtyDOIbBbEZsrQbIW%2F3rvNyZUGrZhTug5%2FBkI6fZPhwxjhvjRpg0uMNZXty8DP4pAOvVTr5CUSGsEK1s91xIRUkN672DDqAYBnum1Y5bUNKEnw7biG2grWNgixNfWca3w008%3D--teowRZ8gcKqrj41J--M0QfeFNDvzR85OCfMPFdmQ%3D%3D; + - _stratus_session=1%2FCDO7UHJ5SwGDaB2QublGAEbLUv8db4xvYFQGE%2B6c4uE3Xu2jjdg2R8I4ZSS5Ncro%2FOm4zgf0lu0bGAgHDpP%2B0sAGM0wyqz%2B5anUxbQZ8qXdI2h%2B2HJNbWQuZcKQxr%2FVLxNLw0zw%2FBjQj4rZg6ujilDdhZZ8HDlctZx%2BuIs4WCnb2D3%2F8iYWVcfk%2BlfVzPE1K1LqCSLfGk%3D--%2BxihZUENNa4VPjAj--RcmgpSlX%2FMhbF9l%2Fvje%2B2A%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -355,11 +355,11 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '347' + - '972' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.030528' + - '0.037433' content-length: - '73' status: @@ -377,13 +377,13 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=EeAeSjNMPimdCIbY%2FIMxMUKBWzJzBkOwC1zJQTofpuR%2FrKyxZckR9djHQVBnoO%2BpgbPdR4sZtyDOIbBbEZsrQbIW%2F3rvNyZUGrZhTug5%2FBkI6fZPhwxjhvjRpg0uMNZXty8DP4pAOvVTr5CUSGsEK1s91xIRUkN672DDqAYBnum1Y5bUNKEnw7biG2grWNgixNfWca3w008%3D--teowRZ8gcKqrj41J--M0QfeFNDvzR85OCfMPFdmQ%3D%3D + - _stratus_session=1%2FCDO7UHJ5SwGDaB2QublGAEbLUv8db4xvYFQGE%2B6c4uE3Xu2jjdg2R8I4ZSS5Ncro%2FOm4zgf0lu0bGAgHDpP%2B0sAGM0wyqz%2B5anUxbQZ8qXdI2h%2B2HJNbWQuZcKQxr%2FVLxNLw0zw%2FBjQj4rZg6ujilDdhZZ8HDlctZx%2BuIs4WCnb2D3%2F8iYWVcfk%2BlfVzPE1K1LqCSLfGk%3D--%2BxihZUENNa4VPjAj--RcmgpSlX%2FMhbF9l%2Fvje%2B2A%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: DELETE - uri: https://api.vantage.sh/v2/cost_reports/rprt_e5b8cb21d4f39de7 + uri: https://api.vantage.sh/v2/cost_reports/rprt_67d9898382edad67 response: body: string: '' @@ -397,24 +397,24 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Set-Cookie: - - _stratus_session=ZG82WZ%2Bijd2yOqoHsNKsfaB1JeENo927iNP2kB1GX0cYvf38eX9x8ghJA2SH%2B%2F8gVqZwdhfQiTuBinPTf7kRBravOWHLWQWDMxsQmToa%2BHEv0iRxRz2WmwY7GVSww11%2B3lU8sJYUQk7rBk5oGk8WRMsTnmFtZ2uoW8acPhVz85%2BoJ2S3Az%2FbzinJqphzGSTQEXoqRlFFuhc%3D--phFiVLQe%2BdDRnbu1--LfOSl%2FapCaWU5teyBnP92g%3D%3D; + - _stratus_session=onDaCowppsZZgOagIZfBatFF42fbf0jWf1LJf5mSNkxyfPtmCq0eIHrRmJFGBv8m%2FbhBVp8SNLFd48gpRIpcl%2F69jJMZjFFp7VOFjatTVf8pazeFza0VcjodaQh89XPqXU6hS0TDzkTz8U%2FmLKDaX%2BkCtGSVPoRFHoxbJl2Kgrh75LvAVEA%2BAdigpTT8vWcVGf6HbMZ%2Bktc%3D--aZaPfv0g9NSCffpz--xxcRAZAfqCL7pY%2BplZX5Hw%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '346' + - '971' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.112865' + - '0.163723' status: code: 204 message: No Content @@ -430,16 +430,16 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=ZG82WZ%2Bijd2yOqoHsNKsfaB1JeENo927iNP2kB1GX0cYvf38eX9x8ghJA2SH%2B%2F8gVqZwdhfQiTuBinPTf7kRBravOWHLWQWDMxsQmToa%2BHEv0iRxRz2WmwY7GVSww11%2B3lU8sJYUQk7rBk5oGk8WRMsTnmFtZ2uoW8acPhVz85%2BoJ2S3Az%2FbzinJqphzGSTQEXoqRlFFuhc%3D--phFiVLQe%2BdDRnbu1--LfOSl%2FapCaWU5teyBnP92g%3D%3D + - _stratus_session=onDaCowppsZZgOagIZfBatFF42fbf0jWf1LJf5mSNkxyfPtmCq0eIHrRmJFGBv8m%2FbhBVp8SNLFd48gpRIpcl%2F69jJMZjFFp7VOFjatTVf8pazeFza0VcjodaQh89XPqXU6hS0TDzkTz8U%2FmLKDaX%2BkCtGSVPoRFHoxbJl2Kgrh75LvAVEA%2BAdigpTT8vWcVGf6HbMZ%2Bktc%3D--aZaPfv0g9NSCffpz--xxcRAZAfqCL7pY%2BplZX5Hw%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: GET - uri: https://api.vantage.sh/v2/cost_reports/rprt_e5b8cb21d4f39de7 + uri: https://api.vantage.sh/v2/cost_reports/rprt_67d9898382edad67 response: body: - string: '{"errors":["CostReport rprt_e5b8cb21d4f39de7 not found."]}' + string: '{"errors":["CostReport rprt_67d9898382edad67 not found."]}' headers: Access-Control-Allow-Origin: - '*' @@ -450,15 +450,15 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json Set-Cookie: - - _stratus_session=KTSf7nQnY3LOOJ1NRng6ikmVc8CZzuzXU412uhTQGsCB8uFh1ANVPu3TxmhppAThU2naqN3a59RKIlLNIPMiqwvuDqOazhrE2hGDc%2B%2BO6Y98nVWVlznFN1xTbp4UkueEky8824lw5OT%2FZHjRxOV%2BaJaKpA%2FgSgXg9O9Y3ZBq9YLMEqN7bXK48irCwSrGXY%2B6fgMlvd%2BPPlM%3D--pVDkl%2B9fSorDLK%2BJ--UFfnoh8BHBTMVcc9Cz3sDg%3D%3D; + - _stratus_session=RWIBvo0jqnZpYkeaSCff6i5xfyTOhPGERggnCjdAM3feIruiX%2ByKP0QzAsle6TWS7XWjIVvEnVNkk6dhfjquUtV7lRWo5v1e9MtaJQZlJr0SA6ZrcjE5yn21TZcvA%2F9Ow8NoMuTbwdT6XISEZtYycNmvm9AsDcHm%2FsniDZcyvB94CjgzCf0dEy1H7Azy%2BODirUA91lAc8cI%3D--3DklKBBIrMUHw54R--HuiUqiVkbuuI5YO1UL9hQw%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -471,9 +471,9 @@ interactions: X-Rate-Limit-Remaining: - '10000' X-Rate-Limit-Reset: - - '1770579142' + - '1787079946' X-Runtime: - - '0.030793' + - '0.036313' content-length: - '58' status: diff --git a/tests/cassettes/test_update_virtual_tag.yaml b/tests/cassettes/test_update_virtual_tag.yaml index 12d5a27..65f3fc6 100644 --- a/tests/cassettes/test_update_virtual_tag.yaml +++ b/tests/cassettes/test_update_virtual_tag.yaml @@ -1,6 +1,6 @@ interactions: - request: - body: '{"key":"test_vtag_vcr","overridable":false,"backfill_until":"2026-02-08","collapsed_tag_keys":[{"key":"team","providers":["aws"]}],"values":[{"filter":"costs.provider + body: '{"key":"test_vtag_vcr","overridable":false,"backfill_until":"2026-08-18","collapsed_tag_keys":[{"key":"team","providers":["aws"]}],"values":[{"filter":"costs.provider = ''aws''","name":"Primary"}]}' headers: Accept: @@ -21,8 +21,8 @@ interactions: uri: https://api.vantage.sh/v2/virtual_tag_configs response: body: - string: '{"token":"vtag_b796efff429f0d48","created_by_token":"team_ef9127d498c66db2","key":"test_vtag_vcr","overridable":false,"backfill_until":"2026-02-01","collapsed_tag_keys":[{"key":"team","providers":["aws"]}],"values":[{"filter":"costs.provider - = ''aws''","name":"Primary"}]}' + string: '{"token":"vtag_2054620975c42e7e","created_by_token":"team_ef9127d498c66db2","key":"test_vtag_vcr","hidden":false,"preferred":false,"overridable":false,"backfill_until":"2026-08-01","collapsed_tag_keys":[{"key":"team","providers":["aws"],"filter":null}],"values":[{"token":"vtag_val_7e74d5f2033a2858","filter":"costs.provider + = ''aws''","name":"Primary","label_transforms":[],"percentages":[],"date_ranges":[]}]}' headers: Access-Control-Allow-Origin: - '*' @@ -33,17 +33,17 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json ETag: - - W/"5dbde362c4f7a8ba673563bd8dcb4122" + - W/"d2e86eb43bd5939d5334b076e428f1fb" Set-Cookie: - - _stratus_session=C0TWFQemM4JqYkAQNdNmjMbcthsvJBhoBG99MC5O7UChmhFxEMjuBzVPLlKRKRvRRSZHdMdQsvuYBOLAyVMfqv24ZYqA1CbxFt7F1sOfF7rCeIAJv%2BMgfKknxuDecamGNXST6%2FVvAbX6MvWS1x7WbEj68v0T1lfd78%2FtcnW34DL2bGLw%2FDDgSSbAvzuf1sXmk0iraH%2FG7f0%3D--YiIJcrsLWW%2BGfTMQ--%2BinJt%2F4iKjAT5HvnXlPAww%3D%3D; + - _stratus_session=jnEF%2Fy%2BFEoOcysQ8urGgmcCvW%2B3jEja08rDK8fRpp8NjWMITMwcGgcV3qUpYV3I77kKmlbe2cAbJJ7PpfsTVeLm0lhmuh%2B8mFy4DjAnjP%2FlTRi6ms%2FnIe6ClWcISqGgCGKJ2920uSXqP6xeKuHKGbwGhMw6vCryETnJFtyTJQn7VLtdNp1VDUNFSiapiS%2FZsa0nrjCsaIdw%3D--%2FTr3twHVlCiM3XlN--EUULCvGNGeARG27cRdgGrA%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -52,13 +52,13 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '397' + - '996' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.209118' + - '0.477385' content-length: - - '270' + - '409' status: code: 201 message: Created @@ -77,17 +77,17 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=C0TWFQemM4JqYkAQNdNmjMbcthsvJBhoBG99MC5O7UChmhFxEMjuBzVPLlKRKRvRRSZHdMdQsvuYBOLAyVMfqv24ZYqA1CbxFt7F1sOfF7rCeIAJv%2BMgfKknxuDecamGNXST6%2FVvAbX6MvWS1x7WbEj68v0T1lfd78%2FtcnW34DL2bGLw%2FDDgSSbAvzuf1sXmk0iraH%2FG7f0%3D--YiIJcrsLWW%2BGfTMQ--%2BinJt%2F4iKjAT5HvnXlPAww%3D%3D + - _stratus_session=jnEF%2Fy%2BFEoOcysQ8urGgmcCvW%2B3jEja08rDK8fRpp8NjWMITMwcGgcV3qUpYV3I77kKmlbe2cAbJJ7PpfsTVeLm0lhmuh%2B8mFy4DjAnjP%2FlTRi6ms%2FnIe6ClWcISqGgCGKJ2920uSXqP6xeKuHKGbwGhMw6vCryETnJFtyTJQn7VLtdNp1VDUNFSiapiS%2FZsa0nrjCsaIdw%3D--%2FTr3twHVlCiM3XlN--EUULCvGNGeARG27cRdgGrA%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: PUT - uri: https://api.vantage.sh/v2/virtual_tag_configs/vtag_b796efff429f0d48 + uri: https://api.vantage.sh/v2/virtual_tag_configs/vtag_2054620975c42e7e response: body: - string: '{"token":"vtag_b796efff429f0d48","created_by_token":"team_ef9127d498c66db2","key":"updated_vcr_test_vtag_vcr","overridable":false,"backfill_until":"2026-02-01","collapsed_tag_keys":[{"key":"team","providers":["aws"]}],"values":[{"filter":"costs.provider - = ''aws'' AND costs.service = ''Amazon Simple Storage Service''","name":"updated_vcr_virtual_tag_value"}]}' + string: '{"token":"vtag_2054620975c42e7e","created_by_token":"team_ef9127d498c66db2","key":"updated_vcr_test_vtag_vcr","hidden":false,"preferred":false,"overridable":false,"backfill_until":"2026-08-01","collapsed_tag_keys":[{"key":"team","providers":["aws"],"filter":null}],"values":[{"token":"vtag_val_f0b527319937f835","filter":"costs.provider + = ''aws'' AND costs.service = ''Amazon Simple Storage Service''","name":"updated_vcr_virtual_tag_value","label_transforms":[],"percentages":[],"date_ranges":[]}]}' headers: Access-Control-Allow-Origin: - '*' @@ -98,17 +98,17 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json ETag: - - W/"d70f35f708c130e0484857dc36be064c" + - W/"26a95ed181dff1dce349d82637a8aa98" Set-Cookie: - - _stratus_session=ulXm3dyC1JPCQudOJJ67Z8CkA7hmUg6FqdzrGA%2BfTMMDzCBGP7kbMbLy3gruEVFApzzF%2BNHt7DWonwe6%2BBlvvw%2BN7j79YHSAq%2BZaUjXVQ1uDOww2OvaHfW5BgDMFbkNVill9ViQTw9W4mP1Oti372gikZ5HAI1wN579VgdC2if17hTx7FfnDY%2FSryxTukwVkmF2qiOFL%2F2Q%3D--CkZ%2Fo3fdg88aBvSs--dI8r88me85OV9yPrEt38fw%3D%3D; + - _stratus_session=n%2Bdm7hsPULRANB1RdVEtTJARamE09gDM8nux2dC2r9BIsLA8Swrwo%2FfS7WVj8r5UJ4qSfaoqniYsGlhUYXg14qTU%2BBzsAOYqvs%2BklUcv5ZFaGfgkbyJM%2BStH5F4dLcLPnbyLDM44NzSe85qjgQctWObgCqwdWQ9S5s%2Bge0lphFLbwXJgWjKUxImhAW4ybwaaVO6bzPYhHyQ%3D--nlC0W02nAcEFd%2F17--dgY0Fwvd6RN1wpOa6uy4Cg%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -117,13 +117,13 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '396' + - '995' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.218628' + - '0.542438' content-length: - - '356' + - '495' status: code: 200 message: OK @@ -139,13 +139,13 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=ulXm3dyC1JPCQudOJJ67Z8CkA7hmUg6FqdzrGA%2BfTMMDzCBGP7kbMbLy3gruEVFApzzF%2BNHt7DWonwe6%2BBlvvw%2BN7j79YHSAq%2BZaUjXVQ1uDOww2OvaHfW5BgDMFbkNVill9ViQTw9W4mP1Oti372gikZ5HAI1wN579VgdC2if17hTx7FfnDY%2FSryxTukwVkmF2qiOFL%2F2Q%3D--CkZ%2Fo3fdg88aBvSs--dI8r88me85OV9yPrEt38fw%3D%3D + - _stratus_session=n%2Bdm7hsPULRANB1RdVEtTJARamE09gDM8nux2dC2r9BIsLA8Swrwo%2FfS7WVj8r5UJ4qSfaoqniYsGlhUYXg14qTU%2BBzsAOYqvs%2BklUcv5ZFaGfgkbyJM%2BStH5F4dLcLPnbyLDM44NzSe85qjgQctWObgCqwdWQ9S5s%2Bge0lphFLbwXJgWjKUxImhAW4ybwaaVO6bzPYhHyQ%3D--nlC0W02nAcEFd%2F17--dgY0Fwvd6RN1wpOa6uy4Cg%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: DELETE - uri: https://api.vantage.sh/v2/virtual_tag_configs/vtag_b796efff429f0d48 + uri: https://api.vantage.sh/v2/virtual_tag_configs/vtag_2054620975c42e7e response: body: string: '' @@ -159,24 +159,24 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Set-Cookie: - - _stratus_session=jZQFb9HcFa84LMHZfCnGv0Dkh6QOsKI8vXtSYjFC24vyPFv8CjRm%2BUSbdlZMMSBou%2BzGd%2FyGwT8KrqEehyhnt7dWptmvtBsat1nhvzjoUTfuCXMLPU7W5uNGsA21NxcLdP9YQoIInV3t2fQE9cAhuGuRlONotIv%2BAMFnkefmv7fEX5uCQ95Cwb9tNZ0drHiqBwHqXpsXO5M%3D--%2BkeYTtLMgL6X6WYW--rxup6LSCBrFhlh6a5SL1Eg%3D%3D; + - _stratus_session=JTUCxLnaomIaUICQ4t7UJztgoYLpFR%2F6gSugy4ZbUEPTjBa6t%2FIREvreNZlzr8drc4eneLBfx%2F603sMCdAgRK%2Bi%2F0g6zqG6K%2B0KAXQ6FgW0VlvWgaC5ylScIDTAmb2T0%2FUXYfMHf%2BqT3B1quhwLTP4zllfmqnvIt6GCWU7JCDSenoSzV5diVqACOM7DORl4tYVVg6PSHxho%3D--QSLCigBl4rkbtZw3--fh44a%2FNK80EbGviqtFdESQ%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '395' + - '994' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.128737' + - '0.406456' status: code: 204 message: No Content @@ -192,16 +192,16 @@ interactions: Content-Type: - application/json Cookie: - - _stratus_session=jZQFb9HcFa84LMHZfCnGv0Dkh6QOsKI8vXtSYjFC24vyPFv8CjRm%2BUSbdlZMMSBou%2BzGd%2FyGwT8KrqEehyhnt7dWptmvtBsat1nhvzjoUTfuCXMLPU7W5uNGsA21NxcLdP9YQoIInV3t2fQE9cAhuGuRlONotIv%2BAMFnkefmv7fEX5uCQ95Cwb9tNZ0drHiqBwHqXpsXO5M%3D--%2BkeYTtLMgL6X6WYW--rxup6LSCBrFhlh6a5SL1Eg%3D%3D + - _stratus_session=JTUCxLnaomIaUICQ4t7UJztgoYLpFR%2F6gSugy4ZbUEPTjBa6t%2FIREvreNZlzr8drc4eneLBfx%2F603sMCdAgRK%2Bi%2F0g6zqG6K%2B0KAXQ6FgW0VlvWgaC5ylScIDTAmb2T0%2FUXYfMHf%2BqT3B1quhwLTP4zllfmqnvIt6GCWU7JCDSenoSzV5diVqACOM7DORl4tYVVg6PSHxho%3D--QSLCigBl4rkbtZw3--fh44a%2FNK80EbGviqtFdESQ%3D%3D Host: - api.vantage.sh User-Agent: - python-httpx/0.28.1 method: GET - uri: https://api.vantage.sh/v2/virtual_tag_configs/vtag_b796efff429f0d48 + uri: https://api.vantage.sh/v2/virtual_tag_configs/vtag_2054620975c42e7e response: body: - string: '{"errors":["VirtualTagConfig vtag_b796efff429f0d48 not found."]}' + string: '{"errors":["VirtualTagConfig vtag_2054620975c42e7e not found."]}' headers: Access-Control-Allow-Origin: - '*' @@ -212,15 +212,15 @@ interactions: Connection: - keep-alive Content-Security-Policy: - - 'default-src ''self'' https:; font-src ''self'' https: data: https://fonts.gstatic.com; - img-src ''self'' https: data:; object-src ''none''; script-src ''self'' https: - ''unsafe-inline''; style-src ''self'' https: https://fonts.googleapis.com - ''unsafe-inline''; connect-src ''self'' https: https://browser-intake-datadoghq.com; - report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' + - 'default-src ''self'' https:; frame-ancestors ''self''; font-src ''self'' + https: data: https://fonts.gstatic.com; img-src ''self'' https: data:; object-src + ''none''; script-src ''self'' https: ''unsafe-inline''; style-src ''self'' + https: https://fonts.googleapis.com ''unsafe-inline''; connect-src ''self'' + https: wss: https://browser-intake-datadoghq.com; report-uri https://browser-intake-datadoghq.com/api/v2/logs?dd-api-key=pub6a4daf9be897fccfebb14341baa5d70c&dd-evp-origin=content-security-policy&ddsource=csp-report' Content-Type: - application/json Set-Cookie: - - _stratus_session=V5ZGQ98PyANQRMsOiRlDfseWxsxuqTq3JodMAXmAtxogVdWGjFinv%2Boe8qtB09TuVUbYtCvbb2D25xSmfS3U9i9P3gEqLKkmiBufKogKnD%2BLr5vFEGLWb%2BqfENOSlh7rnm%2BRz%2F9Xh4JxKOT%2BOxDdWEJaC4ebFRcI0fC6m2uRMlwUkv0IXJARx2I6B00dfUcWV0c2YeF2TWY%3D--KlD6nDPDUMbwaHi0--oeHitFXEQnmPcm5FP4vGvQ%3D%3D; + - _stratus_session=M0v3G84ZRIVJIHM1JBLfyNqDLNfES19OOqOhutBIEBc4BGPdmyaqTyMxhKX1oVQgX9LeI%2BA3e6ClaP5yOhV8cmPO0UzAYxtvtSeO7eN6ef4DI6hH%2FFlV7mHm4FjJwsXTVXevlqCqWpWNo9oxXxBVRej3DjV3hdTRo2bWTJ1FroDf2TXTu6LTKxPYmZ1e6mgXczjYAb4Ieu8%3D--l8jWYYiB44prohhf--dOATVojRr9%2Bise2bVb8ysQ%3D%3D; path=/; secure; HttpOnly; SameSite=Lax Strict-Transport-Security: - max-age=63072000; includeSubDomains @@ -231,11 +231,11 @@ interactions: X-Rate-Limit-Limit: - '1000' X-Rate-Limit-Remaining: - - '394' + - '993' X-Rate-Limit-Reset: - - '1770576040' + - '1787079927' X-Runtime: - - '0.030305' + - '0.030012' content-length: - '64' status: diff --git a/uv.lock b/uv.lock index ef2c733..851d704 100644 --- a/uv.lock +++ b/uv.lock @@ -109,7 +109,7 @@ wheels = [ [[package]] name = "client-for-vantage" -version = "2.1.1" +version = "2.2.0" source = { editable = "." } dependencies = [ { name = "httpx" }, diff --git a/vantage_sdk/models/__init__.py b/vantage_sdk/models/__init__.py index ada836e..4e5ea5a 100644 --- a/vantage_sdk/models/__init__.py +++ b/vantage_sdk/models/__init__.py @@ -62,6 +62,7 @@ TagKeyParams, TeamTokenParams, UnitCostsDataExportsPostRequest, + UpdateVirtualTagConfigValue, UserTokenParams, VirtualTagConfig, VirtualTagConfigCollapsedTagKey, @@ -124,6 +125,7 @@ "TagKeyParams", "TeamTokenParams", "UnitCostsDataExportsPostRequest", + "UpdateVirtualTagConfigValue", "UserTokenParams", "VirtualTagConfig", "VirtualTagConfigCollapsedTagKey", diff --git a/vantage_sdk/models/common.py b/vantage_sdk/models/common.py index 610717c..a1baa45 100644 --- a/vantage_sdk/models/common.py +++ b/vantage_sdk/models/common.py @@ -58,6 +58,7 @@ recommendation_provider_resources as recommendation_provider_resources_model, recommendations as recommendations_model, update_budget_alert as update_budget_alert_model, + update_virtual_tag_config_value as update_virtual_tag_config_value_model, update_integration as update_integration_model, update_workspace as update_workspace_model, ) @@ -66,6 +67,11 @@ virtual_tag_config_value_cost_metric_aggregation_model.VirtualTagConfigValueCostMetricAggregation ) +# Stable alias: the upstream spec duplicates this schema inline and as a named schema, which +# makes the generated wildcard exports mangle the class name (see *_value1 modules). This pins +# the public name to the model referenced by UpdateVirtualTagConfig.values +UpdateVirtualTagConfigValue = update_virtual_tag_config_value_model.UpdateVirtualTagConfigValue + # -------------------------------- # Token Parameter Classes # -------------------------------- diff --git a/vantage_sdk/models/gen_models/__init__.py b/vantage_sdk/models/gen_models/__init__.py index 1929e01..e030e3b 100644 --- a/vantage_sdk/models/gen_models/__init__.py +++ b/vantage_sdk/models/gen_models/__init__.py @@ -35,7 +35,12 @@ from .update_virtual_tag_config_value_date_range import UpdateVirtualTagConfigValueDateRange from .update_virtual_tag_config_value_cost_metric_aggregation import UpdateVirtualTagConfigValueCostMetricAggregation from .update_virtual_tag_config_value_cost_metric import UpdateVirtualTagConfigValueCostMetric -from .update_virtual_tag_config_value import UpdateVirtualTagConfigValue +from .update_virtual_tag_config_value1_percentage import UpdateVirtualTagConfigValue1Percentage +from .update_virtual_tag_config_value1_label_transform_type import UpdateVirtualTagConfigValue1LabelTransformType +from .update_virtual_tag_config_value1_label_transform import UpdateVirtualTagConfigValue1LabelTransform +from .update_virtual_tag_config_value1_date_range import UpdateVirtualTagConfigValue1DateRange +from .update_virtual_tag_config_value1_cost_metric_aggregation import UpdateVirtualTagConfigValue1CostMetricAggregation +from .update_virtual_tag_config_value1_cost_metric import UpdateVirtualTagConfigValue1CostMetric from .update_virtual_tag_config_collapsed_tag_key import UpdateVirtualTagConfigCollapsedTagKey from .update_virtual_tag_config import UpdateVirtualTagConfig from .update_user import UpdateUser @@ -45,9 +50,13 @@ from .update_sso_connection_for_managed_account import UpdateSsoConnectionForManagedAccount from .update_segment_report_settings import UpdateSegmentReportSettings from .update_segment import UpdateSegment +from .update_scenario_model_period_amount_type import UpdateScenarioModelPeriodAmountType +from .update_scenario_model_period import UpdateScenarioModelPeriod +from .update_scenario_model import UpdateScenarioModel from .update_saved_filter import UpdateSavedFilter from .update_resource_report import UpdateResourceReport from .update_report_notification import UpdateReportNotification +from .update_report_forecast import UpdateReportForecast from .update_recommendation_view import UpdateRecommendationView from .update_network_flow_report_grouping import UpdateNetworkFlowReportGrouping from .update_network_flow_report_flow_weight import UpdateNetworkFlowReportFlowWeight @@ -126,6 +135,7 @@ from .update_async_virtual_tag_config import UpdateAsyncVirtualTagConfig from .update_anomaly_notification import UpdateAnomalyNotification from .update_anomaly_alert import UpdateAnomalyAlert +from .update_annotation import UpdateAnnotation from .update_access_grant_access import UpdateAccessGrantAccess from .update_access_grant import UpdateAccessGrant from .unit_costs_get_parameters_query_order import UnitCostsGetParametersQueryOrder @@ -156,6 +166,11 @@ from .segments import Segments from .segment_report_settings import SegmentReportSettings from .segment import Segment +from .scenario_models_get_parameters_query import ScenarioModelsGetParametersQuery +from .scenario_models import ScenarioModels +from .scenario_model_period_amount_type import ScenarioModelPeriodAmountType +from .scenario_model_period import ScenarioModelPeriod +from .scenario_model import ScenarioModel from .saved_filters_get_parameters_query import SavedFiltersGetParametersQuery from .saved_filters import SavedFilters from .saved_filter import SavedFilter @@ -174,6 +189,9 @@ from .report_notification_frequency import ReportNotificationFrequency from .report_notification_change import ReportNotificationChange from .report_notification import ReportNotification +from .report_forecasts_get_parameters_query import ReportForecastsGetParametersQuery +from .report_forecasts import ReportForecasts +from .report_forecast import ReportForecast from .recommendations_recommendation_token_resources_get_parameters_query import RecommendationsRecommendationTokenResourcesGetParametersQuery from .recommendations_get_parameters_query_status import RecommendationsGetParametersQueryStatus from .recommendations_get_parameters_query_provider_id import RecommendationsGetParametersQueryProviderId @@ -262,7 +280,12 @@ from .create_virtual_tag_config_value_date_range import CreateVirtualTagConfigValueDateRange from .create_virtual_tag_config_value_cost_metric_aggregation import CreateVirtualTagConfigValueCostMetricAggregation from .create_virtual_tag_config_value_cost_metric import CreateVirtualTagConfigValueCostMetric -from .create_virtual_tag_config_value import CreateVirtualTagConfigValue +from .create_virtual_tag_config_value1_percentage import CreateVirtualTagConfigValue1Percentage +from .create_virtual_tag_config_value1_label_transform_type import CreateVirtualTagConfigValue1LabelTransformType +from .create_virtual_tag_config_value1_label_transform import CreateVirtualTagConfigValue1LabelTransform +from .create_virtual_tag_config_value1_date_range import CreateVirtualTagConfigValue1DateRange +from .create_virtual_tag_config_value1_cost_metric_aggregation import CreateVirtualTagConfigValue1CostMetricAggregation +from .create_virtual_tag_config_value1_cost_metric import CreateVirtualTagConfigValue1CostMetric from .create_virtual_tag_config_collapsed_tag_key import CreateVirtualTagConfigCollapsedTagKey from .create_virtual_tag_config import CreateVirtualTagConfig from .create_user_feedback import CreateUserFeedback @@ -274,9 +297,13 @@ from .create_sso_connection_for_managed_account import CreateSsoConnectionForManagedAccount from .create_segment_report_settings import CreateSegmentReportSettings from .create_segment import CreateSegment +from .create_scenario_model_period_amount_type import CreateScenarioModelPeriodAmountType +from .create_scenario_model_period import CreateScenarioModelPeriod +from .create_scenario_model import CreateScenarioModel from .create_saved_filter import CreateSavedFilter from .create_resource_report import CreateResourceReport from .create_report_notification import CreateReportNotification +from .create_report_forecast import CreateReportForecast from .create_recommendation_view import CreateRecommendationView from .create_network_flow_report_grouping import CreateNetworkFlowReportGrouping from .create_network_flow_report_flow_weight import CreateNetworkFlowReportFlowWeight @@ -351,6 +378,7 @@ from .create_billing_profile import CreateBillingProfile from .create_azure_integration import CreateAzureIntegration from .create_anomaly_notification import CreateAnomalyNotification +from .create_annotation import CreateAnnotation from .create_access_grant_access import CreateAccessGrantAccess from .create_access_grant import CreateAccessGrant from .costs_get_parameters_query_settings_aggregate_by import CostsGetParametersQuerySettingsAggregateBy @@ -378,6 +406,7 @@ from .cost_provider import CostProvider, CostProviderModel from .cost_partial import CostPartial from .cost_count import CostCount +from .cost_alerts_get_parameters_query import CostAlertsGetParametersQuery from .cost_alerts_cost_alert_token_events_get_parameters_query import CostAlertsCostAlertTokenEventsGetParametersQuery from .cost_alerts import CostAlerts from .cost_alert_events import CostAlertEvents @@ -449,6 +478,9 @@ from .anomaly_alerts_get_parameters_query import AnomalyAlertsGetParametersQuery from .anomaly_alerts import AnomalyAlerts from .anomaly_alert import AnomalyAlert +from .annotations_get_parameters_query import AnnotationsGetParametersQuery +from .annotations import Annotations +from .annotation import Annotation from .adjustment_item_calculation_type import AdjustmentItemCalculationType from .adjustment_item_adjustment_type import AdjustmentItemAdjustmentType from .adjustment_item import AdjustmentItem @@ -459,12 +491,16 @@ from .access_grant import AccessGrant from .business_metrics_business_metric_token_values_csv_put_request1 import BusinessMetricsBusinessMetricTokenValuesCsvPutRequest as BusinessMetricsBusinessMetricTokenValuesCsvPutRequest1BusinessMetricsBusinessMetricTokenValuesCsvPutRequest from .business_metrics_business_metric_token_values_csv_put_request import BusinessMetricsBusinessMetricTokenValuesCsvPutRequest as BusinessMetricsBusinessMetricTokenValuesCsvPutRequestBusinessMetricsBusinessMetricTokenValuesCsvPutRequest +from .create_virtual_tag_config_value1 import CreateVirtualTagConfigValue as CreateVirtualTagConfigValue1CreateVirtualTagConfigValue +from .create_virtual_tag_config_value import CreateVirtualTagConfigValue as CreateVirtualTagConfigValueCreateVirtualTagConfigValue from .download_invoice1 import DownloadInvoice as DownloadInvoice1DownloadInvoice from .download_invoice import DownloadInvoice as DownloadInvoiceDownloadInvoice from .exchange_rates_csv_post_request1 import ExchangeRatesCsvPostRequest as ExchangeRatesCsvPostRequest1ExchangeRatesCsvPostRequest from .exchange_rates_csv_post_request import ExchangeRatesCsvPostRequest as ExchangeRatesCsvPostRequestExchangeRatesCsvPostRequest from .integrations_integration_token_costs_csv_post_request1 import IntegrationsIntegrationTokenCostsCsvPostRequest as IntegrationsIntegrationTokenCostsCsvPostRequest1IntegrationsIntegrationTokenCostsCsvPostRequest from .integrations_integration_token_costs_csv_post_request import IntegrationsIntegrationTokenCostsCsvPostRequest as IntegrationsIntegrationTokenCostsCsvPostRequestIntegrationsIntegrationTokenCostsCsvPostRequest +from .update_virtual_tag_config_value1 import UpdateVirtualTagConfigValue as UpdateVirtualTagConfigValue1UpdateVirtualTagConfigValue +from .update_virtual_tag_config_value import UpdateVirtualTagConfigValue as UpdateVirtualTagConfigValueUpdateVirtualTagConfigValue __all__ = [ "AccessGrant", @@ -475,6 +511,9 @@ "AdjustmentItem", "AdjustmentItemAdjustmentType", "AdjustmentItemCalculationType", + "Annotation", + "Annotations", + "AnnotationsGetParametersQuery", "AnomalyAlert", "AnomalyAlerts", "AnomalyAlertsGetParametersQuery", @@ -548,6 +587,7 @@ "CostAlertEvents", "CostAlerts", "CostAlertsCostAlertTokenEventsGetParametersQuery", + "CostAlertsGetParametersQuery", "CostCount", "CostPartial", "CostProvider", @@ -576,6 +616,7 @@ "CostsGetParametersQuerySettingsAggregateBy", "CreateAccessGrant", "CreateAccessGrantAccess", + "CreateAnnotation", "CreateAnomalyNotification", "CreateAzureIntegration", "CreateBillingProfile", @@ -650,9 +691,13 @@ "CreateNetworkFlowReportFlowWeight", "CreateNetworkFlowReportGrouping", "CreateRecommendationView", + "CreateReportForecast", "CreateReportNotification", "CreateResourceReport", "CreateSavedFilter", + "CreateScenarioModel", + "CreateScenarioModelPeriod", + "CreateScenarioModelPeriodAmountType", "CreateSegment", "CreateSegmentReportSettings", "CreateSsoConnectionForManagedAccount", @@ -664,9 +709,16 @@ "CreateUserFeedback", "CreateVirtualTagConfig", "CreateVirtualTagConfigCollapsedTagKey", - "CreateVirtualTagConfigValue", + "CreateVirtualTagConfigValue1CostMetric", + "CreateVirtualTagConfigValue1CostMetricAggregation", + "CreateVirtualTagConfigValue1CreateVirtualTagConfigValue", + "CreateVirtualTagConfigValue1DateRange", + "CreateVirtualTagConfigValue1LabelTransform", + "CreateVirtualTagConfigValue1LabelTransformType", + "CreateVirtualTagConfigValue1Percentage", "CreateVirtualTagConfigValueCostMetric", "CreateVirtualTagConfigValueCostMetricAggregation", + "CreateVirtualTagConfigValueCreateVirtualTagConfigValue", "CreateVirtualTagConfigValueDateRange", "CreateVirtualTagConfigValueLabelTransform", "CreateVirtualTagConfigValuePercentage", @@ -759,6 +811,9 @@ "RecommendationsGetParametersQueryProviderId", "RecommendationsGetParametersQueryStatus", "RecommendationsRecommendationTokenResourcesGetParametersQuery", + "ReportForecast", + "ReportForecasts", + "ReportForecastsGetParametersQuery", "ReportNotification", "ReportNotificationChange", "ReportNotificationFrequency", @@ -777,6 +832,11 @@ "SavedFilter", "SavedFilters", "SavedFiltersGetParametersQuery", + "ScenarioModel", + "ScenarioModelPeriod", + "ScenarioModelPeriodAmountType", + "ScenarioModels", + "ScenarioModelsGetParametersQuery", "Segment", "SegmentReportSettings", "Segments", @@ -807,6 +867,7 @@ "UnitCostsGetParametersQueryOrder", "UpdateAccessGrant", "UpdateAccessGrantAccess", + "UpdateAnnotation", "UpdateAnomalyAlert", "UpdateAnomalyNotification", "UpdateAsyncVirtualTagConfig", @@ -885,9 +946,13 @@ "UpdateNetworkFlowReportFlowWeight", "UpdateNetworkFlowReportGrouping", "UpdateRecommendationView", + "UpdateReportForecast", "UpdateReportNotification", "UpdateResourceReport", "UpdateSavedFilter", + "UpdateScenarioModel", + "UpdateScenarioModelPeriod", + "UpdateScenarioModelPeriodAmountType", "UpdateSegment", "UpdateSegmentReportSettings", "UpdateSsoConnectionForManagedAccount", @@ -897,12 +962,19 @@ "UpdateUser", "UpdateVirtualTagConfig", "UpdateVirtualTagConfigCollapsedTagKey", - "UpdateVirtualTagConfigValue", + "UpdateVirtualTagConfigValue1CostMetric", + "UpdateVirtualTagConfigValue1CostMetricAggregation", + "UpdateVirtualTagConfigValue1DateRange", + "UpdateVirtualTagConfigValue1LabelTransform", + "UpdateVirtualTagConfigValue1LabelTransformType", + "UpdateVirtualTagConfigValue1Percentage", + "UpdateVirtualTagConfigValue1UpdateVirtualTagConfigValue", "UpdateVirtualTagConfigValueCostMetric", "UpdateVirtualTagConfigValueCostMetricAggregation", "UpdateVirtualTagConfigValueDateRange", "UpdateVirtualTagConfigValueLabelTransform", "UpdateVirtualTagConfigValuePercentage", + "UpdateVirtualTagConfigValueUpdateVirtualTagConfigValue", "UpdateWorkspace", "UpdateWorkspaceCurrency", "UpdateWorkspaceExchangeRateDate", diff --git a/vantage_sdk/models/gen_models/annotation.py b/vantage_sdk/models/gen_models/annotation.py new file mode 100644 index 0000000..2283a27 --- /dev/null +++ b/vantage_sdk/models/gen_models/annotation.py @@ -0,0 +1,21 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from typing import Annotated +from pydantic import BaseModel, ConfigDict, Field +from collections.abc import Sequence + + +class Annotation(BaseModel): + """ + Annotation model + """ + model_config = ConfigDict( + populate_by_name=True, + ) + token: Annotated[str, Field(description='The unique token identifying the Annotation.')] + title: Annotated[str, Field(description='The title of the Annotation.')] + report_tokens: Annotated[Sequence[str], Field(description='The tokens of the Reports associated with the Annotation.')] + date: Annotated[str | None, Field(description='The date of the Annotation. ISO 8601 formatted.', examples=['2026-08-12'])] + message: Annotated[str | None, Field(description='The message of the Annotation.')] diff --git a/vantage_sdk/models/gen_models/annotations.py b/vantage_sdk/models/gen_models/annotations.py new file mode 100644 index 0000000..c552e01 --- /dev/null +++ b/vantage_sdk/models/gen_models/annotations.py @@ -0,0 +1,18 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from collections.abc import Sequence +from pydantic import BaseModel, ConfigDict +from . import annotation, links as links_1 + + +class Annotations(BaseModel): + """ + Annotations model + """ + model_config = ConfigDict( + populate_by_name=True, + ) + links: links_1.Links | None = None + annotations: Sequence[annotation.Annotation] diff --git a/vantage_sdk/models/gen_models/annotations_get_parameters_query.py b/vantage_sdk/models/gen_models/annotations_get_parameters_query.py new file mode 100644 index 0000000..68f4ded --- /dev/null +++ b/vantage_sdk/models/gen_models/annotations_get_parameters_query.py @@ -0,0 +1,14 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from pydantic import BaseModel, ConfigDict + + +class AnnotationsGetParametersQuery(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + page: int | None = None + limit: int | None = None + report_token: str | None = None diff --git a/vantage_sdk/models/gen_models/anomaly_notification.py b/vantage_sdk/models/gen_models/anomaly_notification.py index f5a15ac..0dd87de 100644 --- a/vantage_sdk/models/gen_models/anomaly_notification.py +++ b/vantage_sdk/models/gen_models/anomaly_notification.py @@ -19,5 +19,6 @@ class AnomalyNotification(BaseModel): created_at: Annotated[str, Field(description='The date and time, in UTC, the AnomalyNotification was created. ISO 8601 Formatted.', examples=['2023-08-04T00:00:00Z'])] updated_at: Annotated[str, Field(description='The date and time, in UTC, the AnomalyNotification was last updated at. ISO 8601 Formatted.', examples=['2023-08-04T00:00:00Z'])] threshold: Annotated[int, Field(description='The threshold amount that must be met for the notification to fire.')] - user_tokens: Annotated[Sequence[str], Field(description='The tokens of the users that receive the notification.')] + user_tokens: Annotated[Sequence[str], Field(description='The tokens of organization users that receive the notification. Freeform verified-domain emails are not included; see recipient_emails.')] + recipient_emails: Annotated[Sequence[str], Field(description='The email addresses that receive the notification, including organization users and verified-domain addresses.')] recipient_channels: Annotated[Sequence[str], Field(description='The channels that the notification is sent to.')] diff --git a/vantage_sdk/models/gen_models/anomaly_notifications_get_parameters_query.py b/vantage_sdk/models/gen_models/anomaly_notifications_get_parameters_query.py index 972b847..9fecfa4 100644 --- a/vantage_sdk/models/gen_models/anomaly_notifications_get_parameters_query.py +++ b/vantage_sdk/models/gen_models/anomaly_notifications_get_parameters_query.py @@ -11,3 +11,5 @@ class AnomalyNotificationsGetParametersQuery(BaseModel): ) page: int | None = None limit: int | None = None + workspace_token: str | None = None + cost_report_token: str | None = None diff --git a/vantage_sdk/models/gen_models/audit_logs_get_parameters_query.py b/vantage_sdk/models/gen_models/audit_logs_get_parameters_query.py index 68da23b..067a23c 100644 --- a/vantage_sdk/models/gen_models/audit_logs_get_parameters_query.py +++ b/vantage_sdk/models/gen_models/audit_logs_get_parameters_query.py @@ -2,7 +2,7 @@ # filename: openapi_spec.json from __future__ import annotations -from datetime import date +from datetime import date as date_aliased from pydantic import BaseModel, ConfigDict from . import audit_logs_get_parameters_query_action, audit_logs_get_parameters_query_object_type, audit_logs_get_parameters_query_source @@ -21,5 +21,5 @@ class AuditLogsGetParametersQuery(BaseModel): object_type: audit_logs_get_parameters_query_object_type.AuditLogsGetParametersQueryObjectType | None = None token: str | None = None object_token: str | None = None - start_date: date | None = None - end_date: date | None = None + start_date: date_aliased | None = None + end_date: date_aliased | None = None diff --git a/vantage_sdk/models/gen_models/budget_alert.py b/vantage_sdk/models/gen_models/budget_alert.py index 826159b..5005de2 100644 --- a/vantage_sdk/models/gen_models/budget_alert.py +++ b/vantage_sdk/models/gen_models/budget_alert.py @@ -19,7 +19,8 @@ class BudgetAlert(BaseModel): created_at: Annotated[str, Field(description='The date and time, in UTC, the Budget Alert was created. ISO 8601 Formatted.', examples=['2024-03-19T00:00:00Z'])] workspace_token: Annotated[str | None, Field(description='The token for the Workspace the ResourceReport is a part of.')] user_token: Annotated[str | None, Field(description='The token for the User who created this BudgetAlert.')] = None - user_tokens: Annotated[Sequence[str], Field(description='The Users that receive the alert.')] + user_tokens: Annotated[Sequence[str], Field(description='The tokens of organization users that receive the alert. Freeform verified-domain emails are not included; see recipient_emails.')] + recipient_emails: Annotated[Sequence[str], Field(description='The email addresses that receive the alert, including organization users and verified-domain addresses.')] duration_in_days: Annotated[int | None, Field(description='The number of days from the start or end of the month to trigger the alert if the threshold is reached.')] threshold: Annotated[int, Field(description='Alerts only send if they reach this number (as a percentage). When threshold is 100, that means alerts are triggered once costs reach 100% of the budget.', examples=[75])] period_to_track: Annotated[str | None, Field(description='The period tracked on the alert. Used with duration_in_days to determine the time window of the alert. Possible values: start_of_the_month, end_of_the_month.', examples=['start_of_the_month'])] diff --git a/vantage_sdk/models/gen_models/budget_alerts_get_parameters_query.py b/vantage_sdk/models/gen_models/budget_alerts_get_parameters_query.py index 27700e3..aa6e622 100644 --- a/vantage_sdk/models/gen_models/budget_alerts_get_parameters_query.py +++ b/vantage_sdk/models/gen_models/budget_alerts_get_parameters_query.py @@ -11,3 +11,5 @@ class BudgetAlertsGetParametersQuery(BaseModel): ) page: int | None = None limit: int | None = None + workspace_token: str | None = None + budget_token: str | None = None diff --git a/vantage_sdk/models/gen_models/budgets_get_parameters_query.py b/vantage_sdk/models/gen_models/budgets_get_parameters_query.py index 99304a9..629cff3 100644 --- a/vantage_sdk/models/gen_models/budgets_get_parameters_query.py +++ b/vantage_sdk/models/gen_models/budgets_get_parameters_query.py @@ -11,3 +11,5 @@ class BudgetsGetParametersQuery(BaseModel): ) page: int | None = None limit: int | None = None + q: str | None = None + workspace_token: str | None = None diff --git a/vantage_sdk/models/gen_models/business_metrics_business_metric_token_forecasted_values_get_parameters_query.py b/vantage_sdk/models/gen_models/business_metrics_business_metric_token_forecasted_values_get_parameters_query.py index 127ca5c..887ceae 100644 --- a/vantage_sdk/models/gen_models/business_metrics_business_metric_token_forecasted_values_get_parameters_query.py +++ b/vantage_sdk/models/gen_models/business_metrics_business_metric_token_forecasted_values_get_parameters_query.py @@ -4,7 +4,7 @@ from __future__ import annotations from typing import Annotated from pydantic import BaseModel, ConfigDict, Field -from datetime import date +from datetime import date as date_aliased class BusinessMetricsBusinessMetricTokenForecastedValuesGetParametersQuery(BaseModel): @@ -13,4 +13,4 @@ class BusinessMetricsBusinessMetricTokenForecastedValuesGetParametersQuery(BaseM ) page: int | None = None limit: Annotated[int | None, Field(ge=1, le=5000)] = None - start_date: date | None = None + start_date: date_aliased | None = None diff --git a/vantage_sdk/models/gen_models/business_metrics_business_metric_token_values_get_parameters_query.py b/vantage_sdk/models/gen_models/business_metrics_business_metric_token_values_get_parameters_query.py index 29d4c14..c8974f5 100644 --- a/vantage_sdk/models/gen_models/business_metrics_business_metric_token_values_get_parameters_query.py +++ b/vantage_sdk/models/gen_models/business_metrics_business_metric_token_values_get_parameters_query.py @@ -4,7 +4,7 @@ from __future__ import annotations from typing import Annotated from pydantic import BaseModel, ConfigDict, Field -from datetime import date +from datetime import date as date_aliased from collections.abc import Sequence from . import business_metrics_business_metric_token_values_get_parameters_query_date_bin @@ -15,6 +15,6 @@ class BusinessMetricsBusinessMetricTokenValuesGetParametersQuery(BaseModel): ) page: int | None = None limit: Annotated[int | None, Field(ge=1, le=5000)] = None - start_date: date | None = None + start_date: date_aliased | None = None label_values: Sequence[str] | None = None date_bin: business_metrics_business_metric_token_values_get_parameters_query_date_bin.BusinessMetricsBusinessMetricTokenValuesGetParametersQueryDateBin | None = None diff --git a/vantage_sdk/models/gen_models/business_metrics_get_parameters_query.py b/vantage_sdk/models/gen_models/business_metrics_get_parameters_query.py index b9a952a..48b5b43 100644 --- a/vantage_sdk/models/gen_models/business_metrics_get_parameters_query.py +++ b/vantage_sdk/models/gen_models/business_metrics_get_parameters_query.py @@ -12,3 +12,4 @@ class BusinessMetricsGetParametersQuery(BaseModel): ) page: int | None = None limit: Annotated[int | None, Field(ge=1, le=5000)] = None + q: str | None = None diff --git a/vantage_sdk/models/gen_models/canvases_get_parameters_query.py b/vantage_sdk/models/gen_models/canvases_get_parameters_query.py index 71f01fa..4d299fa 100644 --- a/vantage_sdk/models/gen_models/canvases_get_parameters_query.py +++ b/vantage_sdk/models/gen_models/canvases_get_parameters_query.py @@ -11,3 +11,5 @@ class CanvasesGetParametersQuery(BaseModel): ) page: int | None = None limit: int | None = None + workspace_token: str | None = None + q: str | None = None diff --git a/vantage_sdk/models/gen_models/cost_alerts_get_parameters_query.py b/vantage_sdk/models/gen_models/cost_alerts_get_parameters_query.py new file mode 100644 index 0000000..b4eab9e --- /dev/null +++ b/vantage_sdk/models/gen_models/cost_alerts_get_parameters_query.py @@ -0,0 +1,15 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from pydantic import BaseModel, ConfigDict + + +class CostAlertsGetParametersQuery(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + page: int | None = None + limit: int | None = None + q: str | None = None + workspace_token: str | None = None diff --git a/vantage_sdk/models/gen_models/cost_provider.py b/vantage_sdk/models/gen_models/cost_provider.py index 3413963..108c48f 100644 --- a/vantage_sdk/models/gen_models/cost_provider.py +++ b/vantage_sdk/models/gen_models/cost_provider.py @@ -48,6 +48,12 @@ class CostProvider(StrEnum): baseten = 'baseten' cloudflare = 'cloudflare' fireworks_ai = 'fireworks_ai' + cartesia = 'cartesia' + depot = 'depot' + xai = 'xai' + digital_ocean = 'digital_ocean' + together_ai = 'together_ai' + coreweave = 'coreweave' class CostProviderModel(BaseModel): diff --git a/vantage_sdk/models/gen_models/cost_provider_accounts_get_parameters_query_provider.py b/vantage_sdk/models/gen_models/cost_provider_accounts_get_parameters_query_provider.py index 5515eb3..26cdb6d 100644 --- a/vantage_sdk/models/gen_models/cost_provider_accounts_get_parameters_query_provider.py +++ b/vantage_sdk/models/gen_models/cost_provider_accounts_get_parameters_query_provider.py @@ -43,3 +43,9 @@ class CostProviderAccountsGetParametersQueryProvider(StrEnum): baseten = 'baseten' cloudflare = 'cloudflare' fireworks_ai = 'fireworks_ai' + cartesia = 'cartesia' + depot = 'depot' + xai = 'xai' + digital_ocean = 'digital_ocean' + together_ai = 'together_ai' + coreweave = 'coreweave' diff --git a/vantage_sdk/models/gen_models/cost_reports_cost_report_token_forecasted_costs_get_parameters_query.py b/vantage_sdk/models/gen_models/cost_reports_cost_report_token_forecasted_costs_get_parameters_query.py index e27940f..99d83b4 100644 --- a/vantage_sdk/models/gen_models/cost_reports_cost_report_token_forecasted_costs_get_parameters_query.py +++ b/vantage_sdk/models/gen_models/cost_reports_cost_report_token_forecasted_costs_get_parameters_query.py @@ -2,7 +2,7 @@ # filename: openapi_spec.json from __future__ import annotations -from datetime import date +from datetime import date as date_aliased from pydantic import BaseModel, ConfigDict from . import cost_reports_cost_report_token_forecasted_costs_get_parameters_query_provider @@ -11,8 +11,8 @@ class CostReportsCostReportTokenForecastedCostsGetParametersQuery(BaseModel): model_config = ConfigDict( populate_by_name=True, ) - start_date: date | None = None - end_date: date | None = None + start_date: date_aliased | None = None + end_date: date_aliased | None = None provider: cost_reports_cost_report_token_forecasted_costs_get_parameters_query_provider.CostReportsCostReportTokenForecastedCostsGetParametersQueryProvider | None = None service: str | None = None page: int | None = None diff --git a/vantage_sdk/models/gen_models/cost_reports_cost_report_token_forecasted_costs_get_parameters_query_provider.py b/vantage_sdk/models/gen_models/cost_reports_cost_report_token_forecasted_costs_get_parameters_query_provider.py index 7e779b5..fc3b53b 100644 --- a/vantage_sdk/models/gen_models/cost_reports_cost_report_token_forecasted_costs_get_parameters_query_provider.py +++ b/vantage_sdk/models/gen_models/cost_reports_cost_report_token_forecasted_costs_get_parameters_query_provider.py @@ -43,4 +43,10 @@ class CostReportsCostReportTokenForecastedCostsGetParametersQueryProvider(StrEnu baseten = 'baseten' cloudflare = 'cloudflare' fireworks_ai = 'fireworks_ai' + cartesia = 'cartesia' + depot = 'depot' + xai = 'xai' + digital_ocean = 'digital_ocean' + together_ai = 'together_ai' + coreweave = 'coreweave' all = 'all' diff --git a/vantage_sdk/models/gen_models/cost_reports_get_parameters_query.py b/vantage_sdk/models/gen_models/cost_reports_get_parameters_query.py index 2771ee9..1caa4da 100644 --- a/vantage_sdk/models/gen_models/cost_reports_get_parameters_query.py +++ b/vantage_sdk/models/gen_models/cost_reports_get_parameters_query.py @@ -12,3 +12,5 @@ class CostReportsGetParametersQuery(BaseModel): page: int | None = None limit: int | None = None folder_token: str | None = None + q: str | None = None + workspace_token: str | None = None diff --git a/vantage_sdk/models/gen_models/create_annotation.py b/vantage_sdk/models/gen_models/create_annotation.py new file mode 100644 index 0000000..ea753c5 --- /dev/null +++ b/vantage_sdk/models/gen_models/create_annotation.py @@ -0,0 +1,21 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from collections.abc import Sequence +from typing import Annotated +from pydantic import BaseModel, ConfigDict, Field +from datetime import date as date_aliased + + +class CreateAnnotation(BaseModel): + """ + Create an Annotation. + """ + model_config = ConfigDict( + populate_by_name=True, + ) + report_tokens: Annotated[Sequence[str], Field(description='The tokens of the Reports to annotate.')] + title: Annotated[str | None, Field(description='The title of the Annotation. Defaults to a title generated from the first Report and date.')] = None + date: Annotated[date_aliased, Field(description='The date of the Annotation. ISO 8601 formatted.')] + message: Annotated[str, Field(description='The message of the Annotation.')] diff --git a/vantage_sdk/models/gen_models/create_anomaly_notification.py b/vantage_sdk/models/gen_models/create_anomaly_notification.py index 039110f..a820ca9 100644 --- a/vantage_sdk/models/gen_models/create_anomaly_notification.py +++ b/vantage_sdk/models/gen_models/create_anomaly_notification.py @@ -17,4 +17,5 @@ class CreateAnomalyNotification(BaseModel): cost_report_token: Annotated[str, Field(description='The token of the Cost Report that has the notification.')] threshold: Annotated[int | None, Field(description='The threshold amount that must be met for the notification to fire.')] = None user_tokens: Annotated[Sequence[str] | None, Field(description='The tokens of the Users that receive the notification.')] = None + recipient_emails: Annotated[Sequence[str] | None, Field(description='Email addresses that receive the notification. Must be organization users or addresses on a verified domain.')] = None recipient_channels: Annotated[Sequence[str] | None, Field(description='The Slack/MS Teams channels that receive the notification.')] = None diff --git a/vantage_sdk/models/gen_models/create_budget_alert.py b/vantage_sdk/models/gen_models/create_budget_alert.py index 017a38a..773b46c 100644 --- a/vantage_sdk/models/gen_models/create_budget_alert.py +++ b/vantage_sdk/models/gen_models/create_budget_alert.py @@ -17,6 +17,7 @@ class CreateBudgetAlert(BaseModel): budget_tokens: Annotated[Sequence[str], Field(description='The tokens of the Budget that has the alert.')] threshold: Annotated[int, Field(description='The threshold amount that must be met for the alert to fire.')] user_tokens: Annotated[Sequence[str] | None, Field(description='The tokens of the users that receive the alert.')] = None + recipient_emails: Annotated[Sequence[str] | None, Field(description='Email addresses that receive the alert. Must be organization users or addresses on a verified domain.')] = None duration_in_days: Annotated[str, Field(description='The number of days from the start or end of the month to trigger the alert if the threshold is reached. For the full month, pass an empty value.')] period_to_track: Annotated[str | None, Field(description='The period tracked on the alert. Used with duration_in_days to determine the time window of the alert. Defaults to start_of_the_month if not passed. Possible values: start_of_the_month, end_of_the_month.')] = None recipient_channels: Annotated[Sequence[str] | None, Field(description='The channels receiving the alerts. Requires an integration provider to be connected.')] = None diff --git a/vantage_sdk/models/gen_models/create_budget_period.py b/vantage_sdk/models/gen_models/create_budget_period.py index 88f041d..39c431b 100644 --- a/vantage_sdk/models/gen_models/create_budget_period.py +++ b/vantage_sdk/models/gen_models/create_budget_period.py @@ -2,7 +2,7 @@ # filename: openapi_spec.json from __future__ import annotations -from datetime import date +from datetime import date as date_aliased from typing import Annotated from pydantic import BaseModel, ConfigDict, Field @@ -11,6 +11,6 @@ class CreateBudgetPeriod(BaseModel): model_config = ConfigDict( populate_by_name=True, ) - start_at: Annotated[date, Field(description='The start date of the period.')] - end_at: Annotated[date | None, Field(description='The end date of the period.')] = None + start_at: Annotated[date_aliased, Field(description='The start date of the period.')] + end_at: Annotated[date_aliased | None, Field(description='The end date of the period.')] = None amount: Annotated[float, Field(description='The amount of the period.')] diff --git a/vantage_sdk/models/gen_models/create_cost_alert.py b/vantage_sdk/models/gen_models/create_cost_alert.py index b22d2aa..6644169 100644 --- a/vantage_sdk/models/gen_models/create_cost_alert.py +++ b/vantage_sdk/models/gen_models/create_cost_alert.py @@ -20,7 +20,7 @@ class CreateCostAlert(BaseModel): unit_type: Annotated[str, Field(description="The unit type used to compare costs. Options are 'currency' or 'percentage'.")] workspace_token: Annotated[str, Field(description='The token of the Workspace to add the Cost Alert to.')] report_tokens: Annotated[Sequence[str], Field(description='The tokens of the reports to alert on.')] - email_recipients: Annotated[Sequence[str] | None, Field(description='The email recipients for the Cost Alert.')] = None + email_recipients: Annotated[Sequence[str] | None, Field(description='The email recipients for the Cost Alert. Accepts organization users and emails on verified IdP domains.')] = None slack_channels: Annotated[Sequence[str] | None, Field(description='The Slack channels that will receive the alert.')] = None teams_channels: Annotated[Sequence[str] | None, Field(description='The Microsoft Teams channels that will receive the alert.')] = None minimum_threshold: Annotated[float | None, Field(description="The minimum monetary amount threshold for percentage-based alerts. Only applicable when unit_type is 'percentage'.")] = None diff --git a/vantage_sdk/models/gen_models/create_financial_commitment_report.py b/vantage_sdk/models/gen_models/create_financial_commitment_report.py index b85ad8f..66ef0e5 100644 --- a/vantage_sdk/models/gen_models/create_financial_commitment_report.py +++ b/vantage_sdk/models/gen_models/create_financial_commitment_report.py @@ -4,7 +4,7 @@ from __future__ import annotations from typing import Annotated from pydantic import BaseModel, ConfigDict, Field -from datetime import date +from datetime import date as date_aliased from collections.abc import Sequence from . import create_financial_commitment_report_date_bucket, create_financial_commitment_report_date_interval, create_financial_commitment_report_on_demand_costs_scope @@ -19,8 +19,8 @@ class CreateFinancialCommitmentReport(BaseModel): workspace_token: Annotated[str, Field(description='The Workspace in which the FinancialCommitmentReport will be created.')] title: Annotated[str, Field(description='The title of the FinancialCommitmentReport.')] filter: Annotated[str | None, Field(description='The filter query language to apply to the FinancialCommitmentReport. Additional documentation available at https://docs.vantage.sh/vql.')] = None - start_date: Annotated[date | None, Field(description="The start date of the FinancialCommitmentReport. YYYY-MM-DD formatted. Incompatible with 'date_interval' parameter.", examples=['2024-03-01'])] = None - end_date: Annotated[date | None, Field(description="The end date of the FinancialCommitmentReport. YYYY-MM-DD formatted. Incompatible with 'date_interval' parameter.", examples=['2024-03-01'])] = None + start_date: Annotated[date_aliased | None, Field(description="The start date of the FinancialCommitmentReport. YYYY-MM-DD formatted. Incompatible with 'date_interval' parameter.", examples=['2024-03-01'])] = None + end_date: Annotated[date_aliased | None, Field(description="The end date of the FinancialCommitmentReport. YYYY-MM-DD formatted. Incompatible with 'date_interval' parameter.", examples=['2024-03-01'])] = None date_interval: Annotated[create_financial_commitment_report_date_interval.CreateFinancialCommitmentReportDateInterval | None, Field(description="The date interval of the FinancialCommitmentReport. Unless 'custom' is used, this is incompatible with 'start_date' and 'end_date' parameters. Defaults to 'last_3_months'.")] = None date_bucket: Annotated[create_financial_commitment_report_date_bucket.CreateFinancialCommitmentReportDateBucket | None, Field(description='The date bucket of the FinancialCommitmentReport.')] = None on_demand_costs_scope: Annotated[create_financial_commitment_report_on_demand_costs_scope.CreateFinancialCommitmentReportOnDemandCostsScope | None, Field(description='The scope for the costs. Possible values: discountable, all.')] = None diff --git a/vantage_sdk/models/gen_models/create_kubernetes_efficiency_report.py b/vantage_sdk/models/gen_models/create_kubernetes_efficiency_report.py index 8c5221d..ac5c907 100644 --- a/vantage_sdk/models/gen_models/create_kubernetes_efficiency_report.py +++ b/vantage_sdk/models/gen_models/create_kubernetes_efficiency_report.py @@ -4,7 +4,7 @@ from __future__ import annotations from typing import Annotated from pydantic import BaseModel, ConfigDict, Field -from datetime import date +from datetime import date as date_aliased from collections.abc import Sequence from . import create_kubernetes_efficiency_report_aggregated_by, create_kubernetes_efficiency_report_date_bucket, create_kubernetes_efficiency_report_date_interval @@ -19,8 +19,8 @@ class CreateKubernetesEfficiencyReport(BaseModel): workspace_token: Annotated[str, Field(description='The Workspace in which the KubernetesEfficiencyReport will be created.')] title: Annotated[str, Field(description='The title of the KubernetesEfficiencyReport.')] filter: Annotated[str | None, Field(description='The filter query language to apply to the KubernetesEfficiencyReport. Additional documentation available at https://docs.vantage.sh/vql.')] = None - start_date: Annotated[date | None, Field(description="The start date of the KubernetesEfficiencyReport. ISO 8601 Formatted. Incompatible with 'date_interval' parameter.")] = None - end_date: Annotated[date | None, Field(description="The end date of the KubernetesEfficiencyReport. ISO 8601 Formatted. Incompatible with 'date_interval' parameter.")] = None + start_date: Annotated[date_aliased | None, Field(description="The start date of the KubernetesEfficiencyReport. ISO 8601 Formatted. Incompatible with 'date_interval' parameter.")] = None + end_date: Annotated[date_aliased | None, Field(description="The end date of the KubernetesEfficiencyReport. ISO 8601 Formatted. Incompatible with 'date_interval' parameter.")] = None date_interval: Annotated[create_kubernetes_efficiency_report_date_interval.CreateKubernetesEfficiencyReportDateInterval | None, Field(description="The date interval of the KubernetesEfficiencyReport. Incompatible with 'start_date' and 'end_date' parameters. Defaults to 'this_month' if start_date and end_date are not provided.")] = None aggregated_by: Annotated[create_kubernetes_efficiency_report_aggregated_by.CreateKubernetesEfficiencyReportAggregatedBy | None, Field(description='The column by which the costs are aggregated.')] = None date_bucket: Annotated[create_kubernetes_efficiency_report_date_bucket.CreateKubernetesEfficiencyReportDateBucket | None, Field(description='The date bucket of the KubernetesEfficiencyReport.')] = None diff --git a/vantage_sdk/models/gen_models/create_network_flow_report.py b/vantage_sdk/models/gen_models/create_network_flow_report.py index aa081b0..7ae00ff 100644 --- a/vantage_sdk/models/gen_models/create_network_flow_report.py +++ b/vantage_sdk/models/gen_models/create_network_flow_report.py @@ -4,7 +4,7 @@ from __future__ import annotations from typing import Annotated from pydantic import BaseModel, ConfigDict, Field -from datetime import date +from datetime import date as date_aliased from collections.abc import Sequence from . import create_network_flow_report_date_interval, create_network_flow_report_flow_direction, create_network_flow_report_flow_weight, create_network_flow_report_grouping @@ -19,8 +19,8 @@ class CreateNetworkFlowReport(BaseModel): workspace_token: Annotated[str, Field(description='The Workspace in which the NetworkFlowReport will be created.')] title: Annotated[str, Field(description='The title of the NetworkFlowReport.')] filter: Annotated[str | None, Field(description='The filter query language to apply to the NetworkFlowReport. Additional documentation available at https://docs.vantage.sh/vql.')] = None - start_date: Annotated[date | None, Field(description='The start date of a custom NetworkFlowReport. YYYY-MM-DD formatted.')] = None - end_date: Annotated[date | None, Field(description='The end date of a custom NetworkFlowReport. YYYY-MM-DD formatted.')] = None + start_date: Annotated[date_aliased | None, Field(description='The start date of a custom NetworkFlowReport. YYYY-MM-DD formatted.')] = None + end_date: Annotated[date_aliased | None, Field(description='The end date of a custom NetworkFlowReport. YYYY-MM-DD formatted.')] = None date_interval: Annotated[create_network_flow_report_date_interval.CreateNetworkFlowReportDateInterval | None, Field(description="The date interval of the NetworkFlowReport. Dates are used only for the 'custom' interval. Defaults to 'last_7_days'.")] = None groupings: Annotated[Sequence[create_network_flow_report_grouping.CreateNetworkFlowReportGrouping] | None, Field(description='Grouping values for aggregating data on the NetworkFlowReport. Valid groupings: account_id, az_id, dstaddr, dsthostname, flow_direction, interface_id, instance_id, peer_resource_uuid, peer_account_id, peer_vpc_id, peer_region, peer_az_id, peer_subnet_id, peer_interface_id, peer_instance_id, region, resource_uuid, srcaddr, srchostname, subnet_id, traffic_category, traffic_path, vpc_id.')] = None flow_direction: Annotated[create_network_flow_report_flow_direction.CreateNetworkFlowReportFlowDirection | None, Field(description='The flow direction of the NetworkFlowReport.')] = None diff --git a/vantage_sdk/models/gen_models/create_report_forecast.py b/vantage_sdk/models/gen_models/create_report_forecast.py new file mode 100644 index 0000000..b6e27a5 --- /dev/null +++ b/vantage_sdk/models/gen_models/create_report_forecast.py @@ -0,0 +1,20 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from collections.abc import Sequence +from pydantic import BaseModel, ConfigDict + + +class CreateReportForecast(BaseModel): + """ + Create a scenario-model ReportForecast. + """ + model_config = ConfigDict( + populate_by_name=True, + ) + cost_report_token: str + title: str + scenario_model_tokens: Sequence[str] | None = None + business_metric_token: str | None = None + set_as_default: bool | None = None diff --git a/vantage_sdk/models/gen_models/create_report_notification.py b/vantage_sdk/models/gen_models/create_report_notification.py index 2e6b991..14e518e 100644 --- a/vantage_sdk/models/gen_models/create_report_notification.py +++ b/vantage_sdk/models/gen_models/create_report_notification.py @@ -18,6 +18,7 @@ class CreateReportNotification(BaseModel): cost_report_token: Annotated[str, Field(description='The CostReport token.')] workspace_token: Annotated[str | None, Field(description='The token of the Workspace to add the ReportNotification to. Required if the API token is associated with multiple Workspaces.')] = None user_tokens: Annotated[Sequence[str] | None, Field(description='The Users that receive the notification.')] = None + recipient_emails: Annotated[Sequence[str] | None, Field(description='Email addresses that receive the notification. Must be organization users or addresses on a verified domain.')] = None recipient_channels: Annotated[Sequence[str] | None, Field(description='The Slack or Microsoft Teams channels that receive the notification.')] = None frequency: Annotated[str, Field(description='The frequency the ReportNotification is sent. Possible values: daily, weekly, monthly.')] change: Annotated[str, Field(description='The type of change the ReportNotification is tracking. Possible values: percentage, dollars.')] diff --git a/vantage_sdk/models/gen_models/create_scenario_model.py b/vantage_sdk/models/gen_models/create_scenario_model.py new file mode 100644 index 0000000..bdd8fb2 --- /dev/null +++ b/vantage_sdk/models/gen_models/create_scenario_model.py @@ -0,0 +1,23 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from collections.abc import Sequence +from typing import Annotated +from pydantic import BaseModel, ConfigDict, Field +from . import create_scenario_model_period + + +class CreateScenarioModel(BaseModel): + """ + Create a ScenarioModel. + """ + model_config = ConfigDict( + populate_by_name=True, + ) + title: str + priority: int | None = None + provider: str | None = None + service: str | None = None + workspace_token: str | None = None + periods: Annotated[Sequence[create_scenario_model_period.CreateScenarioModelPeriod] | None, Field(description='The periods for the ScenarioModel.')] = None diff --git a/vantage_sdk/models/gen_models/create_scenario_model_period.py b/vantage_sdk/models/gen_models/create_scenario_model_period.py new file mode 100644 index 0000000..7a42fd1 --- /dev/null +++ b/vantage_sdk/models/gen_models/create_scenario_model_period.py @@ -0,0 +1,17 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from datetime import date as date_aliased +from pydantic import BaseModel, ConfigDict +from . import create_scenario_model_period_amount_type + + +class CreateScenarioModelPeriod(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + start_at: date_aliased + end_at: date_aliased | None = None + amount: float + amount_type: create_scenario_model_period_amount_type.CreateScenarioModelPeriodAmountType diff --git a/vantage_sdk/models/gen_models/canvas_status.py b/vantage_sdk/models/gen_models/create_scenario_model_period_amount_type.py similarity index 51% rename from vantage_sdk/models/gen_models/canvas_status.py rename to vantage_sdk/models/gen_models/create_scenario_model_period_amount_type.py index af91afc..ca6e69d 100644 --- a/vantage_sdk/models/gen_models/canvas_status.py +++ b/vantage_sdk/models/gen_models/create_scenario_model_period_amount_type.py @@ -5,9 +5,6 @@ from enum import StrEnum -class CanvasStatus(StrEnum): - """ - The status of the Canvas. - """ - draft = 'draft' - published = 'published' +class CreateScenarioModelPeriodAmountType(StrEnum): + dollar = 'dollar' + percent = 'percent' diff --git a/vantage_sdk/models/gen_models/create_virtual_tag_config.py b/vantage_sdk/models/gen_models/create_virtual_tag_config.py index b0027ea..ba55530 100644 --- a/vantage_sdk/models/gen_models/create_virtual_tag_config.py +++ b/vantage_sdk/models/gen_models/create_virtual_tag_config.py @@ -4,7 +4,7 @@ from __future__ import annotations from typing import Annotated from pydantic import BaseModel, ConfigDict, Field -from datetime import date +from datetime import date as date_aliased from collections.abc import Sequence from . import create_virtual_tag_config_collapsed_tag_key, create_virtual_tag_config_value @@ -18,6 +18,6 @@ class CreateVirtualTagConfig(BaseModel): ) key: Annotated[str, Field(description='The key of the VirtualTagConfig.')] overridable: Annotated[bool, Field(description='Whether the VirtualTagConfig can override a provider-supplied tag on a matching Cost.')] - backfill_until: Annotated[date | None, Field(description='The earliest month the VirtualTagConfig should be backfilled to.')] = None + backfill_until: Annotated[date_aliased | None, Field(description='The earliest month the VirtualTagConfig should be backfilled to.')] = None collapsed_tag_keys: Annotated[Sequence[create_virtual_tag_config_collapsed_tag_key.CreateVirtualTagConfigCollapsedTagKey] | None, Field(description='Tag keys to collapse values for.')] = None values: Annotated[Sequence[create_virtual_tag_config_value.CreateVirtualTagConfigValue] | None, Field(description='Values for the VirtualTagConfig, with match precedence determined by order in the list.')] = None diff --git a/vantage_sdk/models/gen_models/create_virtual_tag_config_value.py b/vantage_sdk/models/gen_models/create_virtual_tag_config_value.py index dd55cf1..0ffb09a 100644 --- a/vantage_sdk/models/gen_models/create_virtual_tag_config_value.py +++ b/vantage_sdk/models/gen_models/create_virtual_tag_config_value.py @@ -15,6 +15,8 @@ class CreateVirtualTagConfigValue(BaseModel): filter: Annotated[str, Field(description='The filter query language to apply to the value. Additional documentation available at https://docs.vantage.sh/vql.')] name: Annotated[str | None, Field(description='The name of the value.')] = None business_metric_token: Annotated[str | None, Field(description='The token of an associated business metric.')] = None + label_key: Annotated[str | None, Field(description='The business metric label key used for this virtual tag value.')] = None + label_values: Annotated[Sequence[str] | None, Field(description='Optional business metric label values. An empty array includes every value for the label key.')] = None display_name: Annotated[str | None, Field(description='The display name for an allocation value (cost_metric or percentages). Invalid when name is set.')] = None label_transforms: Sequence[create_virtual_tag_config_value_label_transform.CreateVirtualTagConfigValueLabelTransform] | None = None cost_metric: create_virtual_tag_config_value_cost_metric.CreateVirtualTagConfigValueCostMetric | None = None diff --git a/vantage_sdk/models/gen_models/create_virtual_tag_config_value1.py b/vantage_sdk/models/gen_models/create_virtual_tag_config_value1.py new file mode 100644 index 0000000..9f134ad --- /dev/null +++ b/vantage_sdk/models/gen_models/create_virtual_tag_config_value1.py @@ -0,0 +1,27 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from typing import Annotated +from pydantic import BaseModel, ConfigDict, Field +from collections.abc import Sequence +from . import create_virtual_tag_config_value1_cost_metric, create_virtual_tag_config_value1_date_range, create_virtual_tag_config_value1_label_transform, create_virtual_tag_config_value1_percentage + + +class CreateVirtualTagConfigValue(BaseModel): + """ + Create a VirtualTagConfigValue. + """ + model_config = ConfigDict( + populate_by_name=True, + ) + filter: Annotated[str, Field(description='The filter query language to apply to the value. Additional documentation available at https://docs.vantage.sh/vql.')] + name: Annotated[str | None, Field(description='The name of the value.')] = None + business_metric_token: Annotated[str | None, Field(description='The token of an associated business metric.')] = None + label_key: Annotated[str | None, Field(description='The business metric label key used for this virtual tag value.')] = None + label_values: Annotated[Sequence[str] | None, Field(description='Business metric label values. An empty array includes every value for the label key.')] = None + display_name: Annotated[str | None, Field(description='The display name for a cost metric or percentage allocation value.')] = None + label_transforms: Sequence[create_virtual_tag_config_value1_label_transform.CreateVirtualTagConfigValue1LabelTransform] | None = None + cost_metric: create_virtual_tag_config_value1_cost_metric.CreateVirtualTagConfigValue1CostMetric | None = None + percentages: Sequence[create_virtual_tag_config_value1_percentage.CreateVirtualTagConfigValue1Percentage] | None = None + date_ranges: Annotated[Sequence[create_virtual_tag_config_value1_date_range.CreateVirtualTagConfigValue1DateRange] | None, Field(description='Date ranges restricting when this value applies.')] = None diff --git a/vantage_sdk/models/gen_models/create_virtual_tag_config_value1_cost_metric.py b/vantage_sdk/models/gen_models/create_virtual_tag_config_value1_cost_metric.py new file mode 100644 index 0000000..76d5195 --- /dev/null +++ b/vantage_sdk/models/gen_models/create_virtual_tag_config_value1_cost_metric.py @@ -0,0 +1,14 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from pydantic import BaseModel, ConfigDict +from . import create_virtual_tag_config_value1_cost_metric_aggregation + + +class CreateVirtualTagConfigValue1CostMetric(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + filter: str + aggregation: create_virtual_tag_config_value1_cost_metric_aggregation.CreateVirtualTagConfigValue1CostMetricAggregation diff --git a/vantage_sdk/models/gen_models/costs_data_exports_post_parameters_query.py b/vantage_sdk/models/gen_models/create_virtual_tag_config_value1_cost_metric_aggregation.py similarity index 61% rename from vantage_sdk/models/gen_models/costs_data_exports_post_parameters_query.py rename to vantage_sdk/models/gen_models/create_virtual_tag_config_value1_cost_metric_aggregation.py index 3688ebd..e4f7e75 100644 --- a/vantage_sdk/models/gen_models/costs_data_exports_post_parameters_query.py +++ b/vantage_sdk/models/gen_models/create_virtual_tag_config_value1_cost_metric_aggregation.py @@ -2,12 +2,11 @@ # filename: openapi_spec.json from __future__ import annotations -from collections.abc import Sequence from pydantic import BaseModel, ConfigDict -class CostsDataExportsPostParametersQuery(BaseModel): +class CreateVirtualTagConfigValue1CostMetricAggregation(BaseModel): model_config = ConfigDict( populate_by_name=True, ) - groupings: Sequence[str] | None = None + tag: str diff --git a/vantage_sdk/models/gen_models/create_virtual_tag_config_value1_date_range.py b/vantage_sdk/models/gen_models/create_virtual_tag_config_value1_date_range.py new file mode 100644 index 0000000..b721cb1 --- /dev/null +++ b/vantage_sdk/models/gen_models/create_virtual_tag_config_value1_date_range.py @@ -0,0 +1,13 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from pydantic import BaseModel, ConfigDict + + +class CreateVirtualTagConfigValue1DateRange(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + start_date: str | None = None + end_date: str | None = None diff --git a/vantage_sdk/models/gen_models/create_virtual_tag_config_value1_label_transform.py b/vantage_sdk/models/gen_models/create_virtual_tag_config_value1_label_transform.py new file mode 100644 index 0000000..97fd7f5 --- /dev/null +++ b/vantage_sdk/models/gen_models/create_virtual_tag_config_value1_label_transform.py @@ -0,0 +1,16 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from pydantic import BaseModel, ConfigDict +from . import create_virtual_tag_config_value1_label_transform_type + + +class CreateVirtualTagConfigValue1LabelTransform(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + type: create_virtual_tag_config_value1_label_transform_type.CreateVirtualTagConfigValue1LabelTransformType + delimiter: str | None = None + index: int | None = None + template: str | None = None diff --git a/vantage_sdk/models/gen_models/create_virtual_tag_config_value1_label_transform_type.py b/vantage_sdk/models/gen_models/create_virtual_tag_config_value1_label_transform_type.py new file mode 100644 index 0000000..f047c1c --- /dev/null +++ b/vantage_sdk/models/gen_models/create_virtual_tag_config_value1_label_transform_type.py @@ -0,0 +1,10 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from enum import StrEnum + + +class CreateVirtualTagConfigValue1LabelTransformType(StrEnum): + split_ = 'split' + format_ = 'format' diff --git a/vantage_sdk/models/gen_models/create_virtual_tag_config_value1_percentage.py b/vantage_sdk/models/gen_models/create_virtual_tag_config_value1_percentage.py new file mode 100644 index 0000000..0c77bf1 --- /dev/null +++ b/vantage_sdk/models/gen_models/create_virtual_tag_config_value1_percentage.py @@ -0,0 +1,13 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from pydantic import BaseModel, ConfigDict + + +class CreateVirtualTagConfigValue1Percentage(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + value: str + pct: float diff --git a/vantage_sdk/models/gen_models/dashboards_get_parameters_query.py b/vantage_sdk/models/gen_models/dashboards_get_parameters_query.py index f7beb3b..d0bf9ba 100644 --- a/vantage_sdk/models/gen_models/dashboards_get_parameters_query.py +++ b/vantage_sdk/models/gen_models/dashboards_get_parameters_query.py @@ -11,3 +11,5 @@ class DashboardsGetParametersQuery(BaseModel): ) page: int | None = None limit: int | None = None + q: str | None = None + workspace_token: str | None = None diff --git a/vantage_sdk/models/gen_models/financial_commitment_reports_get_parameters_query.py b/vantage_sdk/models/gen_models/financial_commitment_reports_get_parameters_query.py index beafbe1..797de5b 100644 --- a/vantage_sdk/models/gen_models/financial_commitment_reports_get_parameters_query.py +++ b/vantage_sdk/models/gen_models/financial_commitment_reports_get_parameters_query.py @@ -11,3 +11,5 @@ class FinancialCommitmentReportsGetParametersQuery(BaseModel): ) page: int | None = None limit: int | None = None + q: str | None = None + workspace_token: str | None = None diff --git a/vantage_sdk/models/gen_models/folders_get_parameters_query.py b/vantage_sdk/models/gen_models/folders_get_parameters_query.py index 780e520..dfe05a3 100644 --- a/vantage_sdk/models/gen_models/folders_get_parameters_query.py +++ b/vantage_sdk/models/gen_models/folders_get_parameters_query.py @@ -13,3 +13,5 @@ class FoldersGetParametersQuery(BaseModel): page: int | None = None limit: int | None = None type: folders_get_parameters_query_type.FoldersGetParametersQueryType | None = None + q: str | None = None + workspace_token: str | None = None diff --git a/vantage_sdk/models/gen_models/forecasted_cost_provider.py b/vantage_sdk/models/gen_models/forecasted_cost_provider.py index beec9b4..63e0f09 100644 --- a/vantage_sdk/models/gen_models/forecasted_cost_provider.py +++ b/vantage_sdk/models/gen_models/forecasted_cost_provider.py @@ -46,4 +46,10 @@ class ForecastedCostProvider(StrEnum): baseten = 'baseten' cloudflare = 'cloudflare' fireworks_ai = 'fireworks_ai' + cartesia = 'cartesia' + depot = 'depot' + xai = 'xai' + digital_ocean = 'digital_ocean' + together_ai = 'together_ai' + coreweave = 'coreweave' all = 'all' diff --git a/vantage_sdk/models/gen_models/integrations_get_parameters_query_provider.py b/vantage_sdk/models/gen_models/integrations_get_parameters_query_provider.py index 42272f5..dba405c 100644 --- a/vantage_sdk/models/gen_models/integrations_get_parameters_query_provider.py +++ b/vantage_sdk/models/gen_models/integrations_get_parameters_query_provider.py @@ -43,3 +43,9 @@ class IntegrationsGetParametersQueryProvider(StrEnum): baseten = 'baseten' cloudflare = 'cloudflare' fireworks_ai = 'fireworks_ai' + cartesia = 'cartesia' + depot = 'depot' + xai = 'xai' + digital_ocean = 'digital_ocean' + together_ai = 'together_ai' + coreweave = 'coreweave' diff --git a/vantage_sdk/models/gen_models/kubernetes_efficiency_reports_get_parameters_query.py b/vantage_sdk/models/gen_models/kubernetes_efficiency_reports_get_parameters_query.py index e64d2fb..176fe63 100644 --- a/vantage_sdk/models/gen_models/kubernetes_efficiency_reports_get_parameters_query.py +++ b/vantage_sdk/models/gen_models/kubernetes_efficiency_reports_get_parameters_query.py @@ -11,3 +11,5 @@ class KubernetesEfficiencyReportsGetParametersQuery(BaseModel): ) page: int | None = None limit: int | None = None + workspace_token: str | None = None + q: str | None = None diff --git a/vantage_sdk/models/gen_models/network_flow_logs_get_parameters_query.py b/vantage_sdk/models/gen_models/network_flow_logs_get_parameters_query.py index b3da557..b0da713 100644 --- a/vantage_sdk/models/gen_models/network_flow_logs_get_parameters_query.py +++ b/vantage_sdk/models/gen_models/network_flow_logs_get_parameters_query.py @@ -2,7 +2,7 @@ # filename: openapi_spec.json from __future__ import annotations -from datetime import date +from datetime import date as date_aliased from collections.abc import Sequence from pydantic import BaseModel, ConfigDict from . import network_flow_logs_get_parameters_query_date_interval, network_flow_logs_get_parameters_query_flow_direction, network_flow_logs_get_parameters_query_flow_weight, network_flow_logs_get_parameters_query_grouping @@ -16,8 +16,8 @@ class NetworkFlowLogsGetParametersQuery(BaseModel): workspace_token: str | None = None filter: str | None = None date_interval: network_flow_logs_get_parameters_query_date_interval.NetworkFlowLogsGetParametersQueryDateInterval | None = None - start_date: date | None = None - end_date: date | None = None + start_date: date_aliased | None = None + end_date: date_aliased | None = None groupings: Sequence[network_flow_logs_get_parameters_query_grouping.NetworkFlowLogsGetParametersQueryGrouping] | None = None flow_direction: network_flow_logs_get_parameters_query_flow_direction.NetworkFlowLogsGetParametersQueryFlowDirection | None = None flow_weight: network_flow_logs_get_parameters_query_flow_weight.NetworkFlowLogsGetParametersQueryFlowWeight | None = None diff --git a/vantage_sdk/models/gen_models/network_flow_reports_get_parameters_query.py b/vantage_sdk/models/gen_models/network_flow_reports_get_parameters_query.py index 37850ca..8f7783b 100644 --- a/vantage_sdk/models/gen_models/network_flow_reports_get_parameters_query.py +++ b/vantage_sdk/models/gen_models/network_flow_reports_get_parameters_query.py @@ -10,5 +10,6 @@ class NetworkFlowReportsGetParametersQuery(BaseModel): populate_by_name=True, ) q: str | None = None + workspace_token: str | None = None page: int | None = None limit: int | None = None diff --git a/vantage_sdk/models/gen_models/recommendation_views_get_parameters_query.py b/vantage_sdk/models/gen_models/recommendation_views_get_parameters_query.py index 20f529a..03e7100 100644 --- a/vantage_sdk/models/gen_models/recommendation_views_get_parameters_query.py +++ b/vantage_sdk/models/gen_models/recommendation_views_get_parameters_query.py @@ -11,3 +11,5 @@ class RecommendationViewsGetParametersQuery(BaseModel): ) page: int | None = None limit: int | None = None + workspace_token: str | None = None + q: str | None = None diff --git a/vantage_sdk/models/gen_models/report_forecast.py b/vantage_sdk/models/gen_models/report_forecast.py new file mode 100644 index 0000000..6ae1d5c --- /dev/null +++ b/vantage_sdk/models/gen_models/report_forecast.py @@ -0,0 +1,25 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from collections.abc import Sequence +from typing import Annotated +from pydantic import BaseModel, ConfigDict, Field + + +class ReportForecast(BaseModel): + """ + ReportForecast model + """ + model_config = ConfigDict( + populate_by_name=True, + ) + token: str + title: str + cost_report_token: str + scenario_model_tokens: Sequence[str] + business_metric_token: Annotated[str | None, Field(...)] + is_default: bool + created_by_token: Annotated[str | None, Field(...)] + created_at: str + updated_at: str diff --git a/vantage_sdk/models/gen_models/report_forecasts.py b/vantage_sdk/models/gen_models/report_forecasts.py new file mode 100644 index 0000000..fa646a3 --- /dev/null +++ b/vantage_sdk/models/gen_models/report_forecasts.py @@ -0,0 +1,18 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from collections.abc import Sequence +from pydantic import BaseModel, ConfigDict +from . import links as links_1, report_forecast + + +class ReportForecasts(BaseModel): + """ + ReportForecasts model + """ + model_config = ConfigDict( + populate_by_name=True, + ) + links: links_1.Links | None = None + report_forecasts: Sequence[report_forecast.ReportForecast] diff --git a/vantage_sdk/models/gen_models/report_forecasts_get_parameters_query.py b/vantage_sdk/models/gen_models/report_forecasts_get_parameters_query.py new file mode 100644 index 0000000..6febd9d --- /dev/null +++ b/vantage_sdk/models/gen_models/report_forecasts_get_parameters_query.py @@ -0,0 +1,14 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from pydantic import BaseModel, ConfigDict + + +class ReportForecastsGetParametersQuery(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + cost_report_token: str + page: int | None = None + limit: int | None = None diff --git a/vantage_sdk/models/gen_models/report_notification.py b/vantage_sdk/models/gen_models/report_notification.py index a558e66..1f0a4ad 100644 --- a/vantage_sdk/models/gen_models/report_notification.py +++ b/vantage_sdk/models/gen_models/report_notification.py @@ -18,7 +18,8 @@ class ReportNotification(BaseModel): token: str title: Annotated[str, Field(description='The title of the ReportNotification.', examples=['Acme Report Notification'])] cost_report_token: Annotated[str, Field(description='The token for a CostReport the ReportNotification is applied to.', examples=['rprt_abcd1234'])] - user_tokens: Annotated[Sequence[str], Field(description='The Users that receive the notification.')] + user_tokens: Annotated[Sequence[str], Field(description='The tokens of organization users that receive the notification. Freeform verified-domain emails are not included; see recipient_emails.')] + recipient_emails: Annotated[Sequence[str], Field(description='The email addresses that receive the notification, including organization users and verified-domain addresses.')] recipient_channels: Annotated[Sequence[str], Field(description='The Slack or Microsoft Teams channels that receive the notification.')] frequency: Annotated[report_notification_frequency.ReportNotificationFrequency, Field(description='The frequency the ReportNotification is sent.', examples=['weekly'])] change: Annotated[report_notification_change.ReportNotificationChange, Field(description='The type of change the ReportNotification is tracking.', examples=['percentage'])] diff --git a/vantage_sdk/models/gen_models/report_notifications_get_parameters_query.py b/vantage_sdk/models/gen_models/report_notifications_get_parameters_query.py index 66868d0..09efbe7 100644 --- a/vantage_sdk/models/gen_models/report_notifications_get_parameters_query.py +++ b/vantage_sdk/models/gen_models/report_notifications_get_parameters_query.py @@ -11,3 +11,5 @@ class ReportNotificationsGetParametersQuery(BaseModel): ) page: int | None = None limit: int | None = None + workspace_token: str | None = None + q: str | None = None diff --git a/vantage_sdk/models/gen_models/resource_reports_get_parameters_query.py b/vantage_sdk/models/gen_models/resource_reports_get_parameters_query.py index 4aa9e27..1bffbe5 100644 --- a/vantage_sdk/models/gen_models/resource_reports_get_parameters_query.py +++ b/vantage_sdk/models/gen_models/resource_reports_get_parameters_query.py @@ -11,3 +11,5 @@ class ResourceReportsGetParametersQuery(BaseModel): ) page: int | None = None limit: int | None = None + workspace_token: str | None = None + q: str | None = None diff --git a/vantage_sdk/models/gen_models/saved_filters_get_parameters_query.py b/vantage_sdk/models/gen_models/saved_filters_get_parameters_query.py index c1c07f2..2fcf6b7 100644 --- a/vantage_sdk/models/gen_models/saved_filters_get_parameters_query.py +++ b/vantage_sdk/models/gen_models/saved_filters_get_parameters_query.py @@ -11,3 +11,5 @@ class SavedFiltersGetParametersQuery(BaseModel): ) page: int | None = None limit: int | None = None + q: str | None = None + workspace_token: str | None = None diff --git a/vantage_sdk/models/gen_models/scenario_model.py b/vantage_sdk/models/gen_models/scenario_model.py new file mode 100644 index 0000000..46636dd --- /dev/null +++ b/vantage_sdk/models/gen_models/scenario_model.py @@ -0,0 +1,27 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from typing import Annotated +from pydantic import BaseModel, ConfigDict, Field +from collections.abc import Sequence +from . import scenario_model_period + + +class ScenarioModel(BaseModel): + """ + ScenarioModel model + """ + model_config = ConfigDict( + populate_by_name=True, + ) + token: str + title: str + priority: Annotated[int | None, Field(...)] + workspace_token: Annotated[str | None, Field(...)] + provider: Annotated[str | None, Field(...)] + service: Annotated[str | None, Field(...)] + periods: Sequence[scenario_model_period.ScenarioModelPeriod] + created_by_token: Annotated[str | None, Field(...)] + created_at: str + updated_at: str diff --git a/vantage_sdk/models/gen_models/scenario_model_period.py b/vantage_sdk/models/gen_models/scenario_model_period.py new file mode 100644 index 0000000..9393a17 --- /dev/null +++ b/vantage_sdk/models/gen_models/scenario_model_period.py @@ -0,0 +1,17 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from typing import Annotated +from pydantic import BaseModel, ConfigDict, Field +from . import scenario_model_period_amount_type + + +class ScenarioModelPeriod(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + start_at: Annotated[str, Field(description='The ISO 8601 start date of the period.', examples=['2026-01-01'])] + end_at: Annotated[str | None, Field(description='The ISO 8601 end date of the period.', examples=['2026-03-31'])] + amount: Annotated[str, Field(description='The period amount as a string to preserve decimal precision.', examples=['1250.75'])] + amount_type: Annotated[scenario_model_period_amount_type.ScenarioModelPeriodAmountType, Field(description='Whether the amount is in dollars or percent.')] diff --git a/vantage_sdk/models/gen_models/scenario_model_period_amount_type.py b/vantage_sdk/models/gen_models/scenario_model_period_amount_type.py new file mode 100644 index 0000000..76b30cc --- /dev/null +++ b/vantage_sdk/models/gen_models/scenario_model_period_amount_type.py @@ -0,0 +1,13 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from enum import StrEnum + + +class ScenarioModelPeriodAmountType(StrEnum): + """ + Whether the amount is in dollars or percent. + """ + dollar = 'dollar' + percent = 'percent' diff --git a/vantage_sdk/models/gen_models/scenario_models.py b/vantage_sdk/models/gen_models/scenario_models.py new file mode 100644 index 0000000..9d6ad6a --- /dev/null +++ b/vantage_sdk/models/gen_models/scenario_models.py @@ -0,0 +1,18 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from collections.abc import Sequence +from pydantic import BaseModel, ConfigDict +from . import links as links_1, scenario_model + + +class ScenarioModels(BaseModel): + """ + ScenarioModels model + """ + model_config = ConfigDict( + populate_by_name=True, + ) + links: links_1.Links | None = None + scenario_models: Sequence[scenario_model.ScenarioModel] diff --git a/vantage_sdk/models/gen_models/scenario_models_get_parameters_query.py b/vantage_sdk/models/gen_models/scenario_models_get_parameters_query.py new file mode 100644 index 0000000..0bde75c --- /dev/null +++ b/vantage_sdk/models/gen_models/scenario_models_get_parameters_query.py @@ -0,0 +1,13 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from pydantic import BaseModel, ConfigDict + + +class ScenarioModelsGetParametersQuery(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + page: int | None = None + limit: int | None = None diff --git a/vantage_sdk/models/gen_models/segments_get_parameters_query.py b/vantage_sdk/models/gen_models/segments_get_parameters_query.py index 18df891..a385037 100644 --- a/vantage_sdk/models/gen_models/segments_get_parameters_query.py +++ b/vantage_sdk/models/gen_models/segments_get_parameters_query.py @@ -11,3 +11,5 @@ class SegmentsGetParametersQuery(BaseModel): ) page: int | None = None limit: int | None = None + q: str | None = None + workspace_token: str | None = None diff --git a/vantage_sdk/models/gen_models/tags_get_parameters_query_provider.py b/vantage_sdk/models/gen_models/tags_get_parameters_query_provider.py index 417bc0d..2e953a9 100644 --- a/vantage_sdk/models/gen_models/tags_get_parameters_query_provider.py +++ b/vantage_sdk/models/gen_models/tags_get_parameters_query_provider.py @@ -43,3 +43,9 @@ class TagsGetParametersQueryProvider(StrEnum): baseten = 'baseten' cloudflare = 'cloudflare' fireworks_ai = 'fireworks_ai' + cartesia = 'cartesia' + depot = 'depot' + xai = 'xai' + digital_ocean = 'digital_ocean' + together_ai = 'together_ai' + coreweave = 'coreweave' diff --git a/vantage_sdk/models/gen_models/tags_key_values_get_parameters_query_provider.py b/vantage_sdk/models/gen_models/tags_key_values_get_parameters_query_provider.py index 47a0c52..c03d992 100644 --- a/vantage_sdk/models/gen_models/tags_key_values_get_parameters_query_provider.py +++ b/vantage_sdk/models/gen_models/tags_key_values_get_parameters_query_provider.py @@ -43,3 +43,9 @@ class TagsKeyValuesGetParametersQueryProvider(StrEnum): baseten = 'baseten' cloudflare = 'cloudflare' fireworks_ai = 'fireworks_ai' + cartesia = 'cartesia' + depot = 'depot' + xai = 'xai' + digital_ocean = 'digital_ocean' + together_ai = 'together_ai' + coreweave = 'coreweave' diff --git a/vantage_sdk/models/gen_models/teams_get_parameters_query.py b/vantage_sdk/models/gen_models/teams_get_parameters_query.py index b2f5742..94ab128 100644 --- a/vantage_sdk/models/gen_models/teams_get_parameters_query.py +++ b/vantage_sdk/models/gen_models/teams_get_parameters_query.py @@ -11,3 +11,5 @@ class TeamsGetParametersQuery(BaseModel): ) page: int | None = None limit: int | None = None + q: str | None = None + workspace_token: str | None = None diff --git a/vantage_sdk/models/gen_models/update_annotation.py b/vantage_sdk/models/gen_models/update_annotation.py new file mode 100644 index 0000000..10b4c58 --- /dev/null +++ b/vantage_sdk/models/gen_models/update_annotation.py @@ -0,0 +1,21 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from typing import Annotated +from pydantic import BaseModel, ConfigDict, Field +from datetime import date as date_aliased +from collections.abc import Sequence + + +class UpdateAnnotation(BaseModel): + """ + Update an Annotation. + """ + model_config = ConfigDict( + populate_by_name=True, + ) + title: Annotated[str | None, Field(description='The title of the Annotation.')] = None + date: Annotated[date_aliased | None, Field(description='The date of the Annotation. ISO 8601 formatted.')] = None + message: Annotated[str | None, Field(description='The message of the Annotation.')] = None + report_tokens: Annotated[Sequence[str] | None, Field(description='The tokens of the Reports to associate with the Annotation.')] = None diff --git a/vantage_sdk/models/gen_models/update_anomaly_notification.py b/vantage_sdk/models/gen_models/update_anomaly_notification.py index 21a15e9..3dc6c48 100644 --- a/vantage_sdk/models/gen_models/update_anomaly_notification.py +++ b/vantage_sdk/models/gen_models/update_anomaly_notification.py @@ -16,4 +16,5 @@ class UpdateAnomalyNotification(BaseModel): ) threshold: Annotated[int | None, Field(description='The threshold amount that must be met for the notification to fire.')] = None user_tokens: Annotated[Sequence[str] | None, Field(description='The tokens of the users that receive the notification.')] = None + recipient_emails: Annotated[Sequence[str] | None, Field(description='Email addresses that receive the notification. Must be organization users or addresses on a verified domain.')] = None recipient_channels: Annotated[Sequence[str] | None, Field(description='The Slack/MS Teams channels that receive the notification.')] = None diff --git a/vantage_sdk/models/gen_models/update_async_virtual_tag_config.py b/vantage_sdk/models/gen_models/update_async_virtual_tag_config.py index cddf1f8..87924d9 100644 --- a/vantage_sdk/models/gen_models/update_async_virtual_tag_config.py +++ b/vantage_sdk/models/gen_models/update_async_virtual_tag_config.py @@ -4,7 +4,7 @@ from __future__ import annotations from typing import Annotated from pydantic import BaseModel, ConfigDict, Field -from datetime import date +from datetime import date as date_aliased from collections.abc import Sequence from . import update_async_virtual_tag_config_collapsed_tag_key, update_async_virtual_tag_config_value @@ -18,6 +18,6 @@ class UpdateAsyncVirtualTagConfig(BaseModel): ) key: Annotated[str | None, Field(description='The key of the VirtualTagConfig.')] = None overridable: Annotated[bool | None, Field(description='Whether the VirtualTagConfig can override a provider-supplied tag on a matching Cost.')] = None - backfill_until: Annotated[date | None, Field(description='The earliest month the VirtualTagConfig should be backfilled to.')] = None + backfill_until: Annotated[date_aliased | None, Field(description='The earliest month the VirtualTagConfig should be backfilled to.')] = None collapsed_tag_keys: Annotated[Sequence[update_async_virtual_tag_config_collapsed_tag_key.UpdateAsyncVirtualTagConfigCollapsedTagKey] | None, Field(description='Tag keys to collapse values for.')] = None values: Annotated[Sequence[update_async_virtual_tag_config_value.UpdateAsyncVirtualTagConfigValue] | None, Field(description='Values for the VirtualTagConfig, with match precedence determined by order in the list.')] = None diff --git a/vantage_sdk/models/gen_models/update_async_virtual_tag_config_value.py b/vantage_sdk/models/gen_models/update_async_virtual_tag_config_value.py index ad884aa..e767d3e 100644 --- a/vantage_sdk/models/gen_models/update_async_virtual_tag_config_value.py +++ b/vantage_sdk/models/gen_models/update_async_virtual_tag_config_value.py @@ -15,6 +15,8 @@ class UpdateAsyncVirtualTagConfigValue(BaseModel): filter: Annotated[str, Field(description='The filter query language to apply to the value. Additional documentation available at https://docs.vantage.sh/vql.')] name: Annotated[str | None, Field(description='The name of the value.')] = None business_metric_token: Annotated[str | None, Field(description='The token of an associated business metric.')] = None + label_key: Annotated[str | None, Field(description='The business metric label key used for this virtual tag value.')] = None + label_values: Annotated[Sequence[str] | None, Field(description='Optional business metric label values. An empty array includes every value for the label key.')] = None display_name: Annotated[str | None, Field(description='The display name for an allocation value (cost_metric or percentages). Invalid when name is set.')] = None label_transforms: Sequence[update_async_virtual_tag_config_value_label_transform.UpdateAsyncVirtualTagConfigValueLabelTransform] | None = None cost_metric: update_async_virtual_tag_config_value_cost_metric.UpdateAsyncVirtualTagConfigValueCostMetric | None = None diff --git a/vantage_sdk/models/gen_models/update_budget_alert.py b/vantage_sdk/models/gen_models/update_budget_alert.py index 7a1fd75..41a0caf 100644 --- a/vantage_sdk/models/gen_models/update_budget_alert.py +++ b/vantage_sdk/models/gen_models/update_budget_alert.py @@ -17,6 +17,7 @@ class UpdateBudgetAlert(BaseModel): budget_tokens: Annotated[Sequence[str] | None, Field(description='The tokens of the Budget that has the alert.')] = None threshold: Annotated[int | None, Field(description='The threshold amount that must be met for the alert to fire.')] = None user_tokens: Annotated[Sequence[str] | None, Field(description='The tokens of the users that receive the alert.')] = None + recipient_emails: Annotated[Sequence[str] | None, Field(description='Email addresses that receive the alert. Must be organization users or addresses on a verified domain.')] = None duration_in_days: Annotated[str | None, Field(description='The number of days from the start or end of the month to trigger the alert if the threshold is reached. For the full month, pass an empty value.')] = None period_to_track: Annotated[str | None, Field(description='The period tracked on the alert. Used with duration_in_days to determine the time window of the alert. Defaults to start_of_the_month if not passed. Possible values: start_of_the_month, end_of_the_month.')] = None recipient_channels: Annotated[Sequence[str] | None, Field(description='The channels receiving the alerts. Requires an integration provider to be connected.')] = None diff --git a/vantage_sdk/models/gen_models/update_budget_period.py b/vantage_sdk/models/gen_models/update_budget_period.py index 8f0be58..bd9ff76 100644 --- a/vantage_sdk/models/gen_models/update_budget_period.py +++ b/vantage_sdk/models/gen_models/update_budget_period.py @@ -2,7 +2,7 @@ # filename: openapi_spec.json from __future__ import annotations -from datetime import date +from datetime import date as date_aliased from typing import Annotated from pydantic import BaseModel, ConfigDict, Field @@ -11,6 +11,6 @@ class UpdateBudgetPeriod(BaseModel): model_config = ConfigDict( populate_by_name=True, ) - start_at: Annotated[date, Field(description='The start date of the period.')] - end_at: Annotated[date | None, Field(description='The end date of the period.')] = None + start_at: Annotated[date_aliased, Field(description='The start date of the period.')] + end_at: Annotated[date_aliased | None, Field(description='The end date of the period.')] = None amount: Annotated[float, Field(description='The amount of the period.')] diff --git a/vantage_sdk/models/gen_models/update_cost_alert.py b/vantage_sdk/models/gen_models/update_cost_alert.py index 4e000e3..5f3df01 100644 --- a/vantage_sdk/models/gen_models/update_cost_alert.py +++ b/vantage_sdk/models/gen_models/update_cost_alert.py @@ -15,7 +15,7 @@ class UpdateCostAlert(BaseModel): populate_by_name=True, ) title: Annotated[str | None, Field(description='The title of the Cost Alert.')] = None - email_recipients: Annotated[Sequence[str] | None, Field(description='The email recipients for the Cost Alert.')] = None + email_recipients: Annotated[Sequence[str] | None, Field(description='The email recipients for the Cost Alert. Accepts organization users and emails on verified IdP domains.')] = None interval: Annotated[str | None, Field(description="The period of time used to compare costs. Options are 'day', 'week', 'month', 'quarter'.")] = None threshold: Annotated[float | None, Field(description='The threshold value for the Cost Alert.')] = None slack_channels: Annotated[Sequence[str] | None, Field(description='The Slack channels that will receive the alert. Make sure your slack integration is connected at https://console.vantage.sh/settings/slack.')] = None diff --git a/vantage_sdk/models/gen_models/update_dashboard.py b/vantage_sdk/models/gen_models/update_dashboard.py index 5cfb886..68fdf01 100644 --- a/vantage_sdk/models/gen_models/update_dashboard.py +++ b/vantage_sdk/models/gen_models/update_dashboard.py @@ -22,4 +22,4 @@ class UpdateDashboard(BaseModel): date_interval: Annotated[update_dashboard_date_interval.UpdateDashboardDateInterval | None, Field(description="Determines the date range in the Dashboard. Incompatible with 'start_date' and 'end_date' parameters.")] = None start_date: Annotated[str | None, Field(description="The start date for the date range for costs in the Dashboard. ISO 8601 Formatted. Incompatible with 'date_interval' parameter.")] = None end_date: Annotated[str | None, Field(description="The end date for the date range for costs in the Dashboard. ISO 8601 Formatted. Incompatible with 'date_interval' parameter.")] = None - workspace_token: Annotated[str | None, Field(description='The token of the Workspace the Dashboard belongs to. Required if the API token is associated with multiple Workspaces.')] = None + workspace_token: Annotated[str | None, Field(description='The token of the Workspace the Dashboard belongs to. Required when updating widgets if the API token is associated with multiple Workspaces.')] = None diff --git a/vantage_sdk/models/gen_models/update_financial_commitment_report.py b/vantage_sdk/models/gen_models/update_financial_commitment_report.py index c94d5ca..fedebfa 100644 --- a/vantage_sdk/models/gen_models/update_financial_commitment_report.py +++ b/vantage_sdk/models/gen_models/update_financial_commitment_report.py @@ -4,7 +4,7 @@ from __future__ import annotations from typing import Annotated from pydantic import BaseModel, ConfigDict, Field -from datetime import date +from datetime import date as date_aliased from collections.abc import Sequence from . import update_financial_commitment_report_date_bucket, update_financial_commitment_report_date_interval, update_financial_commitment_report_on_demand_costs_scope @@ -18,8 +18,8 @@ class UpdateFinancialCommitmentReport(BaseModel): ) title: Annotated[str | None, Field(description='The title of the FinancialCommitmentReport.')] = None filter: Annotated[str | None, Field(description='The filter query language to apply to the FinancialCommitmentReport. Additional documentation available at https://docs.vantage.sh/vql.')] = None - start_date: Annotated[date | None, Field(description="The start date of the FinancialCommitmentReport. YYYY-MM-DD formatted. Incompatible with 'date_interval' parameter.", examples=['2024-03-01'])] = None - end_date: Annotated[date | None, Field(description="The end date of the FinancialCommitmentReport. YYYY-MM-DD formatted. Incompatible with 'date_interval' parameter.", examples=['2024-03-01'])] = None + start_date: Annotated[date_aliased | None, Field(description="The start date of the FinancialCommitmentReport. YYYY-MM-DD formatted. Incompatible with 'date_interval' parameter.", examples=['2024-03-01'])] = None + end_date: Annotated[date_aliased | None, Field(description="The end date of the FinancialCommitmentReport. YYYY-MM-DD formatted. Incompatible with 'date_interval' parameter.", examples=['2024-03-01'])] = None date_interval: Annotated[update_financial_commitment_report_date_interval.UpdateFinancialCommitmentReportDateInterval | None, Field(description="The date interval of the FinancialCommitmentReport. Unless 'custom' is used, this is incompatible with 'start_date' and 'end_date' parameters. Defaults to 'last_3_months'.")] = None date_bucket: Annotated[update_financial_commitment_report_date_bucket.UpdateFinancialCommitmentReportDateBucket | None, Field(description='The date bucket of the FinancialCommitmentReport.')] = None on_demand_costs_scope: Annotated[update_financial_commitment_report_on_demand_costs_scope.UpdateFinancialCommitmentReportOnDemandCostsScope | None, Field(description='The scope for the costs. Possible values: discountable, all.')] = None diff --git a/vantage_sdk/models/gen_models/update_kubernetes_efficiency_report.py b/vantage_sdk/models/gen_models/update_kubernetes_efficiency_report.py index e2192ed..85a5b16 100644 --- a/vantage_sdk/models/gen_models/update_kubernetes_efficiency_report.py +++ b/vantage_sdk/models/gen_models/update_kubernetes_efficiency_report.py @@ -4,7 +4,7 @@ from __future__ import annotations from typing import Annotated from pydantic import BaseModel, ConfigDict, Field -from datetime import date +from datetime import date as date_aliased from collections.abc import Sequence from . import update_kubernetes_efficiency_report_aggregated_by, update_kubernetes_efficiency_report_date_bucket, update_kubernetes_efficiency_report_date_interval @@ -18,8 +18,8 @@ class UpdateKubernetesEfficiencyReport(BaseModel): ) title: Annotated[str | None, Field(description='The title of the KubernetesEfficiencyReport.')] = None filter: Annotated[str | None, Field(description='The filter query language to apply to the KubernetesEfficiencyReport. Additional documentation available at https://docs.vantage.sh/vql.')] = None - start_date: Annotated[date | None, Field(description="The start date of the KubernetesEfficiencyReport. ISO 8601 Formatted. Incompatible with 'date_interval' parameter.")] = None - end_date: Annotated[date | None, Field(description="The end date of the KubernetesEfficiencyReport. ISO 8601 Formatted. Incompatible with 'date_interval' parameter.")] = None + start_date: Annotated[date_aliased | None, Field(description="The start date of the KubernetesEfficiencyReport. ISO 8601 Formatted. Incompatible with 'date_interval' parameter.")] = None + end_date: Annotated[date_aliased | None, Field(description="The end date of the KubernetesEfficiencyReport. ISO 8601 Formatted. Incompatible with 'date_interval' parameter.")] = None date_interval: Annotated[update_kubernetes_efficiency_report_date_interval.UpdateKubernetesEfficiencyReportDateInterval | None, Field(description="The date interval of the KubernetesEfficiencyReport. Incompatible with 'start_date' and 'end_date' parameters. Defaults to 'this_month' if start_date and end_date are not provided.")] = None aggregated_by: Annotated[update_kubernetes_efficiency_report_aggregated_by.UpdateKubernetesEfficiencyReportAggregatedBy | None, Field(description='The column by which the costs are aggregated.')] = None date_bucket: Annotated[update_kubernetes_efficiency_report_date_bucket.UpdateKubernetesEfficiencyReportDateBucket | None, Field(description='The date bucket of the KubernetesEfficiencyReport.')] = None diff --git a/vantage_sdk/models/gen_models/update_network_flow_report.py b/vantage_sdk/models/gen_models/update_network_flow_report.py index 6a5c701..7a185e9 100644 --- a/vantage_sdk/models/gen_models/update_network_flow_report.py +++ b/vantage_sdk/models/gen_models/update_network_flow_report.py @@ -4,7 +4,7 @@ from __future__ import annotations from typing import Annotated from pydantic import BaseModel, ConfigDict, Field -from datetime import date +from datetime import date as date_aliased from collections.abc import Sequence from . import update_network_flow_report_date_interval, update_network_flow_report_flow_direction, update_network_flow_report_flow_weight, update_network_flow_report_grouping @@ -18,8 +18,8 @@ class UpdateNetworkFlowReport(BaseModel): ) title: Annotated[str | None, Field(description='The title of the NetworkFlowReport.')] = None filter: Annotated[str | None, Field(description='The filter query language to apply to the NetworkFlowReport. Additional documentation available at https://docs.vantage.sh/vql.')] = None - start_date: Annotated[date | None, Field(description='The start date of a custom NetworkFlowReport. YYYY-MM-DD formatted.')] = None - end_date: Annotated[date | None, Field(description='The end date of a custom NetworkFlowReport. YYYY-MM-DD formatted.')] = None + start_date: Annotated[date_aliased | None, Field(description='The start date of a custom NetworkFlowReport. YYYY-MM-DD formatted.')] = None + end_date: Annotated[date_aliased | None, Field(description='The end date of a custom NetworkFlowReport. YYYY-MM-DD formatted.')] = None date_interval: Annotated[update_network_flow_report_date_interval.UpdateNetworkFlowReportDateInterval | None, Field(description="The date interval of the NetworkFlowReport. Dates are used only for the 'custom' interval. Defaults to 'last_7_days'.")] = None groupings: Annotated[Sequence[update_network_flow_report_grouping.UpdateNetworkFlowReportGrouping] | None, Field(description='Grouping values for aggregating data on the NetworkFlowReport. Valid groupings: account_id, az_id, dstaddr, dsthostname, flow_direction, interface_id, instance_id, peer_resource_uuid, peer_account_id, peer_vpc_id, peer_region, peer_az_id, peer_subnet_id, peer_interface_id, peer_instance_id, region, resource_uuid, srcaddr, srchostname, subnet_id, traffic_category, traffic_path, vpc_id.')] = None flow_direction: Annotated[update_network_flow_report_flow_direction.UpdateNetworkFlowReportFlowDirection | None, Field(description='The flow direction of the NetworkFlowReport.')] = None diff --git a/vantage_sdk/models/gen_models/update_report_forecast.py b/vantage_sdk/models/gen_models/update_report_forecast.py new file mode 100644 index 0000000..a7238de --- /dev/null +++ b/vantage_sdk/models/gen_models/update_report_forecast.py @@ -0,0 +1,19 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from collections.abc import Sequence +from pydantic import BaseModel, ConfigDict + + +class UpdateReportForecast(BaseModel): + """ + Update a scenario-model ReportForecast. + """ + model_config = ConfigDict( + populate_by_name=True, + ) + title: str | None = None + scenario_model_tokens: Sequence[str] | None = None + business_metric_token: str | None = None + set_as_default: bool | None = None diff --git a/vantage_sdk/models/gen_models/update_report_notification.py b/vantage_sdk/models/gen_models/update_report_notification.py index 666f344..dafb1eb 100644 --- a/vantage_sdk/models/gen_models/update_report_notification.py +++ b/vantage_sdk/models/gen_models/update_report_notification.py @@ -17,6 +17,7 @@ class UpdateReportNotification(BaseModel): title: Annotated[str | None, Field(description='The title of the ReportNotification.')] = None cost_report_token: Annotated[str | None, Field(description='The CostReport token.')] = None user_tokens: Annotated[Sequence[str] | None, Field(description='The Users that receive the notification.')] = None + recipient_emails: Annotated[Sequence[str] | None, Field(description='Email addresses that receive the notification. Must be organization users or addresses on a verified domain.')] = None recipient_channels: Annotated[Sequence[str] | None, Field(description='The Slack or Microsoft Teams channels that receive the notification.')] = None frequency: Annotated[str | None, Field(description='The frequency the ReportNotification is sent. Possible values: daily, weekly, monthly.')] = None change: Annotated[str | None, Field(description='The type of change the ReportNotification is tracking. Possible values: percentage, dollars.')] = None diff --git a/vantage_sdk/models/gen_models/update_scenario_model.py b/vantage_sdk/models/gen_models/update_scenario_model.py new file mode 100644 index 0000000..15c7a95 --- /dev/null +++ b/vantage_sdk/models/gen_models/update_scenario_model.py @@ -0,0 +1,23 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from collections.abc import Sequence +from typing import Annotated +from pydantic import BaseModel, ConfigDict, Field +from . import update_scenario_model_period + + +class UpdateScenarioModel(BaseModel): + """ + Update a ScenarioModel. + """ + model_config = ConfigDict( + populate_by_name=True, + ) + title: str | None = None + priority: int | None = None + provider: str | None = None + service: str | None = None + workspace_token: str | None = None + periods: Annotated[Sequence[update_scenario_model_period.UpdateScenarioModelPeriod] | None, Field(description='The periods for the ScenarioModel.')] = None diff --git a/vantage_sdk/models/gen_models/update_scenario_model_period.py b/vantage_sdk/models/gen_models/update_scenario_model_period.py new file mode 100644 index 0000000..63c68a7 --- /dev/null +++ b/vantage_sdk/models/gen_models/update_scenario_model_period.py @@ -0,0 +1,17 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from datetime import date as date_aliased +from pydantic import BaseModel, ConfigDict +from . import update_scenario_model_period_amount_type + + +class UpdateScenarioModelPeriod(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + start_at: date_aliased + end_at: date_aliased | None = None + amount: float + amount_type: update_scenario_model_period_amount_type.UpdateScenarioModelPeriodAmountType diff --git a/vantage_sdk/models/gen_models/update_scenario_model_period_amount_type.py b/vantage_sdk/models/gen_models/update_scenario_model_period_amount_type.py new file mode 100644 index 0000000..bb13c11 --- /dev/null +++ b/vantage_sdk/models/gen_models/update_scenario_model_period_amount_type.py @@ -0,0 +1,10 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from enum import StrEnum + + +class UpdateScenarioModelPeriodAmountType(StrEnum): + dollar = 'dollar' + percent = 'percent' diff --git a/vantage_sdk/models/gen_models/update_tag.py b/vantage_sdk/models/gen_models/update_tag.py index db325e6..f437b08 100644 --- a/vantage_sdk/models/gen_models/update_tag.py +++ b/vantage_sdk/models/gen_models/update_tag.py @@ -16,4 +16,5 @@ class UpdateTag(BaseModel): ) tag_key: str | None = None tag_keys: Sequence[str] | None = None - hidden: Annotated[bool, Field(description='Whether the Tag is hidden from the Vantage UI.')] + hidden: Annotated[bool | None, Field(description='Whether the Tag is hidden from the Vantage UI.')] = None + preferred: Annotated[bool | None, Field(description='Whether the Tag is marked as preferred in the Vantage UI.')] = None diff --git a/vantage_sdk/models/gen_models/update_virtual_tag_config.py b/vantage_sdk/models/gen_models/update_virtual_tag_config.py index 8f76fc8..1cace2f 100644 --- a/vantage_sdk/models/gen_models/update_virtual_tag_config.py +++ b/vantage_sdk/models/gen_models/update_virtual_tag_config.py @@ -4,7 +4,7 @@ from __future__ import annotations from typing import Annotated from pydantic import BaseModel, ConfigDict, Field -from datetime import date +from datetime import date as date_aliased from collections.abc import Sequence from . import update_virtual_tag_config_collapsed_tag_key, update_virtual_tag_config_value @@ -18,6 +18,6 @@ class UpdateVirtualTagConfig(BaseModel): ) key: Annotated[str | None, Field(description='The key of the VirtualTagConfig.')] = None overridable: Annotated[bool | None, Field(description='Whether the VirtualTagConfig can override a provider-supplied tag on a matching Cost.')] = None - backfill_until: Annotated[date | None, Field(description='The earliest month the VirtualTagConfig should be backfilled to.')] = None + backfill_until: Annotated[date_aliased | None, Field(description='The earliest month the VirtualTagConfig should be backfilled to.')] = None collapsed_tag_keys: Annotated[Sequence[update_virtual_tag_config_collapsed_tag_key.UpdateVirtualTagConfigCollapsedTagKey] | None, Field(description='Tag keys to collapse values for.')] = None values: Annotated[Sequence[update_virtual_tag_config_value.UpdateVirtualTagConfigValue] | None, Field(description='Values for the VirtualTagConfig, with match precedence determined by order in the list.')] = None diff --git a/vantage_sdk/models/gen_models/update_virtual_tag_config_value.py b/vantage_sdk/models/gen_models/update_virtual_tag_config_value.py index 5f8342d..1ef251d 100644 --- a/vantage_sdk/models/gen_models/update_virtual_tag_config_value.py +++ b/vantage_sdk/models/gen_models/update_virtual_tag_config_value.py @@ -15,6 +15,8 @@ class UpdateVirtualTagConfigValue(BaseModel): filter: Annotated[str, Field(description='The filter query language to apply to the value. Additional documentation available at https://docs.vantage.sh/vql.')] name: Annotated[str | None, Field(description='The name of the value.')] = None business_metric_token: Annotated[str | None, Field(description='The token of an associated business metric.')] = None + label_key: Annotated[str | None, Field(description='The business metric label key used for this virtual tag value.')] = None + label_values: Annotated[Sequence[str] | None, Field(description='Optional business metric label values. An empty array includes every value for the label key.')] = None display_name: Annotated[str | None, Field(description='The display name for an allocation value (cost_metric or percentages). Invalid when name is set.')] = None label_transforms: Sequence[update_virtual_tag_config_value_label_transform.UpdateVirtualTagConfigValueLabelTransform] | None = None cost_metric: update_virtual_tag_config_value_cost_metric.UpdateVirtualTagConfigValueCostMetric | None = None diff --git a/vantage_sdk/models/gen_models/update_virtual_tag_config_value1.py b/vantage_sdk/models/gen_models/update_virtual_tag_config_value1.py new file mode 100644 index 0000000..9cb6178 --- /dev/null +++ b/vantage_sdk/models/gen_models/update_virtual_tag_config_value1.py @@ -0,0 +1,27 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from typing import Annotated +from pydantic import BaseModel, ConfigDict, Field +from collections.abc import Sequence +from . import update_virtual_tag_config_value1_cost_metric, update_virtual_tag_config_value1_date_range, update_virtual_tag_config_value1_label_transform, update_virtual_tag_config_value1_percentage + + +class UpdateVirtualTagConfigValue(BaseModel): + """ + Update a VirtualTagConfigValue. + """ + model_config = ConfigDict( + populate_by_name=True, + ) + filter: Annotated[str | None, Field(description='The filter query language to apply to the value. Additional documentation available at https://docs.vantage.sh/vql.')] = None + name: Annotated[str | None, Field(description='The name of the value.')] = None + business_metric_token: Annotated[str | None, Field(description='The token of an associated business metric.')] = None + label_key: Annotated[str | None, Field(description='The business metric label key used for this virtual tag value.')] = None + label_values: Annotated[Sequence[str] | None, Field(description='Business metric label values. An empty array includes every value for the label key.')] = None + display_name: Annotated[str | None, Field(description='The display name for a cost metric or percentage allocation value.')] = None + label_transforms: Sequence[update_virtual_tag_config_value1_label_transform.UpdateVirtualTagConfigValue1LabelTransform] | None = None + cost_metric: update_virtual_tag_config_value1_cost_metric.UpdateVirtualTagConfigValue1CostMetric | None = None + percentages: Sequence[update_virtual_tag_config_value1_percentage.UpdateVirtualTagConfigValue1Percentage] | None = None + date_ranges: Annotated[Sequence[update_virtual_tag_config_value1_date_range.UpdateVirtualTagConfigValue1DateRange] | None, Field(description='Date ranges restricting when this value applies.')] = None diff --git a/vantage_sdk/models/gen_models/update_virtual_tag_config_value1_cost_metric.py b/vantage_sdk/models/gen_models/update_virtual_tag_config_value1_cost_metric.py new file mode 100644 index 0000000..d49374b --- /dev/null +++ b/vantage_sdk/models/gen_models/update_virtual_tag_config_value1_cost_metric.py @@ -0,0 +1,14 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from pydantic import BaseModel, ConfigDict +from . import update_virtual_tag_config_value1_cost_metric_aggregation + + +class UpdateVirtualTagConfigValue1CostMetric(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + filter: str + aggregation: update_virtual_tag_config_value1_cost_metric_aggregation.UpdateVirtualTagConfigValue1CostMetricAggregation diff --git a/vantage_sdk/models/gen_models/update_virtual_tag_config_value1_cost_metric_aggregation.py b/vantage_sdk/models/gen_models/update_virtual_tag_config_value1_cost_metric_aggregation.py new file mode 100644 index 0000000..2bcaeb8 --- /dev/null +++ b/vantage_sdk/models/gen_models/update_virtual_tag_config_value1_cost_metric_aggregation.py @@ -0,0 +1,12 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from pydantic import BaseModel, ConfigDict + + +class UpdateVirtualTagConfigValue1CostMetricAggregation(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + tag: str diff --git a/vantage_sdk/models/gen_models/update_virtual_tag_config_value1_date_range.py b/vantage_sdk/models/gen_models/update_virtual_tag_config_value1_date_range.py new file mode 100644 index 0000000..10747ce --- /dev/null +++ b/vantage_sdk/models/gen_models/update_virtual_tag_config_value1_date_range.py @@ -0,0 +1,13 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from pydantic import BaseModel, ConfigDict + + +class UpdateVirtualTagConfigValue1DateRange(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + start_date: str | None = None + end_date: str | None = None diff --git a/vantage_sdk/models/gen_models/update_virtual_tag_config_value1_label_transform.py b/vantage_sdk/models/gen_models/update_virtual_tag_config_value1_label_transform.py new file mode 100644 index 0000000..ce090a4 --- /dev/null +++ b/vantage_sdk/models/gen_models/update_virtual_tag_config_value1_label_transform.py @@ -0,0 +1,16 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from pydantic import BaseModel, ConfigDict +from . import update_virtual_tag_config_value1_label_transform_type + + +class UpdateVirtualTagConfigValue1LabelTransform(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + type: update_virtual_tag_config_value1_label_transform_type.UpdateVirtualTagConfigValue1LabelTransformType + delimiter: str | None = None + index: int | None = None + template: str | None = None diff --git a/vantage_sdk/models/gen_models/update_virtual_tag_config_value1_label_transform_type.py b/vantage_sdk/models/gen_models/update_virtual_tag_config_value1_label_transform_type.py new file mode 100644 index 0000000..2e5345b --- /dev/null +++ b/vantage_sdk/models/gen_models/update_virtual_tag_config_value1_label_transform_type.py @@ -0,0 +1,10 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from enum import StrEnum + + +class UpdateVirtualTagConfigValue1LabelTransformType(StrEnum): + split_ = 'split' + format_ = 'format' diff --git a/vantage_sdk/models/gen_models/update_virtual_tag_config_value1_percentage.py b/vantage_sdk/models/gen_models/update_virtual_tag_config_value1_percentage.py new file mode 100644 index 0000000..f8b73d9 --- /dev/null +++ b/vantage_sdk/models/gen_models/update_virtual_tag_config_value1_percentage.py @@ -0,0 +1,13 @@ +# generated by datamodel-codegen: +# filename: openapi_spec.json + +from __future__ import annotations +from pydantic import BaseModel, ConfigDict + + +class UpdateVirtualTagConfigValue1Percentage(BaseModel): + model_config = ConfigDict( + populate_by_name=True, + ) + value: str + pct: float diff --git a/vantage_sdk/models/gen_models/virtual_tag_config.py b/vantage_sdk/models/gen_models/virtual_tag_config.py index d7b73b0..9fb439c 100644 --- a/vantage_sdk/models/gen_models/virtual_tag_config.py +++ b/vantage_sdk/models/gen_models/virtual_tag_config.py @@ -18,7 +18,9 @@ class VirtualTagConfig(BaseModel): token: Annotated[str, Field(description='The token of the VirtualTagConfig.', examples=['vtag_1234'])] created_by_token: Annotated[str | None, Field(description='The token of the Creator of the VirtualTagConfig.', examples=['usr_1234'])] key: Annotated[str, Field(description='The key of the VirtualTagConfig.', examples=['Cost Center'])] + hidden: Annotated[bool, Field(description='Whether the VirtualTagConfig key is hidden from the Vantage UI.')] + preferred: Annotated[bool, Field(description='Whether the VirtualTagConfig key is marked as preferred in the Vantage UI.')] overridable: Annotated[bool, Field(description='Whether the VirtualTagConfig can override a provider-supplied tag on a matching Cost.')] - backfill_until: Annotated[str, Field(description='The earliest month VirtualTagConfig should be backfilled to.', examples=['2026-01-01'])] + backfill_until: Annotated[str, Field(description='The earliest month VirtualTagConfig should be backfilled to.', examples=['2026-02-01'])] collapsed_tag_keys: Annotated[Sequence[virtual_tag_config_collapsed_tag_key.VirtualTagConfigCollapsedTagKey], Field(description='Tag keys to collapse values for.')] values: Annotated[Sequence[virtual_tag_config_value.VirtualTagConfigValue], Field(description='Values for the VirtualTagConfig, with match precedence determined by their relative order in the list.')] diff --git a/vantage_sdk/models/gen_models/virtual_tag_config_value.py b/vantage_sdk/models/gen_models/virtual_tag_config_value.py index c14fe44..d4d76d0 100644 --- a/vantage_sdk/models/gen_models/virtual_tag_config_value.py +++ b/vantage_sdk/models/gen_models/virtual_tag_config_value.py @@ -9,12 +9,18 @@ class VirtualTagConfigValue(BaseModel): + """ + VirtualTagConfigValue model + """ model_config = ConfigDict( populate_by_name=True, ) + token: Annotated[str, Field(description='The token of the Value.', examples=['vtag_val_1234'])] filter: Annotated[str | None, Field(description='The filter VQL for the Value.', examples=["costs.provider = 'aws' AND costs.service = 'Amazon Simple Storage Service'"])] name: Annotated[str | None, Field(description='The name of the Value.', examples=['Informatics'])] = None business_metric_token: Annotated[str | None, Field(description='The token of the associated BusinessMetric.', examples=['bsnss_mtrc_abc123'])] = None + label_key: Annotated[str | None, Field(description='The business metric label key used for this virtual tag value.')] = None + label_values: Annotated[Sequence[str] | None, Field(description='Optional business metric label values. An empty array includes every value for the label key.')] = None cost_metric: virtual_tag_config_value_cost_metric.VirtualTagConfigValueCostMetric | None = None display_name: Annotated[str | None, Field(description='The display name for this allocation value.')] = None label_transforms: Annotated[Sequence[virtual_tag_config_value_label_transform.VirtualTagConfigValueLabelTransform], Field(description='Label transforms applied to business metric labels.')] diff --git a/vantage_sdk/models/gen_models/workspaces_get_parameters_query.py b/vantage_sdk/models/gen_models/workspaces_get_parameters_query.py index 18951bc..f2e52f4 100644 --- a/vantage_sdk/models/gen_models/workspaces_get_parameters_query.py +++ b/vantage_sdk/models/gen_models/workspaces_get_parameters_query.py @@ -11,3 +11,4 @@ class WorkspacesGetParametersQuery(BaseModel): ) page: int | None = None limit: int | None = None + q: str | None = None