infrawrench-sdk 1.59.0 → 1.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d824fc0e3c0eae4b687339a75c16c71fa2922ad4e594fae5934a3be54da5d020
4
- data.tar.gz: 632f687c16d8885da2b2b1a8c5dafa29222c1b005a6ceb9f42174465d2143ba6
3
+ metadata.gz: b6d3f0257a114595211cf176906366997598e9d06c8b54ce6de7aa6d408ab0a4
4
+ data.tar.gz: c2a2ed23d72b11ca28681aa3c5c339a47a3bcef33db48b97e141c3391fd25dae
5
5
  SHA512:
6
- metadata.gz: d09092f4be228f2cde776daa288e66971e261bb9dbe58df7ecedeea36bd456f81d855286045435770bbab730835acc1615bc10433d2451303ca4e512aef2b9d2
7
- data.tar.gz: d7bc4df83fef6a8f07861176c4747174d49c5cf9f90b24de86b7e72b3fcec0aa74061e12823e2e1da187f79b057da3b14cf5393490c6eefa3f031eec78769364
6
+ metadata.gz: 5e91dcefd0cbf55894b809029a87ef3899328521a8978171d34256828c8d7e478a10fd6c48222a21eee4ab9fe08ba9488340d54d72546026d93bbc0597a2d3e2
7
+ data.tar.gz: 75475f3d824638ebdedf7efd4cb9869b28928afa81b8c8986192fd37e009838fcb17c785067abf94d561fbcaa49a91c4de8b506035c6442c40ef04406ac5e85d
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # infrawrench-sdk
2
2
 
3
- Generated Ruby client for the Infrawrench API (API version `1.59.0`).
3
+ Generated Ruby client for the Infrawrench API (API version `1.62.0`).
4
4
 
5
5
  **Do not edit this gem by hand** — it is regenerated from `openapi.json` and is
6
6
  not checked into the repository. Run
@@ -41,7 +41,7 @@ Every method takes an optional trailing `request_options:` hash (`:headers`,
41
41
  Responses are the plain `Hash`/`Array` that `JSON.parse` returns, with String
42
42
  keys spelled exactly as the wire spells them. There are no model classes — see
43
43
  [`sig/infrawrench/sdk.rbs`](./sig/infrawrench/sdk.rbs) for the shape of every one of the
44
- 848 schemas, as RBS type aliases that steep and TypeProf can read.
44
+ 868 schemas, as RBS type aliases that steep and TypeProf can read.
45
45
 
46
46
  Non-2xx responses raise `Infrawrench::ApiError`, which carries `#status`,
47
47
  the parsed `#body`, and the machine-readable `#code` when the API sends one —
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # infrawrench-sdk v1.59.0 | MIT | Copyright (c) 2026 Infrawrench LLC
3
+ # infrawrench-sdk v1.62.0 | MIT | Copyright (c) 2026 Infrawrench LLC
4
4
  # https://github.com/Infrawrench/Infrawrench
5
5
  #
6
- # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 1.59.0).
6
+ # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 1.62.0).
7
7
  #
8
8
  # DO NOT EDIT. Regenerate with:
9
9
  # pnpm --filter @infrawrench/web generate:sdk
@@ -17,8 +17,8 @@ require_relative "lib/infrawrench/version"
17
17
  Gem::Specification.new do |spec|
18
18
  spec.name = "infrawrench-sdk"
19
19
  spec.version = Infrawrench::VERSION
20
- spec.summary = "Generated Ruby client for the Infrawrench API (v1.59.0)."
21
- spec.description = "Generated Ruby client for the Infrawrench API (v1.59.0). Covers the published API surface only — operations marked x-internal in the spec are not generated. No runtime dependencies."
20
+ spec.summary = "Generated Ruby client for the Infrawrench API (v1.62.0)."
21
+ spec.description = "Generated Ruby client for the Infrawrench API (v1.62.0). Covers the published API surface only — operations marked x-internal in the spec are not generated. No runtime dependencies."
22
22
  spec.authors = ["Infrawrench LLC", "Astrid Gealer"]
23
23
  spec.email = ["astrid@infrawrench.com"]
24
24
  spec.homepage = "https://infrawrench.com/docs/team-and-billing/client-sdks"
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # infrawrench-sdk v1.59.0 | MIT | Copyright (c) 2026 Infrawrench LLC
3
+ # infrawrench-sdk v1.62.0 | MIT | Copyright (c) 2026 Infrawrench LLC
4
4
  # https://github.com/Infrawrench/Infrawrench
5
5
  #
6
- # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 1.59.0).
6
+ # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 1.62.0).
7
7
  #
8
8
  # DO NOT EDIT. Regenerate with:
9
9
  # pnpm --filter @infrawrench/web generate:sdk
@@ -3235,6 +3235,160 @@ module Infrawrench
3235
3235
  end
3236
3236
  end
3237
3237
 
3238
+ # `client.business_metrics.importer`
3239
+ class BusinessMetricsImporterNamespace
3240
+ # @api private
3241
+ # @param transport [Transport]
3242
+ def initialize(transport)
3243
+ @transport = transport
3244
+ end
3245
+
3246
+ # Delete a metric's importer
3247
+ #
3248
+ # Stops importing and drops the run history. Values already imported stay.
3249
+ #
3250
+ # _Requires permission: `costs:write`._
3251
+ #
3252
+ # DELETE /api/org/{orgId}/business-metrics/{id}/importer
3253
+ #
3254
+ # Raises on 404: Not found
3255
+ #
3256
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
3257
+ # constructed with.
3258
+ # @param id [String] Metric id or key
3259
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
3260
+ # @return [Hash] Parsed JSON, shaped as `Ok` — see `sig/infrawrench/sdk.rbs`.
3261
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
3262
+ def delete(id:, org_id: nil, request_options: nil)
3263
+ @transport.request(
3264
+ http_method: "DELETE",
3265
+ path: "/api/org/{orgId}/business-metrics/{id}/importer",
3266
+ path_params: { "orgId" => org_id, "id" => id },
3267
+ request_options: request_options
3268
+ )
3269
+ end
3270
+
3271
+ # Get a metric's importer
3272
+ #
3273
+ # `importer` is null when the metric's values are only pushed.
3274
+ #
3275
+ # _Requires permission: `costs:read`._
3276
+ #
3277
+ # GET /api/org/{orgId}/business-metrics/{id}/importer
3278
+ #
3279
+ # Raises on 404: Not found
3280
+ #
3281
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
3282
+ # constructed with.
3283
+ # @param id [String] Metric id or key
3284
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
3285
+ # @return [Hash] Parsed JSON, shaped as `Hash` — see `sig/infrawrench/sdk.rbs`.
3286
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
3287
+ def get(id:, org_id: nil, request_options: nil)
3288
+ @transport.request(
3289
+ http_method: "GET",
3290
+ path: "/api/org/{orgId}/business-metrics/{id}/importer",
3291
+ path_params: { "orgId" => org_id, "id" => id },
3292
+ request_options: request_options
3293
+ )
3294
+ end
3295
+
3296
+ # Run a metric's importer now
3297
+ #
3298
+ # Runs synchronously and returns the finished run, failed or not. With no
3299
+ # body it reads the importer's own window; `from`/`to` backfill a wider one
3300
+ # (at most 730 days).
3301
+ #
3302
+ # _Requires permission: `resources:execute`._
3303
+ #
3304
+ # POST /api/org/{orgId}/business-metrics/{id}/importer/run
3305
+ #
3306
+ # Raises on 400: Bad request
3307
+ #
3308
+ # Raises on 404: Not found
3309
+ #
3310
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
3311
+ # constructed with.
3312
+ # @param id [String] Metric id or key
3313
+ # @param body [Hash, nil] Request body, shaped as `Hash`.
3314
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
3315
+ # @return [Hash] Parsed JSON, shaped as `BusinessMetricImportRun` — see
3316
+ # `sig/infrawrench/sdk.rbs`.
3317
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
3318
+ def run(id:, org_id: nil, body: nil, request_options: nil)
3319
+ @transport.request(
3320
+ http_method: "POST",
3321
+ path: "/api/org/{orgId}/business-metrics/{id}/importer/run",
3322
+ path_params: { "orgId" => org_id, "id" => id },
3323
+ body: body,
3324
+ request_options: request_options
3325
+ )
3326
+ end
3327
+
3328
+ # List a metric's import runs
3329
+ #
3330
+ # Newest first; the most recent 50 are kept.
3331
+ #
3332
+ # _Requires permission: `costs:read`._
3333
+ #
3334
+ # GET /api/org/{orgId}/business-metrics/{id}/importer/runs
3335
+ #
3336
+ # Raises on 400: Bad request
3337
+ #
3338
+ # Raises on 404: Not found
3339
+ #
3340
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
3341
+ # constructed with.
3342
+ # @param id [String] Metric id or key
3343
+ # @param limit [Integer, nil] Default 20.
3344
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
3345
+ # @return [Hash] Parsed JSON, shaped as `Hash` — see `sig/infrawrench/sdk.rbs`.
3346
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
3347
+ def runs(id:, org_id: nil, limit: nil, request_options: nil)
3348
+ @transport.request(
3349
+ http_method: "GET",
3350
+ path: "/api/org/{orgId}/business-metrics/{id}/importer/runs",
3351
+ path_params: { "orgId" => org_id, "id" => id },
3352
+ query: { "limit" => limit },
3353
+ request_options: request_options
3354
+ )
3355
+ end
3356
+
3357
+ # Create or replace a metric's importer
3358
+ #
3359
+ # One importer per metric. A full replace: omitted fields take their
3360
+ # defaults. Each run restates whole days (every label a day carried is
3361
+ # replaced by what the source returned), never touches days the source
3362
+ # returned nothing for, and ignores points outside the window. Changing the
3363
+ # account, the params or the schedule makes it due immediately.
3364
+ #
3365
+ # _Requires permission: `resources:execute`._
3366
+ #
3367
+ # PUT /api/org/{orgId}/business-metrics/{id}/importer
3368
+ #
3369
+ # Raises on 400: Bad request
3370
+ #
3371
+ # Raises on 404: Not found
3372
+ #
3373
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
3374
+ # constructed with.
3375
+ # @param id [String] Metric id or key
3376
+ # @param body [Hash] Request body, shaped as `BusinessMetricImporterInput`.
3377
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
3378
+ # @return [Hash] Parsed JSON, shaped as `BusinessMetricImporter & Hash` — see
3379
+ # `sig/infrawrench/sdk.rbs`.
3380
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
3381
+ def update(id:, body:, org_id: nil, request_options: nil)
3382
+ @transport.request(
3383
+ http_method: "PUT",
3384
+ path: "/api/org/{orgId}/business-metrics/{id}/importer",
3385
+ path_params: { "orgId" => org_id, "id" => id },
3386
+ body: body,
3387
+ request_options: request_options
3388
+ )
3389
+ end
3390
+ end
3391
+
3238
3392
  # `client.business_metrics.values`
3239
3393
  class BusinessMetricsValuesNamespace
3240
3394
  # @api private
@@ -3311,6 +3465,8 @@ module Infrawrench
3311
3465
  class BusinessMetricsNamespace
3312
3466
  # @return [BusinessMetricsGetNamespace] `client.business_metrics.get`
3313
3467
  attr_reader :get
3468
+ # @return [BusinessMetricsImporterNamespace] `client.business_metrics.importer`
3469
+ attr_reader :importer
3314
3470
  # @return [BusinessMetricsValuesNamespace] `client.business_metrics.values`
3315
3471
  attr_reader :values
3316
3472
 
@@ -3319,6 +3475,7 @@ module Infrawrench
3319
3475
  def initialize(transport)
3320
3476
  @transport = transport
3321
3477
  @get = BusinessMetricsGetNamespace.new(@transport)
3478
+ @importer = BusinessMetricsImporterNamespace.new(@transport)
3322
3479
  @values = BusinessMetricsValuesNamespace.new(@transport)
3323
3480
  end
3324
3481
 
@@ -3379,6 +3536,92 @@ module Infrawrench
3379
3536
  )
3380
3537
  end
3381
3538
 
3539
+ # List an importer picker's choices
3540
+ #
3541
+ # Choices for one `select` field of a source's form, given the values picked
3542
+ # so far. Needs `resources:execute` and `costs:write`: it calls the provider
3543
+ # with the account's credentials.
3544
+ #
3545
+ # _Requires permission: `resources:execute`._
3546
+ #
3547
+ # POST /api/org/{orgId}/business-metrics/importer-options
3548
+ #
3549
+ # Raises on 400: Bad request
3550
+ #
3551
+ # Raises on 404: Not found
3552
+ #
3553
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
3554
+ # constructed with.
3555
+ # @param body [Hash] Request body, shaped as `Hash`.
3556
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
3557
+ # @return [Hash] Parsed JSON, shaped as `Hash` — see `sig/infrawrench/sdk.rbs`.
3558
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
3559
+ def importer_options(body:, org_id: nil, request_options: nil)
3560
+ @transport.request(
3561
+ http_method: "POST",
3562
+ path: "/api/org/{orgId}/business-metrics/importer-options",
3563
+ path_params: { "orgId" => org_id },
3564
+ body: body,
3565
+ request_options: request_options
3566
+ )
3567
+ end
3568
+
3569
+ # Preview an importer
3570
+ #
3571
+ # Run a source over a window and return the values it would write, writing
3572
+ # nothing; or, with `dryRun`, validate the query with the provider without
3573
+ # reading data. Read-only queries only, with the same row limit and timeout
3574
+ # as a scheduled run.
3575
+ #
3576
+ # _Requires permission: `resources:execute`._
3577
+ #
3578
+ # POST /api/org/{orgId}/business-metrics/importer-preview
3579
+ #
3580
+ # Raises on 400: Bad request
3581
+ #
3582
+ # Raises on 404: Not found
3583
+ #
3584
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
3585
+ # constructed with.
3586
+ # @param body [Hash] Request body, shaped as `BusinessMetricImportPreviewRequest`.
3587
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
3588
+ # @return [Hash] Parsed JSON, shaped as `BusinessMetricImportPreview` — see
3589
+ # `sig/infrawrench/sdk.rbs`.
3590
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
3591
+ def importer_preview(body:, org_id: nil, request_options: nil)
3592
+ @transport.request(
3593
+ http_method: "POST",
3594
+ path: "/api/org/{orgId}/business-metrics/importer-preview",
3595
+ path_params: { "orgId" => org_id },
3596
+ body: body,
3597
+ request_options: request_options
3598
+ )
3599
+ end
3600
+
3601
+ # List importer sources
3602
+ #
3603
+ # Connected accounts whose plugin can feed a business metric on a schedule,
3604
+ # each with the plugin's importer form: which fields to fill and which are
3605
+ # pickers.
3606
+ #
3607
+ # _Requires permission: `costs:read`._
3608
+ #
3609
+ # GET /api/org/{orgId}/business-metrics/importer-sources
3610
+ #
3611
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
3612
+ # constructed with.
3613
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
3614
+ # @return [Hash] Parsed JSON, shaped as `Hash` — see `sig/infrawrench/sdk.rbs`.
3615
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
3616
+ def importer_sources(org_id: nil, request_options: nil)
3617
+ @transport.request(
3618
+ http_method: "GET",
3619
+ path: "/api/org/{orgId}/business-metrics/importer-sources",
3620
+ path_params: { "orgId" => org_id },
3621
+ request_options: request_options
3622
+ )
3623
+ end
3624
+
3382
3625
  # Query unit costs or margin
3383
3626
  #
3384
3627
  # Divide spend by the metric, bucketed as asked. Three properties of the
@@ -6885,12 +7128,15 @@ module Infrawrench
6885
7128
  # List distinct values for a cost dimension
6886
7129
  #
6887
7130
  # Feeds the filter and group-by pickers. Pass dimension=tag-keys for tag
6888
- # keys, or dimension=usage-units for the usage units providers report (a
6889
- # usage budget's unit); dimension=tag requires tagKey. `charge_type` answers
6890
- # from the fixed set of charge types rather than from the stored data, so
6891
- # the picker is populated before any provider has reported one.
6892
- # `usage-units` lists the usage units present in the cost data, most common
6893
- # first, for the `usage` measure's unit picker.
7131
+ # keys, which follow the org's tag key settings (preferred keys first and
7132
+ # flagged, hidden keys omitted unless includeHidden=true),
7133
+ # dimension=virtual-tag-keys for the organization's virtual tag keys
7134
+ # (labelled by name), or dimension=usage-units for the usage units providers
7135
+ # report (a usage budget's unit); dimension=tag and dimension=virtual_tag
7136
+ # require tagKey. `charge_type` answers from the fixed set of charge types
7137
+ # rather than from the stored data, so the picker is populated before any
7138
+ # provider has reported one. `usage-units` lists the usage units present in
7139
+ # the cost data, most common first, for the `usage` measure's unit picker.
6894
7140
  #
6895
7141
  # _Requires permission: `costs:read`._
6896
7142
  #
@@ -6902,16 +7148,18 @@ module Infrawrench
6902
7148
  # constructed with.
6903
7149
  # @param dimension [String]
6904
7150
  # @param tag_key [String, nil]
7151
+ # @param include_hidden [String, nil] dimension=tag-keys only: also list keys the org hides,
7152
+ # flagged `hidden`.
6905
7153
  # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
6906
7154
  # @return [Hash] Parsed JSON, shaped as `CostDimensionValues` — see
6907
7155
  # `sig/infrawrench/sdk.rbs`.
6908
7156
  # @raise [Infrawrench::ApiError] On any non-2xx response.
6909
- def dimensions(dimension:, org_id: nil, tag_key: nil, request_options: nil)
7157
+ def dimensions(dimension:, org_id: nil, tag_key: nil, include_hidden: nil, request_options: nil)
6910
7158
  @transport.request(
6911
7159
  http_method: "GET",
6912
7160
  path: "/api/org/{orgId}/costs/dimensions",
6913
7161
  path_params: { "orgId" => org_id },
6914
- query: { "dimension" => dimension, "tagKey" => tag_key },
7162
+ query: { "dimension" => dimension, "tagKey" => tag_key, "includeHidden" => include_hidden },
6915
7163
  request_options: request_options
6916
7164
  )
6917
7165
  end
@@ -18243,6 +18491,103 @@ module Infrawrench
18243
18491
  end
18244
18492
  end
18245
18493
 
18494
+ # `client.tag_keys.settings`
18495
+ class TagKeysSettingsNamespace
18496
+ # @api private
18497
+ # @param transport [Transport]
18498
+ def initialize(transport)
18499
+ @transport = transport
18500
+ end
18501
+
18502
+ # The org's hidden and preferred tag keys
18503
+ #
18504
+ # _Requires permission: `resources:read`._
18505
+ #
18506
+ # GET /api/org/{orgId}/tag-keys/settings
18507
+ #
18508
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
18509
+ # constructed with.
18510
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
18511
+ # @return [Hash] Parsed JSON, shaped as `TagKeySettings` — see `sig/infrawrench/sdk.rbs`.
18512
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
18513
+ def get(org_id: nil, request_options: nil)
18514
+ @transport.request(
18515
+ http_method: "GET",
18516
+ path: "/api/org/{orgId}/tag-keys/settings",
18517
+ path_params: { "orgId" => org_id },
18518
+ request_options: request_options
18519
+ )
18520
+ end
18521
+
18522
+ # Replace the org's hidden and preferred tag keys
18523
+ #
18524
+ # Applied to every tag-key listing the API serves (`GET
18525
+ # /costs/dimensions?dimension=tag-keys`, the metric alert selector options,
18526
+ # the MCP tools): preferred keys first, hidden keys omitted. A display
18527
+ # preference only; no stored data changes.
18528
+ #
18529
+ # _Requires permission: `org:settings:write`._
18530
+ #
18531
+ # PUT /api/org/{orgId}/tag-keys/settings
18532
+ #
18533
+ # Raises on 400: Bad request
18534
+ #
18535
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
18536
+ # constructed with.
18537
+ # @param body [Hash] Request body, shaped as `TagKeySettings`.
18538
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
18539
+ # @return [Hash] Parsed JSON, shaped as `TagKeySettings` — see `sig/infrawrench/sdk.rbs`.
18540
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
18541
+ def update(body:, org_id: nil, request_options: nil)
18542
+ @transport.request(
18543
+ http_method: "PUT",
18544
+ path: "/api/org/{orgId}/tag-keys/settings",
18545
+ path_params: { "orgId" => org_id },
18546
+ body: body,
18547
+ request_options: request_options
18548
+ )
18549
+ end
18550
+ end
18551
+
18552
+ # `client.tag_keys`
18553
+ class TagKeysNamespace
18554
+ # @return [TagKeysSettingsNamespace] `client.tag_keys.settings`
18555
+ attr_reader :settings
18556
+
18557
+ # @api private
18558
+ # @param transport [Transport]
18559
+ def initialize(transport)
18560
+ @transport = transport
18561
+ @settings = TagKeysSettingsNamespace.new(@transport)
18562
+ end
18563
+
18564
+ # Discovered tag keys with usage
18565
+ #
18566
+ # Every tag key the org's cost data (trailing 90 days) and resource
18567
+ # inventory carry, with the providers using it, row and resource counts, and
18568
+ # whether the tag key settings hide or pin it. Preferred keys first, then by
18569
+ # usage. Cost counts are included only when the caller also holds
18570
+ # `costs:read`.
18571
+ #
18572
+ # _Requires permission: `resources:read`._
18573
+ #
18574
+ # GET /api/org/{orgId}/tag-keys
18575
+ #
18576
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
18577
+ # constructed with.
18578
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
18579
+ # @return [Hash] Parsed JSON, shaped as `DiscoveredTagKeys` — see `sig/infrawrench/sdk.rbs`.
18580
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
18581
+ def get(org_id: nil, request_options: nil)
18582
+ @transport.request(
18583
+ http_method: "GET",
18584
+ path: "/api/org/{orgId}/tag-keys",
18585
+ path_params: { "orgId" => org_id },
18586
+ request_options: request_options
18587
+ )
18588
+ end
18589
+ end
18590
+
18246
18591
  # `client.tag_policy`
18247
18592
  class TagPolicyNamespace
18248
18593
  # @api private
@@ -18648,6 +18993,208 @@ module Infrawrench
18648
18993
  end
18649
18994
  end
18650
18995
 
18996
+ # `client.virtual_tags`
18997
+ class VirtualTagsNamespace
18998
+ # @api private
18999
+ # @param transport [Transport]
19000
+ def initialize(transport)
19001
+ @transport = transport
19002
+ end
19003
+
19004
+ # Create a virtual tag
19005
+ #
19006
+ # Queues the background evaluation over stored history at once.
19007
+ #
19008
+ # _Requires permission: `costs:write`._
19009
+ #
19010
+ # POST /api/org/{orgId}/virtual-tags
19011
+ #
19012
+ # Raises on 400: Bad request
19013
+ #
19014
+ # Raises on 409: Conflict
19015
+ #
19016
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
19017
+ # constructed with.
19018
+ # @param body [Hash] Request body, shaped as `VirtualTagInput`.
19019
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
19020
+ # @return [Hash] Parsed JSON, shaped as `VirtualTag` — see `sig/infrawrench/sdk.rbs`.
19021
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
19022
+ def create(body:, org_id: nil, request_options: nil)
19023
+ @transport.request(
19024
+ http_method: "POST",
19025
+ path: "/api/org/{orgId}/virtual-tags",
19026
+ path_params: { "orgId" => org_id },
19027
+ body: body,
19028
+ request_options: request_options
19029
+ )
19030
+ end
19031
+
19032
+ # Delete a virtual tag
19033
+ #
19034
+ # Refused with a 409 that names every saved filter, budget, report,
19035
+ # dashboard card, change alert, allocation rule, cost export or business
19036
+ # metric still referencing the key: deleting it would make those fail rather
19037
+ # than quietly widen to all spend.
19038
+ #
19039
+ # _Requires permission: `costs:write`._
19040
+ #
19041
+ # DELETE /api/org/{orgId}/virtual-tags/{id}
19042
+ #
19043
+ # Raises on 404: Not found
19044
+ #
19045
+ # Raises on 409: Conflict
19046
+ #
19047
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
19048
+ # constructed with.
19049
+ # @param id [String]
19050
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
19051
+ # @return [Hash] Parsed JSON, shaped as `Ok` — see `sig/infrawrench/sdk.rbs`.
19052
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
19053
+ def delete(id:, org_id: nil, request_options: nil)
19054
+ @transport.request(
19055
+ http_method: "DELETE",
19056
+ path: "/api/org/{orgId}/virtual-tags/{id}",
19057
+ path_params: { "orgId" => org_id, "id" => id },
19058
+ request_options: request_options
19059
+ )
19060
+ end
19061
+
19062
+ # Get a virtual tag
19063
+ #
19064
+ # _Requires permission: `costs:read`._
19065
+ #
19066
+ # GET /api/org/{orgId}/virtual-tags/{id}
19067
+ #
19068
+ # Raises on 404: Not found
19069
+ #
19070
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
19071
+ # constructed with.
19072
+ # @param id [String]
19073
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
19074
+ # @return [Hash] Parsed JSON, shaped as `VirtualTag` — see `sig/infrawrench/sdk.rbs`.
19075
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
19076
+ def get(id:, org_id: nil, request_options: nil)
19077
+ @transport.request(
19078
+ http_method: "GET",
19079
+ path: "/api/org/{orgId}/virtual-tags/{id}",
19080
+ path_params: { "orgId" => org_id, "id" => id },
19081
+ request_options: request_options
19082
+ )
19083
+ end
19084
+
19085
+ # List virtual tags
19086
+ #
19087
+ # Virtual tags are tags the organisation computes from its own ordered
19088
+ # rules: merge `env`/`Environment`/`ENV` into one key, assign values by any
19089
+ # cost filter, split shared spend by percentage or by a business metric,
19090
+ # with optional start and end dates per rule. They work as the `virtual_tag`
19091
+ # cost dimension everywhere a tag does.
19092
+ #
19093
+ # **They are computed at query time and never written into stored cost
19094
+ # data**, and splits are weighted so a total never changes.
19095
+ #
19096
+ # _Requires permission: `costs:read`._
19097
+ #
19098
+ # GET /api/org/{orgId}/virtual-tags
19099
+ #
19100
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
19101
+ # constructed with.
19102
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
19103
+ # @return [Array<Hash>] Parsed JSON, shaped as `Array<VirtualTag>` — see
19104
+ # `sig/infrawrench/sdk.rbs`.
19105
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
19106
+ def list(org_id: nil, request_options: nil)
19107
+ @transport.request(
19108
+ http_method: "GET",
19109
+ path: "/api/org/{orgId}/virtual-tags",
19110
+ path_params: { "orgId" => org_id },
19111
+ request_options: request_options
19112
+ )
19113
+ end
19114
+
19115
+ # Preview an unsaved virtual tag
19116
+ #
19117
+ # Evaluates a definition over the trailing 30 days without storing it: spend
19118
+ # per rule, unmatched spend and the top values. Validates exactly as a save
19119
+ # would.
19120
+ #
19121
+ # _Requires permission: `costs:read`._
19122
+ #
19123
+ # POST /api/org/{orgId}/virtual-tags/preview
19124
+ #
19125
+ # Raises on 400: Bad request
19126
+ #
19127
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
19128
+ # constructed with.
19129
+ # @param body [Hash] Request body, shaped as `VirtualTagInput`.
19130
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
19131
+ # @return [Hash] Parsed JSON, shaped as `VirtualTagStats & Hash` — see
19132
+ # `sig/infrawrench/sdk.rbs`.
19133
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
19134
+ def preview(body:, org_id: nil, request_options: nil)
19135
+ @transport.request(
19136
+ http_method: "POST",
19137
+ path: "/api/org/{orgId}/virtual-tags/preview",
19138
+ path_params: { "orgId" => org_id },
19139
+ body: body,
19140
+ request_options: request_options
19141
+ )
19142
+ end
19143
+
19144
+ # Re-run a virtual tag's evaluation
19145
+ #
19146
+ # _Requires permission: `costs:write`._
19147
+ #
19148
+ # POST /api/org/{orgId}/virtual-tags/{id}/reprocess
19149
+ #
19150
+ # Raises on 404: Not found
19151
+ #
19152
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
19153
+ # constructed with.
19154
+ # @param id [String]
19155
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
19156
+ # @return [Hash] Parsed JSON, shaped as `VirtualTag` — see `sig/infrawrench/sdk.rbs`.
19157
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
19158
+ def reprocess(id:, org_id: nil, request_options: nil)
19159
+ @transport.request(
19160
+ http_method: "POST",
19161
+ path: "/api/org/{orgId}/virtual-tags/{id}/reprocess",
19162
+ path_params: { "orgId" => org_id, "id" => id },
19163
+ request_options: request_options
19164
+ )
19165
+ end
19166
+
19167
+ # Update a virtual tag
19168
+ #
19169
+ # A full replace, rule order included. The key cannot change (400). Saving
19170
+ # re-queues the background evaluation.
19171
+ #
19172
+ # _Requires permission: `costs:write`._
19173
+ #
19174
+ # PUT /api/org/{orgId}/virtual-tags/{id}
19175
+ #
19176
+ # Raises on 400: Bad request
19177
+ #
19178
+ # Raises on 404: Not found
19179
+ #
19180
+ # @param org_id [String, nil] Organization id. Defaults to the `org_id` the client was
19181
+ # constructed with.
19182
+ # @param id [String]
19183
+ # @param body [Hash] Request body, shaped as `VirtualTagInput`.
19184
+ # @param request_options [Hash, nil] Per-call `:headers`, `:timeout` and `:open_timeout`.
19185
+ # @return [Hash] Parsed JSON, shaped as `VirtualTag` — see `sig/infrawrench/sdk.rbs`.
19186
+ # @raise [Infrawrench::ApiError] On any non-2xx response.
19187
+ def update(id:, body:, org_id: nil, request_options: nil)
19188
+ @transport.request(
19189
+ http_method: "PUT",
19190
+ path: "/api/org/{orgId}/virtual-tags/{id}",
19191
+ path_params: { "orgId" => org_id, "id" => id },
19192
+ body: body,
19193
+ request_options: request_options
19194
+ )
19195
+ end
19196
+ end
19197
+
18651
19198
  # `client.wallboard`
18652
19199
  class WallboardNamespace
18653
19200
  # @api private
@@ -19355,10 +19902,14 @@ module Infrawrench
19355
19902
  attr_reader :status_pages
19356
19903
  # @return [StorageNamespace] `client.storage`
19357
19904
  attr_reader :storage
19905
+ # @return [TagKeysNamespace] `client.tag_keys`
19906
+ attr_reader :tag_keys
19358
19907
  # @return [TagPolicyNamespace] `client.tag_policy`
19359
19908
  attr_reader :tag_policy
19360
19909
  # @return [TeamNamespace] `client.team`
19361
19910
  attr_reader :team
19911
+ # @return [VirtualTagsNamespace] `client.virtual_tags`
19912
+ attr_reader :virtual_tags
19362
19913
  # @return [WallboardNamespace] `client.wallboard`
19363
19914
  attr_reader :wallboard
19364
19915
  # @return [WorkflowApprovalsNamespace] `client.workflow_approvals`
@@ -19473,8 +20024,10 @@ module Infrawrench
19473
20024
  @status_incidents = StatusIncidentsNamespace.new(@transport)
19474
20025
  @status_pages = StatusPagesNamespace.new(@transport)
19475
20026
  @storage = StorageNamespace.new(@transport)
20027
+ @tag_keys = TagKeysNamespace.new(@transport)
19476
20028
  @tag_policy = TagPolicyNamespace.new(@transport)
19477
20029
  @team = TeamNamespace.new(@transport)
20030
+ @virtual_tags = VirtualTagsNamespace.new(@transport)
19478
20031
  @wallboard = WallboardNamespace.new(@transport)
19479
20032
  @workflow_approvals = WorkflowApprovalsNamespace.new(@transport)
19480
20033
  @workflow_secrets = WorkflowSecretsNamespace.new(@transport)
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # infrawrench-sdk v1.59.0 | MIT | Copyright (c) 2026 Infrawrench LLC
3
+ # infrawrench-sdk v1.62.0 | MIT | Copyright (c) 2026 Infrawrench LLC
4
4
  # https://github.com/Infrawrench/Infrawrench
5
5
  #
6
- # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 1.59.0).
6
+ # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 1.62.0).
7
7
  #
8
8
  # DO NOT EDIT. Regenerate with:
9
9
  # pnpm --filter @infrawrench/web generate:sdk
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # infrawrench-sdk v1.59.0 | MIT | Copyright (c) 2026 Infrawrench LLC
3
+ # infrawrench-sdk v1.62.0 | MIT | Copyright (c) 2026 Infrawrench LLC
4
4
  # https://github.com/Infrawrench/Infrawrench
5
5
  #
6
- # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 1.59.0).
6
+ # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 1.62.0).
7
7
  #
8
8
  # DO NOT EDIT. Regenerate with:
9
9
  # pnpm --filter @infrawrench/web generate:sdk
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # infrawrench-sdk v1.59.0 | MIT | Copyright (c) 2026 Infrawrench LLC
3
+ # infrawrench-sdk v1.62.0 | MIT | Copyright (c) 2026 Infrawrench LLC
4
4
  # https://github.com/Infrawrench/Infrawrench
5
5
  #
6
- # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 1.59.0).
6
+ # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 1.62.0).
7
7
  #
8
8
  # DO NOT EDIT. Regenerate with:
9
9
  # pnpm --filter @infrawrench/web generate:sdk
@@ -15,5 +15,5 @@
15
15
  # Kept in its own file so the gemspec can read the version without loading the
16
16
  # client — a gemspec that pulls in net/http is a gemspec that can fail to parse.
17
17
  module Infrawrench
18
- VERSION = "1.59.0"
18
+ VERSION = "1.62.0"
19
19
  end
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # infrawrench-sdk v1.59.0 | MIT | Copyright (c) 2026 Infrawrench LLC
3
+ # infrawrench-sdk v1.62.0 | MIT | Copyright (c) 2026 Infrawrench LLC
4
4
  # https://github.com/Infrawrench/Infrawrench
5
5
  #
6
- # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 1.59.0).
6
+ # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 1.62.0).
7
7
  #
8
8
  # DO NOT EDIT. Regenerate with:
9
9
  # pnpm --filter @infrawrench/web generate:sdk
@@ -1,7 +1,7 @@
1
- # infrawrench-sdk v1.59.0 | MIT | Copyright (c) 2026 Infrawrench LLC
1
+ # infrawrench-sdk v1.62.0 | MIT | Copyright (c) 2026 Infrawrench LLC
2
2
  # https://github.com/Infrawrench/Infrawrench
3
3
  #
4
- # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 1.59.0).
4
+ # Generated from the Infrawrench API OpenAPI 3.1 spec (API version 1.62.0).
5
5
  #
6
6
  # DO NOT EDIT. Regenerate with:
7
7
  # pnpm --filter @infrawrench/web generate:sdk
@@ -676,7 +676,9 @@ module Infrawrench
676
676
  ?"tagValue" => String,
677
677
  ?"accountId" => String,
678
678
  ?"pluginId" => String,
679
- ?"service" => String
679
+ ?"service" => String,
680
+ ?"virtualTagKey" => String,
681
+ ?"virtualTagValue" => String
680
682
  }
681
683
 
682
684
  # Spec schema: `ApiKey`.
@@ -1095,7 +1097,8 @@ module Infrawrench
1095
1097
  | "resource"
1096
1098
  | "tag"
1097
1099
  | "charge_type"
1098
- | "commitment",
1100
+ | "commitment"
1101
+ | "virtual_tag",
1099
1102
  "op" => "in" | "not_in",
1100
1103
  "values" => Array[String],
1101
1104
  ?"tagKey" => String
@@ -1241,7 +1244,8 @@ module Infrawrench
1241
1244
  "createdByUserId" => String | nil,
1242
1245
  "createdAt" => String,
1243
1246
  "updatedAt" => String,
1244
- "coverage" => business_metric_coverage
1247
+ "coverage" => business_metric_coverage,
1248
+ "importer" => business_metric_importer_summary
1245
1249
  }
1246
1250
 
1247
1251
  # Null when the metric has no values at all — not an error, but every
@@ -1250,6 +1254,108 @@ module Infrawrench
1250
1254
  # Spec schema: `BusinessMetricCoverage`.
1251
1255
  type business_metric_coverage = { "firstDay" => String, "lastDay" => String, "reportedDays" => Integer } | nil
1252
1256
 
1257
+ # How several points the source returns for one day (and label) become that
1258
+ # day's value. A SQL query grouped by day returns one row per day and every
1259
+ # choice agrees.
1260
+ #
1261
+ # Spec schema: `BusinessMetricImportAggregation`.
1262
+ type business_metric_import_aggregation = "sum" | "average" | "min" | "max" | "last" | "count"
1263
+
1264
+ # Spec schema: `BusinessMetricImportPreview`.
1265
+ type business_metric_import_preview = {
1266
+ "from" => String,
1267
+ "to" => String,
1268
+ "values" => Array[{ "date" => String, "value" => Numeric, ?"label" => String }],
1269
+ "pointsRead" => Integer,
1270
+ "days" => Integer,
1271
+ "notes" => Array[String],
1272
+ "durationMs" => Integer,
1273
+ ?"dryRun" => { "valid" => bool, "message" => String, ?"bytesProcessed" => Numeric }
1274
+ }
1275
+
1276
+ # Spec schema: `BusinessMetricImportPreviewRequest`.
1277
+ type business_metric_import_preview_request = {
1278
+ "accountId" => String,
1279
+ "params" => Hash[String, String],
1280
+ ?"from" => String,
1281
+ ?"to" => String,
1282
+ ?"timezone" => String,
1283
+ ?"aggregation" => business_metric_import_aggregation,
1284
+ ?"dryRun" => bool
1285
+ }
1286
+
1287
+ # Spec schema: `BusinessMetricImportRun`.
1288
+ type business_metric_import_run = {
1289
+ "id" => String,
1290
+ "importerId" => String,
1291
+ "trigger" => "schedule" | "manual",
1292
+ "status" => "running" | "success" | "error",
1293
+ "from" => String,
1294
+ "to" => String,
1295
+ "pointsRead" => Integer,
1296
+ "daysWritten" => Integer,
1297
+ "error" => String | nil,
1298
+ "notes" => Array[String],
1299
+ "startedAt" => String,
1300
+ "finishedAt" => String | nil,
1301
+ "durationMs" => Integer | nil
1302
+ }
1303
+
1304
+ # Spec schema: `BusinessMetricImportSchedule`.
1305
+ type business_metric_import_schedule = "every_6_hours" | "every_12_hours" | "daily" | "weekly"
1306
+
1307
+ # Spec schema: `BusinessMetricImporter`.
1308
+ type business_metric_importer = {
1309
+ "id" => String,
1310
+ "metricId" => String,
1311
+ "accountId" => String,
1312
+ "accountName" => String | nil,
1313
+ "pluginId" => String | nil,
1314
+ "sourceLabel" => String | nil,
1315
+ "params" => Hash[String, String],
1316
+ "schedule" => business_metric_import_schedule,
1317
+ "backfillDays" => Integer,
1318
+ "timezone" => String,
1319
+ "aggregation" => business_metric_import_aggregation,
1320
+ "enabled" => bool,
1321
+ "nextRunAt" => String | nil,
1322
+ "lastRunAt" => String | nil,
1323
+ "lastStatus" => "success" | "error" | nil,
1324
+ "lastError" => String | nil,
1325
+ "consecutiveFailures" => Integer,
1326
+ "createdByUserId" => String | nil,
1327
+ "createdAt" => String,
1328
+ "updatedAt" => String
1329
+ }
1330
+ | nil
1331
+
1332
+ # Spec schema: `BusinessMetricImporterInput`.
1333
+ type business_metric_importer_input = {
1334
+ "accountId" => String,
1335
+ "params" => Hash[String, String],
1336
+ ?"schedule" => business_metric_import_schedule & untyped,
1337
+ ?"backfillDays" => Integer,
1338
+ ?"timezone" => String,
1339
+ ?"aggregation" => business_metric_import_aggregation,
1340
+ ?"enabled" => bool
1341
+ }
1342
+
1343
+ # The scheduled importer feeding this metric, or null when its values are only
1344
+ # pushed.
1345
+ #
1346
+ # Spec schema: `BusinessMetricImporterSummary`.
1347
+ type business_metric_importer_summary = {
1348
+ "accountId" => String,
1349
+ "accountName" => String | nil,
1350
+ "pluginId" => String | nil,
1351
+ "sourceLabel" => String | nil,
1352
+ "enabled" => bool,
1353
+ "lastRunAt" => String | nil,
1354
+ "lastStatus" => "success" | "error" | nil,
1355
+ "lastError" => String | nil
1356
+ }
1357
+ | nil
1358
+
1253
1359
  # Spec schema: `BusinessMetricInput`.
1254
1360
  type business_metric_input = {
1255
1361
  "key" => String,
@@ -1280,17 +1386,55 @@ module Infrawrench
1280
1386
  | "resource"
1281
1387
  | "tag"
1282
1388
  | "charge_type"
1283
- | "commitment",
1389
+ | "commitment"
1390
+ | "virtual_tag",
1284
1391
  "op" => "in" | "not_in",
1285
1392
  "values" => Array[String],
1286
1393
  ?"tagKey" => String
1287
1394
  }
1288
1395
 
1396
+ # Spec schema: `BusinessMetricSourceAccount`.
1397
+ type business_metric_source_account = {
1398
+ "accountId" => String,
1399
+ "accountName" => String,
1400
+ "pluginId" => String,
1401
+ "pluginName" => String,
1402
+ "source" => {
1403
+ "label" => String,
1404
+ ?"description" => String,
1405
+ "kind" => "sql" | "metric",
1406
+ "fields" => Array[business_metric_source_field],
1407
+ ?"sqlDialect" => String,
1408
+ ?"readOnly" => "enforced" | "validated",
1409
+ ?"supportsDryRun" => bool
1410
+ }
1411
+ }
1412
+
1413
+ # Spec schema: `BusinessMetricSourceField`.
1414
+ type business_metric_source_field = {
1415
+ "key" => String,
1416
+ "label" => String,
1417
+ "type" => "select" | "sql" | "text" | "number",
1418
+ ?"required" => bool,
1419
+ ?"description" => String,
1420
+ ?"placeholder" => String,
1421
+ ?"defaultValue" => String,
1422
+ ?"options" => Array[{ "id" => String, "label" => String, ?"description" => String }],
1423
+ ?"dependsOn" => Array[String],
1424
+ ?"allowCustom" => bool
1425
+ }
1426
+
1289
1427
  # Spec schema: `BusinessMetricValue`.
1290
- type business_metric_value = { "day" => String, "value" => Numeric, "source" => "api" | "workflow", "updatedAt" => String }
1428
+ type business_metric_value = {
1429
+ "day" => String,
1430
+ "value" => Numeric,
1431
+ "label" => String | nil,
1432
+ "source" => "api" | "workflow" | "import",
1433
+ "updatedAt" => String
1434
+ }
1291
1435
 
1292
1436
  # Spec schema: `BusinessMetricValuesInput`.
1293
- type business_metric_values_input = { "values" => Array[{ "date" => String, "value" => Numeric }] }
1437
+ type business_metric_values_input = { "values" => Array[{ "date" => String, "value" => Numeric, ?"label" => String }] }
1294
1438
 
1295
1439
  # Spec schema: `CalendarEvent`.
1296
1440
  type calendar_event = {
@@ -1854,6 +1998,7 @@ module Infrawrench
1854
1998
  | "tag"
1855
1999
  | "charge_type"
1856
2000
  | "commitment"
2001
+ | "virtual_tag"
1857
2002
  | nil,
1858
2003
  "groupByTagKey" => String | nil,
1859
2004
  "cadence" => cost_change_cadence,
@@ -1896,7 +2041,8 @@ module Infrawrench
1896
2041
  | "resource"
1897
2042
  | "tag"
1898
2043
  | "charge_type"
1899
- | "commitment",
2044
+ | "commitment"
2045
+ | "virtual_tag",
1900
2046
  "op" => "in" | "not_in",
1901
2047
  "values" => Array[String],
1902
2048
  ?"tagKey" => String
@@ -1914,6 +2060,7 @@ module Infrawrench
1914
2060
  | "tag"
1915
2061
  | "charge_type"
1916
2062
  | "commitment"
2063
+ | "virtual_tag"
1917
2064
  | nil,
1918
2065
  ?"groupByTagKey" => String,
1919
2066
  "cadence" => cost_change_cadence,
@@ -2184,9 +2331,12 @@ module Infrawrench
2184
2331
  | "tag"
2185
2332
  | "charge_type"
2186
2333
  | "commitment"
2334
+ | "virtual_tag"
2187
2335
 
2188
2336
  # Spec schema: `CostDimensionValues`.
2189
- type cost_dimension_values = { "values" => Array[String | { "value" => String, "label" => String }] }
2337
+ type cost_dimension_values = {
2338
+ "values" => Array[String | { "value" => String, "label" => String, ?"preferred" => bool, ?"hidden" => bool }]
2339
+ }
2190
2340
 
2191
2341
  # Spec schema: `CostEfficiencySettings`.
2192
2342
  type cost_efficiency_settings = {
@@ -2286,7 +2436,8 @@ module Infrawrench
2286
2436
  | "resource"
2287
2437
  | "tag"
2288
2438
  | "charge_type"
2289
- | "commitment",
2439
+ | "commitment"
2440
+ | "virtual_tag",
2290
2441
  "op" => "in" | "not_in",
2291
2442
  "values" => Array[String],
2292
2443
  ?"tagKey" => String
@@ -2333,8 +2484,10 @@ module Infrawrench
2333
2484
  | "resource"
2334
2485
  | "tag"
2335
2486
  | "charge_type"
2336
- | "commitment"],
2487
+ | "commitment"
2488
+ | "virtual_tag"],
2337
2489
  "tagKeys" => Array[String],
2490
+ ?"virtualTagKeys" => Array[String],
2338
2491
  "filters" => Array[cost_export_filter],
2339
2492
  ?"chargeTypes" => Array["usage"
2340
2493
  | "commitment_covered_usage"
@@ -2422,7 +2575,8 @@ module Infrawrench
2422
2575
  | "resource"
2423
2576
  | "tag"
2424
2577
  | "charge_type"
2425
- | "commitment",
2578
+ | "commitment"
2579
+ | "virtual_tag",
2426
2580
  ?"groupByTagKey" => String,
2427
2581
  ?"filters" => Array[cost_report_filter],
2428
2582
  ?"savedFilterId" => String,
@@ -2467,7 +2621,8 @@ module Infrawrench
2467
2621
  | "resource"
2468
2622
  | "tag"
2469
2623
  | "charge_type"
2470
- | "commitment",
2624
+ | "commitment"
2625
+ | "virtual_tag",
2471
2626
  ?"groupByTagKey" => String,
2472
2627
  ?"filters" => Array[cost_filter],
2473
2628
  ?"query" => String,
@@ -2528,7 +2683,8 @@ module Infrawrench
2528
2683
  | "resource"
2529
2684
  | "tag"
2530
2685
  | "charge_type"
2531
- | "commitment",
2686
+ | "commitment"
2687
+ | "virtual_tag",
2532
2688
  "op" => "in" | "not_in",
2533
2689
  "values" => Array[String],
2534
2690
  ?"tagKey" => String
@@ -2643,7 +2799,8 @@ module Infrawrench
2643
2799
  | "resource"
2644
2800
  | "tag"
2645
2801
  | "charge_type"
2646
- | "commitment",
2802
+ | "commitment"
2803
+ | "virtual_tag",
2647
2804
  "op" => "in" | "not_in",
2648
2805
  "values" => Array[String],
2649
2806
  ?"tagKey" => String
@@ -3411,6 +3568,28 @@ module Infrawrench
3411
3568
  # Spec schema: `DiscountTreatment`.
3412
3569
  type discount_treatment = { "mode" => "pass_through" | "partial" | "retain", ?"passThroughPercent" => Numeric | nil }
3413
3570
 
3571
+ # Spec schema: `DiscoveredTagKey`.
3572
+ type discovered_tag_key = {
3573
+ "key" => String,
3574
+ "providers" => Array[String],
3575
+ "sources" => Array["costs" | "resources"],
3576
+ "costRowCount" => Integer,
3577
+ "costResourceCount" => Integer,
3578
+ "inventoryCount" => Integer,
3579
+ "lastSeen" => String | nil,
3580
+ "hidden" => bool,
3581
+ "hiddenBy" => String | nil,
3582
+ "preferred" => bool
3583
+ }
3584
+
3585
+ # Spec schema: `DiscoveredTagKeys`.
3586
+ type discovered_tag_keys = {
3587
+ "keys" => Array[discovered_tag_key],
3588
+ "settings" => tag_key_settings,
3589
+ "lookbackDays" => Integer,
3590
+ "truncated" => bool
3591
+ }
3592
+
3414
3593
  # Spec schema: `DismissedAccessFinding`.
3415
3594
  type dismissed_access_finding = {
3416
3595
  "resourceId" => String,
@@ -5074,7 +5253,8 @@ module Infrawrench
5074
5253
  # Spec schema: `MetricAlertSelectorOptions`.
5075
5254
  type metric_alert_selector_options = {
5076
5255
  "plugins" => Array[{ "pluginId" => String, "resourceTypeIds" => Array[String] }],
5077
- "tagKeys" => Array[String]
5256
+ "tagKeys" => Array[String],
5257
+ "preferredTagKeys" => Array[String]
5078
5258
  }
5079
5259
 
5080
5260
  # Spec schema: `MetricAlertSelectorPreview`.
@@ -6052,6 +6232,7 @@ module Infrawrench
6052
6232
  | "kubernetes"
6053
6233
  | "linode"
6054
6234
  | "memcached"
6235
+ | "metronome"
6055
6236
  | "mistral"
6056
6237
  | "modal"
6057
6238
  | "mongodb"
@@ -7075,6 +7256,7 @@ module Infrawrench
7075
7256
  | "bigquery-dataset"
7076
7257
  | "bigquery-table"
7077
7258
  | "bigtable-instance"
7259
+ | "billable-metric"
7078
7260
  | "billing-account"
7079
7261
  | "billing-group"
7080
7262
  | "block-volume"
@@ -7142,6 +7324,7 @@ module Infrawrench
7142
7324
  | "custom-enrichment"
7143
7325
  | "custom-hostname"
7144
7326
  | "custom-voice"
7327
+ | "customer"
7145
7328
  | "d1-database"
7146
7329
  | "dashboard"
7147
7330
  | "database"
@@ -7889,7 +8072,8 @@ module Infrawrench
7889
8072
  | "resource"
7890
8073
  | "tag"
7891
8074
  | "charge_type"
7892
- | "commitment",
8075
+ | "commitment"
8076
+ | "virtual_tag",
7893
8077
  "op" => "in" | "not_in",
7894
8078
  "values" => Array[String],
7895
8079
  ?"tagKey" => String
@@ -8663,6 +8847,9 @@ module Infrawrench
8663
8847
  # Spec schema: `TagComplianceReport`.
8664
8848
  type tag_compliance_report = { "policy" => tag_policy, "accounts" => Array[account_tag_compliance] }
8665
8849
 
8850
+ # Spec schema: `TagKeySettings`.
8851
+ type tag_key_settings = { "hidden" => Array[String], "preferred" => Array[String] }
8852
+
8666
8853
  # Spec schema: `TagPolicy`.
8667
8854
  type tag_policy = { "requiredTags" => Array[required_tag], "enforceOnCreate" => bool }
8668
8855
 
@@ -8839,6 +9026,72 @@ module Infrawrench
8839
9026
  # Spec schema: `ValidateTabsResponse`.
8840
9027
  type validate_tabs_response = { "validTabIds" => Array[String] }
8841
9028
 
9029
+ # Spec schema: `VirtualTag`.
9030
+ type virtual_tag = {
9031
+ "id" => String,
9032
+ "key" => String,
9033
+ "name" => String,
9034
+ "description" => String | nil,
9035
+ "defaultValue" => String | nil,
9036
+ "rules" => Array[virtual_tag_rule],
9037
+ "status" => {
9038
+ "state" => "pending" | "processing" | "ready" | "failed",
9039
+ "processedAt" => String | nil,
9040
+ "error" => String | nil,
9041
+ "stats" => virtual_tag_stats
9042
+ },
9043
+ "createdByUserId" => String | nil,
9044
+ "createdAt" => String,
9045
+ "updatedAt" => String
9046
+ }
9047
+
9048
+ # Spec schema: `VirtualTagAllocation`.
9049
+ type virtual_tag_allocation = { "value" => String, ?"percent" => Numeric | nil, ?"metricId" => String | nil }
9050
+
9051
+ # Spec schema: `VirtualTagCurrencyStats`.
9052
+ type virtual_tag_currency_stats = {
9053
+ "currency" => String,
9054
+ "total" => Numeric,
9055
+ "unmatched" => Numeric,
9056
+ "byRule" => Array[Numeric],
9057
+ "topValues" => Array[{ "value" => String, "amount" => Numeric }]
9058
+ }
9059
+
9060
+ # Spec schema: `VirtualTagInput`.
9061
+ type virtual_tag_input = {
9062
+ "key" => String,
9063
+ "name" => String,
9064
+ ?"description" => String | nil,
9065
+ ?"defaultValue" => String | nil,
9066
+ "rules" => Array[virtual_tag_rule]
9067
+ }
9068
+
9069
+ # Spec schema: `VirtualTagRule`.
9070
+ type virtual_tag_rule = {
9071
+ ?"query" => String,
9072
+ ?"description" => String | nil,
9073
+ ?"startsOn" => String | nil,
9074
+ ?"endsOn" => String | nil,
9075
+ "kind" => "value" | "tag" | "split" | "metric_split",
9076
+ ?"value" => String | nil,
9077
+ ?"sources" => Array[virtual_tag_source],
9078
+ ?"valueTransform" => "none" | "lower" | "upper",
9079
+ ?"allocations" => Array[virtual_tag_allocation]
9080
+ }
9081
+
9082
+ # Spec schema: `VirtualTagSource`.
9083
+ type virtual_tag_source = { "tagKey" => String, ?"valuePrefix" => String | nil, ?"query" => String | nil }
9084
+
9085
+ # Spec schema: `VirtualTagStats`.
9086
+ type virtual_tag_stats = {
9087
+ "from" => String | nil,
9088
+ "to" => String | nil,
9089
+ "currencies" => Array[virtual_tag_currency_stats],
9090
+ "metricFallbackDays" => Integer,
9091
+ "distinctValues" => Integer
9092
+ }
9093
+ | nil
9094
+
8842
9095
  # Spec schema: `WallboardFailureLine`.
8843
9096
  type wallboard_failure_line = { "id" => String, "label" => String, "detail" => String, "since" => String | nil }
8844
9097
 
@@ -9201,6 +9454,15 @@ module Infrawrench
9201
9454
  def get_org_org_id_business_metrics_id: (id: String, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> business_metric
9202
9455
  end
9203
9456
 
9457
+ class BusinessMetricsImporterNamespace
9458
+ def initialize: (Transport) -> void
9459
+ def delete: (id: String, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> ok
9460
+ def get: (id: String, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> { "importer" => business_metric_importer }
9461
+ def run: (id: String, ?org_id: String?, ?body: { ?"from" => String, ?"to" => String }?, ?request_options: Hash[Symbol, untyped]?) -> business_metric_import_run
9462
+ def runs: (id: String, ?org_id: String?, ?limit: Integer?, ?request_options: Hash[Symbol, untyped]?) -> { "runs" => Array[business_metric_import_run] }
9463
+ def update: (id: String, body: business_metric_importer_input, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> (business_metric_importer & Hash[String, untyped])
9464
+ end
9465
+
9204
9466
  class BusinessMetricsValuesNamespace
9205
9467
  def initialize: (Transport) -> void
9206
9468
  def create: (id: String, body: business_metric_values_input, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> { "written" => Integer }
@@ -9209,10 +9471,14 @@ module Infrawrench
9209
9471
 
9210
9472
  class BusinessMetricsNamespace
9211
9473
  attr_reader get: BusinessMetricsGetNamespace
9474
+ attr_reader importer: BusinessMetricsImporterNamespace
9212
9475
  attr_reader values: BusinessMetricsValuesNamespace
9213
9476
  def initialize: (Transport) -> void
9214
9477
  def create: (body: business_metric_input, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> business_metric
9215
9478
  def delete: (id: String, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> ok
9479
+ def importer_options: (body: { "accountId" => String, "fieldKey" => String, "params" => Hash[String, String] }, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> { "options" => Array[{ "id" => String, "label" => String, ?"description" => String }] }
9480
+ def importer_preview: (body: business_metric_import_preview_request, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> business_metric_import_preview
9481
+ def importer_sources: (?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> { "sources" => Array[business_metric_source_account] }
9216
9482
  def unit_costs: (id: String, body: unit_cost_query_request, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> unit_cost_query_response
9217
9483
  def update: (id: String, body: business_metric_input, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> business_metric
9218
9484
  end
@@ -9466,7 +9732,7 @@ module Infrawrench
9466
9732
  attr_reader anomaly_settings: CostsAnomalySettingsNamespace
9467
9733
  attr_reader efficiency_alert_settings: CostsEfficiencyAlertSettingsNamespace
9468
9734
  def initialize: (Transport) -> void
9469
- def dimensions: (dimension: "provider" | "account" | "service" | "region" | "resource" | "tag" | "charge_type" | "commitment" | "tag-keys" | "usage-units", ?org_id: String?, ?tag_key: String?, ?request_options: Hash[Symbol, untyped]?) -> cost_dimension_values
9735
+ def dimensions: (dimension: "provider" | "account" | "service" | "region" | "resource" | "tag" | "charge_type" | "commitment" | "virtual_tag" | "tag-keys" | "usage-units" | "virtual-tag-keys", ?org_id: String?, ?tag_key: String?, ?include_hidden: "true" | "false"?, ?request_options: Hash[Symbol, untyped]?) -> cost_dimension_values
9470
9736
  def efficiency_alerts: (?org_id: String?, ?kind: "commitment_expiry" | "commitment_idle" | "unit_cost_regression"?, ?limit: Integer?, ?request_options: Hash[Symbol, untyped]?) -> { "events" => Array[efficiency_alert_event] }
9471
9737
  def focus_export: (body: focus_export_request, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> String
9472
9738
  def query: (body: cost_query_request, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> cost_query_response
@@ -10275,6 +10541,18 @@ module Infrawrench
10275
10541
  def upload: (body: storage_upload_form, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> ok
10276
10542
  end
10277
10543
 
10544
+ class TagKeysSettingsNamespace
10545
+ def initialize: (Transport) -> void
10546
+ def get: (?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> tag_key_settings
10547
+ def update: (body: tag_key_settings, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> tag_key_settings
10548
+ end
10549
+
10550
+ class TagKeysNamespace
10551
+ attr_reader settings: TagKeysSettingsNamespace
10552
+ def initialize: (Transport) -> void
10553
+ def get: (?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> discovered_tag_keys
10554
+ end
10555
+
10278
10556
  class TagPolicyNamespace
10279
10557
  def initialize: (Transport) -> void
10280
10558
  def compliance: (?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> tag_compliance_report
@@ -10313,6 +10591,17 @@ module Infrawrench
10313
10591
  def permissions: (?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> permission_catalog
10314
10592
  end
10315
10593
 
10594
+ class VirtualTagsNamespace
10595
+ def initialize: (Transport) -> void
10596
+ def create: (body: virtual_tag_input, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> virtual_tag
10597
+ def delete: (id: String, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> ok
10598
+ def get: (id: String, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> virtual_tag
10599
+ def list: (?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> Array[virtual_tag]
10600
+ def preview: (body: virtual_tag_input, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> (virtual_tag_stats & Hash[String, untyped])
10601
+ def reprocess: (id: String, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> virtual_tag
10602
+ def update: (id: String, body: virtual_tag_input, ?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> virtual_tag
10603
+ end
10604
+
10316
10605
  class WallboardNamespace
10317
10606
  def initialize: (Transport) -> void
10318
10607
  def get: (?org_id: String?, ?request_options: Hash[Symbol, untyped]?) -> wallboard_response
@@ -10456,8 +10745,10 @@ module Infrawrench
10456
10745
  attr_reader status_incidents: StatusIncidentsNamespace
10457
10746
  attr_reader status_pages: StatusPagesNamespace
10458
10747
  attr_reader storage: StorageNamespace
10748
+ attr_reader tag_keys: TagKeysNamespace
10459
10749
  attr_reader tag_policy: TagPolicyNamespace
10460
10750
  attr_reader team: TeamNamespace
10751
+ attr_reader virtual_tags: VirtualTagsNamespace
10461
10752
  attr_reader wallboard: WallboardNamespace
10462
10753
  attr_reader workflow_approvals: WorkflowApprovalsNamespace
10463
10754
  attr_reader workflow_secrets: WorkflowSecretsNamespace
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: infrawrench-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.59.0
4
+ version: 1.62.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Infrawrench LLC
@@ -11,7 +11,7 @@ bindir: bin
11
11
  cert_chain: []
12
12
  date: 2026-10-05 00:00:00.000000000 Z
13
13
  dependencies: []
14
- description: Generated Ruby client for the Infrawrench API (v1.59.0). Covers the published
14
+ description: Generated Ruby client for the Infrawrench API (v1.62.0). Covers the published
15
15
  API surface only — operations marked x-internal in the spec are not generated. No
16
16
  runtime dependencies.
17
17
  email:
@@ -58,5 +58,5 @@ requirements: []
58
58
  rubygems_version: 3.5.22
59
59
  signing_key:
60
60
  specification_version: 4
61
- summary: Generated Ruby client for the Infrawrench API (v1.59.0).
61
+ summary: Generated Ruby client for the Infrawrench API (v1.62.0).
62
62
  test_files: []