diff --git a/Makefile b/Makefile index 6c4c7bb..f251c63 100644 --- a/Makefile +++ b/Makefile @@ -84,7 +84,7 @@ docs: go run ./cmd/gendocs @echo "wrote docs/cli/" -test: +test: generate go test $(PKG) test-integration: diff --git a/docs/cli/flexera-cli_finops-billing_invoice-schedule-invoices_list.md b/docs/cli/flexera-cli_finops-billing_invoice-schedule-invoices_list.md index de684e0..440f995 100644 --- a/docs/cli/flexera-cli_finops-billing_invoice-schedule-invoices_list.md +++ b/docs/cli/flexera-cli_finops-billing_invoice-schedule-invoices_list.md @@ -8,6 +8,8 @@ Index invoices generated by a schedule Lists invoices generated by the specified invoice schedule. +The invoiceNumber query parameter filters on an exact, case-sensitive invoice number. invoiceNumber is also accepted in orderBy, ascending and descending. Invoices sort numerically by their allocated sequence number; invoices without a number come last in both directions, and ties are broken by id. + ``` flexera-cli finops-billing invoice-schedule-invoices list [flags] ``` @@ -22,19 +24,19 @@ Illustrative only: replace uppercase tokens; provide your own request.json for b ### Options ``` - --bill-month string billMonth (query); Optional bill month filter.; pattern: "^\\d{4}-\\d{2}$"; illustrative example: "Mr. Corine Metz" - --cost-metric string costMetric (query); Optional cost metric filter.; illustrative example: "Ut quae doloremque." - --customer-billing-plan string customerBillingPlan (query); Optional billing plan filter.; illustrative example: "Iusto qui sequi esse voluptatem." - --customer-name string customerName (query); Optional customer name filter.; illustrative example: "Et facere assumenda voluptatem voluptatem illum." - --export-type string exportType (query); Optional export type filter.; enum: ["pdf","csv"]; illustrative example: "csv" - --filter string filter (query); OData-style expression evaluated against each returned resource. Attribute names are case-sensitive and operators are case-insensitive. String eq, ne, and in comparisons are case-sensitive; co performs case-insensitive substring matching. Date values use YYYY-MM-DD; date-time values use ISO-8601 and are normalized to UTC; billMonth uses YYYY-MM. Missing fiel... (see cli schema); illustrative example: "deliveryStatus eq 'success' and billMonth eq '2026-09'" + --bill-month string billMonth (query); Optional bill month filter.; pattern: "^\\d{4}-\\d{2}$"; illustrative example: "Mrs. Emory Hagenes" + --cost-metric string costMetric (query); Optional cost metric filter.; illustrative example: "Id repellendus cumque." + --customer-billing-plan string customerBillingPlan (query); Optional billing plan filter.; illustrative example: "Quia exercitationem." + --customer-name string customerName (query); Optional customer name filter.; illustrative example: "Quo aut qui atque." + --export-type string exportType (query); Optional export type filter.; enum: ["pdf","csv"]; illustrative example: "pdf" -h, --help help for list - --limit int limit (query); Page size (default 10, max 200).; minimum: 1; maximum: 200; API default: 10; illustrative example: 165 + --invoice-number string invoiceNumber (query); Optional exact, case-sensitive invoice number filter.; maxLength: 29; pattern: "^[A-Za-z0-9_-]+$"; illustrative example: "INV-000042" + --limit int limit (query); Page size (default 10, max 200).; minimum: 1; maximum: 200; API default: 10; illustrative example: 154 --no-paginate return only the first page (do not follow nextPage) - --order-by string orderBy (query); Optional orderBy query allows to specify an expression for determining what values are used to order the entities. Multiple expressions can be specified using comma separated values.; illustrative example: "updatedAt desc" + --order-by string orderBy (query); Optional orderBy query allows to specify an expression for determining what values are used to order the entities. Multiple expressions can be specified using comma separated values.; illustrative example: "invoiceNumber asc" --schedule-id string scheduleId (path, required); Identifier of the invoice schedule.; required by API; illustrative example: "sch_1" --skip-token string resume pagination from this token; An opaque token to be provided when requesting a subsequent page after receiving a partial response. Partial responses will include a "nextPage" attribute in their response body, which contains the URL of the next page including the appropriate skipToken. - --status string status (query); Optional generation status filter.; illustrative example: "Veniam harum corrupti nemo." + --status string status (query); Optional generation status filter.; illustrative example: "Id ea quisquam facilis sint vitae et." ``` ### Options inherited from parent commands diff --git a/docs/cli/flexera-cli_finops-billing_invoice-schedules_activate.md b/docs/cli/flexera-cli_finops-billing_invoice-schedules_activate.md index a3575f2..f1ad60a 100644 --- a/docs/cli/flexera-cli_finops-billing_invoice-schedules_activate.md +++ b/docs/cli/flexera-cli_finops-billing_invoice-schedules_activate.md @@ -6,7 +6,7 @@ Activate an invoice schedule Activate an invoice schedule -Activates an invoice schedule (reactivating a previously deactivated schedule) and restores its future runs. Supply endMonthYear to bound the reactivated schedule; omit it to make the schedule open-ended. While inactive, schedules cannot be modified via PATCH; activate first. Supports optimistic locking through If-Match. +Activates an invoice schedule (reactivating a previously deactivated schedule) and restores its future runs. Supply endMonthYear to bound the reactivated schedule; omit it to make the schedule open-ended. While inactive, a schedule accepts exactly status, invoiceNumberPrefix and invoiceNumberBase through PATCH; any other change requires activating it first. Supports optimistic locking through If-Match. ``` flexera-cli finops-billing invoice-schedules activate [flags] diff --git a/docs/cli/flexera-cli_finops-billing_invoice-schedules_create.md b/docs/cli/flexera-cli_finops-billing_invoice-schedules_create.md index e370f86..b32efda 100644 --- a/docs/cli/flexera-cli_finops-billing_invoice-schedules_create.md +++ b/docs/cli/flexera-cli_finops-billing_invoice-schedules_create.md @@ -16,6 +16,8 @@ The schedule's invoice template is selected one of three ways: Any other combination is rejected with 422. +Automatic invoice numbering is optional. Supply invoiceNumberBase, with an optional invoiceNumberPrefix, to number every invoice the schedule generates; an invoiceNumberPrefix without an invoiceNumberBase is rejected with 400 invoice_number_prefix_requires_base. A number is allocated only after bill-lock passes: a failed generation keeps its number and a retry reuses it. If the sequence is exhausted the whole call fails with 409 invoice_number_sequence_exhausted (not retryable) and work already completed for earlier customers is retained. The schedule's counter is retained when the schedule is soft-deleted. + ``` flexera-cli finops-billing invoice-schedules create [flags] ``` @@ -33,14 +35,16 @@ Validated illustrative body, when available (review before use): ### Options ``` - --body string raw JSON body (inline | @file | @-); overrides body field flags - --dry-run print the planned operation as JSON and exit without calling the API - -h, --help help for create - -i, --interactive edit inputs in a terminal form, review a plan and approve with typed yes - --invoice-template-id string invoiceTemplateId (body); Identifier of an existing invoice template to share across every customer on this schedule. Omit both this and template to create a schedule with no template.; illustrative example: "tmpl_9001" - --is-create-template isCreateTemplate (body); Whether to create a new invoice template from the template properties in this request, rather than link an existing one.; API default: false; illustrative example: false - --schedule-name string scheduleName (body); required by API; Human-readable name for the schedule.; maxLength: 255; illustrative example: "Monthly Q3 Invoice" - --yes confirm the operation (required for destructive ops) + --body string raw JSON body (inline | @file | @-); overrides body field flags + --dry-run print the planned operation as JSON and exit without calling the API + -h, --help help for create + -i, --interactive edit inputs in a terminal form, review a plan and approve with typed yes + --invoice-number-base string invoiceNumberBase (body); Optional first sequence number for the invoice numbers this schedule generates.; maxLength: 9; pattern: "^0*[1-9][0-9]*$"; illustrative example: "uf4" + --invoice-number-prefix string invoiceNumberPrefix (body); Optional prefix for the invoice numbers this schedule generates. Requires invoiceNumberBase.; maxLength: 20; pattern: "^[A-Za-z0-9_-]*$"; illustrative example: "zel" + --invoice-template-id string invoiceTemplateId (body); Identifier of an existing invoice template to share across every customer on this schedule. Omit both this and template to create a schedule with no template.; illustrative example: "tmpl_9001" + --is-create-template isCreateTemplate (body); Whether to create a new invoice template from the template properties in this request, rather than link an existing one.; API default: false; illustrative example: false + --schedule-name string scheduleName (body); required by API; Human-readable name for the schedule.; maxLength: 255; illustrative example: "Monthly Q3 Invoice" + --yes confirm the operation (required for destructive ops) ``` ### Options inherited from parent commands diff --git a/docs/cli/flexera-cli_finops-billing_invoice-schedules_list.md b/docs/cli/flexera-cli_finops-billing_invoice-schedules_list.md index 5d9c829..6a753d7 100644 --- a/docs/cli/flexera-cli_finops-billing_invoice-schedules_list.md +++ b/docs/cli/flexera-cli_finops-billing_invoice-schedules_list.md @@ -23,12 +23,11 @@ Illustrative only: replace uppercase tokens; provide your own request.json for b ``` --customer-id int customerId (query); Optional filter: only schedules covering this customer.; illustrative example: 53125 - --filter string filter (query); OData-style expression evaluated against each returned resource. Attribute names are case-sensitive and operators are case-insensitive. String eq, ne, and in comparisons are case-sensitive; co performs case-insensitive substring matching. Date values use YYYY-MM-DD; date-time values use ISO-8601 and are normalized to UTC; billMonth uses YYYY-MM. Missing fiel... (see cli schema); illustrative example: "status eq 'active' and customerId eq 53125" -h, --help help for list - --limit int limit (query); Page size (default 50, max 200); minimum: 1; maximum: 200; API default: 50; illustrative example: 7 + --limit int limit (query); Page size (default 50, max 200); minimum: 1; maximum: 200; API default: 50; illustrative example: 118 --no-paginate return only the first page (do not follow nextPage) --order-by string orderBy (query); Optional orderBy query allows to specify an expression for determining what values are used to order the entities. Multiple expressions can be specified using comma separated values.; illustrative example: "updatedAt desc" - --schedule-name string scheduleName (query); Optional exact-match filter on schedule name.; illustrative example: "Ut sint." + --schedule-name string scheduleName (query); Optional exact-match filter on schedule name.; illustrative example: "Saepe facere veritatis." --skip-token string resume pagination from this token; An opaque token to be provided when requesting a subsequent page after receiving a partial response. Partial responses will include a "nextPage" attribute in their response body, which contains the URL of the next page including the appropriate skipToken. --status string status (query); Optional status filter.; enum: ["active","inactive"]; illustrative example: "active" ``` diff --git a/docs/cli/flexera-cli_finops-billing_invoice-schedules_update.md b/docs/cli/flexera-cli_finops-billing_invoice-schedules_update.md index 175ae43..a24a8c6 100644 --- a/docs/cli/flexera-cli_finops-billing_invoice-schedules_update.md +++ b/docs/cli/flexera-cli_finops-billing_invoice-schedules_update.md @@ -8,7 +8,9 @@ Update an invoice schedule Partially updates an invoice schedule using JSON Merge Patch (RFC 7396) semantics: only fields present in the request body are changed and omitted fields remain unchanged. Supports optimistic locking through If-Match. -An inactive schedule cannot be modified through this endpoint. Use the activate endpoint to reactivate it. +Invoice numbering: invoiceNumberPrefix and invoiceNumberBase follow the same merge-patch rule, so omitting a field leaves it unchanged. Sending "" for both clears numbering and disables it. Sending "" for invoiceNumberPrefix alone, with an existing base, removes the prefix only. Re-adding numbering later continues from the last used number + 1. An invoiceNumberPrefix without a base is rejected with 400 invoice_number_prefix_requires_base, and changing the base after the first number was allocated is rejected with 400 invoice_number_base_locked. + +An inactive schedule accepts exactly three fields through this endpoint: status, invoiceNumberPrefix and invoiceNumberBase. Any other field is rejected. Use the activate endpoint to reactivate it. ``` flexera-cli finops-billing invoice-schedules update [flags] @@ -27,15 +29,18 @@ Validated illustrative body, when available (review before use): ### Options ``` - --body string raw JSON body (inline | @file | @-); overrides body field flags - --dry-run print the planned operation as JSON and exit without calling the API - -h, --help help for update - --id string id (path, required); Identifier of the invoice schedule; required by API; illustrative example: "sch_1" - -i, --interactive edit inputs in a terminal form, review a plan and approve with typed yes - --invoice-template-id string invoiceTemplateId (body); Existing invoice template to point the schedule at. Send isCreateTemplate=false with this field omitted to detach the schedule's template.; illustrative example: "tmpl_9002" - --is-create-template isCreateTemplate (body); Whether to create a new invoice template from the template properties in this request, rather than link an existing one.; illustrative example: false - --schedule-name string scheduleName (body); Updated name.; maxLength: 255; illustrative example: "p4y" - --yes confirm the operation (required for destructive ops) + --body string raw JSON body (inline | @file | @-); overrides body field flags + --dry-run print the planned operation as JSON and exit without calling the API + -h, --help help for update + --id string id (path, required); Identifier of the invoice schedule; required by API; illustrative example: "sch_1" + -i, --interactive edit inputs in a terminal form, review a plan and approve with typed yes + --invoice-number-base string invoiceNumberBase (body); Optional updated first sequence number for the invoice numbers this schedule generates.; maxLength: 9; pattern: "^$|^0*[1-9][0-9]*$"; illustrative example: "n3b" + --invoice-number-prefix string invoiceNumberPrefix (body); Optional updated prefix for the invoice numbers this schedule generates. Requires invoiceNumberBase.; maxLength: 20; pattern: "^[A-Za-z0-9_-]*$"; illustrative example: "xkx" + --invoice-template-id string invoiceTemplateId (body); Existing invoice template to point the schedule at. Send isCreateTemplate=false with this field omitted to detach the schedule's template.; illustrative example: "tmpl_9002" + --is-create-template isCreateTemplate (body); Whether to create a new invoice template from the template properties in this request, rather than link an existing one.; illustrative example: false + --schedule-name string scheduleName (body); Updated name.; maxLength: 255; illustrative example: "dq5" + --status string status (body); Updated lifecycle status. PATCH accepts only inactive; use the activate endpoint to reactivate a schedule.; enum: ["inactive"]; illustrative example: "inactive" + --yes confirm the operation (required for destructive ops) ``` ### Options inherited from parent commands diff --git a/docs/cli/flexera-cli_finops-billing_invoice-templates_create.md b/docs/cli/flexera-cli_finops-billing_invoice-templates_create.md index 4187811..2f71c9e 100644 --- a/docs/cli/flexera-cli_finops-billing_invoice-templates_create.md +++ b/docs/cli/flexera-cli_finops-billing_invoice-templates_create.md @@ -30,8 +30,9 @@ Validated illustrative body, when available (review before use): --dimensions strings dimensions (body); Optional grouping dimensions.; maxItems: 10; CLI: comma-separated values or repeated flag; illustrative example: ["service","account","region"] --display-logo-within-pdf displayLogoWithinPdf (body); required by API; Whether the logo is rendered within PDF exports.; illustrative example: true --dry-run print the planned operation as JSON and exit without calling the API + --export-layout string exportLayout (body); PDF layout format. Exact lowercase flatten or nested; omitted PDF exports default to flatten. Must be omitted for CSV exports.; enum: ["flatten","nested"]; illustrative example: "flatten" --export-type string exportType (body); required by API; Invoice export type.; enum: ["pdf","csv"]; illustrative example: "pdf" - --free-text string freeText (body); Optional free-text company/address block.; illustrative example: "Aut accusamus." + --free-text string freeText (body); Optional free-text company/address block.; illustrative example: "Quo inventore voluptatem ut expedita." -h, --help help for create -i, --interactive edit inputs in a terminal form, review a plan and approve with typed yes --logo string logo (body); Optional logo payload. Ignored when exportType=csv.; illustrative example: "\u003cbase64-or-reference-payload\u003e" diff --git a/docs/cli/flexera-cli_finops-billing_invoice-templates_list.md b/docs/cli/flexera-cli_finops-billing_invoice-templates_list.md index 3886544..0c6d9fe 100644 --- a/docs/cli/flexera-cli_finops-billing_invoice-templates_list.md +++ b/docs/cli/flexera-cli_finops-billing_invoice-templates_list.md @@ -24,7 +24,7 @@ Illustrative only: replace uppercase tokens; provide your own request.json for b ``` --filter string filter (query); OData-style filter expression used to filter invoice templates.; illustrative example: "templateName co 'summary'" -h, --help help for list - --limit int limit (query); Page size (default 50, max 200); minimum: 1; maximum: 200; API default: 50; illustrative example: 189 + --limit int limit (query); Page size (default 50, max 200); minimum: 1; maximum: 200; API default: 50; illustrative example: 94 --no-paginate return only the first page (do not follow nextPage) --order-by string orderBy (query); Optional orderBy query allows to specify an expression for determining what values are used to order the entities. Multiple expressions can be specified using comma separated values.; illustrative example: "updatedAt desc" --skip-token string resume pagination from this token; An opaque token to be provided when requesting a subsequent page after receiving a partial response. Partial responses will include a "nextPage" attribute in their response body, which contains the URL of the next page including the appropriate skipToken. diff --git a/docs/cli/flexera-cli_finops-billing_invoice-templates_update.md b/docs/cli/flexera-cli_finops-billing_invoice-templates_update.md index 653b208..68af5ba 100644 --- a/docs/cli/flexera-cli_finops-billing_invoice-templates_update.md +++ b/docs/cli/flexera-cli_finops-billing_invoice-templates_update.md @@ -27,17 +27,18 @@ Validated illustrative body, when available (review before use): ``` --body string raw JSON body (inline | @file | @-); overrides body field flags --cost-metric string costMetric (body); Updated cost metric.; enum: ["billedCost","effectiveCost","modifiedBilledCost","modifiedEffectiveCost"]; illustrative example: "effectiveCost" - --dimensions strings dimensions (body); Updated grouping dimensions.; maxItems: 10; CLI: comma-separated values or repeated flag; illustrative example: ["Temporibus nihil minima non asperiores quisquam.","Qui animi temporibus non excepturi.","Quo praesentium ea vitae molestias dolores et."] - --display-logo-within-pdf displayLogoWithinPdf (body); Updated PDF logo display flag.; illustrative example: true + --dimensions strings dimensions (body); Updated grouping dimensions.; maxItems: 10; CLI: comma-separated values or repeated flag; illustrative example: ["Sit sunt eveniet sunt est facere temporibus.","Sit laboriosam.","Provident at ipsum."] + --display-logo-within-pdf displayLogoWithinPdf (body); Updated PDF logo display flag.; illustrative example: false --dry-run print the planned operation as JSON and exit without calling the API - --export-type string exportType (body); Updated export type.; enum: ["pdf","csv"]; illustrative example: "pdf" - --free-text string freeText (body); Updated free-text company/address block.; illustrative example: "Ut libero animi porro illo." + --export-layout string exportLayout (body); Updated PDF layout format. Exact lowercase flatten or nested; omitted PDF exports default to flatten. Must be omitted for CSV exports.; enum: ["flatten","nested"]; illustrative example: "nested" + --export-type string exportType (body); Updated export type.; enum: ["pdf","csv"]; illustrative example: "csv" + --free-text string freeText (body); Updated free-text company/address block.; illustrative example: "Quia sit." -h, --help help for update --id string id (path, required); Invoice template identifier; required by API; illustrative example: "tmpl_9001" -i, --interactive edit inputs in a terminal form, review a plan and approve with typed yes - --logo string logo (body); Updated logo payload.; illustrative example: "Pariatur illum quibusdam quis." + --logo string logo (body); Updated logo payload.; illustrative example: "Nulla ducimus ut dolores quibusdam voluptas." --period-type string periodType (body); Updated period type.; enum: ["chargePeriod","billPeriod","billingPeriod"]; illustrative example: "billPeriod" - --template-name string templateName (body); Updated template name.; maxLength: 255; illustrative example: "561" + --template-name string templateName (body); Updated template name.; maxLength: 255; illustrative example: "39a" --yes confirm the operation (required for destructive ops) ``` diff --git a/docs/cli/flexera-cli_finops-billing_invoices_create.md b/docs/cli/flexera-cli_finops-billing_invoices_create.md index d0bf094..32e2209 100644 --- a/docs/cli/flexera-cli_finops-billing_invoices_create.md +++ b/docs/cli/flexera-cli_finops-billing_invoices_create.md @@ -15,7 +15,9 @@ The invoice configuration can be supplied in one of four ways: - create saved template: provide isCreateTemplate=true and template with templateName; the new template is used and its ID is returned - one-time template: provide template without templateName and with isCreateTemplate=false (or omitted); it supplies omitted root configuration fields but is not saved -Root configuration fields always override their corresponding template value when present. template cannot be combined with invoiceTemplateId. The four root configuration fields (exportType, periodType, costMetric, displayLogoWithinPdf) are required only when neither invoiceTemplateId nor template is supplied. +Each customer may carry an optional invoiceNumber. It is immutable after creation, and duplicates are allowed. The number of a generated invoice is allocated only after bill-lock passes; a failed generation keeps its number and a retry reuses it. If the invoice number sequence is exhausted the whole call fails with 409 invoice_number_sequence_exhausted (not retryable) and work already completed for earlier customers in the call is retained. + +Root configuration fields always override their corresponding template value when present. template cannot be combined with invoiceTemplateId. The four required root configuration fields (exportType, periodType, costMetric, displayLogoWithinPdf) are required only when neither invoiceTemplateId nor template is supplied. exportLayout is optional: PDF exports default to flatten, while nested selects the nested layout. Values are exact lowercase flatten or nested; omit exportLayout for CSV exports. ``` flexera-cli finops-billing invoices create [flags] @@ -35,22 +37,23 @@ Validated illustrative body, when available (review before use): ``` --body string raw JSON body (inline | @file | @-); overrides body field flags - --cost-metric string costMetric (body); Cost metric to use for export. Required only when neither invoiceTemplateId nor template is supplied.; enum: ["billedCost","effectiveCost","modifiedBilledCost","modifiedEffectiveCost"]; illustrative example: "modifiedEffectiveCost" - --dimensions strings dimensions (body); Dimensions to include in export.; maxItems: 10; CLI: comma-separated values or repeated flag; illustrative example: ["Expedita consequatur labore voluptatum non et.","Accusamus consequatur.","Voluptate beatae illo."] + --cost-metric string costMetric (body); Cost metric to use for export. Required only when neither invoiceTemplateId nor template is supplied.; enum: ["billedCost","effectiveCost","modifiedBilledCost","modifiedEffectiveCost"]; illustrative example: "effectiveCost" + --dimensions strings dimensions (body); Dimensions to include in export.; maxItems: 10; CLI: comma-separated values or repeated flag; illustrative example: ["Eius porro tempore nemo quidem voluptas.","Et distinctio eum.","Eos eveniet eaque fuga iste et ratione."] --display-logo-within-pdf displayLogoWithinPdf (body); Whether to show logo in PDF export. Required only when neither invoiceTemplateId nor template is supplied.; illustrative example: false --dry-run print the planned operation as JSON and exit without calling the API - --due-date string dueDate (body); Invoice due date.; format: date; illustrative example: "1993-12-03" - --end-date string endDate (body); required by API; Invoice range end date.; format: date; illustrative example: "1990-10-28" + --due-date string dueDate (body); Invoice due date.; format: date; illustrative example: "1988-11-28" + --end-date string endDate (body); required by API; Invoice range end date.; format: date; illustrative example: "1988-05-11" + --export-layout string exportLayout (body); PDF layout format. Exact lowercase flatten or nested; omitted PDF exports default to flatten. Must be omitted for CSV exports.; enum: ["flatten","nested"]; illustrative example: "flatten" --export-type string exportType (body); Export type. Required only when neither invoiceTemplateId nor template is supplied.; enum: ["pdf","csv"]; illustrative example: "pdf" - --free-text string freeText (body); Optional free text.; illustrative example: "Nulla numquam architecto eius pariatur." + --free-text string freeText (body); Optional free text.; illustrative example: "Est est illo nisi." -h, --help help for create -i, --interactive edit inputs in a terminal form, review a plan and approve with typed yes - --invoice-template-id string invoiceTemplateId (body); Optional saved invoice template to source default field values from. Cannot be combined with template. Opaque ID; resolved server-side and snapshotted into the invoice.; illustrative example: "Eius voluptatem et rerum minus." + --invoice-template-id string invoiceTemplateId (body); Optional saved invoice template to source default field values from. Cannot be combined with template. Opaque ID; resolved server-side and snapshotted into the invoice.; illustrative example: "Quo dolorum adipisci est cumque dolor." --is-create-template isCreateTemplate (body); Whether to create and use a reusable invoice template from template properties.; API default: false; illustrative example: false - --issue-date string issueDate (body); Invoice issue date.; format: date; illustrative example: "1982-03-16" - --logo string logo (body); Optional logo payload.; illustrative example: "Iure dolorem animi atque quos." - --period-type string periodType (body); Configured period type. Required only when neither invoiceTemplateId nor template is supplied.; enum: ["chargePeriod","billPeriod","billingPeriod"]; illustrative example: "billPeriod" - --start-date string startDate (body); required by API; Invoice range start date.; format: date; illustrative example: "2005-03-29" + --issue-date string issueDate (body); Invoice issue date.; format: date; illustrative example: "1995-07-16" + --logo string logo (body); Optional logo payload.; illustrative example: "Sunt sunt mollitia tenetur." + --period-type string periodType (body); Configured period type. Required only when neither invoiceTemplateId nor template is supplied.; enum: ["chargePeriod","billPeriod","billingPeriod"]; illustrative example: "chargePeriod" + --start-date string startDate (body); required by API; Invoice range start date.; format: date; illustrative example: "1979-06-22" --yes confirm the operation (required for destructive ops) ``` diff --git a/docs/cli/flexera-cli_finops-billing_invoices_get.md b/docs/cli/flexera-cli_finops-billing_invoices_get.md index 64c1da1..0d75e59 100644 --- a/docs/cli/flexera-cli_finops-billing_invoices_get.md +++ b/docs/cli/flexera-cli_finops-billing_invoices_get.md @@ -23,7 +23,7 @@ Illustrative only: replace uppercase tokens; provide your own request.json for b ``` -h, --help help for get - --id string id (path, required); Invoice export identifier; required by API; illustrative example: "Voluptates et." + --id string id (path, required); Invoice export identifier; required by API; illustrative example: "Quia rem asperiores eos perferendis." ``` ### Options inherited from parent commands diff --git a/docs/cli/flexera-cli_finops-billing_invoices_list.md b/docs/cli/flexera-cli_finops-billing_invoices_list.md index 1cf9f1a..eb109c3 100644 --- a/docs/cli/flexera-cli_finops-billing_invoices_list.md +++ b/docs/cli/flexera-cli_finops-billing_invoices_list.md @@ -8,6 +8,8 @@ Index invoices Lists invoice export lifecycle records in the organization. +The invoiceNumber query parameter filters on an exact, case-sensitive invoice number. invoiceNumber is also accepted in orderBy, ascending and descending. Invoices sort by byte order of the invoice number; invoices without a number come last in both directions, and ties are broken by id. + ``` flexera-cli finops-billing invoices list [flags] ``` @@ -22,18 +24,18 @@ Illustrative only: replace uppercase tokens; provide your own request.json for b ### Options ``` - --bill-month string billMonth (query); Optional bill month filter.; pattern: "^\\d{4}-\\d{2}$"; illustrative example: "Cruz Fadel" - --customer-name string customerName (query); Optional customer name filter.; illustrative example: "Officia sed." - --export-type string exportType (query); Optional export type filter.; enum: ["pdf","csv"]; illustrative example: "csv" - --expression-filter string expressionFilter (query); OData-style expression evaluated against each returned resource. Attribute names are case-sensitive and operators are case-insensitive. String eq, ne, and in comparisons are case-sensitive; co performs case-insensitive substring matching. Date values use YYYY-MM-DD; date-time values use ISO-8601 and are normalized to UTC; billMonth uses YYYY-MM. Missing fiel... (see cli schema); illustrative example: "customerName co 'Acme' and exportType eq 'pdf'" - --filter string filter (query); Legacy substring search of the stored invoice generation filter JSON. This parameter does not accept OData expressions.; illustrative example: "Facere dolorum est velit adipisci tenetur." - --group-by-count int groupByCount (query); Optional group-by dimension count filter.; illustrative example: 17118634271918162000 - -h, --help help for list - --limit int limit (query); Page size (default 10, max 200); minimum: 1; maximum: 200; API default: 10; illustrative example: 7 - --no-paginate return only the first page (do not follow nextPage) - --order-by string orderBy (query); Optional orderBy query allows to specify an expression for determining what values are used to order the entities. Multiple expressions can be specified using comma separated values.; illustrative example: "updatedAt desc" - --skip-token string resume pagination from this token; An opaque token to be provided when requesting a subsequent page after receiving a partial response. Partial responses will include a "nextPage" attribute in their response body, which contains the URL of the next page including the appropriate skipToken. - --status string status (query); Optional status filter.; illustrative example: "Est ullam." + --bill-month string billMonth (query); Optional bill month filter.; pattern: "^\\d{4}-\\d{2}$"; illustrative example: "Georgiana Boyle" + --customer-name string customerName (query); Optional customer name filter.; illustrative example: "Ratione atque." + --export-type string exportType (query); Optional export type filter.; enum: ["pdf","csv"]; illustrative example: "pdf" + --filter string filter (query); Optional filter text.; illustrative example: "Tenetur maxime recusandae." + --group-by-count int groupByCount (query); Optional group-by dimension count filter.; illustrative example: 532853165886189060 + -h, --help help for list + --invoice-number string invoiceNumber (query); Optional exact, case-sensitive invoice number filter.; maxLength: 29; pattern: "^[A-Za-z0-9_-]+$"; illustrative example: "INV-000042" + --limit int limit (query); Page size (default 10, max 200); minimum: 1; maximum: 200; API default: 10; illustrative example: 26 + --no-paginate return only the first page (do not follow nextPage) + --order-by string orderBy (query); Optional orderBy query allows to specify an expression for determining what values are used to order the entities. Multiple expressions can be specified using comma separated values.; illustrative example: "invoiceNumber asc" + --skip-token string resume pagination from this token; An opaque token to be provided when requesting a subsequent page after receiving a partial response. Partial responses will include a "nextPage" attribute in their response body, which contains the URL of the next page including the appropriate skipToken. + --status string status (query); Optional status filter.; illustrative example: "Veniam ad illo a ipsa eveniet." ``` ### Options inherited from parent commands diff --git a/docs/cli/flexera-cli_finops-billing_invoices_retry.md b/docs/cli/flexera-cli_finops-billing_invoices_retry.md index f97338e..3808261 100644 --- a/docs/cli/flexera-cli_finops-billing_invoices_retry.md +++ b/docs/cli/flexera-cli_finops-billing_invoices_retry.md @@ -25,7 +25,7 @@ Illustrative only: replace uppercase tokens; provide your own request.json for b ``` --dry-run print the planned operation as JSON and exit without calling the API -h, --help help for retry - --id string id (path, required); Invoice export identifier; required by API; illustrative example: "Fuga iste et ratione aut." + --id string id (path, required); Invoice export identifier; required by API; illustrative example: "Veritatis atque pariatur accusantium corrupti aut." --yes confirm the operation (required for destructive ops) ``` diff --git a/docs/cli/flexera-cli_iam_user_list.md b/docs/cli/flexera-cli_iam_user_list.md index 6b823ef..f630361 100644 --- a/docs/cli/flexera-cli_iam_user_list.md +++ b/docs/cli/flexera-cli_iam_user_list.md @@ -25,7 +25,10 @@ Illustrative only: replace uppercase tokens; provide your own request.json for b --access-source string accessSource (query); Filter users by access source type; enum: ["org_member","external_access_policy"]; illustrative example: "org_member" --filter string filter (query); A filter to narrow the number of users to return. Supported fields in the filter are [email, firstName, lastName, lastUILogin, lastAPILogin, hasActiveRefreshToken] The following filters are supported: | Filter | Description | Allowed Operator | Behavior | Example | | --- | ---| --- | --- | --- | | email | Filters on the user's email | co | Contains - The ent... (see cli schema); illustrative example: "email co 'flexera.com' and lastUILogin ge '2021-05-16T16:31:52.1000Z'" -h, --help help for list + --limit int limit (query); The maximum number of users to return per page. If a partial page is returned, the response includes a nextPage link carrying the skipToken.; illustrative example: 100 + --no-paginate return only the first page (do not follow nextPage) --order-by string orderBy (query); The order by which to sort the users. Supported fields in the orderBy are [firstName, lastName, email, lastUILogin, lastAPILogin]; API default: "firstName asc"; illustrative example: "firstName, lastUILogin desc" + --skip-token string resume pagination from this token; An opaque token to be provided when requesting a subsequent page after receiving a partial response. Partial responses will include a "nextPage" attribute in their response body, which contains the URL of the next page including the appropriate skipToken. ``` ### Options inherited from parent commands diff --git a/docs/cli/flexera-cli_it-visibility_device.md b/docs/cli/flexera-cli_it-visibility_device.md index 084c435..07e6076 100644 --- a/docs/cli/flexera-cli_it-visibility_device.md +++ b/docs/cli/flexera-cli_it-visibility_device.md @@ -32,6 +32,6 @@ Device operations (generated from the unified OpenAPI spec) ### SEE ALSO * [flexera-cli it-visibility](flexera-cli_it-visibility.md) - IT Visibility Insights API -* [flexera-cli it-visibility device get](flexera-cli_it-visibility_device_get.md) - Estimate device evidence that would be deleted using the query -* [flexera-cli it-visibility device submit](flexera-cli_it-visibility_device_submit.md) - delete the device evidence for the given device ids using the query +* [flexera-cli it-visibility device get](flexera-cli_it-visibility_device_get.md) - Estimate device evidence deletion +* [flexera-cli it-visibility device submit](flexera-cli_it-visibility_device_submit.md) - Delete device evidence diff --git a/docs/cli/flexera-cli_it-visibility_device_get.md b/docs/cli/flexera-cli_it-visibility_device_get.md index 653be19..895dbf9 100644 --- a/docs/cli/flexera-cli_it-visibility_device_get.md +++ b/docs/cli/flexera-cli_it-visibility_device_get.md @@ -1,12 +1,22 @@ ## flexera-cli it-visibility device get -Estimate device evidence that would be deleted using the query +Estimate device evidence deletion ### Synopsis -Estimate device evidence that would be deleted using the query +Estimate device evidence deletion -Returns an estimated number of device evidences associated with the datasource data that would be deleted using the query. +Estimates the device evidence that would be deleted for the specified device IDs, grouped by datasource. + +A datasource is included if it matches any datasource selector. If no datasource selectors are provided, evidence from every datasource associated with the specified devices is included. + +The estimate reflects the inventory available when the request is made. Because inventory may change, it does not guarantee that a later request will delete the same evidence. + +### Client guidance +* Submit no more than 500 unique device IDs per request. This recommendation is not enforced, but larger requests provide no processing benefit and may increase latency or timeout risk. +* Split larger workloads into batches and process them sequentially. Use the same datasource selectors for every batch in one logical operation. +* There is currently no specific concurrency limit or hard cap in place. We recommend that customers test and tune their request volume based on their network conditions, performance requirements, and business needs. +* The API does not automatically retry failed estimate requests. Clients may retry transient failures using exponential backoff with jitter. ``` flexera-cli it-visibility device get [flags] @@ -25,7 +35,7 @@ Validated illustrative body, when available (review before use): ``` --body string raw JSON body (inline | @file | @-); overrides body field flags - --device-ids strings deviceIds (body); required by API; List of device IDs to delete; CLI: comma-separated values or repeated flag; illustrative example: ["Quasi cum itaque fugiat.","Voluptatibus aliquam iste ipsa.","Aliquid nam.","Enim laboriosam tempore."] + --device-ids strings deviceIds (body); required by API; Device IDs whose evidence should be included. Send no more than 500 unique IDs per request; this recommendation is not enforced by the API.; CLI: comma-separated values or repeated flag; illustrative example: ["4e0e3471-ccbc-41c7-a21e-c384f2eb5669"] -h, --help help for get ``` diff --git a/docs/cli/flexera-cli_it-visibility_device_submit.md b/docs/cli/flexera-cli_it-visibility_device_submit.md index 779dc34..068b124 100644 --- a/docs/cli/flexera-cli_it-visibility_device_submit.md +++ b/docs/cli/flexera-cli_it-visibility_device_submit.md @@ -1,12 +1,24 @@ ## flexera-cli it-visibility device submit -delete the device evidence for the given device ids using the query +Delete device evidence ### Synopsis -delete the device evidence for the given device ids using the query +Delete device evidence -Deletes device evidence for the specified device IDs and datasource selectors. +Submits a request to delete device evidence for the specified device IDs. + +A datasource is included if it matches any datasource selector. If no datasource selectors are provided, evidence from every datasource associated with the specified devices is included. + +Submitting a deletion request does not guarantee that all selected evidence will be deleted because inventory may change while the request is processed. If a device remains active in the environment, its evidence may reappear after new inventory data is collected. + +Repeating a deletion request is allowed and does not return an error when the selected evidence has already been deleted. + +### Client guidance +* Submit no more than 500 unique device IDs per request. This recommendation is not enforced, but larger requests provide no processing benefit and may increase latency or timeout risk. +* Split larger workloads into batches and process one batch at a time per organization. Use the same datasource selectors for every batch in one logical operation. +* There is currently no specific concurrency limit or hard cap in place. We recommend that customers test and tune their request volume based on their network conditions, performance requirements, and business needs. +* The API does not automatically retry failed deletion requests. Clients must not automatically retry timed-out requests because inventory may change and the original deletion may already have been submitted. ``` flexera-cli it-visibility device submit [flags] @@ -26,7 +38,7 @@ Validated illustrative body, when available (review before use): ``` --body string raw JSON body (inline | @file | @-); overrides body field flags - --device-ids strings deviceIds (body); required by API; List of device IDs to delete; CLI: comma-separated values or repeated flag; illustrative example: ["Quasi cum itaque fugiat.","Voluptatibus aliquam iste ipsa.","Aliquid nam.","Enim laboriosam tempore."] + --device-ids strings deviceIds (body); required by API; Device IDs whose evidence should be included. Send no more than 500 unique IDs per request; this recommendation is not enforced by the API.; CLI: comma-separated values or repeated flag; illustrative example: ["4e0e3471-ccbc-41c7-a21e-c384f2eb5669"] --dry-run print the planned operation as JSON and exit without calling the API -h, --help help for submit -i, --interactive edit inputs in a terminal form, review a plan and approve with typed yes diff --git a/docs/cli/flexera-cli_recommendations.md b/docs/cli/flexera-cli_recommendations.md index 20df325..3e02a76 100644 --- a/docs/cli/flexera-cli_recommendations.md +++ b/docs/cli/flexera-cli_recommendations.md @@ -38,8 +38,12 @@ Service id: optima_recommendations ### SEE ALSO * [flexera-cli](flexera-cli.md) - Flexera One unified API command-line client +* [flexera-cli recommendations export](flexera-cli_recommendations_export.md) - Export recommendations as CSV +* [flexera-cli recommendations groups](flexera-cli_recommendations_groups.md) - Group recommendations into a tree * [flexera-cli recommendations list](flexera-cli_recommendations_list.md) - List all recommendations * [flexera-cli recommendations list-rate-reduction](flexera-cli_recommendations_list-rate-reduction.md) - List rate-reduction recommendations (auto-resolves billing centers) * [flexera-cli recommendations list-usage-reduction](flexera-cli_recommendations_list-usage-reduction.md) - List usage-reduction recommendations (auto-resolves billing centers) +* [flexera-cli recommendations paged](flexera-cli_recommendations_paged.md) - List recommendations (filtered, sorted, cursor-paginated) * [flexera-cli recommendations replace](flexera-cli_recommendations_replace.md) - updateStatus Recommendations +* [flexera-cli recommendations savings-summary](flexera-cli_recommendations_savings-summary.md) - Summary data for the Optimization overview page widgets diff --git a/docs/cli/flexera-cli_recommendations_export.md b/docs/cli/flexera-cli_recommendations_export.md new file mode 100644 index 0000000..e41dff1 --- /dev/null +++ b/docs/cli/flexera-cli_recommendations_export.md @@ -0,0 +1,58 @@ +## flexera-cli recommendations export + +Export recommendations as CSV + +### Synopsis + +Export recommendations as CSV + +Exports recommendations as a CSV file: every recommendation the paged list returns for the same `filter` and `orderBy`, with the same billing center rules, one row each, with the given columns. + +**Required security scopes for GlobalSession**: + * `common:org:affiliated+common:org:own` + +``` +flexera-cli recommendations export [flags] +``` + +### Examples + +``` +Illustrative only: replace uppercase tokens; provide your own request.json for body input. + flexera-cli recommendations export --org-id ORG_ID --columns COLUMNS +``` + +### Options + +``` + --columns strings columns (query); The columns of the file, in order, each as :
: the field to write and the text of its header. Everything after the first ':' is the header. ### Supported Fields | Field | Value | | ------------------------- | --------------------------------------------------------------------------------------------- | | id, recommendation, type, policySet, so... (see cli schema); required by API; minItems: 1; CLI: comma-separated values or repeated flag + --filter string filter (query); Optional filter for returning recommendations matching specific criteria. ### Supported Filter Keys | Filter | Type | Example | Description | | --------------------- | ------ | ------------------------------------------------- | ------------------------------------------------------------------------------------ | | billingCenterID | string | billingCenterID... (see cli schema) + -h, --help help for export + --order-by string orderBy (query); Optional order by for returning recommendations in a specific order. ### Supported Order by Keys | Key | Description | | -------------------- | ------------------------------------------------------------------------------- | | recommendation | Returns recommendations ordered by 'recommendation' property | | type | Returns recommendations ordered by 'type' p... (see cli schema) +``` + +### Options inherited from parent commands + +``` + --access-token string static bearer access token + --api-base-url string override API base URL + --client-id string OAuth client ID + --client-secret string OAuth client secret + --config string config file (default $HOME/.flexera/config.yaml) + -d, --debug log HTTP requests/responses to stderr (Authorization redacted) + --json-style string JSON whitespace style (auto|pretty|compact) (default "auto") + --login-base-url string override login base URL + --no-validate skip API schema constraints (never JSON syntax or request data-loss checks) + --org-id int organization ID + --out-fields string project JSON output fields (comma-separated paths) + --out-jq string shape JSON output with a jq expression + -o, --output string output format (json|table) + -r, --raw-output write jq string results without JSON quotes (requires --out-jq) + --refresh-token string OAuth refresh token + --zone string API zone (nam|eu|apac|test) +``` + +### SEE ALSO + +* [flexera-cli recommendations](flexera-cli_recommendations.md) - Optima Recommendations API + diff --git a/docs/cli/flexera-cli_recommendations_groups.md b/docs/cli/flexera-cli_recommendations_groups.md new file mode 100644 index 0000000..1ef0903 --- /dev/null +++ b/docs/cli/flexera-cli_recommendations_groups.md @@ -0,0 +1,59 @@ +## flexera-cli recommendations groups + +Group recommendations into a tree + +### Synopsis + +Group recommendations into a tree + +Groups recommendations into a tree, one level per `groupBy` field, with the number of recommendations and the total savings of every group. +The recommendations are selected by `filter`, in the same way as for the paged list, and the same billing center rules apply: User must have the 'optima:recommendation:index' privilege on every billing center the filter's billingCenterID clause(s) select with eq/in. If it selects none, the request covers every billing center the user can access: the whole org for a user with org-level access, otherwise the billing centers they have been granted (403 if none). Results are always confined to the billing centers the call was authorized for, whatever else the filter says. +When `groupBy` includes billingCenterID, each recommendation is grouped under the authorized billing center it belongs to. + +**Required security scopes for GlobalSession**: + * `common:org:affiliated+common:org:own` + +``` +flexera-cli recommendations groups [flags] +``` + +### Examples + +``` +Illustrative only: replace uppercase tokens; provide your own request.json for body input. + flexera-cli recommendations groups --org-id ORG_ID --group-by GROUP_BY +``` + +### Options + +``` + --filter string filter (query); Optional filter for returning recommendations matching specific criteria. ### Supported Filter Keys | Filter | Type | Example | Description | | --------------------- | ------ | ------------------------------------------------- | ------------------------------------------------------------------------------------ | | billingCenterID | string | billingCenterID... (see cli schema) + --group-by string groupBy (query); Comma separated fields to group the recommendations by. Each field adds one level to the tree, in the given order. ### Supported Group by Fields | Field | Description | | --------------- | --------------------------------------------------------------------------------------- | | billingCenterID | Groups by the authorized billing center the recommendation be... (see cli schema); required by API + -h, --help help for groups +``` + +### Options inherited from parent commands + +``` + --access-token string static bearer access token + --api-base-url string override API base URL + --client-id string OAuth client ID + --client-secret string OAuth client secret + --config string config file (default $HOME/.flexera/config.yaml) + -d, --debug log HTTP requests/responses to stderr (Authorization redacted) + --json-style string JSON whitespace style (auto|pretty|compact) (default "auto") + --login-base-url string override login base URL + --no-validate skip API schema constraints (never JSON syntax or request data-loss checks) + --org-id int organization ID + --out-fields string project JSON output fields (comma-separated paths) + --out-jq string shape JSON output with a jq expression + -o, --output string output format (json|table) + -r, --raw-output write jq string results without JSON quotes (requires --out-jq) + --refresh-token string OAuth refresh token + --zone string API zone (nam|eu|apac|test) +``` + +### SEE ALSO + +* [flexera-cli recommendations](flexera-cli_recommendations.md) - Optima Recommendations API + diff --git a/docs/cli/flexera-cli_recommendations_list.md b/docs/cli/flexera-cli_recommendations_list.md index faf21b2..0ec2d7a 100644 --- a/docs/cli/flexera-cli_recommendations_list.md +++ b/docs/cli/flexera-cli_recommendations_list.md @@ -28,7 +28,7 @@ Illustrative only: replace uppercase tokens; provide your own request.json for b ``` --billing-center-i-ds strings billingCenterIDs (query); IDs of BillingCenters to get recommendations for. It is not allowed for any of the BillingCenterIDs to be an ancestor of another specified BillingCenterID.; CLI: comma-separated values or repeated flag -h, --help help for list - --statuses strings statuses (query); Recommendation statuses to get; API default: ["active"]; CLI: comma-separated values or repeated flag; items.enum: ["active","snoozed","rejected","realized"] + --statuses strings statuses (query); Recommendation statuses to get. Some values, such as realized, are API-level projected states rather than persisted DB values.; API default: ["active"]; CLI: comma-separated values or repeated flag; items.enum: ["active","snoozed","rejected","realized"] --view details view (query); An optional parameter that controls the level of detail returned about policy violation data. Depending on it the data is returned in the details or `detailsExtended` field; enum: ["default","extended"]; API default: "default" ``` diff --git a/docs/cli/flexera-cli_recommendations_paged.md b/docs/cli/flexera-cli_recommendations_paged.md new file mode 100644 index 0000000..0296544 --- /dev/null +++ b/docs/cli/flexera-cli_recommendations_paged.md @@ -0,0 +1,63 @@ +## flexera-cli recommendations paged + +List recommendations (filtered, sorted, cursor-paginated) + +### Synopsis + +List recommendations (filtered, sorted, cursor-paginated) + +List recommendations, filtered and sorted via a generic filter/orderBy expression, cursor-paginated. +billingCenterID and status scoping are done via `filter` (e.g. `billingCenterID in ['bc1'] and status in ['active']`), not separate discrete parameters, matching explorer_service's own contract for this endpoint. +User must have the 'optima:recommendation:index' privilege on every billing center the filter's billingCenterID clause(s) select with eq/in. If it selects none (no billingCenterID clause, or only exclusions such as ne/not), the request covers every billing center the user can access: the whole org for a user with org-level access, otherwise the billing centers they have been granted (403 if none). Results are always confined to the billing centers the call was authorized for, whatever else the filter says. + +**Required security scopes for GlobalSession**: + * `common:org:affiliated+common:org:own` + +``` +flexera-cli recommendations paged [flags] +``` + +### Examples + +``` +Illustrative only: replace uppercase tokens; provide your own request.json for body input. + flexera-cli recommendations paged --org-id ORG_ID +``` + +### Options + +``` + --filter string filter (query); Optional filter for returning recommendations matching specific criteria. ### Supported Filter Keys | Filter | Type | Example | Description | | --------------------- | ------ | ------------------------------------------------- | ------------------------------------------------------------------------------------ | | billingCenterID | string | billingCenterID... (see cli schema) + -h, --help help for paged + --limit int limit (query); Custom pagination limit to be used. + --no-paginate return only the first page (do not follow nextPage) + --order-by string orderBy (query); Optional order by for returning recommendations in a specific order. ### Supported Order by Keys | Key | Description | | -------------------- | ------------------------------------------------------------------------------- | | recommendation | Returns recommendations ordered by 'recommendation' property | | type | Returns recommendations ordered by 'type' p... (see cli schema) + --skip-token string resume pagination from this token; An opaque token to be provided when requesting a subsequent page after receiving a partial response. Partial responses will include a "nextPage" attribute in their response body, which contains the URL of the next page including the appropriate skipToken. + --view details view (query); An optional parameter that controls the level of detail returned about policy violation data. Depending on it the data is returned in the details or `detailsExtended` field; enum: ["default","extended"]; API default: "default" +``` + +### Options inherited from parent commands + +``` + --access-token string static bearer access token + --api-base-url string override API base URL + --client-id string OAuth client ID + --client-secret string OAuth client secret + --config string config file (default $HOME/.flexera/config.yaml) + -d, --debug log HTTP requests/responses to stderr (Authorization redacted) + --json-style string JSON whitespace style (auto|pretty|compact) (default "auto") + --login-base-url string override login base URL + --no-validate skip API schema constraints (never JSON syntax or request data-loss checks) + --org-id int organization ID + --out-fields string project JSON output fields (comma-separated paths) + --out-jq string shape JSON output with a jq expression + -o, --output string output format (json|table) + -r, --raw-output write jq string results without JSON quotes (requires --out-jq) + --refresh-token string OAuth refresh token + --zone string API zone (nam|eu|apac|test) +``` + +### SEE ALSO + +* [flexera-cli recommendations](flexera-cli_recommendations.md) - Optima Recommendations API + diff --git a/docs/cli/flexera-cli_recommendations_replace.md b/docs/cli/flexera-cli_recommendations_replace.md index 8134917..3184145 100644 --- a/docs/cli/flexera-cli_recommendations_replace.md +++ b/docs/cli/flexera-cli_recommendations_replace.md @@ -30,11 +30,12 @@ Validated illustrative body, when available (review before use): ``` --body string raw JSON body (inline | @file | @-); overrides body field flags --dry-run print the planned operation as JSON and exit without calling the API + --generation-id string generationId (body); Generation ID of the hub-backed recommendation. When present, the status update is applied to the hub DB.; illustrative example: "abc123" -h, --help help for replace --id string id (body); required by API; Recommendation unique ID; illustrative example: "676f0f2c838a081da3f7cd61_vol-06fa6937d41c139eb" -i, --interactive edit inputs in a terminal form, review a plan and approve with typed yes --snoozed-target-date string snoozedTargetDate (body); Target date to move recommendation from snoozed to active again; illustrative example: "2025-01-30" - --status string status (body); required by API; New status of recommendation; enum: ["active","snoozed","rejected","realized"]; illustrative example: "realized" + --status string status (body); required by API; New status of recommendation; enum: ["active","snoozed","rejected"]; illustrative example: "snoozed" --status-reason string statusReason (body); Reason of new status of recommendation; illustrative example: "Recommendation isn't relevant right now" --yes confirm the operation (required for destructive ops) ``` diff --git a/docs/cli/flexera-cli_recommendations_savings-summary.md b/docs/cli/flexera-cli_recommendations_savings-summary.md new file mode 100644 index 0000000..8475bf1 --- /dev/null +++ b/docs/cli/flexera-cli_recommendations_savings-summary.md @@ -0,0 +1,57 @@ +## flexera-cli recommendations savings-summary + +Summary data for the Optimization overview page widgets + +### Synopsis + +Summary data for the Optimization overview page widgets + +Summary data for the Optimization overview page widgets (Total Potential Savings, Rate Reduction Savings, Usage Reduction Savings). +User must have the 'optima:recommendation:index' privilege on the org or on the specified billing center(s) to make this call. + +**Required security scopes for GlobalSession**: + * `common:org:affiliated+common:org:own` + +``` +flexera-cli recommendations savings-summary [flags] +``` + +### Examples + +``` +Illustrative only: replace uppercase tokens; provide your own request.json for body input. + flexera-cli recommendations savings-summary --org-id ORG_ID +``` + +### Options + +``` + --billing-center-i-ds strings billingCenterIDs (query); IDs of BillingCenters to get the savings summary for. It is not allowed for any of the BillingCenterIDs to be an ancestor of another specified BillingCenterID.; CLI: comma-separated values or repeated flag + -h, --help help for savings-summary +``` + +### Options inherited from parent commands + +``` + --access-token string static bearer access token + --api-base-url string override API base URL + --client-id string OAuth client ID + --client-secret string OAuth client secret + --config string config file (default $HOME/.flexera/config.yaml) + -d, --debug log HTTP requests/responses to stderr (Authorization redacted) + --json-style string JSON whitespace style (auto|pretty|compact) (default "auto") + --login-base-url string override login base URL + --no-validate skip API schema constraints (never JSON syntax or request data-loss checks) + --org-id int organization ID + --out-fields string project JSON output fields (comma-separated paths) + --out-jq string shape JSON output with a jq expression + -o, --output string output format (json|table) + -r, --raw-output write jq string results without JSON quotes (requires --out-jq) + --refresh-token string OAuth refresh token + --zone string API zone (nam|eu|apac|test) +``` + +### SEE ALSO + +* [flexera-cli recommendations](flexera-cli_recommendations.md) - Optima Recommendations API + diff --git a/go.mod b/go.mod index 2bfdcc6..2015ee4 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ go 1.26.0 require ( github.com/charmbracelet/huh v1.0.0 - github.com/flexera-public/unified-go-client v0.0.0-20261013214425-5c0fc4b6d887 + github.com/flexera-public/unified-go-client v0.0.0-20261019170818-8c09ba3ec5ca github.com/getkin/kin-openapi v0.150.0 github.com/google/uuid v1.6.0 github.com/itchyny/gojq v0.12.19 diff --git a/go.sum b/go.sum index b1f89b5..8f7e23c 100644 --- a/go.sum +++ b/go.sum @@ -58,16 +58,12 @@ github.com/dustin/go-humanize v1.1.0 h1:dbKTrvD0klcbBV/h4AWJdMuZogJACoMlvWIWZ5b2 github.com/dustin/go-humanize v1.1.0/go.mod h1:hc1CvRkJMsgxqjmjMQF3QNRAZBwY8AXBAzKYoSX9sFI= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= -github.com/flexera-public/unified-go-client v0.0.0-20261013201346-82cd8adfb36e h1:fotOPO4w+i7nsSay3NHFRnLMt83ebw6UHaB5enRQUBo= -github.com/flexera-public/unified-go-client v0.0.0-20261013201346-82cd8adfb36e/go.mod h1:oZos/sF14rmH/hPyicmTSgq0jSN/FwBIyJ/uq4etij8= -github.com/flexera-public/unified-go-client v0.0.0-20261013214425-5c0fc4b6d887 h1:FyGh7CgmnwZo9Xz0K2TC/z+LwtCcEUUuh2B0de4guUk= -github.com/flexera-public/unified-go-client v0.0.0-20261013214425-5c0fc4b6d887/go.mod h1:oZos/sF14rmH/hPyicmTSgq0jSN/FwBIyJ/uq4etij8= +github.com/flexera-public/unified-go-client v0.0.0-20261019170818-8c09ba3ec5ca h1:X7GCx2t1stfxUTQR4VCL92p4rspk0Vy6LRvZ80eZ+Gk= +github.com/flexera-public/unified-go-client v0.0.0-20261019170818-8c09ba3ec5ca/go.mod h1:oZos/sF14rmH/hPyicmTSgq0jSN/FwBIyJ/uq4etij8= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.10.1 h1:b0/UzAf9yR5rhf3RPm9gf3ehBPpf0oZKIjtpKrx59Ho= github.com/fsnotify/fsnotify v1.10.1/go.mod h1:TLheqan6HD6GBK6PrDWyDPBaEV8LspOxvPSjC+bVfgo= -github.com/getkin/kin-openapi v0.149.0 h1:ZbhmVJ4yq5RZDUsyP8lcBcGMsjsaTqXEFt6isdtMDfA= -github.com/getkin/kin-openapi v0.149.0/go.mod h1:1+BHDzstro+P5CKtPy1X4PfofnFgmRe6uvMy9+r9fKY= github.com/getkin/kin-openapi v0.150.0 h1:7+O1HMsrAB4BevQDElbLAeCAWwyJC/RjQJYw4oosUUU= github.com/getkin/kin-openapi v0.150.0/go.mod h1:1+BHDzstro+P5CKtPy1X4PfofnFgmRe6uvMy9+r9fKY= github.com/go-openapi/jsonpointer v1.0.2 h1:NbW7xT2b+l7x+JefiPGDsZWsrLk1ogrz4AHK1TTzMt8= diff --git a/internal/catalog/catalog_gen.json b/internal/catalog/catalog_gen.json index 846f4ce..6237ee5 100644 --- a/internal/catalog/catalog_gen.json +++ b/internal/catalog/catalog_gen.json @@ -12952,7 +12952,7 @@ "ruleName", "ruleId" ], - "example": "subAccountId", + "example": "billingCenterLevel4", "type": "string" }, "minItems": 1, @@ -16095,7 +16095,7 @@ "resource": "invoice-schedule-invoices", "action": "list", "summary": "Index invoices generated by a schedule", - "description": "Lists invoices generated by the specified invoice schedule.", + "description": "Lists invoices generated by the specified invoice schedule.\n\nThe invoiceNumber query parameter filters on an exact, case-sensitive invoice number. invoiceNumber is also accepted in orderBy, ascending and descending. Invoices sort numerically by their allocated sequence number; invoices without a number come last in both directions, and ties are broken by id.", "destructive": false, "paginated": true, "responseEnvelope": "values", @@ -16143,14 +16143,14 @@ "schema": { "default": 10, "description": "Page size (default 10, max 200).", - "example": 32, + "example": 77, "maximum": 200, "minimum": 1, "type": "integer" }, "description": "Page size (default 10, max 200).", "name": "limit", - "example": 165 + "example": 154 }, { "flag": "status", @@ -16161,12 +16161,12 @@ "enum": null, "schema": { "description": "Optional generation status filter.", - "example": "Voluptate accusantium quaerat voluptas voluptatem neque necessitatibus.", + "example": "Id beatae nemo deserunt cum.", "type": "string" }, "description": "Optional generation status filter.", "name": "status", - "example": "Veniam harum corrupti nemo." + "example": "Id ea quisquam facilis sint vitae et." }, { "flag": "order-by", @@ -16177,12 +16177,36 @@ "enum": null, "schema": { "description": "Optional orderBy query allows to specify an expression for determining what values are used to order the entities.\nMultiple expressions can be specified using comma separated values.", - "example": "updatedAt desc", + "example": "invoiceNumber asc", "type": "string" }, "description": "Optional orderBy query allows to specify an expression for determining what values are used to order the entities.\nMultiple expressions can be specified using comma separated values.", "name": "orderBy", - "example": "updatedAt desc" + "example": "invoiceNumber asc", + "examples": { + "default": { + "summary": "default", + "value": "invoiceNumber asc" + } + } + }, + { + "flag": "invoice-number", + "source": "flag", + "in": "query", + "type": "string", + "required": false, + "enum": null, + "schema": { + "description": "Optional exact, case-sensitive invoice number filter.", + "example": "INV-000042", + "maxLength": 29, + "pattern": "^[A-Za-z0-9_-]+$", + "type": "string" + }, + "description": "Optional exact, case-sensitive invoice number filter.", + "name": "invoiceNumber", + "example": "INV-000042" }, { "flag": "bill-month", @@ -16193,13 +16217,13 @@ "enum": null, "schema": { "description": "Optional bill month filter.", - "example": "Miss Victor Bayer", + "example": "Lizeth Heller", "pattern": "^\\d{4}-\\d{2}$", "type": "string" }, "description": "Optional bill month filter.", "name": "billMonth", - "example": "Mr. Corine Metz" + "example": "Mrs. Emory Hagenes" }, { "flag": "export-type", @@ -16217,12 +16241,12 @@ "pdf", "csv" ], - "example": "csv", + "example": "pdf", "type": "string" }, "description": "Optional export type filter.", "name": "exportType", - "example": "csv" + "example": "pdf" }, { "flag": "customer-name", @@ -16233,12 +16257,12 @@ "enum": null, "schema": { "description": "Optional customer name filter.", - "example": "Debitis et vitae quo perferendis ullam et.", + "example": "Iure voluptatem odit eos eveniet quod.", "type": "string" }, "description": "Optional customer name filter.", "name": "customerName", - "example": "Et facere assumenda voluptatem voluptatem illum." + "example": "Quo aut qui atque." }, { "flag": "cost-metric", @@ -16249,12 +16273,12 @@ "enum": null, "schema": { "description": "Optional cost metric filter.", - "example": "Maiores officiis aliquam qui voluptatem tempora distinctio.", + "example": "Neque placeat.", "type": "string" }, "description": "Optional cost metric filter.", "name": "costMetric", - "example": "Ut quae doloremque." + "example": "Id repellendus cumque." }, { "flag": "customer-billing-plan", @@ -16265,28 +16289,12 @@ "enum": null, "schema": { "description": "Optional billing plan filter.", - "example": "Neque aliquam maxime.", + "example": "Non consequuntur magnam ut.", "type": "string" }, "description": "Optional billing plan filter.", "name": "customerBillingPlan", - "example": "Iusto qui sequi esse voluptatem." - }, - { - "flag": "filter", - "source": "flag", - "in": "query", - "type": "string", - "required": false, - "enum": null, - "schema": { - "description": "OData-style expression evaluated against each returned resource. Attribute names are case-sensitive and operators are case-insensitive. String eq, ne, and in comparisons are case-sensitive; co performs case-insensitive substring matching. Date values use YYYY-MM-DD; date-time values use ISO-8601 and are normalized to UTC; billMonth uses YYYY-MM. Missing fields are treated as null; only eq null and ne null support null operands. Literal values must be on the right side of an operator.\n\nSupported comparison operators are eq, ne, co, in, gt, ge, lt, and le, subject to the field type. String fields support eq, ne, in, and co; numeric and date fields support eq, ne, in, gt, ge, lt, and le. Boolean operators are and, or, and not. Parentheses group expressions. Expressions are limited to depth 10 and 100 predicates. Malformed syntax, unsupported fields or operators, and limit violations return invalid_filter with HTTP 400.\n\nFilterable fields: scheduleId, customerName, customerBillingPlan, costMetric, status, deliveryStatus, currency, periodType, exportType, invoiceAmount (string); customerId, attempts, filterCount, groupByCount (integer); billMonth (YYYY-MM); issueDate and dueDate (date); createdAt and updatedAt (date-time). Combined with discrete filters using AND.", - "example": "deliveryStatus eq 'success' and billMonth eq '2026-09'", - "type": "string" - }, - "description": "OData-style expression evaluated against each returned resource. Attribute names are case-sensitive and operators are case-insensitive. String eq, ne, and in comparisons are case-sensitive; co performs case-insensitive substring matching. Date values use YYYY-MM-DD; date-time values use ISO-8601 and are normalized to UTC; billMonth uses YYYY-MM. Missing fields are treated as null; only eq null and ne null support null operands. Literal values must be on the right side of an operator.\n\nSupported comparison operators are eq, ne, co, in, gt, ge, lt, and le, subject to the field type. String fields support eq, ne, in, and co; numeric and date fields support eq, ne, in, gt, ge, lt, and le. Boolean operators are and, or, and not. Parentheses group expressions. Expressions are limited to depth 10 and 100 predicates. Malformed syntax, unsupported fields or operators, and limit violations return invalid_filter with HTTP 400.\n\nFilterable fields: scheduleId, customerName, customerBillingPlan, costMetric, status, deliveryStatus, currency, periodType, exportType, invoiceAmount (string); customerId, attempts, filterCount, groupByCount (integer); billMonth (YYYY-MM); issueDate and dueDate (date); createdAt and updatedAt (date-time). Combined with discrete filters using AND.", - "name": "filter", - "example": "deliveryStatus eq 'success' and billMonth eq '2026-09'" + "example": "Quia exercitationem." }, { "flag": "skip-token", @@ -16396,7 +16404,7 @@ "resource": "invoice-schedule-activate", "action": "action", "summary": "Activate an invoice schedule", - "description": "Activates an invoice schedule (reactivating a previously deactivated schedule) and restores its future runs. Supply endMonthYear to bound the reactivated schedule; omit it to make the schedule open-ended. While inactive, schedules cannot be modified via PATCH; activate first. Supports optimistic locking through If-Match.", + "description": "Activates an invoice schedule (reactivating a previously deactivated schedule) and restores its future runs. Supply endMonthYear to bound the reactivated schedule; omit it to make the schedule open-ended. While inactive, a schedule accepts exactly status, invoiceNumberPrefix and invoiceNumberBase through PATCH; any other change requires activating it first. Supports optimistic locking through If-Match.", "destructive": false, "paginated": false, "responseEnvelope": "none", @@ -16484,7 +16492,7 @@ "resource": "invoice-schedule", "action": "create", "summary": "Create an invoice schedule", - "description": "Creates one invoice schedule covering every customer in the request. Validation applies to the whole request: if any customer is invalid the entire request fails and nothing is created.\n\nThe schedule's invoice template is selected one of three ways:\n\n- link an existing template: isCreateTemplate=false with invoiceTemplateId set\n- create one: isCreateTemplate=true with template set, and the created template's id is returned as the schedule's invoiceTemplateId\n- no template: isCreateTemplate=false with neither field, and the created schedule has no invoiceTemplateId\n\nAny other combination is rejected with 422.", + "description": "Creates one invoice schedule covering every customer in the request. Validation applies to the whole request: if any customer is invalid the entire request fails and nothing is created.\n\nThe schedule's invoice template is selected one of three ways:\n\n- link an existing template: isCreateTemplate=false with invoiceTemplateId set\n- create one: isCreateTemplate=true with template set, and the created template's id is returned as the schedule's invoiceTemplateId\n- no template: isCreateTemplate=false with neither field, and the created schedule has no invoiceTemplateId\n\nAny other combination is rejected with 422.\n\nAutomatic invoice numbering is optional. Supply invoiceNumberBase, with an optional invoiceNumberPrefix, to number every invoice the schedule generates; an invoiceNumberPrefix without an invoiceNumberBase is rejected with 400 invoice_number_prefix_requires_base. A number is allocated only after bill-lock passes: a failed generation keeps its number and a retry reuses it. If the sequence is exhausted the whole call fails with 409 invoice_number_sequence_exhausted (not retryable) and work already completed for earlier customers is retained. The schedule's counter is retained when the schedule is soft-deleted.", "destructive": false, "paginated": false, "responseEnvelope": "none", @@ -16508,6 +16516,8 @@ } ], "bodyFlags": [ + "invoice-number-base", + "invoice-number-prefix", "invoice-template-id", "is-create-template", "schedule-name" @@ -16519,6 +16529,30 @@ "$ref": "#/components/schemas/FinopsBilling_BillingInvoiceScheduleResult" }, "bodyFields": [ + { + "flag": "invoice-number-base", + "property": "invoiceNumberBase", + "required": false, + "schema": { + "description": "Optional first sequence number for the invoice numbers this schedule generates.", + "example": "uf4", + "maxLength": 9, + "pattern": "^0*[1-9][0-9]*$", + "type": "string" + } + }, + { + "flag": "invoice-number-prefix", + "property": "invoiceNumberPrefix", + "required": false, + "schema": { + "description": "Optional prefix for the invoice numbers this schedule generates. Requires invoiceNumberBase.", + "example": "zel", + "maxLength": 20, + "pattern": "^[A-Za-z0-9_-]*$", + "type": "string" + } + }, { "flag": "invoice-template-id", "property": "invoiceTemplateId", @@ -16674,14 +16708,14 @@ "schema": { "default": 50, "description": "Page size (default 50, max 200)", - "example": 53, + "example": 62, "maximum": 200, "minimum": 1, "type": "integer" }, "description": "Page size (default 50, max 200)", "name": "limit", - "example": 7 + "example": 118 }, { "flag": "order-by", @@ -16747,28 +16781,12 @@ "enum": null, "schema": { "description": "Optional exact-match filter on schedule name.", - "example": "Porro sit amet.", + "example": "Voluptas dolore explicabo nisi eius.", "type": "string" }, "description": "Optional exact-match filter on schedule name.", "name": "scheduleName", - "example": "Ut sint." - }, - { - "flag": "filter", - "source": "flag", - "in": "query", - "type": "string", - "required": false, - "enum": null, - "schema": { - "description": "OData-style expression evaluated against each returned resource. Attribute names are case-sensitive and operators are case-insensitive. String eq, ne, and in comparisons are case-sensitive; co performs case-insensitive substring matching. Date values use YYYY-MM-DD; date-time values use ISO-8601 and are normalized to UTC; billMonth uses YYYY-MM. Missing fields are treated as null; only eq null and ne null support null operands. Literal values must be on the right side of an operator.\n\nSupported comparison operators are eq, ne, co, in, gt, ge, lt, and le, subject to the field type. String fields support eq, ne, in, and co; numeric and date fields support eq, ne, in, gt, ge, lt, and le. Boolean operators are and, or, and not. Parentheses group expressions. Expressions are limited to depth 10 and 100 predicates. Malformed syntax, unsupported fields or operators, and limit violations return invalid_filter with HTTP 400.\n\nFilterable fields: scheduleName, status, customerName, customerBillingPlan, invoiceTemplateId (string); customerId (integer); createdAt and updatedAt (date-time). Customer fields match any customer on the schedule. Combined with discrete filters using AND.", - "example": "status eq 'active' and customerId eq 53125", - "type": "string" - }, - "description": "OData-style expression evaluated against each returned resource. Attribute names are case-sensitive and operators are case-insensitive. String eq, ne, and in comparisons are case-sensitive; co performs case-insensitive substring matching. Date values use YYYY-MM-DD; date-time values use ISO-8601 and are normalized to UTC; billMonth uses YYYY-MM. Missing fields are treated as null; only eq null and ne null support null operands. Literal values must be on the right side of an operator.\n\nSupported comparison operators are eq, ne, co, in, gt, ge, lt, and le, subject to the field type. String fields support eq, ne, in, and co; numeric and date fields support eq, ne, in, gt, ge, lt, and le. Boolean operators are and, or, and not. Parentheses group expressions. Expressions are limited to depth 10 and 100 predicates. Malformed syntax, unsupported fields or operators, and limit violations return invalid_filter with HTTP 400.\n\nFilterable fields: scheduleName, status, customerName, customerBillingPlan, invoiceTemplateId (string); customerId (integer); createdAt and updatedAt (date-time). Customer fields match any customer on the schedule. Combined with discrete filters using AND.", - "name": "filter", - "example": "status eq 'active' and customerId eq 53125" + "example": "Saepe facere veritatis." }, { "flag": "skip-token", @@ -16862,7 +16880,7 @@ "resource": "invoice-schedule", "action": "update", "summary": "Update an invoice schedule", - "description": "Partially updates an invoice schedule using JSON Merge Patch (RFC 7396) semantics: only fields present in the request body are changed and omitted fields remain unchanged. Supports optimistic locking through If-Match.\n\nAn inactive schedule cannot be modified through this endpoint. Use the activate endpoint to reactivate it.", + "description": "Partially updates an invoice schedule using JSON Merge Patch (RFC 7396) semantics: only fields present in the request body are changed and omitted fields remain unchanged. Supports optimistic locking through If-Match.\n\nInvoice numbering: invoiceNumberPrefix and invoiceNumberBase follow the same merge-patch rule, so omitting a field leaves it unchanged. Sending \"\" for both clears numbering and disables it. Sending \"\" for invoiceNumberPrefix alone, with an existing base, removes the prefix only. Re-adding numbering later continues from the last used number + 1. An invoiceNumberPrefix without a base is rejected with 400 invoice_number_prefix_requires_base, and changing the base after the first number was allocated is rejected with 400 invoice_number_base_locked.\n\nAn inactive schedule accepts exactly three fields through this endpoint: status, invoiceNumberPrefix and invoiceNumberBase. Any other field is rejected. Use the activate endpoint to reactivate it.", "destructive": false, "paginated": false, "responseEnvelope": "none", @@ -16902,9 +16920,12 @@ } ], "bodyFlags": [ + "invoice-number-base", + "invoice-number-prefix", "invoice-template-id", "is-create-template", - "schedule-name" + "schedule-name", + "status" ], "requestSchema": { "$ref": "#/components/schemas/FinopsBilling_UpdateRequestBody" @@ -16913,6 +16934,30 @@ "$ref": "#/components/schemas/FinopsBilling_BillingInvoiceScheduleResult" }, "bodyFields": [ + { + "flag": "invoice-number-base", + "property": "invoiceNumberBase", + "required": false, + "schema": { + "description": "Optional updated first sequence number for the invoice numbers this schedule generates.", + "example": "n3b", + "maxLength": 9, + "pattern": "^$|^0*[1-9][0-9]*$", + "type": "string" + } + }, + { + "flag": "invoice-number-prefix", + "property": "invoiceNumberPrefix", + "required": false, + "schema": { + "description": "Optional updated prefix for the invoice numbers this schedule generates. Requires invoiceNumberBase.", + "example": "xkx", + "maxLength": 20, + "pattern": "^[A-Za-z0-9_-]*$", + "type": "string" + } + }, { "flag": "invoice-template-id", "property": "invoiceTemplateId", @@ -16939,10 +16984,23 @@ "required": false, "schema": { "description": "Updated name.", - "example": "p4y", + "example": "dq5", "maxLength": 255, "type": "string" } + }, + { + "flag": "status", + "property": "status", + "required": false, + "schema": { + "description": "Updated lifecycle status. PATCH accepts only inactive; use the activate endpoint to reactivate a schedule.", + "enum": [ + "inactive" + ], + "example": "inactive", + "type": "string" + } } ], "headers": [ @@ -17004,6 +17062,7 @@ "cost-metric", "dimensions", "display-logo-within-pdf", + "export-layout", "export-type", "free-text", "logo", @@ -17024,18 +17083,20 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Sit eos mollitia debitis cum.", + "dimension": "Aut facilis autem non non eum.", "expressions": [ + {}, {}, {} ], - "substring": "Earum iusto unde sit exercitationem aut.", + "substring": "Qui suscipit quas temporibus voluptates voluptatem quo.", "type": "equal", - "value": "Iusto repudiandae consequuntur adipisci." + "value": "Voluptatem eius." }, - "freeText": "Est enim voluptas quae.", + "freeText": "Atque architecto omnis occaecati.", "logo": "\u003cbase64-or-reference-payload\u003e", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" @@ -17070,7 +17131,7 @@ "region" ], "items": { - "example": "Ullam aspernatur maxime ducimus.", + "example": "Eum laudantium ea dignissimos.", "type": "string" }, "maxItems": 10, @@ -17087,6 +17148,20 @@ "type": "boolean" } }, + { + "flag": "export-layout", + "property": "exportLayout", + "required": false, + "schema": { + "description": "PDF layout format. Exact lowercase flatten or nested; omitted PDF exports default to flatten. Must be omitted for CSV exports.", + "enum": [ + "flatten", + "nested" + ], + "example": "flatten", + "type": "string" + } + }, { "flag": "export-type", "property": "exportType", @@ -17107,7 +17182,7 @@ "required": false, "schema": { "description": "Optional free-text company/address block.", - "example": "Aut accusamus.", + "example": "Quo inventore voluptatem ut expedita.", "type": "string" } }, @@ -17199,14 +17274,14 @@ "schema": { "default": 50, "description": "Page size (default 50, max 200)", - "example": 56, + "example": 143, "maximum": 200, "minimum": 1, "type": "integer" }, "description": "Page size (default 50, max 200)", "name": "limit", - "example": 189 + "example": 94 }, { "flag": "order-by", @@ -17381,6 +17456,7 @@ "cost-metric", "dimensions", "display-logo-within-pdf", + "export-layout", "export-type", "free-text", "logo", @@ -17396,26 +17472,28 @@ "requestExample": { "costMetric": "modifiedBilledCost", "dimensions": [ - "Hic accusantium iure ducimus.", - "Aliquid asperiores.", - "Dignissimos iusto est." + "Maxime a.", + "Illum labore.", + "Porro ut culpa." ], "displayLogoWithinPdf": false, - "exportType": "pdf", + "exportLayout": "nested", + "exportType": "csv", "filter": { - "dimension": "Sit eos mollitia debitis cum.", + "dimension": "Aut facilis autem non non eum.", "expressions": [ + {}, {}, {} ], - "substring": "Earum iusto unde sit exercitationem aut.", + "substring": "Qui suscipit quas temporibus voluptates voluptatem quo.", "type": "equal", - "value": "Iusto repudiandae consequuntur adipisci." + "value": "Voluptatem eius." }, - "freeText": "Consequatur dolores sit qui molestiae corporis expedita.", - "logo": "Cumque id commodi aut.", - "periodType": "billingPeriod", - "templateName": "xcy" + "freeText": "Sunt quibusdam omnis ea doloremque.", + "logo": "Consequatur occaecati cupiditate est sit.", + "periodType": "billPeriod", + "templateName": "z6j" }, "requestExampleSource": "upstream", "bodyFields": [ @@ -17442,12 +17520,12 @@ "schema": { "description": "Updated grouping dimensions.", "example": [ - "Temporibus nihil minima non asperiores quisquam.", - "Qui animi temporibus non excepturi.", - "Quo praesentium ea vitae molestias dolores et." + "Sit sunt eveniet sunt est facere temporibus.", + "Sit laboriosam.", + "Provident at ipsum." ], "items": { - "example": "Sequi sunt.", + "example": "Tenetur molestiae eos suscipit ut.", "type": "string" }, "maxItems": 10, @@ -17460,10 +17538,24 @@ "required": false, "schema": { "description": "Updated PDF logo display flag.", - "example": true, + "example": false, "type": "boolean" } }, + { + "flag": "export-layout", + "property": "exportLayout", + "required": false, + "schema": { + "description": "Updated PDF layout format. Exact lowercase flatten or nested; omitted PDF exports default to flatten. Must be omitted for CSV exports.", + "enum": [ + "flatten", + "nested" + ], + "example": "nested", + "type": "string" + } + }, { "flag": "export-type", "property": "exportType", @@ -17474,7 +17566,7 @@ "pdf", "csv" ], - "example": "pdf", + "example": "csv", "type": "string" } }, @@ -17484,7 +17576,7 @@ "required": false, "schema": { "description": "Updated free-text company/address block.", - "example": "Ut libero animi porro illo.", + "example": "Quia sit.", "type": "string" } }, @@ -17494,7 +17586,7 @@ "required": false, "schema": { "description": "Updated logo payload.", - "example": "Pariatur illum quibusdam quis.", + "example": "Nulla ducimus ut dolores quibusdam voluptas.", "type": "string" } }, @@ -17519,7 +17611,7 @@ "required": false, "schema": { "description": "Updated template name.", - "example": "561", + "example": "39a", "maxLength": 255, "type": "string" } @@ -17557,7 +17649,7 @@ "resource": "invoice", "action": "create", "summary": "Create an invoice", - "description": "Creates invoice exports for one or more customers.\n\nThe invoice configuration can be supplied in one of four ways:\n\n- direct fields: provide exportType, periodType, costMetric, and displayLogoWithinPdf without a template source\n- existing template: provide invoiceTemplateId; omitted root configuration fields use the saved template's values\n- create saved template: provide isCreateTemplate=true and template with templateName; the new template is used and its ID is returned\n- one-time template: provide template without templateName and with isCreateTemplate=false (or omitted); it supplies omitted root configuration fields but is not saved\n\nRoot configuration fields always override their corresponding template value when present. template cannot be combined with invoiceTemplateId. The four root configuration fields (exportType, periodType, costMetric, displayLogoWithinPdf) are required only when neither invoiceTemplateId nor template is supplied.", + "description": "Creates invoice exports for one or more customers.\n\nThe invoice configuration can be supplied in one of four ways:\n\n- direct fields: provide exportType, periodType, costMetric, and displayLogoWithinPdf without a template source\n- existing template: provide invoiceTemplateId; omitted root configuration fields use the saved template's values\n- create saved template: provide isCreateTemplate=true and template with templateName; the new template is used and its ID is returned\n- one-time template: provide template without templateName and with isCreateTemplate=false (or omitted); it supplies omitted root configuration fields but is not saved\n\nEach customer may carry an optional invoiceNumber. It is immutable after creation, and duplicates are allowed. The number of a generated invoice is allocated only after bill-lock passes; a failed generation keeps its number and a retry reuses it. If the invoice number sequence is exhausted the whole call fails with 409 invoice_number_sequence_exhausted (not retryable) and work already completed for earlier customers in the call is retained.\n\nRoot configuration fields always override their corresponding template value when present. template cannot be combined with invoiceTemplateId. The four required root configuration fields (exportType, periodType, costMetric, displayLogoWithinPdf) are required only when neither invoiceTemplateId nor template is supplied. exportLayout is optional: PDF exports default to flatten, while nested selects the nested layout. Values are exact lowercase flatten or nested; omit exportLayout for CSV exports.", "destructive": false, "paginated": false, "responseEnvelope": "none", @@ -17586,6 +17678,7 @@ "display-logo-within-pdf", "due-date", "end-date", + "export-layout", "export-type", "free-text", "invoice-template-id", @@ -17605,42 +17698,52 @@ "costMetric": "modifiedEffectiveCost", "customers": [ { - "customerBillingPlan": "Distinctio officiis ex ut qui.", - "customerId": 8270483714537410000, - "customerName": "Tempore recusandae." + "customerBillingPlan": "Pariatur necessitatibus corrupti.", + "customerId": 7491482402168278000, + "customerName": "Officiis eum.", + "invoiceNumber": "y0u" }, { - "customerBillingPlan": "Distinctio officiis ex ut qui.", - "customerId": 8270483714537410000, - "customerName": "Tempore recusandae." + "customerBillingPlan": "Pariatur necessitatibus corrupti.", + "customerId": 7491482402168278000, + "customerName": "Officiis eum.", + "invoiceNumber": "y0u" + }, + { + "customerBillingPlan": "Pariatur necessitatibus corrupti.", + "customerId": 7491482402168278000, + "customerName": "Officiis eum.", + "invoiceNumber": "y0u" } ], "dimensions": [ - "Incidunt ducimus rerum voluptatem vel quis nemo.", - "Aut provident ratione excepturi qui.", - "Consequatur iste ipsum laboriosam ipsam." + "Aperiam perspiciatis reiciendis quia omnis praesentium.", + "Pariatur et.", + "Ab quos fuga." ], - "displayLogoWithinPdf": true, - "dueDate": "2014-02-23", - "endDate": "1979-05-26", + "displayLogoWithinPdf": false, + "dueDate": "2014-10-11", + "endDate": "1977-10-29", + "exportLayout": "flatten", "exportType": "csv", "filter": { - "dimension": "Sit eos mollitia debitis cum.", + "dimension": "Aut facilis autem non non eum.", "expressions": [ + {}, {}, {} ], - "substring": "Earum iusto unde sit exercitationem aut.", + "substring": "Qui suscipit quas temporibus voluptates voluptatem quo.", "type": "equal", - "value": "Iusto repudiandae consequuntur adipisci." + "value": "Voluptatem eius." }, - "freeText": "Perspiciatis est.", - "invoiceTemplateId": "Iure et dolor placeat ullam doloribus quia.", + "freeText": "Adipisci hic velit delectus adipisci molestiae.", + "invoiceTemplateId": "Consequuntur voluptas aut.", "isCreateTemplate": false, - "issueDate": "1984-05-21", - "logo": "Enim similique voluptas accusantium.", - "periodType": "billingPeriod", - "startDate": "1997-05-22", + "issueDate": "1978-01-12", + "logo": "Enim accusamus.", + "periodType": "billPeriod", + "startDate": "1997-06-30", "template": { "costMetric": "billedCost", "dimensions": [ @@ -17649,19 +17752,21 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Sit eos mollitia debitis cum.", + "dimension": "Aut facilis autem non non eum.", "expressions": [ + {}, {}, {} ], - "substring": "Earum iusto unde sit exercitationem aut.", + "substring": "Qui suscipit quas temporibus voluptates voluptatem quo.", "type": "equal", - "value": "Iusto repudiandae consequuntur adipisci." + "value": "Voluptatem eius." }, - "freeText": "Et corporis temporibus et blanditiis assumenda dolorum.", - "logo": "Aliquam in nemo qui impedit soluta corporis.", + "freeText": "Labore ipsum fugiat est quod ullam.", + "logo": "Voluptatem minus aut illum eligendi.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" } @@ -17680,7 +17785,7 @@ "modifiedBilledCost", "modifiedEffectiveCost" ], - "example": "modifiedEffectiveCost", + "example": "effectiveCost", "type": "string" } }, @@ -17691,12 +17796,12 @@ "schema": { "description": "Dimensions to include in export.", "example": [ - "Expedita consequatur labore voluptatum non et.", - "Accusamus consequatur.", - "Voluptate beatae illo." + "Eius porro tempore nemo quidem voluptas.", + "Et distinctio eum.", + "Eos eveniet eaque fuga iste et ratione." ], "items": { - "example": "Alias itaque voluptatibus et quaerat.", + "example": "Expedita facere dolorum est velit adipisci.", "type": "string" }, "maxItems": 10, @@ -17719,7 +17824,7 @@ "required": false, "schema": { "description": "Invoice due date.", - "example": "1993-12-03", + "example": "1988-11-28", "format": "date", "type": "string" } @@ -17730,11 +17835,25 @@ "required": true, "schema": { "description": "Invoice range end date.", - "example": "1990-10-28", + "example": "1988-05-11", "format": "date", "type": "string" } }, + { + "flag": "export-layout", + "property": "exportLayout", + "required": false, + "schema": { + "description": "PDF layout format. Exact lowercase flatten or nested; omitted PDF exports default to flatten. Must be omitted for CSV exports.", + "enum": [ + "flatten", + "nested" + ], + "example": "flatten", + "type": "string" + } + }, { "flag": "export-type", "property": "exportType", @@ -17755,7 +17874,7 @@ "required": false, "schema": { "description": "Optional free text.", - "example": "Nulla numquam architecto eius pariatur.", + "example": "Est est illo nisi.", "type": "string" } }, @@ -17765,7 +17884,7 @@ "required": false, "schema": { "description": "Optional saved invoice template to source default field values from. Cannot be combined with template. Opaque ID; resolved server-side and snapshotted into the invoice.", - "example": "Eius voluptatem et rerum minus.", + "example": "Quo dolorum adipisci est cumque dolor.", "type": "string" } }, @@ -17786,7 +17905,7 @@ "required": false, "schema": { "description": "Invoice issue date.", - "example": "1982-03-16", + "example": "1995-07-16", "format": "date", "type": "string" } @@ -17797,7 +17916,7 @@ "required": false, "schema": { "description": "Optional logo payload.", - "example": "Iure dolorem animi atque quos.", + "example": "Sunt sunt mollitia tenetur.", "type": "string" } }, @@ -17812,7 +17931,7 @@ "billPeriod", "billingPeriod" ], - "example": "billPeriod", + "example": "chargePeriod", "type": "string" } }, @@ -17822,7 +17941,7 @@ "required": true, "schema": { "description": "Invoice range start date.", - "example": "2005-03-29", + "example": "1979-06-22", "format": "date", "type": "string" } @@ -17847,7 +17966,7 @@ "resource": "invoice", "action": "list", "summary": "Index invoices", - "description": "Lists invoice export lifecycle records in the organization.", + "description": "Lists invoice export lifecycle records in the organization.\n\nThe invoiceNumber query parameter filters on an exact, case-sensitive invoice number. invoiceNumber is also accepted in orderBy, ascending and descending. Invoices sort by byte order of the invoice number; invoices without a number come last in both directions, and ties are broken by id.", "destructive": false, "paginated": true, "responseEnvelope": "values", @@ -17879,14 +17998,14 @@ "schema": { "default": 10, "description": "Page size (default 10, max 200)", - "example": 65, + "example": 111, "maximum": 200, "minimum": 1, "type": "integer" }, "description": "Page size (default 10, max 200)", "name": "limit", - "example": 7 + "example": 26 }, { "flag": "status", @@ -17897,12 +18016,12 @@ "enum": null, "schema": { "description": "Optional status filter.", - "example": "Et voluptatem et qui ullam et.", + "example": "Nobis maxime repudiandae incidunt sunt dolores porro.", "type": "string" }, "description": "Optional status filter.", "name": "status", - "example": "Est ullam." + "example": "Veniam ad illo a ipsa eveniet." }, { "flag": "order-by", @@ -17913,12 +18032,36 @@ "enum": null, "schema": { "description": "Optional orderBy query allows to specify an expression for determining what values are used to order the entities.\nMultiple expressions can be specified using comma separated values.", - "example": "updatedAt desc", + "example": "invoiceNumber asc", "type": "string" }, "description": "Optional orderBy query allows to specify an expression for determining what values are used to order the entities.\nMultiple expressions can be specified using comma separated values.", "name": "orderBy", - "example": "updatedAt desc" + "example": "invoiceNumber asc", + "examples": { + "default": { + "summary": "default", + "value": "invoiceNumber asc" + } + } + }, + { + "flag": "invoice-number", + "source": "flag", + "in": "query", + "type": "string", + "required": false, + "enum": null, + "schema": { + "description": "Optional exact, case-sensitive invoice number filter.", + "example": "INV-000042", + "maxLength": 29, + "pattern": "^[A-Za-z0-9_-]+$", + "type": "string" + }, + "description": "Optional exact, case-sensitive invoice number filter.", + "name": "invoiceNumber", + "example": "INV-000042" }, { "flag": "bill-month", @@ -17929,13 +18072,13 @@ "enum": null, "schema": { "description": "Optional bill month filter.", - "example": "Holly Okuneva", + "example": "Emmet Hahn", "pattern": "^\\d{4}-\\d{2}$", "type": "string" }, "description": "Optional bill month filter.", "name": "billMonth", - "example": "Cruz Fadel" + "example": "Georgiana Boyle" }, { "flag": "export-type", @@ -17958,7 +18101,7 @@ }, "description": "Optional export type filter.", "name": "exportType", - "example": "csv" + "example": "pdf" }, { "flag": "customer-name", @@ -17969,12 +18112,12 @@ "enum": null, "schema": { "description": "Optional customer name filter.", - "example": "Aut sit.", + "example": "Saepe a sequi eligendi omnis non.", "type": "string" }, "description": "Optional customer name filter.", "name": "customerName", - "example": "Officia sed." + "example": "Ratione atque." }, { "flag": "filter", @@ -17984,29 +18127,13 @@ "required": false, "enum": null, "schema": { - "description": "Legacy substring search of the stored invoice generation filter JSON. This parameter does not accept OData expressions.", - "example": "Eos voluptatem qui cupiditate.", + "description": "Optional filter text.", + "example": "Est vitae maiores.", "type": "string" }, - "description": "Legacy substring search of the stored invoice generation filter JSON. This parameter does not accept OData expressions.", + "description": "Optional filter text.", "name": "filter", - "example": "Facere dolorum est velit adipisci tenetur." - }, - { - "flag": "expression-filter", - "source": "flag", - "in": "query", - "type": "string", - "required": false, - "enum": null, - "schema": { - "description": "OData-style expression evaluated against each returned resource. Attribute names are case-sensitive and operators are case-insensitive. String eq, ne, and in comparisons are case-sensitive; co performs case-insensitive substring matching. Date values use YYYY-MM-DD; date-time values use ISO-8601 and are normalized to UTC; billMonth uses YYYY-MM. Missing fields are treated as null; only eq null and ne null support null operands. Literal values must be on the right side of an operator.\n\nSupported comparison operators are eq, ne, co, in, gt, ge, lt, and le, subject to the field type. String fields support eq, ne, in, and co; numeric and date fields support eq, ne, in, gt, ge, lt, and le. Boolean operators are and, or, and not. Parentheses group expressions. Expressions are limited to depth 10 and 100 predicates. Malformed syntax, unsupported fields or operators, and limit violations return invalid_filter with HTTP 400.\n\nFilterable fields: customerId, attempts, filterCount, and groupByCount (integer); customerName, customerBillingPlan, currency, invoiceAmount, status, costMetric, periodType, and exportType (string); billMonth (YYYY-MM); issueDate and dueDate (date); createdAt and updatedAt (date-time). Combined with the legacy filter and discrete filters using AND.", - "example": "customerName co 'Acme' and exportType eq 'pdf'", - "type": "string" - }, - "description": "OData-style expression evaluated against each returned resource. Attribute names are case-sensitive and operators are case-insensitive. String eq, ne, and in comparisons are case-sensitive; co performs case-insensitive substring matching. Date values use YYYY-MM-DD; date-time values use ISO-8601 and are normalized to UTC; billMonth uses YYYY-MM. Missing fields are treated as null; only eq null and ne null support null operands. Literal values must be on the right side of an operator.\n\nSupported comparison operators are eq, ne, co, in, gt, ge, lt, and le, subject to the field type. String fields support eq, ne, in, and co; numeric and date fields support eq, ne, in, gt, ge, lt, and le. Boolean operators are and, or, and not. Parentheses group expressions. Expressions are limited to depth 10 and 100 predicates. Malformed syntax, unsupported fields or operators, and limit violations return invalid_filter with HTTP 400.\n\nFilterable fields: customerId, attempts, filterCount, and groupByCount (integer); customerName, customerBillingPlan, currency, invoiceAmount, status, costMetric, periodType, and exportType (string); billMonth (YYYY-MM); issueDate and dueDate (date); createdAt and updatedAt (date-time). Combined with the legacy filter and discrete filters using AND.", - "name": "expressionFilter", - "example": "customerName co 'Acme' and exportType eq 'pdf'" + "example": "Tenetur maxime recusandae." }, { "flag": "group-by-count", @@ -18017,12 +18144,12 @@ "enum": null, "schema": { "description": "Optional group-by dimension count filter.", - "example": 17865801018154277000, + "example": 12305092808851163000, "type": "integer" }, "description": "Optional group-by dimension count filter.", "name": "groupByCount", - "example": 17118634271918162000 + "example": 532853165886189060 }, { "flag": "skip-token", @@ -18089,12 +18216,12 @@ "enum": null, "schema": { "description": "Invoice export identifier", - "example": "Eum distinctio eos eveniet.", + "example": "Voluptas quia.", "type": "string" }, "description": "Invoice export identifier", "name": "id", - "example": "Fuga iste et ratione aut." + "example": "Veritatis atque pariatur accusantium corrupti aut." } ], "bodyFlags": [], @@ -18147,12 +18274,12 @@ "enum": null, "schema": { "description": "Invoice export identifier", - "example": "Tempore nemo quidem.", + "example": "Praesentium velit.", "type": "string" }, "description": "Invoice export identifier", "name": "id", - "example": "Voluptates et." + "example": "Quia rem asperiores eos perferendis." } ], "bodyFlags": [], @@ -18204,6 +18331,12 @@ "$ref": "#/components/schemas/FinopsBilling_ReplaceSettingsRequestBody" }, "requestExample": { + "automatedEdpProfiles": [ + { + "billSource": "aws-123456789012", + "enabled": true + } + ], "baseCostsOn": "billedCost" }, "requestExampleSource": "upstream", @@ -18341,11 +18474,6 @@ "percentage": 50, "value": "Orion" }, - { - "dimensionId": "rbd_team", - "percentage": 50, - "value": "Orion" - }, { "dimensionId": "rbd_team", "percentage": 50, @@ -18358,15 +18486,6 @@ "effectiveTo": "2025-12", "name": "Equal split for AWS between Teams A, B and C", "source": [ - { - "dimensionId": "vendor", - "valueListCondition": { - "values": [ - "AWS", - "Azure" - ] - } - }, { "dimensionId": "vendor", "valueListCondition": { @@ -18574,10 +18693,6 @@ }, "requestExample": { "rules": [ - { - "priority": 1, - "ruleId": "68f2a91c4b3d2e1f5a6b7c8d" - }, { "priority": 1, "ruleId": "68f2a91c4b3d2e1f5a6b7c8d" @@ -18734,11 +18849,6 @@ "percentage": 50, "value": "Orion" }, - { - "dimensionId": "rbd_team", - "percentage": 50, - "value": "Orion" - }, { "dimensionId": "rbd_team", "percentage": 50, @@ -35647,8 +35757,8 @@ "summary": "Index an org's users", "description": "Returns the list of users who are affiliated to the org.", "destructive": false, - "paginated": false, - "responseEnvelope": "none", + "paginated": true, + "responseEnvelope": "values", "params": [ { "flag": "org-id", @@ -35722,87 +35832,117 @@ "description": "Filter users by access source type", "name": "accessSource", "example": "org_member" - } - ], - "bodyFlags": [], - "responseSchema": { - "$ref": "#/components/schemas/Iam_UserList" - } - }, - { - "operationId": "Iam_User_show", - "command": [ - "iam", - "user", - "get" - ], - "method": "GET", - "path": "/iam/v1/orgs/{orgId}/users/{id}", - "tag": "User", - "service": "iam", - "resource": "user", - "action": "get", - "summary": "Show an individual org user", - "description": "Returns details for a specific user affiliated to an org.", - "destructive": false, - "paginated": false, - "responseEnvelope": "none", - "params": [ + }, { - "flag": "org-id", - "source": "config", - "in": "path", + "flag": "limit", + "source": "flag", + "in": "query", "type": "integer", - "required": true, + "required": false, "enum": null, "schema": { - "description": "The unique identifier for the organization", + "description": "The maximum number of users to return per page. If a partial page is returned, the response includes a nextPage link carrying the skipToken.", "example": 100, - "minimum": 1, "type": "integer" }, - "description": "The unique identifier for the organization", - "name": "orgId", + "description": "The maximum number of users to return per page. If a partial page is returned, the response includes a nextPage link carrying the skipToken.", + "name": "limit", "example": 100 }, { - "flag": "id", - "source": "flag", - "in": "path", - "type": "integer", - "required": true, + "flag": "skip-token", + "source": "pagination", + "in": "query", + "type": "string", + "required": false, "enum": null, "schema": { - "description": "ID of the user", - "example": 12345, - "minimum": 1, - "type": "integer" + "description": "An opaque token to be provided when requesting a subsequent page after receiving a partial response. \nPartial responses will include a \"nextPage\" attribute in their response body, which contains the URL of the next page including the appropriate skipToken.", + "type": "string" }, - "description": "ID of the user", - "name": "id", - "example": 12345 + "description": "An opaque token to be provided when requesting a subsequent page after receiving a partial response. \nPartial responses will include a \"nextPage\" attribute in their response body, which contains the URL of the next page including the appropriate skipToken.", + "name": "skipToken" } ], "bodyFlags": [], "responseSchema": { - "$ref": "#/components/schemas/Iam_FlexeraIamUser" + "$ref": "#/components/schemas/Iam_UserList" } }, { - "operationId": "Iam_User_user_groups", + "operationId": "Iam_User_show", "command": [ "iam", "user", - "groups" + "get" ], "method": "GET", - "path": "/iam/v1/orgs/{orgId}/users/{id}/groups", + "path": "/iam/v1/orgs/{orgId}/users/{id}", "tag": "User", "service": "iam", - "resource": "group", - "action": "list", - "summary": "Get user groups", - "description": "Returns the list of groups that the user belongs to within the organization.", + "resource": "user", + "action": "get", + "summary": "Show an individual org user", + "description": "Returns details for a specific user affiliated to an org.", + "destructive": false, + "paginated": false, + "responseEnvelope": "none", + "params": [ + { + "flag": "org-id", + "source": "config", + "in": "path", + "type": "integer", + "required": true, + "enum": null, + "schema": { + "description": "The unique identifier for the organization", + "example": 100, + "minimum": 1, + "type": "integer" + }, + "description": "The unique identifier for the organization", + "name": "orgId", + "example": 100 + }, + { + "flag": "id", + "source": "flag", + "in": "path", + "type": "integer", + "required": true, + "enum": null, + "schema": { + "description": "ID of the user", + "example": 12345, + "minimum": 1, + "type": "integer" + }, + "description": "ID of the user", + "name": "id", + "example": 12345 + } + ], + "bodyFlags": [], + "responseSchema": { + "$ref": "#/components/schemas/Iam_FlexeraIamUser" + } + }, + { + "operationId": "Iam_User_user_groups", + "command": [ + "iam", + "user", + "groups" + ], + "method": "GET", + "path": "/iam/v1/orgs/{orgId}/users/{id}/groups", + "tag": "User", + "service": "iam", + "resource": "group", + "action": "list", + "summary": "Get user groups", + "description": "Returns the list of groups that the user belongs to within the organization.", "destructive": false, "paginated": false, "responseEnvelope": "none", @@ -35847,6 +35987,146 @@ "$ref": "#/components/schemas/Iam_UserGroupList" } }, + { + "operationId": "OptimaRecommendations_Recommendations_export", + "command": [ + "recommendations", + "export" + ], + "method": "GET", + "path": "/recommendations/orgs/{orgId}/recommendations/export", + "tag": "Recommendations", + "service": "optima_recommendations", + "resource": "recommendation-export", + "action": "list", + "summary": "Export recommendations as CSV", + "description": "Exports recommendations as a CSV file: every recommendation the paged list returns for the same `filter` and `orderBy`, with the same billing center rules, one row each, with the given columns.\n\n**Required security scopes for GlobalSession**:\n * `common:org:affiliated+common:org:own`", + "destructive": false, + "paginated": false, + "responseEnvelope": "none", + "params": [ + { + "flag": "org-id", + "source": "config", + "in": "path", + "type": "integer", + "required": true, + "enum": null, + "schema": { + "type": "integer" + }, + "description": "The organization ID", + "name": "orgId" + }, + { + "flag": "filter", + "source": "flag", + "in": "query", + "type": "string", + "required": false, + "enum": null, + "schema": { + "type": "string" + }, + "description": "Optional filter for returning recommendations matching specific criteria.\n### Supported Filter Keys\n| Filter | Type | Example | Description |\n| --------------------- | ------ | ------------------------------------------------- | ------------------------------------------------------------------------------------ |\n| billingCenterID | string | billingCenterID in ['bc1', 'bc2'] | Returns recommendations under the billing centers bc1 or bc2, including descendants |\n| billingCenterName | string | billingCenterName co 'prod' | Returns recommendations listed under a billing center (the Cost Center column) whose name contains 'prod'; eq, ne, in and co only |\n| recommendation | string | recommendation co 'Delete' | Returns recommendations with 'recommendation' containing 'Delete' |\n| type | string | type eq 'Usage Reduction' | Returns recommendations of the given type |\n| vendor | string | vendor in ['AWS', 'Azure'] | Returns recommendations for either AWS or Azure |\n| policySet | string | policySet eq 'Unused Volumes' | Returns recommendations of the given policy set |\n| accountID | string | accountID eq '123456789012' | Returns recommendations for the given cloud account ID |\n| accountName | string | accountName co 'prod' | Returns recommendations for accounts with a name containing 'prod' |\n| resourceGroup | string | resourceGroup eq 'rg-main' | Returns recommendations for the given resource group |\n| region | string | region in ['us-east-1', 'eu-west-1'] | Returns recommendations in either region |\n| service | string | service eq 'EC2' | Returns recommendations for the given service |\n| databaseEngine | string | databaseEngine eq 'postgres' | Returns recommendations for the given database engine |\n| resourceType | string | resourceType eq 'm5.large' | Returns recommendations for the given resource type |\n| resourceID | string | resourceID eq 'i-0abc123' | Returns recommendations for the given resource ID |\n| savings | float | savings gt 100 | Returns recommendations with savings greater than 100 |\n| status | string | status in ['active', 'snoozed'] | Returns recommendations with the given statuses (active, snoozed, rejected, realized) |\n| incidentID | string | incidentID eq '5b06ead5e0dacc007058c784' | Returns recommendations of the given policy incident |\n| createdAt | time | createdAt gt '2022-05-20T00:00:00Z' | Returns recommendations created after 2022-05-20 |\n| updatedAt | time | updatedAt lt '2020-01-01T00:00:00Z' | Returns recommendations updated before 2020-01-01 |\n| detailsExtended.\u003ckey\u003e | string | detailsExtended.instanceFamily eq 'm5' | Returns recommendations whose 'detailsExtended' entry \u003ckey\u003e matches the value |\n| ruleBasedDimensions.\u003ckey\u003e | string | ruleBasedDimensions.rbd_bc eq 'bc1' | Returns recommendations whose rule-based dimension \u003ckey\u003e matches the value |\n| source | string | source eq 'AWS Trusted Advisor' | Returns recommendations from the given source |\n| id | string | id in ['5f1b...', '5f1c...'] | Returns the recommendations with the given IDs |\n| quantityToPurchase | float | quantityToPurchase ge 2 | Returns recommendations with a number to purchase of at least 2; none counts as 0, as the list shows it |\n| statusReason | string | statusReason co 'not needed' | Returns recommendations whose status reason (description) contains 'not needed' |\n| statusUpdatedAt | time | statusUpdatedAt gt '2026-01-01T00:00:00Z' | Returns recommendations whose status changed after 2026-01-01 |\n| snoozedTargetDate | time | snoozedTargetDate lt '2026-12-01T00:00:00Z' | Returns recommendations snoozed until before 2026-12-01 |\n| customTagDimensions.\u003ckey\u003e | string | customTagDimensions.owner eq 'team-a' | Returns recommendations whose tag dimension \u003ckey\u003e matches the value |\n| tags | string | tags eq 'env=prod, team=a' | eq/ne/in compare the whole set of tags, joined with ', ' as groupBy tags shows it ('' for none); co finds a tag among them |\n\n### Supported Operators\n- **in** - Checks if the field contains a specified value within a list.\n- **eq** - Checks if the field's value is equal to the specified value.\n- **ne** - Checks if the field's value is not equal to the specified value.\n- **co** - Checks if the field contains the specified substring.\n- **ex** - Checks whether the field has a value: resourceGroup ex true returns the recommendations that have one, resourceGroup ex false those that have none.\n- **and, or** - Logical operators used to combine multiple conditions. 'and' binds tighter than 'or' (a or b and c means a or (b and c)); use parentheses to group. Two conditions must always be joined by one of them.\n- **not** - Negates the operator that follows it, e.g. status not in ['rejected'].\n- **lt, gt, le, ge** - Relational operators used to compare the field's value against a specified value. They check for less than, greater than, less than or equal to, and greater than or equal to conditions, respectively.\n\n### Notes\n- The filter is a query parameter. While it needs to be URL-encoded, examples here are provided pre-URL-encoding for clarity.\n- A recommendation with no status (for example a Rate Reduction) counts as 'active'.\n- Without a condition on status, recommendations of every status except 'realized' are returned. 'realized' recommendations are returned only when the status condition names them, e.g. status in ['active', 'realized']; excluding a status, e.g. status ne 'rejected', does not.\n- The status key supports only the eq, ne, in, co and not operators; co matches the statuses that contain the text, e.g. status co 'act' is status in ['active']. Anything else is rejected with a 400 error.\n- co applies to text fields only: savings, quantityToPurchase, createdAt, updatedAt, statusUpdatedAt and snoozedTargetDate are compared with eq, ne, gt, ge, lt and le.\n- Combine the status condition with conditions on other fields using 'and', e.g. savings gt 5 and (status eq 'realized' or status eq 'active'). An 'or' between a status condition naming 'realized' and a condition on another field also lets that condition match realized recommendations.\n- Results are always confined to the billing centers the user is authorized for, whatever billingCenterID clauses the filter contains.\n- A detailsExtended.\u003ckey\u003e value is stored as a number or as a string: eq, ne and in with a value that reads as a number match both.\n\n### Examples\n| Example | Description |\n| ----------------------------------------------------------- | -------------------------------------------------------------------- |\n| billingCenterID in ['bc1'] and status in ['active'] | Find active recommendations under billing center 'bc1' |\n| vendor eq 'AWS' and savings gt 100 | Find AWS recommendations with savings greater than 100 |\n| region eq 'us-east-1' or region eq 'eu-west-1' | Find recommendations in either region |\n| accountName co 'prod' and status not eq 'rejected' | Find recommendations for prod accounts that are not rejected |\n| createdAt gt '2022-05-20T00:00:00Z' and policySet eq 'Idle' | Find recommendations of a policy set created after 2022-05-20 |\n", + "name": "filter" + }, + { + "flag": "order-by", + "source": "flag", + "in": "query", + "type": "string", + "required": false, + "enum": null, + "schema": { + "type": "string" + }, + "description": "Optional order by for returning recommendations in a specific order.\n### Supported Order by Keys\n| Key | Description |\n| -------------------- | ------------------------------------------------------------------------------- |\n| recommendation | Returns recommendations ordered by 'recommendation' property |\n| type | Returns recommendations ordered by 'type' property |\n| vendor | Returns recommendations ordered by 'vendor' property |\n| policySet | Returns recommendations ordered by 'policySet' property |\n| accountID | Returns recommendations ordered by 'accountID' property |\n| accountName | Returns recommendations ordered by 'accountName' property |\n| resourceGroup | Returns recommendations ordered by 'resourceGroup' property |\n| region | Returns recommendations ordered by 'region' property |\n| service | Returns recommendations ordered by 'service' property |\n| databaseEngine | Returns recommendations ordered by 'databaseEngine' property |\n| resourceType | Returns recommendations ordered by 'resourceType' property |\n| resourceID | Returns recommendations ordered by 'resourceID' property |\n| savings | Returns recommendations ordered by 'savings' property |\n| status | Returns recommendations ordered by the status as filtered: one without a status as active, realized among the others |\n| incidentID | Returns recommendations ordered by 'incidentID' property |\n| createdAt | Returns recommendations ordered by 'createdAt' property |\n| updatedAt | Returns recommendations ordered by 'updatedAt' property |\n| source | Returns recommendations ordered by 'source' property |\n| id | Returns recommendations ordered by 'id' property |\n| quantityToPurchase | Returns recommendations ordered by 'quantityToPurchase' property |\n| statusReason | Returns recommendations ordered by 'statusReason' property |\n| statusUpdatedAt | Returns recommendations ordered by 'statusUpdatedAt' property |\n| snoozedTargetDate | Returns recommendations ordered by 'snoozedTargetDate' property |\n| ruleBasedDimensions.\u003ckey\u003e | Returns recommendations ordered by the value of the rule-based dimension \u003ckey\u003e |\n| customTagDimensions.\u003ckey\u003e | Returns recommendations ordered by the value of the tag dimension \u003ckey\u003e |\n| billingCenterName | Returns recommendations ordered by the name of the billing center they are listed under (the Cost Center column) |\n| tags | Returns recommendations ordered by their tags joined with ', ' as the Tags column shows them ('' for none) |\n| detailsExtended.\u003ckey\u003e | Returns recommendations ordered by the value of the 'detailsExtended' entry \u003ckey\u003e. Requires view=extended, otherwise the request fails with a 400 error |\n\n### Notes\n- The orderBy is a query parameter. While it needs to be URL-encoded, examples here are provided pre-URL-encoding for clarity.\n- Multiple expressions can be comma separated.\n- All orderBy fields support two types of order: \"asc\" (ascending) and \"desc\" (descending), \"asc\" will be used if no one is specified.\n\n### Examples\n| Example | Description |\n| -------------------------- | ------------------------------------------------------------------- |\n| savings | Order recommendations by savings ascending |\n| savings desc | Order recommendations by savings descending |\n| vendor, savings desc | Order recommendations by vendor ascending, then by savings descending |\n", + "name": "orderBy" + }, + { + "flag": "columns", + "source": "flag", + "in": "query", + "type": "array", + "required": true, + "enum": null, + "schema": { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "description": "The columns of the file, in order, each as \u003cfield\u003e:\u003cheader\u003e: the field to write and the text of its header.\nEverything after the first ':' is the header.\n### Supported Fields\n| Field | Value |\n| ------------------------- | --------------------------------------------------------------------------------------------- |\n| id, recommendation, type, policySet, source, savings, status, snoozedTargetDate, statusReason, statusUpdatedAt, service, resourceType, resourceID, resourceGroup, region, quantityToPurchase, accountName, accountID, vendor, databaseEngine, incidentID, createdAt, updatedAt, billingCenterID | The field of the recommendation, as in the paged list |\n| billingCenterName | The name of the billing center of the recommendation |\n| tags | The tags joined with ', ' |\n| detailsExtended.\u003ckey\u003e | The value of the 'detailsExtended' entry \u003ckey\u003e |\n| ruleBasedDimensions.\u003ckey\u003e | The value of the rule-based dimension \u003ckey\u003e |\n| customTagDimensions.\u003ckey\u003e | The value of the tag dimension \u003ckey\u003e |\n| recommendationExportDetails | For the Snowflake and Databricks policy sets, the 'detailsExtended' entries as 'label = value' joined with ', '; '-' for the others |\n\n### Notes\n- Values are written as stored: numbers unformatted, dates in ISO 8601, an empty cell for no value.\n", + "name": "columns" + } + ], + "bodyFlags": [] + }, + { + "operationId": "OptimaRecommendations_Recommendations_groupTree", + "command": [ + "recommendations", + "groups" + ], + "method": "GET", + "path": "/recommendations/orgs/{orgId}/recommendations/groups", + "tag": "Recommendations", + "service": "optima_recommendations", + "resource": "recommendation-groups", + "action": "list", + "summary": "Group recommendations into a tree", + "description": "Groups recommendations into a tree, one level per `groupBy` field, with the number of recommendations and the total savings of every group.\nThe recommendations are selected by `filter`, in the same way as for the paged list, and the same billing center rules apply: User must have the 'optima:recommendation:index' privilege on every billing center the filter's billingCenterID clause(s) select with eq/in. If it selects none, the request covers every billing center the user can access: the whole org for a user with org-level access, otherwise the billing centers they have been granted (403 if none). Results are always confined to the billing centers the call was authorized for, whatever else the filter says.\nWhen `groupBy` includes billingCenterID, each recommendation is grouped under the authorized billing center it belongs to.\n\n**Required security scopes for GlobalSession**:\n * `common:org:affiliated+common:org:own`", + "destructive": false, + "paginated": false, + "responseEnvelope": "none", + "params": [ + { + "flag": "org-id", + "source": "config", + "in": "path", + "type": "integer", + "required": true, + "enum": null, + "schema": { + "type": "integer" + }, + "description": "The organization ID", + "name": "orgId" + }, + { + "flag": "filter", + "source": "flag", + "in": "query", + "type": "string", + "required": false, + "enum": null, + "schema": { + "type": "string" + }, + "description": "Optional filter for returning recommendations matching specific criteria.\n### Supported Filter Keys\n| Filter | Type | Example | Description |\n| --------------------- | ------ | ------------------------------------------------- | ------------------------------------------------------------------------------------ |\n| billingCenterID | string | billingCenterID in ['bc1', 'bc2'] | Returns recommendations under the billing centers bc1 or bc2, including descendants |\n| billingCenterName | string | billingCenterName co 'prod' | Returns recommendations listed under a billing center (the Cost Center column) whose name contains 'prod'; eq, ne, in and co only |\n| recommendation | string | recommendation co 'Delete' | Returns recommendations with 'recommendation' containing 'Delete' |\n| type | string | type eq 'Usage Reduction' | Returns recommendations of the given type |\n| vendor | string | vendor in ['AWS', 'Azure'] | Returns recommendations for either AWS or Azure |\n| policySet | string | policySet eq 'Unused Volumes' | Returns recommendations of the given policy set |\n| accountID | string | accountID eq '123456789012' | Returns recommendations for the given cloud account ID |\n| accountName | string | accountName co 'prod' | Returns recommendations for accounts with a name containing 'prod' |\n| resourceGroup | string | resourceGroup eq 'rg-main' | Returns recommendations for the given resource group |\n| region | string | region in ['us-east-1', 'eu-west-1'] | Returns recommendations in either region |\n| service | string | service eq 'EC2' | Returns recommendations for the given service |\n| databaseEngine | string | databaseEngine eq 'postgres' | Returns recommendations for the given database engine |\n| resourceType | string | resourceType eq 'm5.large' | Returns recommendations for the given resource type |\n| resourceID | string | resourceID eq 'i-0abc123' | Returns recommendations for the given resource ID |\n| savings | float | savings gt 100 | Returns recommendations with savings greater than 100 |\n| status | string | status in ['active', 'snoozed'] | Returns recommendations with the given statuses (active, snoozed, rejected, realized) |\n| incidentID | string | incidentID eq '5b06ead5e0dacc007058c784' | Returns recommendations of the given policy incident |\n| createdAt | time | createdAt gt '2022-05-20T00:00:00Z' | Returns recommendations created after 2022-05-20 |\n| updatedAt | time | updatedAt lt '2020-01-01T00:00:00Z' | Returns recommendations updated before 2020-01-01 |\n| detailsExtended.\u003ckey\u003e | string | detailsExtended.instanceFamily eq 'm5' | Returns recommendations whose 'detailsExtended' entry \u003ckey\u003e matches the value |\n| ruleBasedDimensions.\u003ckey\u003e | string | ruleBasedDimensions.rbd_bc eq 'bc1' | Returns recommendations whose rule-based dimension \u003ckey\u003e matches the value |\n| source | string | source eq 'AWS Trusted Advisor' | Returns recommendations from the given source |\n| id | string | id in ['5f1b...', '5f1c...'] | Returns the recommendations with the given IDs |\n| quantityToPurchase | float | quantityToPurchase ge 2 | Returns recommendations with a number to purchase of at least 2; none counts as 0, as the list shows it |\n| statusReason | string | statusReason co 'not needed' | Returns recommendations whose status reason (description) contains 'not needed' |\n| statusUpdatedAt | time | statusUpdatedAt gt '2026-01-01T00:00:00Z' | Returns recommendations whose status changed after 2026-01-01 |\n| snoozedTargetDate | time | snoozedTargetDate lt '2026-12-01T00:00:00Z' | Returns recommendations snoozed until before 2026-12-01 |\n| customTagDimensions.\u003ckey\u003e | string | customTagDimensions.owner eq 'team-a' | Returns recommendations whose tag dimension \u003ckey\u003e matches the value |\n| tags | string | tags eq 'env=prod, team=a' | eq/ne/in compare the whole set of tags, joined with ', ' as groupBy tags shows it ('' for none); co finds a tag among them |\n\n### Supported Operators\n- **in** - Checks if the field contains a specified value within a list.\n- **eq** - Checks if the field's value is equal to the specified value.\n- **ne** - Checks if the field's value is not equal to the specified value.\n- **co** - Checks if the field contains the specified substring.\n- **ex** - Checks whether the field has a value: resourceGroup ex true returns the recommendations that have one, resourceGroup ex false those that have none.\n- **and, or** - Logical operators used to combine multiple conditions. 'and' binds tighter than 'or' (a or b and c means a or (b and c)); use parentheses to group. Two conditions must always be joined by one of them.\n- **not** - Negates the operator that follows it, e.g. status not in ['rejected'].\n- **lt, gt, le, ge** - Relational operators used to compare the field's value against a specified value. They check for less than, greater than, less than or equal to, and greater than or equal to conditions, respectively.\n\n### Notes\n- The filter is a query parameter. While it needs to be URL-encoded, examples here are provided pre-URL-encoding for clarity.\n- A recommendation with no status (for example a Rate Reduction) counts as 'active'.\n- Without a condition on status, recommendations of every status except 'realized' are returned. 'realized' recommendations are returned only when the status condition names them, e.g. status in ['active', 'realized']; excluding a status, e.g. status ne 'rejected', does not.\n- The status key supports only the eq, ne, in, co and not operators; co matches the statuses that contain the text, e.g. status co 'act' is status in ['active']. Anything else is rejected with a 400 error.\n- co applies to text fields only: savings, quantityToPurchase, createdAt, updatedAt, statusUpdatedAt and snoozedTargetDate are compared with eq, ne, gt, ge, lt and le.\n- Combine the status condition with conditions on other fields using 'and', e.g. savings gt 5 and (status eq 'realized' or status eq 'active'). An 'or' between a status condition naming 'realized' and a condition on another field also lets that condition match realized recommendations.\n- Results are always confined to the billing centers the user is authorized for, whatever billingCenterID clauses the filter contains.\n- A detailsExtended.\u003ckey\u003e value is stored as a number or as a string: eq, ne and in with a value that reads as a number match both.\n\n### Examples\n| Example | Description |\n| ----------------------------------------------------------- | -------------------------------------------------------------------- |\n| billingCenterID in ['bc1'] and status in ['active'] | Find active recommendations under billing center 'bc1' |\n| vendor eq 'AWS' and savings gt 100 | Find AWS recommendations with savings greater than 100 |\n| region eq 'us-east-1' or region eq 'eu-west-1' | Find recommendations in either region |\n| accountName co 'prod' and status not eq 'rejected' | Find recommendations for prod accounts that are not rejected |\n| createdAt gt '2022-05-20T00:00:00Z' and policySet eq 'Idle' | Find recommendations of a policy set created after 2022-05-20 |\n", + "name": "filter" + }, + { + "flag": "group-by", + "source": "flag", + "in": "query", + "type": "string", + "required": true, + "enum": null, + "schema": { + "type": "string" + }, + "description": "Comma separated fields to group the recommendations by. Each field adds one level to the tree, in the given order.\n### Supported Group by Fields\n| Field | Description |\n| --------------- | --------------------------------------------------------------------------------------- |\n| billingCenterID | Groups by the authorized billing center the recommendation belongs to |\n| billingCenterName | Groups by the name of that billing center (the Cost Center column) |\n| policySet | Groups by the policy set |\n| vendor | Groups by the cloud vendor |\n| accountID | Groups by the cloud account ID |\n| accountName | Groups by the cloud account name |\n| resourceGroup | Groups by the resource group |\n| region | Groups by the region |\n| service | Groups by the service |\n| databaseEngine | Groups by the database engine |\n| resourceType | Groups by the resource type |\n| type | Groups by the recommendation type |\n| status | Groups by the status (active, snoozed, rejected, realized) |\n| recommendation | Groups by the recommendation text |\n| source | Groups by the source of the recommendation |\n| resourceID | Groups by the resource ID |\n| tags | Groups by the whole set of tags, joined with ', ' ('' for none) |\n| detailsExtended.\u003ckey\u003e | Groups by the value of the 'detailsExtended' entry \u003ckey\u003e, as text |\n| ruleBasedDimensions.\u003ckey\u003e | Groups by the value of the rule-based dimension \u003ckey\u003e |\n| customTagDimensions.\u003ckey\u003e | Groups by the value of the tag dimension \u003ckey\u003e |\n| statusReason | Groups by the status reason (description) |\n| quantityToPurchase | Groups by the number to purchase, none as 0 |\n\n### Notes\n- The groupBy is a query parameter. While it needs to be URL-encoded, examples here are provided pre-URL-encoding for clarity.\n- A field can be given only once.\n- A group's recommendations are those of the paginated list filtered by the group's values, e.g. tags eq 'env=prod, team=a'.\n- The '' group holds the recommendations with no value: filter it with (\u003cfield\u003e eq '' or \u003cfield\u003e ex false), tags eq '' for tags. A recommendation with no number to purchase is in the quantityToPurchase group 0, as the list shows it.\n- The result is limited to 1000 groups (distinct combinations of the grouped values, that is the last level of the tree). A request that would return more fails with a 400 error: narrow the filter or group by fewer or less specific fields.\n- Groups on every level are ordered by the number of recommendations, largest first.\n\n### Examples\n| Example | Description |\n| ------------------- | -------------------------------------------------------------- |\n| vendor | One level: a group per vendor |\n| policySet,vendor | Two levels: a group per policy set, with a group per vendor in it |\n", + "name": "groupBy" + } + ], + "bodyFlags": [], + "responseSchema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsGroupTreeResponseBody" + } + }, { "operationId": "OptimaRecommendations_Recommendations_index", "command": [ @@ -35937,7 +36217,7 @@ }, "type": "array" }, - "description": "Recommendation statuses to get", + "description": "Recommendation statuses to get. Some values, such as realized, are API-level projected states rather than persisted DB values.", "name": "statuses" } ], @@ -35946,6 +36226,169 @@ "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsRecommendationResultResponseCollection" } }, + { + "operationId": "OptimaRecommendations_Recommendations_recommendationsPaged", + "command": [ + "recommendations", + "paged" + ], + "method": "GET", + "path": "/recommendations/orgs/{orgId}/recommendations/paged", + "tag": "Recommendations", + "service": "optima_recommendations", + "resource": "recommendation-paged", + "action": "list", + "summary": "List recommendations (filtered, sorted, cursor-paginated)", + "description": "List recommendations, filtered and sorted via a generic filter/orderBy expression, cursor-paginated.\nbillingCenterID and status scoping are done via `filter` (e.g. `billingCenterID in ['bc1'] and status in ['active']`), not separate discrete parameters, matching explorer_service's own contract for this endpoint.\nUser must have the 'optima:recommendation:index' privilege on every billing center the filter's billingCenterID clause(s) select with eq/in. If it selects none (no billingCenterID clause, or only exclusions such as ne/not), the request covers every billing center the user can access: the whole org for a user with org-level access, otherwise the billing centers they have been granted (403 if none). Results are always confined to the billing centers the call was authorized for, whatever else the filter says.\n\n**Required security scopes for GlobalSession**:\n * `common:org:affiliated+common:org:own`", + "destructive": false, + "paginated": true, + "responseEnvelope": "values", + "params": [ + { + "flag": "org-id", + "source": "config", + "in": "path", + "type": "integer", + "required": true, + "enum": null, + "schema": { + "type": "integer" + }, + "description": "The organization ID", + "name": "orgId" + }, + { + "flag": "view", + "source": "flag", + "in": "query", + "type": "string", + "required": false, + "enum": [ + "default", + "extended" + ], + "schema": { + "default": "default", + "enum": [ + "default", + "extended" + ], + "type": "string" + }, + "description": "An optional parameter that controls the level of detail returned about policy violation data. Depending on it the data is returned in the `details` or `detailsExtended` field", + "name": "view" + }, + { + "flag": "filter", + "source": "flag", + "in": "query", + "type": "string", + "required": false, + "enum": null, + "schema": { + "type": "string" + }, + "description": "Optional filter for returning recommendations matching specific criteria.\n### Supported Filter Keys\n| Filter | Type | Example | Description |\n| --------------------- | ------ | ------------------------------------------------- | ------------------------------------------------------------------------------------ |\n| billingCenterID | string | billingCenterID in ['bc1', 'bc2'] | Returns recommendations under the billing centers bc1 or bc2, including descendants |\n| billingCenterName | string | billingCenterName co 'prod' | Returns recommendations listed under a billing center (the Cost Center column) whose name contains 'prod'; eq, ne, in and co only |\n| recommendation | string | recommendation co 'Delete' | Returns recommendations with 'recommendation' containing 'Delete' |\n| type | string | type eq 'Usage Reduction' | Returns recommendations of the given type |\n| vendor | string | vendor in ['AWS', 'Azure'] | Returns recommendations for either AWS or Azure |\n| policySet | string | policySet eq 'Unused Volumes' | Returns recommendations of the given policy set |\n| accountID | string | accountID eq '123456789012' | Returns recommendations for the given cloud account ID |\n| accountName | string | accountName co 'prod' | Returns recommendations for accounts with a name containing 'prod' |\n| resourceGroup | string | resourceGroup eq 'rg-main' | Returns recommendations for the given resource group |\n| region | string | region in ['us-east-1', 'eu-west-1'] | Returns recommendations in either region |\n| service | string | service eq 'EC2' | Returns recommendations for the given service |\n| databaseEngine | string | databaseEngine eq 'postgres' | Returns recommendations for the given database engine |\n| resourceType | string | resourceType eq 'm5.large' | Returns recommendations for the given resource type |\n| resourceID | string | resourceID eq 'i-0abc123' | Returns recommendations for the given resource ID |\n| savings | float | savings gt 100 | Returns recommendations with savings greater than 100 |\n| status | string | status in ['active', 'snoozed'] | Returns recommendations with the given statuses (active, snoozed, rejected, realized) |\n| incidentID | string | incidentID eq '5b06ead5e0dacc007058c784' | Returns recommendations of the given policy incident |\n| createdAt | time | createdAt gt '2022-05-20T00:00:00Z' | Returns recommendations created after 2022-05-20 |\n| updatedAt | time | updatedAt lt '2020-01-01T00:00:00Z' | Returns recommendations updated before 2020-01-01 |\n| detailsExtended.\u003ckey\u003e | string | detailsExtended.instanceFamily eq 'm5' | Returns recommendations whose 'detailsExtended' entry \u003ckey\u003e matches the value |\n| ruleBasedDimensions.\u003ckey\u003e | string | ruleBasedDimensions.rbd_bc eq 'bc1' | Returns recommendations whose rule-based dimension \u003ckey\u003e matches the value |\n| source | string | source eq 'AWS Trusted Advisor' | Returns recommendations from the given source |\n| id | string | id in ['5f1b...', '5f1c...'] | Returns the recommendations with the given IDs |\n| quantityToPurchase | float | quantityToPurchase ge 2 | Returns recommendations with a number to purchase of at least 2; none counts as 0, as the list shows it |\n| statusReason | string | statusReason co 'not needed' | Returns recommendations whose status reason (description) contains 'not needed' |\n| statusUpdatedAt | time | statusUpdatedAt gt '2026-01-01T00:00:00Z' | Returns recommendations whose status changed after 2026-01-01 |\n| snoozedTargetDate | time | snoozedTargetDate lt '2026-12-01T00:00:00Z' | Returns recommendations snoozed until before 2026-12-01 |\n| customTagDimensions.\u003ckey\u003e | string | customTagDimensions.owner eq 'team-a' | Returns recommendations whose tag dimension \u003ckey\u003e matches the value |\n| tags | string | tags eq 'env=prod, team=a' | eq/ne/in compare the whole set of tags, joined with ', ' as groupBy tags shows it ('' for none); co finds a tag among them |\n\n### Supported Operators\n- **in** - Checks if the field contains a specified value within a list.\n- **eq** - Checks if the field's value is equal to the specified value.\n- **ne** - Checks if the field's value is not equal to the specified value.\n- **co** - Checks if the field contains the specified substring.\n- **ex** - Checks whether the field has a value: resourceGroup ex true returns the recommendations that have one, resourceGroup ex false those that have none.\n- **and, or** - Logical operators used to combine multiple conditions. 'and' binds tighter than 'or' (a or b and c means a or (b and c)); use parentheses to group. Two conditions must always be joined by one of them.\n- **not** - Negates the operator that follows it, e.g. status not in ['rejected'].\n- **lt, gt, le, ge** - Relational operators used to compare the field's value against a specified value. They check for less than, greater than, less than or equal to, and greater than or equal to conditions, respectively.\n\n### Notes\n- The filter is a query parameter. While it needs to be URL-encoded, examples here are provided pre-URL-encoding for clarity.\n- A recommendation with no status (for example a Rate Reduction) counts as 'active'.\n- Without a condition on status, recommendations of every status except 'realized' are returned. 'realized' recommendations are returned only when the status condition names them, e.g. status in ['active', 'realized']; excluding a status, e.g. status ne 'rejected', does not.\n- The status key supports only the eq, ne, in, co and not operators; co matches the statuses that contain the text, e.g. status co 'act' is status in ['active']. Anything else is rejected with a 400 error.\n- co applies to text fields only: savings, quantityToPurchase, createdAt, updatedAt, statusUpdatedAt and snoozedTargetDate are compared with eq, ne, gt, ge, lt and le.\n- Combine the status condition with conditions on other fields using 'and', e.g. savings gt 5 and (status eq 'realized' or status eq 'active'). An 'or' between a status condition naming 'realized' and a condition on another field also lets that condition match realized recommendations.\n- Results are always confined to the billing centers the user is authorized for, whatever billingCenterID clauses the filter contains.\n- A detailsExtended.\u003ckey\u003e value is stored as a number or as a string: eq, ne and in with a value that reads as a number match both.\n\n### Examples\n| Example | Description |\n| ----------------------------------------------------------- | -------------------------------------------------------------------- |\n| billingCenterID in ['bc1'] and status in ['active'] | Find active recommendations under billing center 'bc1' |\n| vendor eq 'AWS' and savings gt 100 | Find AWS recommendations with savings greater than 100 |\n| region eq 'us-east-1' or region eq 'eu-west-1' | Find recommendations in either region |\n| accountName co 'prod' and status not eq 'rejected' | Find recommendations for prod accounts that are not rejected |\n| createdAt gt '2022-05-20T00:00:00Z' and policySet eq 'Idle' | Find recommendations of a policy set created after 2022-05-20 |\n", + "name": "filter" + }, + { + "flag": "order-by", + "source": "flag", + "in": "query", + "type": "string", + "required": false, + "enum": null, + "schema": { + "type": "string" + }, + "description": "Optional order by for returning recommendations in a specific order.\n### Supported Order by Keys\n| Key | Description |\n| -------------------- | ------------------------------------------------------------------------------- |\n| recommendation | Returns recommendations ordered by 'recommendation' property |\n| type | Returns recommendations ordered by 'type' property |\n| vendor | Returns recommendations ordered by 'vendor' property |\n| policySet | Returns recommendations ordered by 'policySet' property |\n| accountID | Returns recommendations ordered by 'accountID' property |\n| accountName | Returns recommendations ordered by 'accountName' property |\n| resourceGroup | Returns recommendations ordered by 'resourceGroup' property |\n| region | Returns recommendations ordered by 'region' property |\n| service | Returns recommendations ordered by 'service' property |\n| databaseEngine | Returns recommendations ordered by 'databaseEngine' property |\n| resourceType | Returns recommendations ordered by 'resourceType' property |\n| resourceID | Returns recommendations ordered by 'resourceID' property |\n| savings | Returns recommendations ordered by 'savings' property |\n| status | Returns recommendations ordered by the status as filtered: one without a status as active, realized among the others |\n| incidentID | Returns recommendations ordered by 'incidentID' property |\n| createdAt | Returns recommendations ordered by 'createdAt' property |\n| updatedAt | Returns recommendations ordered by 'updatedAt' property |\n| source | Returns recommendations ordered by 'source' property |\n| id | Returns recommendations ordered by 'id' property |\n| quantityToPurchase | Returns recommendations ordered by 'quantityToPurchase' property |\n| statusReason | Returns recommendations ordered by 'statusReason' property |\n| statusUpdatedAt | Returns recommendations ordered by 'statusUpdatedAt' property |\n| snoozedTargetDate | Returns recommendations ordered by 'snoozedTargetDate' property |\n| ruleBasedDimensions.\u003ckey\u003e | Returns recommendations ordered by the value of the rule-based dimension \u003ckey\u003e |\n| customTagDimensions.\u003ckey\u003e | Returns recommendations ordered by the value of the tag dimension \u003ckey\u003e |\n| billingCenterName | Returns recommendations ordered by the name of the billing center they are listed under (the Cost Center column) |\n| tags | Returns recommendations ordered by their tags joined with ', ' as the Tags column shows them ('' for none) |\n| detailsExtended.\u003ckey\u003e | Returns recommendations ordered by the value of the 'detailsExtended' entry \u003ckey\u003e. Requires view=extended, otherwise the request fails with a 400 error |\n\n### Notes\n- The orderBy is a query parameter. While it needs to be URL-encoded, examples here are provided pre-URL-encoding for clarity.\n- Multiple expressions can be comma separated.\n- All orderBy fields support two types of order: \"asc\" (ascending) and \"desc\" (descending), \"asc\" will be used if no one is specified.\n\n### Examples\n| Example | Description |\n| -------------------------- | ------------------------------------------------------------------- |\n| savings | Order recommendations by savings ascending |\n| savings desc | Order recommendations by savings descending |\n| vendor, savings desc | Order recommendations by vendor ascending, then by savings descending |\n", + "name": "orderBy" + }, + { + "flag": "limit", + "source": "flag", + "in": "query", + "type": "integer", + "required": false, + "enum": null, + "schema": { + "type": "integer" + }, + "description": "Custom pagination limit to be used.", + "name": "limit" + }, + { + "flag": "skip-token", + "source": "pagination", + "in": "query", + "type": "string", + "required": false, + "enum": null, + "schema": { + "type": "string" + }, + "description": "An opaque token to be provided when requesting a subsequent page after receiving a partial response. \nPartial responses will include a \"nextPage\" attribute in their response body, which contains the URL of the next page including the appropriate skipToken.", + "name": "skipToken" + } + ], + "bodyFlags": [], + "responseSchema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsRecommendationsPagedResponseBody" + } + }, + { + "operationId": "OptimaRecommendations_Recommendations_savingsSummary", + "command": [ + "recommendations", + "savings-summary" + ], + "method": "GET", + "path": "/recommendations/orgs/{orgId}/recommendations/savings-summary", + "tag": "Recommendations", + "service": "optima_recommendations", + "resource": "recommendation-savings-summary", + "action": "list", + "summary": "Summary data for the Optimization overview page widgets", + "description": "Summary data for the Optimization overview page widgets (Total Potential Savings, Rate Reduction Savings, Usage Reduction Savings).\nUser must have the 'optima:recommendation:index' privilege on the org or on the specified billing center(s) to make this call.\n\n**Required security scopes for GlobalSession**:\n * `common:org:affiliated+common:org:own`", + "destructive": false, + "paginated": false, + "responseEnvelope": "none", + "params": [ + { + "flag": "org-id", + "source": "config", + "in": "path", + "type": "integer", + "required": true, + "enum": null, + "schema": { + "type": "integer" + }, + "description": "The organization ID", + "name": "orgId" + }, + { + "flag": "billing-center-i-ds", + "source": "flag", + "in": "query", + "type": "array", + "required": false, + "enum": null, + "schema": { + "items": { + "type": "string" + }, + "type": "array" + }, + "description": "IDs of BillingCenters to get the savings summary for. It is not allowed for any of the BillingCenterIDs to be an ancestor of another specified BillingCenterID.", + "name": "billingCenterIDs" + } + ], + "bodyFlags": [], + "responseSchema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsSavingsSummaryResponseBody" + } + }, { "operationId": "OptimaRecommendations_Recommendations_updateStatus", "command": [ @@ -35979,6 +36422,7 @@ } ], "bodyFlags": [ + "generation-id", "id", "snoozed-target-date", "status", @@ -35992,13 +36436,24 @@ ] }, "requestExample": { + "generationId": "abc123", "id": "676f0f2c838a081da3f7cd61_vol-06fa6937d41c139eb", "snoozedTargetDate": "2025-01-30", - "status": "realized", + "status": "snoozed", "statusReason": "Recommendation isn't relevant right now" }, "requestExampleSource": "synthesized", "bodyFields": [ + { + "flag": "generation-id", + "property": "generationId", + "required": false, + "schema": { + "description": "Generation ID of the hub-backed recommendation. When present, the status update is applied to the hub DB.", + "example": "abc123", + "type": "string" + } + }, { "flag": "id", "property": "id", @@ -36028,10 +36483,9 @@ "enum": [ "active", "snoozed", - "rejected", - "realized" + "rejected" ], - "example": "realized", + "example": "snoozed", "type": "string" } }, @@ -57099,8 +57553,8 @@ "service": "vis", "resource": "device-delete-submit", "action": "action", - "summary": "delete the device evidence for the given device ids using the query", - "description": "Deletes device evidence for the specified device IDs and datasource selectors.", + "summary": "Delete device evidence", + "description": "Submits a request to delete device evidence for the specified device IDs.\n\nA datasource is included if it matches any datasource selector. If no datasource selectors are provided, evidence from every datasource associated with the specified devices is included.\n\nSubmitting a deletion request does not guarantee that all selected evidence will be deleted because inventory may change while the request is processed. If a device remains active in the environment, its evidence may reappear after new inventory data is collected.\n\nRepeating a deletion request is allowed and does not return an error when the selected evidence has already been deleted.\n\n### Client guidance\n* Submit no more than 500 unique device IDs per request. This recommendation is not enforced, but larger requests provide no processing benefit and may increase latency or timeout risk.\n* Split larger workloads into batches and process one batch at a time per organization. Use the same datasource selectors for every batch in one logical operation.\n* There is currently no specific concurrency limit or hard cap in place. We recommend that customers test and tune their request volume based on their network conditions, performance requirements, and business needs.\n* The API does not automatically retry failed deletion requests. Clients must not automatically retry timed-out requests because inventory may change and the original deletion may already have been submitted.", "destructive": false, "paginated": false, "responseEnvelope": "none", @@ -57132,28 +57586,11 @@ "responseSchema": { "example": [ { - "count": 150, - "datasourceId": "4e0e3471-ccbc-41c7-a21e-c384f2eb5669", - "datasourceName": "SCCM_PROD_AP", - "datasourceType": "SCCM" - }, - { - "count": 150, - "datasourceId": "4e0e3471-ccbc-41c7-a21e-c384f2eb5669", - "datasourceName": "SCCM_PROD_AP", - "datasourceType": "SCCM" - }, - { - "count": 150, - "datasourceId": "4e0e3471-ccbc-41c7-a21e-c384f2eb5669", - "datasourceName": "SCCM_PROD_AP", - "datasourceType": "SCCM" - }, - { - "count": 150, - "datasourceId": "4e0e3471-ccbc-41c7-a21e-c384f2eb5669", - "datasourceName": "SCCM_PROD_AP", - "datasourceType": "SCCM" + "count": 42, + "datasourceId": "a8d416e5-7212-4a9a-93f3-0b8602ad06f4", + "datasourceName": "ServiceNow Import", + "datasourceType": "ServiceNow", + "kind": "vis:device-deletion-summary" } ], "items": { @@ -57164,18 +57601,12 @@ "requestExample": { "datasourceSelectors": [ { - "field": "type", - "value": "SCCM" - }, - { - "field": "type", - "value": "SCCM" + "field": "id", + "value": "a8d416e5-7212-4a9a-93f3-0b8602ad06f4" } ], "deviceIds": [ - "Id suscipit.", - "Explicabo dolore corrupti esse.", - "Quia iste velit doloremque quisquam." + "4e0e3471-ccbc-41c7-a21e-c384f2eb5669" ] }, "requestExampleSource": "upstream", @@ -57185,15 +57616,12 @@ "property": "deviceIds", "required": true, "schema": { - "description": "List of device IDs to delete", + "description": "Device IDs whose evidence should be included. Send no more than 500 unique IDs per request; this recommendation is not enforced by the API.", "example": [ - "Quasi cum itaque fugiat.", - "Voluptatibus aliquam iste ipsa.", - "Aliquid nam.", - "Enim laboriosam tempore." + "4e0e3471-ccbc-41c7-a21e-c384f2eb5669" ], "items": { - "example": "Blanditiis fugiat magni.", + "example": "Perferendis ullam et sunt accusantium.", "type": "string" }, "type": "array" @@ -57218,8 +57646,8 @@ "service": "vis", "resource": "device-delete-estimate", "action": "get", - "summary": "Estimate device evidence that would be deleted using the query", - "description": "Returns an estimated number of device evidences associated with the datasource data that would be deleted using the query.", + "summary": "Estimate device evidence deletion", + "description": "Estimates the device evidence that would be deleted for the specified device IDs, grouped by datasource.\n\nA datasource is included if it matches any datasource selector. If no datasource selectors are provided, evidence from every datasource associated with the specified devices is included.\n\nThe estimate reflects the inventory available when the request is made. Because inventory may change, it does not guarantee that a later request will delete the same evidence.\n\n### Client guidance\n* Submit no more than 500 unique device IDs per request. This recommendation is not enforced, but larger requests provide no processing benefit and may increase latency or timeout risk.\n* Split larger workloads into batches and process them sequentially. Use the same datasource selectors for every batch in one logical operation.\n* There is currently no specific concurrency limit or hard cap in place. We recommend that customers test and tune their request volume based on their network conditions, performance requirements, and business needs.\n* The API does not automatically retry failed estimate requests. Clients may retry transient failures using exponential backoff with jitter.", "destructive": false, "paginated": false, "responseEnvelope": "none", @@ -57254,13 +57682,15 @@ "count": 150, "datasourceId": "4e0e3471-ccbc-41c7-a21e-c384f2eb5669", "datasourceName": "SCCM_PROD_AP", - "datasourceType": "SCCM" + "datasourceType": "SCCM", + "kind": "vis:device-deletion-summary" }, { - "count": 150, - "datasourceId": "4e0e3471-ccbc-41c7-a21e-c384f2eb5669", - "datasourceName": "SCCM_PROD_AP", - "datasourceType": "SCCM" + "count": 42, + "datasourceId": "a8d416e5-7212-4a9a-93f3-0b8602ad06f4", + "datasourceName": "ServiceNow Import", + "datasourceType": "ServiceNow", + "kind": "vis:device-deletion-summary" } ], "items": { @@ -57271,19 +57701,12 @@ "requestExample": { "datasourceSelectors": [ { - "field": "type", - "value": "SCCM" - }, - { - "field": "type", - "value": "SCCM" + "field": "id", + "value": "a8d416e5-7212-4a9a-93f3-0b8602ad06f4" } ], "deviceIds": [ - "Quo nesciunt fuga laborum quam.", - "Corrupti atque quibusdam est sit maiores fugit.", - "Similique eum ratione accusantium ea id ut.", - "Culpa qui aspernatur neque." + "4e0e3471-ccbc-41c7-a21e-c384f2eb5669" ] }, "requestExampleSource": "upstream", @@ -57293,15 +57716,12 @@ "property": "deviceIds", "required": true, "schema": { - "description": "List of device IDs to delete", + "description": "Device IDs whose evidence should be included. Send no more than 500 unique IDs per request; this recommendation is not enforced by the API.", "example": [ - "Quasi cum itaque fugiat.", - "Voluptatibus aliquam iste ipsa.", - "Aliquid nam.", - "Enim laboriosam tempore." + "4e0e3471-ccbc-41c7-a21e-c384f2eb5669" ], "items": { - "example": "Blanditiis fugiat magni.", + "example": "Perferendis ullam et sunt accusantium.", "type": "string" }, "type": "array" @@ -71909,7 +72329,7 @@ "type": "object" }, "Divnt_AzureCostAndUsageModel": { - "description": "Azure Cost \u0026 Usage configuration.\nAccountType is declared here alongside BillingScope and scope-specific fields.\n\nBillingScope rules (validated in OnboardingCreateRequest):\n - EA (any scope) : EnrollmentId (optional)\n - MCA Billing Account: no extra fields required\n - MCA Billing Profile: BillingProfileIds (required list)\n - MCA Invoice : InvoiceSectionIds (required list)\n - CSP Billing Account: no extra fields required\n - CSP Billing Profile: BillingProfileIds (required list)\n - CSP Customer Tenant: CustomerTenantId (required)\n\nAlways optional:\n - ActualExportUrl, AmortizedExportUrl, EffectiveFrom", + "description": "Azure Cost \u0026 Usage configuration.\nAccountType is declared here alongside BillingScope and scope-specific fields.\n\nBillingScope rules (validated in OnboardingCreateRequest):\n - EA (any scope) : EnrollmentId (optional)\n - MCA Billing Account: no extra fields required\n - MCA Billing Profile: BillingProfileIds (required list)\n - MCA Invoice : InvoiceSectionIds (required list)\n - CSP Billing Account: no extra fields required\n - CSP Billing Profile: BillingProfileIds (required list)\n - CSP Customer Tenant: CustomerTenantId (required)\n - CSP Subscription: SubscriptionId, ActualExportUrl and AmortizedExportUrl (all required)\n\nOptional:\n - ActualExportUrl, AmortizedExportUrl, EffectiveFrom", "properties": { "ActualExportUrl": { "description": "Actual cost export URL.", @@ -71939,17 +72359,24 @@ "type": "array" }, "BillingScope": { - "description": "Billing scope. Required for MCA ('Billing Account', 'Billing Profile', 'Invoice') and CSP ('Billing Account', 'Billing Profile', 'Customer Tenant') account types.", + "description": "Billing scope. Required for MCA ('Billing Account', 'Billing Profile', 'Invoice') and CSP ('Billing Account', 'Billing Profile', 'Customer Tenant', 'Subscription') account types.", "enum": [ "Billing Account", "Billing Profile", "Invoice", - "Customer Tenant" + "Customer Tenant", + "Subscription" ], "nullable": true, "title": "Billingscope", "type": "string" }, + "CspSubscriptionId": { + "description": "Subscription ID - required for CSP + Subscription scope.", + "nullable": true, + "title": "Cspsubscriptionid", + "type": "string" + }, "CustomerTenantId": { "description": "Customer Tenant ID - required for CSP + Customer Tenant scope.", "nullable": true, @@ -72333,6 +72760,12 @@ "description": "Defines the allocation strategy and the destinations that receive the reallocated costs.", "example": { "destinations": [ + { + "dimensionId": "rbd_team", + "dimensionName": "Team", + "percentage": 50, + "value": "Orion" + }, { "dimensionId": "rbd_team", "dimensionName": "Team", @@ -72346,12 +72779,6 @@ "destinations": { "description": "The destinations that receive the reallocated costs.", "example": [ - { - "dimensionId": "rbd_team", - "dimensionName": "Team", - "percentage": 50, - "value": "Orion" - }, { "dimensionId": "rbd_team", "dimensionName": "Team", @@ -72473,6 +72900,11 @@ "percentage": 50, "value": "Orion" }, + { + "dimensionId": "rbd_team", + "percentage": 50, + "value": "Orion" + }, { "dimensionId": "rbd_team", "percentage": 50, @@ -72549,11 +72981,6 @@ "type": "equal", "value": "Usage" }, - { - "dimension": "chargeCategory", - "type": "equal", - "value": "Usage" - }, { "dimension": "chargeCategory", "type": "equal", @@ -72667,7 +73094,7 @@ "ruleName", "ruleId" ], - "example": "subAccountId", + "example": "billingCenterLevel4", "type": "string" }, "minItems": 1, @@ -72761,7 +73188,7 @@ "ruleName", "ruleId" ], - "example": "billingCenterLevel2", + "example": "planName", "type": "string" }, "type": "array" @@ -72790,44 +73217,15 @@ "billedCost": "12450.0000000000", "billingAccountId": "123456789012", "billingAccountName": "Acme Production", - "billingCenterLevel1": "Tenetur velit tenetur adipisci saepe rerum.", - "billingCenterLevel2": "Sunt sint nostrum sunt.", - "billingCenterLevel3": "Veniam dolores commodi officiis vero.", - "billingCenterLevel4": "Dolorum quos dignissimos aut illo dolores voluptates.", - "billingCenterLevel5": "Et qui voluptate aperiam.", - "billingCenterLevel6": "Repudiandae maiores atque accusantium.", - "billingCenterLevel7": "Aspernatur laborum harum neque.", - "billingCenterLevel8": "At sunt consequatur optio dignissimos.", - "billingCenterLevel9": "Accusamus dolor vitae et labore omnis quam.", - "chargeCategory": "Usage", - "customer": "2001", - "effectiveChange": "1120.0000000000", - "effectiveCost": "11200.0000000000", - "modifiedBilledCost": "13695.0000000000", - "modifiedEffectiveCost": "12320.0000000000", - "planName": "Premium Support", - "ruleId": "7d3f1a2b-4c5e-6789-abcd-ef0123456789", - "ruleName": "Premium Support Upcharge", - "ruleType": "upchargeDiscount", - "serviceCategory": "Compute", - "serviceName": "AmazonEC2", - "subAccountId": "987654321098", - "subAccountName": "acme-prod-us-east" - }, - { - "billedChange": "1245.0000000000", - "billedCost": "12450.0000000000", - "billingAccountId": "123456789012", - "billingAccountName": "Acme Production", - "billingCenterLevel1": "Tenetur velit tenetur adipisci saepe rerum.", - "billingCenterLevel2": "Sunt sint nostrum sunt.", - "billingCenterLevel3": "Veniam dolores commodi officiis vero.", - "billingCenterLevel4": "Dolorum quos dignissimos aut illo dolores voluptates.", - "billingCenterLevel5": "Et qui voluptate aperiam.", - "billingCenterLevel6": "Repudiandae maiores atque accusantium.", - "billingCenterLevel7": "Aspernatur laborum harum neque.", - "billingCenterLevel8": "At sunt consequatur optio dignissimos.", - "billingCenterLevel9": "Accusamus dolor vitae et labore omnis quam.", + "billingCenterLevel1": "Deserunt itaque dolor.", + "billingCenterLevel2": "Officia et tenetur.", + "billingCenterLevel3": "Rerum tenetur velit.", + "billingCenterLevel4": "Adipisci saepe rerum ea sunt.", + "billingCenterLevel5": "Nostrum sunt.", + "billingCenterLevel6": "Veniam dolores commodi officiis vero.", + "billingCenterLevel7": "Dolorum quos dignissimos aut illo dolores voluptates.", + "billingCenterLevel8": "Et qui voluptate aperiam.", + "billingCenterLevel9": "Repudiandae maiores atque accusantium.", "chargeCategory": "Usage", "customer": "2001", "effectiveChange": "1120.0000000000", @@ -72848,15 +73246,15 @@ "billedCost": "12450.0000000000", "billingAccountId": "123456789012", "billingAccountName": "Acme Production", - "billingCenterLevel1": "Tenetur velit tenetur adipisci saepe rerum.", - "billingCenterLevel2": "Sunt sint nostrum sunt.", - "billingCenterLevel3": "Veniam dolores commodi officiis vero.", - "billingCenterLevel4": "Dolorum quos dignissimos aut illo dolores voluptates.", - "billingCenterLevel5": "Et qui voluptate aperiam.", - "billingCenterLevel6": "Repudiandae maiores atque accusantium.", - "billingCenterLevel7": "Aspernatur laborum harum neque.", - "billingCenterLevel8": "At sunt consequatur optio dignissimos.", - "billingCenterLevel9": "Accusamus dolor vitae et labore omnis quam.", + "billingCenterLevel1": "Deserunt itaque dolor.", + "billingCenterLevel2": "Officia et tenetur.", + "billingCenterLevel3": "Rerum tenetur velit.", + "billingCenterLevel4": "Adipisci saepe rerum ea sunt.", + "billingCenterLevel5": "Nostrum sunt.", + "billingCenterLevel6": "Veniam dolores commodi officiis vero.", + "billingCenterLevel7": "Dolorum quos dignissimos aut illo dolores voluptates.", + "billingCenterLevel8": "Et qui voluptate aperiam.", + "billingCenterLevel9": "Repudiandae maiores atque accusantium.", "chargeCategory": "Usage", "customer": "2001", "effectiveChange": "1120.0000000000", @@ -72901,15 +73299,15 @@ "billedCost": "12450.0000000000", "billingAccountId": "123456789012", "billingAccountName": "Acme Production", - "billingCenterLevel1": "Ab est.", - "billingCenterLevel2": "Ab natus.", - "billingCenterLevel3": "Amet expedita inventore laboriosam voluptates quisquam quam.", - "billingCenterLevel4": "Amet sed exercitationem hic ut.", - "billingCenterLevel5": "Unde tenetur atque modi quis et.", - "billingCenterLevel6": "Ratione aut qui voluptas id assumenda modi.", - "billingCenterLevel7": "Nemo incidunt et.", - "billingCenterLevel8": "Iusto quia doloribus cumque distinctio vel.", - "billingCenterLevel9": "Nihil omnis.", + "billingCenterLevel1": "Neque nisi totam.", + "billingCenterLevel2": "Aut quod explicabo voluptates ut.", + "billingCenterLevel3": "Autem quia consequatur qui.", + "billingCenterLevel4": "Quia labore vitae ullam qui aut qui.", + "billingCenterLevel5": "Distinctio omnis.", + "billingCenterLevel6": "Corrupti iure.", + "billingCenterLevel7": "Saepe voluptas.", + "billingCenterLevel8": "Deserunt autem autem.", + "billingCenterLevel9": "Tenetur qui quas deserunt.", "chargeCategory": "Usage", "customer": "2001", "effectiveChange": "1120.0000000000", @@ -72948,47 +73346,47 @@ }, "billingCenterLevel1": { "description": "Billing center level 1 name", - "example": "Voluptatum sit iusto illum facilis vel velit.", + "example": "Minima maxime.", "type": "string" }, "billingCenterLevel2": { "description": "Billing center level 2 name", - "example": "Ut quos error vitae est perferendis corrupti.", + "example": "Sint ut sunt officiis perspiciatis porro et.", "type": "string" }, "billingCenterLevel3": { "description": "Billing center level 3 name", - "example": "Ut ad voluptatum libero ullam dolor.", + "example": "Aut iusto eligendi ullam quia quo aut.", "type": "string" }, "billingCenterLevel4": { "description": "Billing center level 4 name", - "example": "Cumque ex tenetur hic sed sequi.", + "example": "Nemo quo porro aut.", "type": "string" }, "billingCenterLevel5": { "description": "Billing center level 5 name", - "example": "Ipsa repellat in ratione illo dolores voluptatem.", + "example": "Nemo illum inventore laborum minima vel molestiae.", "type": "string" }, "billingCenterLevel6": { "description": "Billing center level 6 name", - "example": "Consequatur aut nulla fugit.", + "example": "Omnis veniam ullam.", "type": "string" }, "billingCenterLevel7": { "description": "Billing center level 7 name", - "example": "Voluptatem beatae qui consequatur fugit.", + "example": "Nihil et.", "type": "string" }, "billingCenterLevel8": { "description": "Billing center level 8 name", - "example": "Quae ad blanditiis.", + "example": "Reiciendis repellat nam.", "type": "string" }, "billingCenterLevel9": { "description": "Billing center level 9 name", - "example": "Veritatis atque autem rerum qui culpa assumenda.", + "example": "Recusandae ratione ut harum.", "type": "string" }, "chargeCategory": { @@ -73064,6 +73462,31 @@ }, "type": "object" }, + "FinopsBilling_AutomatedEdpProfile": { + "description": "Automated AWS EDP configuration for one bill source.", + "example": { + "billSource": "aws-123456789012", + "enabled": true + }, + "properties": { + "billSource": { + "description": "The AWS bill source to which this profile applies.", + "example": "aws-123456789012", + "pattern": "^aws-[0-9]{12}$", + "type": "string" + }, + "enabled": { + "description": "Whether Automated EDP normalization is enabled for this bill source.", + "example": true, + "type": "boolean" + } + }, + "required": [ + "billSource", + "enabled" + ], + "type": "object" + }, "FinopsBilling_BillingInvoiceCollection": { "example": [ { @@ -73071,97 +73494,21 @@ "expiresAt": "1998-01-25T06:34:45Z", "url": "Sed aut ducimus quam nostrum autem." }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", - "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", - "dimensions": [ - "Quam est.", - "Rem ut laboriosam." - ], - "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", - "exportType": "pdf", - "failure": { - "code": "Animi eos maiores commodi rem.", - "message": "Libero fuga a et debitis eum similique." - }, - "filter": { - "dimension": "Est enim.", - "expressions": [ - {}, - {}, - {}, - {} - ], - "substring": "Laboriosam molestiae unde totam.", - "type": "equal", - "value": "Eos facere et eum voluptas." - }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", - "isCreateTemplate": false, - "issueDate": "2000-03-18", - "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", - "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", - "template": { - "costMetric": "billedCost", - "dimensions": [ - "service", - "account", - "region" - ], - "displayLogoWithinPdf": true, - "exportType": "pdf", - "filter": { - "dimension": "Est enim.", - "expressions": [ - {}, - {}, - {}, - {} - ], - "substring": "Laboriosam molestiae unde totam.", - "type": "equal", - "value": "Eos facere et eum voluptas." - }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", - "periodType": "chargePeriod", - "templateName": "Standard MSP Invoice" - }, - "updatedAt": "1980-07-23T09:12:32Z" - }, - { - "artifact": { - "expiresAt": "1998-01-25T06:34:45Z", - "url": "Sed aut ducimus quam nostrum autem." - }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", + "attempts": 7804933891257193000, + "billMonth": "Hassie Conroy", + "costMetric": "Consequuntur qui ut autem id id.", + "createdAt": "2012-06-21T13:57:22Z", "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", + "customerBillingPlan": "Minus tenetur.", + "customerId": 2044415428982120400, + "customerName": "Praesentium odit aut dolor dolore.", "dimensions": [ - "Quam est.", - "Rem ut laboriosam." + "Sit cupiditate.", + "Officia id possimus tempore est fugiat autem." ], "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", + "dueDate": "1988-03-08", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -73179,19 +73526,20 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", + "filterCount": 7846683563542437000, + "freeText": "Est omnis rem ut.", + "groupByCount": 17277475273953827000, + "id": "Provident consectetur.", + "invoiceAmount": "Consequuntur ut non recusandae autem quo est.", + "invoiceNumber": "INV-000042", + "invoiceTemplateId": "Molestias adipisci fugiat non in est qui.", "isCreateTemplate": false, - "issueDate": "2000-03-18", + "issueDate": "1986-05-17", "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", + "logo": "Est ipsam.", "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", + "periodType": "billingPeriod", + "status": "Et et.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -73200,6 +73548,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -73213,32 +73562,33 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", + "freeText": "Magnam repellat autem accusamus repudiandae.", + "logo": "Aperiam commodi labore eum dolor laboriosam omnis.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1980-07-23T09:12:32Z" + "updatedAt": "1999-01-06T04:25:37Z" }, { "artifact": { "expiresAt": "1998-01-25T06:34:45Z", "url": "Sed aut ducimus quam nostrum autem." }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", + "attempts": 7804933891257193000, + "billMonth": "Hassie Conroy", + "costMetric": "Consequuntur qui ut autem id id.", + "createdAt": "2012-06-21T13:57:22Z", "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", + "customerBillingPlan": "Minus tenetur.", + "customerId": 2044415428982120400, + "customerName": "Praesentium odit aut dolor dolore.", "dimensions": [ - "Quam est.", - "Rem ut laboriosam." + "Sit cupiditate.", + "Officia id possimus tempore est fugiat autem." ], "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", + "dueDate": "1988-03-08", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -73256,19 +73606,20 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", + "filterCount": 7846683563542437000, + "freeText": "Est omnis rem ut.", + "groupByCount": 17277475273953827000, + "id": "Provident consectetur.", + "invoiceAmount": "Consequuntur ut non recusandae autem quo est.", + "invoiceNumber": "INV-000042", + "invoiceTemplateId": "Molestias adipisci fugiat non in est qui.", "isCreateTemplate": false, - "issueDate": "2000-03-18", + "issueDate": "1986-05-17", "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", + "logo": "Est ipsam.", "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", + "periodType": "billingPeriod", + "status": "Et et.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -73277,6 +73628,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -73290,32 +73642,33 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", + "freeText": "Magnam repellat autem accusamus repudiandae.", + "logo": "Aperiam commodi labore eum dolor laboriosam omnis.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1980-07-23T09:12:32Z" + "updatedAt": "1999-01-06T04:25:37Z" }, { "artifact": { "expiresAt": "1998-01-25T06:34:45Z", "url": "Sed aut ducimus quam nostrum autem." }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", + "attempts": 7804933891257193000, + "billMonth": "Hassie Conroy", + "costMetric": "Consequuntur qui ut autem id id.", + "createdAt": "2012-06-21T13:57:22Z", "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", + "customerBillingPlan": "Minus tenetur.", + "customerId": 2044415428982120400, + "customerName": "Praesentium odit aut dolor dolore.", "dimensions": [ - "Quam est.", - "Rem ut laboriosam." + "Sit cupiditate.", + "Officia id possimus tempore est fugiat autem." ], "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", + "dueDate": "1988-03-08", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -73333,19 +73686,20 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", + "filterCount": 7846683563542437000, + "freeText": "Est omnis rem ut.", + "groupByCount": 17277475273953827000, + "id": "Provident consectetur.", + "invoiceAmount": "Consequuntur ut non recusandae autem quo est.", + "invoiceNumber": "INV-000042", + "invoiceTemplateId": "Molestias adipisci fugiat non in est qui.", "isCreateTemplate": false, - "issueDate": "2000-03-18", + "issueDate": "1986-05-17", "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", + "logo": "Est ipsam.", "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", + "periodType": "billingPeriod", + "status": "Et et.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -73354,6 +73708,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -73367,12 +73722,12 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", + "freeText": "Magnam repellat autem accusamus repudiandae.", + "logo": "Aperiam commodi labore eum dolor laboriosam omnis.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1980-07-23T09:12:32Z" + "updatedAt": "1999-01-06T04:25:37Z" } ], "items": { @@ -73383,24 +73738,32 @@ "FinopsBilling_BillingInvoiceCustomer": { "description": "Customer recipient for invoice export creation.", "example": { - "customerBillingPlan": "Recusandae fuga quo id asperiores.", - "customerId": 3674186079809150000, - "customerName": "Iste quos." + "customerBillingPlan": "Quia hic facere porro maiores.", + "customerId": 3799256290115060000, + "customerName": "Rem voluptatem possimus vitae.", + "invoiceNumber": "u8f" }, "properties": { "customerBillingPlan": { "description": "Billing plan for the customer", - "example": "Error possimus sequi cumque id assumenda ducimus.", + "example": "Iure et.", "type": "string" }, "customerId": { "description": "Customer identifier", - "example": 638208202236157700, + "example": 6578906853776045000, "type": "integer" }, "customerName": { "description": "Customer display name", - "example": "Molestias voluptatibus voluptatum.", + "example": "Et commodi sequi enim sed.", + "type": "string" + }, + "invoiceNumber": { + "description": "Optional invoice number (Invoice ID) for this customer's invoice. Immutable after creation. Duplicates are allowed. An empty string means absent.", + "example": "yh1", + "maxLength": 20, + "pattern": "^[A-Za-z0-9_-]*$", "type": "string" } }, @@ -73413,18 +73776,18 @@ "FinopsBilling_BillingInvoiceDeliveryFailure": { "description": "Email delivery failure details for an invoice.", "example": { - "code": "Totam est aut quod explicabo voluptates.", - "message": "Quis autem." + "code": "Nulla libero et doloribus earum quia.", + "message": "Vel labore occaecati quia." }, "properties": { "code": { "description": "Failure code", - "example": "Nam fuga recusandae ratione.", + "example": "Voluptatum neque tenetur illo.", "type": "string" }, "message": { "description": "Failure message", - "example": "Harum eos neque.", + "example": "Aperiam animi ullam consequatur reprehenderit.", "type": "string" } }, @@ -73433,19 +73796,19 @@ "FinopsBilling_BillingInvoiceExportArtifact": { "description": "Download artifact details for an invoice export.", "example": { - "expiresAt": "1983-09-03T06:51:38Z", - "url": "Fugit provident et officia sit maiores consequatur." + "expiresAt": "1975-07-13T14:10:52Z", + "url": "Rerum enim ipsa in impedit occaecati." }, "properties": { "expiresAt": { "description": "Artifact expiration timestamp", - "example": "1972-07-14T22:57:50Z", + "example": "1974-02-12T12:31:24Z", "format": "date-time", "type": "string" }, "url": { "description": "Pre-signed download URL", - "example": "Mollitia sit aut.", + "example": "Nostrum beatae.", "type": "string" } }, @@ -73484,107 +73847,31 @@ "FinopsBilling_BillingInvoiceList": { "example": { "kind": "finops:invoice-list", - "limit": 12406817798833093000, + "limit": 14054180324872778000, "nextPage": "/finops-billing/v1/orgs/100/invoices?skipToken=19u2349", "prevPage": "/finops-billing/v1/orgs/100/invoices?skipToken=8b1750u", - "total": 15481226037131230000, + "total": 3680050075942609400, "values": [ { "artifact": { "expiresAt": "1998-01-25T06:34:45Z", "url": "Sed aut ducimus quam nostrum autem." }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", - "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", - "dimensions": [ - "Quam est.", - "Rem ut laboriosam." - ], - "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", - "exportType": "pdf", - "failure": { - "code": "Animi eos maiores commodi rem.", - "message": "Libero fuga a et debitis eum similique." - }, - "filter": { - "dimension": "Est enim.", - "expressions": [ - {}, - {}, - {}, - {} - ], - "substring": "Laboriosam molestiae unde totam.", - "type": "equal", - "value": "Eos facere et eum voluptas." - }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", - "isCreateTemplate": false, - "issueDate": "2000-03-18", - "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", - "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", - "template": { - "costMetric": "billedCost", - "dimensions": [ - "service", - "account", - "region" - ], - "displayLogoWithinPdf": true, - "exportType": "pdf", - "filter": { - "dimension": "Est enim.", - "expressions": [ - {}, - {}, - {}, - {} - ], - "substring": "Laboriosam molestiae unde totam.", - "type": "equal", - "value": "Eos facere et eum voluptas." - }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", - "periodType": "chargePeriod", - "templateName": "Standard MSP Invoice" - }, - "updatedAt": "1980-07-23T09:12:32Z" - }, - { - "artifact": { - "expiresAt": "1998-01-25T06:34:45Z", - "url": "Sed aut ducimus quam nostrum autem." - }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", + "attempts": 7804933891257193000, + "billMonth": "Hassie Conroy", + "costMetric": "Consequuntur qui ut autem id id.", + "createdAt": "2012-06-21T13:57:22Z", "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", + "customerBillingPlan": "Minus tenetur.", + "customerId": 2044415428982120400, + "customerName": "Praesentium odit aut dolor dolore.", "dimensions": [ - "Quam est.", - "Rem ut laboriosam." + "Sit cupiditate.", + "Officia id possimus tempore est fugiat autem." ], "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", + "dueDate": "1988-03-08", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -73602,19 +73889,20 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", + "filterCount": 7846683563542437000, + "freeText": "Est omnis rem ut.", + "groupByCount": 17277475273953827000, + "id": "Provident consectetur.", + "invoiceAmount": "Consequuntur ut non recusandae autem quo est.", + "invoiceNumber": "INV-000042", + "invoiceTemplateId": "Molestias adipisci fugiat non in est qui.", "isCreateTemplate": false, - "issueDate": "2000-03-18", + "issueDate": "1986-05-17", "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", + "logo": "Est ipsam.", "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", + "periodType": "billingPeriod", + "status": "Et et.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -73623,6 +73911,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -73636,32 +73925,33 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", + "freeText": "Magnam repellat autem accusamus repudiandae.", + "logo": "Aperiam commodi labore eum dolor laboriosam omnis.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1980-07-23T09:12:32Z" + "updatedAt": "1999-01-06T04:25:37Z" }, { "artifact": { "expiresAt": "1998-01-25T06:34:45Z", "url": "Sed aut ducimus quam nostrum autem." }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", + "attempts": 7804933891257193000, + "billMonth": "Hassie Conroy", + "costMetric": "Consequuntur qui ut autem id id.", + "createdAt": "2012-06-21T13:57:22Z", "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", + "customerBillingPlan": "Minus tenetur.", + "customerId": 2044415428982120400, + "customerName": "Praesentium odit aut dolor dolore.", "dimensions": [ - "Quam est.", - "Rem ut laboriosam." + "Sit cupiditate.", + "Officia id possimus tempore est fugiat autem." ], "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", + "dueDate": "1988-03-08", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -73679,19 +73969,20 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", + "filterCount": 7846683563542437000, + "freeText": "Est omnis rem ut.", + "groupByCount": 17277475273953827000, + "id": "Provident consectetur.", + "invoiceAmount": "Consequuntur ut non recusandae autem quo est.", + "invoiceNumber": "INV-000042", + "invoiceTemplateId": "Molestias adipisci fugiat non in est qui.", "isCreateTemplate": false, - "issueDate": "2000-03-18", + "issueDate": "1986-05-17", "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", + "logo": "Est ipsam.", "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", + "periodType": "billingPeriod", + "status": "Et et.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -73700,6 +73991,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -73713,32 +74005,33 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", + "freeText": "Magnam repellat autem accusamus repudiandae.", + "logo": "Aperiam commodi labore eum dolor laboriosam omnis.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1980-07-23T09:12:32Z" + "updatedAt": "1999-01-06T04:25:37Z" }, { "artifact": { "expiresAt": "1998-01-25T06:34:45Z", "url": "Sed aut ducimus quam nostrum autem." }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", + "attempts": 7804933891257193000, + "billMonth": "Hassie Conroy", + "costMetric": "Consequuntur qui ut autem id id.", + "createdAt": "2012-06-21T13:57:22Z", "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", + "customerBillingPlan": "Minus tenetur.", + "customerId": 2044415428982120400, + "customerName": "Praesentium odit aut dolor dolore.", "dimensions": [ - "Quam est.", - "Rem ut laboriosam." + "Sit cupiditate.", + "Officia id possimus tempore est fugiat autem." ], "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", + "dueDate": "1988-03-08", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -73756,19 +74049,20 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", + "filterCount": 7846683563542437000, + "freeText": "Est omnis rem ut.", + "groupByCount": 17277475273953827000, + "id": "Provident consectetur.", + "invoiceAmount": "Consequuntur ut non recusandae autem quo est.", + "invoiceNumber": "INV-000042", + "invoiceTemplateId": "Molestias adipisci fugiat non in est qui.", "isCreateTemplate": false, - "issueDate": "2000-03-18", + "issueDate": "1986-05-17", "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", + "logo": "Est ipsam.", "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", + "periodType": "billingPeriod", + "status": "Et et.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -73777,6 +74071,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -73790,12 +74085,12 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", + "freeText": "Magnam repellat autem accusamus repudiandae.", + "logo": "Aperiam commodi labore eum dolor laboriosam omnis.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1980-07-23T09:12:32Z" + "updatedAt": "1999-01-06T04:25:37Z" } ] }, @@ -73810,7 +74105,7 @@ }, "limit": { "description": "Page size that was requested.", - "example": 4426651813883429400, + "example": 6199611403200892000, "type": "integer" }, "nextPage": { @@ -73827,7 +74122,7 @@ }, "total": { "description": "Total number of items matching the current filter.", - "example": 2247663904455274800, + "example": 15119379952234693000, "type": "integer" }, "values": { @@ -73981,6 +74276,11 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "000001", + "invoiceNumberLastUsed": "000041", + "invoiceNumberNext": "000042", + "invoiceNumberPrefix": "INV-", + "invoiceNumberingEnabled": true, "invoiceTemplateId": "tmpl_9001", "kind": "finops:invoice-schedule", "nextInvoiceDate": "2026-09-05", @@ -74003,6 +74303,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -74104,6 +74405,11 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "000001", + "invoiceNumberLastUsed": "000041", + "invoiceNumberNext": "000042", + "invoiceNumberPrefix": "INV-", + "invoiceNumberingEnabled": true, "invoiceTemplateId": "tmpl_9001", "kind": "finops:invoice-schedule", "nextInvoiceDate": "2026-09-05", @@ -74126,6 +74432,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -74227,6 +74534,11 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "000001", + "invoiceNumberLastUsed": "000041", + "invoiceNumberNext": "000042", + "invoiceNumberPrefix": "INV-", + "invoiceNumberingEnabled": true, "invoiceTemplateId": "tmpl_9001", "kind": "finops:invoice-schedule", "nextInvoiceDate": "2026-09-05", @@ -74249,6 +74561,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -74283,6 +74596,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -74309,6 +74632,11 @@ "recipients": { "description": "Addresses this customer's invoices are delivered to (at least one).", "example": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -74337,63 +74665,7 @@ "url": "Sed aut ducimus quam nostrum autem." }, "attempts": 7061015994191929000, - "billMonth": "Brooklyn O'Reilly", - "costMetric": "Laborum est eos inventore et nulla.", - "createdAt": "1975-02-26T00:30:15Z", - "currency": "USD", - "customerBillingPlan": "Quis et.", - "customerId": 1942236292504414200, - "customerName": "Iste molestiae impedit modi provident ut nam.", - "deliveryFailure": { - "code": "Quia veniam.", - "message": "Minima in quisquam." - }, - "deliveryStatus": "failed", - "dimensions": [ - "Odio voluptas animi id fugiat velit rerum.", - "Sint quo aut et est." - ], - "displayLogoWithinPdf": true, - "dueDate": "1977-12-07", - "exportType": "pdf", - "failure": { - "code": "Animi eos maiores commodi rem.", - "message": "Libero fuga a et debitis eum similique." - }, - "filter": { - "dimension": "Est enim.", - "expressions": [ - {}, - {}, - {}, - {} - ], - "substring": "Laboriosam molestiae unde totam.", - "type": "equal", - "value": "Eos facere et eum voluptas." - }, - "filterCount": 10727152461447535000, - "freeText": "Quia eos enim.", - "groupByCount": 3516928715182697000, - "id": "Corrupti quo ipsam temporibus possimus dolorum.", - "invoiceAmount": "Animi rem laboriosam.", - "issueDate": "1983-09-09", - "kind": "finops:invoice-schedule-invoice", - "logo": "Dolorem ab ut dolores ab id.", - "messageId": "Deserunt architecto quo eaque perferendis velit sed.", - "orgId": 100, - "periodType": "billingPeriod", - "scheduleId": "Sequi cum reprehenderit beatae hic.", - "status": "Magni quo voluptatibus.", - "updatedAt": "1982-06-22T13:47:54Z" - }, - { - "artifact": { - "expiresAt": "1998-01-25T06:34:45Z", - "url": "Sed aut ducimus quam nostrum autem." - }, - "attempts": 7061015994191929000, - "billMonth": "Brooklyn O'Reilly", + "billMonth": "Louvenia Hahn", "costMetric": "Laborum est eos inventore et nulla.", "createdAt": "1975-02-26T00:30:15Z", "currency": "USD", @@ -74411,6 +74683,7 @@ ], "displayLogoWithinPdf": true, "dueDate": "1977-12-07", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -74433,6 +74706,7 @@ "groupByCount": 3516928715182697000, "id": "Corrupti quo ipsam temporibus possimus dolorum.", "invoiceAmount": "Animi rem laboriosam.", + "invoiceNumber": "INV-000042", "issueDate": "1983-09-09", "kind": "finops:invoice-schedule-invoice", "logo": "Dolorem ab ut dolores ab id.", @@ -74449,7 +74723,7 @@ "url": "Sed aut ducimus quam nostrum autem." }, "attempts": 7061015994191929000, - "billMonth": "Brooklyn O'Reilly", + "billMonth": "Louvenia Hahn", "costMetric": "Laborum est eos inventore et nulla.", "createdAt": "1975-02-26T00:30:15Z", "currency": "USD", @@ -74467,6 +74741,7 @@ ], "displayLogoWithinPdf": true, "dueDate": "1977-12-07", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -74489,6 +74764,7 @@ "groupByCount": 3516928715182697000, "id": "Corrupti quo ipsam temporibus possimus dolorum.", "invoiceAmount": "Animi rem laboriosam.", + "invoiceNumber": "INV-000042", "issueDate": "1983-09-09", "kind": "finops:invoice-schedule-invoice", "logo": "Dolorem ab ut dolores ab id.", @@ -74508,10 +74784,10 @@ "FinopsBilling_BillingInvoiceScheduleInvoiceList": { "example": { "kind": "finops:invoice-schedule-invoice-list", - "limit": 9016326765234816000, + "limit": 4921515517014305000, "nextPage": "/finops-billing/v1/orgs/100/invoice-schedules/sch_1/invoices?skipToken=19u2349", "prevPage": "/finops-billing/v1/orgs/100/invoice-schedules/sch_1/invoices?skipToken=8b1750u", - "total": 8373538356291928000, + "total": 9099939303600172000, "values": [ { "artifact": { @@ -74519,7 +74795,7 @@ "url": "Sed aut ducimus quam nostrum autem." }, "attempts": 7061015994191929000, - "billMonth": "Brooklyn O'Reilly", + "billMonth": "Louvenia Hahn", "costMetric": "Laborum est eos inventore et nulla.", "createdAt": "1975-02-26T00:30:15Z", "currency": "USD", @@ -74537,6 +74813,7 @@ ], "displayLogoWithinPdf": true, "dueDate": "1977-12-07", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -74559,6 +74836,7 @@ "groupByCount": 3516928715182697000, "id": "Corrupti quo ipsam temporibus possimus dolorum.", "invoiceAmount": "Animi rem laboriosam.", + "invoiceNumber": "INV-000042", "issueDate": "1983-09-09", "kind": "finops:invoice-schedule-invoice", "logo": "Dolorem ab ut dolores ab id.", @@ -74575,7 +74853,7 @@ "url": "Sed aut ducimus quam nostrum autem." }, "attempts": 7061015994191929000, - "billMonth": "Brooklyn O'Reilly", + "billMonth": "Louvenia Hahn", "costMetric": "Laborum est eos inventore et nulla.", "createdAt": "1975-02-26T00:30:15Z", "currency": "USD", @@ -74593,6 +74871,7 @@ ], "displayLogoWithinPdf": true, "dueDate": "1977-12-07", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -74615,6 +74894,7 @@ "groupByCount": 3516928715182697000, "id": "Corrupti quo ipsam temporibus possimus dolorum.", "invoiceAmount": "Animi rem laboriosam.", + "invoiceNumber": "INV-000042", "issueDate": "1983-09-09", "kind": "finops:invoice-schedule-invoice", "logo": "Dolorem ab ut dolores ab id.", @@ -74638,7 +74918,7 @@ }, "limit": { "description": "Page size that was requested.", - "example": 16187368872132504000, + "example": 12865743348027552000, "type": "integer" }, "nextPage": { @@ -74655,7 +74935,7 @@ }, "total": { "description": "Total number of matching items.", - "example": 12639085553820780000, + "example": 7713202845823713000, "type": "integer" }, "values": { @@ -74671,10 +74951,10 @@ "FinopsBilling_BillingInvoiceScheduleList": { "example": { "kind": "finops:invoice-schedule-list", - "limit": 7609749600815312000, + "limit": 627391454889232300, "nextPage": "/finops-billing/v1/orgs/100/invoice-schedules?skipToken=19u2349", "prevPage": "/finops-billing/v1/orgs/100/invoice-schedules?skipToken=8b1750u", - "total": 13340065833219270000, + "total": 16571417877251262000, "values": [ { "createdAt": "2001-07-21T04:41:33Z", @@ -74756,6 +75036,11 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "000001", + "invoiceNumberLastUsed": "000041", + "invoiceNumberNext": "000042", + "invoiceNumberPrefix": "INV-", + "invoiceNumberingEnabled": true, "invoiceTemplateId": "tmpl_9001", "kind": "finops:invoice-schedule", "nextInvoiceDate": "2026-09-05", @@ -74778,6 +75063,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -74879,6 +75165,11 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "000001", + "invoiceNumberLastUsed": "000041", + "invoiceNumberNext": "000042", + "invoiceNumberPrefix": "INV-", + "invoiceNumberingEnabled": true, "invoiceTemplateId": "tmpl_9001", "kind": "finops:invoice-schedule", "nextInvoiceDate": "2026-09-05", @@ -74901,6 +75192,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -74935,7 +75227,7 @@ }, "limit": { "description": "Page size that was requested.", - "example": 443571745271756350, + "example": 6278734159510877000, "type": "integer" }, "nextPage": { @@ -74952,7 +75244,7 @@ }, "total": { "description": "Total number of items matching the current filter.", - "example": 3073188806273719000, + "example": 15904108366153870000, "type": "integer" }, "values": { @@ -74999,7 +75291,7 @@ }, "FinopsBilling_BillingInvoiceScheduleResult": { "example": { - "createdAt": "1993-02-25T02:48:27Z", + "createdAt": "1987-04-15T07:14:34Z", "createdBy": 123, "customers": [ { @@ -75011,26 +75303,12 @@ "email": "david.jones@example.com", "firstName": "David", "lastName": "Jones" - } - ] - }, - { - "customerBillingPlan": "gold", - "customerId": 53125, - "customerName": "MSP Child Org - 52674", - "recipients": [ + }, { "email": "david.jones@example.com", "firstName": "David", "lastName": "Jones" - } - ] - }, - { - "customerBillingPlan": "gold", - "customerId": 53125, - "customerName": "MSP Child Org - 52674", - "recipients": [ + }, { "email": "david.jones@example.com", "firstName": "David", @@ -75043,6 +75321,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -75060,6 +75348,11 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "wzm", + "invoiceNumberLastUsed": "000041", + "invoiceNumberNext": "000042", + "invoiceNumberPrefix": "qk9", + "invoiceNumberingEnabled": true, "invoiceTemplateId": "tmpl_9001", "kind": "finops:invoice-schedule", "nextInvoiceDate": "2026-09-05", @@ -75082,29 +75375,31 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, - "freeText": "Quidem voluptatem aut omnis sint quia.", - "logo": "Unde et est sed.", + "freeText": "Porro quidem voluptatem aut.", + "logo": "Perspiciatis nemo molestiae quasi unde et est.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "2015-03-13T22:37:03Z", + "updatedAt": "2014-05-24T07:06:37Z", "updatedBy": 456 }, "properties": { "createdAt": { "description": "ISO-8601 creation timestamp", - "example": "2012-09-13T09:17:13Z", + "example": "1996-06-23T05:39:55Z", "format": "date-time", "type": "string" }, @@ -75121,6 +75416,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -75133,6 +75438,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -75145,6 +75460,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -75169,6 +75494,37 @@ "invoiceIssueDateRule": { "$ref": "#/components/schemas/FinopsBilling_BillingInvoiceIssueDateRule" }, + "invoiceNumberBase": { + "description": "First sequence number of the schedule's numbering. Absent when numbering is disabled.", + "example": "edj", + "maxLength": 9, + "pattern": "^0*[1-9][0-9]*$", + "type": "string" + }, + "invoiceNumberLastUsed": { + "description": "Sequence number most recently allocated by the schedule. Absent until the first allocation. The counter is retained when the schedule is soft-deleted, and re-adding numbering continues from last used + 1.", + "example": "000041", + "pattern": "^[0-9]{1,9}$", + "type": "string" + }, + "invoiceNumberNext": { + "description": "Sequence number the next generated invoice will receive. Absent when numbering is disabled.", + "example": "000042", + "pattern": "^[0-9]{1,9}$", + "type": "string" + }, + "invoiceNumberPrefix": { + "description": "Prefix placed before the sequence number. Empty or absent when there is no prefix.", + "example": "4nf", + "maxLength": 20, + "pattern": "^[A-Za-z0-9_-]*$", + "type": "string" + }, + "invoiceNumberingEnabled": { + "description": "Whether the schedule numbers the invoices it generates.", + "example": true, + "type": "boolean" + }, "invoiceTemplateId": { "description": "Identifier of the invoice template shared by every customer on this schedule. Absent when the schedule was created without a template.", "example": "tmpl_9001", @@ -75217,7 +75573,7 @@ }, "updatedAt": { "description": "ISO-8601 last-update timestamp", - "example": "1975-12-09T10:55:47Z", + "example": "1975-01-08T16:10:26Z", "format": "date-time", "type": "string" }, @@ -75253,19 +75609,21 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, - "freeText": "Laborum nihil enim quam sint est.", - "logo": "Unde commodi recusandae et voluptas.", + "freeText": "Odit earum pariatur possimus quisquam.", + "logo": "Quo soluta.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, @@ -75289,7 +75647,7 @@ "region" ], "items": { - "example": "Et tenetur.", + "example": "Amet quasi sit totam.", "type": "string" }, "maxItems": 10, @@ -75300,6 +75658,15 @@ "example": true, "type": "boolean" }, + "exportLayout": { + "description": "PDF layout format. Exact lowercase flatten or nested; omitted PDF exports default to flatten. Must be omitted for CSV exports.", + "enum": [ + "flatten", + "nested" + ], + "example": "flatten", + "type": "string" + }, "exportType": { "description": "Invoice export type.", "enum": [ @@ -75314,12 +75681,12 @@ }, "freeText": { "description": "Optional free-text company/address block.", - "example": "Quia sit voluptates.", + "example": "Consequatur voluptas accusantium non ullam et vel.", "type": "string" }, "logo": { "description": "Optional logo payload. Ignored when exportType=csv.", - "example": "Non molestiae molestias.", + "example": "Voluptatem veniam provident explicabo sint.", "type": "string" }, "periodType": { @@ -75364,6 +75731,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -75405,88 +75773,7 @@ "region" ], "displayLogoWithinPdf": true, - "exportType": "pdf", - "filter": { - "dimension": "Est enim.", - "expressions": [ - {}, - {}, - {}, - {} - ], - "substring": "Laboriosam molestiae unde totam.", - "type": "equal", - "value": "Eos facere et eum voluptas." - }, - "filterCount": 5390635163922885000, - "freeText": "Pariatur delectus doloremque ex mollitia ad neque.", - "groupByCount": 9911411258810075000, - "id": "tmpl_9001", - "kind": "finops:invoice-template", - "logo": "Et quasi.", - "nextInvoiceDate": "2004-09-16", - "orgId": 100, - "periodType": "chargePeriod", - "templateName": "Standard MSP Invoice", - "updatedAt": "1970-02-01T12:31:12Z", - "updatedBy": 456 - }, - { - "activeScheduleCount": 1944694627890364200, - "activeScheduleIds": [ - "Repudiandae laboriosam libero ipsam dolores minima.", - "Provident totam dicta eos quia id." - ], - "costMetric": "billedCost", - "createdAt": "1979-08-14T17:58:34Z", - "createdBy": 123, - "dimensions": [ - "service", - "account", - "region" - ], - "displayLogoWithinPdf": true, - "exportType": "pdf", - "filter": { - "dimension": "Est enim.", - "expressions": [ - {}, - {}, - {}, - {} - ], - "substring": "Laboriosam molestiae unde totam.", - "type": "equal", - "value": "Eos facere et eum voluptas." - }, - "filterCount": 5390635163922885000, - "freeText": "Pariatur delectus doloremque ex mollitia ad neque.", - "groupByCount": 9911411258810075000, - "id": "tmpl_9001", - "kind": "finops:invoice-template", - "logo": "Et quasi.", - "nextInvoiceDate": "2004-09-16", - "orgId": 100, - "periodType": "chargePeriod", - "templateName": "Standard MSP Invoice", - "updatedAt": "1970-02-01T12:31:12Z", - "updatedBy": 456 - }, - { - "activeScheduleCount": 1944694627890364200, - "activeScheduleIds": [ - "Repudiandae laboriosam libero ipsam dolores minima.", - "Provident totam dicta eos quia id." - ], - "costMetric": "billedCost", - "createdAt": "1979-08-14T17:58:34Z", - "createdBy": 123, - "dimensions": [ - "service", - "account", - "region" - ], - "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -75522,10 +75809,10 @@ "FinopsBilling_BillingInvoiceTemplateList": { "example": { "kind": "finops:invoice-template-list", - "limit": 2097522650878654700, + "limit": 327549333802351170, "nextPage": "/finops-billing/v1/orgs/100/invoice-templates?skipToken=19u2349", "prevPage": "/finops-billing/v1/orgs/100/invoice-templates?skipToken=8b1750u", - "total": 881122784595561300, + "total": 15924130752122270000, "values": [ { "activeScheduleCount": 1944694627890364200, @@ -75542,6 +75829,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -75583,6 +75871,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -75624,6 +75913,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -75663,7 +75953,7 @@ }, "limit": { "description": "Page size that was requested.", - "example": 2048336703166818000, + "example": 4265503925579703000, "type": "integer" }, "nextPage": { @@ -75680,7 +75970,7 @@ }, "total": { "description": "Total number of items matching the current filter.", - "example": 4539891541662305300, + "example": 15919979363467950000, "type": "integer" }, "values": { @@ -75695,15 +75985,14 @@ }, "FinopsBilling_BillingInvoiceTemplateResult": { "example": { - "activeScheduleCount": 1200509057604357000, + "activeScheduleCount": 5080801233735324000, "activeScheduleIds": [ - "Numquam omnis perspiciatis est facilis.", - "Quibusdam omnis voluptatem quo.", - "Dolorem amet illum eos voluptatum.", - "Dolor suscipit." + "Eos doloribus itaque nihil.", + "Temporibus error et et.", + "Quibusdam autem dolores." ], "costMetric": "billedCost", - "createdAt": "1985-02-25T19:24:33Z", + "createdAt": "1977-09-18T15:59:07Z", "createdBy": 123, "dimensions": [ "service", @@ -75711,47 +76000,47 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, - "filterCount": 8733482968186287000, - "freeText": "Est rerum.", - "groupByCount": 13032126878225644000, + "filterCount": 14416758661809854000, + "freeText": "Excepturi architecto laboriosam animi tempore.", + "groupByCount": 1750680697239480600, "id": "tmpl_9001", "kind": "finops:invoice-template", - "logo": "Et optio et possimus aut consequatur voluptas.", - "nextInvoiceDate": "2012-09-24", + "logo": "Iusto et earum aut sunt cumque quibusdam.", + "nextInvoiceDate": "1991-11-17", "orgId": 100, "periodType": "chargePeriod", "templateName": "Standard MSP Invoice", - "updatedAt": "2015-04-13T23:55:35Z", + "updatedAt": "2011-07-27T06:07:38Z", "updatedBy": 456 }, "properties": { "activeScheduleCount": { "description": "Count of invoice schedules with status:active that currently reference this template.", - "example": 4894927628710066000, + "example": 6833623912516017000, "minimum": 0, "type": "integer" }, "activeScheduleIds": { "description": "IDs of invoice schedules with status:active that currently reference this template.", "example": [ - "Quaerat debitis.", - "Ut et.", - "Voluptatem et in et quia quibusdam quia.", - "Non corrupti." + "Ut aliquid incidunt.", + "Omnis quasi quam." ], "items": { - "example": "Consequatur pariatur.", + "example": "Sit rem.", "type": "string" }, "type": "array" @@ -75769,7 +76058,7 @@ }, "createdAt": { "description": "ISO-8601 creation timestamp", - "example": "2007-03-31T19:57:32Z", + "example": "1989-09-28T11:31:16Z", "format": "date-time", "type": "string" }, @@ -75786,7 +76075,7 @@ "region" ], "items": { - "example": "Accusamus ratione tenetur.", + "example": "Maxime labore.", "type": "string" }, "maxItems": 10, @@ -75797,6 +76086,15 @@ "example": true, "type": "boolean" }, + "exportLayout": { + "description": "PDF layout format. Exact lowercase flatten or nested; omitted PDF exports default to flatten. Must be omitted for CSV exports.", + "enum": [ + "flatten", + "nested" + ], + "example": "flatten", + "type": "string" + }, "exportType": { "description": "Invoice export type", "enum": [ @@ -75811,18 +76109,18 @@ }, "filterCount": { "description": "Number of filter expressions", - "example": 1353414371406557000, + "example": 14104089954357594000, "minimum": 0, "type": "integer" }, "freeText": { "description": "Optional free-text company/address block rendered in the invoice.", - "example": "Voluptatibus illum eum vel qui quibusdam debitis.", + "example": "Quisquam fugiat qui.", "type": "string" }, "groupByCount": { "description": "Number of group-by dimensions", - "example": 13720499502086617000, + "example": 13897232662815455000, "minimum": 0, "type": "integer" }, @@ -75841,12 +76139,12 @@ }, "logo": { "description": "Optional logo payload stored with the template.", - "example": "Iusto optio excepturi corporis.", + "example": "Nihil minima non.", "type": "string" }, "nextInvoiceDate": { "description": "Optional next invoice date", - "example": "2001-09-01", + "example": "2010-09-07", "format": "date", "type": "string" }, @@ -75874,7 +76172,7 @@ }, "updatedAt": { "description": "ISO-8601 last-update timestamp", - "example": "2001-07-03T14:09:00Z", + "example": "2003-12-16T10:34:10Z", "format": "date-time", "type": "string" }, @@ -76150,6 +76448,16 @@ "subAccountId": "777037404548", "subAccountName": "acme-prod-us-east" }, + { + "amount": "100.00", + "billingAccountId": "111222333", + "billingAccountName": "acme-prod-us-east", + "creditType": "EdpDiscount", + "customerId": 2001, + "description": "Enterprise Discount Program Discount for AmazonVPC", + "subAccountId": "777037404548", + "subAccountName": "acme-prod-us-east" + }, { "amount": "100.00", "billingAccountId": "111222333", @@ -76526,6 +76834,18 @@ "firstName": "David", "lastName": "Jones" }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + } + ] + }, + { + "customerBillingPlan": "gold", + "customerId": 53125, + "customerName": "MSP Child Org - 52674", + "recipients": [ { "email": "david.jones@example.com", "firstName": "David", @@ -76547,6 +76867,8 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "cw3", + "invoiceNumberPrefix": "v0y", "invoiceTemplateId": "tmpl_9001", "isCreateTemplate": false, "schedule": { @@ -76566,19 +76888,21 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Sit eos mollitia debitis cum.", + "dimension": "Aut facilis autem non non eum.", "expressions": [ + {}, {}, {} ], - "substring": "Earum iusto unde sit exercitationem aut.", + "substring": "Qui suscipit quas temporibus voluptates voluptatem quo.", "type": "equal", - "value": "Iusto repudiandae consequuntur adipisci." + "value": "Voluptatem eius." }, - "freeText": "Facere ut aut et ipsum ut.", - "logo": "Harum qui ipsam dignissimos.", + "freeText": "Adipisci enim earum iusto unde sit.", + "logo": "Mollitia debitis cum fuga iusto repudiandae.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" } @@ -76597,11 +76921,6 @@ "firstName": "David", "lastName": "Jones" }, - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, { "email": "david.jones@example.com", "firstName": "David", @@ -76619,11 +76938,6 @@ "firstName": "David", "lastName": "Jones" }, - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, { "email": "david.jones@example.com", "firstName": "David", @@ -76644,6 +76958,20 @@ "invoiceIssueDateRule": { "$ref": "#/components/schemas/FinopsBilling_BillingInvoiceIssueDateRule" }, + "invoiceNumberBase": { + "description": "Optional first sequence number for the invoice numbers this schedule generates.", + "example": "uf4", + "maxLength": 9, + "pattern": "^0*[1-9][0-9]*$", + "type": "string" + }, + "invoiceNumberPrefix": { + "description": "Optional prefix for the invoice numbers this schedule generates. Requires invoiceNumberBase.", + "example": "zel", + "maxLength": 20, + "pattern": "^[A-Za-z0-9_-]*$", + "type": "string" + }, "invoiceTemplateId": { "description": "Identifier of an existing invoice template to share across every customer on this schedule. Omit both this and template to create a schedule with no template.", "example": "tmpl_9001", @@ -76685,18 +77013,20 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Sit eos mollitia debitis cum.", + "dimension": "Aut facilis autem non non eum.", "expressions": [ + {}, {}, {} ], - "substring": "Earum iusto unde sit exercitationem aut.", + "substring": "Qui suscipit quas temporibus voluptates voluptatem quo.", "type": "equal", - "value": "Iusto repudiandae consequuntur adipisci." + "value": "Voluptatem eius." }, - "freeText": "Dolorem ut laboriosam ea et.", + "freeText": "Autem reprehenderit quis consequatur cupiditate enim.", "logo": "\u003cbase64-or-reference-payload\u003e", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" @@ -76721,7 +77051,7 @@ "region" ], "items": { - "example": "Ullam aspernatur maxime ducimus.", + "example": "Eum laudantium ea dignissimos.", "type": "string" }, "maxItems": 10, @@ -76732,6 +77062,15 @@ "example": true, "type": "boolean" }, + "exportLayout": { + "description": "PDF layout format. Exact lowercase flatten or nested; omitted PDF exports default to flatten. Must be omitted for CSV exports.", + "enum": [ + "flatten", + "nested" + ], + "example": "flatten", + "type": "string" + }, "exportType": { "description": "Invoice export type.", "enum": [ @@ -76746,7 +77085,7 @@ }, "freeText": { "description": "Optional free-text company/address block.", - "example": "Aut accusamus.", + "example": "Quo inventore voluptatem ut expedita.", "type": "string" }, "logo": { @@ -76782,45 +77121,49 @@ }, "FinopsBilling_CreateRequestBody3": { "example": { - "costMetric": "billedCost", + "costMetric": "modifiedBilledCost", "customers": [ { - "customerBillingPlan": "Distinctio officiis ex ut qui.", - "customerId": 8270483714537410000, - "customerName": "Tempore recusandae." + "customerBillingPlan": "Pariatur necessitatibus corrupti.", + "customerId": 7491482402168278000, + "customerName": "Officiis eum.", + "invoiceNumber": "y0u" }, { - "customerBillingPlan": "Distinctio officiis ex ut qui.", - "customerId": 8270483714537410000, - "customerName": "Tempore recusandae." + "customerBillingPlan": "Pariatur necessitatibus corrupti.", + "customerId": 7491482402168278000, + "customerName": "Officiis eum.", + "invoiceNumber": "y0u" } ], "dimensions": [ - "Quia molestias non placeat ea unde et.", - "Corrupti reprehenderit expedita delectus qui.", - "Eum nam provident ut cumque explicabo." + "Dolore possimus ex aut voluptatem.", + "Velit a distinctio qui distinctio.", + "Totam et perspiciatis." ], - "displayLogoWithinPdf": true, - "dueDate": "1995-04-17", - "endDate": "1978-08-08", - "exportType": "pdf", + "displayLogoWithinPdf": false, + "dueDate": "1970-12-15", + "endDate": "2008-03-08", + "exportLayout": "flatten", + "exportType": "csv", "filter": { - "dimension": "Sit eos mollitia debitis cum.", + "dimension": "Aut facilis autem non non eum.", "expressions": [ + {}, {}, {} ], - "substring": "Earum iusto unde sit exercitationem aut.", + "substring": "Qui suscipit quas temporibus voluptates voluptatem quo.", "type": "equal", - "value": "Iusto repudiandae consequuntur adipisci." + "value": "Voluptatem eius." }, - "freeText": "Ut recusandae sint qui.", - "invoiceTemplateId": "Nobis quae enim blanditiis.", + "freeText": "Culpa aut hic.", + "invoiceTemplateId": "Qui quibusdam.", "isCreateTemplate": false, - "issueDate": "2001-02-26", - "logo": "Quidem assumenda odio perspiciatis iste natus.", + "issueDate": "1997-12-14", + "logo": "Fugit et fugit enim.", "periodType": "billPeriod", - "startDate": "1973-01-03", + "startDate": "2005-07-08", "template": { "costMetric": "billedCost", "dimensions": [ @@ -76829,19 +77172,21 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Sit eos mollitia debitis cum.", + "dimension": "Aut facilis autem non non eum.", "expressions": [ + {}, {}, {} ], - "substring": "Earum iusto unde sit exercitationem aut.", + "substring": "Qui suscipit quas temporibus voluptates voluptatem quo.", "type": "equal", - "value": "Iusto repudiandae consequuntur adipisci." + "value": "Voluptatem eius." }, - "freeText": "Et corporis temporibus et blanditiis assumenda dolorum.", - "logo": "Aliquam in nemo qui impedit soluta corporis.", + "freeText": "Labore ipsum fugiat est quod ullam.", + "logo": "Voluptatem minus aut illum eligendi.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" } @@ -76855,21 +77200,17 @@ "modifiedBilledCost", "modifiedEffectiveCost" ], - "example": "modifiedEffectiveCost", + "example": "effectiveCost", "type": "string" }, "customers": { "description": "Customers to create invoice exports for.", "example": [ { - "customerBillingPlan": "Distinctio officiis ex ut qui.", - "customerId": 8270483714537410000, - "customerName": "Tempore recusandae." - }, - { - "customerBillingPlan": "Distinctio officiis ex ut qui.", - "customerId": 8270483714537410000, - "customerName": "Tempore recusandae." + "customerBillingPlan": "Pariatur necessitatibus corrupti.", + "customerId": 7491482402168278000, + "customerName": "Officiis eum.", + "invoiceNumber": "y0u" } ], "items": { @@ -76881,12 +77222,12 @@ "dimensions": { "description": "Dimensions to include in export.", "example": [ - "Expedita consequatur labore voluptatum non et.", - "Accusamus consequatur.", - "Voluptate beatae illo." + "Eius porro tempore nemo quidem voluptas.", + "Et distinctio eum.", + "Eos eveniet eaque fuga iste et ratione." ], "items": { - "example": "Alias itaque voluptatibus et quaerat.", + "example": "Expedita facere dolorum est velit adipisci.", "type": "string" }, "maxItems": 10, @@ -76899,16 +77240,25 @@ }, "dueDate": { "description": "Invoice due date.", - "example": "1993-12-03", + "example": "1988-11-28", "format": "date", "type": "string" }, "endDate": { "description": "Invoice range end date.", - "example": "1990-10-28", + "example": "1988-05-11", "format": "date", "type": "string" }, + "exportLayout": { + "description": "PDF layout format. Exact lowercase flatten or nested; omitted PDF exports default to flatten. Must be omitted for CSV exports.", + "enum": [ + "flatten", + "nested" + ], + "example": "flatten", + "type": "string" + }, "exportType": { "description": "Export type. Required only when neither invoiceTemplateId nor template is supplied.", "enum": [ @@ -76923,12 +77273,12 @@ }, "freeText": { "description": "Optional free text.", - "example": "Nulla numquam architecto eius pariatur.", + "example": "Est est illo nisi.", "type": "string" }, "invoiceTemplateId": { "description": "Optional saved invoice template to source default field values from. Cannot be combined with template. Opaque ID; resolved server-side and snapshotted into the invoice.", - "example": "Eius voluptatem et rerum minus.", + "example": "Quo dolorum adipisci est cumque dolor.", "type": "string" }, "isCreateTemplate": { @@ -76939,13 +77289,13 @@ }, "issueDate": { "description": "Invoice issue date.", - "example": "1982-03-16", + "example": "1995-07-16", "format": "date", "type": "string" }, "logo": { "description": "Optional logo payload.", - "example": "Iure dolorem animi atque quos.", + "example": "Sunt sunt mollitia tenetur.", "type": "string" }, "periodType": { @@ -76955,12 +77305,12 @@ "billPeriod", "billingPeriod" ], - "example": "billPeriod", + "example": "chargePeriod", "type": "string" }, "startDate": { "description": "Invoice range start date.", - "example": "2005-03-29", + "example": "1979-06-22", "format": "date", "type": "string" }, @@ -76984,11 +77334,6 @@ "percentage": 50, "value": "Orion" }, - { - "dimensionId": "rbd_team", - "percentage": 50, - "value": "Orion" - }, { "dimensionId": "rbd_team", "percentage": 50, @@ -77001,24 +77346,6 @@ "effectiveTo": "2025-12", "name": "Equal split for AWS between Teams A, B and C", "source": [ - { - "dimensionId": "vendor", - "valueListCondition": { - "values": [ - "AWS", - "Azure" - ] - } - }, - { - "dimensionId": "vendor", - "valueListCondition": { - "values": [ - "AWS", - "Azure" - ] - } - }, { "dimensionId": "vendor", "valueListCondition": { @@ -77057,6 +77384,15 @@ "source": { "description": "Dimensions that identify the costs to be reallocated. Multiple dimensions are combined using AND logic; only costs that satisfy every dimension are included. At least one dimension is required.", "example": [ + { + "dimensionId": "vendor", + "valueListCondition": { + "values": [ + "AWS", + "Azure" + ] + } + }, { "dimensionId": "vendor", "valueListCondition": { @@ -77370,16 +77706,13 @@ "ref": "iam:user:123" }, "creditTypes": [ - "Vel ut.", - "Eum totam aspernatur.", - "Et omnis.", - "Animi iure." + "Perferendis doloribus omnis mollitia sit aut.", + "Qui nemo sint non animi.", + "Animi officiis quidem consequatur rem placeat vitae." ], "customerIds": [ - 7040638334850636000, - 11678638534860245000, - 10022420793517386000, - 3391065041821145600 + 8633722213610398000, + 10957346168265202000 ], "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "kind": "finops:billing-credit-assignment-summary", @@ -77435,13 +77768,12 @@ "creditTypes": { "description": "The unique credit types affected by the credit assignment.", "example": [ - "Eum explicabo qui qui accusantium.", - "Natus iure deserunt cumque id.", - "In et fugiat.", - "Velit pariatur consequatur repellat reiciendis." + "Unde quaerat nemo maiores tempora numquam.", + "Facere officia non et natus.", + "Inventore sapiente." ], "items": { - "example": "Possimus quia voluptates laboriosam eveniet quia ut.", + "example": "Possimus nulla et aut.", "type": "string" }, "type": "array" @@ -77449,12 +77781,11 @@ "customerIds": { "description": "The unique customer (child org) identifiers affected by the credit assignment.", "example": [ - 8056459841872147000, - 14267814888460310000, - 15121543345075990000 + 5173080212351944000, + 2180479856682928600 ], "items": { - "example": 4634608285761087000, + "example": 8086585002274591000, "type": "integer" }, "type": "array" @@ -77669,26 +78000,26 @@ }, "FinopsBilling_CustomRateTier": { "example": { - "endCost": "Miss Lexie Skiles", - "rate": "Sadie Pollich", - "startCost": "Jolie Stokes" + "endCost": "Juston Heller", + "rate": "Kasandra Gutkowski", + "startCost": "Michael Roberts" }, "properties": { "endCost": { "description": "inclusive upper bound for this tier", - "example": "Dan McKenzie Jr.", + "example": "Ms. Giovanni Fadel", "pattern": "^[-+]?[0-9]+(?:[.][0-9]+)?(?:[eE][-+]?[0-9]+)?$", "type": "string" }, "rate": { "description": "unit price applied by this tier", - "example": "Astrid Barrows Jr.", + "example": "Amir VonRueden", "pattern": "^[-+]?[0-9]+(?:[.][0-9]+)?(?:[eE][-+]?[0-9]+)?$", "type": "string" }, "startCost": { "description": "exclusive lower bound for this tier", - "example": "Jettie Cummerata", + "example": "Aglae Turcotte", "pattern": "^[-+]?[0-9]+(?:[.][0-9]+)?(?:[eE][-+]?[0-9]+)?$", "type": "string" } @@ -77814,67 +78145,61 @@ "FinopsBilling_FilterV1": { "description": "A single filter node: a leaf test (equal, substring) or a boolean combinator (and, or, not).", "example": { - "dimension": "Deserunt autem autem.", + "dimension": "Odit amet eum odio dolores atque nemo.", "expression": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, "expressions": [ { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ {}, - {} - ], - "substring": "Debitis sint.", - "type": "equal", - "value": "Libero non harum repellat tenetur quos." - }, - { - "dimension": "Eum et optio dolores aspernatur officia veniam.", - "expressions": [ {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." } ], - "substring": "Iusto nihil nihil sapiente.", + "substring": "Eveniet numquam qui quia cum.", "type": "equal", - "value": "Tenetur qui quas deserunt." + "value": "Et cumque repellat labore." }, "properties": { "dimension": { "description": "Column/dimension name; used by leaf nodes (equal, substring)", - "example": "Vitae ullam qui aut.", + "example": "Accusantium est beatae cumque pariatur nam dolore.", "type": "string" }, "expression": { @@ -77884,24 +78209,48 @@ "description": "Child expressions; used by and/or nodes", "example": [ { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." + }, + { + "dimension": "Ut ullam aut.", + "expressions": [ + {}, + {}, + {} + ], + "substring": "Optio dolores aspernatur officia veniam.", + "type": "equal", + "value": "Accusamus deleniti cumque et omnis tempora eum." + }, + { + "dimension": "Ut ullam aut.", + "expressions": [ + {}, + {}, + {} + ], + "substring": "Optio dolores aspernatur officia veniam.", + "type": "equal", + "value": "Accusamus deleniti cumque et omnis tempora eum." } ], "items": { @@ -77911,7 +78260,7 @@ }, "substring": { "description": "Substring match value; used by substring nodes", - "example": "Iure alias saepe.", + "example": "Expedita omnis ipsum vel.", "type": "string" }, "type": { @@ -77928,7 +78277,7 @@ }, "value": { "description": "Exact match value; used by equal nodes", - "example": "Ab distinctio omnis quo.", + "example": "Adipisci dolores eveniet cupiditate non.", "type": "string" } }, @@ -78632,52 +78981,54 @@ "description": "An invoice export lifecycle record.", "example": { "artifact": { - "expiresAt": "2012-05-17T03:14:31Z", - "url": "Error vel." + "expiresAt": "1997-11-11T17:25:06Z", + "url": "Amet eos tenetur numquam." }, - "attempts": 1593420879800328000, - "billMonth": "Shayne Kovacek", - "costMetric": "Omnis eum.", - "createdAt": "1985-07-02T07:05:40Z", + "attempts": 6259724457644935000, + "billMonth": "Drake Bosco", + "costMetric": "Pariatur praesentium.", + "createdAt": "1996-01-20T19:31:51Z", "currency": "USD", - "customerBillingPlan": "Cupiditate enim omnis.", - "customerId": 15893412570382467000, - "customerName": "Laudantium ea dignissimos ea autem reprehenderit quis.", + "customerBillingPlan": "Earum nostrum ex.", + "customerId": 13479479524266762000, + "customerName": "Minima molestiae voluptate maxime aut.", "dimensions": [ - "In aut dolor harum et.", - "Nisi rerum.", - "Modi voluptate sunt quo placeat quia libero." + "Omnis maxime.", + "Repudiandae velit fugit." ], - "displayLogoWithinPdf": false, - "dueDate": "1971-11-14", + "displayLogoWithinPdf": true, + "dueDate": "2001-06-25", + "exportLayout": "nested", "exportType": "csv", "failure": { - "code": "Explicabo fugit.", - "message": "Eveniet omnis ad." + "code": "Sint commodi consequuntur exercitationem.", + "message": "Doloribus ut molestiae dolorem." }, "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." - }, - "filterCount": 12048949954503946000, - "freeText": "Non voluptas.", - "groupByCount": 5925111761407452000, - "id": "Quo inventore voluptatem ut expedita.", - "invoiceAmount": "Ad iusto.", - "invoiceTemplateId": "Sit inventore aut laudantium.", + "value": "Accusamus deleniti cumque et omnis tempora eum." + }, + "filterCount": 1723730850210965200, + "freeText": "Voluptatem qui velit.", + "groupByCount": 6322255324718638000, + "id": "Quis dolorem voluptas.", + "invoiceAmount": "Repellendus odio odio illo ut reprehenderit est.", + "invoiceNumber": "r4h", + "invoiceTemplateId": "Aut saepe dolorum sapiente.", "isCreateTemplate": true, - "issueDate": "1980-09-26", + "issueDate": "2003-11-16", "kind": "finops:invoice", - "logo": "Distinctio expedita.", + "logo": "Molestias quos harum veritatis beatae quis.", "orgId": 100, "periodType": "chargePeriod", - "status": "Suscipit molestias occaecati suscipit incidunt ex.", + "status": "Voluptatem et.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -78686,23 +79037,25 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, - "freeText": "Accusamus ducimus porro voluptas dignissimos.", - "logo": "Eveniet delectus quo occaecati deserunt sunt quia.", + "freeText": "Magni a ipsa.", + "logo": "Eum reiciendis ea vitae reprehenderit rerum.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "2011-11-20T15:01:04Z" + "updatedAt": "1993-06-29T09:20:49Z" }, "properties": { "artifact": { @@ -78710,24 +79063,24 @@ }, "attempts": { "description": "Retry attempts", - "example": 5798667377295378000, + "example": 3532925794741297700, "minimum": 0, "type": "integer" }, "billMonth": { "description": "Billing month (YYYY-MM format)", - "example": "Angelica Jaskolski", + "example": "Mr. Keyon Watsica", "pattern": "^\\d{4}-\\d{2}$", "type": "string" }, "costMetric": { "description": "Cost metric", - "example": "Architecto laboriosam animi tempore aliquid dolorem.", + "example": "Dolores harum repudiandae excepturi.", "type": "string" }, "createdAt": { "description": "ISO-8601 creation timestamp", - "example": "1977-09-18T15:59:07Z", + "example": "1996-02-03T10:13:55Z", "format": "date-time", "type": "string" }, @@ -78739,28 +79092,28 @@ }, "customerBillingPlan": { "description": "Customer billing plan", - "example": "Minima repellendus.", + "example": "Suscipit molestias occaecati suscipit incidunt ex.", "type": "string" }, "customerId": { "description": "Customer identifier", - "example": 12627299714350088000, + "example": 18059412849561332000, "type": "integer" }, "customerName": { "description": "Customer display name", - "example": "Incidunt et omnis quasi quam.", + "example": "Eius enim quo deserunt omnis eum.", "type": "string" }, "dimensions": { "description": "Stored group-by dimensions", "example": [ - "Sint neque dolores autem porro autem voluptas.", - "Laudantium ut quo quisquam quisquam animi laborum.", - "Non perspiciatis." + "Nisi excepturi iste sapiente temporibus.", + "Sit molestias voluptatibus voluptatum voluptas optio.", + "Possimus sequi cumque id." ], "items": { - "example": "Quos quam cum.", + "example": "Consequatur et at porro.", "type": "string" }, "type": "array" @@ -78772,17 +79125,26 @@ }, "dueDate": { "description": "Invoice due date", - "example": "2007-11-16", + "example": "1987-01-17", "format": "date", "type": "string" }, + "exportLayout": { + "description": "PDF layout format: flatten or nested.", + "enum": [ + "flatten", + "nested" + ], + "example": "flatten", + "type": "string" + }, "exportType": { "description": "Invoice export type", "enum": [ "pdf", "csv" ], - "example": "csv", + "example": "pdf", "type": "string" }, "failure": { @@ -78793,44 +79155,50 @@ }, "filterCount": { "description": "Number of filter expressions", - "example": 9519564133288983000, + "example": 10823215093106594000, "minimum": 0, "type": "integer" }, "freeText": { "description": "Optional free text included in the invoice", - "example": "Est odio velit dolorem eos doloribus.", + "example": "Iste quos.", "type": "string" }, "groupByCount": { "description": "Number of group-by dimensions", - "example": 17219079358788458000, + "example": 9329942893328198000, "minimum": 0, "type": "integer" }, "id": { "description": "Invoice export identifier", - "example": "Vel ut.", + "example": "Ea ut deserunt dolorem cumque blanditiis nam.", "type": "string" }, "invoiceAmount": { "description": "Invoice amount rendered as string", - "example": "In illum assumenda doloribus excepturi.", + "example": "Autem dolore qui aut quam laudantium reiciendis.", + "type": "string" + }, + "invoiceNumber": { + "description": "Invoice number (Invoice ID), scoped to the owning organization. Absent when the invoice has no number. The number is allocated only after bill-lock passes; a failed generation keeps its number and a retry reuses it.", + "example": "uni", + "maxLength": 29, "type": "string" }, "invoiceTemplateId": { "description": "Identifier of the saved template selected when this invoice was created. Empty when no saved template was used.", - "example": "Quibusdam autem dolores.", + "example": "Facere cum aut repellendus harum libero.", "type": "string" }, "isCreateTemplate": { "description": "Whether this invoice created its saved template as part of the request.", - "example": false, + "example": true, "type": "boolean" }, "issueDate": { "description": "Invoice issue date", - "example": "1974-08-15", + "example": "2001-03-20", "format": "date", "type": "string" }, @@ -78844,7 +79212,7 @@ }, "logo": { "description": "Optional logo payload", - "example": "Nihil ut temporibus error.", + "example": "Autem recusandae fuga quo id asperiores dolorem.", "type": "string" }, "orgId": { @@ -78865,7 +79233,7 @@ }, "status": { "description": "Export status", - "example": "Id minus ut tempore provident amet sapiente.", + "example": "Impedit quo dicta natus.", "type": "string" }, "template": { @@ -78873,7 +79241,7 @@ }, "updatedAt": { "description": "ISO-8601 update timestamp", - "example": "2011-07-27T06:07:38Z", + "example": "1972-03-16T22:26:32Z", "format": "date-time", "type": "string" } @@ -78898,7 +79266,7 @@ "FinopsBilling_FlexeraFinopsBillingInvoiceSchedule": { "description": "A recurring schedule that generates and emails invoices for one or more customers.", "example": { - "createdAt": "2013-02-27T06:07:31Z", + "createdAt": "2005-11-26T19:47:48Z", "createdBy": 123, "customers": [ { @@ -78910,14 +79278,12 @@ "email": "david.jones@example.com", "firstName": "David", "lastName": "Jones" - } - ] - }, - { - "customerBillingPlan": "gold", - "customerId": 53125, - "customerName": "MSP Child Org - 52674", - "recipients": [ + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -78930,6 +79296,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -78942,6 +79318,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -78959,6 +79345,11 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "9py", + "invoiceNumberLastUsed": "000041", + "invoiceNumberNext": "000042", + "invoiceNumberPrefix": "n03", + "invoiceNumberingEnabled": true, "invoiceTemplateId": "tmpl_9001", "kind": "finops:invoice-schedule", "nextInvoiceDate": "2026-09-05", @@ -78981,29 +79372,31 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, - "freeText": "Quidem voluptatem aut omnis sint quia.", - "logo": "Unde et est sed.", + "freeText": "Porro quidem voluptatem aut.", + "logo": "Perspiciatis nemo molestiae quasi unde et est.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1972-06-17T22:38:22Z", + "updatedAt": "2001-09-21T15:57:42Z", "updatedBy": 456 }, "properties": { "createdAt": { "description": "ISO-8601 creation timestamp", - "example": "1999-06-06T07:31:15Z", + "example": "1977-06-20T01:58:04Z", "format": "date-time", "type": "string" }, @@ -79020,6 +79413,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -79032,6 +79435,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -79044,6 +79457,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -79068,6 +79491,37 @@ "invoiceIssueDateRule": { "$ref": "#/components/schemas/FinopsBilling_BillingInvoiceIssueDateRule" }, + "invoiceNumberBase": { + "description": "First sequence number of the schedule's numbering. Absent when numbering is disabled.", + "example": "alx", + "maxLength": 9, + "pattern": "^0*[1-9][0-9]*$", + "type": "string" + }, + "invoiceNumberLastUsed": { + "description": "Sequence number most recently allocated by the schedule. Absent until the first allocation. The counter is retained when the schedule is soft-deleted, and re-adding numbering continues from last used + 1.", + "example": "000041", + "pattern": "^[0-9]{1,9}$", + "type": "string" + }, + "invoiceNumberNext": { + "description": "Sequence number the next generated invoice will receive. Absent when numbering is disabled.", + "example": "000042", + "pattern": "^[0-9]{1,9}$", + "type": "string" + }, + "invoiceNumberPrefix": { + "description": "Prefix placed before the sequence number. Empty or absent when there is no prefix.", + "example": "83g", + "maxLength": 20, + "pattern": "^[A-Za-z0-9_-]*$", + "type": "string" + }, + "invoiceNumberingEnabled": { + "description": "Whether the schedule numbers the invoices it generates.", + "example": true, + "type": "boolean" + }, "invoiceTemplateId": { "description": "Identifier of the invoice template shared by every customer on this schedule. Absent when the schedule was created without a template.", "example": "tmpl_9001", @@ -79116,7 +79570,7 @@ }, "updatedAt": { "description": "ISO-8601 last-update timestamp", - "example": "1975-02-16T01:18:42Z", + "example": "2015-09-08T10:39:59Z", "format": "date-time", "type": "string" }, @@ -79146,59 +79600,62 @@ "description": "An invoice generated by an invoice schedule.", "example": { "artifact": { - "expiresAt": "2012-05-17T03:14:31Z", - "url": "Error vel." + "expiresAt": "1997-11-11T17:25:06Z", + "url": "Amet eos tenetur numquam." }, - "attempts": 527696399815392060, - "billMonth": "Raquel Heidenreich", - "costMetric": "Natus a qui consequatur consequuntur magnam ab.", - "createdAt": "1983-08-07T15:57:56Z", + "attempts": 2066864097660898300, + "billMonth": "Ricardo O'Reilly III", + "costMetric": "Dolores temporibus ab porro.", + "createdAt": "1997-07-06T10:03:10Z", "currency": "USD", - "customerBillingPlan": "Doloribus earum quia maxime vel labore.", - "customerId": 14419603428597567000, - "customerName": "Voluptatem nulla libero.", + "customerBillingPlan": "Optio enim non non neque.", + "customerId": 11741086241965162000, + "customerName": "Ipsam repellendus.", "deliveryFailure": { - "code": "Ut sit.", - "message": "Enim labore consequatur molestiae ea consequuntur." + "code": "Voluptas delectus quod est ut sequi.", + "message": "Ut sit." }, - "deliveryStatus": "failed", + "deliveryStatus": "success", "dimensions": [ - "Voluptas maiores sunt accusamus.", - "Nobis numquam.", - "Porro consequatur blanditiis accusamus iste.", - "Est optio quis voluptas." + "Nihil voluptatum.", + "Sapiente fugiat.", + "Nobis error ipsa.", + "Recusandae dicta consequatur quo eos quo est." ], - "displayLogoWithinPdf": true, - "dueDate": "1974-05-17", + "displayLogoWithinPdf": false, + "dueDate": "1982-06-22", + "exportLayout": "flatten", "exportType": "csv", "failure": { - "code": "Explicabo fugit.", - "message": "Eveniet omnis ad." + "code": "Sint commodi consequuntur exercitationem.", + "message": "Doloribus ut molestiae dolorem." }, "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." - }, - "filterCount": 8132468808425781000, - "freeText": "Enim ipsa in impedit occaecati magni.", - "groupByCount": 2218100602198022400, - "id": "Sunt nihil quis voluptatum neque.", - "invoiceAmount": "Id aut.", - "issueDate": "2008-11-03", + "value": "Accusamus deleniti cumque et omnis tempora eum." + }, + "filterCount": 15146749642228128000, + "freeText": "Mollitia iure ducimus est delectus suscipit ut.", + "groupByCount": 14407785425058257000, + "id": "Et fuga modi et ullam et architecto.", + "invoiceAmount": "Distinctio voluptatem repudiandae voluptatem at corrupti.", + "invoiceNumber": "vft", + "issueDate": "1975-02-16", "kind": "finops:invoice-schedule-invoice", - "logo": "Numquam cum maxime esse alias temporibus.", - "messageId": "Magnam nesciunt temporibus culpa.", + "logo": "Voluptas consequatur minus velit et dolores.", + "messageId": "Architecto aut.", "orgId": 100, - "periodType": "chargePeriod", - "scheduleId": "Illo ab aperiam animi ullam.", - "status": "Incidunt sunt eligendi.", - "updatedAt": "1997-11-15T16:29:45Z" + "periodType": "billPeriod", + "scheduleId": "Non quia.", + "status": "Quasi et odit.", + "updatedAt": "1994-05-26T01:37:40Z" }, "properties": { "artifact": { @@ -79206,24 +79663,24 @@ }, "attempts": { "description": "Retry attempts", - "example": 3855011903902488600, + "example": 2282537146323917300, "minimum": 0, "type": "integer" }, "billMonth": { "description": "Billing month (YYYY-MM format)", - "example": "Lea Kerluke", + "example": "Dr. Cydney Schinner", "pattern": "^\\d{4}-\\d{2}$", "type": "string" }, "costMetric": { "description": "Cost metric", - "example": "Fuga nemo illum inventore.", + "example": "Quas et tenetur.", "type": "string" }, "createdAt": { "description": "ISO-8601 creation timestamp", - "example": "1972-10-26T17:22:44Z", + "example": "2005-11-23T23:42:53Z", "format": "date-time", "type": "string" }, @@ -79235,17 +79692,17 @@ }, "customerBillingPlan": { "description": "Customer billing plan", - "example": "Sequi dignissimos molestiae minima molestiae.", + "example": "Et amet amet blanditiis.", "type": "string" }, "customerId": { "description": "Customer identifier", - "example": 15465192475364526000, + "example": 5889171255212619000, "type": "integer" }, "customerName": { "description": "Customer display name", - "example": "Placeat et rerum natus reprehenderit.", + "example": "Aperiam veritatis perferendis ex.", "type": "string" }, "deliveryFailure": { @@ -79263,34 +79720,44 @@ "dimensions": { "description": "Stored group-by dimensions", "example": [ - "Tempora numquam et facere officia non et.", - "Et inventore sapiente.", - "Vitae alias expedita aut sit." + "Qui voluptates id libero quo ut officiis.", + "Ut dolorum maiores id nihil est quidem.", + "Accusamus voluptas unde qui nam.", + "Ea rerum molestiae temporibus et necessitatibus." ], "items": { - "example": "Nulla et aut enim omnis unde quaerat.", + "example": "Quaerat fuga iure est quia eum.", "type": "string" }, "type": "array" }, "displayLogoWithinPdf": { "description": "Whether to display the logo within the PDF", - "example": false, + "example": true, "type": "boolean" }, "dueDate": { "description": "Invoice due date", - "example": "2006-06-02", + "example": "1972-10-15", "format": "date", "type": "string" }, + "exportLayout": { + "description": "PDF layout format: flatten or nested.", + "enum": [ + "flatten", + "nested" + ], + "example": "nested", + "type": "string" + }, "exportType": { "description": "Invoice export type", "enum": [ "pdf", "csv" ], - "example": "csv", + "example": "pdf", "type": "string" }, "failure": { @@ -79301,34 +79768,40 @@ }, "filterCount": { "description": "Number of filter expressions", - "example": 1594370957832142000, + "example": 6288083289396710000, "minimum": 0, "type": "integer" }, "freeText": { "description": "Optional free text included in the invoice", - "example": "Esse non vitae laudantium esse.", + "example": "Atque vel sequi nostrum.", "type": "string" }, "groupByCount": { "description": "Number of group-by dimensions", - "example": 14661024833151982000, + "example": 16467286860773657000, "minimum": 0, "type": "integer" }, "id": { "description": "Invoice export identifier", - "example": "Et repudiandae pariatur dolorem.", + "example": "Numquam dolore.", "type": "string" }, "invoiceAmount": { "description": "Invoice amount rendered as string", - "example": "Qui quos quia.", + "example": "Consequatur nobis ratione rerum rerum.", + "type": "string" + }, + "invoiceNumber": { + "description": "Invoice number (Invoice ID), scoped to the owning organization. Absent when the invoice has no number. The number is allocated only after bill-lock passes; a failed generation keeps its number and a retry reuses it.", + "example": "uz2", + "maxLength": 29, "type": "string" }, "issueDate": { "description": "Invoice issue date", - "example": "1994-04-05", + "example": "2011-07-26", "format": "date", "type": "string" }, @@ -79342,12 +79815,12 @@ }, "logo": { "description": "Optional logo payload", - "example": "Sit dolorum aut exercitationem fugiat omnis.", + "example": "Numquam nihil fugiat assumenda id.", "type": "string" }, "messageId": { "description": "Identifier returned by the notification service.", - "example": "Ullam nostrum nihil et et reiciendis.", + "example": "Iste perferendis dolor sunt doloribus sunt nihil.", "type": "string" }, "orgId": { @@ -79363,22 +79836,22 @@ "billPeriod", "billingPeriod" ], - "example": "billPeriod", + "example": "billingPeriod", "type": "string" }, "scheduleId": { "description": "Identifier of the invoice schedule.", - "example": "Aliquid consectetur.", + "example": "Quas enim iste.", "type": "string" }, "status": { "description": "Export status", - "example": "Minima vel molestiae recusandae.", + "example": "Nostrum voluptates non repudiandae suscipit quos sed.", "type": "string" }, "updatedAt": { "description": "ISO-8601 update timestamp", - "example": "2004-12-05T12:31:18Z", + "example": "1986-08-05T16:46:29Z", "format": "date-time", "type": "string" } @@ -79404,15 +79877,14 @@ "FinopsBilling_FlexeraFinopsBillingInvoiceTemplate": { "description": "A reusable invoice template for ad hoc and scheduled invoice generation.", "example": { - "activeScheduleCount": 15923520689799650000, + "activeScheduleCount": 15401209702529829000, "activeScheduleIds": [ - "Qui accusamus neque excepturi.", - "Enim sed unde ullam.", - "Recusandae neque saepe in officiis saepe.", - "Magni magni." + "Est error dignissimos excepturi omnis.", + "Non assumenda deserunt vel explicabo dolores.", + "Ipsam voluptates." ], "costMetric": "billedCost", - "createdAt": "2007-06-01T09:32:15Z", + "createdAt": "2006-02-23T11:47:11Z", "createdBy": 123, "dimensions": [ "service", @@ -79420,45 +79892,49 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, - "filterCount": 15117958917506110000, - "freeText": "Mollitia consequatur eum dolorum.", - "groupByCount": 14314659304543447000, + "filterCount": 10782359606918447000, + "freeText": "Animi numquam cum sit.", + "groupByCount": 5222533063195095000, "id": "tmpl_9001", "kind": "finops:invoice-template", - "logo": "Vel qui voluptatem sed eveniet consequatur cupiditate.", - "nextInvoiceDate": "1981-09-02", + "logo": "Alias enim soluta asperiores dignissimos asperiores hic.", + "nextInvoiceDate": "2000-10-14", "orgId": 100, "periodType": "chargePeriod", "templateName": "Standard MSP Invoice", - "updatedAt": "1995-09-27T06:17:07Z", + "updatedAt": "1972-06-13T20:01:23Z", "updatedBy": 456 }, "properties": { "activeScheduleCount": { "description": "Count of invoice schedules with status:active that currently reference this template.", - "example": 3599947173067524600, + "example": 1090943898578443400, "minimum": 0, "type": "integer" }, "activeScheduleIds": { "description": "IDs of invoice schedules with status:active that currently reference this template.", "example": [ - "Ut aut.", - "Est similique est id." + "Libero sit quam commodi ipsam.", + "Quia quos.", + "Atque assumenda dolores omnis.", + "Et ex molestiae quis." ], "items": { - "example": "Rem et exercitationem eum veritatis aliquam.", + "example": "Eveniet non.", "type": "string" }, "type": "array" @@ -79476,7 +79952,7 @@ }, "createdAt": { "description": "ISO-8601 creation timestamp", - "example": "1987-08-01T02:16:50Z", + "example": "1982-02-08T12:47:14Z", "format": "date-time", "type": "string" }, @@ -79493,7 +79969,7 @@ "region" ], "items": { - "example": "Quod non assumenda.", + "example": "Necessitatibus molestias necessitatibus expedita.", "type": "string" }, "maxItems": 10, @@ -79504,6 +79980,15 @@ "example": true, "type": "boolean" }, + "exportLayout": { + "description": "PDF layout format. Exact lowercase flatten or nested; omitted PDF exports default to flatten. Must be omitted for CSV exports.", + "enum": [ + "flatten", + "nested" + ], + "example": "flatten", + "type": "string" + }, "exportType": { "description": "Invoice export type", "enum": [ @@ -79518,18 +80003,18 @@ }, "filterCount": { "description": "Number of filter expressions", - "example": 4453990307135764000, + "example": 8935736622674324000, "minimum": 0, "type": "integer" }, "freeText": { "description": "Optional free-text company/address block rendered in the invoice.", - "example": "Sit delectus sint consequatur fugit aut eos.", + "example": "Explicabo ut tempora fugit.", "type": "string" }, "groupByCount": { "description": "Number of group-by dimensions", - "example": 7981829867813561000, + "example": 4290835481504640000, "minimum": 0, "type": "integer" }, @@ -79548,12 +80033,12 @@ }, "logo": { "description": "Optional logo payload stored with the template.", - "example": "Doloribus et qui.", + "example": "Dolorem dolorem necessitatibus.", "type": "string" }, "nextInvoiceDate": { "description": "Optional next invoice date", - "example": "1971-01-22", + "example": "1972-10-15", "format": "date", "type": "string" }, @@ -79581,7 +80066,7 @@ }, "updatedAt": { "description": "ISO-8601 last-update timestamp", - "example": "1980-09-13T19:03:37Z", + "example": "2010-06-26T23:58:25Z", "format": "date-time", "type": "string" }, @@ -79845,7 +80330,7 @@ "bundledDiscount", "distributorDiscount" ], - "example": "distributorDiscount", + "example": "taxRefunds", "type": "string" }, "type": "array" @@ -79931,6 +80416,102 @@ "values": { "description": "The requested adjustment rule values.", "example": [ + { + "createdAt": "2020-11-26T12:17:38.369Z", + "createdBy": { + "id": 1234, + "kind": "iam:user", + "ref": "iam:user:123" + }, + "creditMemo": { + "credit": "-150" + }, + "customUsageRate": { + "rate": "1.515" + }, + "customerIds": [ + 1010, + 2020, + 3030 + ], + "enabled": true, + "endAfter": "2023-05-17", + "fixedAmount": { + "cost": "150" + }, + "id": "ae85f96e-6b9e-4d68-a741-d1ea7ca1fb28", + "kind": "finops:billing-adjustment-rule", + "markupMarkdown": { + "markup": "7.5" + }, + "name": "Margin", + "removeTax": { + "condition": { + "dimension": "bill_source", + "type": "dimension_equals", + "value": "aws-123456789012" + } + }, + "startOn": "2020-03-15", + "type": "markupMarkdown", + "upchargeDiscount": { + "amount": "-2.5" + }, + "updatedAt": "2020-11-26T12:17:38.369Z", + "updatedBy": { + "id": 1234, + "kind": "iam:user", + "ref": "iam:user:123" + } + }, + { + "createdAt": "2020-11-26T12:17:38.369Z", + "createdBy": { + "id": 1234, + "kind": "iam:user", + "ref": "iam:user:123" + }, + "creditMemo": { + "credit": "-150" + }, + "customUsageRate": { + "rate": "1.515" + }, + "customerIds": [ + 1010, + 2020, + 3030 + ], + "enabled": true, + "endAfter": "2023-05-17", + "fixedAmount": { + "cost": "150" + }, + "id": "ae85f96e-6b9e-4d68-a741-d1ea7ca1fb28", + "kind": "finops:billing-adjustment-rule", + "markupMarkdown": { + "markup": "7.5" + }, + "name": "Margin", + "removeTax": { + "condition": { + "dimension": "bill_source", + "type": "dimension_equals", + "value": "aws-123456789012" + } + }, + "startOn": "2020-03-15", + "type": "markupMarkdown", + "upchargeDiscount": { + "amount": "-2.5" + }, + "updatedAt": "2020-11-26T12:17:38.369Z", + "updatedBy": { + "id": 1234, + "kind": "iam:user", + "ref": "iam:user:123" + } + }, { "createdAt": "2020-11-26T12:17:38.369Z", "createdBy": { @@ -80113,58 +80694,14 @@ "ref": "iam:user:123" }, "creditTypes": [ - "Vero possimus optio.", - "Sed accusamus omnis." - ], - "customerIds": [ - 12176942995714097000, - 2353935046958567400, - 17506571747869151000, - 12572758066901092000 - ], - "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", - "kind": "finops:billing-credit-assignment-summary", - "name": "EDP Credits Q1", - "provider": "AWS", - "sourceAccounts": [ - { - "billingAccountId": "111222333", - "billingAccountName": "acme-prod-us-east", - "subAccountId": "777037404548", - "subAccountName": "acme-prod-us-east" - } - ], - "targetBillingAccountId": "4", - "targetBillingAccountName": "acme-target-us-east", - "targetCustomerId": 2001, - "targetSubAccountId": "111122223333", - "targetSubAccountName": "acme-target-us-east", - "updatedAt": "2020-11-26T12:17:38.369Z", - "updatedBy": { - "id": 1234, - "kind": "iam:user", - "ref": "iam:user:123" - } - }, - { - "action": "reassign", - "amount": "100.00", - "billMonth": "202601", - "createdAt": "2020-11-26T12:17:38.369Z", - "createdBy": { - "id": 1234, - "kind": "iam:user", - "ref": "iam:user:123" - }, - "creditTypes": [ - "Vero possimus optio.", - "Sed accusamus omnis." + "Qui et voluptas.", + "Assumenda doloribus quibusdam repellendus magni.", + "Aut quam optio.", + "Temporibus voluptatum vero possimus optio laudantium." ], "customerIds": [ - 12176942995714097000, - 2353935046958567400, - 17506571747869151000, - 12572758066901092000 + 13201221188460323000, + 11231078588283378000 ], "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "kind": "finops:billing-credit-assignment-summary", @@ -80201,14 +80738,14 @@ "ref": "iam:user:123" }, "creditTypes": [ - "Vero possimus optio.", - "Sed accusamus omnis." + "Qui et voluptas.", + "Assumenda doloribus quibusdam repellendus magni.", + "Aut quam optio.", + "Temporibus voluptatum vero possimus optio laudantium." ], "customerIds": [ - 12176942995714097000, - 2353935046958567400, - 17506571747869151000, - 12572758066901092000 + 13201221188460323000, + 11231078588283378000 ], "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "kind": "finops:billing-credit-assignment-summary", @@ -80405,154 +80942,6 @@ "ref": "iam:user:123" } }, - { - "createdAt": "2020-11-26T12:17:38.369Z", - "createdBy": { - "id": 1234, - "kind": "iam:user", - "ref": "iam:user:123" - }, - "creditMemo": { - "credit": "-150" - }, - "customUsageRate": { - "rate": "1.515" - }, - "enabled": true, - "endAfter": "2023-05-17", - "fixedAmount": { - "cost": "150" - }, - "generateTax": { - "rate": "7.5" - }, - "hideCredits": { - "condition": { - "dimension": "bill_source", - "type": "dimension_equals", - "value": "aws-123456789012" - }, - "creditTypes": [ - "edpDiscount", - "privateRateDiscount" - ] - }, - "id": "ae85f96e-6b9e-4d68-a741-d1ea7ca1fb28", - "kind": "finops:billing-enterprise-rule", - "markupMarkdown": { - "markup": "7.5" - }, - "name": "Margin", - "removeAzureLicenseCosts": { - "condition": { - "dimension": "bill_source", - "type": "dimension_equals", - "value": "cbi-oi-azure-ea-12345678" - } - }, - "removeTax": { - "condition": { - "dimension": "bill_source", - "type": "dimension_equals", - "value": "aws-123456789012" - } - }, - "startOn": "2020-03-15", - "supportCharge": { - "applyBy": "customer", - "applyMinimum": false, - "condition": { - "dimension": "bill_source", - "type": "dimension_equals", - "value": "aws-123456789012" - }, - "tier": "business" - }, - "type": "markupMarkdown", - "upchargeDiscount": { - "amount": "-2.5" - }, - "updatedAt": "2020-11-26T12:17:38.369Z", - "updatedBy": { - "id": 1234, - "kind": "iam:user", - "ref": "iam:user:123" - } - }, - { - "createdAt": "2020-11-26T12:17:38.369Z", - "createdBy": { - "id": 1234, - "kind": "iam:user", - "ref": "iam:user:123" - }, - "creditMemo": { - "credit": "-150" - }, - "customUsageRate": { - "rate": "1.515" - }, - "enabled": true, - "endAfter": "2023-05-17", - "fixedAmount": { - "cost": "150" - }, - "generateTax": { - "rate": "7.5" - }, - "hideCredits": { - "condition": { - "dimension": "bill_source", - "type": "dimension_equals", - "value": "aws-123456789012" - }, - "creditTypes": [ - "edpDiscount", - "privateRateDiscount" - ] - }, - "id": "ae85f96e-6b9e-4d68-a741-d1ea7ca1fb28", - "kind": "finops:billing-enterprise-rule", - "markupMarkdown": { - "markup": "7.5" - }, - "name": "Margin", - "removeAzureLicenseCosts": { - "condition": { - "dimension": "bill_source", - "type": "dimension_equals", - "value": "cbi-oi-azure-ea-12345678" - } - }, - "removeTax": { - "condition": { - "dimension": "bill_source", - "type": "dimension_equals", - "value": "aws-123456789012" - } - }, - "startOn": "2020-03-15", - "supportCharge": { - "applyBy": "customer", - "applyMinimum": false, - "condition": { - "dimension": "bill_source", - "type": "dimension_equals", - "value": "aws-123456789012" - }, - "tier": "business" - }, - "type": "markupMarkdown", - "upchargeDiscount": { - "amount": "-2.5" - }, - "updatedAt": "2020-11-26T12:17:38.369Z", - "updatedBy": { - "id": 1234, - "kind": "iam:user", - "ref": "iam:user:123" - } - }, { "createdAt": "2020-11-26T12:17:38.369Z", "createdBy": { @@ -80730,29 +81119,6 @@ "ref": "iam:user:123" } }, - { - "createdAt": "2020-11-26T12:17:38.369Z", - "createdBy": { - "id": 1234, - "kind": "iam:user", - "ref": "iam:user:123" - }, - "customerIds": [ - 1010, - 2020, - 3030 - ], - "description": "Gold Tier Customers enjoy our highest discounts", - "id": "c6671c74-513a-4127-b8df-81adfb65bf7f", - "kind": "finops:billing-adjustment-plan", - "name": "Gold Tier", - "updatedAt": "2020-11-26T12:17:38.369Z", - "updatedBy": { - "id": 1234, - "kind": "iam:user", - "ref": "iam:user:123" - } - }, { "createdAt": "2020-11-26T12:17:38.369Z", "createdBy": { @@ -81491,7 +81857,7 @@ "a02c75c8-e585-4e7c-9d83-07f4efef7f03" ], "items": { - "example": "39j", + "example": "m", "minLength": 1, "type": "string" }, @@ -81545,6 +81911,10 @@ "FinopsBilling_ReorderRequestBody": { "example": { "rules": [ + { + "priority": 1, + "ruleId": "68f2a91c4b3d2e1f5a6b7c8d" + }, { "priority": 1, "ruleId": "68f2a91c4b3d2e1f5a6b7c8d" @@ -81555,6 +81925,14 @@ "rules": { "description": "List of rules whose priority is changing, with their new priorities.", "example": [ + { + "priority": 1, + "ruleId": "68f2a91c4b3d2e1f5a6b7c8d" + }, + { + "priority": 1, + "ruleId": "68f2a91c4b3d2e1f5a6b7c8d" + }, { "priority": 1, "ruleId": "68f2a91c4b3d2e1f5a6b7c8d" @@ -82042,9 +82420,28 @@ }, "FinopsBilling_ReplaceSettingsRequestBody": { "example": { + "automatedEdpProfiles": [ + { + "billSource": "aws-123456789012", + "enabled": true + } + ], "baseCostsOn": "billedCost" }, "properties": { + "automatedEdpProfiles": { + "description": "Automated EDP settings by AWS bill source. Providing an empty list or omitting this field replaces existing profiles with an empty list and disables Automated EDP for all bill sources.", + "example": [ + { + "billSource": "aws-123456789012", + "enabled": true + } + ], + "items": { + "$ref": "#/components/schemas/FinopsBilling_AutomatedEdpProfile" + }, + "type": "array" + }, "baseCostsOn": { "description": "The base cost value used for adjustments. Note that using 'listCost' may reduce the utility of some adjustment rules. The 'observedCosts' value is deprecated; use 'billedCost' or 'modifiedCost' instead. The 'observedCosts' value is retained for legacy compatibility.", "enum": [ @@ -82384,9 +82781,28 @@ }, "FinopsBilling_ShowSettingsResponseBody": { "example": { + "automatedEdpProfiles": [ + { + "billSource": "aws-123456789012", + "enabled": true + } + ], "baseCostsOn": "billedCost" }, "properties": { + "automatedEdpProfiles": { + "description": "Automated EDP settings by AWS bill source. An empty list disables Automated EDP for all bill sources.", + "example": [ + { + "billSource": "aws-123456789012", + "enabled": true + } + ], + "items": { + "$ref": "#/components/schemas/FinopsBilling_AutomatedEdpProfile" + }, + "type": "array" + }, "baseCostsOn": { "description": "The base cost value used for adjustments. Note that using 'listCost' may reduce the utility of some adjustment rules. The 'observedCosts' value is deprecated; use 'billedCost' or 'modifiedCost' instead. The 'observedCosts' value is retained for legacy compatibility.", "enum": [ @@ -82395,12 +82811,13 @@ "billedCost", "modifiedCost" ], - "example": "observedCosts", + "example": "modifiedCost", "type": "string" } }, "required": [ - "baseCostsOn" + "baseCostsOn", + "automatedEdpProfiles" ], "type": "object" }, @@ -82775,26 +83192,26 @@ }, "FinopsBilling_UpchargeTier": { "example": { - "amount": "Dena Stark", - "endCost": "Fabiola Moen", - "startCost": "Miss Korey Howell" + "amount": "Logan Nikolaus", + "endCost": "Moises White Jr.", + "startCost": "Earnest Keebler" }, "properties": { "amount": { "description": "upcharge percentage applied by this tier", - "example": "Travis Volkman", + "example": "Ms. Yazmin Cronin", "pattern": "^[-+]?[0-9]+(?:[.][0-9]+)?$", "type": "string" }, "endCost": { "description": "inclusive upper bound for this tier", - "example": "Lora Stiedemann", + "example": "Moshe Jakubowski III", "pattern": "^[-+]?[0-9]+(?:[.][0-9]+)?(?:[eE][-+]?[0-9]+)?$", "type": "string" }, "startCost": { "description": "exclusive lower bound for this tier", - "example": "Ericka Ritchie", + "example": "Miss Hector Schowalter", "pattern": "^[-+]?[0-9]+(?:[.][0-9]+)?(?:[eE][-+]?[0-9]+)?$", "type": "string" } @@ -82819,11 +83236,6 @@ "firstName": "David", "lastName": "Jones" }, - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, { "email": "david.jones@example.com", "firstName": "David", @@ -82836,55 +83248,6 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - } - ] - }, - { - "customerBillingPlan": "gold", - "customerId": 53125, - "customerName": "MSP Child Org - 52674", - "recipients": [ - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - } - ] - }, - { - "customerBillingPlan": "gold", - "customerId": 53125, - "customerName": "MSP Child Org - 52674", - "recipients": [ - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, { "email": "david.jones@example.com", "firstName": "David", @@ -82906,6 +83269,8 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "6fj", + "invoiceNumberPrefix": "j3z", "invoiceTemplateId": "tmpl_9002", "isCreateTemplate": false, "schedule": { @@ -82916,7 +83281,8 @@ "timeOfDay": "06:00", "timezone": "UTC" }, - "scheduleName": "xay", + "scheduleName": "880", + "status": "inactive", "template": { "costMetric": "billedCost", "dimensions": [ @@ -82925,19 +83291,21 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Sit eos mollitia debitis cum.", + "dimension": "Aut facilis autem non non eum.", "expressions": [ + {}, {}, {} ], - "substring": "Earum iusto unde sit exercitationem aut.", + "substring": "Qui suscipit quas temporibus voluptates voluptatem quo.", "type": "equal", - "value": "Iusto repudiandae consequuntur adipisci." + "value": "Voluptatem eius." }, - "freeText": "Facere ut aut et ipsum ut.", - "logo": "Harum qui ipsam dignissimos.", + "freeText": "Adipisci enim earum iusto unde sit.", + "logo": "Mollitia debitis cum fuga iusto repudiandae.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" } @@ -82956,11 +83324,6 @@ "firstName": "David", "lastName": "Jones" }, - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, { "email": "david.jones@example.com", "firstName": "David", @@ -82978,6 +83341,18 @@ "firstName": "David", "lastName": "Jones" }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + } + ] + }, + { + "customerBillingPlan": "gold", + "customerId": 53125, + "customerName": "MSP Child Org - 52674", + "recipients": [ { "email": "david.jones@example.com", "firstName": "David", @@ -83002,6 +83377,20 @@ "invoiceIssueDateRule": { "$ref": "#/components/schemas/FinopsBilling_BillingInvoiceIssueDateRule" }, + "invoiceNumberBase": { + "description": "Optional updated first sequence number for the invoice numbers this schedule generates.", + "example": "n3b", + "maxLength": 9, + "pattern": "^$|^0*[1-9][0-9]*$", + "type": "string" + }, + "invoiceNumberPrefix": { + "description": "Optional updated prefix for the invoice numbers this schedule generates. Requires invoiceNumberBase.", + "example": "xkx", + "maxLength": 20, + "pattern": "^[A-Za-z0-9_-]*$", + "type": "string" + }, "invoiceTemplateId": { "description": "Existing invoice template to point the schedule at. Send isCreateTemplate=false with this field omitted to detach the schedule's template.", "example": "tmpl_9002", @@ -83017,10 +83406,18 @@ }, "scheduleName": { "description": "Updated name.", - "example": "p4y", + "example": "dq5", "maxLength": 255, "type": "string" }, + "status": { + "description": "Updated lifecycle status. PATCH accepts only inactive; use the activate endpoint to reactivate a schedule.", + "enum": [ + "inactive" + ], + "example": "inactive", + "type": "string" + }, "template": { "$ref": "#/components/schemas/FinopsBilling_BillingInvoiceScheduleTemplateInput" } @@ -83029,28 +83426,30 @@ }, "FinopsBilling_UpdateRequestBody2": { "example": { - "costMetric": "effectiveCost", + "costMetric": "billedCost", "dimensions": [ - "Ratione doloribus mollitia repudiandae doloremque libero enim.", - "Error possimus distinctio sed eum et maxime.", - "Necessitatibus quia provident sit." + "Non sapiente sequi aut et.", + "Facere maiores ut.", + "Veritatis ratione qui impedit similique eum." ], - "displayLogoWithinPdf": true, + "displayLogoWithinPdf": false, + "exportLayout": "flatten", "exportType": "csv", "filter": { - "dimension": "Sit eos mollitia debitis cum.", + "dimension": "Aut facilis autem non non eum.", "expressions": [ + {}, {}, {} ], - "substring": "Earum iusto unde sit exercitationem aut.", + "substring": "Qui suscipit quas temporibus voluptates voluptatem quo.", "type": "equal", - "value": "Iusto repudiandae consequuntur adipisci." + "value": "Voluptatem eius." }, - "freeText": "Ipsam non.", - "logo": "Voluptatem aut consequatur et ratione.", - "periodType": "chargePeriod", - "templateName": "wh1" + "freeText": "Quam rerum ab blanditiis.", + "logo": "Quia dolorem perspiciatis animi eligendi.", + "periodType": "billPeriod", + "templateName": "uoh" }, "properties": { "costMetric": { @@ -83067,12 +83466,12 @@ "dimensions": { "description": "Updated grouping dimensions.", "example": [ - "Temporibus nihil minima non asperiores quisquam.", - "Qui animi temporibus non excepturi.", - "Quo praesentium ea vitae molestias dolores et." + "Sit sunt eveniet sunt est facere temporibus.", + "Sit laboriosam.", + "Provident at ipsum." ], "items": { - "example": "Sequi sunt.", + "example": "Tenetur molestiae eos suscipit ut.", "type": "string" }, "maxItems": 10, @@ -83080,16 +83479,25 @@ }, "displayLogoWithinPdf": { "description": "Updated PDF logo display flag.", - "example": true, + "example": false, "type": "boolean" }, + "exportLayout": { + "description": "Updated PDF layout format. Exact lowercase flatten or nested; omitted PDF exports default to flatten. Must be omitted for CSV exports.", + "enum": [ + "flatten", + "nested" + ], + "example": "nested", + "type": "string" + }, "exportType": { "description": "Updated export type.", "enum": [ "pdf", "csv" ], - "example": "pdf", + "example": "csv", "type": "string" }, "filter": { @@ -83097,12 +83505,12 @@ }, "freeText": { "description": "Updated free-text company/address block.", - "example": "Ut libero animi porro illo.", + "example": "Quia sit.", "type": "string" }, "logo": { "description": "Updated logo payload.", - "example": "Pariatur illum quibusdam quis.", + "example": "Nulla ducimus ut dolores quibusdam voluptas.", "type": "string" }, "periodType": { @@ -83117,7 +83525,7 @@ }, "templateName": { "description": "Updated template name.", - "example": "561", + "example": "39a", "maxLength": 255, "type": "string" } @@ -83133,11 +83541,6 @@ "percentage": 50, "value": "Orion" }, - { - "dimensionId": "rbd_team", - "percentage": 50, - "value": "Orion" - }, { "dimensionId": "rbd_team", "percentage": 50, @@ -83198,15 +83601,6 @@ ] } }, - { - "dimensionId": "vendor", - "valueListCondition": { - "values": [ - "AWS", - "Azure" - ] - } - }, { "dimensionId": "vendor", "valueListCondition": { @@ -83250,7 +83644,7 @@ "Azure" ], "items": { - "example": "Fuga sed tempore.", + "example": "Quod qui nulla.", "type": "string" }, "minItems": 1, @@ -83413,6 +83807,36 @@ "values": { "description": "The requested vendor credit values.", "example": [ + { + "amount": "-150.0000000000", + "assignedBy": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", + "billMonth": "202601", + "billingAccountId": "111222333", + "billingAccountName": "acme-prod-us-east", + "chargeDescription": "AWS Enterprise Discount Program", + "creditType": "EdpDiscount", + "customerId": 2001, + "kind": "finops:billing-vendor-credit", + "lineItemCount": 42, + "provider": "AWS", + "subAccountId": "777037404548", + "subAccountName": "acme-prod-us-east" + }, + { + "amount": "-150.0000000000", + "assignedBy": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", + "billMonth": "202601", + "billingAccountId": "111222333", + "billingAccountName": "acme-prod-us-east", + "chargeDescription": "AWS Enterprise Discount Program", + "creditType": "EdpDiscount", + "customerId": 2001, + "kind": "finops:billing-vendor-credit", + "lineItemCount": 42, + "provider": "AWS", + "subAccountId": "777037404548", + "subAccountName": "acme-prod-us-east" + }, { "amount": "-150.0000000000", "assignedBy": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", @@ -90448,6 +90872,39 @@ }, "timestamp": "1985-04-07T08:12:52Z" }, + { + "eventType": "api.event", + "kind": "iam:api-event", + "principal": { + "email": "someone@SomeWhere.com", + "firstName": "Jane", + "id": 12345, + "kind": "iam:user", + "lastName": "Smith", + "name": "Jane Smith", + "ref": "ref:nam:::iam:user:12345" + }, + "request": { + "bodyBytes": 20, + "httpHost": "api.flexera.com", + "httpMethod": "GET", + "httpPath": "/iam/v1/orgs/100/users", + "id": "7bfcf75b8c4b4b5d9d9f05937f039307", + "ip": "1.2.3.4", + "userAgent": { + "browser": "Chrome", + "os": "Mac OS X", + "raw": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" + } + }, + "response": { + "bodyBytes": 100, + "durationMs": 300, + "httpCode": 200, + "httpStatus": "Ok" + }, + "timestamp": "1985-04-07T08:12:52Z" + }, { "eventType": "api.event", "kind": "iam:api-event", @@ -90715,7 +91172,7 @@ 2002 ], "items": { - "example": 17755399261711120000, + "example": 10350574219687018000, "type": "integer" }, "type": "array" @@ -90732,7 +91189,7 @@ 5678 ], "items": { - "example": 12044837464767205000, + "example": 7967003050873464000, "type": "integer" }, "type": "array" @@ -91467,24 +91924,6 @@ }, "updatedAt": "2006-10-02T13:28:02Z" }, - { - "capabilityName": "iam", - "createdAt": "2001-11-25T19:59:41Z", - "description": "d02", - "expiresAt": "1996-04-11T15:49:23Z", - "kind": "iam#capability", - "onboardingStatus": "pending", - "orgId": 100, - "terms": { - "Embedded Monitoring": "true", - "Features": [ - "monitoring", - "dashboards" - ], - "Number Of Computers": 500 - }, - "updatedAt": "2006-10-02T13:28:02Z" - }, { "capabilityName": "iam", "createdAt": "2001-11-25T19:59:41Z", @@ -91576,38 +92015,6 @@ } ] }, - { - "capability": "iam", - "roles": [ - { - "category": "Automation", - "description": "Can view organization resources", - "displayName": "Approve policies", - "privileges": [ - "acme:widget:update" - ], - "role_name": "policy_approver" - }, - { - "category": "Automation", - "description": "Can view organization resources", - "displayName": "Approve policies", - "privileges": [ - "acme:widget:update" - ], - "role_name": "policy_approver" - }, - { - "category": "Automation", - "description": "Can view organization resources", - "displayName": "Approve policies", - "privileges": [ - "acme:widget:update" - ], - "role_name": "policy_approver" - } - ] - }, { "capability": "iam", "roles": [ @@ -91918,7 +92325,7 @@ "iam_admin" ], "items": { - "example": "Minima deserunt iusto ut temporibus.", + "example": "Est odio atque sit saepe quia quia.", "type": "string" }, "type": "array" @@ -91958,7 +92365,7 @@ "acme:widget:update" ], "items": { - "example": "Omnis nisi.", + "example": "Tempore eum.", "type": "string" }, "type": "array" @@ -92005,7 +92412,7 @@ 2002 ], "items": { - "example": 11727858058066051000, + "example": 12044837464767205000, "type": "integer" }, "type": "array" @@ -92022,7 +92429,7 @@ 1002 ], "items": { - "example": 135567873249863220, + "example": 13189163157627937000, "type": "integer" }, "type": "array" @@ -92225,12 +92632,6 @@ "iam_admin" ] }, - { - "capability": "iam", - "roles": [ - "iam_admin" - ] - }, { "capability": "iam", "roles": [ @@ -92258,12 +92659,6 @@ "iam_admin" ] }, - { - "capability": "iam", - "roles": [ - "iam_admin" - ] - }, { "capability": "iam", "roles": [ @@ -93623,7 +94018,7 @@ "httpCode": 200, "httpStatus": "Ok" }, - "timestamp": "1996-04-15T06:53:35Z" + "timestamp": "1995-09-24T05:36:49Z" }, "properties": { "eventType": { @@ -93650,7 +94045,7 @@ }, "timestamp": { "description": "The time the API request was received in UTC", - "example": "2000-02-17T01:42:55Z", + "example": "1993-07-20T06:02:03Z", "format": "date-time", "type": "string" } @@ -93729,9 +94124,9 @@ "description": "An association between an Organization and a Capability", "example": { "capabilityName": "iam", - "createdAt": "1991-10-12T08:23:31Z", - "description": "7s7", - "expiresAt": "1986-06-11T03:04:48Z", + "createdAt": "1976-06-14T09:30:48Z", + "description": "0gu", + "expiresAt": "2011-03-29T18:15:33Z", "kind": "iam#capability", "onboardingStatus": "pending", "orgId": 100, @@ -93743,7 +94138,7 @@ ], "Number Of Computers": 500 }, - "updatedAt": "1970-11-13T17:58:57Z" + "updatedAt": "1970-07-01T05:29:54Z" }, "properties": { "capabilityName": { @@ -93754,20 +94149,20 @@ }, "createdAt": { "description": "Creation timestamp in UTC", - "example": "1974-08-14T13:22:11Z", + "example": "1972-07-22T21:58:50Z", "format": "date-time", "type": "string" }, "description": { "description": "A description of the Capability", - "example": "i", + "example": "k", "maxLength": 65536, "minLength": 1, "type": "string" }, "expiresAt": { "description": "Expiration date in UTC", - "example": "1990-05-31T03:28:59Z", + "example": "1977-03-12T13:07:59Z", "format": "date-time", "type": "string" }, @@ -93805,7 +94200,7 @@ }, "updatedAt": { "description": "Last update timestamp in UTC", - "example": "1996-12-01T02:17:44Z", + "example": "1985-07-01T22:25:49Z", "format": "date-time", "type": "string" } @@ -93951,7 +94346,7 @@ "properties": { "authenticationRequired": { "description": "Customization types which require authentication may apply only after the users have logged in (e.g. on\nthe Flexera One home page). Customization types which do not require authentication may apply to users who have not\nlogged in (e.g. on the Flexera One login page).", - "example": true, + "example": false, "type": "boolean" }, "description": { @@ -94173,7 +94568,6 @@ "items": { "additionalProperties": true, "example": { - "Natus ipsum ipsam omnis.": "Minus a cum sed recusandae non qui.", "Qui qui amet autem quis.": "Rerum et." }, "type": "object" @@ -94182,7 +94576,7 @@ }, "timestamp": { "description": "The time the event occurred in UTC", - "example": "2006-05-07T05:57:22Z", + "example": "1990-05-23T18:46:50Z", "format": "date-time", "type": "string" } @@ -94200,7 +94594,7 @@ "Iam_FlexeraIamEventOutcomeMedia": { "description": "Information regarding the outcome of the action taken by the principal", "example": { - "result": "success" + "result": "failure" }, "properties": { "result": { @@ -94209,7 +94603,7 @@ "success", "failure" ], - "example": "success", + "example": "failure", "type": "string" } }, @@ -97151,7 +97545,7 @@ "Software" ], "items": { - "example": "Ipsa et sequi dolorum labore quod voluptatem.", + "example": "Iste qui eos adipisci.", "type": "string" }, "type": "array" @@ -97163,7 +97557,7 @@ "msp_admin" ], "items": { - "example": "Vel dolore.", + "example": "Laudantium architecto consequatur deleniti omnis iusto eos.", "type": "string" }, "type": "array" @@ -97348,31 +97742,6 @@ "msp_admin" ] }, - { - "description": "Access to quarterly and annual reports", - "granularScope": { - "description": "Scope for finance department access", - "id": "c1d2e3f4-a5b6-7c8d-9e0f-1a2b3c4d5e6f", - "name": "Finance Department Scope", - "selectedScope": { - "nodeIds": [ - "2.3.", - "1.11.12." - ] - } - }, - "id": "f1e2d3c4-b5a6-7c8d-9e0f-1a2b3c4d5e6f", - "name": "View Financial Reports", - "permissionCategory": "DataAccess", - "permissions": [ - "Hardware", - "Software" - ], - "roleNames": [ - "org_owner", - "msp_admin" - ] - }, { "description": "Access to quarterly and annual reports", "granularScope": { @@ -97703,7 +98072,7 @@ "Software" ], "items": { - "example": "Eos dolores dolor praesentium quidem.", + "example": "Provident debitis omnis eum voluptatem necessitatibus.", "type": "string" }, "type": "array" @@ -97715,7 +98084,7 @@ "msp_admin" ], "items": { - "example": "Deleniti nulla itaque molestiae suscipit at.", + "example": "Velit magni natus quos.", "type": "string" }, "type": "array" @@ -100880,7 +101249,7 @@ "1.11.12." ], "items": { - "example": "Hic iste qui eos.", + "example": "Dolor praesentium.", "type": "string" }, "type": "array" @@ -100892,7 +101261,7 @@ "Location/United States of America/Itasca" ], "items": { - "example": "Sed laudantium.", + "example": "Ipsa deleniti nulla itaque.", "type": "string" }, "type": "array" @@ -101061,12 +101430,12 @@ }, "Iam_SingleIdentityProviderID": { "example": { - "id": "Cumque expedita numquam rerum." + "id": "Sequi dolorum labore quod voluptatem ab." }, "properties": { "id": { "description": "The unique identifier for the identity provider", - "example": "Et atque.", + "example": "Occaecati quidem ipsa.", "type": "string" } }, @@ -101528,7 +101897,7 @@ 103 ], "items": { - "example": 10350574219687018000, + "example": 687745363019016400, "type": "integer" }, "type": "array" @@ -101646,6 +102015,12 @@ "format": "uri", "type": "string" }, + "prevPage": { + "description": "URL to the previous page of data. The first page of data will not return a prevPage value.", + "example": "/iam/v1/orgs/123/users?skipToken=8b1750u", + "format": "uri", + "type": "string" + }, "values": { "description": "The list of a users.", "items": { @@ -101655,7 +102030,8 @@ } }, "required": [ - "values" + "values", + "kind" ], "type": "object" }, @@ -102144,167 +102520,2101 @@ "title": "DataFieldResponse", "type": "object" }, - "OptimaRecommendations_RecommendationResultResponse": { - "description": "A cost-saving recommendation. (default view)", + "OptimaRecommendations_DataFieldResponseBody": { + "description": "Extended details data field", "example": { - "accountID": "1234-5678-9012", - "accountName": "Test Account", - "billingCenterID": "o5g6iXY0AQADmckH0gjaAi", - "billingCenterName": "Marketing", - "createdAt": "2021-08-22T00:00:00Z", - "customTagDimensions": { - "tag_1": "demoMachine", - "tag_2": "randomName" - }, - "databaseEngine": "MySQL", - "details": { - "Location": "centralus", - "Net Savings": "50.98", - "Total RI Quantity to Purchase": 1 + "label": "Net Savings", + "value": 1 + }, + "properties": { + "label": { + "description": "Field Label", + "example": "Net Savings", + "type": "string" }, - "detailsExtended": { - "location": { - "label": "Location", - "value": "centralus" + "value": { + "description": "Field Value", + "example": 1, + "format": "binary", + "type": "string", + "x-go-type": "interface{}" + } + }, + "required": [ + "label", + "value" + ], + "title": "DataFieldResponseBody", + "type": "object" + }, + "OptimaRecommendations_GroupTreeNodeResponseBody": { + "description": "A group of recommendations sharing the same value of the groupBy field at this level of the tree.", + "example": { + "children": [ + { + "children": [ + {}, + {} + ], + "count": 120, + "totalSavings": 15230.5, + "value": "AWS" }, - "quantityToPurchase": { - "label": "Total RI Quantity to Purchase", - "value": 1 + { + "children": [ + {}, + {} + ], + "count": 120, + "totalSavings": 15230.5, + "value": "AWS" }, - "savings": { - "label": "Net Savings", - "value": "50.98" + { + "children": [ + {}, + {} + ], + "count": 120, + "totalSavings": 15230.5, + "value": "AWS" + }, + { + "children": [ + {}, + {} + ], + "count": 120, + "totalSavings": 15230.5, + "value": "AWS" } - }, - "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", - "incidentID": "66db5ea9d7048a1c94c09636", - "kind": "optima#recommendation", - "policySet": "Idle Compute Instances", - "quantityToPurchase": 3, - "recommendation": "AWS Savings Plan", - "region": "US West (Oregon)", - "resourceGroup": "RS-DEFAULT-EASTUS", - "resourceID": "vol-0475890d8fc70a26f", - "resourceType": "m5.2xlarge", - "ruleBasedDimensions": { - "rbd_1": "demoMachine", - "rbd_2": "randomName" - }, - "savings": 361.5, - "service": "EC2", - "snoozedTargetDate": "2025-01-30", - "status": "active", - "statusReason": "Moved to snoozed since it is not relevant for now", - "statusUpdatedAt": "2021-08-22T00:00:00Z", - "tags": [ - "env=production" ], - "type": "Rate Reduction", - "updatedAt": "2021-08-22T00:00:00Z", - "vendor": "AWS" + "count": 120, + "totalSavings": 15230.5, + "value": "AWS" }, "properties": { - "accountID": { - "description": "The account ID", - "example": "1234-5678-9012", - "type": "string" - }, - "accountName": { - "description": "The account name", - "example": "Test Account", - "type": "string" - }, - "billingCenterID": { - "description": "The ID of the top-level billing center this recommendation is assigned to", - "example": "o5g6iXY0AQADmckH0gjaAi", - "type": "string" - }, - "billingCenterName": { - "description": "The name of the top-level billing center this recommendation is assigned to", - "example": "Marketing", - "type": "string" + "children": { + "description": "The groups of the next groupBy field within this group. Empty at the last level.", + "example": [ + { + "children": [ + {}, + {} + ], + "count": 120, + "totalSavings": 15230.5, + "value": "AWS" + }, + { + "children": [ + {}, + {} + ], + "count": 120, + "totalSavings": 15230.5, + "value": "AWS" + }, + { + "children": [ + {}, + {} + ], + "count": 120, + "totalSavings": 15230.5, + "value": "AWS" + } + ], + "items": { + "$ref": "#/components/schemas/OptimaRecommendations_GroupTreeNodeResponseBody" + }, + "type": "array" }, - "createdAt": { - "description": "Timestamp when the recommendation was created.", - "example": "2021-08-22T00:00:00Z", - "format": "date-time", - "type": "string" + "count": { + "description": "The number of recommendations in this group and its children.", + "example": 120, + "format": "int64", + "type": "integer" }, - "customTagDimensions": { - "additionalProperties": { - "example": "Voluptatem velit sint esse.", - "type": "string" - }, - "description": "The custom tag dimensions that could be populated by the raw tags of the recommendation.", - "example": { - "tag_1": "demoMachine", - "tag_2": "randomName" - }, - "type": "object" + "totalSavings": { + "description": "The total savings of the recommendations in this group and its children.", + "example": 15230.5, + "format": "double", + "type": "number" }, - "databaseEngine": { - "description": "The database engine to purchase", - "example": "MySQL", + "value": { + "description": "The value of the groupBy field at this level. Empty for recommendations that have no value for it. For groupBy billingCenterID this is the billing center ID.", + "example": "AWS", "type": "string" - }, - "details": { - "additionalProperties": true, - "description": "Additional details about the recommendation.", - "example": { - "Location": "centralus", - "Net Savings": "50.98", - "Total RI Quantity to Purchase": 1 + } + }, + "required": [ + "value", + "count", + "totalSavings", + "children" + ], + "title": "GroupTreeNodeResponseBody", + "type": "object" + }, + "OptimaRecommendations_RateReductionCombinationLeafResponseBody": { + "example": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 }, - "type": "object" - }, - "detailsExtended": { - "additionalProperties": { - "$ref": "#/components/schemas/OptimaRecommendations_DataFieldResponse" + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 }, - "description": "Extended details about the recommendation.", - "example": { - "location": { - "label": "Location", - "value": "centralus" - }, - "quantityToPurchase": { - "label": "Total RI Quantity to Purchase", - "value": 1 + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + } + ], + "recommendationCount": 410, + "savingsPerMonth": 134171.79 + }, + "properties": { + "byCategory": { + "description": "Per-category breakdown of this combination (the recommendations' policySet), largest savings first, each split by vendor.", + "example": [ + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 }, - "savings": { - "label": "Net Savings", - "value": "50.98" + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 } + ], + "items": { + "$ref": "#/components/schemas/OptimaRecommendations_RateReductionSavingsCategoryResponseBody" }, - "type": "object" + "type": "array" }, - "id": { - "description": "The ID of the recommendation", - "example": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", - "type": "string" + "recommendationCount": { + "description": "Number of recommendations in this combination.", + "example": 410, + "format": "int64", + "type": "integer" }, - "incidentID": { - "description": "ID of the incident that recommendation belongs to", - "example": "66db5ea9d7048a1c94c09636", - "type": "string" + "savingsPerMonth": { + "description": "Savings per month for this exact combination.", + "example": 134171.79, + "format": "double", + "type": "number" + } + }, + "required": [ + "savingsPerMonth", + "recommendationCount", + "byCategory" + ], + "title": "RateReductionCombinationLeafResponseBody", + "type": "object" + }, + "OptimaRecommendations_RateReductionCombinationSelectionResponseBody": { + "example": { + "commitmentTerm": 12, + "commitmentType": "reserved_instance", + "paymentType": "no_upfront" + }, + "properties": { + "commitmentTerm": { + "description": "Commitment term, in months.", + "enum": [ + 12, + 36 + ], + "example": 12, + "format": "int64", + "type": "integer" }, - "kind": { - "description": "The kind of object", + "commitmentType": { + "description": "Commitment type.", "enum": [ - "optima#recommendation" + "reserved_instance", + "savings_plan" ], - "example": "optima#recommendation", + "example": "reserved_instance", "type": "string" }, - "policySet": { - "description": "The policy set, as a way to group similar policies together", - "example": "Idle Compute Instances", + "paymentType": { + "description": "Payment type.", + "enum": [ + "all_upfront", + "partial_upfront", + "no_upfront" + ], + "example": "no_upfront", "type": "string" - }, - "quantityToPurchase": { - "description": "Quantity to purchase (e.g. number of reserved instances)", - "example": 3, - "format": "double", + } + }, + "required": [ + "commitmentType", + "commitmentTerm", + "paymentType" + ], + "title": "RateReductionCombinationSelectionResponseBody", + "type": "object" + }, + "OptimaRecommendations_RateReductionSavingsCategoryResponseBody": { + "example": { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + "properties": { + "byVendor": { + "description": "Per-vendor breakdown of this category's savings.", + "example": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "items": { + "$ref": "#/components/schemas/OptimaRecommendations_SavingsSummaryVendorSavingsResponseBody" + }, + "type": "array" + }, + "category": { + "description": "The category name (derived from policySet). Empty for recommendations without a policy set.", + "example": "Savings Plans", + "type": "string" + }, + "recommendationCount": { + "description": "Number of recommendations of this category within the combination.", + "example": 9, + "format": "int64", + "type": "integer" + }, + "savingsPerMonth": { + "description": "Savings per month for this category within the combination.", + "example": 1887.19, + "format": "double", + "type": "number" + } + }, + "required": [ + "category", + "savingsPerMonth", + "recommendationCount", + "byVendor" + ], + "title": "RateReductionSavingsCategoryResponseBody", + "type": "object" + }, + "OptimaRecommendations_RateReductionSavingsResponseBody": { + "example": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 150210.5, + "vendor": "aws" + }, + { + "savingsPerMonth": 51207.62, + "vendor": "azure" + } + ], + "category": "Savings Plans", + "recommendationCount": 312, + "savingsPerMonth": 201418.12 + }, + { + "byVendor": [ + { + "savingsPerMonth": 76308.3, + "vendor": "aws" + } + ], + "category": "Reserved Instances", + "recommendationCount": 185, + "savingsPerMonth": 76308.3 + } + ], + "combinations": { + "reserved_instance": { + "12": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 12103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 12, + "savingsPerMonth": 12103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 2017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 6051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 8, + "savingsPerMonth": 8068.72 + } + ], + "recommendationCount": 20, + "savingsPerMonth": 20171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 36103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 36, + "savingsPerMonth": 36103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 6017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 18051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 24, + "savingsPerMonth": 24068.72 + } + ], + "recommendationCount": 60, + "savingsPerMonth": 60171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 24103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 24, + "savingsPerMonth": 24103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 4017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 12051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 16, + "savingsPerMonth": 16068.72 + } + ], + "recommendationCount": 40, + "savingsPerMonth": 40171.79 + } + }, + "36": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 18103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 18, + "savingsPerMonth": 18103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 3017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 9051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 12, + "savingsPerMonth": 12068.72 + } + ], + "recommendationCount": 30, + "savingsPerMonth": 30171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 54103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 54, + "savingsPerMonth": 54103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 9017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 27051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 36, + "savingsPerMonth": 36068.72 + } + ], + "recommendationCount": 90, + "savingsPerMonth": 90171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 36103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 36, + "savingsPerMonth": 36103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 6017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 18051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 24, + "savingsPerMonth": 24068.72 + } + ], + "recommendationCount": 60, + "savingsPerMonth": 60171.79 + } + } + }, + "savings_plan": { + "12": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 24103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 24, + "savingsPerMonth": 24103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 4017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 12051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 16, + "savingsPerMonth": 16068.72 + } + ], + "recommendationCount": 40, + "savingsPerMonth": 40171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 72103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 72, + "savingsPerMonth": 72103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 12017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 36051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 48, + "savingsPerMonth": 48068.72 + } + ], + "recommendationCount": 120, + "savingsPerMonth": 120171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 48103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 48, + "savingsPerMonth": 48103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 8017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 24051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 32, + "savingsPerMonth": 32068.72 + } + ], + "recommendationCount": 80, + "savingsPerMonth": 80171.79 + } + }, + "36": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 36103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 36, + "savingsPerMonth": 36103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 6017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 18051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 24, + "savingsPerMonth": 24068.72 + } + ], + "recommendationCount": 60, + "savingsPerMonth": 60171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 108103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 108, + "savingsPerMonth": 108103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 18017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 54051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 72, + "savingsPerMonth": 72068.72 + } + ], + "recommendationCount": 180, + "savingsPerMonth": 180171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 72103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 72, + "savingsPerMonth": 72103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 12017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 36051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 48, + "savingsPerMonth": 48068.72 + } + ], + "recommendationCount": 120, + "savingsPerMonth": 120171.79 + } + } + } + }, + "commitmentTerms": [ + 12, + 36 + ], + "commitmentTypes": [ + "reserved_instance", + "savings_plan" + ], + "defaultSelection": { + "commitmentTerm": 12, + "commitmentType": "reserved_instance", + "paymentType": "no_upfront" + }, + "paymentTypes": [ + "all_upfront", + "partial_upfront", + "no_upfront" + ], + "recommendationCount": 497, + "savingsPerMonth": 277726.42 + }, + "properties": { + "byCategory": { + "description": "All Rate Reduction recommendations by category (policySet), whatever the combination, largest savings first, each split by vendor. A recommendation that matches several combinations is counted once.", + "example": [ + { + "byVendor": [ + { + "savingsPerMonth": 150210.5, + "vendor": "aws" + }, + { + "savingsPerMonth": 51207.62, + "vendor": "azure" + } + ], + "category": "Savings Plans", + "recommendationCount": 312, + "savingsPerMonth": 201418.12 + }, + { + "byVendor": [ + { + "savingsPerMonth": 76308.3, + "vendor": "aws" + } + ], + "category": "Reserved Instances", + "recommendationCount": 185, + "savingsPerMonth": 76308.3 + } + ], + "items": { + "$ref": "#/components/schemas/OptimaRecommendations_RateReductionSavingsCategoryResponseBody" + }, + "type": "array" + }, + "combinations": { + "additionalProperties": { + "additionalProperties": { + "additionalProperties": { + "$ref": "#/components/schemas/OptimaRecommendations_RateReductionCombinationLeafResponseBody" + }, + "example": { + "Eaque et ab occaecati aut.": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + } + ], + "recommendationCount": 410, + "savingsPerMonth": 134171.79 + }, + "Necessitatibus cupiditate sunt.": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + } + ], + "recommendationCount": 410, + "savingsPerMonth": 134171.79 + } + }, + "type": "object" + }, + "example": { + "Est voluptatum reiciendis.": { + "Aut ducimus assumenda quisquam.": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + } + ], + "recommendationCount": 410, + "savingsPerMonth": 134171.79 + }, + "Et sint itaque qui sed unde quo.": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + } + ], + "recommendationCount": 410, + "savingsPerMonth": 134171.79 + }, + "Quia nihil maxime ex voluptas ratione.": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + } + ], + "recommendationCount": 410, + "savingsPerMonth": 134171.79 + } + }, + "In dolore a.": { + "Voluptatem sit magni vero.": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + } + ], + "recommendationCount": 410, + "savingsPerMonth": 134171.79 + } + }, + "Voluptatem totam ipsum voluptates ea asperiores.": { + "Non optio soluta et expedita est.": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + } + ], + "recommendationCount": 410, + "savingsPerMonth": 134171.79 + }, + "Sint aut labore et.": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + } + ], + "recommendationCount": 410, + "savingsPerMonth": 134171.79 + }, + "Voluptatum qui quam sint dolore voluptatem.": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + } + ], + "recommendationCount": 410, + "savingsPerMonth": 134171.79 + } + } + }, + "type": "object" + }, + "description": "commitmentType -\u003e commitmentTerm (as a string) -\u003e paymentType -\u003e leaf. Every combination is present, including zero-valued ones.", + "example": { + "reserved_instance": { + "12": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 12103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 12, + "savingsPerMonth": 12103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 2017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 6051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 8, + "savingsPerMonth": 8068.72 + } + ], + "recommendationCount": 20, + "savingsPerMonth": 20171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 36103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 36, + "savingsPerMonth": 36103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 6017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 18051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 24, + "savingsPerMonth": 24068.72 + } + ], + "recommendationCount": 60, + "savingsPerMonth": 60171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 24103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 24, + "savingsPerMonth": 24103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 4017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 12051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 16, + "savingsPerMonth": 16068.72 + } + ], + "recommendationCount": 40, + "savingsPerMonth": 40171.79 + } + }, + "36": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 18103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 18, + "savingsPerMonth": 18103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 3017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 9051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 12, + "savingsPerMonth": 12068.72 + } + ], + "recommendationCount": 30, + "savingsPerMonth": 30171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 54103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 54, + "savingsPerMonth": 54103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 9017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 27051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 36, + "savingsPerMonth": 36068.72 + } + ], + "recommendationCount": 90, + "savingsPerMonth": 90171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 36103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 36, + "savingsPerMonth": 36103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 6017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 18051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 24, + "savingsPerMonth": 24068.72 + } + ], + "recommendationCount": 60, + "savingsPerMonth": 60171.79 + } + } + }, + "savings_plan": { + "12": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 24103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 24, + "savingsPerMonth": 24103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 4017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 12051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 16, + "savingsPerMonth": 16068.72 + } + ], + "recommendationCount": 40, + "savingsPerMonth": 40171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 72103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 72, + "savingsPerMonth": 72103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 12017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 36051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 48, + "savingsPerMonth": 48068.72 + } + ], + "recommendationCount": 120, + "savingsPerMonth": 120171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 48103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 48, + "savingsPerMonth": 48103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 8017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 24051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 32, + "savingsPerMonth": 32068.72 + } + ], + "recommendationCount": 80, + "savingsPerMonth": 80171.79 + } + }, + "36": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 36103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 36, + "savingsPerMonth": 36103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 6017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 18051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 24, + "savingsPerMonth": 24068.72 + } + ], + "recommendationCount": 60, + "savingsPerMonth": 60171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 108103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 108, + "savingsPerMonth": 108103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 18017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 54051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 72, + "savingsPerMonth": 72068.72 + } + ], + "recommendationCount": 180, + "savingsPerMonth": 180171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 72103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 72, + "savingsPerMonth": 72103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 12017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 36051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 48, + "savingsPerMonth": 48068.72 + } + ], + "recommendationCount": 120, + "savingsPerMonth": 120171.79 + } + } + } + }, + "type": "object" + }, + "commitmentTerms": { + "description": "The commitment term values (in months) present in the combinations tree, in display order.", + "example": [ + 12, + 36 + ], + "items": { + "example": 1138338271755064000, + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "commitmentTypes": { + "description": "The commitment type values present in the combinations tree, in display order.", + "example": [ + "reserved_instance", + "savings_plan" + ], + "items": { + "example": "Vitae sapiente deserunt sed.", + "type": "string" + }, + "type": "array" + }, + "defaultSelection": { + "$ref": "#/components/schemas/OptimaRecommendations_RateReductionCombinationSelectionResponseBody" + }, + "paymentTypes": { + "description": "The payment type values present in the combinations tree, in display order.", + "example": [ + "all_upfront", + "partial_upfront", + "no_upfront" + ], + "items": { + "example": "Neque veritatis.", + "type": "string" + }, + "type": "array" + }, + "recommendationCount": { + "description": "Total number of Rate Reduction recommendations, whatever the selected combination.", + "example": 497, + "format": "int64", + "type": "integer" + }, + "savingsPerMonth": { + "description": "Total savings per month of all Rate Reduction recommendations, whatever the selected combination. A recommendation that matches several combinations is counted once.", + "example": 277726.42, + "format": "double", + "type": "number" + } + }, + "required": [ + "savingsPerMonth", + "recommendationCount", + "byCategory", + "commitmentTypes", + "commitmentTerms", + "paymentTypes", + "defaultSelection", + "combinations" + ], + "title": "RateReductionSavingsResponseBody", + "type": "object" + }, + "OptimaRecommendations_RecommendationResultResponse": { + "description": "A cost-saving recommendation. (default view)", + "example": { + "accountID": "1234-5678-9012", + "accountName": "Test Account", + "billingCenterID": "o5g6iXY0AQADmckH0gjaAi", + "billingCenterName": "Marketing", + "createdAt": "2021-08-22T00:00:00Z", + "customTagDimensions": { + "tag_1": "demoMachine", + "tag_2": "randomName" + }, + "databaseEngine": "MySQL", + "details": { + "Location": "centralus", + "Net Savings": "50.98", + "Total RI Quantity to Purchase": 1 + }, + "detailsExtended": { + "location": { + "label": "Location", + "value": "centralus" + }, + "quantityToPurchase": { + "label": "Total RI Quantity to Purchase", + "value": 1 + }, + "savings": { + "label": "Net Savings", + "value": "50.98" + } + }, + "generationId": "abc123", + "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", + "incidentID": "66db5ea9d7048a1c94c09636", + "kind": "optima#recommendation", + "policySet": "Idle Compute Instances", + "quantityToPurchase": 3, + "recommendation": "AWS Savings Plan", + "region": "US West (Oregon)", + "resourceGroup": "RS-DEFAULT-EASTUS", + "resourceID": "vol-0475890d8fc70a26f", + "resourceType": "m5.2xlarge", + "ruleBasedDimensions": { + "rbd_1": "demoMachine", + "rbd_2": "randomName" + }, + "savings": 361.5, + "service": "EC2", + "snoozedTargetDate": "2025-01-30", + "source": "rule", + "status": "active", + "statusReason": "Moved to snoozed since it is not relevant for now", + "statusUpdatedAt": "2021-08-22T00:00:00Z", + "tags": [ + "env=production" + ], + "type": "Usage Reduction", + "updatedAt": "2021-08-22T00:00:00Z", + "vendor": "AWS" + }, + "properties": { + "accountID": { + "description": "The account ID", + "example": "1234-5678-9012", + "type": "string" + }, + "accountName": { + "description": "The account name", + "example": "Test Account", + "type": "string" + }, + "billingCenterID": { + "description": "The ID of the top-level billing center this recommendation is assigned to", + "example": "o5g6iXY0AQADmckH0gjaAi", + "type": "string" + }, + "billingCenterName": { + "description": "The name of the top-level billing center this recommendation is assigned to", + "example": "Marketing", + "type": "string" + }, + "createdAt": { + "description": "Timestamp when the recommendation was created.", + "example": "2021-08-22T00:00:00Z", + "format": "date-time", + "type": "string" + }, + "customTagDimensions": { + "additionalProperties": { + "example": "Velit consequatur rerum commodi adipisci.", + "type": "string" + }, + "description": "The custom tag dimensions that could be populated by the raw tags of the recommendation.", + "example": { + "tag_1": "demoMachine", + "tag_2": "randomName" + }, + "type": "object" + }, + "databaseEngine": { + "description": "The database engine to purchase", + "example": "MySQL", + "type": "string" + }, + "details": { + "additionalProperties": true, + "description": "Additional details about the recommendation.", + "example": { + "Location": "centralus", + "Net Savings": "50.98", + "Total RI Quantity to Purchase": 1 + }, + "type": "object" + }, + "detailsExtended": { + "additionalProperties": { + "$ref": "#/components/schemas/OptimaRecommendations_DataFieldResponse" + }, + "description": "Extended details about the recommendation.", + "example": { + "location": { + "label": "Location", + "value": "centralus" + }, + "quantityToPurchase": { + "label": "Total RI Quantity to Purchase", + "value": 1 + }, + "savings": { + "label": "Net Savings", + "value": "50.98" + } + }, + "type": "object" + }, + "generationId": { + "description": "Generation ID of the recommendation, present only for hub-backed recommendations.", + "example": "abc123", + "type": "string" + }, + "id": { + "description": "The ID of the recommendation", + "example": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", + "type": "string" + }, + "incidentID": { + "description": "ID of the incident that recommendation belongs to", + "example": "66db5ea9d7048a1c94c09636", + "type": "string" + }, + "kind": { + "description": "The kind of object", + "enum": [ + "optima#recommendation" + ], + "example": "optima#recommendation", + "type": "string" + }, + "policySet": { + "description": "The policy set, as a way to group similar policies together", + "example": "Idle Compute Instances", + "type": "string" + }, + "quantityToPurchase": { + "description": "Quantity to purchase (e.g. number of reserved instances)", + "example": 3, + "format": "double", "type": "number" }, "recommendation": { @@ -102334,7 +104644,7 @@ }, "ruleBasedDimensions": { "additionalProperties": { - "example": "Aperiam voluptatem sint.", + "example": "Est velit omnis voluptatibus aut accusantium sapiente.", "type": "string" }, "description": "The rule based dimensions that are populated in recommendation once rules execute.", @@ -102361,8 +104671,12 @@ "format": "date", "type": "string" }, + "source": { + "description": "The system that produced the recommendation", + "example": "rule", + "type": "string" + }, "status": { - "default": "active", "description": "Current status of the recommendation", "example": "active", "type": "string" @@ -102384,7 +104698,7 @@ "env=production" ], "items": { - "example": "Et eum unde temporibus earum et quia.", + "example": "Qui facilis.", "type": "string" }, "type": "array" @@ -102393,9 +104707,10 @@ "description": "Categorizes the type of recommendation", "enum": [ "Rate Reduction", - "Usage Reduction" + "Usage Reduction", + "Security" ], - "example": "Rate Reduction", + "example": "Usage Reduction", "type": "string" }, "updatedAt": { @@ -102437,26 +104752,127 @@ "title": "Mediatype identifier: application/vnd.flexera.optima.recommendation+json; view=default", "type": "object" }, - "OptimaRecommendations_RecommendationsRecommendationResultResponseCollection": { - "description": "IndexResponseBody is the result type for an array of RecommendationResultResponse (default view)", - "example": [ - { - "accountID": "1234-5678-9012", - "accountName": "Test Account", - "billingCenterID": "o5g6iXY0AQADmckH0gjaAi", - "billingCenterName": "Marketing", - "createdAt": "2021-08-22T00:00:00Z", - "customTagDimensions": { + "OptimaRecommendations_RecommendationResultResponseBody": { + "description": "A cost-saving recommendation. (default view)", + "example": { + "accountID": "1234-5678-9012", + "accountName": "Test Account", + "billingCenterID": "o5g6iXY0AQADmckH0gjaAi", + "billingCenterName": "Marketing", + "createdAt": "2021-08-22T00:00:00Z", + "customTagDimensions": { + "tag_1": "demoMachine", + "tag_2": "randomName" + }, + "databaseEngine": "MySQL", + "details": { + "Location": "centralus", + "Net Savings": "50.98", + "Total RI Quantity to Purchase": 1 + }, + "detailsExtended": { + "location": { + "label": "Location", + "value": "centralus" + }, + "quantityToPurchase": { + "label": "Total RI Quantity to Purchase", + "value": 1 + }, + "savings": { + "label": "Net Savings", + "value": "50.98" + } + }, + "generationId": "abc123", + "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", + "incidentID": "66db5ea9d7048a1c94c09636", + "kind": "optima#recommendation", + "policySet": "Idle Compute Instances", + "quantityToPurchase": 3, + "recommendation": "AWS Savings Plan", + "region": "US West (Oregon)", + "resourceGroup": "RS-DEFAULT-EASTUS", + "resourceID": "vol-0475890d8fc70a26f", + "resourceType": "m5.2xlarge", + "ruleBasedDimensions": { + "rbd_1": "demoMachine", + "rbd_2": "randomName" + }, + "savings": 361.5, + "service": "EC2", + "snoozedTargetDate": "2025-01-30", + "source": "rule", + "status": "active", + "statusReason": "Moved to snoozed since it is not relevant for now", + "statusUpdatedAt": "2021-08-22T00:00:00Z", + "tags": [ + "env=production" + ], + "type": "Usage Reduction", + "updatedAt": "2021-08-22T00:00:00Z", + "vendor": "AWS" + }, + "properties": { + "accountID": { + "description": "The account ID", + "example": "1234-5678-9012", + "type": "string" + }, + "accountName": { + "description": "The account name", + "example": "Test Account", + "type": "string" + }, + "billingCenterID": { + "description": "The ID of the top-level billing center this recommendation is assigned to", + "example": "o5g6iXY0AQADmckH0gjaAi", + "type": "string" + }, + "billingCenterName": { + "description": "The name of the top-level billing center this recommendation is assigned to", + "example": "Marketing", + "type": "string" + }, + "createdAt": { + "description": "Timestamp when the recommendation was created.", + "example": "2021-08-22T00:00:00Z", + "format": "date-time", + "type": "string" + }, + "customTagDimensions": { + "additionalProperties": { + "example": "Et odio aliquam accusamus ut qui deserunt.", + "type": "string" + }, + "description": "The custom tag dimensions that could be populated by the raw tags of the recommendation.", + "example": { "tag_1": "demoMachine", "tag_2": "randomName" }, - "databaseEngine": "MySQL", - "details": { + "type": "object" + }, + "databaseEngine": { + "description": "The database engine to purchase", + "example": "MySQL", + "type": "string" + }, + "details": { + "additionalProperties": true, + "description": "Additional details about the recommendation.", + "example": { "Location": "centralus", "Net Savings": "50.98", "Total RI Quantity to Purchase": 1 }, - "detailsExtended": { + "type": "object" + }, + "detailsExtended": { + "additionalProperties": { + "$ref": "#/components/schemas/OptimaRecommendations_DataFieldResponseBody" + }, + "description": "Extended details about the recommendation.", + "example": { "location": { "label": "Location", "value": "centralus" @@ -102470,33 +104886,267 @@ "value": "50.98" } }, - "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", - "incidentID": "66db5ea9d7048a1c94c09636", - "kind": "optima#recommendation", - "policySet": "Idle Compute Instances", - "quantityToPurchase": 3, - "recommendation": "AWS Savings Plan", - "region": "US West (Oregon)", - "resourceGroup": "RS-DEFAULT-EASTUS", - "resourceID": "vol-0475890d8fc70a26f", - "resourceType": "m5.2xlarge", - "ruleBasedDimensions": { + "type": "object" + }, + "generationId": { + "description": "Generation ID of the recommendation, present only for hub-backed recommendations.", + "example": "abc123", + "type": "string" + }, + "id": { + "description": "The ID of the recommendation", + "example": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", + "type": "string" + }, + "incidentID": { + "description": "ID of the incident that recommendation belongs to", + "example": "66db5ea9d7048a1c94c09636", + "type": "string" + }, + "kind": { + "description": "The kind of object", + "enum": [ + "optima#recommendation" + ], + "example": "optima#recommendation", + "type": "string" + }, + "policySet": { + "description": "The policy set, as a way to group similar policies together", + "example": "Idle Compute Instances", + "type": "string" + }, + "quantityToPurchase": { + "description": "Quantity to purchase (e.g. number of reserved instances)", + "example": 3, + "format": "double", + "type": "number" + }, + "recommendation": { + "description": "This is the name or category of recommendation", + "example": "AWS Savings Plan", + "type": "string" + }, + "region": { + "description": "The region in which to purchase", + "example": "US West (Oregon)", + "type": "string" + }, + "resourceGroup": { + "description": "Azure Resource Group", + "example": "RS-DEFAULT-EASTUS", + "type": "string" + }, + "resourceID": { + "description": "The ID of a resource identified in the recommendation", + "example": "vol-0475890d8fc70a26f", + "type": "string" + }, + "resourceType": { + "description": "The resource type, which might be an instance type or volume type, etc.", + "example": "m5.2xlarge", + "type": "string" + }, + "ruleBasedDimensions": { + "additionalProperties": { + "example": "Sed ut accusamus nisi omnis omnis.", + "type": "string" + }, + "description": "The rule based dimensions that are populated in recommendation once rules execute.", + "example": { "rbd_1": "demoMachine", "rbd_2": "randomName" }, - "savings": 361.5, - "service": "EC2", - "snoozedTargetDate": "2025-01-30", - "status": "active", - "statusReason": "Moved to snoozed since it is not relevant for now", - "statusUpdatedAt": "2021-08-22T00:00:00Z", - "tags": [ + "type": "object" + }, + "savings": { + "description": "Expected dollar savings", + "example": 361.5, + "format": "double", + "type": "number" + }, + "service": { + "description": "The relevant service in which to purchase", + "example": "EC2", + "type": "string" + }, + "snoozedTargetDate": { + "description": "Target date to move recommendation from snoozed to active again", + "example": "2025-01-30", + "format": "date", + "type": "string" + }, + "source": { + "description": "The system that produced the recommendation", + "example": "rule", + "type": "string" + }, + "status": { + "description": "Current status of the recommendation", + "example": "active", + "type": "string" + }, + "statusReason": { + "description": "Extra field to put extra reason once we change “status” value", + "example": "Moved to snoozed since it is not relevant for now", + "type": "string" + }, + "statusUpdatedAt": { + "description": "Date when status was updated", + "example": "2021-08-22T00:00:00Z", + "format": "date-time", + "type": "string" + }, + "tags": { + "description": "The tags found on the resource", + "example": [ "env=production" ], - "type": "Rate Reduction", - "updatedAt": "2021-08-22T00:00:00Z", - "vendor": "AWS" + "items": { + "example": "Aspernatur eum incidunt.", + "type": "string" + }, + "type": "array" + }, + "type": { + "description": "Categorizes the type of recommendation", + "enum": [ + "Rate Reduction", + "Usage Reduction", + "Security" + ], + "example": "Rate Reduction", + "type": "string" + }, + "updatedAt": { + "description": "Timestamp when the recommendation was updated.", + "example": "2021-08-22T00:00:00Z", + "format": "date-time", + "type": "string" }, + "vendor": { + "description": "The name of the cloud vendor", + "example": "AWS", + "type": "string" + } + }, + "required": [ + "kind", + "id", + "recommendation", + "type", + "createdAt", + "updatedAt", + "vendor", + "policySet", + "accountID", + "accountName", + "tags", + "resourceID", + "resourceType", + "region", + "service", + "databaseEngine", + "billingCenterName", + "billingCenterID", + "savings", + "quantityToPurchase", + "incidentID", + "status" + ], + "title": "Mediatype identifier: application/vnd.flexera.optima.recommendation+json; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsGroupTreeResponseBody": { + "description": "GroupTreeResponseBody result type (default view)", + "example": { + "values": [ + { + "children": [ + { + "children": [], + "count": 41, + "totalSavings": 33747.25, + "value": "aws" + }, + { + "children": [], + "count": 23, + "totalSavings": 14463.1, + "value": "azure" + } + ], + "count": 64, + "totalSavings": 48210.35, + "value": "Idle Compute Instances" + }, + { + "children": [ + { + "children": [], + "count": 212, + "totalSavings": 9120.5, + "value": "aws" + } + ], + "count": 212, + "totalSavings": 9120.5, + "value": "Unattached Volumes" + } + ] + }, + "properties": { + "values": { + "description": "The top-level groups, largest first.", + "example": [ + { + "children": [ + { + "children": [], + "count": 41, + "totalSavings": 33747.25, + "value": "aws" + }, + { + "children": [], + "count": 23, + "totalSavings": 14463.1, + "value": "azure" + } + ], + "count": 64, + "totalSavings": 48210.35, + "value": "Idle Compute Instances" + }, + { + "children": [ + { + "children": [], + "count": 212, + "totalSavings": 9120.5, + "value": "aws" + } + ], + "count": 212, + "totalSavings": 9120.5, + "value": "Unattached Volumes" + } + ], + "items": { + "$ref": "#/components/schemas/OptimaRecommendations_GroupTreeNodeResponseBody" + }, + "type": "array" + } + }, + "required": [ + "values" + ], + "title": "Mediatype identifier: application/vnd.flexera.optima.recommendations_group_tree+json; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsRecommendationResultResponseCollection": { + "description": "IndexResponseBody is the result type for an array of RecommendationResultResponse (default view)", + "example": [ { "accountID": "1234-5678-9012", "accountName": "Test Account", @@ -102527,6 +105177,7 @@ "value": "50.98" } }, + "generationId": "abc123", "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", "incidentID": "66db5ea9d7048a1c94c09636", "kind": "optima#recommendation", @@ -102544,6 +105195,7 @@ "savings": 361.5, "service": "EC2", "snoozedTargetDate": "2025-01-30", + "source": "rule", "status": "active", "statusReason": "Moved to snoozed since it is not relevant for now", "statusUpdatedAt": "2021-08-22T00:00:00Z", @@ -102584,6 +105236,7 @@ "value": "50.98" } }, + "generationId": "abc123", "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", "incidentID": "66db5ea9d7048a1c94c09636", "kind": "optima#recommendation", @@ -102601,6 +105254,7 @@ "savings": 361.5, "service": "EC2", "snoozedTargetDate": "2025-01-30", + "source": "rule", "status": "active", "statusReason": "Moved to snoozed since it is not relevant for now", "statusUpdatedAt": "2021-08-22T00:00:00Z", @@ -102641,6 +105295,7 @@ "value": "50.98" } }, + "generationId": "abc123", "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", "incidentID": "66db5ea9d7048a1c94c09636", "kind": "optima#recommendation", @@ -102658,6 +105313,7 @@ "savings": 361.5, "service": "EC2", "snoozedTargetDate": "2025-01-30", + "source": "rule", "status": "active", "statusReason": "Moved to snoozed since it is not relevant for now", "statusUpdatedAt": "2021-08-22T00:00:00Z", @@ -102675,14 +105331,973 @@ "title": "Mediatype identifier: application/vnd.flexera.optima.recommendation+json; type=collection; view=default", "type": "array" }, + "OptimaRecommendations_RecommendationsRecommendationsPagedResponseBody": { + "description": "RecommendationsPagedResponseBody result type (default view)", + "example": { + "count": 50, + "nextPage": "/recommendations/orgs/{orgID}/recommendations/paged?skipToken=19u2349", + "prevPage": "/recommendations/orgs/{orgID}/recommendations/paged?skipToken=8b1750u", + "total": 1240, + "values": [ + { + "accountID": "1234-5678-9012", + "accountName": "Test Account", + "billingCenterID": "o5g6iXY0AQADmckH0gjaAi", + "billingCenterName": "Marketing", + "createdAt": "2021-08-22T00:00:00Z", + "customTagDimensions": { + "tag_1": "demoMachine", + "tag_2": "randomName" + }, + "databaseEngine": "MySQL", + "details": { + "Location": "centralus", + "Net Savings": "50.98", + "Total RI Quantity to Purchase": 1 + }, + "detailsExtended": { + "location": { + "label": "Location", + "value": "centralus" + }, + "quantityToPurchase": { + "label": "Total RI Quantity to Purchase", + "value": 1 + }, + "savings": { + "label": "Net Savings", + "value": "50.98" + } + }, + "generationId": "abc123", + "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", + "incidentID": "66db5ea9d7048a1c94c09636", + "kind": "optima#recommendation", + "policySet": "Idle Compute Instances", + "quantityToPurchase": 3, + "recommendation": "AWS Savings Plan", + "region": "US West (Oregon)", + "resourceGroup": "RS-DEFAULT-EASTUS", + "resourceID": "vol-0475890d8fc70a26f", + "resourceType": "m5.2xlarge", + "ruleBasedDimensions": { + "rbd_1": "demoMachine", + "rbd_2": "randomName" + }, + "savings": 361.5, + "service": "EC2", + "snoozedTargetDate": "2025-01-30", + "source": "rule", + "status": "active", + "statusReason": "Moved to snoozed since it is not relevant for now", + "statusUpdatedAt": "2021-08-22T00:00:00Z", + "tags": [ + "env=production" + ], + "type": "Rate Reduction", + "updatedAt": "2021-08-22T00:00:00Z", + "vendor": "AWS" + }, + { + "accountID": "1234-5678-9012", + "accountName": "Test Account", + "billingCenterID": "o5g6iXY0AQADmckH0gjaAi", + "billingCenterName": "Marketing", + "createdAt": "2021-08-22T00:00:00Z", + "customTagDimensions": { + "tag_1": "demoMachine", + "tag_2": "randomName" + }, + "databaseEngine": "MySQL", + "details": { + "Location": "centralus", + "Net Savings": "50.98", + "Total RI Quantity to Purchase": 1 + }, + "detailsExtended": { + "location": { + "label": "Location", + "value": "centralus" + }, + "quantityToPurchase": { + "label": "Total RI Quantity to Purchase", + "value": 1 + }, + "savings": { + "label": "Net Savings", + "value": "50.98" + } + }, + "generationId": "abc123", + "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", + "incidentID": "66db5ea9d7048a1c94c09636", + "kind": "optima#recommendation", + "policySet": "Idle Compute Instances", + "quantityToPurchase": 3, + "recommendation": "AWS Savings Plan", + "region": "US West (Oregon)", + "resourceGroup": "RS-DEFAULT-EASTUS", + "resourceID": "vol-0475890d8fc70a26f", + "resourceType": "m5.2xlarge", + "ruleBasedDimensions": { + "rbd_1": "demoMachine", + "rbd_2": "randomName" + }, + "savings": 361.5, + "service": "EC2", + "snoozedTargetDate": "2025-01-30", + "source": "rule", + "status": "active", + "statusReason": "Moved to snoozed since it is not relevant for now", + "statusUpdatedAt": "2021-08-22T00:00:00Z", + "tags": [ + "env=production" + ], + "type": "Rate Reduction", + "updatedAt": "2021-08-22T00:00:00Z", + "vendor": "AWS" + } + ] + }, + "properties": { + "count": { + "description": "The number of recommendations in this page.", + "example": 50, + "format": "int64", + "type": "integer" + }, + "nextPage": { + "description": "URL to the next page of data. If nextPage is not present, the returned page of data is the last.", + "example": "/recommendations/orgs/{orgID}/recommendations/paged?skipToken=19u2349", + "format": "uri", + "type": "string" + }, + "prevPage": { + "description": "URL to the previous page of data. The first page of data will not return a prevPage value.", + "example": "/recommendations/orgs/{orgID}/recommendations/paged?skipToken=8b1750u", + "format": "uri", + "type": "string" + }, + "total": { + "description": "The total number of recommendations matching the filter, across all pages.", + "example": 1240, + "format": "int64", + "type": "integer" + }, + "values": { + "description": "The recommendations in this page.", + "example": [ + { + "accountID": "1234-5678-9012", + "accountName": "Test Account", + "billingCenterID": "o5g6iXY0AQADmckH0gjaAi", + "billingCenterName": "Marketing", + "createdAt": "2021-08-22T00:00:00Z", + "customTagDimensions": { + "tag_1": "demoMachine", + "tag_2": "randomName" + }, + "databaseEngine": "MySQL", + "details": { + "Location": "centralus", + "Net Savings": "50.98", + "Total RI Quantity to Purchase": 1 + }, + "detailsExtended": { + "location": { + "label": "Location", + "value": "centralus" + }, + "quantityToPurchase": { + "label": "Total RI Quantity to Purchase", + "value": 1 + }, + "savings": { + "label": "Net Savings", + "value": "50.98" + } + }, + "generationId": "abc123", + "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", + "incidentID": "66db5ea9d7048a1c94c09636", + "kind": "optima#recommendation", + "policySet": "Idle Compute Instances", + "quantityToPurchase": 3, + "recommendation": "AWS Savings Plan", + "region": "US West (Oregon)", + "resourceGroup": "RS-DEFAULT-EASTUS", + "resourceID": "vol-0475890d8fc70a26f", + "resourceType": "m5.2xlarge", + "ruleBasedDimensions": { + "rbd_1": "demoMachine", + "rbd_2": "randomName" + }, + "savings": 361.5, + "service": "EC2", + "snoozedTargetDate": "2025-01-30", + "source": "rule", + "status": "active", + "statusReason": "Moved to snoozed since it is not relevant for now", + "statusUpdatedAt": "2021-08-22T00:00:00Z", + "tags": [ + "env=production" + ], + "type": "Rate Reduction", + "updatedAt": "2021-08-22T00:00:00Z", + "vendor": "AWS" + }, + { + "accountID": "1234-5678-9012", + "accountName": "Test Account", + "billingCenterID": "o5g6iXY0AQADmckH0gjaAi", + "billingCenterName": "Marketing", + "createdAt": "2021-08-22T00:00:00Z", + "customTagDimensions": { + "tag_1": "demoMachine", + "tag_2": "randomName" + }, + "databaseEngine": "MySQL", + "details": { + "Location": "centralus", + "Net Savings": "50.98", + "Total RI Quantity to Purchase": 1 + }, + "detailsExtended": { + "location": { + "label": "Location", + "value": "centralus" + }, + "quantityToPurchase": { + "label": "Total RI Quantity to Purchase", + "value": 1 + }, + "savings": { + "label": "Net Savings", + "value": "50.98" + } + }, + "generationId": "abc123", + "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", + "incidentID": "66db5ea9d7048a1c94c09636", + "kind": "optima#recommendation", + "policySet": "Idle Compute Instances", + "quantityToPurchase": 3, + "recommendation": "AWS Savings Plan", + "region": "US West (Oregon)", + "resourceGroup": "RS-DEFAULT-EASTUS", + "resourceID": "vol-0475890d8fc70a26f", + "resourceType": "m5.2xlarge", + "ruleBasedDimensions": { + "rbd_1": "demoMachine", + "rbd_2": "randomName" + }, + "savings": 361.5, + "service": "EC2", + "snoozedTargetDate": "2025-01-30", + "source": "rule", + "status": "active", + "statusReason": "Moved to snoozed since it is not relevant for now", + "statusUpdatedAt": "2021-08-22T00:00:00Z", + "tags": [ + "env=production" + ], + "type": "Rate Reduction", + "updatedAt": "2021-08-22T00:00:00Z", + "vendor": "AWS" + }, + { + "accountID": "1234-5678-9012", + "accountName": "Test Account", + "billingCenterID": "o5g6iXY0AQADmckH0gjaAi", + "billingCenterName": "Marketing", + "createdAt": "2021-08-22T00:00:00Z", + "customTagDimensions": { + "tag_1": "demoMachine", + "tag_2": "randomName" + }, + "databaseEngine": "MySQL", + "details": { + "Location": "centralus", + "Net Savings": "50.98", + "Total RI Quantity to Purchase": 1 + }, + "detailsExtended": { + "location": { + "label": "Location", + "value": "centralus" + }, + "quantityToPurchase": { + "label": "Total RI Quantity to Purchase", + "value": 1 + }, + "savings": { + "label": "Net Savings", + "value": "50.98" + } + }, + "generationId": "abc123", + "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", + "incidentID": "66db5ea9d7048a1c94c09636", + "kind": "optima#recommendation", + "policySet": "Idle Compute Instances", + "quantityToPurchase": 3, + "recommendation": "AWS Savings Plan", + "region": "US West (Oregon)", + "resourceGroup": "RS-DEFAULT-EASTUS", + "resourceID": "vol-0475890d8fc70a26f", + "resourceType": "m5.2xlarge", + "ruleBasedDimensions": { + "rbd_1": "demoMachine", + "rbd_2": "randomName" + }, + "savings": 361.5, + "service": "EC2", + "snoozedTargetDate": "2025-01-30", + "source": "rule", + "status": "active", + "statusReason": "Moved to snoozed since it is not relevant for now", + "statusUpdatedAt": "2021-08-22T00:00:00Z", + "tags": [ + "env=production" + ], + "type": "Rate Reduction", + "updatedAt": "2021-08-22T00:00:00Z", + "vendor": "AWS" + }, + { + "accountID": "1234-5678-9012", + "accountName": "Test Account", + "billingCenterID": "o5g6iXY0AQADmckH0gjaAi", + "billingCenterName": "Marketing", + "createdAt": "2021-08-22T00:00:00Z", + "customTagDimensions": { + "tag_1": "demoMachine", + "tag_2": "randomName" + }, + "databaseEngine": "MySQL", + "details": { + "Location": "centralus", + "Net Savings": "50.98", + "Total RI Quantity to Purchase": 1 + }, + "detailsExtended": { + "location": { + "label": "Location", + "value": "centralus" + }, + "quantityToPurchase": { + "label": "Total RI Quantity to Purchase", + "value": 1 + }, + "savings": { + "label": "Net Savings", + "value": "50.98" + } + }, + "generationId": "abc123", + "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", + "incidentID": "66db5ea9d7048a1c94c09636", + "kind": "optima#recommendation", + "policySet": "Idle Compute Instances", + "quantityToPurchase": 3, + "recommendation": "AWS Savings Plan", + "region": "US West (Oregon)", + "resourceGroup": "RS-DEFAULT-EASTUS", + "resourceID": "vol-0475890d8fc70a26f", + "resourceType": "m5.2xlarge", + "ruleBasedDimensions": { + "rbd_1": "demoMachine", + "rbd_2": "randomName" + }, + "savings": 361.5, + "service": "EC2", + "snoozedTargetDate": "2025-01-30", + "source": "rule", + "status": "active", + "statusReason": "Moved to snoozed since it is not relevant for now", + "statusUpdatedAt": "2021-08-22T00:00:00Z", + "tags": [ + "env=production" + ], + "type": "Rate Reduction", + "updatedAt": "2021-08-22T00:00:00Z", + "vendor": "AWS" + } + ], + "items": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationResultResponseBody" + }, + "type": "array" + } + }, + "required": [ + "count", + "total", + "values" + ], + "title": "Mediatype identifier: application/vnd.flexera.optima.recommendations_list+json; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsSavingsSummaryResponseBody": { + "description": "SavingsSummaryResponseBody result type (default view)", + "example": { + "rateReductionSavings": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 150210.5, + "vendor": "aws" + }, + { + "savingsPerMonth": 51207.62, + "vendor": "azure" + } + ], + "category": "Savings Plans", + "recommendationCount": 312, + "savingsPerMonth": 201418.12 + }, + { + "byVendor": [ + { + "savingsPerMonth": 76308.3, + "vendor": "aws" + } + ], + "category": "Reserved Instances", + "recommendationCount": 185, + "savingsPerMonth": 76308.3 + } + ], + "combinations": { + "reserved_instance": { + "12": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 12103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 12, + "savingsPerMonth": 12103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 2017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 6051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 8, + "savingsPerMonth": 8068.72 + } + ], + "recommendationCount": 20, + "savingsPerMonth": 20171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 36103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 36, + "savingsPerMonth": 36103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 6017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 18051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 24, + "savingsPerMonth": 24068.72 + } + ], + "recommendationCount": 60, + "savingsPerMonth": 60171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 24103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 24, + "savingsPerMonth": 24103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 4017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 12051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 16, + "savingsPerMonth": 16068.72 + } + ], + "recommendationCount": 40, + "savingsPerMonth": 40171.79 + } + }, + "36": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 18103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 18, + "savingsPerMonth": 18103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 3017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 9051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 12, + "savingsPerMonth": 12068.72 + } + ], + "recommendationCount": 30, + "savingsPerMonth": 30171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 54103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 54, + "savingsPerMonth": 54103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 9017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 27051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 36, + "savingsPerMonth": 36068.72 + } + ], + "recommendationCount": 90, + "savingsPerMonth": 90171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 36103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 36, + "savingsPerMonth": 36103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 6017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 18051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 24, + "savingsPerMonth": 24068.72 + } + ], + "recommendationCount": 60, + "savingsPerMonth": 60171.79 + } + } + }, + "savings_plan": { + "12": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 24103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 24, + "savingsPerMonth": 24103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 4017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 12051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 16, + "savingsPerMonth": 16068.72 + } + ], + "recommendationCount": 40, + "savingsPerMonth": 40171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 72103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 72, + "savingsPerMonth": 72103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 12017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 36051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 48, + "savingsPerMonth": 48068.72 + } + ], + "recommendationCount": 120, + "savingsPerMonth": 120171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 48103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 48, + "savingsPerMonth": 48103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 8017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 24051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 32, + "savingsPerMonth": 32068.72 + } + ], + "recommendationCount": 80, + "savingsPerMonth": 80171.79 + } + }, + "36": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 36103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 36, + "savingsPerMonth": 36103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 6017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 18051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 24, + "savingsPerMonth": 24068.72 + } + ], + "recommendationCount": 60, + "savingsPerMonth": 60171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 108103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 108, + "savingsPerMonth": 108103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 18017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 54051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 72, + "savingsPerMonth": 72068.72 + } + ], + "recommendationCount": 180, + "savingsPerMonth": 180171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 72103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 72, + "savingsPerMonth": 72103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 12017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 36051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 48, + "savingsPerMonth": 48068.72 + } + ], + "recommendationCount": 120, + "savingsPerMonth": 120171.79 + } + } + } + }, + "commitmentTerms": [ + 12, + 36 + ], + "commitmentTypes": [ + "reserved_instance", + "savings_plan" + ], + "defaultSelection": { + "commitmentTerm": 12, + "commitmentType": "reserved_instance", + "paymentType": "no_upfront" + }, + "paymentTypes": [ + "all_upfront", + "partial_upfront", + "no_upfront" + ], + "recommendationCount": 497, + "savingsPerMonth": 277726.42 + }, + "totalPotentialSavings": { + "recommendationCount": 1290, + "savingsPerMonth": 743599.2 + }, + "usageReductionSavings": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 33747.25, + "vendor": "aws" + }, + { + "savingsPerMonth": 14463.1, + "vendor": "azure" + } + ], + "category": "Idle Compute Instances", + "recommendationCount": 64, + "savingsPerMonth": 48210.35 + }, + { + "byVendor": [ + { + "savingsPerMonth": 9120.5, + "vendor": "aws" + } + ], + "category": "Unattached Volumes", + "recommendationCount": 212, + "savingsPerMonth": 9120.5 + } + ], + "byStatus": [ + { + "recommendationCount": 880, + "savingsPerMonth": 609427.41, + "status": "active" + }, + { + "recommendationCount": 6, + "savingsPerMonth": 3120.5, + "status": "snoozed" + }, + { + "recommendationCount": 4, + "savingsPerMonth": 1874.2, + "status": "rejected" + } + ], + "recommendationCount": 890, + "savingsPerMonth": 609427.41 + } + }, + "properties": { + "rateReductionSavings": { + "$ref": "#/components/schemas/OptimaRecommendations_RateReductionSavingsResponseBody" + }, + "totalPotentialSavings": { + "example": { + "recommendationCount": 1290, + "savingsPerMonth": 743599.2 + }, + "properties": { + "recommendationCount": { + "description": "Total recommendation count across all types, regardless of status.", + "example": 1290, + "format": "int64", + "type": "integer" + }, + "savingsPerMonth": { + "description": "Active-only Usage Reduction savings plus all Rate Reduction savings.", + "example": 743599.2, + "format": "double", + "type": "number" + } + }, + "required": [ + "savingsPerMonth", + "recommendationCount" + ], + "type": "object" + }, + "usageReductionSavings": { + "$ref": "#/components/schemas/OptimaRecommendations_UsageReductionSavingsResponseBody" + } + }, + "required": [ + "totalPotentialSavings", + "rateReductionSavings", + "usageReductionSavings" + ], + "title": "Mediatype identifier: application/vnd.flexera.optima.savings_summary+json; view=default", + "type": "object" + }, "OptimaRecommendations_RecommendationsUpdateStatusRequestBody": { "example": { + "generationId": "abc123", "id": "676f0f2c838a081da3f7cd61_vol-06fa6937d41c139eb", "snoozedTargetDate": "2025-01-30", - "status": "realized", + "status": "snoozed", "statusReason": "Recommendation isn't relevant right now" }, "properties": { + "generationId": { + "description": "Generation ID of the hub-backed recommendation. When present, the status update is applied to the hub DB.", + "example": "abc123", + "type": "string" + }, "id": { "description": "Recommendation unique ID", "example": "676f0f2c838a081da3f7cd61_vol-06fa6937d41c139eb", @@ -102698,10 +106313,9 @@ "enum": [ "active", "snoozed", - "rejected", - "realized" + "rejected" ], - "example": "realized", + "example": "snoozed", "type": "string" }, "statusReason": { @@ -102717,6 +106331,266 @@ "title": "RecommendationsUpdateStatusRequestBody", "type": "object" }, + "OptimaRecommendations_SavingsSummaryVendorSavingsResponseBody": { + "example": { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + "properties": { + "savingsPerMonth": { + "description": "Savings per month attributed to this vendor.", + "example": 134171.79, + "format": "double", + "type": "number" + }, + "vendor": { + "description": "The cloud vendor.", + "example": "aws", + "type": "string" + } + }, + "required": [ + "vendor", + "savingsPerMonth" + ], + "title": "SavingsSummaryVendorSavingsResponseBody", + "type": "object" + }, + "OptimaRecommendations_UsageReductionSavingsCategoryResponseBody": { + "example": { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Superseded Compute Instances", + "recommendationCount": 64, + "savingsPerMonth": 48210.35 + }, + "properties": { + "byVendor": { + "description": "Per-vendor breakdown of this category's savings.", + "example": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "items": { + "$ref": "#/components/schemas/OptimaRecommendations_SavingsSummaryVendorSavingsResponseBody" + }, + "type": "array" + }, + "category": { + "description": "The category name (derived from policySet).", + "example": "Superseded Compute Instances", + "type": "string" + }, + "recommendationCount": { + "description": "Number of recommendations in this category.", + "example": 64, + "format": "int64", + "type": "integer" + }, + "savingsPerMonth": { + "description": "Savings per month for this category.", + "example": 48210.35, + "format": "double", + "type": "number" + } + }, + "required": [ + "category", + "savingsPerMonth", + "recommendationCount", + "byVendor" + ], + "title": "UsageReductionSavingsCategoryResponseBody", + "type": "object" + }, + "OptimaRecommendations_UsageReductionSavingsResponseBody": { + "example": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 33747.25, + "vendor": "aws" + }, + { + "savingsPerMonth": 14463.1, + "vendor": "azure" + } + ], + "category": "Idle Compute Instances", + "recommendationCount": 64, + "savingsPerMonth": 48210.35 + }, + { + "byVendor": [ + { + "savingsPerMonth": 9120.5, + "vendor": "aws" + } + ], + "category": "Unattached Volumes", + "recommendationCount": 212, + "savingsPerMonth": 9120.5 + } + ], + "byStatus": [ + { + "recommendationCount": 880, + "savingsPerMonth": 609427.41, + "status": "active" + }, + { + "recommendationCount": 6, + "savingsPerMonth": 3120.5, + "status": "snoozed" + }, + { + "recommendationCount": 4, + "savingsPerMonth": 1874.2, + "status": "rejected" + } + ], + "recommendationCount": 890, + "savingsPerMonth": 609427.41 + }, + "properties": { + "byCategory": { + "description": "Per-category breakdown. Unfiltered by status (includes snoozed/rejected): the counts add up to recommendationCount, but the savings do not add up to savingsPerMonth above.", + "example": [ + { + "byVendor": [ + { + "savingsPerMonth": 33747.25, + "vendor": "aws" + }, + { + "savingsPerMonth": 14463.1, + "vendor": "azure" + } + ], + "category": "Idle Compute Instances", + "recommendationCount": 64, + "savingsPerMonth": 48210.35 + }, + { + "byVendor": [ + { + "savingsPerMonth": 9120.5, + "vendor": "aws" + } + ], + "category": "Unattached Volumes", + "recommendationCount": 212, + "savingsPerMonth": 9120.5 + } + ], + "items": { + "$ref": "#/components/schemas/OptimaRecommendations_UsageReductionSavingsCategoryResponseBody" + }, + "type": "array" + }, + "byStatus": { + "description": "Savings and number of recommendations per status: always active, snoozed and rejected, in this order.", + "example": [ + { + "recommendationCount": 880, + "savingsPerMonth": 609427.41, + "status": "active" + }, + { + "recommendationCount": 6, + "savingsPerMonth": 3120.5, + "status": "snoozed" + }, + { + "recommendationCount": 4, + "savingsPerMonth": 1874.2, + "status": "rejected" + } + ], + "items": { + "$ref": "#/components/schemas/OptimaRecommendations_UsageReductionSavingsStatusResponseBody" + }, + "type": "array" + }, + "recommendationCount": { + "description": "Number of Usage Reduction recommendations of every status (active, snoozed and rejected), the sum of byStatus.", + "example": 890, + "format": "int64", + "type": "integer" + }, + "savingsPerMonth": { + "description": "Savings per month of the active recommendations only (status active or not set), the widget's headline figure.", + "example": 609427.41, + "format": "double", + "type": "number" + } + }, + "required": [ + "savingsPerMonth", + "recommendationCount", + "byCategory", + "byStatus" + ], + "title": "UsageReductionSavingsResponseBody", + "type": "object" + }, + "OptimaRecommendations_UsageReductionSavingsStatusResponseBody": { + "example": { + "recommendationCount": 880, + "savingsPerMonth": 609427.41, + "status": "active" + }, + "properties": { + "recommendationCount": { + "description": "Number of recommendations with this status.", + "example": 880, + "format": "int64", + "type": "integer" + }, + "savingsPerMonth": { + "description": "Savings per month of the recommendations with this status.", + "example": 609427.41, + "format": "double", + "type": "number" + }, + "status": { + "description": "The recommendation status.", + "enum": [ + "active", + "snoozed", + "rejected" + ], + "example": "active", + "type": "string" + } + }, + "required": [ + "status", + "savingsPerMonth", + "recommendationCount" + ], + "title": "UsageReductionSavingsStatusResponseBody", + "type": "object" + }, "Policy_ActionStatusCollection": { "example": [ { @@ -141281,14 +145155,14 @@ "type": "object" }, "Vis_DeviceDatasourceSelection": { - "description": "A selection of datasources to delete devices from. If included in the datasources filter, only 1 property should be set", + "description": "Identifies a datasource by one property. When multiple selectors are provided, a datasource is included if it matches any selector.", "example": { "field": "type", "value": "SCCM" }, "properties": { "field": { - "description": "The field to use for the selection of datasources", + "description": "Datasource property to compare: id for the datasource ID, name for the datasource name, or type for the datasource type", "enum": [ "id", "name", @@ -141298,7 +145172,7 @@ "type": "string" }, "value": { - "description": "The value for the datasource selection", + "description": "Exact value that the selected datasource property must match", "example": "SCCM", "type": "string" } @@ -141313,40 +145187,21 @@ "example": { "datasourceSelectors": [ { - "field": "type", - "value": "SCCM" - }, - { - "field": "type", - "value": "SCCM" - }, - { - "field": "type", - "value": "SCCM" - }, - { - "field": "type", - "value": "SCCM" + "field": "id", + "value": "a8d416e5-7212-4a9a-93f3-0b8602ad06f4" } ], "deviceIds": [ - "Voluptatum optio laudantium illum doloribus delectus ea.", - "Vitae repellat voluptatum ipsum.", - "Sint vel provident voluptates ut asperiores aliquam.", - "Occaecati architecto." + "4e0e3471-ccbc-41c7-a21e-c384f2eb5669" ] }, "properties": { "datasourceSelectors": { - "description": "List of datasources to delete devices from", + "description": "Optional datasource selectors. A datasource is included when it matches any selector. Omit this attribute to include all datasources associated with the specified devices.", "example": [ { - "field": "type", - "value": "SCCM" - }, - { - "field": "type", - "value": "SCCM" + "field": "id", + "value": "a8d416e5-7212-4a9a-93f3-0b8602ad06f4" } ], "items": { @@ -141355,15 +145210,12 @@ "type": "array" }, "deviceIds": { - "description": "List of device IDs to delete", + "description": "Device IDs whose evidence should be included. Send no more than 500 unique IDs per request; this recommendation is not enforced by the API.", "example": [ - "Quasi cum itaque fugiat.", - "Voluptatibus aliquam iste ipsa.", - "Aliquid nam.", - "Enim laboriosam tempore." + "4e0e3471-ccbc-41c7-a21e-c384f2eb5669" ], "items": { - "example": "Blanditiis fugiat magni.", + "example": "Perferendis ullam et sunt accusantium.", "type": "string" }, "type": "array" @@ -141376,6 +145228,20 @@ }, "Vis_ExportDataCollection": { "example": [ + { + "createdAt": "2018-05-16T16:31:52.1000Z", + "id": "7d795afa-c508-4d47-92ae-248113a792d1", + "name": "hardware_inventory", + "size": 1080, + "type": "snapshot" + }, + { + "createdAt": "2018-05-16T16:31:52.1000Z", + "id": "7d795afa-c508-4d47-92ae-248113a792d1", + "name": "hardware_inventory", + "size": 1080, + "type": "snapshot" + }, { "createdAt": "2018-05-16T16:31:52.1000Z", "id": "7d795afa-c508-4d47-92ae-248113a792d1", @@ -141416,13 +145282,6 @@ "size": 1080, "type": "snapshot" }, - { - "createdAt": "2018-05-16T16:31:52.1000Z", - "id": "7d795afa-c508-4d47-92ae-248113a792d1", - "name": "hardware_inventory", - "size": 1080, - "type": "snapshot" - }, { "createdAt": "2018-05-16T16:31:52.1000Z", "id": "7d795afa-c508-4d47-92ae-248113a792d1", @@ -141457,16 +145316,17 @@ "type": "object" }, "Vis_FlexeraVisDeviceDeletionSummary": { - "description": "A count of devices that would be deleted by the query.", + "description": "Summarizes the device evidence selected by a deletion request for one datasource.", "example": { "count": 150, "datasourceId": "4e0e3471-ccbc-41c7-a21e-c384f2eb5669", "datasourceName": "SCCM_PROD_AP", - "datasourceType": "SCCM" + "datasourceType": "SCCM", + "kind": "vis:device-deletion-summary" }, "properties": { "count": { - "description": "The number of devices that would be deleted", + "description": "The number of devices whose evidence is selected", "example": 150, "type": "integer" }, @@ -141484,9 +145344,18 @@ "description": "The type of the datasource", "example": "SCCM", "type": "string" + }, + "kind": { + "description": "The resource's type", + "enum": [ + "vis:device-deletion-summary" + ], + "example": "vis:device-deletion-summary", + "type": "string" } }, "required": [ + "kind", "count", "datasourceId", "datasourceName", diff --git a/internal/catalog/coverage_gen.json b/internal/catalog/coverage_gen.json index 5fa94af..09e43d6 100644 --- a/internal/catalog/coverage_gen.json +++ b/internal/catalog/coverage_gen.json @@ -3526,6 +3526,22 @@ ], "ownership": "generated" }, + { + "operationId": "OptimaRecommendations_Recommendations_export", + "command": [ + "recommendations", + "export" + ], + "ownership": "generated" + }, + { + "operationId": "OptimaRecommendations_Recommendations_groupTree", + "command": [ + "recommendations", + "groups" + ], + "ownership": "generated" + }, { "operationId": "OptimaRecommendations_Recommendations_index", "command": [ @@ -3534,6 +3550,22 @@ ], "ownership": "generated" }, + { + "operationId": "OptimaRecommendations_Recommendations_recommendationsPaged", + "command": [ + "recommendations", + "paged" + ], + "ownership": "generated" + }, + { + "operationId": "OptimaRecommendations_Recommendations_savingsSummary", + "command": [ + "recommendations", + "savings-summary" + ], + "ownership": "generated" + }, { "operationId": "OptimaRecommendations_Recommendations_updateStatus", "command": [ diff --git a/internal/commands/finopsbilling/invoices/cmd_gen.go b/internal/commands/finopsbilling/invoices/cmd_gen.go index b84aafc..e8d2cb9 100644 --- a/internal/commands/finopsbilling/invoices/cmd_gen.go +++ b/internal/commands/finopsbilling/invoices/cmd_gen.go @@ -113,6 +113,7 @@ func newInvoicesCreateCmd() *cobra.Command { fDisplayLogoWithinPdf bool fDueDate string fEndDate string + fExportLayout string fExportType string fFreeText string fInvoiceTemplateID string @@ -162,6 +163,9 @@ func newInvoicesCreateCmd() *cobra.Command { if cmd.Flags().Changed("end-date") { fields["endDate"] = fEndDate } + if cmd.Flags().Changed("export-layout") { + fields["exportLayout"] = fExportLayout + } if cmd.Flags().Changed("export-type") { fields["exportType"] = fExportType } @@ -262,6 +266,7 @@ func newInvoicesCreateCmd() *cobra.Command { c.Flags().BoolVar(&fDisplayLogoWithinPdf, "display-logo-within-pdf", false, "displayLogoWithinPdf (body)") c.Flags().StringVar(&fDueDate, "due-date", "", "dueDate (body)") c.Flags().StringVar(&fEndDate, "end-date", "", "endDate (body)") + c.Flags().StringVar(&fExportLayout, "export-layout", "", "exportLayout (body)") c.Flags().StringVar(&fExportType, "export-type", "", "exportType (body)") c.Flags().StringVar(&fFreeText, "free-text", "", "freeText (body)") c.Flags().StringVar(&fInvoiceTemplateID, "invoice-template-id", "", "invoiceTemplateId (body)") @@ -332,17 +337,17 @@ func newInvoicesGetCmd() *cobra.Command { // newInvoicesListCmd — GET /finops-billing/v1/orgs/{orgId}/invoices (operationId: FinopsBilling_Invoices_index) func newInvoicesListCmd() *cobra.Command { var ( - limit int - status string - orderBy string - billMonth string - exportType string - customerName string - filter string - expressionFilter string - groupByCount int - noPaginate bool - skipToken string + limit int + status string + orderBy string + invoiceNumber string + billMonth string + exportType string + customerName string + filter string + groupByCount int + noPaginate bool + skipToken string ) c := &cobra.Command{ Use: "list", @@ -371,6 +376,10 @@ func newInvoicesListCmd() *cobra.Command { v := orderBy params.OrderBy = &v } + if cmd.Flags().Changed("invoice-number") { + v := invoiceNumber + params.InvoiceNumber = &v + } if cmd.Flags().Changed("bill-month") { v := billMonth params.BillMonth = &v @@ -387,10 +396,6 @@ func newInvoicesListCmd() *cobra.Command { v := filter params.Filter = &v } - if cmd.Flags().Changed("expression-filter") { - v := expressionFilter - params.ExpressionFilter = &v - } if cmd.Flags().Changed("group-by-count") { v := groupByCount params.GroupByCount = &v @@ -431,11 +436,11 @@ func newInvoicesListCmd() *cobra.Command { c.Flags().IntVar(&limit, "limit", 0, "limit (query)") c.Flags().StringVar(&status, "status", "", "status (query)") c.Flags().StringVar(&orderBy, "order-by", "", "orderBy (query)") + c.Flags().StringVar(&invoiceNumber, "invoice-number", "", "invoiceNumber (query)") c.Flags().StringVar(&billMonth, "bill-month", "", "billMonth (query)") c.Flags().StringVar(&exportType, "export-type", "", "exportType (query)") c.Flags().StringVar(&customerName, "customer-name", "", "customerName (query)") c.Flags().StringVar(&filter, "filter", "", "filter (query)") - c.Flags().StringVar(&expressionFilter, "expression-filter", "", "expressionFilter (query)") c.Flags().IntVar(&groupByCount, "group-by-count", 0, "groupByCount (query)") c.Flags().BoolVar(&noPaginate, "no-paginate", false, "return only the first page (do not follow nextPage)") c.Flags().StringVar(&skipToken, "skip-token", "", "resume pagination from this token") diff --git a/internal/commands/finopsbilling/invoicescheduleinvoices/cmd_gen.go b/internal/commands/finopsbilling/invoicescheduleinvoices/cmd_gen.go index dc7f64a..ec293ad 100644 --- a/internal/commands/finopsbilling/invoicescheduleinvoices/cmd_gen.go +++ b/internal/commands/finopsbilling/invoicescheduleinvoices/cmd_gen.go @@ -99,12 +99,12 @@ func newInvoiceScheduleInvoicesListCmd() *cobra.Command { limit int status string orderBy string + invoiceNumber string billMonth string exportType string customerName string costMetric string customerBillingPlan string - filter string noPaginate bool skipToken string ) @@ -138,6 +138,10 @@ func newInvoiceScheduleInvoicesListCmd() *cobra.Command { v := orderBy params.OrderBy = &v } + if cmd.Flags().Changed("invoice-number") { + v := invoiceNumber + params.InvoiceNumber = &v + } if cmd.Flags().Changed("bill-month") { v := billMonth params.BillMonth = &v @@ -158,10 +162,6 @@ func newInvoiceScheduleInvoicesListCmd() *cobra.Command { v := customerBillingPlan params.CustomerBillingPlan = &v } - if cmd.Flags().Changed("filter") { - v := filter - params.Filter = &v - } client, err := deps.APIClient() if err != nil { return err @@ -199,12 +199,12 @@ func newInvoiceScheduleInvoicesListCmd() *cobra.Command { c.Flags().IntVar(&limit, "limit", 0, "limit (query)") c.Flags().StringVar(&status, "status", "", "status (query)") c.Flags().StringVar(&orderBy, "order-by", "", "orderBy (query)") + c.Flags().StringVar(&invoiceNumber, "invoice-number", "", "invoiceNumber (query)") c.Flags().StringVar(&billMonth, "bill-month", "", "billMonth (query)") c.Flags().StringVar(&exportType, "export-type", "", "exportType (query)") c.Flags().StringVar(&customerName, "customer-name", "", "customerName (query)") c.Flags().StringVar(&costMetric, "cost-metric", "", "costMetric (query)") c.Flags().StringVar(&customerBillingPlan, "customer-billing-plan", "", "customerBillingPlan (query)") - c.Flags().StringVar(&filter, "filter", "", "filter (query)") c.Flags().BoolVar(&noPaginate, "no-paginate", false, "return only the first page (do not follow nextPage)") c.Flags().StringVar(&skipToken, "skip-token", "", "resume pagination from this token") return c diff --git a/internal/commands/finopsbilling/invoiceschedules/cmd_gen.go b/internal/commands/finopsbilling/invoiceschedules/cmd_gen.go index 52db4a4..eaa33d1 100644 --- a/internal/commands/finopsbilling/invoiceschedules/cmd_gen.go +++ b/internal/commands/finopsbilling/invoiceschedules/cmd_gen.go @@ -184,13 +184,15 @@ func newInvoiceSchedulesDeactivateCmd() *cobra.Command { // newInvoiceSchedulesCreateCmd — POST /finops-billing/v1/orgs/{orgId}/invoice-schedules (operationId: FinopsBilling_Invoice_Schedules_create) func newInvoiceSchedulesCreateCmd() *cobra.Command { var ( - bodyRaw string - fInvoiceTemplateID string - fIsCreateTemplate bool - fScheduleName string - dryRun bool - yes bool - interactive bool + bodyRaw string + fInvoiceNumberBase string + fInvoiceNumberPrefix string + fInvoiceTemplateID string + fIsCreateTemplate bool + fScheduleName string + dryRun bool + yes bool + interactive bool ) c := &cobra.Command{ Use: "create", @@ -214,6 +216,12 @@ func newInvoiceSchedulesCreateCmd() *cobra.Command { return err } fields := map[string]any{} + if cmd.Flags().Changed("invoice-number-base") { + fields["invoiceNumberBase"] = fInvoiceNumberBase + } + if cmd.Flags().Changed("invoice-number-prefix") { + fields["invoiceNumberPrefix"] = fInvoiceNumberPrefix + } if cmd.Flags().Changed("invoice-template-id") { fields["invoiceTemplateId"] = fInvoiceTemplateID } @@ -294,6 +302,8 @@ func newInvoiceSchedulesCreateCmd() *cobra.Command { } }, } + c.Flags().StringVar(&fInvoiceNumberBase, "invoice-number-base", "", "invoiceNumberBase (body)") + c.Flags().StringVar(&fInvoiceNumberPrefix, "invoice-number-prefix", "", "invoiceNumberPrefix (body)") c.Flags().StringVar(&fInvoiceTemplateID, "invoice-template-id", "", "invoiceTemplateId (body)") c.Flags().BoolVar(&fIsCreateTemplate, "is-create-template", false, "isCreateTemplate (body)") c.Flags().StringVar(&fScheduleName, "schedule-name", "", "scheduleName (body)") @@ -364,7 +374,6 @@ func newInvoiceSchedulesListCmd() *cobra.Command { customerID int status string scheduleName string - filter string noPaginate bool skipToken string ) @@ -403,10 +412,6 @@ func newInvoiceSchedulesListCmd() *cobra.Command { v := scheduleName params.ScheduleName = &v } - if cmd.Flags().Changed("filter") { - v := filter - params.Filter = &v - } client, err := deps.APIClient() if err != nil { return err @@ -445,7 +450,6 @@ func newInvoiceSchedulesListCmd() *cobra.Command { c.Flags().IntVar(&customerID, "customer-id", 0, "customerId (query)") c.Flags().StringVar(&status, "status", "", "status (query)") c.Flags().StringVar(&scheduleName, "schedule-name", "", "scheduleName (query)") - c.Flags().StringVar(&filter, "filter", "", "filter (query)") c.Flags().BoolVar(&noPaginate, "no-paginate", false, "return only the first page (do not follow nextPage)") c.Flags().StringVar(&skipToken, "skip-token", "", "resume pagination from this token") return c @@ -454,14 +458,17 @@ func newInvoiceSchedulesListCmd() *cobra.Command { // newInvoiceSchedulesUpdateCmd — PATCH /finops-billing/v1/orgs/{orgId}/invoice-schedules/{id} (operationId: FinopsBilling_Invoice_Schedules_update) func newInvoiceSchedulesUpdateCmd() *cobra.Command { var ( - id string - bodyRaw string - fInvoiceTemplateID string - fIsCreateTemplate bool - fScheduleName string - dryRun bool - yes bool - interactive bool + id string + bodyRaw string + fInvoiceNumberBase string + fInvoiceNumberPrefix string + fInvoiceTemplateID string + fIsCreateTemplate bool + fScheduleName string + fStatus string + dryRun bool + yes bool + interactive bool ) c := &cobra.Command{ Use: "update", @@ -489,6 +496,12 @@ func newInvoiceSchedulesUpdateCmd() *cobra.Command { } params := flexera.FinopsBillingInvoiceSchedulesUpdateParams{} fields := map[string]any{} + if cmd.Flags().Changed("invoice-number-base") { + fields["invoiceNumberBase"] = fInvoiceNumberBase + } + if cmd.Flags().Changed("invoice-number-prefix") { + fields["invoiceNumberPrefix"] = fInvoiceNumberPrefix + } if cmd.Flags().Changed("invoice-template-id") { fields["invoiceTemplateId"] = fInvoiceTemplateID } @@ -498,6 +511,9 @@ func newInvoiceSchedulesUpdateCmd() *cobra.Command { if cmd.Flags().Changed("schedule-name") { fields["scheduleName"] = fScheduleName } + if cmd.Flags().Changed("status") { + fields["status"] = fStatus + } var typed any if len(fields) > 0 { typed = fields @@ -570,9 +586,12 @@ func newInvoiceSchedulesUpdateCmd() *cobra.Command { }, } c.Flags().StringVar(&id, "id", "", "id (path, required)") + c.Flags().StringVar(&fInvoiceNumberBase, "invoice-number-base", "", "invoiceNumberBase (body)") + c.Flags().StringVar(&fInvoiceNumberPrefix, "invoice-number-prefix", "", "invoiceNumberPrefix (body)") c.Flags().StringVar(&fInvoiceTemplateID, "invoice-template-id", "", "invoiceTemplateId (body)") c.Flags().BoolVar(&fIsCreateTemplate, "is-create-template", false, "isCreateTemplate (body)") c.Flags().StringVar(&fScheduleName, "schedule-name", "", "scheduleName (body)") + c.Flags().StringVar(&fStatus, "status", "", "status (body)") c.Flags().StringVar(&bodyRaw, "body", "", "raw JSON body (inline | @file | @-); overrides body field flags") c.Flags().BoolVar(&dryRun, "dry-run", false, "print the planned operation as JSON and exit without calling the API") c.Flags().BoolVar(&yes, "yes", false, "confirm the operation (required for destructive ops)") diff --git a/internal/commands/finopsbilling/invoicetemplates/cmd_gen.go b/internal/commands/finopsbilling/invoicetemplates/cmd_gen.go index b61e9a9..3339b84 100644 --- a/internal/commands/finopsbilling/invoicetemplates/cmd_gen.go +++ b/internal/commands/finopsbilling/invoicetemplates/cmd_gen.go @@ -44,6 +44,7 @@ func newInvoiceTemplatesCreateCmd() *cobra.Command { fCostMetric string fDimensions []string fDisplayLogoWithinPdf bool + fExportLayout string fExportType string fFreeText string fLogo string @@ -84,6 +85,9 @@ func newInvoiceTemplatesCreateCmd() *cobra.Command { if cmd.Flags().Changed("display-logo-within-pdf") { fields["displayLogoWithinPdf"] = fDisplayLogoWithinPdf } + if cmd.Flags().Changed("export-layout") { + fields["exportLayout"] = fExportLayout + } if cmd.Flags().Changed("export-type") { fields["exportType"] = fExportType } @@ -173,6 +177,7 @@ func newInvoiceTemplatesCreateCmd() *cobra.Command { c.Flags().StringVar(&fCostMetric, "cost-metric", "", "costMetric (body)") c.Flags().StringSliceVar(&fDimensions, "dimensions", nil, "dimensions (body)") c.Flags().BoolVar(&fDisplayLogoWithinPdf, "display-logo-within-pdf", false, "displayLogoWithinPdf (body)") + c.Flags().StringVar(&fExportLayout, "export-layout", "", "exportLayout (body)") c.Flags().StringVar(&fExportType, "export-type", "", "exportType (body)") c.Flags().StringVar(&fFreeText, "free-text", "", "freeText (body)") c.Flags().StringVar(&fLogo, "logo", "", "logo (body)") @@ -322,6 +327,7 @@ func newInvoiceTemplatesUpdateCmd() *cobra.Command { fCostMetric string fDimensions []string fDisplayLogoWithinPdf bool + fExportLayout string fExportType string fFreeText string fLogo string @@ -366,6 +372,9 @@ func newInvoiceTemplatesUpdateCmd() *cobra.Command { if cmd.Flags().Changed("display-logo-within-pdf") { fields["displayLogoWithinPdf"] = fDisplayLogoWithinPdf } + if cmd.Flags().Changed("export-layout") { + fields["exportLayout"] = fExportLayout + } if cmd.Flags().Changed("export-type") { fields["exportType"] = fExportType } @@ -456,6 +465,7 @@ func newInvoiceTemplatesUpdateCmd() *cobra.Command { c.Flags().StringVar(&fCostMetric, "cost-metric", "", "costMetric (body)") c.Flags().StringSliceVar(&fDimensions, "dimensions", nil, "dimensions (body)") c.Flags().BoolVar(&fDisplayLogoWithinPdf, "display-logo-within-pdf", false, "displayLogoWithinPdf (body)") + c.Flags().StringVar(&fExportLayout, "export-layout", "", "exportLayout (body)") c.Flags().StringVar(&fExportType, "export-type", "", "exportType (body)") c.Flags().StringVar(&fFreeText, "free-text", "", "freeText (body)") c.Flags().StringVar(&fLogo, "logo", "", "logo (body)") diff --git a/internal/commands/iam/user/cmd_gen.go b/internal/commands/iam/user/cmd_gen.go index b55df26..43961af 100644 --- a/internal/commands/iam/user/cmd_gen.go +++ b/internal/commands/iam/user/cmd_gen.go @@ -272,6 +272,9 @@ func newUserListCmd() *cobra.Command { filter string orderBy string accessSource string + limit int + noPaginate bool + skipToken string ) c := &cobra.Command{ Use: "list", @@ -300,35 +303,49 @@ func newUserListCmd() *cobra.Command { ev := flexera.IamUserIndexParamsAccessSource(accessSource) params.AccessSource = &ev } + if cmd.Flags().Changed("limit") { + v := limit + params.Limit = &v + } client, err := deps.APIClient() if err != nil { return err } - resp, err := client.IamUserIndexWithResponse(cmd.Context(), deps.Config.OrgID, ¶ms) + var initialSkipToken *string + if t := strings.TrimSpace(skipToken); t != "" { + initialSkipToken = &t + } + result, err := flexera.CollectPages(cmd.Context(), noPaginate, initialSkipToken, + func(ctx context.Context, st *string) (any, error) { + p := params + p.SkipToken = st + resp, callErr := client.IamUserIndexWithResponse(ctx, deps.Config.OrgID, &p) + if callErr != nil { + return nil, callErr + } + switch resp.StatusCode() { + case 200: + if resp.JSON200 != nil { + if deps.Config.Output == "table" && deps.Printer.JQ == nil && len(deps.Printer.Fields) == 0 { + return resp.JSON200, nil + } + return clipkg.DecodeResponseJSON(resp.Body) + } + } + return nil, flexera.ResponseError(resp.StatusCode(), resp.Body) + }) if err != nil { return err } - switch resp.StatusCode() { - case 200: - if resp.JSON200 == nil { - return flexera.ResponseError(resp.StatusCode(), resp.Body) - } - if deps.Config.Output == "table" && deps.Printer.JQ == nil && len(deps.Printer.Fields) == 0 { - return deps.Printer.Render(deps.Stdout, deps.Config.Output, resp.JSON200) - } - result, err := clipkg.DecodeResponseJSON(resp.Body) - if err != nil { - return err - } - return deps.Printer.Render(deps.Stdout, deps.Config.Output, result) - default: - return flexera.ResponseError(resp.StatusCode(), resp.Body) - } + return deps.Printer.Render(deps.Stdout, deps.Config.Output, result) }, } c.Flags().StringVar(&filter, "filter", "", "filter (query)") c.Flags().StringVar(&orderBy, "order-by", "", "orderBy (query)") c.Flags().StringVar(&accessSource, "access-source", "", "accessSource (query)") + c.Flags().IntVar(&limit, "limit", 0, "limit (query)") + c.Flags().BoolVar(&noPaginate, "no-paginate", false, "return only the first page (do not follow nextPage)") + c.Flags().StringVar(&skipToken, "skip-token", "", "resume pagination from this token") return c } diff --git a/internal/commands/itvisibility/device/cmd_gen.go b/internal/commands/itvisibility/device/cmd_gen.go index 97b807e..21ae457 100644 --- a/internal/commands/itvisibility/device/cmd_gen.go +++ b/internal/commands/itvisibility/device/cmd_gen.go @@ -46,7 +46,7 @@ func newDeviceSubmitCmd() *cobra.Command { ) c := &cobra.Command{ Use: "submit", - Short: "delete the device evidence for the given device ids using the query", + Short: "Delete device evidence", Example: "Illustrative only: replace uppercase tokens; provide your own request.json for body input.\n flexera-cli it-visibility device submit --org-id ORG_ID --body @request.json\n flexera-cli it-visibility device submit --org-id ORG_ID --body @request.json --dry-run\nValidated illustrative body, when available (review before use):\n flexera-cli cli schema it-visibility device submit --example > request.json", Annotations: map[string]string{"flexera.operationId": "Vis_Device_delete", "flexera.output": "structured", "flexera.validation": "body"}, Args: cobra.NoArgs, @@ -156,7 +156,7 @@ func newDeviceGetCmd() *cobra.Command { ) c := &cobra.Command{ Use: "get", - Short: "Estimate device evidence that would be deleted using the query", + Short: "Estimate device evidence deletion", Example: "Illustrative only: replace uppercase tokens; provide your own request.json for body input.\n flexera-cli it-visibility device get --org-id ORG_ID --body @request.json\nValidated illustrative body, when available (review before use):\n flexera-cli cli schema it-visibility device get --example > request.json", Annotations: map[string]string{"flexera.operationId": "Vis_Device_estimateDelete", "flexera.output": "structured", "flexera.validation": "body"}, Args: cobra.NoArgs, diff --git a/internal/commands/recommendations/recommendations/cmd_gen.go b/internal/commands/recommendations/recommendations/cmd_gen.go index e65bb5e..40c4f45 100644 --- a/internal/commands/recommendations/recommendations/cmd_gen.go +++ b/internal/commands/recommendations/recommendations/cmd_gen.go @@ -30,6 +30,10 @@ func NewCmd() *cobra.Command { } c.AddCommand( newRecommendationsListCmd(), + newRecommendationsExportCmd(), + newRecommendationsGroupsCmd(), + newRecommendationsPagedCmd(), + newRecommendationsSavingsSummaryCmd(), newRecommendationsReplaceCmd(), ) return c @@ -104,10 +108,263 @@ func newRecommendationsListCmd() *cobra.Command { return c } +// newRecommendationsExportCmd — GET /recommendations/orgs/{orgId}/recommendations/export (operationId: OptimaRecommendations_Recommendations_export) +func newRecommendationsExportCmd() *cobra.Command { + var ( + filter string + orderBy string + columns []string + ) + c := &cobra.Command{ + Use: "export", + Short: "Export recommendations as CSV", + Example: "Illustrative only: replace uppercase tokens; provide your own request.json for body input.\n flexera-cli recommendations export --org-id ORG_ID --columns COLUMNS", + Annotations: map[string]string{"flexera.operationId": "OptimaRecommendations_Recommendations_export", "flexera.output": "text", "flexera.validation": "params"}, + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + // Parse formatted query flags before client creation/authentication. + deps := clipkg.DepsFrom(cmd.Context()) + effectiveParams, err := clipkg.ValidateCommandParams(cmd, "OptimaRecommendations_Recommendations_export") + if err != nil { + return err + } + _ = effectiveParams + params := flexera.OptimaRecommendationsRecommendationsExportParams{} + if cmd.Flags().Changed("filter") { + v := filter + params.Filter = &v + } + if cmd.Flags().Changed("order-by") { + v := orderBy + params.OrderBy = &v + } + if cmd.Flags().Changed("columns") { + params.Columns = columns + } + client, err := deps.APIClient() + if err != nil { + return err + } + resp, err := client.OptimaRecommendationsRecommendationsExportWithResponse(cmd.Context(), deps.Config.OrgID, ¶ms) + if err != nil { + return err + } + switch resp.StatusCode() { + case 200: + fmt.Fprintln(deps.Stdout, "OK") + return nil + default: + return flexera.ResponseError(resp.StatusCode(), resp.Body) + } + }, + } + c.Flags().StringVar(&filter, "filter", "", "filter (query)") + c.Flags().StringVar(&orderBy, "order-by", "", "orderBy (query)") + c.Flags().StringSliceVar(&columns, "columns", nil, "columns (query)") + return c +} + +// newRecommendationsGroupsCmd — GET /recommendations/orgs/{orgId}/recommendations/groups (operationId: OptimaRecommendations_Recommendations_groupTree) +func newRecommendationsGroupsCmd() *cobra.Command { + var ( + filter string + groupBy string + ) + c := &cobra.Command{ + Use: "groups", + Short: "Group recommendations into a tree", + Example: "Illustrative only: replace uppercase tokens; provide your own request.json for body input.\n flexera-cli recommendations groups --org-id ORG_ID --group-by GROUP_BY", + Annotations: map[string]string{"flexera.operationId": "OptimaRecommendations_Recommendations_groupTree", "flexera.output": "structured", "flexera.validation": "params"}, + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + // Parse formatted query flags before client creation/authentication. + deps := clipkg.DepsFrom(cmd.Context()) + effectiveParams, err := clipkg.ValidateCommandParams(cmd, "OptimaRecommendations_Recommendations_groupTree") + if err != nil { + return err + } + _ = effectiveParams + params := flexera.OptimaRecommendationsRecommendationsGroupTreeParams{} + if cmd.Flags().Changed("filter") { + v := filter + params.Filter = &v + } + if cmd.Flags().Changed("group-by") { + params.GroupBy = groupBy + } + client, err := deps.APIClient() + if err != nil { + return err + } + resp, err := client.OptimaRecommendationsRecommendationsGroupTreeWithResponse(cmd.Context(), deps.Config.OrgID, ¶ms) + if err != nil { + return err + } + switch resp.StatusCode() { + case 200: + if resp.JSON200 == nil { + return flexera.ResponseError(resp.StatusCode(), resp.Body) + } + if deps.Config.Output == "table" && deps.Printer.JQ == nil && len(deps.Printer.Fields) == 0 { + return deps.Printer.Render(deps.Stdout, deps.Config.Output, resp.JSON200) + } + result, err := clipkg.DecodeResponseJSON(resp.Body) + if err != nil { + return err + } + return deps.Printer.Render(deps.Stdout, deps.Config.Output, result) + default: + return flexera.ResponseError(resp.StatusCode(), resp.Body) + } + }, + } + c.Flags().StringVar(&filter, "filter", "", "filter (query)") + c.Flags().StringVar(&groupBy, "group-by", "", "groupBy (query)") + return c +} + +// newRecommendationsPagedCmd — GET /recommendations/orgs/{orgId}/recommendations/paged (operationId: OptimaRecommendations_Recommendations_recommendationsPaged) +func newRecommendationsPagedCmd() *cobra.Command { + var ( + view string + filter string + orderBy string + limit int + noPaginate bool + skipToken string + ) + c := &cobra.Command{ + Use: "paged", + Short: "List recommendations (filtered, sorted, cursor-paginated)", + Example: "Illustrative only: replace uppercase tokens; provide your own request.json for body input.\n flexera-cli recommendations paged --org-id ORG_ID", + Annotations: map[string]string{"flexera.operationId": "OptimaRecommendations_Recommendations_recommendationsPaged", "flexera.output": "structured", "flexera.validation": "params"}, + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + // Parse formatted query flags before client creation/authentication. + deps := clipkg.DepsFrom(cmd.Context()) + effectiveParams, err := clipkg.ValidateCommandParams(cmd, "OptimaRecommendations_Recommendations_recommendationsPaged") + if err != nil { + return err + } + _ = effectiveParams + params := flexera.OptimaRecommendationsRecommendationsRecommendationsPagedParams{} + if cmd.Flags().Changed("view") { + ev := flexera.OptimaRecommendationsRecommendationsRecommendationsPagedParamsView(view) + params.View = &ev + } + if cmd.Flags().Changed("filter") { + v := filter + params.Filter = &v + } + if cmd.Flags().Changed("order-by") { + v := orderBy + params.OrderBy = &v + } + if cmd.Flags().Changed("limit") { + v := limit + params.Limit = &v + } + client, err := deps.APIClient() + if err != nil { + return err + } + var initialSkipToken *string + if t := strings.TrimSpace(skipToken); t != "" { + initialSkipToken = &t + } + result, err := flexera.CollectPages(cmd.Context(), noPaginate, initialSkipToken, + func(ctx context.Context, st *string) (any, error) { + p := params + p.SkipToken = st + resp, callErr := client.OptimaRecommendationsRecommendationsRecommendationsPagedWithResponse(ctx, deps.Config.OrgID, &p) + if callErr != nil { + return nil, callErr + } + switch resp.StatusCode() { + case 200: + if resp.JSON200 != nil { + if deps.Config.Output == "table" && deps.Printer.JQ == nil && len(deps.Printer.Fields) == 0 { + return resp.JSON200, nil + } + return clipkg.DecodeResponseJSON(resp.Body) + } + } + return nil, flexera.ResponseError(resp.StatusCode(), resp.Body) + }) + if err != nil { + return err + } + return deps.Printer.Render(deps.Stdout, deps.Config.Output, result) + }, + } + c.Flags().StringVar(&view, "view", "", "view (query)") + c.Flags().StringVar(&filter, "filter", "", "filter (query)") + c.Flags().StringVar(&orderBy, "order-by", "", "orderBy (query)") + c.Flags().IntVar(&limit, "limit", 0, "limit (query)") + c.Flags().BoolVar(&noPaginate, "no-paginate", false, "return only the first page (do not follow nextPage)") + c.Flags().StringVar(&skipToken, "skip-token", "", "resume pagination from this token") + return c +} + +// newRecommendationsSavingsSummaryCmd — GET /recommendations/orgs/{orgId}/recommendations/savings-summary (operationId: OptimaRecommendations_Recommendations_savingsSummary) +func newRecommendationsSavingsSummaryCmd() *cobra.Command { + var ( + billingCenterIDs []string + ) + c := &cobra.Command{ + Use: "savings-summary", + Short: "Summary data for the Optimization overview page widgets", + Example: "Illustrative only: replace uppercase tokens; provide your own request.json for body input.\n flexera-cli recommendations savings-summary --org-id ORG_ID", + Annotations: map[string]string{"flexera.operationId": "OptimaRecommendations_Recommendations_savingsSummary", "flexera.output": "structured", "flexera.validation": "params"}, + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, args []string) error { + // Parse formatted query flags before client creation/authentication. + deps := clipkg.DepsFrom(cmd.Context()) + effectiveParams, err := clipkg.ValidateCommandParams(cmd, "OptimaRecommendations_Recommendations_savingsSummary") + if err != nil { + return err + } + _ = effectiveParams + params := flexera.OptimaRecommendationsRecommendationsSavingsSummaryParams{} + if cmd.Flags().Changed("billing-center-i-ds") { + v := billingCenterIDs + params.BillingCenterIDs = &v + } + client, err := deps.APIClient() + if err != nil { + return err + } + resp, err := client.OptimaRecommendationsRecommendationsSavingsSummaryWithResponse(cmd.Context(), deps.Config.OrgID, ¶ms) + if err != nil { + return err + } + switch resp.StatusCode() { + case 200: + if resp.JSON200 == nil { + return flexera.ResponseError(resp.StatusCode(), resp.Body) + } + if deps.Config.Output == "table" && deps.Printer.JQ == nil && len(deps.Printer.Fields) == 0 { + return deps.Printer.Render(deps.Stdout, deps.Config.Output, resp.JSON200) + } + result, err := clipkg.DecodeResponseJSON(resp.Body) + if err != nil { + return err + } + return deps.Printer.Render(deps.Stdout, deps.Config.Output, result) + default: + return flexera.ResponseError(resp.StatusCode(), resp.Body) + } + }, + } + c.Flags().StringSliceVar(&billingCenterIDs, "billing-center-i-ds", nil, "billingCenterIDs (query)") + return c +} + // newRecommendationsReplaceCmd — PUT /recommendations/orgs/{orgId}/recommendations/updatestatus (operationId: OptimaRecommendations_Recommendations_updateStatus) func newRecommendationsReplaceCmd() *cobra.Command { var ( bodyRaw string + fGenerationID string fId string fSnoozedTargetDate string fStatus string @@ -138,6 +395,9 @@ func newRecommendationsReplaceCmd() *cobra.Command { return err } fields := map[string]any{} + if cmd.Flags().Changed("generation-id") { + fields["generationId"] = fGenerationID + } if cmd.Flags().Changed("id") { fields["id"] = fId } @@ -212,6 +472,7 @@ func newRecommendationsReplaceCmd() *cobra.Command { } }, } + c.Flags().StringVar(&fGenerationID, "generation-id", "", "generationId (body)") c.Flags().StringVar(&fId, "id", "", "id (body)") c.Flags().StringVar(&fSnoozedTargetDate, "snoozed-target-date", "", "snoozedTargetDate (body)") c.Flags().StringVar(&fStatus, "status", "", "status (body)") diff --git a/unified-openapi/PIN b/unified-openapi/PIN index 494fa14..07f3a21 100644 --- a/unified-openapi/PIN +++ b/unified-openapi/PIN @@ -1,4 +1,4 @@ repository=https://github.com/flexera-public/unified-openapi.git branch=main -commit=6a683791bfef4198bf388543bbf6702c528837fc -sha256=79996a9e0e05e3ba5bec850ce3e4960ebc922cbcc34a9aefa979098320d98c02 +commit=193aa650c764c6705d5d0d798d02f344d68a4b2a +sha256=a39070ff49afebbcd5c502ac98795c8a539ef952b63d5522fea2fe0f31f69938 diff --git a/unified-openapi/openapi3.json b/unified-openapi/openapi3.json index cfa1acd..8b5ea46 100644 --- a/unified-openapi/openapi3.json +++ b/unified-openapi/openapi3.json @@ -23957,7 +23957,7 @@ "type": "object" }, "Divnt_AzureCostAndUsageModel": { - "description": "Azure Cost \u0026 Usage configuration.\nAccountType is declared here alongside BillingScope and scope-specific fields.\n\nBillingScope rules (validated in OnboardingCreateRequest):\n - EA (any scope) : EnrollmentId (optional)\n - MCA Billing Account: no extra fields required\n - MCA Billing Profile: BillingProfileIds (required list)\n - MCA Invoice : InvoiceSectionIds (required list)\n - CSP Billing Account: no extra fields required\n - CSP Billing Profile: BillingProfileIds (required list)\n - CSP Customer Tenant: CustomerTenantId (required)\n\nAlways optional:\n - ActualExportUrl, AmortizedExportUrl, EffectiveFrom", + "description": "Azure Cost \u0026 Usage configuration.\nAccountType is declared here alongside BillingScope and scope-specific fields.\n\nBillingScope rules (validated in OnboardingCreateRequest):\n - EA (any scope) : EnrollmentId (optional)\n - MCA Billing Account: no extra fields required\n - MCA Billing Profile: BillingProfileIds (required list)\n - MCA Invoice : InvoiceSectionIds (required list)\n - CSP Billing Account: no extra fields required\n - CSP Billing Profile: BillingProfileIds (required list)\n - CSP Customer Tenant: CustomerTenantId (required)\n - CSP Subscription: SubscriptionId, ActualExportUrl and AmortizedExportUrl (all required)\n\nOptional:\n - ActualExportUrl, AmortizedExportUrl, EffectiveFrom", "properties": { "ActualExportUrl": { "description": "Actual cost export URL.", @@ -23987,17 +23987,24 @@ "type": "array" }, "BillingScope": { - "description": "Billing scope. Required for MCA ('Billing Account', 'Billing Profile', 'Invoice') and CSP ('Billing Account', 'Billing Profile', 'Customer Tenant') account types.", + "description": "Billing scope. Required for MCA ('Billing Account', 'Billing Profile', 'Invoice') and CSP ('Billing Account', 'Billing Profile', 'Customer Tenant', 'Subscription') account types.", "enum": [ "Billing Account", "Billing Profile", "Invoice", - "Customer Tenant" + "Customer Tenant", + "Subscription" ], "nullable": true, "title": "Billingscope", "type": "string" }, + "CspSubscriptionId": { + "description": "Subscription ID - required for CSP + Subscription scope.", + "nullable": true, + "title": "Cspsubscriptionid", + "type": "string" + }, "CustomerTenantId": { "description": "Customer Tenant ID - required for CSP + Customer Tenant scope.", "nullable": true, @@ -24472,6 +24479,12 @@ "description": "Defines the allocation strategy and the destinations that receive the reallocated costs.", "example": { "destinations": [ + { + "dimensionId": "rbd_team", + "dimensionName": "Team", + "percentage": 50, + "value": "Orion" + }, { "dimensionId": "rbd_team", "dimensionName": "Team", @@ -24485,12 +24498,6 @@ "destinations": { "description": "The destinations that receive the reallocated costs.", "example": [ - { - "dimensionId": "rbd_team", - "dimensionName": "Team", - "percentage": 50, - "value": "Orion" - }, { "dimensionId": "rbd_team", "dimensionName": "Team", @@ -24612,6 +24619,11 @@ "percentage": 50, "value": "Orion" }, + { + "dimensionId": "rbd_team", + "percentage": 50, + "value": "Orion" + }, { "dimensionId": "rbd_team", "percentage": 50, @@ -24688,11 +24700,6 @@ "type": "equal", "value": "Usage" }, - { - "dimension": "chargeCategory", - "type": "equal", - "value": "Usage" - }, { "dimension": "chargeCategory", "type": "equal", @@ -24806,7 +24813,7 @@ "ruleName", "ruleId" ], - "example": "subAccountId", + "example": "billingCenterLevel4", "type": "string" }, "minItems": 1, @@ -24900,7 +24907,7 @@ "ruleName", "ruleId" ], - "example": "billingCenterLevel2", + "example": "planName", "type": "string" }, "type": "array" @@ -24929,15 +24936,15 @@ "billedCost": "12450.0000000000", "billingAccountId": "123456789012", "billingAccountName": "Acme Production", - "billingCenterLevel1": "Tenetur velit tenetur adipisci saepe rerum.", - "billingCenterLevel2": "Sunt sint nostrum sunt.", - "billingCenterLevel3": "Veniam dolores commodi officiis vero.", - "billingCenterLevel4": "Dolorum quos dignissimos aut illo dolores voluptates.", - "billingCenterLevel5": "Et qui voluptate aperiam.", - "billingCenterLevel6": "Repudiandae maiores atque accusantium.", - "billingCenterLevel7": "Aspernatur laborum harum neque.", - "billingCenterLevel8": "At sunt consequatur optio dignissimos.", - "billingCenterLevel9": "Accusamus dolor vitae et labore omnis quam.", + "billingCenterLevel1": "Deserunt itaque dolor.", + "billingCenterLevel2": "Officia et tenetur.", + "billingCenterLevel3": "Rerum tenetur velit.", + "billingCenterLevel4": "Adipisci saepe rerum ea sunt.", + "billingCenterLevel5": "Nostrum sunt.", + "billingCenterLevel6": "Veniam dolores commodi officiis vero.", + "billingCenterLevel7": "Dolorum quos dignissimos aut illo dolores voluptates.", + "billingCenterLevel8": "Et qui voluptate aperiam.", + "billingCenterLevel9": "Repudiandae maiores atque accusantium.", "chargeCategory": "Usage", "customer": "2001", "effectiveChange": "1120.0000000000", @@ -24958,44 +24965,15 @@ "billedCost": "12450.0000000000", "billingAccountId": "123456789012", "billingAccountName": "Acme Production", - "billingCenterLevel1": "Tenetur velit tenetur adipisci saepe rerum.", - "billingCenterLevel2": "Sunt sint nostrum sunt.", - "billingCenterLevel3": "Veniam dolores commodi officiis vero.", - "billingCenterLevel4": "Dolorum quos dignissimos aut illo dolores voluptates.", - "billingCenterLevel5": "Et qui voluptate aperiam.", - "billingCenterLevel6": "Repudiandae maiores atque accusantium.", - "billingCenterLevel7": "Aspernatur laborum harum neque.", - "billingCenterLevel8": "At sunt consequatur optio dignissimos.", - "billingCenterLevel9": "Accusamus dolor vitae et labore omnis quam.", - "chargeCategory": "Usage", - "customer": "2001", - "effectiveChange": "1120.0000000000", - "effectiveCost": "11200.0000000000", - "modifiedBilledCost": "13695.0000000000", - "modifiedEffectiveCost": "12320.0000000000", - "planName": "Premium Support", - "ruleId": "7d3f1a2b-4c5e-6789-abcd-ef0123456789", - "ruleName": "Premium Support Upcharge", - "ruleType": "upchargeDiscount", - "serviceCategory": "Compute", - "serviceName": "AmazonEC2", - "subAccountId": "987654321098", - "subAccountName": "acme-prod-us-east" - }, - { - "billedChange": "1245.0000000000", - "billedCost": "12450.0000000000", - "billingAccountId": "123456789012", - "billingAccountName": "Acme Production", - "billingCenterLevel1": "Tenetur velit tenetur adipisci saepe rerum.", - "billingCenterLevel2": "Sunt sint nostrum sunt.", - "billingCenterLevel3": "Veniam dolores commodi officiis vero.", - "billingCenterLevel4": "Dolorum quos dignissimos aut illo dolores voluptates.", - "billingCenterLevel5": "Et qui voluptate aperiam.", - "billingCenterLevel6": "Repudiandae maiores atque accusantium.", - "billingCenterLevel7": "Aspernatur laborum harum neque.", - "billingCenterLevel8": "At sunt consequatur optio dignissimos.", - "billingCenterLevel9": "Accusamus dolor vitae et labore omnis quam.", + "billingCenterLevel1": "Deserunt itaque dolor.", + "billingCenterLevel2": "Officia et tenetur.", + "billingCenterLevel3": "Rerum tenetur velit.", + "billingCenterLevel4": "Adipisci saepe rerum ea sunt.", + "billingCenterLevel5": "Nostrum sunt.", + "billingCenterLevel6": "Veniam dolores commodi officiis vero.", + "billingCenterLevel7": "Dolorum quos dignissimos aut illo dolores voluptates.", + "billingCenterLevel8": "Et qui voluptate aperiam.", + "billingCenterLevel9": "Repudiandae maiores atque accusantium.", "chargeCategory": "Usage", "customer": "2001", "effectiveChange": "1120.0000000000", @@ -25040,15 +25018,15 @@ "billedCost": "12450.0000000000", "billingAccountId": "123456789012", "billingAccountName": "Acme Production", - "billingCenterLevel1": "Ab est.", - "billingCenterLevel2": "Ab natus.", - "billingCenterLevel3": "Amet expedita inventore laboriosam voluptates quisquam quam.", - "billingCenterLevel4": "Amet sed exercitationem hic ut.", - "billingCenterLevel5": "Unde tenetur atque modi quis et.", - "billingCenterLevel6": "Ratione aut qui voluptas id assumenda modi.", - "billingCenterLevel7": "Nemo incidunt et.", - "billingCenterLevel8": "Iusto quia doloribus cumque distinctio vel.", - "billingCenterLevel9": "Nihil omnis.", + "billingCenterLevel1": "Neque nisi totam.", + "billingCenterLevel2": "Aut quod explicabo voluptates ut.", + "billingCenterLevel3": "Autem quia consequatur qui.", + "billingCenterLevel4": "Quia labore vitae ullam qui aut qui.", + "billingCenterLevel5": "Distinctio omnis.", + "billingCenterLevel6": "Corrupti iure.", + "billingCenterLevel7": "Saepe voluptas.", + "billingCenterLevel8": "Deserunt autem autem.", + "billingCenterLevel9": "Tenetur qui quas deserunt.", "chargeCategory": "Usage", "customer": "2001", "effectiveChange": "1120.0000000000", @@ -25087,47 +25065,47 @@ }, "billingCenterLevel1": { "description": "Billing center level 1 name", - "example": "Voluptatum sit iusto illum facilis vel velit.", + "example": "Minima maxime.", "type": "string" }, "billingCenterLevel2": { "description": "Billing center level 2 name", - "example": "Ut quos error vitae est perferendis corrupti.", + "example": "Sint ut sunt officiis perspiciatis porro et.", "type": "string" }, "billingCenterLevel3": { "description": "Billing center level 3 name", - "example": "Ut ad voluptatum libero ullam dolor.", + "example": "Aut iusto eligendi ullam quia quo aut.", "type": "string" }, "billingCenterLevel4": { "description": "Billing center level 4 name", - "example": "Cumque ex tenetur hic sed sequi.", + "example": "Nemo quo porro aut.", "type": "string" }, "billingCenterLevel5": { "description": "Billing center level 5 name", - "example": "Ipsa repellat in ratione illo dolores voluptatem.", + "example": "Nemo illum inventore laborum minima vel molestiae.", "type": "string" }, "billingCenterLevel6": { "description": "Billing center level 6 name", - "example": "Consequatur aut nulla fugit.", + "example": "Omnis veniam ullam.", "type": "string" }, "billingCenterLevel7": { "description": "Billing center level 7 name", - "example": "Voluptatem beatae qui consequatur fugit.", + "example": "Nihil et.", "type": "string" }, "billingCenterLevel8": { "description": "Billing center level 8 name", - "example": "Quae ad blanditiis.", + "example": "Reiciendis repellat nam.", "type": "string" }, "billingCenterLevel9": { "description": "Billing center level 9 name", - "example": "Veritatis atque autem rerum qui culpa assumenda.", + "example": "Recusandae ratione ut harum.", "type": "string" }, "chargeCategory": { @@ -25203,6 +25181,31 @@ }, "type": "object" }, + "FinopsBilling_AutomatedEdpProfile": { + "description": "Automated AWS EDP configuration for one bill source.", + "example": { + "billSource": "aws-123456789012", + "enabled": true + }, + "properties": { + "billSource": { + "description": "The AWS bill source to which this profile applies.", + "example": "aws-123456789012", + "pattern": "^aws-[0-9]{12}$", + "type": "string" + }, + "enabled": { + "description": "Whether Automated EDP normalization is enabled for this bill source.", + "example": true, + "type": "boolean" + } + }, + "required": [ + "billSource", + "enabled" + ], + "type": "object" + }, "FinopsBilling_BillingInvoiceCollection": { "example": [ { @@ -25210,97 +25213,21 @@ "expiresAt": "1998-01-25T06:34:45Z", "url": "Sed aut ducimus quam nostrum autem." }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", - "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", - "dimensions": [ - "Quam est.", - "Rem ut laboriosam." - ], - "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", - "exportType": "pdf", - "failure": { - "code": "Animi eos maiores commodi rem.", - "message": "Libero fuga a et debitis eum similique." - }, - "filter": { - "dimension": "Est enim.", - "expressions": [ - {}, - {}, - {}, - {} - ], - "substring": "Laboriosam molestiae unde totam.", - "type": "equal", - "value": "Eos facere et eum voluptas." - }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", - "isCreateTemplate": false, - "issueDate": "2000-03-18", - "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", - "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", - "template": { - "costMetric": "billedCost", - "dimensions": [ - "service", - "account", - "region" - ], - "displayLogoWithinPdf": true, - "exportType": "pdf", - "filter": { - "dimension": "Est enim.", - "expressions": [ - {}, - {}, - {}, - {} - ], - "substring": "Laboriosam molestiae unde totam.", - "type": "equal", - "value": "Eos facere et eum voluptas." - }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", - "periodType": "chargePeriod", - "templateName": "Standard MSP Invoice" - }, - "updatedAt": "1980-07-23T09:12:32Z" - }, - { - "artifact": { - "expiresAt": "1998-01-25T06:34:45Z", - "url": "Sed aut ducimus quam nostrum autem." - }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", + "attempts": 7804933891257193000, + "billMonth": "Hassie Conroy", + "costMetric": "Consequuntur qui ut autem id id.", + "createdAt": "2012-06-21T13:57:22Z", "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", + "customerBillingPlan": "Minus tenetur.", + "customerId": 2044415428982120400, + "customerName": "Praesentium odit aut dolor dolore.", "dimensions": [ - "Quam est.", - "Rem ut laboriosam." + "Sit cupiditate.", + "Officia id possimus tempore est fugiat autem." ], "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", + "dueDate": "1988-03-08", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -25318,19 +25245,20 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", + "filterCount": 7846683563542437000, + "freeText": "Est omnis rem ut.", + "groupByCount": 17277475273953827000, + "id": "Provident consectetur.", + "invoiceAmount": "Consequuntur ut non recusandae autem quo est.", + "invoiceNumber": "INV-000042", + "invoiceTemplateId": "Molestias adipisci fugiat non in est qui.", "isCreateTemplate": false, - "issueDate": "2000-03-18", + "issueDate": "1986-05-17", "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", + "logo": "Est ipsam.", "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", + "periodType": "billingPeriod", + "status": "Et et.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -25339,6 +25267,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -25352,32 +25281,33 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", + "freeText": "Magnam repellat autem accusamus repudiandae.", + "logo": "Aperiam commodi labore eum dolor laboriosam omnis.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1980-07-23T09:12:32Z" + "updatedAt": "1999-01-06T04:25:37Z" }, { "artifact": { "expiresAt": "1998-01-25T06:34:45Z", "url": "Sed aut ducimus quam nostrum autem." }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", + "attempts": 7804933891257193000, + "billMonth": "Hassie Conroy", + "costMetric": "Consequuntur qui ut autem id id.", + "createdAt": "2012-06-21T13:57:22Z", "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", + "customerBillingPlan": "Minus tenetur.", + "customerId": 2044415428982120400, + "customerName": "Praesentium odit aut dolor dolore.", "dimensions": [ - "Quam est.", - "Rem ut laboriosam." + "Sit cupiditate.", + "Officia id possimus tempore est fugiat autem." ], "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", + "dueDate": "1988-03-08", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -25395,19 +25325,20 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", + "filterCount": 7846683563542437000, + "freeText": "Est omnis rem ut.", + "groupByCount": 17277475273953827000, + "id": "Provident consectetur.", + "invoiceAmount": "Consequuntur ut non recusandae autem quo est.", + "invoiceNumber": "INV-000042", + "invoiceTemplateId": "Molestias adipisci fugiat non in est qui.", "isCreateTemplate": false, - "issueDate": "2000-03-18", + "issueDate": "1986-05-17", "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", + "logo": "Est ipsam.", "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", + "periodType": "billingPeriod", + "status": "Et et.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -25416,6 +25347,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -25429,32 +25361,33 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", + "freeText": "Magnam repellat autem accusamus repudiandae.", + "logo": "Aperiam commodi labore eum dolor laboriosam omnis.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1980-07-23T09:12:32Z" + "updatedAt": "1999-01-06T04:25:37Z" }, { "artifact": { "expiresAt": "1998-01-25T06:34:45Z", "url": "Sed aut ducimus quam nostrum autem." }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", + "attempts": 7804933891257193000, + "billMonth": "Hassie Conroy", + "costMetric": "Consequuntur qui ut autem id id.", + "createdAt": "2012-06-21T13:57:22Z", "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", + "customerBillingPlan": "Minus tenetur.", + "customerId": 2044415428982120400, + "customerName": "Praesentium odit aut dolor dolore.", "dimensions": [ - "Quam est.", - "Rem ut laboriosam." + "Sit cupiditate.", + "Officia id possimus tempore est fugiat autem." ], "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", + "dueDate": "1988-03-08", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -25472,19 +25405,20 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", + "filterCount": 7846683563542437000, + "freeText": "Est omnis rem ut.", + "groupByCount": 17277475273953827000, + "id": "Provident consectetur.", + "invoiceAmount": "Consequuntur ut non recusandae autem quo est.", + "invoiceNumber": "INV-000042", + "invoiceTemplateId": "Molestias adipisci fugiat non in est qui.", "isCreateTemplate": false, - "issueDate": "2000-03-18", + "issueDate": "1986-05-17", "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", + "logo": "Est ipsam.", "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", + "periodType": "billingPeriod", + "status": "Et et.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -25493,6 +25427,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -25506,12 +25441,12 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", + "freeText": "Magnam repellat autem accusamus repudiandae.", + "logo": "Aperiam commodi labore eum dolor laboriosam omnis.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1980-07-23T09:12:32Z" + "updatedAt": "1999-01-06T04:25:37Z" } ], "items": { @@ -25522,24 +25457,32 @@ "FinopsBilling_BillingInvoiceCustomer": { "description": "Customer recipient for invoice export creation.", "example": { - "customerBillingPlan": "Recusandae fuga quo id asperiores.", - "customerId": 3674186079809150000, - "customerName": "Iste quos." + "customerBillingPlan": "Quia hic facere porro maiores.", + "customerId": 3799256290115060000, + "customerName": "Rem voluptatem possimus vitae.", + "invoiceNumber": "u8f" }, "properties": { "customerBillingPlan": { "description": "Billing plan for the customer", - "example": "Error possimus sequi cumque id assumenda ducimus.", + "example": "Iure et.", "type": "string" }, "customerId": { "description": "Customer identifier", - "example": 638208202236157700, + "example": 6578906853776045000, "type": "integer" }, "customerName": { "description": "Customer display name", - "example": "Molestias voluptatibus voluptatum.", + "example": "Et commodi sequi enim sed.", + "type": "string" + }, + "invoiceNumber": { + "description": "Optional invoice number (Invoice ID) for this customer's invoice. Immutable after creation. Duplicates are allowed. An empty string means absent.", + "example": "yh1", + "maxLength": 20, + "pattern": "^[A-Za-z0-9_-]*$", "type": "string" } }, @@ -25552,18 +25495,18 @@ "FinopsBilling_BillingInvoiceDeliveryFailure": { "description": "Email delivery failure details for an invoice.", "example": { - "code": "Totam est aut quod explicabo voluptates.", - "message": "Quis autem." + "code": "Nulla libero et doloribus earum quia.", + "message": "Vel labore occaecati quia." }, "properties": { "code": { "description": "Failure code", - "example": "Nam fuga recusandae ratione.", + "example": "Voluptatum neque tenetur illo.", "type": "string" }, "message": { "description": "Failure message", - "example": "Harum eos neque.", + "example": "Aperiam animi ullam consequatur reprehenderit.", "type": "string" } }, @@ -25572,19 +25515,19 @@ "FinopsBilling_BillingInvoiceExportArtifact": { "description": "Download artifact details for an invoice export.", "example": { - "expiresAt": "1983-09-03T06:51:38Z", - "url": "Fugit provident et officia sit maiores consequatur." + "expiresAt": "1975-07-13T14:10:52Z", + "url": "Rerum enim ipsa in impedit occaecati." }, "properties": { "expiresAt": { "description": "Artifact expiration timestamp", - "example": "1972-07-14T22:57:50Z", + "example": "1974-02-12T12:31:24Z", "format": "date-time", "type": "string" }, "url": { "description": "Pre-signed download URL", - "example": "Mollitia sit aut.", + "example": "Nostrum beatae.", "type": "string" } }, @@ -25623,30 +25566,31 @@ "FinopsBilling_BillingInvoiceList": { "example": { "kind": "finops:invoice-list", - "limit": 12406817798833093000, + "limit": 14054180324872778000, "nextPage": "/finops-billing/v1/orgs/100/invoices?skipToken=19u2349", "prevPage": "/finops-billing/v1/orgs/100/invoices?skipToken=8b1750u", - "total": 15481226037131230000, + "total": 3680050075942609400, "values": [ { "artifact": { "expiresAt": "1998-01-25T06:34:45Z", "url": "Sed aut ducimus quam nostrum autem." }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", + "attempts": 7804933891257193000, + "billMonth": "Hassie Conroy", + "costMetric": "Consequuntur qui ut autem id id.", + "createdAt": "2012-06-21T13:57:22Z", "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", + "customerBillingPlan": "Minus tenetur.", + "customerId": 2044415428982120400, + "customerName": "Praesentium odit aut dolor dolore.", "dimensions": [ - "Quam est.", - "Rem ut laboriosam." + "Sit cupiditate.", + "Officia id possimus tempore est fugiat autem." ], "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", + "dueDate": "1988-03-08", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -25664,96 +25608,20 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", + "filterCount": 7846683563542437000, + "freeText": "Est omnis rem ut.", + "groupByCount": 17277475273953827000, + "id": "Provident consectetur.", + "invoiceAmount": "Consequuntur ut non recusandae autem quo est.", + "invoiceNumber": "INV-000042", + "invoiceTemplateId": "Molestias adipisci fugiat non in est qui.", "isCreateTemplate": false, - "issueDate": "2000-03-18", + "issueDate": "1986-05-17", "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", + "logo": "Est ipsam.", "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", - "template": { - "costMetric": "billedCost", - "dimensions": [ - "service", - "account", - "region" - ], - "displayLogoWithinPdf": true, - "exportType": "pdf", - "filter": { - "dimension": "Est enim.", - "expressions": [ - {}, - {}, - {}, - {} - ], - "substring": "Laboriosam molestiae unde totam.", - "type": "equal", - "value": "Eos facere et eum voluptas." - }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", - "periodType": "chargePeriod", - "templateName": "Standard MSP Invoice" - }, - "updatedAt": "1980-07-23T09:12:32Z" - }, - { - "artifact": { - "expiresAt": "1998-01-25T06:34:45Z", - "url": "Sed aut ducimus quam nostrum autem." - }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", - "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", - "dimensions": [ - "Quam est.", - "Rem ut laboriosam." - ], - "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", - "exportType": "pdf", - "failure": { - "code": "Animi eos maiores commodi rem.", - "message": "Libero fuga a et debitis eum similique." - }, - "filter": { - "dimension": "Est enim.", - "expressions": [ - {}, - {}, - {}, - {} - ], - "substring": "Laboriosam molestiae unde totam.", - "type": "equal", - "value": "Eos facere et eum voluptas." - }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", - "isCreateTemplate": false, - "issueDate": "2000-03-18", - "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", - "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", + "periodType": "billingPeriod", + "status": "Et et.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -25762,6 +25630,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -25775,32 +25644,33 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", + "freeText": "Magnam repellat autem accusamus repudiandae.", + "logo": "Aperiam commodi labore eum dolor laboriosam omnis.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1980-07-23T09:12:32Z" + "updatedAt": "1999-01-06T04:25:37Z" }, { "artifact": { "expiresAt": "1998-01-25T06:34:45Z", "url": "Sed aut ducimus quam nostrum autem." }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", + "attempts": 7804933891257193000, + "billMonth": "Hassie Conroy", + "costMetric": "Consequuntur qui ut autem id id.", + "createdAt": "2012-06-21T13:57:22Z", "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", + "customerBillingPlan": "Minus tenetur.", + "customerId": 2044415428982120400, + "customerName": "Praesentium odit aut dolor dolore.", "dimensions": [ - "Quam est.", - "Rem ut laboriosam." + "Sit cupiditate.", + "Officia id possimus tempore est fugiat autem." ], "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", + "dueDate": "1988-03-08", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -25818,19 +25688,20 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", + "filterCount": 7846683563542437000, + "freeText": "Est omnis rem ut.", + "groupByCount": 17277475273953827000, + "id": "Provident consectetur.", + "invoiceAmount": "Consequuntur ut non recusandae autem quo est.", + "invoiceNumber": "INV-000042", + "invoiceTemplateId": "Molestias adipisci fugiat non in est qui.", "isCreateTemplate": false, - "issueDate": "2000-03-18", + "issueDate": "1986-05-17", "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", + "logo": "Est ipsam.", "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", + "periodType": "billingPeriod", + "status": "Et et.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -25839,6 +25710,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -25852,32 +25724,33 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", + "freeText": "Magnam repellat autem accusamus repudiandae.", + "logo": "Aperiam commodi labore eum dolor laboriosam omnis.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1980-07-23T09:12:32Z" + "updatedAt": "1999-01-06T04:25:37Z" }, { "artifact": { "expiresAt": "1998-01-25T06:34:45Z", "url": "Sed aut ducimus quam nostrum autem." }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", + "attempts": 7804933891257193000, + "billMonth": "Hassie Conroy", + "costMetric": "Consequuntur qui ut autem id id.", + "createdAt": "2012-06-21T13:57:22Z", "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", + "customerBillingPlan": "Minus tenetur.", + "customerId": 2044415428982120400, + "customerName": "Praesentium odit aut dolor dolore.", "dimensions": [ - "Quam est.", - "Rem ut laboriosam." + "Sit cupiditate.", + "Officia id possimus tempore est fugiat autem." ], "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", + "dueDate": "1988-03-08", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -25895,19 +25768,20 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", + "filterCount": 7846683563542437000, + "freeText": "Est omnis rem ut.", + "groupByCount": 17277475273953827000, + "id": "Provident consectetur.", + "invoiceAmount": "Consequuntur ut non recusandae autem quo est.", + "invoiceNumber": "INV-000042", + "invoiceTemplateId": "Molestias adipisci fugiat non in est qui.", "isCreateTemplate": false, - "issueDate": "2000-03-18", + "issueDate": "1986-05-17", "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", + "logo": "Est ipsam.", "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", + "periodType": "billingPeriod", + "status": "Et et.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -25916,6 +25790,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -25929,12 +25804,12 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", + "freeText": "Magnam repellat autem accusamus repudiandae.", + "logo": "Aperiam commodi labore eum dolor laboriosam omnis.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1980-07-23T09:12:32Z" + "updatedAt": "1999-01-06T04:25:37Z" } ] }, @@ -25949,7 +25824,7 @@ }, "limit": { "description": "Page size that was requested.", - "example": 4426651813883429400, + "example": 6199611403200892000, "type": "integer" }, "nextPage": { @@ -25966,7 +25841,7 @@ }, "total": { "description": "Total number of items matching the current filter.", - "example": 2247663904455274800, + "example": 15119379952234693000, "type": "integer" }, "values": { @@ -26120,6 +25995,11 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "000001", + "invoiceNumberLastUsed": "000041", + "invoiceNumberNext": "000042", + "invoiceNumberPrefix": "INV-", + "invoiceNumberingEnabled": true, "invoiceTemplateId": "tmpl_9001", "kind": "finops:invoice-schedule", "nextInvoiceDate": "2026-09-05", @@ -26142,6 +26022,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -26243,6 +26124,11 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "000001", + "invoiceNumberLastUsed": "000041", + "invoiceNumberNext": "000042", + "invoiceNumberPrefix": "INV-", + "invoiceNumberingEnabled": true, "invoiceTemplateId": "tmpl_9001", "kind": "finops:invoice-schedule", "nextInvoiceDate": "2026-09-05", @@ -26265,6 +26151,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -26366,6 +26253,11 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "000001", + "invoiceNumberLastUsed": "000041", + "invoiceNumberNext": "000042", + "invoiceNumberPrefix": "INV-", + "invoiceNumberingEnabled": true, "invoiceTemplateId": "tmpl_9001", "kind": "finops:invoice-schedule", "nextInvoiceDate": "2026-09-05", @@ -26388,6 +26280,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -26422,6 +26315,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -26448,6 +26351,11 @@ "recipients": { "description": "Addresses this customer's invoices are delivered to (at least one).", "example": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -26476,7 +26384,7 @@ "url": "Sed aut ducimus quam nostrum autem." }, "attempts": 7061015994191929000, - "billMonth": "Brooklyn O'Reilly", + "billMonth": "Louvenia Hahn", "costMetric": "Laborum est eos inventore et nulla.", "createdAt": "1975-02-26T00:30:15Z", "currency": "USD", @@ -26494,6 +26402,7 @@ ], "displayLogoWithinPdf": true, "dueDate": "1977-12-07", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -26516,6 +26425,7 @@ "groupByCount": 3516928715182697000, "id": "Corrupti quo ipsam temporibus possimus dolorum.", "invoiceAmount": "Animi rem laboriosam.", + "invoiceNumber": "INV-000042", "issueDate": "1983-09-09", "kind": "finops:invoice-schedule-invoice", "logo": "Dolorem ab ut dolores ab id.", @@ -26532,63 +26442,7 @@ "url": "Sed aut ducimus quam nostrum autem." }, "attempts": 7061015994191929000, - "billMonth": "Brooklyn O'Reilly", - "costMetric": "Laborum est eos inventore et nulla.", - "createdAt": "1975-02-26T00:30:15Z", - "currency": "USD", - "customerBillingPlan": "Quis et.", - "customerId": 1942236292504414200, - "customerName": "Iste molestiae impedit modi provident ut nam.", - "deliveryFailure": { - "code": "Quia veniam.", - "message": "Minima in quisquam." - }, - "deliveryStatus": "failed", - "dimensions": [ - "Odio voluptas animi id fugiat velit rerum.", - "Sint quo aut et est." - ], - "displayLogoWithinPdf": true, - "dueDate": "1977-12-07", - "exportType": "pdf", - "failure": { - "code": "Animi eos maiores commodi rem.", - "message": "Libero fuga a et debitis eum similique." - }, - "filter": { - "dimension": "Est enim.", - "expressions": [ - {}, - {}, - {}, - {} - ], - "substring": "Laboriosam molestiae unde totam.", - "type": "equal", - "value": "Eos facere et eum voluptas." - }, - "filterCount": 10727152461447535000, - "freeText": "Quia eos enim.", - "groupByCount": 3516928715182697000, - "id": "Corrupti quo ipsam temporibus possimus dolorum.", - "invoiceAmount": "Animi rem laboriosam.", - "issueDate": "1983-09-09", - "kind": "finops:invoice-schedule-invoice", - "logo": "Dolorem ab ut dolores ab id.", - "messageId": "Deserunt architecto quo eaque perferendis velit sed.", - "orgId": 100, - "periodType": "billingPeriod", - "scheduleId": "Sequi cum reprehenderit beatae hic.", - "status": "Magni quo voluptatibus.", - "updatedAt": "1982-06-22T13:47:54Z" - }, - { - "artifact": { - "expiresAt": "1998-01-25T06:34:45Z", - "url": "Sed aut ducimus quam nostrum autem." - }, - "attempts": 7061015994191929000, - "billMonth": "Brooklyn O'Reilly", + "billMonth": "Louvenia Hahn", "costMetric": "Laborum est eos inventore et nulla.", "createdAt": "1975-02-26T00:30:15Z", "currency": "USD", @@ -26606,6 +26460,7 @@ ], "displayLogoWithinPdf": true, "dueDate": "1977-12-07", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -26628,6 +26483,7 @@ "groupByCount": 3516928715182697000, "id": "Corrupti quo ipsam temporibus possimus dolorum.", "invoiceAmount": "Animi rem laboriosam.", + "invoiceNumber": "INV-000042", "issueDate": "1983-09-09", "kind": "finops:invoice-schedule-invoice", "logo": "Dolorem ab ut dolores ab id.", @@ -26647,10 +26503,10 @@ "FinopsBilling_BillingInvoiceScheduleInvoiceList": { "example": { "kind": "finops:invoice-schedule-invoice-list", - "limit": 9016326765234816000, + "limit": 4921515517014305000, "nextPage": "/finops-billing/v1/orgs/100/invoice-schedules/sch_1/invoices?skipToken=19u2349", "prevPage": "/finops-billing/v1/orgs/100/invoice-schedules/sch_1/invoices?skipToken=8b1750u", - "total": 8373538356291928000, + "total": 9099939303600172000, "values": [ { "artifact": { @@ -26658,7 +26514,7 @@ "url": "Sed aut ducimus quam nostrum autem." }, "attempts": 7061015994191929000, - "billMonth": "Brooklyn O'Reilly", + "billMonth": "Louvenia Hahn", "costMetric": "Laborum est eos inventore et nulla.", "createdAt": "1975-02-26T00:30:15Z", "currency": "USD", @@ -26676,6 +26532,7 @@ ], "displayLogoWithinPdf": true, "dueDate": "1977-12-07", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -26698,6 +26555,7 @@ "groupByCount": 3516928715182697000, "id": "Corrupti quo ipsam temporibus possimus dolorum.", "invoiceAmount": "Animi rem laboriosam.", + "invoiceNumber": "INV-000042", "issueDate": "1983-09-09", "kind": "finops:invoice-schedule-invoice", "logo": "Dolorem ab ut dolores ab id.", @@ -26714,7 +26572,7 @@ "url": "Sed aut ducimus quam nostrum autem." }, "attempts": 7061015994191929000, - "billMonth": "Brooklyn O'Reilly", + "billMonth": "Louvenia Hahn", "costMetric": "Laborum est eos inventore et nulla.", "createdAt": "1975-02-26T00:30:15Z", "currency": "USD", @@ -26732,6 +26590,7 @@ ], "displayLogoWithinPdf": true, "dueDate": "1977-12-07", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -26754,6 +26613,7 @@ "groupByCount": 3516928715182697000, "id": "Corrupti quo ipsam temporibus possimus dolorum.", "invoiceAmount": "Animi rem laboriosam.", + "invoiceNumber": "INV-000042", "issueDate": "1983-09-09", "kind": "finops:invoice-schedule-invoice", "logo": "Dolorem ab ut dolores ab id.", @@ -26777,7 +26637,7 @@ }, "limit": { "description": "Page size that was requested.", - "example": 16187368872132504000, + "example": 12865743348027552000, "type": "integer" }, "nextPage": { @@ -26794,7 +26654,7 @@ }, "total": { "description": "Total number of matching items.", - "example": 12639085553820780000, + "example": 7713202845823713000, "type": "integer" }, "values": { @@ -26810,10 +26670,10 @@ "FinopsBilling_BillingInvoiceScheduleList": { "example": { "kind": "finops:invoice-schedule-list", - "limit": 7609749600815312000, + "limit": 627391454889232300, "nextPage": "/finops-billing/v1/orgs/100/invoice-schedules?skipToken=19u2349", "prevPage": "/finops-billing/v1/orgs/100/invoice-schedules?skipToken=8b1750u", - "total": 13340065833219270000, + "total": 16571417877251262000, "values": [ { "createdAt": "2001-07-21T04:41:33Z", @@ -26895,6 +26755,11 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "000001", + "invoiceNumberLastUsed": "000041", + "invoiceNumberNext": "000042", + "invoiceNumberPrefix": "INV-", + "invoiceNumberingEnabled": true, "invoiceTemplateId": "tmpl_9001", "kind": "finops:invoice-schedule", "nextInvoiceDate": "2026-09-05", @@ -26917,6 +26782,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -27018,6 +26884,11 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "000001", + "invoiceNumberLastUsed": "000041", + "invoiceNumberNext": "000042", + "invoiceNumberPrefix": "INV-", + "invoiceNumberingEnabled": true, "invoiceTemplateId": "tmpl_9001", "kind": "finops:invoice-schedule", "nextInvoiceDate": "2026-09-05", @@ -27040,6 +26911,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -27074,7 +26946,7 @@ }, "limit": { "description": "Page size that was requested.", - "example": 443571745271756350, + "example": 6278734159510877000, "type": "integer" }, "nextPage": { @@ -27091,7 +26963,7 @@ }, "total": { "description": "Total number of items matching the current filter.", - "example": 3073188806273719000, + "example": 15904108366153870000, "type": "integer" }, "values": { @@ -27138,7 +27010,7 @@ }, "FinopsBilling_BillingInvoiceScheduleResult": { "example": { - "createdAt": "1993-02-25T02:48:27Z", + "createdAt": "1987-04-15T07:14:34Z", "createdBy": 123, "customers": [ { @@ -27150,26 +27022,12 @@ "email": "david.jones@example.com", "firstName": "David", "lastName": "Jones" - } - ] - }, - { - "customerBillingPlan": "gold", - "customerId": 53125, - "customerName": "MSP Child Org - 52674", - "recipients": [ + }, { "email": "david.jones@example.com", "firstName": "David", "lastName": "Jones" - } - ] - }, - { - "customerBillingPlan": "gold", - "customerId": 53125, - "customerName": "MSP Child Org - 52674", - "recipients": [ + }, { "email": "david.jones@example.com", "firstName": "David", @@ -27182,6 +27040,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -27199,6 +27067,11 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "wzm", + "invoiceNumberLastUsed": "000041", + "invoiceNumberNext": "000042", + "invoiceNumberPrefix": "qk9", + "invoiceNumberingEnabled": true, "invoiceTemplateId": "tmpl_9001", "kind": "finops:invoice-schedule", "nextInvoiceDate": "2026-09-05", @@ -27221,29 +27094,31 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, - "freeText": "Quidem voluptatem aut omnis sint quia.", - "logo": "Unde et est sed.", + "freeText": "Porro quidem voluptatem aut.", + "logo": "Perspiciatis nemo molestiae quasi unde et est.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "2015-03-13T22:37:03Z", + "updatedAt": "2014-05-24T07:06:37Z", "updatedBy": 456 }, "properties": { "createdAt": { "description": "ISO-8601 creation timestamp", - "example": "2012-09-13T09:17:13Z", + "example": "1996-06-23T05:39:55Z", "format": "date-time", "type": "string" }, @@ -27260,6 +27135,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -27272,6 +27157,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -27284,6 +27179,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -27308,6 +27213,37 @@ "invoiceIssueDateRule": { "$ref": "#/components/schemas/FinopsBilling_BillingInvoiceIssueDateRule" }, + "invoiceNumberBase": { + "description": "First sequence number of the schedule's numbering. Absent when numbering is disabled.", + "example": "edj", + "maxLength": 9, + "pattern": "^0*[1-9][0-9]*$", + "type": "string" + }, + "invoiceNumberLastUsed": { + "description": "Sequence number most recently allocated by the schedule. Absent until the first allocation. The counter is retained when the schedule is soft-deleted, and re-adding numbering continues from last used + 1.", + "example": "000041", + "pattern": "^[0-9]{1,9}$", + "type": "string" + }, + "invoiceNumberNext": { + "description": "Sequence number the next generated invoice will receive. Absent when numbering is disabled.", + "example": "000042", + "pattern": "^[0-9]{1,9}$", + "type": "string" + }, + "invoiceNumberPrefix": { + "description": "Prefix placed before the sequence number. Empty or absent when there is no prefix.", + "example": "4nf", + "maxLength": 20, + "pattern": "^[A-Za-z0-9_-]*$", + "type": "string" + }, + "invoiceNumberingEnabled": { + "description": "Whether the schedule numbers the invoices it generates.", + "example": true, + "type": "boolean" + }, "invoiceTemplateId": { "description": "Identifier of the invoice template shared by every customer on this schedule. Absent when the schedule was created without a template.", "example": "tmpl_9001", @@ -27356,7 +27292,7 @@ }, "updatedAt": { "description": "ISO-8601 last-update timestamp", - "example": "1975-12-09T10:55:47Z", + "example": "1975-01-08T16:10:26Z", "format": "date-time", "type": "string" }, @@ -27392,19 +27328,21 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, - "freeText": "Laborum nihil enim quam sint est.", - "logo": "Unde commodi recusandae et voluptas.", + "freeText": "Odit earum pariatur possimus quisquam.", + "logo": "Quo soluta.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, @@ -27428,7 +27366,7 @@ "region" ], "items": { - "example": "Et tenetur.", + "example": "Amet quasi sit totam.", "type": "string" }, "maxItems": 10, @@ -27439,6 +27377,15 @@ "example": true, "type": "boolean" }, + "exportLayout": { + "description": "PDF layout format. Exact lowercase flatten or nested; omitted PDF exports default to flatten. Must be omitted for CSV exports.", + "enum": [ + "flatten", + "nested" + ], + "example": "flatten", + "type": "string" + }, "exportType": { "description": "Invoice export type.", "enum": [ @@ -27453,12 +27400,12 @@ }, "freeText": { "description": "Optional free-text company/address block.", - "example": "Quia sit voluptates.", + "example": "Consequatur voluptas accusantium non ullam et vel.", "type": "string" }, "logo": { "description": "Optional logo payload. Ignored when exportType=csv.", - "example": "Non molestiae molestias.", + "example": "Voluptatem veniam provident explicabo sint.", "type": "string" }, "periodType": { @@ -27503,6 +27450,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -27544,88 +27492,7 @@ "region" ], "displayLogoWithinPdf": true, - "exportType": "pdf", - "filter": { - "dimension": "Est enim.", - "expressions": [ - {}, - {}, - {}, - {} - ], - "substring": "Laboriosam molestiae unde totam.", - "type": "equal", - "value": "Eos facere et eum voluptas." - }, - "filterCount": 5390635163922885000, - "freeText": "Pariatur delectus doloremque ex mollitia ad neque.", - "groupByCount": 9911411258810075000, - "id": "tmpl_9001", - "kind": "finops:invoice-template", - "logo": "Et quasi.", - "nextInvoiceDate": "2004-09-16", - "orgId": 100, - "periodType": "chargePeriod", - "templateName": "Standard MSP Invoice", - "updatedAt": "1970-02-01T12:31:12Z", - "updatedBy": 456 - }, - { - "activeScheduleCount": 1944694627890364200, - "activeScheduleIds": [ - "Repudiandae laboriosam libero ipsam dolores minima.", - "Provident totam dicta eos quia id." - ], - "costMetric": "billedCost", - "createdAt": "1979-08-14T17:58:34Z", - "createdBy": 123, - "dimensions": [ - "service", - "account", - "region" - ], - "displayLogoWithinPdf": true, - "exportType": "pdf", - "filter": { - "dimension": "Est enim.", - "expressions": [ - {}, - {}, - {}, - {} - ], - "substring": "Laboriosam molestiae unde totam.", - "type": "equal", - "value": "Eos facere et eum voluptas." - }, - "filterCount": 5390635163922885000, - "freeText": "Pariatur delectus doloremque ex mollitia ad neque.", - "groupByCount": 9911411258810075000, - "id": "tmpl_9001", - "kind": "finops:invoice-template", - "logo": "Et quasi.", - "nextInvoiceDate": "2004-09-16", - "orgId": 100, - "periodType": "chargePeriod", - "templateName": "Standard MSP Invoice", - "updatedAt": "1970-02-01T12:31:12Z", - "updatedBy": 456 - }, - { - "activeScheduleCount": 1944694627890364200, - "activeScheduleIds": [ - "Repudiandae laboriosam libero ipsam dolores minima.", - "Provident totam dicta eos quia id." - ], - "costMetric": "billedCost", - "createdAt": "1979-08-14T17:58:34Z", - "createdBy": 123, - "dimensions": [ - "service", - "account", - "region" - ], - "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -27661,10 +27528,10 @@ "FinopsBilling_BillingInvoiceTemplateList": { "example": { "kind": "finops:invoice-template-list", - "limit": 2097522650878654700, + "limit": 327549333802351170, "nextPage": "/finops-billing/v1/orgs/100/invoice-templates?skipToken=19u2349", "prevPage": "/finops-billing/v1/orgs/100/invoice-templates?skipToken=8b1750u", - "total": 881122784595561300, + "total": 15924130752122270000, "values": [ { "activeScheduleCount": 1944694627890364200, @@ -27681,6 +27548,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -27722,6 +27590,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -27763,6 +27632,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -27802,7 +27672,7 @@ }, "limit": { "description": "Page size that was requested.", - "example": 2048336703166818000, + "example": 4265503925579703000, "type": "integer" }, "nextPage": { @@ -27819,7 +27689,7 @@ }, "total": { "description": "Total number of items matching the current filter.", - "example": 4539891541662305300, + "example": 15919979363467950000, "type": "integer" }, "values": { @@ -27834,15 +27704,14 @@ }, "FinopsBilling_BillingInvoiceTemplateResult": { "example": { - "activeScheduleCount": 1200509057604357000, + "activeScheduleCount": 5080801233735324000, "activeScheduleIds": [ - "Numquam omnis perspiciatis est facilis.", - "Quibusdam omnis voluptatem quo.", - "Dolorem amet illum eos voluptatum.", - "Dolor suscipit." + "Eos doloribus itaque nihil.", + "Temporibus error et et.", + "Quibusdam autem dolores." ], "costMetric": "billedCost", - "createdAt": "1985-02-25T19:24:33Z", + "createdAt": "1977-09-18T15:59:07Z", "createdBy": 123, "dimensions": [ "service", @@ -27850,47 +27719,47 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, - "filterCount": 8733482968186287000, - "freeText": "Est rerum.", - "groupByCount": 13032126878225644000, + "filterCount": 14416758661809854000, + "freeText": "Excepturi architecto laboriosam animi tempore.", + "groupByCount": 1750680697239480600, "id": "tmpl_9001", "kind": "finops:invoice-template", - "logo": "Et optio et possimus aut consequatur voluptas.", - "nextInvoiceDate": "2012-09-24", + "logo": "Iusto et earum aut sunt cumque quibusdam.", + "nextInvoiceDate": "1991-11-17", "orgId": 100, "periodType": "chargePeriod", "templateName": "Standard MSP Invoice", - "updatedAt": "2015-04-13T23:55:35Z", + "updatedAt": "2011-07-27T06:07:38Z", "updatedBy": 456 }, "properties": { "activeScheduleCount": { "description": "Count of invoice schedules with status:active that currently reference this template.", - "example": 4894927628710066000, + "example": 6833623912516017000, "minimum": 0, "type": "integer" }, "activeScheduleIds": { "description": "IDs of invoice schedules with status:active that currently reference this template.", "example": [ - "Quaerat debitis.", - "Ut et.", - "Voluptatem et in et quia quibusdam quia.", - "Non corrupti." + "Ut aliquid incidunt.", + "Omnis quasi quam." ], "items": { - "example": "Consequatur pariatur.", + "example": "Sit rem.", "type": "string" }, "type": "array" @@ -27908,7 +27777,7 @@ }, "createdAt": { "description": "ISO-8601 creation timestamp", - "example": "2007-03-31T19:57:32Z", + "example": "1989-09-28T11:31:16Z", "format": "date-time", "type": "string" }, @@ -27925,7 +27794,7 @@ "region" ], "items": { - "example": "Accusamus ratione tenetur.", + "example": "Maxime labore.", "type": "string" }, "maxItems": 10, @@ -27936,6 +27805,15 @@ "example": true, "type": "boolean" }, + "exportLayout": { + "description": "PDF layout format. Exact lowercase flatten or nested; omitted PDF exports default to flatten. Must be omitted for CSV exports.", + "enum": [ + "flatten", + "nested" + ], + "example": "flatten", + "type": "string" + }, "exportType": { "description": "Invoice export type", "enum": [ @@ -27950,18 +27828,18 @@ }, "filterCount": { "description": "Number of filter expressions", - "example": 1353414371406557000, + "example": 14104089954357594000, "minimum": 0, "type": "integer" }, "freeText": { "description": "Optional free-text company/address block rendered in the invoice.", - "example": "Voluptatibus illum eum vel qui quibusdam debitis.", + "example": "Quisquam fugiat qui.", "type": "string" }, "groupByCount": { "description": "Number of group-by dimensions", - "example": 13720499502086617000, + "example": 13897232662815455000, "minimum": 0, "type": "integer" }, @@ -27980,12 +27858,12 @@ }, "logo": { "description": "Optional logo payload stored with the template.", - "example": "Iusto optio excepturi corporis.", + "example": "Nihil minima non.", "type": "string" }, "nextInvoiceDate": { "description": "Optional next invoice date", - "example": "2001-09-01", + "example": "2010-09-07", "format": "date", "type": "string" }, @@ -28013,7 +27891,7 @@ }, "updatedAt": { "description": "ISO-8601 last-update timestamp", - "example": "2001-07-03T14:09:00Z", + "example": "2003-12-16T10:34:10Z", "format": "date-time", "type": "string" }, @@ -28289,6 +28167,16 @@ "subAccountId": "777037404548", "subAccountName": "acme-prod-us-east" }, + { + "amount": "100.00", + "billingAccountId": "111222333", + "billingAccountName": "acme-prod-us-east", + "creditType": "EdpDiscount", + "customerId": 2001, + "description": "Enterprise Discount Program Discount for AmazonVPC", + "subAccountId": "777037404548", + "subAccountName": "acme-prod-us-east" + }, { "amount": "100.00", "billingAccountId": "111222333", @@ -28665,6 +28553,18 @@ "firstName": "David", "lastName": "Jones" }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + } + ] + }, + { + "customerBillingPlan": "gold", + "customerId": 53125, + "customerName": "MSP Child Org - 52674", + "recipients": [ { "email": "david.jones@example.com", "firstName": "David", @@ -28686,6 +28586,8 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "cw3", + "invoiceNumberPrefix": "v0y", "invoiceTemplateId": "tmpl_9001", "isCreateTemplate": false, "schedule": { @@ -28705,19 +28607,21 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Sit eos mollitia debitis cum.", + "dimension": "Aut facilis autem non non eum.", "expressions": [ + {}, {}, {} ], - "substring": "Earum iusto unde sit exercitationem aut.", + "substring": "Qui suscipit quas temporibus voluptates voluptatem quo.", "type": "equal", - "value": "Iusto repudiandae consequuntur adipisci." + "value": "Voluptatem eius." }, - "freeText": "Facere ut aut et ipsum ut.", - "logo": "Harum qui ipsam dignissimos.", + "freeText": "Adipisci enim earum iusto unde sit.", + "logo": "Mollitia debitis cum fuga iusto repudiandae.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" } @@ -28736,11 +28640,6 @@ "firstName": "David", "lastName": "Jones" }, - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, { "email": "david.jones@example.com", "firstName": "David", @@ -28758,11 +28657,6 @@ "firstName": "David", "lastName": "Jones" }, - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, { "email": "david.jones@example.com", "firstName": "David", @@ -28783,6 +28677,20 @@ "invoiceIssueDateRule": { "$ref": "#/components/schemas/FinopsBilling_BillingInvoiceIssueDateRule" }, + "invoiceNumberBase": { + "description": "Optional first sequence number for the invoice numbers this schedule generates.", + "example": "uf4", + "maxLength": 9, + "pattern": "^0*[1-9][0-9]*$", + "type": "string" + }, + "invoiceNumberPrefix": { + "description": "Optional prefix for the invoice numbers this schedule generates. Requires invoiceNumberBase.", + "example": "zel", + "maxLength": 20, + "pattern": "^[A-Za-z0-9_-]*$", + "type": "string" + }, "invoiceTemplateId": { "description": "Identifier of an existing invoice template to share across every customer on this schedule. Omit both this and template to create a schedule with no template.", "example": "tmpl_9001", @@ -28824,18 +28732,20 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Sit eos mollitia debitis cum.", + "dimension": "Aut facilis autem non non eum.", "expressions": [ + {}, {}, {} ], - "substring": "Earum iusto unde sit exercitationem aut.", + "substring": "Qui suscipit quas temporibus voluptates voluptatem quo.", "type": "equal", - "value": "Iusto repudiandae consequuntur adipisci." + "value": "Voluptatem eius." }, - "freeText": "Dolorem ut laboriosam ea et.", + "freeText": "Autem reprehenderit quis consequatur cupiditate enim.", "logo": "\u003cbase64-or-reference-payload\u003e", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" @@ -28860,7 +28770,7 @@ "region" ], "items": { - "example": "Ullam aspernatur maxime ducimus.", + "example": "Eum laudantium ea dignissimos.", "type": "string" }, "maxItems": 10, @@ -28871,6 +28781,15 @@ "example": true, "type": "boolean" }, + "exportLayout": { + "description": "PDF layout format. Exact lowercase flatten or nested; omitted PDF exports default to flatten. Must be omitted for CSV exports.", + "enum": [ + "flatten", + "nested" + ], + "example": "flatten", + "type": "string" + }, "exportType": { "description": "Invoice export type.", "enum": [ @@ -28885,7 +28804,7 @@ }, "freeText": { "description": "Optional free-text company/address block.", - "example": "Aut accusamus.", + "example": "Quo inventore voluptatem ut expedita.", "type": "string" }, "logo": { @@ -28921,45 +28840,49 @@ }, "FinopsBilling_CreateRequestBody3": { "example": { - "costMetric": "billedCost", + "costMetric": "modifiedBilledCost", "customers": [ { - "customerBillingPlan": "Distinctio officiis ex ut qui.", - "customerId": 8270483714537410000, - "customerName": "Tempore recusandae." + "customerBillingPlan": "Pariatur necessitatibus corrupti.", + "customerId": 7491482402168278000, + "customerName": "Officiis eum.", + "invoiceNumber": "y0u" }, { - "customerBillingPlan": "Distinctio officiis ex ut qui.", - "customerId": 8270483714537410000, - "customerName": "Tempore recusandae." + "customerBillingPlan": "Pariatur necessitatibus corrupti.", + "customerId": 7491482402168278000, + "customerName": "Officiis eum.", + "invoiceNumber": "y0u" } ], "dimensions": [ - "Quia molestias non placeat ea unde et.", - "Corrupti reprehenderit expedita delectus qui.", - "Eum nam provident ut cumque explicabo." + "Dolore possimus ex aut voluptatem.", + "Velit a distinctio qui distinctio.", + "Totam et perspiciatis." ], - "displayLogoWithinPdf": true, - "dueDate": "1995-04-17", - "endDate": "1978-08-08", - "exportType": "pdf", + "displayLogoWithinPdf": false, + "dueDate": "1970-12-15", + "endDate": "2008-03-08", + "exportLayout": "flatten", + "exportType": "csv", "filter": { - "dimension": "Sit eos mollitia debitis cum.", + "dimension": "Aut facilis autem non non eum.", "expressions": [ + {}, {}, {} ], - "substring": "Earum iusto unde sit exercitationem aut.", + "substring": "Qui suscipit quas temporibus voluptates voluptatem quo.", "type": "equal", - "value": "Iusto repudiandae consequuntur adipisci." + "value": "Voluptatem eius." }, - "freeText": "Ut recusandae sint qui.", - "invoiceTemplateId": "Nobis quae enim blanditiis.", + "freeText": "Culpa aut hic.", + "invoiceTemplateId": "Qui quibusdam.", "isCreateTemplate": false, - "issueDate": "2001-02-26", - "logo": "Quidem assumenda odio perspiciatis iste natus.", + "issueDate": "1997-12-14", + "logo": "Fugit et fugit enim.", "periodType": "billPeriod", - "startDate": "1973-01-03", + "startDate": "2005-07-08", "template": { "costMetric": "billedCost", "dimensions": [ @@ -28968,19 +28891,21 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Sit eos mollitia debitis cum.", + "dimension": "Aut facilis autem non non eum.", "expressions": [ + {}, {}, {} ], - "substring": "Earum iusto unde sit exercitationem aut.", + "substring": "Qui suscipit quas temporibus voluptates voluptatem quo.", "type": "equal", - "value": "Iusto repudiandae consequuntur adipisci." + "value": "Voluptatem eius." }, - "freeText": "Et corporis temporibus et blanditiis assumenda dolorum.", - "logo": "Aliquam in nemo qui impedit soluta corporis.", + "freeText": "Labore ipsum fugiat est quod ullam.", + "logo": "Voluptatem minus aut illum eligendi.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" } @@ -28994,21 +28919,17 @@ "modifiedBilledCost", "modifiedEffectiveCost" ], - "example": "modifiedEffectiveCost", + "example": "effectiveCost", "type": "string" }, "customers": { "description": "Customers to create invoice exports for.", "example": [ { - "customerBillingPlan": "Distinctio officiis ex ut qui.", - "customerId": 8270483714537410000, - "customerName": "Tempore recusandae." - }, - { - "customerBillingPlan": "Distinctio officiis ex ut qui.", - "customerId": 8270483714537410000, - "customerName": "Tempore recusandae." + "customerBillingPlan": "Pariatur necessitatibus corrupti.", + "customerId": 7491482402168278000, + "customerName": "Officiis eum.", + "invoiceNumber": "y0u" } ], "items": { @@ -29020,12 +28941,12 @@ "dimensions": { "description": "Dimensions to include in export.", "example": [ - "Expedita consequatur labore voluptatum non et.", - "Accusamus consequatur.", - "Voluptate beatae illo." + "Eius porro tempore nemo quidem voluptas.", + "Et distinctio eum.", + "Eos eveniet eaque fuga iste et ratione." ], "items": { - "example": "Alias itaque voluptatibus et quaerat.", + "example": "Expedita facere dolorum est velit adipisci.", "type": "string" }, "maxItems": 10, @@ -29038,16 +28959,25 @@ }, "dueDate": { "description": "Invoice due date.", - "example": "1993-12-03", + "example": "1988-11-28", "format": "date", "type": "string" }, "endDate": { "description": "Invoice range end date.", - "example": "1990-10-28", + "example": "1988-05-11", "format": "date", "type": "string" }, + "exportLayout": { + "description": "PDF layout format. Exact lowercase flatten or nested; omitted PDF exports default to flatten. Must be omitted for CSV exports.", + "enum": [ + "flatten", + "nested" + ], + "example": "flatten", + "type": "string" + }, "exportType": { "description": "Export type. Required only when neither invoiceTemplateId nor template is supplied.", "enum": [ @@ -29062,12 +28992,12 @@ }, "freeText": { "description": "Optional free text.", - "example": "Nulla numquam architecto eius pariatur.", + "example": "Est est illo nisi.", "type": "string" }, "invoiceTemplateId": { "description": "Optional saved invoice template to source default field values from. Cannot be combined with template. Opaque ID; resolved server-side and snapshotted into the invoice.", - "example": "Eius voluptatem et rerum minus.", + "example": "Quo dolorum adipisci est cumque dolor.", "type": "string" }, "isCreateTemplate": { @@ -29078,13 +29008,13 @@ }, "issueDate": { "description": "Invoice issue date.", - "example": "1982-03-16", + "example": "1995-07-16", "format": "date", "type": "string" }, "logo": { "description": "Optional logo payload.", - "example": "Iure dolorem animi atque quos.", + "example": "Sunt sunt mollitia tenetur.", "type": "string" }, "periodType": { @@ -29094,12 +29024,12 @@ "billPeriod", "billingPeriod" ], - "example": "billPeriod", + "example": "chargePeriod", "type": "string" }, "startDate": { "description": "Invoice range start date.", - "example": "2005-03-29", + "example": "1979-06-22", "format": "date", "type": "string" }, @@ -29123,11 +29053,6 @@ "percentage": 50, "value": "Orion" }, - { - "dimensionId": "rbd_team", - "percentage": 50, - "value": "Orion" - }, { "dimensionId": "rbd_team", "percentage": 50, @@ -29140,24 +29065,6 @@ "effectiveTo": "2025-12", "name": "Equal split for AWS between Teams A, B and C", "source": [ - { - "dimensionId": "vendor", - "valueListCondition": { - "values": [ - "AWS", - "Azure" - ] - } - }, - { - "dimensionId": "vendor", - "valueListCondition": { - "values": [ - "AWS", - "Azure" - ] - } - }, { "dimensionId": "vendor", "valueListCondition": { @@ -29196,6 +29103,15 @@ "source": { "description": "Dimensions that identify the costs to be reallocated. Multiple dimensions are combined using AND logic; only costs that satisfy every dimension are included. At least one dimension is required.", "example": [ + { + "dimensionId": "vendor", + "valueListCondition": { + "values": [ + "AWS", + "Azure" + ] + } + }, { "dimensionId": "vendor", "valueListCondition": { @@ -29509,16 +29425,13 @@ "ref": "iam:user:123" }, "creditTypes": [ - "Vel ut.", - "Eum totam aspernatur.", - "Et omnis.", - "Animi iure." + "Perferendis doloribus omnis mollitia sit aut.", + "Qui nemo sint non animi.", + "Animi officiis quidem consequatur rem placeat vitae." ], "customerIds": [ - 7040638334850636000, - 11678638534860245000, - 10022420793517386000, - 3391065041821145600 + 8633722213610398000, + 10957346168265202000 ], "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "kind": "finops:billing-credit-assignment-summary", @@ -29574,13 +29487,12 @@ "creditTypes": { "description": "The unique credit types affected by the credit assignment.", "example": [ - "Eum explicabo qui qui accusantium.", - "Natus iure deserunt cumque id.", - "In et fugiat.", - "Velit pariatur consequatur repellat reiciendis." + "Unde quaerat nemo maiores tempora numquam.", + "Facere officia non et natus.", + "Inventore sapiente." ], "items": { - "example": "Possimus quia voluptates laboriosam eveniet quia ut.", + "example": "Possimus nulla et aut.", "type": "string" }, "type": "array" @@ -29588,12 +29500,11 @@ "customerIds": { "description": "The unique customer (child org) identifiers affected by the credit assignment.", "example": [ - 8056459841872147000, - 14267814888460310000, - 15121543345075990000 + 5173080212351944000, + 2180479856682928600 ], "items": { - "example": 4634608285761087000, + "example": 8086585002274591000, "type": "integer" }, "type": "array" @@ -29808,26 +29719,26 @@ }, "FinopsBilling_CustomRateTier": { "example": { - "endCost": "Miss Lexie Skiles", - "rate": "Sadie Pollich", - "startCost": "Jolie Stokes" + "endCost": "Juston Heller", + "rate": "Kasandra Gutkowski", + "startCost": "Michael Roberts" }, "properties": { "endCost": { "description": "inclusive upper bound for this tier", - "example": "Dan McKenzie Jr.", + "example": "Ms. Giovanni Fadel", "pattern": "^[-+]?[0-9]+(?:[.][0-9]+)?(?:[eE][-+]?[0-9]+)?$", "type": "string" }, "rate": { "description": "unit price applied by this tier", - "example": "Astrid Barrows Jr.", + "example": "Amir VonRueden", "pattern": "^[-+]?[0-9]+(?:[.][0-9]+)?(?:[eE][-+]?[0-9]+)?$", "type": "string" }, "startCost": { "description": "exclusive lower bound for this tier", - "example": "Jettie Cummerata", + "example": "Aglae Turcotte", "pattern": "^[-+]?[0-9]+(?:[.][0-9]+)?(?:[eE][-+]?[0-9]+)?$", "type": "string" } @@ -29931,7 +29842,7 @@ "properties": { "fault": { "description": "Is the error a server-side fault?", - "example": false, + "example": true, "type": "boolean" }, "id": { @@ -30005,67 +29916,61 @@ "FinopsBilling_FilterV1": { "description": "A single filter node: a leaf test (equal, substring) or a boolean combinator (and, or, not).", "example": { - "dimension": "Deserunt autem autem.", + "dimension": "Odit amet eum odio dolores atque nemo.", "expression": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, "expressions": [ { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ {}, - {} - ], - "substring": "Debitis sint.", - "type": "equal", - "value": "Libero non harum repellat tenetur quos." - }, - { - "dimension": "Eum et optio dolores aspernatur officia veniam.", - "expressions": [ {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." } ], - "substring": "Iusto nihil nihil sapiente.", + "substring": "Eveniet numquam qui quia cum.", "type": "equal", - "value": "Tenetur qui quas deserunt." + "value": "Et cumque repellat labore." }, "properties": { "dimension": { "description": "Column/dimension name; used by leaf nodes (equal, substring)", - "example": "Vitae ullam qui aut.", + "example": "Accusantium est beatae cumque pariatur nam dolore.", "type": "string" }, "expression": { @@ -30075,24 +29980,48 @@ "description": "Child expressions; used by and/or nodes", "example": [ { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", + "expressions": [ + {}, + {}, + {} + ], + "substring": "Optio dolores aspernatur officia veniam.", + "type": "equal", + "value": "Accusamus deleniti cumque et omnis tempora eum." + }, + { + "dimension": "Ut ullam aut.", + "expressions": [ + {}, + {}, + {} + ], + "substring": "Optio dolores aspernatur officia veniam.", + "type": "equal", + "value": "Accusamus deleniti cumque et omnis tempora eum." + }, + { + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." } ], "items": { @@ -30102,7 +30031,7 @@ }, "substring": { "description": "Substring match value; used by substring nodes", - "example": "Iure alias saepe.", + "example": "Expedita omnis ipsum vel.", "type": "string" }, "type": { @@ -30119,7 +30048,7 @@ }, "value": { "description": "Exact match value; used by equal nodes", - "example": "Ab distinctio omnis quo.", + "example": "Adipisci dolores eveniet cupiditate non.", "type": "string" } }, @@ -30823,52 +30752,54 @@ "description": "An invoice export lifecycle record.", "example": { "artifact": { - "expiresAt": "2012-05-17T03:14:31Z", - "url": "Error vel." + "expiresAt": "1997-11-11T17:25:06Z", + "url": "Amet eos tenetur numquam." }, - "attempts": 1593420879800328000, - "billMonth": "Shayne Kovacek", - "costMetric": "Omnis eum.", - "createdAt": "1985-07-02T07:05:40Z", + "attempts": 6259724457644935000, + "billMonth": "Drake Bosco", + "costMetric": "Pariatur praesentium.", + "createdAt": "1996-01-20T19:31:51Z", "currency": "USD", - "customerBillingPlan": "Cupiditate enim omnis.", - "customerId": 15893412570382467000, - "customerName": "Laudantium ea dignissimos ea autem reprehenderit quis.", + "customerBillingPlan": "Earum nostrum ex.", + "customerId": 13479479524266762000, + "customerName": "Minima molestiae voluptate maxime aut.", "dimensions": [ - "In aut dolor harum et.", - "Nisi rerum.", - "Modi voluptate sunt quo placeat quia libero." + "Omnis maxime.", + "Repudiandae velit fugit." ], - "displayLogoWithinPdf": false, - "dueDate": "1971-11-14", + "displayLogoWithinPdf": true, + "dueDate": "2001-06-25", + "exportLayout": "nested", "exportType": "csv", "failure": { - "code": "Explicabo fugit.", - "message": "Eveniet omnis ad." + "code": "Sint commodi consequuntur exercitationem.", + "message": "Doloribus ut molestiae dolorem." }, "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." - }, - "filterCount": 12048949954503946000, - "freeText": "Non voluptas.", - "groupByCount": 5925111761407452000, - "id": "Quo inventore voluptatem ut expedita.", - "invoiceAmount": "Ad iusto.", - "invoiceTemplateId": "Sit inventore aut laudantium.", + "value": "Accusamus deleniti cumque et omnis tempora eum." + }, + "filterCount": 1723730850210965200, + "freeText": "Voluptatem qui velit.", + "groupByCount": 6322255324718638000, + "id": "Quis dolorem voluptas.", + "invoiceAmount": "Repellendus odio odio illo ut reprehenderit est.", + "invoiceNumber": "r4h", + "invoiceTemplateId": "Aut saepe dolorum sapiente.", "isCreateTemplate": true, - "issueDate": "1980-09-26", + "issueDate": "2003-11-16", "kind": "finops:invoice", - "logo": "Distinctio expedita.", + "logo": "Molestias quos harum veritatis beatae quis.", "orgId": 100, "periodType": "chargePeriod", - "status": "Suscipit molestias occaecati suscipit incidunt ex.", + "status": "Voluptatem et.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -30877,23 +30808,25 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, - "freeText": "Accusamus ducimus porro voluptas dignissimos.", - "logo": "Eveniet delectus quo occaecati deserunt sunt quia.", + "freeText": "Magni a ipsa.", + "logo": "Eum reiciendis ea vitae reprehenderit rerum.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "2011-11-20T15:01:04Z" + "updatedAt": "1993-06-29T09:20:49Z" }, "properties": { "artifact": { @@ -30901,24 +30834,24 @@ }, "attempts": { "description": "Retry attempts", - "example": 5798667377295378000, + "example": 3532925794741297700, "minimum": 0, "type": "integer" }, "billMonth": { "description": "Billing month (YYYY-MM format)", - "example": "Angelica Jaskolski", + "example": "Mr. Keyon Watsica", "pattern": "^\\d{4}-\\d{2}$", "type": "string" }, "costMetric": { "description": "Cost metric", - "example": "Architecto laboriosam animi tempore aliquid dolorem.", + "example": "Dolores harum repudiandae excepturi.", "type": "string" }, "createdAt": { "description": "ISO-8601 creation timestamp", - "example": "1977-09-18T15:59:07Z", + "example": "1996-02-03T10:13:55Z", "format": "date-time", "type": "string" }, @@ -30930,28 +30863,28 @@ }, "customerBillingPlan": { "description": "Customer billing plan", - "example": "Minima repellendus.", + "example": "Suscipit molestias occaecati suscipit incidunt ex.", "type": "string" }, "customerId": { "description": "Customer identifier", - "example": 12627299714350088000, + "example": 18059412849561332000, "type": "integer" }, "customerName": { "description": "Customer display name", - "example": "Incidunt et omnis quasi quam.", + "example": "Eius enim quo deserunt omnis eum.", "type": "string" }, "dimensions": { "description": "Stored group-by dimensions", "example": [ - "Sint neque dolores autem porro autem voluptas.", - "Laudantium ut quo quisquam quisquam animi laborum.", - "Non perspiciatis." + "Nisi excepturi iste sapiente temporibus.", + "Sit molestias voluptatibus voluptatum voluptas optio.", + "Possimus sequi cumque id." ], "items": { - "example": "Quos quam cum.", + "example": "Consequatur et at porro.", "type": "string" }, "type": "array" @@ -30963,17 +30896,26 @@ }, "dueDate": { "description": "Invoice due date", - "example": "2007-11-16", + "example": "1987-01-17", "format": "date", "type": "string" }, + "exportLayout": { + "description": "PDF layout format: flatten or nested.", + "enum": [ + "flatten", + "nested" + ], + "example": "flatten", + "type": "string" + }, "exportType": { "description": "Invoice export type", "enum": [ "pdf", "csv" ], - "example": "csv", + "example": "pdf", "type": "string" }, "failure": { @@ -30984,44 +30926,50 @@ }, "filterCount": { "description": "Number of filter expressions", - "example": 9519564133288983000, + "example": 10823215093106594000, "minimum": 0, "type": "integer" }, "freeText": { "description": "Optional free text included in the invoice", - "example": "Est odio velit dolorem eos doloribus.", + "example": "Iste quos.", "type": "string" }, "groupByCount": { "description": "Number of group-by dimensions", - "example": 17219079358788458000, + "example": 9329942893328198000, "minimum": 0, "type": "integer" }, "id": { "description": "Invoice export identifier", - "example": "Vel ut.", + "example": "Ea ut deserunt dolorem cumque blanditiis nam.", "type": "string" }, "invoiceAmount": { "description": "Invoice amount rendered as string", - "example": "In illum assumenda doloribus excepturi.", + "example": "Autem dolore qui aut quam laudantium reiciendis.", + "type": "string" + }, + "invoiceNumber": { + "description": "Invoice number (Invoice ID), scoped to the owning organization. Absent when the invoice has no number. The number is allocated only after bill-lock passes; a failed generation keeps its number and a retry reuses it.", + "example": "uni", + "maxLength": 29, "type": "string" }, "invoiceTemplateId": { "description": "Identifier of the saved template selected when this invoice was created. Empty when no saved template was used.", - "example": "Quibusdam autem dolores.", + "example": "Facere cum aut repellendus harum libero.", "type": "string" }, "isCreateTemplate": { "description": "Whether this invoice created its saved template as part of the request.", - "example": false, + "example": true, "type": "boolean" }, "issueDate": { "description": "Invoice issue date", - "example": "1974-08-15", + "example": "2001-03-20", "format": "date", "type": "string" }, @@ -31035,7 +30983,7 @@ }, "logo": { "description": "Optional logo payload", - "example": "Nihil ut temporibus error.", + "example": "Autem recusandae fuga quo id asperiores dolorem.", "type": "string" }, "orgId": { @@ -31056,7 +31004,7 @@ }, "status": { "description": "Export status", - "example": "Id minus ut tempore provident amet sapiente.", + "example": "Impedit quo dicta natus.", "type": "string" }, "template": { @@ -31064,7 +31012,7 @@ }, "updatedAt": { "description": "ISO-8601 update timestamp", - "example": "2011-07-27T06:07:38Z", + "example": "1972-03-16T22:26:32Z", "format": "date-time", "type": "string" } @@ -31089,7 +31037,7 @@ "FinopsBilling_FlexeraFinopsBillingInvoiceSchedule": { "description": "A recurring schedule that generates and emails invoices for one or more customers.", "example": { - "createdAt": "2013-02-27T06:07:31Z", + "createdAt": "2005-11-26T19:47:48Z", "createdBy": 123, "customers": [ { @@ -31101,14 +31049,12 @@ "email": "david.jones@example.com", "firstName": "David", "lastName": "Jones" - } - ] - }, - { - "customerBillingPlan": "gold", - "customerId": 53125, - "customerName": "MSP Child Org - 52674", - "recipients": [ + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -31121,6 +31067,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -31133,6 +31089,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -31150,6 +31116,11 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "9py", + "invoiceNumberLastUsed": "000041", + "invoiceNumberNext": "000042", + "invoiceNumberPrefix": "n03", + "invoiceNumberingEnabled": true, "invoiceTemplateId": "tmpl_9001", "kind": "finops:invoice-schedule", "nextInvoiceDate": "2026-09-05", @@ -31172,29 +31143,31 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, - "freeText": "Quidem voluptatem aut omnis sint quia.", - "logo": "Unde et est sed.", + "freeText": "Porro quidem voluptatem aut.", + "logo": "Perspiciatis nemo molestiae quasi unde et est.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1972-06-17T22:38:22Z", + "updatedAt": "2001-09-21T15:57:42Z", "updatedBy": 456 }, "properties": { "createdAt": { "description": "ISO-8601 creation timestamp", - "example": "1999-06-06T07:31:15Z", + "example": "1977-06-20T01:58:04Z", "format": "date-time", "type": "string" }, @@ -31211,6 +31184,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -31223,6 +31206,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -31235,6 +31228,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -31259,6 +31262,37 @@ "invoiceIssueDateRule": { "$ref": "#/components/schemas/FinopsBilling_BillingInvoiceIssueDateRule" }, + "invoiceNumberBase": { + "description": "First sequence number of the schedule's numbering. Absent when numbering is disabled.", + "example": "alx", + "maxLength": 9, + "pattern": "^0*[1-9][0-9]*$", + "type": "string" + }, + "invoiceNumberLastUsed": { + "description": "Sequence number most recently allocated by the schedule. Absent until the first allocation. The counter is retained when the schedule is soft-deleted, and re-adding numbering continues from last used + 1.", + "example": "000041", + "pattern": "^[0-9]{1,9}$", + "type": "string" + }, + "invoiceNumberNext": { + "description": "Sequence number the next generated invoice will receive. Absent when numbering is disabled.", + "example": "000042", + "pattern": "^[0-9]{1,9}$", + "type": "string" + }, + "invoiceNumberPrefix": { + "description": "Prefix placed before the sequence number. Empty or absent when there is no prefix.", + "example": "83g", + "maxLength": 20, + "pattern": "^[A-Za-z0-9_-]*$", + "type": "string" + }, + "invoiceNumberingEnabled": { + "description": "Whether the schedule numbers the invoices it generates.", + "example": true, + "type": "boolean" + }, "invoiceTemplateId": { "description": "Identifier of the invoice template shared by every customer on this schedule. Absent when the schedule was created without a template.", "example": "tmpl_9001", @@ -31307,7 +31341,7 @@ }, "updatedAt": { "description": "ISO-8601 last-update timestamp", - "example": "1975-02-16T01:18:42Z", + "example": "2015-09-08T10:39:59Z", "format": "date-time", "type": "string" }, @@ -31337,59 +31371,62 @@ "description": "An invoice generated by an invoice schedule.", "example": { "artifact": { - "expiresAt": "2012-05-17T03:14:31Z", - "url": "Error vel." + "expiresAt": "1997-11-11T17:25:06Z", + "url": "Amet eos tenetur numquam." }, - "attempts": 527696399815392060, - "billMonth": "Raquel Heidenreich", - "costMetric": "Natus a qui consequatur consequuntur magnam ab.", - "createdAt": "1983-08-07T15:57:56Z", + "attempts": 2066864097660898300, + "billMonth": "Ricardo O'Reilly III", + "costMetric": "Dolores temporibus ab porro.", + "createdAt": "1997-07-06T10:03:10Z", "currency": "USD", - "customerBillingPlan": "Doloribus earum quia maxime vel labore.", - "customerId": 14419603428597567000, - "customerName": "Voluptatem nulla libero.", + "customerBillingPlan": "Optio enim non non neque.", + "customerId": 11741086241965162000, + "customerName": "Ipsam repellendus.", "deliveryFailure": { - "code": "Ut sit.", - "message": "Enim labore consequatur molestiae ea consequuntur." + "code": "Voluptas delectus quod est ut sequi.", + "message": "Ut sit." }, - "deliveryStatus": "failed", + "deliveryStatus": "success", "dimensions": [ - "Voluptas maiores sunt accusamus.", - "Nobis numquam.", - "Porro consequatur blanditiis accusamus iste.", - "Est optio quis voluptas." + "Nihil voluptatum.", + "Sapiente fugiat.", + "Nobis error ipsa.", + "Recusandae dicta consequatur quo eos quo est." ], - "displayLogoWithinPdf": true, - "dueDate": "1974-05-17", + "displayLogoWithinPdf": false, + "dueDate": "1982-06-22", + "exportLayout": "flatten", "exportType": "csv", "failure": { - "code": "Explicabo fugit.", - "message": "Eveniet omnis ad." + "code": "Sint commodi consequuntur exercitationem.", + "message": "Doloribus ut molestiae dolorem." }, "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." - }, - "filterCount": 8132468808425781000, - "freeText": "Enim ipsa in impedit occaecati magni.", - "groupByCount": 2218100602198022400, - "id": "Sunt nihil quis voluptatum neque.", - "invoiceAmount": "Id aut.", - "issueDate": "2008-11-03", + "value": "Accusamus deleniti cumque et omnis tempora eum." + }, + "filterCount": 15146749642228128000, + "freeText": "Mollitia iure ducimus est delectus suscipit ut.", + "groupByCount": 14407785425058257000, + "id": "Et fuga modi et ullam et architecto.", + "invoiceAmount": "Distinctio voluptatem repudiandae voluptatem at corrupti.", + "invoiceNumber": "vft", + "issueDate": "1975-02-16", "kind": "finops:invoice-schedule-invoice", - "logo": "Numquam cum maxime esse alias temporibus.", - "messageId": "Magnam nesciunt temporibus culpa.", + "logo": "Voluptas consequatur minus velit et dolores.", + "messageId": "Architecto aut.", "orgId": 100, - "periodType": "chargePeriod", - "scheduleId": "Illo ab aperiam animi ullam.", - "status": "Incidunt sunt eligendi.", - "updatedAt": "1997-11-15T16:29:45Z" + "periodType": "billPeriod", + "scheduleId": "Non quia.", + "status": "Quasi et odit.", + "updatedAt": "1994-05-26T01:37:40Z" }, "properties": { "artifact": { @@ -31397,24 +31434,24 @@ }, "attempts": { "description": "Retry attempts", - "example": 3855011903902488600, + "example": 2282537146323917300, "minimum": 0, "type": "integer" }, "billMonth": { "description": "Billing month (YYYY-MM format)", - "example": "Lea Kerluke", + "example": "Dr. Cydney Schinner", "pattern": "^\\d{4}-\\d{2}$", "type": "string" }, "costMetric": { "description": "Cost metric", - "example": "Fuga nemo illum inventore.", + "example": "Quas et tenetur.", "type": "string" }, "createdAt": { "description": "ISO-8601 creation timestamp", - "example": "1972-10-26T17:22:44Z", + "example": "2005-11-23T23:42:53Z", "format": "date-time", "type": "string" }, @@ -31426,17 +31463,17 @@ }, "customerBillingPlan": { "description": "Customer billing plan", - "example": "Sequi dignissimos molestiae minima molestiae.", + "example": "Et amet amet blanditiis.", "type": "string" }, "customerId": { "description": "Customer identifier", - "example": 15465192475364526000, + "example": 5889171255212619000, "type": "integer" }, "customerName": { "description": "Customer display name", - "example": "Placeat et rerum natus reprehenderit.", + "example": "Aperiam veritatis perferendis ex.", "type": "string" }, "deliveryFailure": { @@ -31454,34 +31491,44 @@ "dimensions": { "description": "Stored group-by dimensions", "example": [ - "Tempora numquam et facere officia non et.", - "Et inventore sapiente.", - "Vitae alias expedita aut sit." + "Qui voluptates id libero quo ut officiis.", + "Ut dolorum maiores id nihil est quidem.", + "Accusamus voluptas unde qui nam.", + "Ea rerum molestiae temporibus et necessitatibus." ], "items": { - "example": "Nulla et aut enim omnis unde quaerat.", + "example": "Quaerat fuga iure est quia eum.", "type": "string" }, "type": "array" }, "displayLogoWithinPdf": { "description": "Whether to display the logo within the PDF", - "example": false, + "example": true, "type": "boolean" }, "dueDate": { "description": "Invoice due date", - "example": "2006-06-02", + "example": "1972-10-15", "format": "date", "type": "string" }, + "exportLayout": { + "description": "PDF layout format: flatten or nested.", + "enum": [ + "flatten", + "nested" + ], + "example": "nested", + "type": "string" + }, "exportType": { "description": "Invoice export type", "enum": [ "pdf", "csv" ], - "example": "csv", + "example": "pdf", "type": "string" }, "failure": { @@ -31492,34 +31539,40 @@ }, "filterCount": { "description": "Number of filter expressions", - "example": 1594370957832142000, + "example": 6288083289396710000, "minimum": 0, "type": "integer" }, "freeText": { "description": "Optional free text included in the invoice", - "example": "Esse non vitae laudantium esse.", + "example": "Atque vel sequi nostrum.", "type": "string" }, "groupByCount": { "description": "Number of group-by dimensions", - "example": 14661024833151982000, + "example": 16467286860773657000, "minimum": 0, "type": "integer" }, "id": { "description": "Invoice export identifier", - "example": "Et repudiandae pariatur dolorem.", + "example": "Numquam dolore.", "type": "string" }, "invoiceAmount": { "description": "Invoice amount rendered as string", - "example": "Qui quos quia.", + "example": "Consequatur nobis ratione rerum rerum.", + "type": "string" + }, + "invoiceNumber": { + "description": "Invoice number (Invoice ID), scoped to the owning organization. Absent when the invoice has no number. The number is allocated only after bill-lock passes; a failed generation keeps its number and a retry reuses it.", + "example": "uz2", + "maxLength": 29, "type": "string" }, "issueDate": { "description": "Invoice issue date", - "example": "1994-04-05", + "example": "2011-07-26", "format": "date", "type": "string" }, @@ -31533,12 +31586,12 @@ }, "logo": { "description": "Optional logo payload", - "example": "Sit dolorum aut exercitationem fugiat omnis.", + "example": "Numquam nihil fugiat assumenda id.", "type": "string" }, "messageId": { "description": "Identifier returned by the notification service.", - "example": "Ullam nostrum nihil et et reiciendis.", + "example": "Iste perferendis dolor sunt doloribus sunt nihil.", "type": "string" }, "orgId": { @@ -31554,22 +31607,22 @@ "billPeriod", "billingPeriod" ], - "example": "billPeriod", + "example": "billingPeriod", "type": "string" }, "scheduleId": { "description": "Identifier of the invoice schedule.", - "example": "Aliquid consectetur.", + "example": "Quas enim iste.", "type": "string" }, "status": { "description": "Export status", - "example": "Minima vel molestiae recusandae.", + "example": "Nostrum voluptates non repudiandae suscipit quos sed.", "type": "string" }, "updatedAt": { "description": "ISO-8601 update timestamp", - "example": "2004-12-05T12:31:18Z", + "example": "1986-08-05T16:46:29Z", "format": "date-time", "type": "string" } @@ -31595,15 +31648,14 @@ "FinopsBilling_FlexeraFinopsBillingInvoiceTemplate": { "description": "A reusable invoice template for ad hoc and scheduled invoice generation.", "example": { - "activeScheduleCount": 15923520689799650000, + "activeScheduleCount": 15401209702529829000, "activeScheduleIds": [ - "Qui accusamus neque excepturi.", - "Enim sed unde ullam.", - "Recusandae neque saepe in officiis saepe.", - "Magni magni." + "Est error dignissimos excepturi omnis.", + "Non assumenda deserunt vel explicabo dolores.", + "Ipsam voluptates." ], "costMetric": "billedCost", - "createdAt": "2007-06-01T09:32:15Z", + "createdAt": "2006-02-23T11:47:11Z", "createdBy": 123, "dimensions": [ "service", @@ -31611,45 +31663,49 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, - "filterCount": 15117958917506110000, - "freeText": "Mollitia consequatur eum dolorum.", - "groupByCount": 14314659304543447000, + "filterCount": 10782359606918447000, + "freeText": "Animi numquam cum sit.", + "groupByCount": 5222533063195095000, "id": "tmpl_9001", "kind": "finops:invoice-template", - "logo": "Vel qui voluptatem sed eveniet consequatur cupiditate.", - "nextInvoiceDate": "1981-09-02", + "logo": "Alias enim soluta asperiores dignissimos asperiores hic.", + "nextInvoiceDate": "2000-10-14", "orgId": 100, "periodType": "chargePeriod", "templateName": "Standard MSP Invoice", - "updatedAt": "1995-09-27T06:17:07Z", + "updatedAt": "1972-06-13T20:01:23Z", "updatedBy": 456 }, "properties": { "activeScheduleCount": { "description": "Count of invoice schedules with status:active that currently reference this template.", - "example": 3599947173067524600, + "example": 1090943898578443400, "minimum": 0, "type": "integer" }, "activeScheduleIds": { "description": "IDs of invoice schedules with status:active that currently reference this template.", "example": [ - "Ut aut.", - "Est similique est id." + "Libero sit quam commodi ipsam.", + "Quia quos.", + "Atque assumenda dolores omnis.", + "Et ex molestiae quis." ], "items": { - "example": "Rem et exercitationem eum veritatis aliquam.", + "example": "Eveniet non.", "type": "string" }, "type": "array" @@ -31667,7 +31723,7 @@ }, "createdAt": { "description": "ISO-8601 creation timestamp", - "example": "1987-08-01T02:16:50Z", + "example": "1982-02-08T12:47:14Z", "format": "date-time", "type": "string" }, @@ -31684,7 +31740,7 @@ "region" ], "items": { - "example": "Quod non assumenda.", + "example": "Necessitatibus molestias necessitatibus expedita.", "type": "string" }, "maxItems": 10, @@ -31695,6 +31751,15 @@ "example": true, "type": "boolean" }, + "exportLayout": { + "description": "PDF layout format. Exact lowercase flatten or nested; omitted PDF exports default to flatten. Must be omitted for CSV exports.", + "enum": [ + "flatten", + "nested" + ], + "example": "flatten", + "type": "string" + }, "exportType": { "description": "Invoice export type", "enum": [ @@ -31709,18 +31774,18 @@ }, "filterCount": { "description": "Number of filter expressions", - "example": 4453990307135764000, + "example": 8935736622674324000, "minimum": 0, "type": "integer" }, "freeText": { "description": "Optional free-text company/address block rendered in the invoice.", - "example": "Sit delectus sint consequatur fugit aut eos.", + "example": "Explicabo ut tempora fugit.", "type": "string" }, "groupByCount": { "description": "Number of group-by dimensions", - "example": 7981829867813561000, + "example": 4290835481504640000, "minimum": 0, "type": "integer" }, @@ -31739,12 +31804,12 @@ }, "logo": { "description": "Optional logo payload stored with the template.", - "example": "Doloribus et qui.", + "example": "Dolorem dolorem necessitatibus.", "type": "string" }, "nextInvoiceDate": { "description": "Optional next invoice date", - "example": "1971-01-22", + "example": "1972-10-15", "format": "date", "type": "string" }, @@ -31772,7 +31837,7 @@ }, "updatedAt": { "description": "ISO-8601 last-update timestamp", - "example": "1980-09-13T19:03:37Z", + "example": "2010-06-26T23:58:25Z", "format": "date-time", "type": "string" }, @@ -32036,7 +32101,7 @@ "bundledDiscount", "distributorDiscount" ], - "example": "distributorDiscount", + "example": "taxRefunds", "type": "string" }, "type": "array" @@ -32122,6 +32187,102 @@ "values": { "description": "The requested adjustment rule values.", "example": [ + { + "createdAt": "2020-11-26T12:17:38.369Z", + "createdBy": { + "id": 1234, + "kind": "iam:user", + "ref": "iam:user:123" + }, + "creditMemo": { + "credit": "-150" + }, + "customUsageRate": { + "rate": "1.515" + }, + "customerIds": [ + 1010, + 2020, + 3030 + ], + "enabled": true, + "endAfter": "2023-05-17", + "fixedAmount": { + "cost": "150" + }, + "id": "ae85f96e-6b9e-4d68-a741-d1ea7ca1fb28", + "kind": "finops:billing-adjustment-rule", + "markupMarkdown": { + "markup": "7.5" + }, + "name": "Margin", + "removeTax": { + "condition": { + "dimension": "bill_source", + "type": "dimension_equals", + "value": "aws-123456789012" + } + }, + "startOn": "2020-03-15", + "type": "markupMarkdown", + "upchargeDiscount": { + "amount": "-2.5" + }, + "updatedAt": "2020-11-26T12:17:38.369Z", + "updatedBy": { + "id": 1234, + "kind": "iam:user", + "ref": "iam:user:123" + } + }, + { + "createdAt": "2020-11-26T12:17:38.369Z", + "createdBy": { + "id": 1234, + "kind": "iam:user", + "ref": "iam:user:123" + }, + "creditMemo": { + "credit": "-150" + }, + "customUsageRate": { + "rate": "1.515" + }, + "customerIds": [ + 1010, + 2020, + 3030 + ], + "enabled": true, + "endAfter": "2023-05-17", + "fixedAmount": { + "cost": "150" + }, + "id": "ae85f96e-6b9e-4d68-a741-d1ea7ca1fb28", + "kind": "finops:billing-adjustment-rule", + "markupMarkdown": { + "markup": "7.5" + }, + "name": "Margin", + "removeTax": { + "condition": { + "dimension": "bill_source", + "type": "dimension_equals", + "value": "aws-123456789012" + } + }, + "startOn": "2020-03-15", + "type": "markupMarkdown", + "upchargeDiscount": { + "amount": "-2.5" + }, + "updatedAt": "2020-11-26T12:17:38.369Z", + "updatedBy": { + "id": 1234, + "kind": "iam:user", + "ref": "iam:user:123" + } + }, { "createdAt": "2020-11-26T12:17:38.369Z", "createdBy": { @@ -32304,14 +32465,14 @@ "ref": "iam:user:123" }, "creditTypes": [ - "Vero possimus optio.", - "Sed accusamus omnis." + "Qui et voluptas.", + "Assumenda doloribus quibusdam repellendus magni.", + "Aut quam optio.", + "Temporibus voluptatum vero possimus optio laudantium." ], "customerIds": [ - 12176942995714097000, - 2353935046958567400, - 17506571747869151000, - 12572758066901092000 + 13201221188460323000, + 11231078588283378000 ], "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "kind": "finops:billing-credit-assignment-summary", @@ -32348,58 +32509,14 @@ "ref": "iam:user:123" }, "creditTypes": [ - "Vero possimus optio.", - "Sed accusamus omnis." + "Qui et voluptas.", + "Assumenda doloribus quibusdam repellendus magni.", + "Aut quam optio.", + "Temporibus voluptatum vero possimus optio laudantium." ], "customerIds": [ - 12176942995714097000, - 2353935046958567400, - 17506571747869151000, - 12572758066901092000 - ], - "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", - "kind": "finops:billing-credit-assignment-summary", - "name": "EDP Credits Q1", - "provider": "AWS", - "sourceAccounts": [ - { - "billingAccountId": "111222333", - "billingAccountName": "acme-prod-us-east", - "subAccountId": "777037404548", - "subAccountName": "acme-prod-us-east" - } - ], - "targetBillingAccountId": "4", - "targetBillingAccountName": "acme-target-us-east", - "targetCustomerId": 2001, - "targetSubAccountId": "111122223333", - "targetSubAccountName": "acme-target-us-east", - "updatedAt": "2020-11-26T12:17:38.369Z", - "updatedBy": { - "id": 1234, - "kind": "iam:user", - "ref": "iam:user:123" - } - }, - { - "action": "reassign", - "amount": "100.00", - "billMonth": "202601", - "createdAt": "2020-11-26T12:17:38.369Z", - "createdBy": { - "id": 1234, - "kind": "iam:user", - "ref": "iam:user:123" - }, - "creditTypes": [ - "Vero possimus optio.", - "Sed accusamus omnis." - ], - "customerIds": [ - 12176942995714097000, - 2353935046958567400, - 17506571747869151000, - 12572758066901092000 + 13201221188460323000, + 11231078588283378000 ], "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "kind": "finops:billing-credit-assignment-summary", @@ -32596,154 +32713,6 @@ "ref": "iam:user:123" } }, - { - "createdAt": "2020-11-26T12:17:38.369Z", - "createdBy": { - "id": 1234, - "kind": "iam:user", - "ref": "iam:user:123" - }, - "creditMemo": { - "credit": "-150" - }, - "customUsageRate": { - "rate": "1.515" - }, - "enabled": true, - "endAfter": "2023-05-17", - "fixedAmount": { - "cost": "150" - }, - "generateTax": { - "rate": "7.5" - }, - "hideCredits": { - "condition": { - "dimension": "bill_source", - "type": "dimension_equals", - "value": "aws-123456789012" - }, - "creditTypes": [ - "edpDiscount", - "privateRateDiscount" - ] - }, - "id": "ae85f96e-6b9e-4d68-a741-d1ea7ca1fb28", - "kind": "finops:billing-enterprise-rule", - "markupMarkdown": { - "markup": "7.5" - }, - "name": "Margin", - "removeAzureLicenseCosts": { - "condition": { - "dimension": "bill_source", - "type": "dimension_equals", - "value": "cbi-oi-azure-ea-12345678" - } - }, - "removeTax": { - "condition": { - "dimension": "bill_source", - "type": "dimension_equals", - "value": "aws-123456789012" - } - }, - "startOn": "2020-03-15", - "supportCharge": { - "applyBy": "customer", - "applyMinimum": false, - "condition": { - "dimension": "bill_source", - "type": "dimension_equals", - "value": "aws-123456789012" - }, - "tier": "business" - }, - "type": "markupMarkdown", - "upchargeDiscount": { - "amount": "-2.5" - }, - "updatedAt": "2020-11-26T12:17:38.369Z", - "updatedBy": { - "id": 1234, - "kind": "iam:user", - "ref": "iam:user:123" - } - }, - { - "createdAt": "2020-11-26T12:17:38.369Z", - "createdBy": { - "id": 1234, - "kind": "iam:user", - "ref": "iam:user:123" - }, - "creditMemo": { - "credit": "-150" - }, - "customUsageRate": { - "rate": "1.515" - }, - "enabled": true, - "endAfter": "2023-05-17", - "fixedAmount": { - "cost": "150" - }, - "generateTax": { - "rate": "7.5" - }, - "hideCredits": { - "condition": { - "dimension": "bill_source", - "type": "dimension_equals", - "value": "aws-123456789012" - }, - "creditTypes": [ - "edpDiscount", - "privateRateDiscount" - ] - }, - "id": "ae85f96e-6b9e-4d68-a741-d1ea7ca1fb28", - "kind": "finops:billing-enterprise-rule", - "markupMarkdown": { - "markup": "7.5" - }, - "name": "Margin", - "removeAzureLicenseCosts": { - "condition": { - "dimension": "bill_source", - "type": "dimension_equals", - "value": "cbi-oi-azure-ea-12345678" - } - }, - "removeTax": { - "condition": { - "dimension": "bill_source", - "type": "dimension_equals", - "value": "aws-123456789012" - } - }, - "startOn": "2020-03-15", - "supportCharge": { - "applyBy": "customer", - "applyMinimum": false, - "condition": { - "dimension": "bill_source", - "type": "dimension_equals", - "value": "aws-123456789012" - }, - "tier": "business" - }, - "type": "markupMarkdown", - "upchargeDiscount": { - "amount": "-2.5" - }, - "updatedAt": "2020-11-26T12:17:38.369Z", - "updatedBy": { - "id": 1234, - "kind": "iam:user", - "ref": "iam:user:123" - } - }, { "createdAt": "2020-11-26T12:17:38.369Z", "createdBy": { @@ -32921,29 +32890,6 @@ "ref": "iam:user:123" } }, - { - "createdAt": "2020-11-26T12:17:38.369Z", - "createdBy": { - "id": 1234, - "kind": "iam:user", - "ref": "iam:user:123" - }, - "customerIds": [ - 1010, - 2020, - 3030 - ], - "description": "Gold Tier Customers enjoy our highest discounts", - "id": "c6671c74-513a-4127-b8df-81adfb65bf7f", - "kind": "finops:billing-adjustment-plan", - "name": "Gold Tier", - "updatedAt": "2020-11-26T12:17:38.369Z", - "updatedBy": { - "id": 1234, - "kind": "iam:user", - "ref": "iam:user:123" - } - }, { "createdAt": "2020-11-26T12:17:38.369Z", "createdBy": { @@ -33682,7 +33628,7 @@ "a02c75c8-e585-4e7c-9d83-07f4efef7f03" ], "items": { - "example": "39j", + "example": "m", "minLength": 1, "type": "string" }, @@ -33736,6 +33682,10 @@ "FinopsBilling_ReorderRequestBody": { "example": { "rules": [ + { + "priority": 1, + "ruleId": "68f2a91c4b3d2e1f5a6b7c8d" + }, { "priority": 1, "ruleId": "68f2a91c4b3d2e1f5a6b7c8d" @@ -33746,6 +33696,14 @@ "rules": { "description": "List of rules whose priority is changing, with their new priorities.", "example": [ + { + "priority": 1, + "ruleId": "68f2a91c4b3d2e1f5a6b7c8d" + }, + { + "priority": 1, + "ruleId": "68f2a91c4b3d2e1f5a6b7c8d" + }, { "priority": 1, "ruleId": "68f2a91c4b3d2e1f5a6b7c8d" @@ -34233,9 +34191,28 @@ }, "FinopsBilling_ReplaceSettingsRequestBody": { "example": { + "automatedEdpProfiles": [ + { + "billSource": "aws-123456789012", + "enabled": true + } + ], "baseCostsOn": "billedCost" }, "properties": { + "automatedEdpProfiles": { + "description": "Automated EDP settings by AWS bill source. Providing an empty list or omitting this field replaces existing profiles with an empty list and disables Automated EDP for all bill sources.", + "example": [ + { + "billSource": "aws-123456789012", + "enabled": true + } + ], + "items": { + "$ref": "#/components/schemas/FinopsBilling_AutomatedEdpProfile" + }, + "type": "array" + }, "baseCostsOn": { "description": "The base cost value used for adjustments. Note that using 'listCost' may reduce the utility of some adjustment rules. The 'observedCosts' value is deprecated; use 'billedCost' or 'modifiedCost' instead. The 'observedCosts' value is retained for legacy compatibility.", "enum": [ @@ -34575,9 +34552,28 @@ }, "FinopsBilling_ShowSettingsResponseBody": { "example": { + "automatedEdpProfiles": [ + { + "billSource": "aws-123456789012", + "enabled": true + } + ], "baseCostsOn": "billedCost" }, "properties": { + "automatedEdpProfiles": { + "description": "Automated EDP settings by AWS bill source. An empty list disables Automated EDP for all bill sources.", + "example": [ + { + "billSource": "aws-123456789012", + "enabled": true + } + ], + "items": { + "$ref": "#/components/schemas/FinopsBilling_AutomatedEdpProfile" + }, + "type": "array" + }, "baseCostsOn": { "description": "The base cost value used for adjustments. Note that using 'listCost' may reduce the utility of some adjustment rules. The 'observedCosts' value is deprecated; use 'billedCost' or 'modifiedCost' instead. The 'observedCosts' value is retained for legacy compatibility.", "enum": [ @@ -34586,12 +34582,13 @@ "billedCost", "modifiedCost" ], - "example": "observedCosts", + "example": "modifiedCost", "type": "string" } }, "required": [ - "baseCostsOn" + "baseCostsOn", + "automatedEdpProfiles" ], "type": "object" }, @@ -34966,26 +34963,26 @@ }, "FinopsBilling_UpchargeTier": { "example": { - "amount": "Dena Stark", - "endCost": "Fabiola Moen", - "startCost": "Miss Korey Howell" + "amount": "Logan Nikolaus", + "endCost": "Moises White Jr.", + "startCost": "Earnest Keebler" }, "properties": { "amount": { "description": "upcharge percentage applied by this tier", - "example": "Travis Volkman", + "example": "Ms. Yazmin Cronin", "pattern": "^[-+]?[0-9]+(?:[.][0-9]+)?$", "type": "string" }, "endCost": { "description": "inclusive upper bound for this tier", - "example": "Lora Stiedemann", + "example": "Moshe Jakubowski III", "pattern": "^[-+]?[0-9]+(?:[.][0-9]+)?(?:[eE][-+]?[0-9]+)?$", "type": "string" }, "startCost": { "description": "exclusive lower bound for this tier", - "example": "Ericka Ritchie", + "example": "Miss Hector Schowalter", "pattern": "^[-+]?[0-9]+(?:[.][0-9]+)?(?:[eE][-+]?[0-9]+)?$", "type": "string" } @@ -35010,11 +35007,6 @@ "firstName": "David", "lastName": "Jones" }, - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, { "email": "david.jones@example.com", "firstName": "David", @@ -35027,55 +35019,6 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - } - ] - }, - { - "customerBillingPlan": "gold", - "customerId": 53125, - "customerName": "MSP Child Org - 52674", - "recipients": [ - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - } - ] - }, - { - "customerBillingPlan": "gold", - "customerId": 53125, - "customerName": "MSP Child Org - 52674", - "recipients": [ - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, { "email": "david.jones@example.com", "firstName": "David", @@ -35097,6 +35040,8 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "6fj", + "invoiceNumberPrefix": "j3z", "invoiceTemplateId": "tmpl_9002", "isCreateTemplate": false, "schedule": { @@ -35107,7 +35052,8 @@ "timeOfDay": "06:00", "timezone": "UTC" }, - "scheduleName": "xay", + "scheduleName": "880", + "status": "inactive", "template": { "costMetric": "billedCost", "dimensions": [ @@ -35116,19 +35062,21 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Sit eos mollitia debitis cum.", + "dimension": "Aut facilis autem non non eum.", "expressions": [ + {}, {}, {} ], - "substring": "Earum iusto unde sit exercitationem aut.", + "substring": "Qui suscipit quas temporibus voluptates voluptatem quo.", "type": "equal", - "value": "Iusto repudiandae consequuntur adipisci." + "value": "Voluptatem eius." }, - "freeText": "Facere ut aut et ipsum ut.", - "logo": "Harum qui ipsam dignissimos.", + "freeText": "Adipisci enim earum iusto unde sit.", + "logo": "Mollitia debitis cum fuga iusto repudiandae.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" } @@ -35147,11 +35095,6 @@ "firstName": "David", "lastName": "Jones" }, - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, { "email": "david.jones@example.com", "firstName": "David", @@ -35169,6 +35112,18 @@ "firstName": "David", "lastName": "Jones" }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + } + ] + }, + { + "customerBillingPlan": "gold", + "customerId": 53125, + "customerName": "MSP Child Org - 52674", + "recipients": [ { "email": "david.jones@example.com", "firstName": "David", @@ -35193,6 +35148,20 @@ "invoiceIssueDateRule": { "$ref": "#/components/schemas/FinopsBilling_BillingInvoiceIssueDateRule" }, + "invoiceNumberBase": { + "description": "Optional updated first sequence number for the invoice numbers this schedule generates.", + "example": "n3b", + "maxLength": 9, + "pattern": "^$|^0*[1-9][0-9]*$", + "type": "string" + }, + "invoiceNumberPrefix": { + "description": "Optional updated prefix for the invoice numbers this schedule generates. Requires invoiceNumberBase.", + "example": "xkx", + "maxLength": 20, + "pattern": "^[A-Za-z0-9_-]*$", + "type": "string" + }, "invoiceTemplateId": { "description": "Existing invoice template to point the schedule at. Send isCreateTemplate=false with this field omitted to detach the schedule's template.", "example": "tmpl_9002", @@ -35208,10 +35177,18 @@ }, "scheduleName": { "description": "Updated name.", - "example": "p4y", + "example": "dq5", "maxLength": 255, "type": "string" }, + "status": { + "description": "Updated lifecycle status. PATCH accepts only inactive; use the activate endpoint to reactivate a schedule.", + "enum": [ + "inactive" + ], + "example": "inactive", + "type": "string" + }, "template": { "$ref": "#/components/schemas/FinopsBilling_BillingInvoiceScheduleTemplateInput" } @@ -35220,28 +35197,30 @@ }, "FinopsBilling_UpdateRequestBody2": { "example": { - "costMetric": "effectiveCost", + "costMetric": "billedCost", "dimensions": [ - "Ratione doloribus mollitia repudiandae doloremque libero enim.", - "Error possimus distinctio sed eum et maxime.", - "Necessitatibus quia provident sit." + "Non sapiente sequi aut et.", + "Facere maiores ut.", + "Veritatis ratione qui impedit similique eum." ], - "displayLogoWithinPdf": true, + "displayLogoWithinPdf": false, + "exportLayout": "flatten", "exportType": "csv", "filter": { - "dimension": "Sit eos mollitia debitis cum.", + "dimension": "Aut facilis autem non non eum.", "expressions": [ + {}, {}, {} ], - "substring": "Earum iusto unde sit exercitationem aut.", + "substring": "Qui suscipit quas temporibus voluptates voluptatem quo.", "type": "equal", - "value": "Iusto repudiandae consequuntur adipisci." + "value": "Voluptatem eius." }, - "freeText": "Ipsam non.", - "logo": "Voluptatem aut consequatur et ratione.", - "periodType": "chargePeriod", - "templateName": "wh1" + "freeText": "Quam rerum ab blanditiis.", + "logo": "Quia dolorem perspiciatis animi eligendi.", + "periodType": "billPeriod", + "templateName": "uoh" }, "properties": { "costMetric": { @@ -35258,12 +35237,12 @@ "dimensions": { "description": "Updated grouping dimensions.", "example": [ - "Temporibus nihil minima non asperiores quisquam.", - "Qui animi temporibus non excepturi.", - "Quo praesentium ea vitae molestias dolores et." + "Sit sunt eveniet sunt est facere temporibus.", + "Sit laboriosam.", + "Provident at ipsum." ], "items": { - "example": "Sequi sunt.", + "example": "Tenetur molestiae eos suscipit ut.", "type": "string" }, "maxItems": 10, @@ -35271,16 +35250,25 @@ }, "displayLogoWithinPdf": { "description": "Updated PDF logo display flag.", - "example": true, + "example": false, "type": "boolean" }, + "exportLayout": { + "description": "Updated PDF layout format. Exact lowercase flatten or nested; omitted PDF exports default to flatten. Must be omitted for CSV exports.", + "enum": [ + "flatten", + "nested" + ], + "example": "nested", + "type": "string" + }, "exportType": { "description": "Updated export type.", "enum": [ "pdf", "csv" ], - "example": "pdf", + "example": "csv", "type": "string" }, "filter": { @@ -35288,12 +35276,12 @@ }, "freeText": { "description": "Updated free-text company/address block.", - "example": "Ut libero animi porro illo.", + "example": "Quia sit.", "type": "string" }, "logo": { "description": "Updated logo payload.", - "example": "Pariatur illum quibusdam quis.", + "example": "Nulla ducimus ut dolores quibusdam voluptas.", "type": "string" }, "periodType": { @@ -35308,7 +35296,7 @@ }, "templateName": { "description": "Updated template name.", - "example": "561", + "example": "39a", "maxLength": 255, "type": "string" } @@ -35324,11 +35312,6 @@ "percentage": 50, "value": "Orion" }, - { - "dimensionId": "rbd_team", - "percentage": 50, - "value": "Orion" - }, { "dimensionId": "rbd_team", "percentage": 50, @@ -35389,15 +35372,6 @@ ] } }, - { - "dimensionId": "vendor", - "valueListCondition": { - "values": [ - "AWS", - "Azure" - ] - } - }, { "dimensionId": "vendor", "valueListCondition": { @@ -35441,7 +35415,7 @@ "Azure" ], "items": { - "example": "Fuga sed tempore.", + "example": "Quod qui nulla.", "type": "string" }, "minItems": 1, @@ -35604,6 +35578,36 @@ "values": { "description": "The requested vendor credit values.", "example": [ + { + "amount": "-150.0000000000", + "assignedBy": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", + "billMonth": "202601", + "billingAccountId": "111222333", + "billingAccountName": "acme-prod-us-east", + "chargeDescription": "AWS Enterprise Discount Program", + "creditType": "EdpDiscount", + "customerId": 2001, + "kind": "finops:billing-vendor-credit", + "lineItemCount": 42, + "provider": "AWS", + "subAccountId": "777037404548", + "subAccountName": "acme-prod-us-east" + }, + { + "amount": "-150.0000000000", + "assignedBy": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", + "billMonth": "202601", + "billingAccountId": "111222333", + "billingAccountName": "acme-prod-us-east", + "chargeDescription": "AWS Enterprise Discount Program", + "creditType": "EdpDiscount", + "customerId": 2001, + "kind": "finops:billing-vendor-credit", + "lineItemCount": 42, + "provider": "AWS", + "subAccountId": "777037404548", + "subAccountName": "acme-prod-us-east" + }, { "amount": "-150.0000000000", "assignedBy": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", @@ -43173,6 +43177,39 @@ }, "timestamp": "1985-04-07T08:12:52Z" }, + { + "eventType": "api.event", + "kind": "iam:api-event", + "principal": { + "email": "someone@SomeWhere.com", + "firstName": "Jane", + "id": 12345, + "kind": "iam:user", + "lastName": "Smith", + "name": "Jane Smith", + "ref": "ref:nam:::iam:user:12345" + }, + "request": { + "bodyBytes": 20, + "httpHost": "api.flexera.com", + "httpMethod": "GET", + "httpPath": "/iam/v1/orgs/100/users", + "id": "7bfcf75b8c4b4b5d9d9f05937f039307", + "ip": "1.2.3.4", + "userAgent": { + "browser": "Chrome", + "os": "Mac OS X", + "raw": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" + } + }, + "response": { + "bodyBytes": 100, + "durationMs": 300, + "httpCode": 200, + "httpStatus": "Ok" + }, + "timestamp": "1985-04-07T08:12:52Z" + }, { "eventType": "api.event", "kind": "iam:api-event", @@ -43440,7 +43477,7 @@ 2002 ], "items": { - "example": 17755399261711120000, + "example": 10350574219687018000, "type": "integer" }, "type": "array" @@ -43457,7 +43494,7 @@ 5678 ], "items": { - "example": 12044837464767205000, + "example": 7967003050873464000, "type": "integer" }, "type": "array" @@ -44472,24 +44509,6 @@ }, "updatedAt": "2006-10-02T13:28:02Z" }, - { - "capabilityName": "iam", - "createdAt": "2001-11-25T19:59:41Z", - "description": "d02", - "expiresAt": "1996-04-11T15:49:23Z", - "kind": "iam#capability", - "onboardingStatus": "pending", - "orgId": 100, - "terms": { - "Embedded Monitoring": "true", - "Features": [ - "monitoring", - "dashboards" - ], - "Number Of Computers": 500 - }, - "updatedAt": "2006-10-02T13:28:02Z" - }, { "capabilityName": "iam", "createdAt": "2001-11-25T19:59:41Z", @@ -44518,10 +44537,10 @@ "description": "An association between an Organization and a Capability (index view)", "example": { "capabilityName": "iam", - "createdAt": "1991-12-11T19:52:10Z", + "createdAt": "1981-04-08T22:09:55Z", "kind": "iam#capability", "orgId": 100, - "updatedAt": "1979-09-10T13:59:24Z" + "updatedAt": "1983-11-16T06:21:21Z" }, "properties": { "capabilityName": { @@ -44532,7 +44551,7 @@ }, "createdAt": { "description": "Creation timestamp in UTC", - "example": "1991-08-30T17:04:46Z", + "example": "1988-02-11T02:27:02Z", "format": "date-time", "type": "string" }, @@ -44552,7 +44571,7 @@ }, "updatedAt": { "description": "Last update timestamp in UTC", - "example": "2011-04-27T06:15:08Z", + "example": "1973-05-31T07:07:34Z", "format": "date-time", "type": "string" } @@ -44569,6 +44588,20 @@ "Iam_CapabilityResponseIndexCollection": { "description": "IndexResponseBody is the result type for an array of CapabilityResponse (index view)", "example": [ + { + "capabilityName": "iam", + "createdAt": "2000-01-01T02:53:10Z", + "kind": "iam#capability", + "orgId": 100, + "updatedAt": "1988-09-05T23:26:43Z" + }, + { + "capabilityName": "iam", + "createdAt": "2000-01-01T02:53:10Z", + "kind": "iam#capability", + "orgId": 100, + "updatedAt": "1988-09-05T23:26:43Z" + }, { "capabilityName": "iam", "createdAt": "2000-01-01T02:53:10Z", @@ -44690,38 +44723,6 @@ } ] }, - { - "capability": "iam", - "roles": [ - { - "category": "Automation", - "description": "Can view organization resources", - "displayName": "Approve policies", - "privileges": [ - "acme:widget:update" - ], - "role_name": "policy_approver" - }, - { - "category": "Automation", - "description": "Can view organization resources", - "displayName": "Approve policies", - "privileges": [ - "acme:widget:update" - ], - "role_name": "policy_approver" - }, - { - "category": "Automation", - "description": "Can view organization resources", - "displayName": "Approve policies", - "privileges": [ - "acme:widget:update" - ], - "role_name": "policy_approver" - } - ] - }, { "capability": "iam", "roles": [ @@ -45032,7 +45033,7 @@ "iam_admin" ], "items": { - "example": "Minima deserunt iusto ut temporibus.", + "example": "Est odio atque sit saepe quia quia.", "type": "string" }, "type": "array" @@ -45072,7 +45073,7 @@ "acme:widget:update" ], "items": { - "example": "Omnis nisi.", + "example": "Tempore eum.", "type": "string" }, "type": "array" @@ -45119,7 +45120,7 @@ 2002 ], "items": { - "example": 11727858058066051000, + "example": 12044837464767205000, "type": "integer" }, "type": "array" @@ -45136,7 +45137,7 @@ 1002 ], "items": { - "example": 135567873249863220, + "example": 13189163157627937000, "type": "integer" }, "type": "array" @@ -45339,12 +45340,6 @@ "iam_admin" ] }, - { - "capability": "iam", - "roles": [ - "iam_admin" - ] - }, { "capability": "iam", "roles": [ @@ -45372,12 +45367,6 @@ "iam_admin" ] }, - { - "capability": "iam", - "roles": [ - "iam_admin" - ] - }, { "capability": "iam", "roles": [ @@ -46422,7 +46411,7 @@ }, "timeout": { "description": "Is the error a timeout?", - "example": false, + "example": true, "type": "boolean" } }, @@ -46891,7 +46880,7 @@ "httpCode": 200, "httpStatus": "Ok" }, - "timestamp": "1996-04-15T06:53:35Z" + "timestamp": "1995-09-24T05:36:49Z" }, "properties": { "eventType": { @@ -46918,7 +46907,7 @@ }, "timestamp": { "description": "The time the API request was received in UTC", - "example": "2000-02-17T01:42:55Z", + "example": "1993-07-20T06:02:03Z", "format": "date-time", "type": "string" } @@ -46997,9 +46986,9 @@ "description": "An association between an Organization and a Capability", "example": { "capabilityName": "iam", - "createdAt": "1991-10-12T08:23:31Z", - "description": "7s7", - "expiresAt": "1986-06-11T03:04:48Z", + "createdAt": "1976-06-14T09:30:48Z", + "description": "0gu", + "expiresAt": "2011-03-29T18:15:33Z", "kind": "iam#capability", "onboardingStatus": "pending", "orgId": 100, @@ -47011,7 +47000,7 @@ ], "Number Of Computers": 500 }, - "updatedAt": "1970-11-13T17:58:57Z" + "updatedAt": "1970-07-01T05:29:54Z" }, "properties": { "capabilityName": { @@ -47022,20 +47011,20 @@ }, "createdAt": { "description": "Creation timestamp in UTC", - "example": "1974-08-14T13:22:11Z", + "example": "1972-07-22T21:58:50Z", "format": "date-time", "type": "string" }, "description": { "description": "A description of the Capability", - "example": "i", + "example": "k", "maxLength": 65536, "minLength": 1, "type": "string" }, "expiresAt": { "description": "Expiration date in UTC", - "example": "1990-05-31T03:28:59Z", + "example": "1977-03-12T13:07:59Z", "format": "date-time", "type": "string" }, @@ -47073,7 +47062,7 @@ }, "updatedAt": { "description": "Last update timestamp in UTC", - "example": "1996-12-01T02:17:44Z", + "example": "1985-07-01T22:25:49Z", "format": "date-time", "type": "string" } @@ -47219,7 +47208,7 @@ "properties": { "authenticationRequired": { "description": "Customization types which require authentication may apply only after the users have logged in (e.g. on\nthe Flexera One home page). Customization types which do not require authentication may apply to users who have not\nlogged in (e.g. on the Flexera One login page).", - "example": true, + "example": false, "type": "boolean" }, "description": { @@ -47441,7 +47430,6 @@ "items": { "additionalProperties": true, "example": { - "Natus ipsum ipsam omnis.": "Minus a cum sed recusandae non qui.", "Qui qui amet autem quis.": "Rerum et." }, "type": "object" @@ -47450,7 +47438,7 @@ }, "timestamp": { "description": "The time the event occurred in UTC", - "example": "2006-05-07T05:57:22Z", + "example": "1990-05-23T18:46:50Z", "format": "date-time", "type": "string" } @@ -47468,7 +47456,7 @@ "Iam_FlexeraIamEventOutcomeMedia": { "description": "Information regarding the outcome of the action taken by the principal", "example": { - "result": "success" + "result": "failure" }, "properties": { "result": { @@ -47477,7 +47465,7 @@ "success", "failure" ], - "example": "success", + "example": "failure", "type": "string" } }, @@ -50458,7 +50446,7 @@ "Software" ], "items": { - "example": "Ipsa et sequi dolorum labore quod voluptatem.", + "example": "Iste qui eos adipisci.", "type": "string" }, "type": "array" @@ -50470,7 +50458,7 @@ "msp_admin" ], "items": { - "example": "Vel dolore.", + "example": "Laudantium architecto consequatur deleniti omnis iusto eos.", "type": "string" }, "type": "array" @@ -50655,31 +50643,6 @@ "msp_admin" ] }, - { - "description": "Access to quarterly and annual reports", - "granularScope": { - "description": "Scope for finance department access", - "id": "c1d2e3f4-a5b6-7c8d-9e0f-1a2b3c4d5e6f", - "name": "Finance Department Scope", - "selectedScope": { - "nodeIds": [ - "2.3.", - "1.11.12." - ] - } - }, - "id": "f1e2d3c4-b5a6-7c8d-9e0f-1a2b3c4d5e6f", - "name": "View Financial Reports", - "permissionCategory": "DataAccess", - "permissions": [ - "Hardware", - "Software" - ], - "roleNames": [ - "org_owner", - "msp_admin" - ] - }, { "description": "Access to quarterly and annual reports", "granularScope": { @@ -50836,7 +50799,7 @@ 103 ], "items": { - "example": 2180412257466026200, + "example": 17042095246924220000, "type": "integer" }, "type": "array" @@ -51156,7 +51119,7 @@ "Software" ], "items": { - "example": "Eos dolores dolor praesentium quidem.", + "example": "Provident debitis omnis eum voluptatem necessitatibus.", "type": "string" }, "type": "array" @@ -51168,7 +51131,7 @@ "msp_admin" ], "items": { - "example": "Deleniti nulla itaque molestiae suscipit at.", + "example": "Velit magni natus quos.", "type": "string" }, "type": "array" @@ -51303,7 +51266,7 @@ "Software" ], "items": { - "example": "Debitis omnis.", + "example": "Commodi illum minus nulla aspernatur.", "type": "string" }, "type": "array" @@ -51315,7 +51278,7 @@ "msp_admin" ], "items": { - "example": "Voluptatem necessitatibus inventore velit magni natus quos.", + "example": "Quod ratione hic facilis enim commodi.", "type": "string" }, "type": "array" @@ -56758,7 +56721,7 @@ "1.11.12." ], "items": { - "example": "Hic iste qui eos.", + "example": "Dolor praesentium.", "type": "string" }, "type": "array" @@ -56770,7 +56733,7 @@ "Location/United States of America/Itasca" ], "items": { - "example": "Sed laudantium.", + "example": "Ipsa deleniti nulla itaque.", "type": "string" }, "type": "array" @@ -57343,7 +57306,7 @@ 2002 ], "items": { - "example": 7967003050873464000, + "example": 11514042108799853000, "type": "integer" }, "type": "array" @@ -57574,12 +57537,12 @@ }, "Iam_SingleIdentityProviderID": { "example": { - "id": "Cumque expedita numquam rerum." + "id": "Sequi dolorum labore quod voluptatem ab." }, "properties": { "id": { "description": "The unique identifier for the identity provider", - "example": "Et atque.", + "example": "Occaecati quidem ipsa.", "type": "string" } }, @@ -58096,7 +58059,7 @@ 103 ], "items": { - "example": 10350574219687018000, + "example": 687745363019016400, "type": "integer" }, "type": "array" @@ -58202,6 +58165,7 @@ "example": { "kind": "iam#org-user-list", "nextPage": "/iam/v1/orgs/123/users?skipToken=19u2349", + "prevPage": "/iam/v1/orgs/123/users?skipToken=8b1750u", "values": [ { "accessSource": "org_member", @@ -58254,6 +58218,12 @@ "format": "uri", "type": "string" }, + "prevPage": { + "description": "URL to the previous page of data. The first page of data will not return a prevPage value.", + "example": "/iam/v1/orgs/123/users?skipToken=8b1750u", + "format": "uri", + "type": "string" + }, "values": { "description": "The list of a users.", "example": [ @@ -58299,7 +58269,8 @@ } }, "required": [ - "values" + "values", + "kind" ], "type": "object" }, @@ -58991,6 +58962,1933 @@ "title": "DataFieldResponse", "type": "object" }, + "OptimaRecommendations_DataFieldResponseBody": { + "description": "Extended details data field", + "example": { + "label": "Net Savings", + "value": 1 + }, + "properties": { + "label": { + "description": "Field Label", + "example": "Net Savings", + "type": "string" + }, + "value": { + "description": "Field Value", + "example": 1, + "format": "binary", + "type": "string", + "x-go-type": "interface{}" + } + }, + "required": [ + "label", + "value" + ], + "title": "DataFieldResponseBody", + "type": "object" + }, + "OptimaRecommendations_GroupTreeNodeResponseBody": { + "description": "A group of recommendations sharing the same value of the groupBy field at this level of the tree.", + "example": { + "children": [ + { + "children": [ + {}, + {} + ], + "count": 120, + "totalSavings": 15230.5, + "value": "AWS" + }, + { + "children": [ + {}, + {} + ], + "count": 120, + "totalSavings": 15230.5, + "value": "AWS" + }, + { + "children": [ + {}, + {} + ], + "count": 120, + "totalSavings": 15230.5, + "value": "AWS" + }, + { + "children": [ + {}, + {} + ], + "count": 120, + "totalSavings": 15230.5, + "value": "AWS" + } + ], + "count": 120, + "totalSavings": 15230.5, + "value": "AWS" + }, + "properties": { + "children": { + "description": "The groups of the next groupBy field within this group. Empty at the last level.", + "example": [ + { + "children": [ + {}, + {} + ], + "count": 120, + "totalSavings": 15230.5, + "value": "AWS" + }, + { + "children": [ + {}, + {} + ], + "count": 120, + "totalSavings": 15230.5, + "value": "AWS" + }, + { + "children": [ + {}, + {} + ], + "count": 120, + "totalSavings": 15230.5, + "value": "AWS" + } + ], + "items": { + "$ref": "#/components/schemas/OptimaRecommendations_GroupTreeNodeResponseBody" + }, + "type": "array" + }, + "count": { + "description": "The number of recommendations in this group and its children.", + "example": 120, + "format": "int64", + "type": "integer" + }, + "totalSavings": { + "description": "The total savings of the recommendations in this group and its children.", + "example": 15230.5, + "format": "double", + "type": "number" + }, + "value": { + "description": "The value of the groupBy field at this level. Empty for recommendations that have no value for it. For groupBy billingCenterID this is the billing center ID.", + "example": "AWS", + "type": "string" + } + }, + "required": [ + "value", + "count", + "totalSavings", + "children" + ], + "title": "GroupTreeNodeResponseBody", + "type": "object" + }, + "OptimaRecommendations_RateReductionCombinationLeafResponseBody": { + "example": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + } + ], + "recommendationCount": 410, + "savingsPerMonth": 134171.79 + }, + "properties": { + "byCategory": { + "description": "Per-category breakdown of this combination (the recommendations' policySet), largest savings first, each split by vendor.", + "example": [ + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + } + ], + "items": { + "$ref": "#/components/schemas/OptimaRecommendations_RateReductionSavingsCategoryResponseBody" + }, + "type": "array" + }, + "recommendationCount": { + "description": "Number of recommendations in this combination.", + "example": 410, + "format": "int64", + "type": "integer" + }, + "savingsPerMonth": { + "description": "Savings per month for this exact combination.", + "example": 134171.79, + "format": "double", + "type": "number" + } + }, + "required": [ + "savingsPerMonth", + "recommendationCount", + "byCategory" + ], + "title": "RateReductionCombinationLeafResponseBody", + "type": "object" + }, + "OptimaRecommendations_RateReductionCombinationSelectionResponseBody": { + "example": { + "commitmentTerm": 12, + "commitmentType": "reserved_instance", + "paymentType": "no_upfront" + }, + "properties": { + "commitmentTerm": { + "description": "Commitment term, in months.", + "enum": [ + 12, + 36 + ], + "example": 12, + "format": "int64", + "type": "integer" + }, + "commitmentType": { + "description": "Commitment type.", + "enum": [ + "reserved_instance", + "savings_plan" + ], + "example": "reserved_instance", + "type": "string" + }, + "paymentType": { + "description": "Payment type.", + "enum": [ + "all_upfront", + "partial_upfront", + "no_upfront" + ], + "example": "no_upfront", + "type": "string" + } + }, + "required": [ + "commitmentType", + "commitmentTerm", + "paymentType" + ], + "title": "RateReductionCombinationSelectionResponseBody", + "type": "object" + }, + "OptimaRecommendations_RateReductionSavingsCategoryResponseBody": { + "example": { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + "properties": { + "byVendor": { + "description": "Per-vendor breakdown of this category's savings.", + "example": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "items": { + "$ref": "#/components/schemas/OptimaRecommendations_SavingsSummaryVendorSavingsResponseBody" + }, + "type": "array" + }, + "category": { + "description": "The category name (derived from policySet). Empty for recommendations without a policy set.", + "example": "Savings Plans", + "type": "string" + }, + "recommendationCount": { + "description": "Number of recommendations of this category within the combination.", + "example": 9, + "format": "int64", + "type": "integer" + }, + "savingsPerMonth": { + "description": "Savings per month for this category within the combination.", + "example": 1887.19, + "format": "double", + "type": "number" + } + }, + "required": [ + "category", + "savingsPerMonth", + "recommendationCount", + "byVendor" + ], + "title": "RateReductionSavingsCategoryResponseBody", + "type": "object" + }, + "OptimaRecommendations_RateReductionSavingsResponseBody": { + "example": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 150210.5, + "vendor": "aws" + }, + { + "savingsPerMonth": 51207.62, + "vendor": "azure" + } + ], + "category": "Savings Plans", + "recommendationCount": 312, + "savingsPerMonth": 201418.12 + }, + { + "byVendor": [ + { + "savingsPerMonth": 76308.3, + "vendor": "aws" + } + ], + "category": "Reserved Instances", + "recommendationCount": 185, + "savingsPerMonth": 76308.3 + } + ], + "combinations": { + "reserved_instance": { + "12": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 12103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 12, + "savingsPerMonth": 12103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 2017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 6051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 8, + "savingsPerMonth": 8068.72 + } + ], + "recommendationCount": 20, + "savingsPerMonth": 20171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 36103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 36, + "savingsPerMonth": 36103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 6017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 18051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 24, + "savingsPerMonth": 24068.72 + } + ], + "recommendationCount": 60, + "savingsPerMonth": 60171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 24103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 24, + "savingsPerMonth": 24103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 4017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 12051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 16, + "savingsPerMonth": 16068.72 + } + ], + "recommendationCount": 40, + "savingsPerMonth": 40171.79 + } + }, + "36": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 18103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 18, + "savingsPerMonth": 18103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 3017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 9051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 12, + "savingsPerMonth": 12068.72 + } + ], + "recommendationCount": 30, + "savingsPerMonth": 30171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 54103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 54, + "savingsPerMonth": 54103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 9017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 27051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 36, + "savingsPerMonth": 36068.72 + } + ], + "recommendationCount": 90, + "savingsPerMonth": 90171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 36103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 36, + "savingsPerMonth": 36103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 6017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 18051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 24, + "savingsPerMonth": 24068.72 + } + ], + "recommendationCount": 60, + "savingsPerMonth": 60171.79 + } + } + }, + "savings_plan": { + "12": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 24103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 24, + "savingsPerMonth": 24103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 4017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 12051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 16, + "savingsPerMonth": 16068.72 + } + ], + "recommendationCount": 40, + "savingsPerMonth": 40171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 72103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 72, + "savingsPerMonth": 72103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 12017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 36051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 48, + "savingsPerMonth": 48068.72 + } + ], + "recommendationCount": 120, + "savingsPerMonth": 120171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 48103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 48, + "savingsPerMonth": 48103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 8017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 24051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 32, + "savingsPerMonth": 32068.72 + } + ], + "recommendationCount": 80, + "savingsPerMonth": 80171.79 + } + }, + "36": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 36103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 36, + "savingsPerMonth": 36103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 6017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 18051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 24, + "savingsPerMonth": 24068.72 + } + ], + "recommendationCount": 60, + "savingsPerMonth": 60171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 108103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 108, + "savingsPerMonth": 108103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 18017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 54051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 72, + "savingsPerMonth": 72068.72 + } + ], + "recommendationCount": 180, + "savingsPerMonth": 180171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 72103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 72, + "savingsPerMonth": 72103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 12017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 36051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 48, + "savingsPerMonth": 48068.72 + } + ], + "recommendationCount": 120, + "savingsPerMonth": 120171.79 + } + } + } + }, + "commitmentTerms": [ + 12, + 36 + ], + "commitmentTypes": [ + "reserved_instance", + "savings_plan" + ], + "defaultSelection": { + "commitmentTerm": 12, + "commitmentType": "reserved_instance", + "paymentType": "no_upfront" + }, + "paymentTypes": [ + "all_upfront", + "partial_upfront", + "no_upfront" + ], + "recommendationCount": 497, + "savingsPerMonth": 277726.42 + }, + "properties": { + "byCategory": { + "description": "All Rate Reduction recommendations by category (policySet), whatever the combination, largest savings first, each split by vendor. A recommendation that matches several combinations is counted once.", + "example": [ + { + "byVendor": [ + { + "savingsPerMonth": 150210.5, + "vendor": "aws" + }, + { + "savingsPerMonth": 51207.62, + "vendor": "azure" + } + ], + "category": "Savings Plans", + "recommendationCount": 312, + "savingsPerMonth": 201418.12 + }, + { + "byVendor": [ + { + "savingsPerMonth": 76308.3, + "vendor": "aws" + } + ], + "category": "Reserved Instances", + "recommendationCount": 185, + "savingsPerMonth": 76308.3 + } + ], + "items": { + "$ref": "#/components/schemas/OptimaRecommendations_RateReductionSavingsCategoryResponseBody" + }, + "type": "array" + }, + "combinations": { + "additionalProperties": { + "additionalProperties": { + "additionalProperties": { + "$ref": "#/components/schemas/OptimaRecommendations_RateReductionCombinationLeafResponseBody" + }, + "example": { + "Eaque et ab occaecati aut.": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + } + ], + "recommendationCount": 410, + "savingsPerMonth": 134171.79 + }, + "Necessitatibus cupiditate sunt.": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + } + ], + "recommendationCount": 410, + "savingsPerMonth": 134171.79 + } + }, + "type": "object" + }, + "example": { + "Est voluptatum reiciendis.": { + "Aut ducimus assumenda quisquam.": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + } + ], + "recommendationCount": 410, + "savingsPerMonth": 134171.79 + }, + "Et sint itaque qui sed unde quo.": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + } + ], + "recommendationCount": 410, + "savingsPerMonth": 134171.79 + }, + "Quia nihil maxime ex voluptas ratione.": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + } + ], + "recommendationCount": 410, + "savingsPerMonth": 134171.79 + } + }, + "In dolore a.": { + "Voluptatem sit magni vero.": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + } + ], + "recommendationCount": 410, + "savingsPerMonth": 134171.79 + } + }, + "Voluptatem totam ipsum voluptates ea asperiores.": { + "Non optio soluta et expedita est.": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + } + ], + "recommendationCount": 410, + "savingsPerMonth": 134171.79 + }, + "Sint aut labore et.": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + } + ], + "recommendationCount": 410, + "savingsPerMonth": 134171.79 + }, + "Voluptatum qui quam sint dolore voluptatem.": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + }, + { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 9, + "savingsPerMonth": 1887.19 + } + ], + "recommendationCount": 410, + "savingsPerMonth": 134171.79 + } + } + }, + "type": "object" + }, + "description": "commitmentType -\u003e commitmentTerm (as a string) -\u003e paymentType -\u003e leaf. Every combination is present, including zero-valued ones.", + "example": { + "reserved_instance": { + "12": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 12103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 12, + "savingsPerMonth": 12103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 2017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 6051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 8, + "savingsPerMonth": 8068.72 + } + ], + "recommendationCount": 20, + "savingsPerMonth": 20171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 36103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 36, + "savingsPerMonth": 36103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 6017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 18051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 24, + "savingsPerMonth": 24068.72 + } + ], + "recommendationCount": 60, + "savingsPerMonth": 60171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 24103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 24, + "savingsPerMonth": 24103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 4017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 12051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 16, + "savingsPerMonth": 16068.72 + } + ], + "recommendationCount": 40, + "savingsPerMonth": 40171.79 + } + }, + "36": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 18103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 18, + "savingsPerMonth": 18103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 3017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 9051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 12, + "savingsPerMonth": 12068.72 + } + ], + "recommendationCount": 30, + "savingsPerMonth": 30171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 54103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 54, + "savingsPerMonth": 54103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 9017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 27051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 36, + "savingsPerMonth": 36068.72 + } + ], + "recommendationCount": 90, + "savingsPerMonth": 90171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 36103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 36, + "savingsPerMonth": 36103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 6017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 18051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 24, + "savingsPerMonth": 24068.72 + } + ], + "recommendationCount": 60, + "savingsPerMonth": 60171.79 + } + } + }, + "savings_plan": { + "12": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 24103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 24, + "savingsPerMonth": 24103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 4017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 12051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 16, + "savingsPerMonth": 16068.72 + } + ], + "recommendationCount": 40, + "savingsPerMonth": 40171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 72103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 72, + "savingsPerMonth": 72103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 12017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 36051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 48, + "savingsPerMonth": 48068.72 + } + ], + "recommendationCount": 120, + "savingsPerMonth": 120171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 48103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 48, + "savingsPerMonth": 48103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 8017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 24051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 32, + "savingsPerMonth": 32068.72 + } + ], + "recommendationCount": 80, + "savingsPerMonth": 80171.79 + } + }, + "36": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 36103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 36, + "savingsPerMonth": 36103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 6017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 18051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 24, + "savingsPerMonth": 24068.72 + } + ], + "recommendationCount": 60, + "savingsPerMonth": 60171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 108103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 108, + "savingsPerMonth": 108103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 18017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 54051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 72, + "savingsPerMonth": 72068.72 + } + ], + "recommendationCount": 180, + "savingsPerMonth": 180171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 72103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 72, + "savingsPerMonth": 72103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 12017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 36051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 48, + "savingsPerMonth": 48068.72 + } + ], + "recommendationCount": 120, + "savingsPerMonth": 120171.79 + } + } + } + }, + "type": "object" + }, + "commitmentTerms": { + "description": "The commitment term values (in months) present in the combinations tree, in display order.", + "example": [ + 12, + 36 + ], + "items": { + "example": 1138338271755064000, + "format": "int64", + "type": "integer" + }, + "type": "array" + }, + "commitmentTypes": { + "description": "The commitment type values present in the combinations tree, in display order.", + "example": [ + "reserved_instance", + "savings_plan" + ], + "items": { + "example": "Vitae sapiente deserunt sed.", + "type": "string" + }, + "type": "array" + }, + "defaultSelection": { + "$ref": "#/components/schemas/OptimaRecommendations_RateReductionCombinationSelectionResponseBody" + }, + "paymentTypes": { + "description": "The payment type values present in the combinations tree, in display order.", + "example": [ + "all_upfront", + "partial_upfront", + "no_upfront" + ], + "items": { + "example": "Neque veritatis.", + "type": "string" + }, + "type": "array" + }, + "recommendationCount": { + "description": "Total number of Rate Reduction recommendations, whatever the selected combination.", + "example": 497, + "format": "int64", + "type": "integer" + }, + "savingsPerMonth": { + "description": "Total savings per month of all Rate Reduction recommendations, whatever the selected combination. A recommendation that matches several combinations is counted once.", + "example": 277726.42, + "format": "double", + "type": "number" + } + }, + "required": [ + "savingsPerMonth", + "recommendationCount", + "byCategory", + "commitmentTypes", + "commitmentTerms", + "paymentTypes", + "defaultSelection", + "combinations" + ], + "title": "RateReductionSavingsResponseBody", + "type": "object" + }, "OptimaRecommendations_RecommendationResultResponse": { "description": "A cost-saving recommendation. (default view)", "example": { @@ -59023,6 +60921,7 @@ "value": "50.98" } }, + "generationId": "abc123", "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", "incidentID": "66db5ea9d7048a1c94c09636", "kind": "optima#recommendation", @@ -59040,13 +60939,14 @@ "savings": 361.5, "service": "EC2", "snoozedTargetDate": "2025-01-30", + "source": "rule", "status": "active", "statusReason": "Moved to snoozed since it is not relevant for now", "statusUpdatedAt": "2021-08-22T00:00:00Z", "tags": [ "env=production" ], - "type": "Rate Reduction", + "type": "Usage Reduction", "updatedAt": "2021-08-22T00:00:00Z", "vendor": "AWS" }, @@ -59079,7 +60979,7 @@ }, "customTagDimensions": { "additionalProperties": { - "example": "Voluptatem velit sint esse.", + "example": "Velit consequatur rerum commodi adipisci.", "type": "string" }, "description": "The custom tag dimensions that could be populated by the raw tags of the recommendation.", @@ -59125,6 +61025,11 @@ }, "type": "object" }, + "generationId": { + "description": "Generation ID of the recommendation, present only for hub-backed recommendations.", + "example": "abc123", + "type": "string" + }, "id": { "description": "The ID of the recommendation", "example": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", @@ -59181,7 +61086,7 @@ }, "ruleBasedDimensions": { "additionalProperties": { - "example": "Aperiam voluptatem sint.", + "example": "Est velit omnis voluptatibus aut accusantium sapiente.", "type": "string" }, "description": "The rule based dimensions that are populated in recommendation once rules execute.", @@ -59208,8 +61113,12 @@ "format": "date", "type": "string" }, + "source": { + "description": "The system that produced the recommendation", + "example": "rule", + "type": "string" + }, "status": { - "default": "active", "description": "Current status of the recommendation", "example": "active", "type": "string" @@ -59231,7 +61140,7 @@ "env=production" ], "items": { - "example": "Et eum unde temporibus earum et quia.", + "example": "Qui facilis.", "type": "string" }, "type": "array" @@ -59240,7 +61149,313 @@ "description": "Categorizes the type of recommendation", "enum": [ "Rate Reduction", - "Usage Reduction" + "Usage Reduction", + "Security" + ], + "example": "Usage Reduction", + "type": "string" + }, + "updatedAt": { + "description": "Timestamp when the recommendation was updated.", + "example": "2021-08-22T00:00:00Z", + "format": "date-time", + "type": "string" + }, + "vendor": { + "description": "The name of the cloud vendor", + "example": "AWS", + "type": "string" + } + }, + "required": [ + "kind", + "id", + "recommendation", + "type", + "createdAt", + "updatedAt", + "vendor", + "policySet", + "accountID", + "accountName", + "tags", + "resourceID", + "resourceType", + "region", + "service", + "databaseEngine", + "billingCenterName", + "billingCenterID", + "savings", + "quantityToPurchase", + "incidentID", + "status" + ], + "title": "Mediatype identifier: application/vnd.flexera.optima.recommendation+json; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationResultResponseBody": { + "description": "A cost-saving recommendation. (default view)", + "example": { + "accountID": "1234-5678-9012", + "accountName": "Test Account", + "billingCenterID": "o5g6iXY0AQADmckH0gjaAi", + "billingCenterName": "Marketing", + "createdAt": "2021-08-22T00:00:00Z", + "customTagDimensions": { + "tag_1": "demoMachine", + "tag_2": "randomName" + }, + "databaseEngine": "MySQL", + "details": { + "Location": "centralus", + "Net Savings": "50.98", + "Total RI Quantity to Purchase": 1 + }, + "detailsExtended": { + "location": { + "label": "Location", + "value": "centralus" + }, + "quantityToPurchase": { + "label": "Total RI Quantity to Purchase", + "value": 1 + }, + "savings": { + "label": "Net Savings", + "value": "50.98" + } + }, + "generationId": "abc123", + "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", + "incidentID": "66db5ea9d7048a1c94c09636", + "kind": "optima#recommendation", + "policySet": "Idle Compute Instances", + "quantityToPurchase": 3, + "recommendation": "AWS Savings Plan", + "region": "US West (Oregon)", + "resourceGroup": "RS-DEFAULT-EASTUS", + "resourceID": "vol-0475890d8fc70a26f", + "resourceType": "m5.2xlarge", + "ruleBasedDimensions": { + "rbd_1": "demoMachine", + "rbd_2": "randomName" + }, + "savings": 361.5, + "service": "EC2", + "snoozedTargetDate": "2025-01-30", + "source": "rule", + "status": "active", + "statusReason": "Moved to snoozed since it is not relevant for now", + "statusUpdatedAt": "2021-08-22T00:00:00Z", + "tags": [ + "env=production" + ], + "type": "Usage Reduction", + "updatedAt": "2021-08-22T00:00:00Z", + "vendor": "AWS" + }, + "properties": { + "accountID": { + "description": "The account ID", + "example": "1234-5678-9012", + "type": "string" + }, + "accountName": { + "description": "The account name", + "example": "Test Account", + "type": "string" + }, + "billingCenterID": { + "description": "The ID of the top-level billing center this recommendation is assigned to", + "example": "o5g6iXY0AQADmckH0gjaAi", + "type": "string" + }, + "billingCenterName": { + "description": "The name of the top-level billing center this recommendation is assigned to", + "example": "Marketing", + "type": "string" + }, + "createdAt": { + "description": "Timestamp when the recommendation was created.", + "example": "2021-08-22T00:00:00Z", + "format": "date-time", + "type": "string" + }, + "customTagDimensions": { + "additionalProperties": { + "example": "Et odio aliquam accusamus ut qui deserunt.", + "type": "string" + }, + "description": "The custom tag dimensions that could be populated by the raw tags of the recommendation.", + "example": { + "tag_1": "demoMachine", + "tag_2": "randomName" + }, + "type": "object" + }, + "databaseEngine": { + "description": "The database engine to purchase", + "example": "MySQL", + "type": "string" + }, + "details": { + "additionalProperties": true, + "description": "Additional details about the recommendation.", + "example": { + "Location": "centralus", + "Net Savings": "50.98", + "Total RI Quantity to Purchase": 1 + }, + "type": "object" + }, + "detailsExtended": { + "additionalProperties": { + "$ref": "#/components/schemas/OptimaRecommendations_DataFieldResponseBody" + }, + "description": "Extended details about the recommendation.", + "example": { + "location": { + "label": "Location", + "value": "centralus" + }, + "quantityToPurchase": { + "label": "Total RI Quantity to Purchase", + "value": 1 + }, + "savings": { + "label": "Net Savings", + "value": "50.98" + } + }, + "type": "object" + }, + "generationId": { + "description": "Generation ID of the recommendation, present only for hub-backed recommendations.", + "example": "abc123", + "type": "string" + }, + "id": { + "description": "The ID of the recommendation", + "example": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", + "type": "string" + }, + "incidentID": { + "description": "ID of the incident that recommendation belongs to", + "example": "66db5ea9d7048a1c94c09636", + "type": "string" + }, + "kind": { + "description": "The kind of object", + "enum": [ + "optima#recommendation" + ], + "example": "optima#recommendation", + "type": "string" + }, + "policySet": { + "description": "The policy set, as a way to group similar policies together", + "example": "Idle Compute Instances", + "type": "string" + }, + "quantityToPurchase": { + "description": "Quantity to purchase (e.g. number of reserved instances)", + "example": 3, + "format": "double", + "type": "number" + }, + "recommendation": { + "description": "This is the name or category of recommendation", + "example": "AWS Savings Plan", + "type": "string" + }, + "region": { + "description": "The region in which to purchase", + "example": "US West (Oregon)", + "type": "string" + }, + "resourceGroup": { + "description": "Azure Resource Group", + "example": "RS-DEFAULT-EASTUS", + "type": "string" + }, + "resourceID": { + "description": "The ID of a resource identified in the recommendation", + "example": "vol-0475890d8fc70a26f", + "type": "string" + }, + "resourceType": { + "description": "The resource type, which might be an instance type or volume type, etc.", + "example": "m5.2xlarge", + "type": "string" + }, + "ruleBasedDimensions": { + "additionalProperties": { + "example": "Sed ut accusamus nisi omnis omnis.", + "type": "string" + }, + "description": "The rule based dimensions that are populated in recommendation once rules execute.", + "example": { + "rbd_1": "demoMachine", + "rbd_2": "randomName" + }, + "type": "object" + }, + "savings": { + "description": "Expected dollar savings", + "example": 361.5, + "format": "double", + "type": "number" + }, + "service": { + "description": "The relevant service in which to purchase", + "example": "EC2", + "type": "string" + }, + "snoozedTargetDate": { + "description": "Target date to move recommendation from snoozed to active again", + "example": "2025-01-30", + "format": "date", + "type": "string" + }, + "source": { + "description": "The system that produced the recommendation", + "example": "rule", + "type": "string" + }, + "status": { + "description": "Current status of the recommendation", + "example": "active", + "type": "string" + }, + "statusReason": { + "description": "Extra field to put extra reason once we change “status” value", + "example": "Moved to snoozed since it is not relevant for now", + "type": "string" + }, + "statusUpdatedAt": { + "description": "Date when status was updated", + "example": "2021-08-22T00:00:00Z", + "format": "date-time", + "type": "string" + }, + "tags": { + "description": "The tags found on the resource", + "example": [ + "env=production" + ], + "items": { + "example": "Aspernatur eum incidunt.", + "type": "string" + }, + "type": "array" + }, + "type": { + "description": "Categorizes the type of recommendation", + "enum": [ + "Rate Reduction", + "Usage Reduction", + "Security" ], "example": "Rate Reduction", "type": "string" @@ -59284,14 +61499,226 @@ "title": "Mediatype identifier: application/vnd.flexera.optima.recommendation+json; view=default", "type": "object" }, - "OptimaRecommendations_RecommendationsIndexBadGatewayResponseBody": { - "description": "index_bad_gateway_response_body result type (default view)", + "OptimaRecommendations_RecommendationsExportBadGatewayResponseBody": { + "description": "export_bad_gateway_response_body result type (default view)", + "example": { + "fault": false, + "id": "123abc", + "message": "parameter 'p' must be an integer", + "name": "bad_request", + "temporary": true, + "timeout": false + }, + "properties": { + "fault": { + "description": "Is the error a server-side fault?", + "example": true, + "type": "boolean" + }, + "id": { + "description": "ID is a unique identifier for this particular occurrence of the problem.", + "example": "123abc", + "type": "string" + }, + "message": { + "description": "Message is a human-readable explanation specific to this occurrence of the problem.", + "example": "parameter 'p' must be an integer", + "type": "string" + }, + "name": { + "description": "Name is the name of this class of errors.", + "example": "bad_request", + "type": "string" + }, + "temporary": { + "description": "Is the error temporary?", + "example": true, + "type": "boolean" + }, + "timeout": { + "description": "Is the error a timeout?", + "example": false, + "type": "boolean" + } + }, + "required": [ + "name", + "id", + "message", + "temporary", + "timeout", + "fault" + ], + "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsExportBadRequestResponseBody": { + "description": "export_bad_request_response_body result type (default view)", + "example": { + "fault": false, + "id": "123abc", + "message": "parameter 'p' must be an integer", + "name": "bad_request", + "temporary": false, + "timeout": true + }, + "properties": { + "fault": { + "description": "Is the error a server-side fault?", + "example": true, + "type": "boolean" + }, + "id": { + "description": "ID is a unique identifier for this particular occurrence of the problem.", + "example": "123abc", + "type": "string" + }, + "message": { + "description": "Message is a human-readable explanation specific to this occurrence of the problem.", + "example": "parameter 'p' must be an integer", + "type": "string" + }, + "name": { + "description": "Name is the name of this class of errors.", + "example": "bad_request", + "type": "string" + }, + "temporary": { + "description": "Is the error temporary?", + "example": true, + "type": "boolean" + }, + "timeout": { + "description": "Is the error a timeout?", + "example": false, + "type": "boolean" + } + }, + "required": [ + "name", + "id", + "message", + "temporary", + "timeout", + "fault" + ], + "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsExportConflictResponseBody": { + "description": "export_conflict_response_body result type (default view)", + "example": { + "fault": true, + "id": "123abc", + "message": "parameter 'p' must be an integer", + "name": "bad_request", + "temporary": true, + "timeout": false + }, + "properties": { + "fault": { + "description": "Is the error a server-side fault?", + "example": true, + "type": "boolean" + }, + "id": { + "description": "ID is a unique identifier for this particular occurrence of the problem.", + "example": "123abc", + "type": "string" + }, + "message": { + "description": "Message is a human-readable explanation specific to this occurrence of the problem.", + "example": "parameter 'p' must be an integer", + "type": "string" + }, + "name": { + "description": "Name is the name of this class of errors.", + "example": "bad_request", + "type": "string" + }, + "temporary": { + "description": "Is the error temporary?", + "example": false, + "type": "boolean" + }, + "timeout": { + "description": "Is the error a timeout?", + "example": false, + "type": "boolean" + } + }, + "required": [ + "name", + "id", + "message", + "temporary", + "timeout", + "fault" + ], + "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsExportForbiddenResponseBody": { + "description": "export_forbidden_response_body result type (default view)", "example": { "fault": true, "id": "123abc", "message": "parameter 'p' must be an integer", "name": "bad_request", "temporary": false, + "timeout": false + }, + "properties": { + "fault": { + "description": "Is the error a server-side fault?", + "example": false, + "type": "boolean" + }, + "id": { + "description": "ID is a unique identifier for this particular occurrence of the problem.", + "example": "123abc", + "type": "string" + }, + "message": { + "description": "Message is a human-readable explanation specific to this occurrence of the problem.", + "example": "parameter 'p' must be an integer", + "type": "string" + }, + "name": { + "description": "Name is the name of this class of errors.", + "example": "bad_request", + "type": "string" + }, + "temporary": { + "description": "Is the error temporary?", + "example": false, + "type": "boolean" + }, + "timeout": { + "description": "Is the error a timeout?", + "example": true, + "type": "boolean" + } + }, + "required": [ + "name", + "id", + "message", + "temporary", + "timeout", + "fault" + ], + "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsExportNotFoundResponseBody": { + "description": "export_not_found_response_body result type (default view)", + "example": { + "fault": false, + "id": "123abc", + "message": "parameter 'p' must be an integer", + "name": "bad_request", + "temporary": false, "timeout": true }, "properties": { @@ -59337,8 +61764,8 @@ "title": "Mediatype identifier: application/vnd.goa.error; view=default", "type": "object" }, - "OptimaRecommendations_RecommendationsIndexBadRequestResponseBody": { - "description": "index_bad_request_response_body result type (default view)", + "OptimaRecommendations_RecommendationsGroupTreeBadGatewayResponseBody": { + "description": "groupTree_bad_gateway_response_body result type (default view)", "example": { "fault": true, "id": "123abc", @@ -59350,8 +61777,114 @@ "properties": { "fault": { "description": "Is the error a server-side fault?", + "example": true, + "type": "boolean" + }, + "id": { + "description": "ID is a unique identifier for this particular occurrence of the problem.", + "example": "123abc", + "type": "string" + }, + "message": { + "description": "Message is a human-readable explanation specific to this occurrence of the problem.", + "example": "parameter 'p' must be an integer", + "type": "string" + }, + "name": { + "description": "Name is the name of this class of errors.", + "example": "bad_request", + "type": "string" + }, + "temporary": { + "description": "Is the error temporary?", + "example": false, + "type": "boolean" + }, + "timeout": { + "description": "Is the error a timeout?", + "example": false, + "type": "boolean" + } + }, + "required": [ + "name", + "id", + "message", + "temporary", + "timeout", + "fault" + ], + "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsGroupTreeBadRequestResponseBody": { + "description": "groupTree_bad_request_response_body result type (default view)", + "example": { + "fault": true, + "id": "123abc", + "message": "parameter 'p' must be an integer", + "name": "bad_request", + "temporary": true, + "timeout": false + }, + "properties": { + "fault": { + "description": "Is the error a server-side fault?", + "example": true, + "type": "boolean" + }, + "id": { + "description": "ID is a unique identifier for this particular occurrence of the problem.", + "example": "123abc", + "type": "string" + }, + "message": { + "description": "Message is a human-readable explanation specific to this occurrence of the problem.", + "example": "parameter 'p' must be an integer", + "type": "string" + }, + "name": { + "description": "Name is the name of this class of errors.", + "example": "bad_request", + "type": "string" + }, + "temporary": { + "description": "Is the error temporary?", + "example": true, + "type": "boolean" + }, + "timeout": { + "description": "Is the error a timeout?", "example": false, "type": "boolean" + } + }, + "required": [ + "name", + "id", + "message", + "temporary", + "timeout", + "fault" + ], + "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsGroupTreeConflictResponseBody": { + "description": "groupTree_conflict_response_body result type (default view)", + "example": { + "fault": true, + "id": "123abc", + "message": "parameter 'p' must be an integer", + "name": "bad_request", + "temporary": false, + "timeout": true + }, + "properties": { + "fault": { + "description": "Is the error a server-side fault?", + "example": true, + "type": "boolean" }, "id": { "description": "ID is a unique identifier for this particular occurrence of the problem.", @@ -59390,8 +61923,254 @@ "title": "Mediatype identifier: application/vnd.goa.error; view=default", "type": "object" }, - "OptimaRecommendations_RecommendationsIndexConflictResponseBody": { - "description": "index_conflict_response_body result type (default view)", + "OptimaRecommendations_RecommendationsGroupTreeForbiddenResponseBody": { + "description": "groupTree_forbidden_response_body result type (default view)", + "example": { + "fault": true, + "id": "123abc", + "message": "parameter 'p' must be an integer", + "name": "bad_request", + "temporary": true, + "timeout": true + }, + "properties": { + "fault": { + "description": "Is the error a server-side fault?", + "example": true, + "type": "boolean" + }, + "id": { + "description": "ID is a unique identifier for this particular occurrence of the problem.", + "example": "123abc", + "type": "string" + }, + "message": { + "description": "Message is a human-readable explanation specific to this occurrence of the problem.", + "example": "parameter 'p' must be an integer", + "type": "string" + }, + "name": { + "description": "Name is the name of this class of errors.", + "example": "bad_request", + "type": "string" + }, + "temporary": { + "description": "Is the error temporary?", + "example": false, + "type": "boolean" + }, + "timeout": { + "description": "Is the error a timeout?", + "example": true, + "type": "boolean" + } + }, + "required": [ + "name", + "id", + "message", + "temporary", + "timeout", + "fault" + ], + "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsGroupTreeNotFoundResponseBody": { + "description": "groupTree_not_found_response_body result type (default view)", + "example": { + "fault": true, + "id": "123abc", + "message": "parameter 'p' must be an integer", + "name": "bad_request", + "temporary": true, + "timeout": false + }, + "properties": { + "fault": { + "description": "Is the error a server-side fault?", + "example": true, + "type": "boolean" + }, + "id": { + "description": "ID is a unique identifier for this particular occurrence of the problem.", + "example": "123abc", + "type": "string" + }, + "message": { + "description": "Message is a human-readable explanation specific to this occurrence of the problem.", + "example": "parameter 'p' must be an integer", + "type": "string" + }, + "name": { + "description": "Name is the name of this class of errors.", + "example": "bad_request", + "type": "string" + }, + "temporary": { + "description": "Is the error temporary?", + "example": false, + "type": "boolean" + }, + "timeout": { + "description": "Is the error a timeout?", + "example": false, + "type": "boolean" + } + }, + "required": [ + "name", + "id", + "message", + "temporary", + "timeout", + "fault" + ], + "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsGroupTreeResponseBody": { + "description": "GroupTreeResponseBody result type (default view)", + "example": { + "values": [ + { + "children": [ + { + "children": [], + "count": 41, + "totalSavings": 33747.25, + "value": "aws" + }, + { + "children": [], + "count": 23, + "totalSavings": 14463.1, + "value": "azure" + } + ], + "count": 64, + "totalSavings": 48210.35, + "value": "Idle Compute Instances" + }, + { + "children": [ + { + "children": [], + "count": 212, + "totalSavings": 9120.5, + "value": "aws" + } + ], + "count": 212, + "totalSavings": 9120.5, + "value": "Unattached Volumes" + } + ] + }, + "properties": { + "values": { + "description": "The top-level groups, largest first.", + "example": [ + { + "children": [ + { + "children": [], + "count": 41, + "totalSavings": 33747.25, + "value": "aws" + }, + { + "children": [], + "count": 23, + "totalSavings": 14463.1, + "value": "azure" + } + ], + "count": 64, + "totalSavings": 48210.35, + "value": "Idle Compute Instances" + }, + { + "children": [ + { + "children": [], + "count": 212, + "totalSavings": 9120.5, + "value": "aws" + } + ], + "count": 212, + "totalSavings": 9120.5, + "value": "Unattached Volumes" + } + ], + "items": { + "$ref": "#/components/schemas/OptimaRecommendations_GroupTreeNodeResponseBody" + }, + "type": "array" + } + }, + "required": [ + "values" + ], + "title": "Mediatype identifier: application/vnd.flexera.optima.recommendations_group_tree+json; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsIndexBadGatewayResponseBody": { + "description": "index_bad_gateway_response_body result type (default view)", + "example": { + "fault": false, + "id": "123abc", + "message": "parameter 'p' must be an integer", + "name": "bad_request", + "temporary": true, + "timeout": false + }, + "properties": { + "fault": { + "description": "Is the error a server-side fault?", + "example": false, + "type": "boolean" + }, + "id": { + "description": "ID is a unique identifier for this particular occurrence of the problem.", + "example": "123abc", + "type": "string" + }, + "message": { + "description": "Message is a human-readable explanation specific to this occurrence of the problem.", + "example": "parameter 'p' must be an integer", + "type": "string" + }, + "name": { + "description": "Name is the name of this class of errors.", + "example": "bad_request", + "type": "string" + }, + "temporary": { + "description": "Is the error temporary?", + "example": true, + "type": "boolean" + }, + "timeout": { + "description": "Is the error a timeout?", + "example": true, + "type": "boolean" + } + }, + "required": [ + "name", + "id", + "message", + "temporary", + "timeout", + "fault" + ], + "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsIndexBadRequestResponseBody": { + "description": "index_bad_request_response_body result type (default view)", "example": { "fault": false, "id": "123abc", @@ -59443,6 +62222,59 @@ "title": "Mediatype identifier: application/vnd.goa.error; view=default", "type": "object" }, + "OptimaRecommendations_RecommendationsIndexConflictResponseBody": { + "description": "index_conflict_response_body result type (default view)", + "example": { + "fault": false, + "id": "123abc", + "message": "parameter 'p' must be an integer", + "name": "bad_request", + "temporary": true, + "timeout": true + }, + "properties": { + "fault": { + "description": "Is the error a server-side fault?", + "example": false, + "type": "boolean" + }, + "id": { + "description": "ID is a unique identifier for this particular occurrence of the problem.", + "example": "123abc", + "type": "string" + }, + "message": { + "description": "Message is a human-readable explanation specific to this occurrence of the problem.", + "example": "parameter 'p' must be an integer", + "type": "string" + }, + "name": { + "description": "Name is the name of this class of errors.", + "example": "bad_request", + "type": "string" + }, + "temporary": { + "description": "Is the error temporary?", + "example": false, + "type": "boolean" + }, + "timeout": { + "description": "Is the error a timeout?", + "example": true, + "type": "boolean" + } + }, + "required": [ + "name", + "id", + "message", + "temporary", + "timeout", + "fault" + ], + "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "type": "object" + }, "OptimaRecommendations_RecommendationsIndexForbiddenResponseBody": { "description": "index_forbidden_response_body result type (default view)", "example": { @@ -59450,8 +62282,8 @@ "id": "123abc", "message": "parameter 'p' must be an integer", "name": "bad_request", - "temporary": true, - "timeout": false + "temporary": false, + "timeout": true }, "properties": { "fault": { @@ -59503,13 +62335,13 @@ "id": "123abc", "message": "parameter 'p' must be an integer", "name": "bad_request", - "temporary": true, - "timeout": false + "temporary": false, + "timeout": true }, "properties": { "fault": { "description": "Is the error a server-side fault?", - "example": false, + "example": true, "type": "boolean" }, "id": { @@ -59582,6 +62414,7 @@ "value": "50.98" } }, + "generationId": "abc123", "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", "incidentID": "66db5ea9d7048a1c94c09636", "kind": "optima#recommendation", @@ -59599,6 +62432,7 @@ "savings": 361.5, "service": "EC2", "snoozedTargetDate": "2025-01-30", + "source": "rule", "status": "active", "statusReason": "Moved to snoozed since it is not relevant for now", "statusUpdatedAt": "2021-08-22T00:00:00Z", @@ -59639,6 +62473,7 @@ "value": "50.98" } }, + "generationId": "abc123", "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", "incidentID": "66db5ea9d7048a1c94c09636", "kind": "optima#recommendation", @@ -59656,6 +62491,7 @@ "savings": 361.5, "service": "EC2", "snoozedTargetDate": "2025-01-30", + "source": "rule", "status": "active", "statusReason": "Moved to snoozed since it is not relevant for now", "statusUpdatedAt": "2021-08-22T00:00:00Z", @@ -59696,6 +62532,7 @@ "value": "50.98" } }, + "generationId": "abc123", "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", "incidentID": "66db5ea9d7048a1c94c09636", "kind": "optima#recommendation", @@ -59713,6 +62550,7 @@ "savings": 361.5, "service": "EC2", "snoozedTargetDate": "2025-01-30", + "source": "rule", "status": "active", "statusReason": "Moved to snoozed since it is not relevant for now", "statusUpdatedAt": "2021-08-22T00:00:00Z", @@ -59722,80 +62560,1559 @@ "type": "Rate Reduction", "updatedAt": "2021-08-22T00:00:00Z", "vendor": "AWS" + } + ], + "items": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationResultResponse" + }, + "title": "Mediatype identifier: application/vnd.flexera.optima.recommendation+json; type=collection; view=default", + "type": "array" + }, + "OptimaRecommendations_RecommendationsRecommendationsPagedBadGatewayResponseBody": { + "description": "recommendationsPaged_bad_gateway_response_body result type (default view)", + "example": { + "fault": false, + "id": "123abc", + "message": "parameter 'p' must be an integer", + "name": "bad_request", + "temporary": true, + "timeout": false + }, + "properties": { + "fault": { + "description": "Is the error a server-side fault?", + "example": true, + "type": "boolean" }, - { - "accountID": "1234-5678-9012", - "accountName": "Test Account", - "billingCenterID": "o5g6iXY0AQADmckH0gjaAi", - "billingCenterName": "Marketing", - "createdAt": "2021-08-22T00:00:00Z", - "customTagDimensions": { - "tag_1": "demoMachine", - "tag_2": "randomName" + "id": { + "description": "ID is a unique identifier for this particular occurrence of the problem.", + "example": "123abc", + "type": "string" + }, + "message": { + "description": "Message is a human-readable explanation specific to this occurrence of the problem.", + "example": "parameter 'p' must be an integer", + "type": "string" + }, + "name": { + "description": "Name is the name of this class of errors.", + "example": "bad_request", + "type": "string" + }, + "temporary": { + "description": "Is the error temporary?", + "example": true, + "type": "boolean" + }, + "timeout": { + "description": "Is the error a timeout?", + "example": true, + "type": "boolean" + } + }, + "required": [ + "name", + "id", + "message", + "temporary", + "timeout", + "fault" + ], + "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsRecommendationsPagedBadRequestResponseBody": { + "description": "recommendationsPaged_bad_request_response_body result type (default view)", + "example": { + "fault": true, + "id": "123abc", + "message": "parameter 'p' must be an integer", + "name": "bad_request", + "temporary": true, + "timeout": false + }, + "properties": { + "fault": { + "description": "Is the error a server-side fault?", + "example": false, + "type": "boolean" + }, + "id": { + "description": "ID is a unique identifier for this particular occurrence of the problem.", + "example": "123abc", + "type": "string" + }, + "message": { + "description": "Message is a human-readable explanation specific to this occurrence of the problem.", + "example": "parameter 'p' must be an integer", + "type": "string" + }, + "name": { + "description": "Name is the name of this class of errors.", + "example": "bad_request", + "type": "string" + }, + "temporary": { + "description": "Is the error temporary?", + "example": false, + "type": "boolean" + }, + "timeout": { + "description": "Is the error a timeout?", + "example": false, + "type": "boolean" + } + }, + "required": [ + "name", + "id", + "message", + "temporary", + "timeout", + "fault" + ], + "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsRecommendationsPagedConflictResponseBody": { + "description": "recommendationsPaged_conflict_response_body result type (default view)", + "example": { + "fault": true, + "id": "123abc", + "message": "parameter 'p' must be an integer", + "name": "bad_request", + "temporary": true, + "timeout": true + }, + "properties": { + "fault": { + "description": "Is the error a server-side fault?", + "example": false, + "type": "boolean" + }, + "id": { + "description": "ID is a unique identifier for this particular occurrence of the problem.", + "example": "123abc", + "type": "string" + }, + "message": { + "description": "Message is a human-readable explanation specific to this occurrence of the problem.", + "example": "parameter 'p' must be an integer", + "type": "string" + }, + "name": { + "description": "Name is the name of this class of errors.", + "example": "bad_request", + "type": "string" + }, + "temporary": { + "description": "Is the error temporary?", + "example": true, + "type": "boolean" + }, + "timeout": { + "description": "Is the error a timeout?", + "example": false, + "type": "boolean" + } + }, + "required": [ + "name", + "id", + "message", + "temporary", + "timeout", + "fault" + ], + "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsRecommendationsPagedForbiddenResponseBody": { + "description": "recommendationsPaged_forbidden_response_body result type (default view)", + "example": { + "fault": false, + "id": "123abc", + "message": "parameter 'p' must be an integer", + "name": "bad_request", + "temporary": false, + "timeout": true + }, + "properties": { + "fault": { + "description": "Is the error a server-side fault?", + "example": true, + "type": "boolean" + }, + "id": { + "description": "ID is a unique identifier for this particular occurrence of the problem.", + "example": "123abc", + "type": "string" + }, + "message": { + "description": "Message is a human-readable explanation specific to this occurrence of the problem.", + "example": "parameter 'p' must be an integer", + "type": "string" + }, + "name": { + "description": "Name is the name of this class of errors.", + "example": "bad_request", + "type": "string" + }, + "temporary": { + "description": "Is the error temporary?", + "example": true, + "type": "boolean" + }, + "timeout": { + "description": "Is the error a timeout?", + "example": true, + "type": "boolean" + } + }, + "required": [ + "name", + "id", + "message", + "temporary", + "timeout", + "fault" + ], + "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsRecommendationsPagedNotFoundResponseBody": { + "description": "recommendationsPaged_not_found_response_body result type (default view)", + "example": { + "fault": false, + "id": "123abc", + "message": "parameter 'p' must be an integer", + "name": "bad_request", + "temporary": true, + "timeout": false + }, + "properties": { + "fault": { + "description": "Is the error a server-side fault?", + "example": true, + "type": "boolean" + }, + "id": { + "description": "ID is a unique identifier for this particular occurrence of the problem.", + "example": "123abc", + "type": "string" + }, + "message": { + "description": "Message is a human-readable explanation specific to this occurrence of the problem.", + "example": "parameter 'p' must be an integer", + "type": "string" + }, + "name": { + "description": "Name is the name of this class of errors.", + "example": "bad_request", + "type": "string" + }, + "temporary": { + "description": "Is the error temporary?", + "example": false, + "type": "boolean" + }, + "timeout": { + "description": "Is the error a timeout?", + "example": false, + "type": "boolean" + } + }, + "required": [ + "name", + "id", + "message", + "temporary", + "timeout", + "fault" + ], + "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsRecommendationsPagedResponseBody": { + "description": "RecommendationsPagedResponseBody result type (default view)", + "example": { + "count": 50, + "nextPage": "/recommendations/orgs/{orgID}/recommendations/paged?skipToken=19u2349", + "prevPage": "/recommendations/orgs/{orgID}/recommendations/paged?skipToken=8b1750u", + "total": 1240, + "values": [ + { + "accountID": "1234-5678-9012", + "accountName": "Test Account", + "billingCenterID": "o5g6iXY0AQADmckH0gjaAi", + "billingCenterName": "Marketing", + "createdAt": "2021-08-22T00:00:00Z", + "customTagDimensions": { + "tag_1": "demoMachine", + "tag_2": "randomName" + }, + "databaseEngine": "MySQL", + "details": { + "Location": "centralus", + "Net Savings": "50.98", + "Total RI Quantity to Purchase": 1 + }, + "detailsExtended": { + "location": { + "label": "Location", + "value": "centralus" + }, + "quantityToPurchase": { + "label": "Total RI Quantity to Purchase", + "value": 1 + }, + "savings": { + "label": "Net Savings", + "value": "50.98" + } + }, + "generationId": "abc123", + "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", + "incidentID": "66db5ea9d7048a1c94c09636", + "kind": "optima#recommendation", + "policySet": "Idle Compute Instances", + "quantityToPurchase": 3, + "recommendation": "AWS Savings Plan", + "region": "US West (Oregon)", + "resourceGroup": "RS-DEFAULT-EASTUS", + "resourceID": "vol-0475890d8fc70a26f", + "resourceType": "m5.2xlarge", + "ruleBasedDimensions": { + "rbd_1": "demoMachine", + "rbd_2": "randomName" + }, + "savings": 361.5, + "service": "EC2", + "snoozedTargetDate": "2025-01-30", + "source": "rule", + "status": "active", + "statusReason": "Moved to snoozed since it is not relevant for now", + "statusUpdatedAt": "2021-08-22T00:00:00Z", + "tags": [ + "env=production" + ], + "type": "Rate Reduction", + "updatedAt": "2021-08-22T00:00:00Z", + "vendor": "AWS" }, - "databaseEngine": "MySQL", - "details": { - "Location": "centralus", - "Net Savings": "50.98", - "Total RI Quantity to Purchase": 1 + { + "accountID": "1234-5678-9012", + "accountName": "Test Account", + "billingCenterID": "o5g6iXY0AQADmckH0gjaAi", + "billingCenterName": "Marketing", + "createdAt": "2021-08-22T00:00:00Z", + "customTagDimensions": { + "tag_1": "demoMachine", + "tag_2": "randomName" + }, + "databaseEngine": "MySQL", + "details": { + "Location": "centralus", + "Net Savings": "50.98", + "Total RI Quantity to Purchase": 1 + }, + "detailsExtended": { + "location": { + "label": "Location", + "value": "centralus" + }, + "quantityToPurchase": { + "label": "Total RI Quantity to Purchase", + "value": 1 + }, + "savings": { + "label": "Net Savings", + "value": "50.98" + } + }, + "generationId": "abc123", + "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", + "incidentID": "66db5ea9d7048a1c94c09636", + "kind": "optima#recommendation", + "policySet": "Idle Compute Instances", + "quantityToPurchase": 3, + "recommendation": "AWS Savings Plan", + "region": "US West (Oregon)", + "resourceGroup": "RS-DEFAULT-EASTUS", + "resourceID": "vol-0475890d8fc70a26f", + "resourceType": "m5.2xlarge", + "ruleBasedDimensions": { + "rbd_1": "demoMachine", + "rbd_2": "randomName" + }, + "savings": 361.5, + "service": "EC2", + "snoozedTargetDate": "2025-01-30", + "source": "rule", + "status": "active", + "statusReason": "Moved to snoozed since it is not relevant for now", + "statusUpdatedAt": "2021-08-22T00:00:00Z", + "tags": [ + "env=production" + ], + "type": "Rate Reduction", + "updatedAt": "2021-08-22T00:00:00Z", + "vendor": "AWS" + } + ] + }, + "properties": { + "count": { + "description": "The number of recommendations in this page.", + "example": 50, + "format": "int64", + "type": "integer" + }, + "nextPage": { + "description": "URL to the next page of data. If nextPage is not present, the returned page of data is the last.", + "example": "/recommendations/orgs/{orgID}/recommendations/paged?skipToken=19u2349", + "format": "uri", + "type": "string" + }, + "prevPage": { + "description": "URL to the previous page of data. The first page of data will not return a prevPage value.", + "example": "/recommendations/orgs/{orgID}/recommendations/paged?skipToken=8b1750u", + "format": "uri", + "type": "string" + }, + "total": { + "description": "The total number of recommendations matching the filter, across all pages.", + "example": 1240, + "format": "int64", + "type": "integer" + }, + "values": { + "description": "The recommendations in this page.", + "example": [ + { + "accountID": "1234-5678-9012", + "accountName": "Test Account", + "billingCenterID": "o5g6iXY0AQADmckH0gjaAi", + "billingCenterName": "Marketing", + "createdAt": "2021-08-22T00:00:00Z", + "customTagDimensions": { + "tag_1": "demoMachine", + "tag_2": "randomName" + }, + "databaseEngine": "MySQL", + "details": { + "Location": "centralus", + "Net Savings": "50.98", + "Total RI Quantity to Purchase": 1 + }, + "detailsExtended": { + "location": { + "label": "Location", + "value": "centralus" + }, + "quantityToPurchase": { + "label": "Total RI Quantity to Purchase", + "value": 1 + }, + "savings": { + "label": "Net Savings", + "value": "50.98" + } + }, + "generationId": "abc123", + "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", + "incidentID": "66db5ea9d7048a1c94c09636", + "kind": "optima#recommendation", + "policySet": "Idle Compute Instances", + "quantityToPurchase": 3, + "recommendation": "AWS Savings Plan", + "region": "US West (Oregon)", + "resourceGroup": "RS-DEFAULT-EASTUS", + "resourceID": "vol-0475890d8fc70a26f", + "resourceType": "m5.2xlarge", + "ruleBasedDimensions": { + "rbd_1": "demoMachine", + "rbd_2": "randomName" + }, + "savings": 361.5, + "service": "EC2", + "snoozedTargetDate": "2025-01-30", + "source": "rule", + "status": "active", + "statusReason": "Moved to snoozed since it is not relevant for now", + "statusUpdatedAt": "2021-08-22T00:00:00Z", + "tags": [ + "env=production" + ], + "type": "Rate Reduction", + "updatedAt": "2021-08-22T00:00:00Z", + "vendor": "AWS" + }, + { + "accountID": "1234-5678-9012", + "accountName": "Test Account", + "billingCenterID": "o5g6iXY0AQADmckH0gjaAi", + "billingCenterName": "Marketing", + "createdAt": "2021-08-22T00:00:00Z", + "customTagDimensions": { + "tag_1": "demoMachine", + "tag_2": "randomName" + }, + "databaseEngine": "MySQL", + "details": { + "Location": "centralus", + "Net Savings": "50.98", + "Total RI Quantity to Purchase": 1 + }, + "detailsExtended": { + "location": { + "label": "Location", + "value": "centralus" + }, + "quantityToPurchase": { + "label": "Total RI Quantity to Purchase", + "value": 1 + }, + "savings": { + "label": "Net Savings", + "value": "50.98" + } + }, + "generationId": "abc123", + "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", + "incidentID": "66db5ea9d7048a1c94c09636", + "kind": "optima#recommendation", + "policySet": "Idle Compute Instances", + "quantityToPurchase": 3, + "recommendation": "AWS Savings Plan", + "region": "US West (Oregon)", + "resourceGroup": "RS-DEFAULT-EASTUS", + "resourceID": "vol-0475890d8fc70a26f", + "resourceType": "m5.2xlarge", + "ruleBasedDimensions": { + "rbd_1": "demoMachine", + "rbd_2": "randomName" + }, + "savings": 361.5, + "service": "EC2", + "snoozedTargetDate": "2025-01-30", + "source": "rule", + "status": "active", + "statusReason": "Moved to snoozed since it is not relevant for now", + "statusUpdatedAt": "2021-08-22T00:00:00Z", + "tags": [ + "env=production" + ], + "type": "Rate Reduction", + "updatedAt": "2021-08-22T00:00:00Z", + "vendor": "AWS" + }, + { + "accountID": "1234-5678-9012", + "accountName": "Test Account", + "billingCenterID": "o5g6iXY0AQADmckH0gjaAi", + "billingCenterName": "Marketing", + "createdAt": "2021-08-22T00:00:00Z", + "customTagDimensions": { + "tag_1": "demoMachine", + "tag_2": "randomName" + }, + "databaseEngine": "MySQL", + "details": { + "Location": "centralus", + "Net Savings": "50.98", + "Total RI Quantity to Purchase": 1 + }, + "detailsExtended": { + "location": { + "label": "Location", + "value": "centralus" + }, + "quantityToPurchase": { + "label": "Total RI Quantity to Purchase", + "value": 1 + }, + "savings": { + "label": "Net Savings", + "value": "50.98" + } + }, + "generationId": "abc123", + "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", + "incidentID": "66db5ea9d7048a1c94c09636", + "kind": "optima#recommendation", + "policySet": "Idle Compute Instances", + "quantityToPurchase": 3, + "recommendation": "AWS Savings Plan", + "region": "US West (Oregon)", + "resourceGroup": "RS-DEFAULT-EASTUS", + "resourceID": "vol-0475890d8fc70a26f", + "resourceType": "m5.2xlarge", + "ruleBasedDimensions": { + "rbd_1": "demoMachine", + "rbd_2": "randomName" + }, + "savings": 361.5, + "service": "EC2", + "snoozedTargetDate": "2025-01-30", + "source": "rule", + "status": "active", + "statusReason": "Moved to snoozed since it is not relevant for now", + "statusUpdatedAt": "2021-08-22T00:00:00Z", + "tags": [ + "env=production" + ], + "type": "Rate Reduction", + "updatedAt": "2021-08-22T00:00:00Z", + "vendor": "AWS" + }, + { + "accountID": "1234-5678-9012", + "accountName": "Test Account", + "billingCenterID": "o5g6iXY0AQADmckH0gjaAi", + "billingCenterName": "Marketing", + "createdAt": "2021-08-22T00:00:00Z", + "customTagDimensions": { + "tag_1": "demoMachine", + "tag_2": "randomName" + }, + "databaseEngine": "MySQL", + "details": { + "Location": "centralus", + "Net Savings": "50.98", + "Total RI Quantity to Purchase": 1 + }, + "detailsExtended": { + "location": { + "label": "Location", + "value": "centralus" + }, + "quantityToPurchase": { + "label": "Total RI Quantity to Purchase", + "value": 1 + }, + "savings": { + "label": "Net Savings", + "value": "50.98" + } + }, + "generationId": "abc123", + "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", + "incidentID": "66db5ea9d7048a1c94c09636", + "kind": "optima#recommendation", + "policySet": "Idle Compute Instances", + "quantityToPurchase": 3, + "recommendation": "AWS Savings Plan", + "region": "US West (Oregon)", + "resourceGroup": "RS-DEFAULT-EASTUS", + "resourceID": "vol-0475890d8fc70a26f", + "resourceType": "m5.2xlarge", + "ruleBasedDimensions": { + "rbd_1": "demoMachine", + "rbd_2": "randomName" + }, + "savings": 361.5, + "service": "EC2", + "snoozedTargetDate": "2025-01-30", + "source": "rule", + "status": "active", + "statusReason": "Moved to snoozed since it is not relevant for now", + "statusUpdatedAt": "2021-08-22T00:00:00Z", + "tags": [ + "env=production" + ], + "type": "Rate Reduction", + "updatedAt": "2021-08-22T00:00:00Z", + "vendor": "AWS" + } + ], + "items": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationResultResponseBody" }, - "detailsExtended": { - "location": { - "label": "Location", - "value": "centralus" + "type": "array" + } + }, + "required": [ + "count", + "total", + "values" + ], + "title": "Mediatype identifier: application/vnd.flexera.optima.recommendations_list+json; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsSavingsSummaryBadGatewayResponseBody": { + "description": "savingsSummary_bad_gateway_response_body result type (default view)", + "example": { + "fault": false, + "id": "123abc", + "message": "parameter 'p' must be an integer", + "name": "bad_request", + "temporary": false, + "timeout": true + }, + "properties": { + "fault": { + "description": "Is the error a server-side fault?", + "example": false, + "type": "boolean" + }, + "id": { + "description": "ID is a unique identifier for this particular occurrence of the problem.", + "example": "123abc", + "type": "string" + }, + "message": { + "description": "Message is a human-readable explanation specific to this occurrence of the problem.", + "example": "parameter 'p' must be an integer", + "type": "string" + }, + "name": { + "description": "Name is the name of this class of errors.", + "example": "bad_request", + "type": "string" + }, + "temporary": { + "description": "Is the error temporary?", + "example": false, + "type": "boolean" + }, + "timeout": { + "description": "Is the error a timeout?", + "example": false, + "type": "boolean" + } + }, + "required": [ + "name", + "id", + "message", + "temporary", + "timeout", + "fault" + ], + "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsSavingsSummaryBadRequestResponseBody": { + "description": "savingsSummary_bad_request_response_body result type (default view)", + "example": { + "fault": true, + "id": "123abc", + "message": "parameter 'p' must be an integer", + "name": "bad_request", + "temporary": false, + "timeout": false + }, + "properties": { + "fault": { + "description": "Is the error a server-side fault?", + "example": false, + "type": "boolean" + }, + "id": { + "description": "ID is a unique identifier for this particular occurrence of the problem.", + "example": "123abc", + "type": "string" + }, + "message": { + "description": "Message is a human-readable explanation specific to this occurrence of the problem.", + "example": "parameter 'p' must be an integer", + "type": "string" + }, + "name": { + "description": "Name is the name of this class of errors.", + "example": "bad_request", + "type": "string" + }, + "temporary": { + "description": "Is the error temporary?", + "example": true, + "type": "boolean" + }, + "timeout": { + "description": "Is the error a timeout?", + "example": true, + "type": "boolean" + } + }, + "required": [ + "name", + "id", + "message", + "temporary", + "timeout", + "fault" + ], + "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsSavingsSummaryConflictResponseBody": { + "description": "savingsSummary_conflict_response_body result type (default view)", + "example": { + "fault": true, + "id": "123abc", + "message": "parameter 'p' must be an integer", + "name": "bad_request", + "temporary": false, + "timeout": false + }, + "properties": { + "fault": { + "description": "Is the error a server-side fault?", + "example": false, + "type": "boolean" + }, + "id": { + "description": "ID is a unique identifier for this particular occurrence of the problem.", + "example": "123abc", + "type": "string" + }, + "message": { + "description": "Message is a human-readable explanation specific to this occurrence of the problem.", + "example": "parameter 'p' must be an integer", + "type": "string" + }, + "name": { + "description": "Name is the name of this class of errors.", + "example": "bad_request", + "type": "string" + }, + "temporary": { + "description": "Is the error temporary?", + "example": true, + "type": "boolean" + }, + "timeout": { + "description": "Is the error a timeout?", + "example": false, + "type": "boolean" + } + }, + "required": [ + "name", + "id", + "message", + "temporary", + "timeout", + "fault" + ], + "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsSavingsSummaryForbiddenResponseBody": { + "description": "savingsSummary_forbidden_response_body result type (default view)", + "example": { + "fault": true, + "id": "123abc", + "message": "parameter 'p' must be an integer", + "name": "bad_request", + "temporary": false, + "timeout": true + }, + "properties": { + "fault": { + "description": "Is the error a server-side fault?", + "example": false, + "type": "boolean" + }, + "id": { + "description": "ID is a unique identifier for this particular occurrence of the problem.", + "example": "123abc", + "type": "string" + }, + "message": { + "description": "Message is a human-readable explanation specific to this occurrence of the problem.", + "example": "parameter 'p' must be an integer", + "type": "string" + }, + "name": { + "description": "Name is the name of this class of errors.", + "example": "bad_request", + "type": "string" + }, + "temporary": { + "description": "Is the error temporary?", + "example": true, + "type": "boolean" + }, + "timeout": { + "description": "Is the error a timeout?", + "example": true, + "type": "boolean" + } + }, + "required": [ + "name", + "id", + "message", + "temporary", + "timeout", + "fault" + ], + "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsSavingsSummaryNotFoundResponseBody": { + "description": "savingsSummary_not_found_response_body result type (default view)", + "example": { + "fault": true, + "id": "123abc", + "message": "parameter 'p' must be an integer", + "name": "bad_request", + "temporary": true, + "timeout": false + }, + "properties": { + "fault": { + "description": "Is the error a server-side fault?", + "example": true, + "type": "boolean" + }, + "id": { + "description": "ID is a unique identifier for this particular occurrence of the problem.", + "example": "123abc", + "type": "string" + }, + "message": { + "description": "Message is a human-readable explanation specific to this occurrence of the problem.", + "example": "parameter 'p' must be an integer", + "type": "string" + }, + "name": { + "description": "Name is the name of this class of errors.", + "example": "bad_request", + "type": "string" + }, + "temporary": { + "description": "Is the error temporary?", + "example": true, + "type": "boolean" + }, + "timeout": { + "description": "Is the error a timeout?", + "example": false, + "type": "boolean" + } + }, + "required": [ + "name", + "id", + "message", + "temporary", + "timeout", + "fault" + ], + "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsSavingsSummaryResponseBody": { + "description": "SavingsSummaryResponseBody result type (default view)", + "example": { + "rateReductionSavings": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 150210.5, + "vendor": "aws" + }, + { + "savingsPerMonth": 51207.62, + "vendor": "azure" + } + ], + "category": "Savings Plans", + "recommendationCount": 312, + "savingsPerMonth": 201418.12 }, - "quantityToPurchase": { - "label": "Total RI Quantity to Purchase", - "value": 1 + { + "byVendor": [ + { + "savingsPerMonth": 76308.3, + "vendor": "aws" + } + ], + "category": "Reserved Instances", + "recommendationCount": 185, + "savingsPerMonth": 76308.3 + } + ], + "combinations": { + "reserved_instance": { + "12": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 12103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 12, + "savingsPerMonth": 12103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 2017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 6051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 8, + "savingsPerMonth": 8068.72 + } + ], + "recommendationCount": 20, + "savingsPerMonth": 20171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 36103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 36, + "savingsPerMonth": 36103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 6017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 18051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 24, + "savingsPerMonth": 24068.72 + } + ], + "recommendationCount": 60, + "savingsPerMonth": 60171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 24103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 24, + "savingsPerMonth": 24103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 4017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 12051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 16, + "savingsPerMonth": 16068.72 + } + ], + "recommendationCount": 40, + "savingsPerMonth": 40171.79 + } + }, + "36": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 18103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 18, + "savingsPerMonth": 18103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 3017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 9051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 12, + "savingsPerMonth": 12068.72 + } + ], + "recommendationCount": 30, + "savingsPerMonth": 30171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 54103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 54, + "savingsPerMonth": 54103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 9017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 27051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 36, + "savingsPerMonth": 36068.72 + } + ], + "recommendationCount": 90, + "savingsPerMonth": 90171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 36103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 36, + "savingsPerMonth": 36103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 6017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 18051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 24, + "savingsPerMonth": 24068.72 + } + ], + "recommendationCount": 60, + "savingsPerMonth": 60171.79 + } + } }, - "savings": { - "label": "Net Savings", - "value": "50.98" + "savings_plan": { + "12": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 24103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 24, + "savingsPerMonth": 24103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 4017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 12051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 16, + "savingsPerMonth": 16068.72 + } + ], + "recommendationCount": 40, + "savingsPerMonth": 40171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 72103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 72, + "savingsPerMonth": 72103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 12017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 36051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 48, + "savingsPerMonth": 48068.72 + } + ], + "recommendationCount": 120, + "savingsPerMonth": 120171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 48103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 48, + "savingsPerMonth": 48103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 8017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 24051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 32, + "savingsPerMonth": 32068.72 + } + ], + "recommendationCount": 80, + "savingsPerMonth": 80171.79 + } + }, + "36": { + "all_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 36103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 36, + "savingsPerMonth": 36103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 6017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 18051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 24, + "savingsPerMonth": 24068.72 + } + ], + "recommendationCount": 60, + "savingsPerMonth": 60171.79 + }, + "no_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 108103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 108, + "savingsPerMonth": 108103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 18017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 54051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 72, + "savingsPerMonth": 72068.72 + } + ], + "recommendationCount": 180, + "savingsPerMonth": 180171.79 + }, + "partial_upfront": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 72103.07, + "vendor": "aws" + } + ], + "category": "Savings Plans", + "recommendationCount": 72, + "savingsPerMonth": 72103.07 + }, + { + "byVendor": [ + { + "savingsPerMonth": 12017.18, + "vendor": "aws" + }, + { + "savingsPerMonth": 36051.54, + "vendor": "azure" + } + ], + "category": "AWS Trusted Advisor", + "recommendationCount": 48, + "savingsPerMonth": 48068.72 + } + ], + "recommendationCount": 120, + "savingsPerMonth": 120171.79 + } + } } }, - "id": "C94ACE00-272B-4ADE-B6C2-3C2C0869E130", - "incidentID": "66db5ea9d7048a1c94c09636", - "kind": "optima#recommendation", - "policySet": "Idle Compute Instances", - "quantityToPurchase": 3, - "recommendation": "AWS Savings Plan", - "region": "US West (Oregon)", - "resourceGroup": "RS-DEFAULT-EASTUS", - "resourceID": "vol-0475890d8fc70a26f", - "resourceType": "m5.2xlarge", - "ruleBasedDimensions": { - "rbd_1": "demoMachine", - "rbd_2": "randomName" + "commitmentTerms": [ + 12, + 36 + ], + "commitmentTypes": [ + "reserved_instance", + "savings_plan" + ], + "defaultSelection": { + "commitmentTerm": 12, + "commitmentType": "reserved_instance", + "paymentType": "no_upfront" }, - "savings": 361.5, - "service": "EC2", - "snoozedTargetDate": "2025-01-30", - "status": "active", - "statusReason": "Moved to snoozed since it is not relevant for now", - "statusUpdatedAt": "2021-08-22T00:00:00Z", - "tags": [ - "env=production" + "paymentTypes": [ + "all_upfront", + "partial_upfront", + "no_upfront" ], - "type": "Rate Reduction", - "updatedAt": "2021-08-22T00:00:00Z", - "vendor": "AWS" + "recommendationCount": 497, + "savingsPerMonth": 277726.42 + }, + "totalPotentialSavings": { + "recommendationCount": 1290, + "savingsPerMonth": 743599.2 + }, + "usageReductionSavings": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 33747.25, + "vendor": "aws" + }, + { + "savingsPerMonth": 14463.1, + "vendor": "azure" + } + ], + "category": "Idle Compute Instances", + "recommendationCount": 64, + "savingsPerMonth": 48210.35 + }, + { + "byVendor": [ + { + "savingsPerMonth": 9120.5, + "vendor": "aws" + } + ], + "category": "Unattached Volumes", + "recommendationCount": 212, + "savingsPerMonth": 9120.5 + } + ], + "byStatus": [ + { + "recommendationCount": 880, + "savingsPerMonth": 609427.41, + "status": "active" + }, + { + "recommendationCount": 6, + "savingsPerMonth": 3120.5, + "status": "snoozed" + }, + { + "recommendationCount": 4, + "savingsPerMonth": 1874.2, + "status": "rejected" + } + ], + "recommendationCount": 890, + "savingsPerMonth": 609427.41 } - ], - "items": { - "$ref": "#/components/schemas/OptimaRecommendations_RecommendationResultResponse" }, - "title": "Mediatype identifier: application/vnd.flexera.optima.recommendation+json; type=collection; view=default", - "type": "array" + "properties": { + "rateReductionSavings": { + "$ref": "#/components/schemas/OptimaRecommendations_RateReductionSavingsResponseBody" + }, + "totalPotentialSavings": { + "example": { + "recommendationCount": 1290, + "savingsPerMonth": 743599.2 + }, + "properties": { + "recommendationCount": { + "description": "Total recommendation count across all types, regardless of status.", + "example": 1290, + "format": "int64", + "type": "integer" + }, + "savingsPerMonth": { + "description": "Active-only Usage Reduction savings plus all Rate Reduction savings.", + "example": 743599.2, + "format": "double", + "type": "number" + } + }, + "required": [ + "savingsPerMonth", + "recommendationCount" + ], + "type": "object" + }, + "usageReductionSavings": { + "$ref": "#/components/schemas/OptimaRecommendations_UsageReductionSavingsResponseBody" + } + }, + "required": [ + "totalPotentialSavings", + "rateReductionSavings", + "usageReductionSavings" + ], + "title": "Mediatype identifier: application/vnd.flexera.optima.savings_summary+json; view=default", + "type": "object" }, "OptimaRecommendations_RecommendationsUpdateStatusBadGatewayResponseBody": { "description": "updateStatus_bad_gateway_response_body result type (default view)", + "example": { + "fault": true, + "id": "123abc", + "message": "parameter 'p' must be an integer", + "name": "bad_request", + "temporary": true, + "timeout": false + }, + "properties": { + "fault": { + "description": "Is the error a server-side fault?", + "example": true, + "type": "boolean" + }, + "id": { + "description": "ID is a unique identifier for this particular occurrence of the problem.", + "example": "123abc", + "type": "string" + }, + "message": { + "description": "Message is a human-readable explanation specific to this occurrence of the problem.", + "example": "parameter 'p' must be an integer", + "type": "string" + }, + "name": { + "description": "Name is the name of this class of errors.", + "example": "bad_request", + "type": "string" + }, + "temporary": { + "description": "Is the error temporary?", + "example": false, + "type": "boolean" + }, + "timeout": { + "description": "Is the error a timeout?", + "example": true, + "type": "boolean" + } + }, + "required": [ + "name", + "id", + "message", + "temporary", + "timeout", + "fault" + ], + "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsUpdateStatusBadRequestResponseBody": { + "description": "updateStatus_bad_request_response_body result type (default view)", "example": { "fault": false, "id": "123abc", "message": "parameter 'p' must be an integer", "name": "bad_request", "temporary": false, - "timeout": true + "timeout": false }, "properties": { "fault": { @@ -59820,8 +64137,61 @@ }, "temporary": { "description": "Is the error temporary?", + "example": false, + "type": "boolean" + }, + "timeout": { + "description": "Is the error a timeout?", "example": true, "type": "boolean" + } + }, + "required": [ + "name", + "id", + "message", + "temporary", + "timeout", + "fault" + ], + "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "type": "object" + }, + "OptimaRecommendations_RecommendationsUpdateStatusConflictResponseBody": { + "description": "updateStatus_conflict_response_body result type (default view)", + "example": { + "fault": false, + "id": "123abc", + "message": "parameter 'p' must be an integer", + "name": "bad_request", + "temporary": false, + "timeout": false + }, + "properties": { + "fault": { + "description": "Is the error a server-side fault?", + "example": false, + "type": "boolean" + }, + "id": { + "description": "ID is a unique identifier for this particular occurrence of the problem.", + "example": "123abc", + "type": "string" + }, + "message": { + "description": "Message is a human-readable explanation specific to this occurrence of the problem.", + "example": "parameter 'p' must be an integer", + "type": "string" + }, + "name": { + "description": "Name is the name of this class of errors.", + "example": "bad_request", + "type": "string" + }, + "temporary": { + "description": "Is the error temporary?", + "example": false, + "type": "boolean" }, "timeout": { "description": "Is the error a timeout?", @@ -59840,8 +64210,8 @@ "title": "Mediatype identifier: application/vnd.goa.error; view=default", "type": "object" }, - "OptimaRecommendations_RecommendationsUpdateStatusBadRequestResponseBody": { - "description": "updateStatus_bad_request_response_body result type (default view)", + "OptimaRecommendations_RecommendationsUpdateStatusForbiddenResponseBody": { + "description": "updateStatus_forbidden_response_body result type (default view)", "example": { "fault": true, "id": "123abc", @@ -59878,7 +64248,7 @@ }, "timeout": { "description": "Is the error a timeout?", - "example": true, + "example": false, "type": "boolean" } }, @@ -59893,20 +64263,20 @@ "title": "Mediatype identifier: application/vnd.goa.error; view=default", "type": "object" }, - "OptimaRecommendations_RecommendationsUpdateStatusConflictResponseBody": { - "description": "updateStatus_conflict_response_body result type (default view)", + "OptimaRecommendations_RecommendationsUpdateStatusNotFoundResponseBody": { + "description": "updateStatus_not_found_response_body result type (default view)", "example": { "fault": false, "id": "123abc", "message": "parameter 'p' must be an integer", "name": "bad_request", - "temporary": false, - "timeout": true + "temporary": true, + "timeout": false }, "properties": { "fault": { "description": "Is the error a server-side fault?", - "example": true, + "example": false, "type": "boolean" }, "id": { @@ -59926,12 +64296,12 @@ }, "temporary": { "description": "Is the error temporary?", - "example": true, + "example": false, "type": "boolean" }, "timeout": { "description": "Is the error a timeout?", - "example": true, + "example": false, "type": "boolean" } }, @@ -59946,152 +64316,311 @@ "title": "Mediatype identifier: application/vnd.goa.error; view=default", "type": "object" }, - "OptimaRecommendations_RecommendationsUpdateStatusForbiddenResponseBody": { - "description": "updateStatus_forbidden_response_body result type (default view)", + "OptimaRecommendations_RecommendationsUpdateStatusRequestBody": { "example": { - "fault": true, - "id": "123abc", - "message": "parameter 'p' must be an integer", - "name": "bad_request", - "temporary": false, - "timeout": false + "generationId": "abc123", + "id": "676f0f2c838a081da3f7cd61_vol-06fa6937d41c139eb", + "snoozedTargetDate": "2025-01-30", + "status": "snoozed", + "statusReason": "Recommendation isn't relevant right now" }, "properties": { - "fault": { - "description": "Is the error a server-side fault?", - "example": true, - "type": "boolean" + "generationId": { + "description": "Generation ID of the hub-backed recommendation. When present, the status update is applied to the hub DB.", + "example": "abc123", + "type": "string" }, "id": { - "description": "ID is a unique identifier for this particular occurrence of the problem.", - "example": "123abc", + "description": "Recommendation unique ID", + "example": "676f0f2c838a081da3f7cd61_vol-06fa6937d41c139eb", "type": "string" }, - "message": { - "description": "Message is a human-readable explanation specific to this occurrence of the problem.", - "example": "parameter 'p' must be an integer", + "snoozedTargetDate": { + "description": "Target date to move recommendation from snoozed to active again", + "example": "2025-01-30", "type": "string" }, - "name": { - "description": "Name is the name of this class of errors.", - "example": "bad_request", + "status": { + "description": "New status of recommendation", + "enum": [ + "active", + "snoozed", + "rejected" + ], + "example": "snoozed", "type": "string" }, - "temporary": { - "description": "Is the error temporary?", - "example": true, - "type": "boolean" - }, - "timeout": { - "description": "Is the error a timeout?", - "example": true, - "type": "boolean" + "statusReason": { + "description": "Reason of new status of recommendation", + "example": "Recommendation isn't relevant right now", + "type": "string" } }, "required": [ - "name", "id", - "message", - "temporary", - "timeout", - "fault" + "status" ], - "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "title": "RecommendationsUpdateStatusRequestBody", "type": "object" }, - "OptimaRecommendations_RecommendationsUpdateStatusNotFoundResponseBody": { - "description": "updateStatus_not_found_response_body result type (default view)", + "OptimaRecommendations_SavingsSummaryVendorSavingsResponseBody": { "example": { - "fault": true, - "id": "123abc", - "message": "parameter 'p' must be an integer", - "name": "bad_request", - "temporary": true, - "timeout": true + "savingsPerMonth": 134171.79, + "vendor": "aws" }, "properties": { - "fault": { - "description": "Is the error a server-side fault?", - "example": true, - "type": "boolean" + "savingsPerMonth": { + "description": "Savings per month attributed to this vendor.", + "example": 134171.79, + "format": "double", + "type": "number" }, - "id": { - "description": "ID is a unique identifier for this particular occurrence of the problem.", - "example": "123abc", + "vendor": { + "description": "The cloud vendor.", + "example": "aws", "type": "string" + } + }, + "required": [ + "vendor", + "savingsPerMonth" + ], + "title": "SavingsSummaryVendorSavingsResponseBody", + "type": "object" + }, + "OptimaRecommendations_UsageReductionSavingsCategoryResponseBody": { + "example": { + "byVendor": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "category": "Superseded Compute Instances", + "recommendationCount": 64, + "savingsPerMonth": 48210.35 + }, + "properties": { + "byVendor": { + "description": "Per-vendor breakdown of this category's savings.", + "example": [ + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + }, + { + "savingsPerMonth": 134171.79, + "vendor": "aws" + } + ], + "items": { + "$ref": "#/components/schemas/OptimaRecommendations_SavingsSummaryVendorSavingsResponseBody" + }, + "type": "array" }, - "message": { - "description": "Message is a human-readable explanation specific to this occurrence of the problem.", - "example": "parameter 'p' must be an integer", + "category": { + "description": "The category name (derived from policySet).", + "example": "Superseded Compute Instances", "type": "string" }, - "name": { - "description": "Name is the name of this class of errors.", - "example": "bad_request", - "type": "string" + "recommendationCount": { + "description": "Number of recommendations in this category.", + "example": 64, + "format": "int64", + "type": "integer" }, - "temporary": { - "description": "Is the error temporary?", - "example": true, - "type": "boolean" + "savingsPerMonth": { + "description": "Savings per month for this category.", + "example": 48210.35, + "format": "double", + "type": "number" + } + }, + "required": [ + "category", + "savingsPerMonth", + "recommendationCount", + "byVendor" + ], + "title": "UsageReductionSavingsCategoryResponseBody", + "type": "object" + }, + "OptimaRecommendations_UsageReductionSavingsResponseBody": { + "example": { + "byCategory": [ + { + "byVendor": [ + { + "savingsPerMonth": 33747.25, + "vendor": "aws" + }, + { + "savingsPerMonth": 14463.1, + "vendor": "azure" + } + ], + "category": "Idle Compute Instances", + "recommendationCount": 64, + "savingsPerMonth": 48210.35 + }, + { + "byVendor": [ + { + "savingsPerMonth": 9120.5, + "vendor": "aws" + } + ], + "category": "Unattached Volumes", + "recommendationCount": 212, + "savingsPerMonth": 9120.5 + } + ], + "byStatus": [ + { + "recommendationCount": 880, + "savingsPerMonth": 609427.41, + "status": "active" + }, + { + "recommendationCount": 6, + "savingsPerMonth": 3120.5, + "status": "snoozed" + }, + { + "recommendationCount": 4, + "savingsPerMonth": 1874.2, + "status": "rejected" + } + ], + "recommendationCount": 890, + "savingsPerMonth": 609427.41 + }, + "properties": { + "byCategory": { + "description": "Per-category breakdown. Unfiltered by status (includes snoozed/rejected): the counts add up to recommendationCount, but the savings do not add up to savingsPerMonth above.", + "example": [ + { + "byVendor": [ + { + "savingsPerMonth": 33747.25, + "vendor": "aws" + }, + { + "savingsPerMonth": 14463.1, + "vendor": "azure" + } + ], + "category": "Idle Compute Instances", + "recommendationCount": 64, + "savingsPerMonth": 48210.35 + }, + { + "byVendor": [ + { + "savingsPerMonth": 9120.5, + "vendor": "aws" + } + ], + "category": "Unattached Volumes", + "recommendationCount": 212, + "savingsPerMonth": 9120.5 + } + ], + "items": { + "$ref": "#/components/schemas/OptimaRecommendations_UsageReductionSavingsCategoryResponseBody" + }, + "type": "array" }, - "timeout": { - "description": "Is the error a timeout?", - "example": false, - "type": "boolean" + "byStatus": { + "description": "Savings and number of recommendations per status: always active, snoozed and rejected, in this order.", + "example": [ + { + "recommendationCount": 880, + "savingsPerMonth": 609427.41, + "status": "active" + }, + { + "recommendationCount": 6, + "savingsPerMonth": 3120.5, + "status": "snoozed" + }, + { + "recommendationCount": 4, + "savingsPerMonth": 1874.2, + "status": "rejected" + } + ], + "items": { + "$ref": "#/components/schemas/OptimaRecommendations_UsageReductionSavingsStatusResponseBody" + }, + "type": "array" + }, + "recommendationCount": { + "description": "Number of Usage Reduction recommendations of every status (active, snoozed and rejected), the sum of byStatus.", + "example": 890, + "format": "int64", + "type": "integer" + }, + "savingsPerMonth": { + "description": "Savings per month of the active recommendations only (status active or not set), the widget's headline figure.", + "example": 609427.41, + "format": "double", + "type": "number" } }, "required": [ - "name", - "id", - "message", - "temporary", - "timeout", - "fault" + "savingsPerMonth", + "recommendationCount", + "byCategory", + "byStatus" ], - "title": "Mediatype identifier: application/vnd.goa.error; view=default", + "title": "UsageReductionSavingsResponseBody", "type": "object" }, - "OptimaRecommendations_RecommendationsUpdateStatusRequestBody": { + "OptimaRecommendations_UsageReductionSavingsStatusResponseBody": { "example": { - "id": "676f0f2c838a081da3f7cd61_vol-06fa6937d41c139eb", - "snoozedTargetDate": "2025-01-30", - "status": "realized", - "statusReason": "Recommendation isn't relevant right now" + "recommendationCount": 880, + "savingsPerMonth": 609427.41, + "status": "active" }, "properties": { - "id": { - "description": "Recommendation unique ID", - "example": "676f0f2c838a081da3f7cd61_vol-06fa6937d41c139eb", - "type": "string" + "recommendationCount": { + "description": "Number of recommendations with this status.", + "example": 880, + "format": "int64", + "type": "integer" }, - "snoozedTargetDate": { - "description": "Target date to move recommendation from snoozed to active again", - "example": "2025-01-30", - "type": "string" + "savingsPerMonth": { + "description": "Savings per month of the recommendations with this status.", + "example": 609427.41, + "format": "double", + "type": "number" }, "status": { - "description": "New status of recommendation", + "description": "The recommendation status.", "enum": [ "active", "snoozed", - "rejected", - "realized" + "rejected" ], - "example": "realized", - "type": "string" - }, - "statusReason": { - "description": "Reason of new status of recommendation", - "example": "Recommendation isn't relevant right now", + "example": "active", "type": "string" } }, "required": [ - "id", - "status" + "status", + "savingsPerMonth", + "recommendationCount" ], - "title": "RecommendationsUpdateStatusRequestBody", + "title": "UsageReductionSavingsStatusResponseBody", "type": "object" }, "Policy_ActionStatusCollection": { @@ -107899,14 +112428,14 @@ "type": "object" }, "Vis_DeviceDatasourceSelection": { - "description": "A selection of datasources to delete devices from. If included in the datasources filter, only 1 property should be set", + "description": "Identifies a datasource by one property. When multiple selectors are provided, a datasource is included if it matches any selector.", "example": { "field": "type", "value": "SCCM" }, "properties": { "field": { - "description": "The field to use for the selection of datasources", + "description": "Datasource property to compare: id for the datasource ID, name for the datasource name, or type for the datasource type", "enum": [ "id", "name", @@ -107916,7 +112445,7 @@ "type": "string" }, "value": { - "description": "The value for the datasource selection", + "description": "Exact value that the selected datasource property must match", "example": "SCCM", "type": "string" } @@ -107960,12 +112489,12 @@ }, "temporary": { "description": "Is the error temporary?", - "example": false, + "example": true, "type": "boolean" }, "timeout": { "description": "Is the error a timeout?", - "example": true, + "example": false, "type": "boolean" } }, @@ -107983,40 +112512,21 @@ "example": { "datasourceSelectors": [ { - "field": "type", - "value": "SCCM" - }, - { - "field": "type", - "value": "SCCM" - }, - { - "field": "type", - "value": "SCCM" - }, - { - "field": "type", - "value": "SCCM" + "field": "id", + "value": "a8d416e5-7212-4a9a-93f3-0b8602ad06f4" } ], "deviceIds": [ - "Voluptatum optio laudantium illum doloribus delectus ea.", - "Vitae repellat voluptatum ipsum.", - "Sint vel provident voluptates ut asperiores aliquam.", - "Occaecati architecto." + "4e0e3471-ccbc-41c7-a21e-c384f2eb5669" ] }, "properties": { "datasourceSelectors": { - "description": "List of datasources to delete devices from", + "description": "Optional datasource selectors. A datasource is included when it matches any selector. Omit this attribute to include all datasources associated with the specified devices.", "example": [ { - "field": "type", - "value": "SCCM" - }, - { - "field": "type", - "value": "SCCM" + "field": "id", + "value": "a8d416e5-7212-4a9a-93f3-0b8602ad06f4" } ], "items": { @@ -108025,15 +112535,12 @@ "type": "array" }, "deviceIds": { - "description": "List of device IDs to delete", + "description": "Device IDs whose evidence should be included. Send no more than 500 unique IDs per request; this recommendation is not enforced by the API.", "example": [ - "Quasi cum itaque fugiat.", - "Voluptatibus aliquam iste ipsa.", - "Aliquid nam.", - "Enim laboriosam tempore." + "4e0e3471-ccbc-41c7-a21e-c384f2eb5669" ], "items": { - "example": "Blanditiis fugiat magni.", + "example": "Perferendis ullam et sunt accusantium.", "type": "string" }, "type": "array" @@ -108046,6 +112553,20 @@ }, "Vis_ExportDataCollection": { "example": [ + { + "createdAt": "2018-05-16T16:31:52.1000Z", + "id": "7d795afa-c508-4d47-92ae-248113a792d1", + "name": "hardware_inventory", + "size": 1080, + "type": "snapshot" + }, + { + "createdAt": "2018-05-16T16:31:52.1000Z", + "id": "7d795afa-c508-4d47-92ae-248113a792d1", + "name": "hardware_inventory", + "size": 1080, + "type": "snapshot" + }, { "createdAt": "2018-05-16T16:31:52.1000Z", "id": "7d795afa-c508-4d47-92ae-248113a792d1", @@ -108086,13 +112607,6 @@ "size": 1080, "type": "snapshot" }, - { - "createdAt": "2018-05-16T16:31:52.1000Z", - "id": "7d795afa-c508-4d47-92ae-248113a792d1", - "name": "hardware_inventory", - "size": 1080, - "type": "snapshot" - }, { "createdAt": "2018-05-16T16:31:52.1000Z", "id": "7d795afa-c508-4d47-92ae-248113a792d1", @@ -108127,16 +112641,17 @@ "type": "object" }, "Vis_FlexeraVisDeviceDeletionSummary": { - "description": "A count of devices that would be deleted by the query.", + "description": "Summarizes the device evidence selected by a deletion request for one datasource.", "example": { "count": 150, "datasourceId": "4e0e3471-ccbc-41c7-a21e-c384f2eb5669", "datasourceName": "SCCM_PROD_AP", - "datasourceType": "SCCM" + "datasourceType": "SCCM", + "kind": "vis:device-deletion-summary" }, "properties": { "count": { - "description": "The number of devices that would be deleted", + "description": "The number of devices whose evidence is selected", "example": 150, "type": "integer" }, @@ -108154,9 +112669,18 @@ "description": "The type of the datasource", "example": "SCCM", "type": "string" + }, + "kind": { + "description": "The resource's type", + "enum": [ + "vis:device-deletion-summary" + ], + "example": "vis:device-deletion-summary", + "type": "string" } }, "required": [ + "kind", "count", "datasourceId", "datasourceName", @@ -137925,6 +142449,12 @@ "content": { "application/json": { "example": { + "automatedEdpProfiles": [ + { + "billSource": "aws-123456789012", + "enabled": true + } + ], "baseCostsOn": "billedCost" }, "schema": { @@ -138054,6 +142584,12 @@ "content": { "application/json": { "example": { + "automatedEdpProfiles": [ + { + "billSource": "aws-123456789012", + "enabled": true + } + ], "baseCostsOn": "billedCost" }, "schema": { @@ -139488,13 +144024,13 @@ { "allowEmptyValue": true, "description": "Page size (default 50, max 200)", - "example": 7, + "example": 118, "in": "query", "name": "limit", "schema": { "default": 50, "description": "Page size (default 50, max 200)", - "example": 53, + "example": 62, "maximum": 200, "minimum": 1, "type": "integer" @@ -139543,24 +144079,12 @@ { "allowEmptyValue": true, "description": "Optional exact-match filter on schedule name.", - "example": "Ut sint.", + "example": "Saepe facere veritatis.", "in": "query", "name": "scheduleName", "schema": { "description": "Optional exact-match filter on schedule name.", - "example": "Porro sit amet.", - "type": "string" - } - }, - { - "allowEmptyValue": true, - "description": "OData-style expression evaluated against each returned resource. Attribute names are case-sensitive and operators are case-insensitive. String eq, ne, and in comparisons are case-sensitive; co performs case-insensitive substring matching. Date values use YYYY-MM-DD; date-time values use ISO-8601 and are normalized to UTC; billMonth uses YYYY-MM. Missing fields are treated as null; only eq null and ne null support null operands. Literal values must be on the right side of an operator.\n\nSupported comparison operators are eq, ne, co, in, gt, ge, lt, and le, subject to the field type. String fields support eq, ne, in, and co; numeric and date fields support eq, ne, in, gt, ge, lt, and le. Boolean operators are and, or, and not. Parentheses group expressions. Expressions are limited to depth 10 and 100 predicates. Malformed syntax, unsupported fields or operators, and limit violations return invalid_filter with HTTP 400.\n\nFilterable fields: scheduleName, status, customerName, customerBillingPlan, invoiceTemplateId (string); customerId (integer); createdAt and updatedAt (date-time). Customer fields match any customer on the schedule. Combined with discrete filters using AND.", - "example": "status eq 'active' and customerId eq 53125", - "in": "query", - "name": "filter", - "schema": { - "description": "OData-style expression evaluated against each returned resource. Attribute names are case-sensitive and operators are case-insensitive. String eq, ne, and in comparisons are case-sensitive; co performs case-insensitive substring matching. Date values use YYYY-MM-DD; date-time values use ISO-8601 and are normalized to UTC; billMonth uses YYYY-MM. Missing fields are treated as null; only eq null and ne null support null operands. Literal values must be on the right side of an operator.\n\nSupported comparison operators are eq, ne, co, in, gt, ge, lt, and le, subject to the field type. String fields support eq, ne, in, and co; numeric and date fields support eq, ne, in, gt, ge, lt, and le. Boolean operators are and, or, and not. Parentheses group expressions. Expressions are limited to depth 10 and 100 predicates. Malformed syntax, unsupported fields or operators, and limit violations return invalid_filter with HTTP 400.\n\nFilterable fields: scheduleName, status, customerName, customerBillingPlan, invoiceTemplateId (string); customerId (integer); createdAt and updatedAt (date-time). Customer fields match any customer on the schedule. Combined with discrete filters using AND.", - "example": "status eq 'active' and customerId eq 53125", + "example": "Voluptas dolore explicabo nisi eius.", "type": "string" } }, @@ -139584,10 +144108,10 @@ "application/json": { "example": { "kind": "finops:invoice-schedule-list", - "limit": 13960545968396517000, + "limit": 4462231302371799000, "nextPage": "/finops-billing/v1/orgs/100/invoice-schedules?skipToken=19u2349", "prevPage": "/finops-billing/v1/orgs/100/invoice-schedules?skipToken=8b1750u", - "total": 14312228737313251000, + "total": 3433479973868838000, "values": [ { "createdAt": "2001-07-21T04:41:33Z", @@ -139669,6 +144193,11 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "000001", + "invoiceNumberLastUsed": "000041", + "invoiceNumberNext": "000042", + "invoiceNumberPrefix": "INV-", + "invoiceNumberingEnabled": true, "invoiceTemplateId": "tmpl_9001", "kind": "finops:invoice-schedule", "nextInvoiceDate": "2026-09-05", @@ -139691,6 +144220,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -139792,6 +144322,11 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "000001", + "invoiceNumberLastUsed": "000041", + "invoiceNumberNext": "000042", + "invoiceNumberPrefix": "INV-", + "invoiceNumberingEnabled": true, "invoiceTemplateId": "tmpl_9001", "kind": "finops:invoice-schedule", "nextInvoiceDate": "2026-09-05", @@ -139814,6 +144349,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -139920,7 +144456,7 @@ "x-flexera-service": "finops_billing" }, "post": { - "description": "Creates one invoice schedule covering every customer in the request. Validation applies to the whole request: if any customer is invalid the entire request fails and nothing is created.\n\nThe schedule's invoice template is selected one of three ways:\n\n- link an existing template: isCreateTemplate=false with invoiceTemplateId set\n- create one: isCreateTemplate=true with template set, and the created template's id is returned as the schedule's invoiceTemplateId\n- no template: isCreateTemplate=false with neither field, and the created schedule has no invoiceTemplateId\n\nAny other combination is rejected with 422.", + "description": "Creates one invoice schedule covering every customer in the request. Validation applies to the whole request: if any customer is invalid the entire request fails and nothing is created.\n\nThe schedule's invoice template is selected one of three ways:\n\n- link an existing template: isCreateTemplate=false with invoiceTemplateId set\n- create one: isCreateTemplate=true with template set, and the created template's id is returned as the schedule's invoiceTemplateId\n- no template: isCreateTemplate=false with neither field, and the created schedule has no invoiceTemplateId\n\nAny other combination is rejected with 422.\n\nAutomatic invoice numbering is optional. Supply invoiceNumberBase, with an optional invoiceNumberPrefix, to number every invoice the schedule generates; an invoiceNumberPrefix without an invoiceNumberBase is rejected with 400 invoice_number_prefix_requires_base. A number is allocated only after bill-lock passes: a failed generation keeps its number and a retry reuses it. If the sequence is exhausted the whole call fails with 409 invoice_number_sequence_exhausted (not retryable) and work already completed for earlier customers is retained. The schedule's counter is retained when the schedule is soft-deleted.", "operationId": "FinopsBilling_Invoice_Schedules_create", "parameters": [ { @@ -139947,33 +144483,6 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - } - ] - }, - { - "customerBillingPlan": "gold", - "customerId": 53125, - "customerName": "MSP Child Org - 52674", - "recipients": [ - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, { "email": "david.jones@example.com", "firstName": "David", @@ -139996,11 +144505,6 @@ "firstName": "David", "lastName": "Jones" }, - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, { "email": "david.jones@example.com", "firstName": "David", @@ -140017,6 +144521,8 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "la8", + "invoiceNumberPrefix": "rya", "invoiceTemplateId": "tmpl_9001", "isCreateTemplate": false, "schedule": { @@ -140036,19 +144542,21 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Sit eos mollitia debitis cum.", + "dimension": "Aut facilis autem non non eum.", "expressions": [ + {}, {}, {} ], - "substring": "Earum iusto unde sit exercitationem aut.", + "substring": "Qui suscipit quas temporibus voluptates voluptatem quo.", "type": "equal", - "value": "Iusto repudiandae consequuntur adipisci." + "value": "Voluptatem eius." }, - "freeText": "Facere ut aut et ipsum ut.", - "logo": "Harum qui ipsam dignissimos.", + "freeText": "Adipisci enim earum iusto unde sit.", + "logo": "Mollitia debitis cum fuga iusto repudiandae.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" } @@ -140065,7 +144573,7 @@ "content": { "application/json": { "example": { - "createdAt": "1973-12-28T21:57:05Z", + "createdAt": "1988-02-02T23:20:31Z", "createdBy": 123, "customers": [ { @@ -140077,14 +144585,12 @@ "email": "david.jones@example.com", "firstName": "David", "lastName": "Jones" - } - ] - }, - { - "customerBillingPlan": "gold", - "customerId": 53125, - "customerName": "MSP Child Org - 52674", - "recipients": [ + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -140097,6 +144603,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -140114,6 +144630,11 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "z5y", + "invoiceNumberLastUsed": "000041", + "invoiceNumberNext": "000042", + "invoiceNumberPrefix": "09v", + "invoiceNumberingEnabled": true, "invoiceTemplateId": "tmpl_9001", "kind": "finops:invoice-schedule", "nextInvoiceDate": "2026-09-05", @@ -140136,23 +144657,25 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, - "freeText": "Quidem voluptatem aut omnis sint quia.", - "logo": "Unde et est sed.", + "freeText": "Porro quidem voluptatem aut.", + "logo": "Perspiciatis nemo molestiae quasi unde et est.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1999-11-19T04:17:26Z", + "updatedAt": "2013-03-27T15:06:02Z", "updatedBy": 456 }, "schema": { @@ -140212,7 +144735,7 @@ } } }, - "description": "conflict: Conflict response." + "description": "invoice_number_sequence_exhausted: the invoice number sequence is exhausted. Not retryable: the whole call fails, and work already completed for earlier customers in the call is retained" }, "422": { "content": { @@ -140315,7 +144838,7 @@ "content": { "application/json": { "example": { - "createdAt": "1975-02-03T08:35:49Z", + "createdAt": "2011-01-07T21:41:58Z", "createdBy": 123, "customers": [ { @@ -140327,14 +144850,12 @@ "email": "david.jones@example.com", "firstName": "David", "lastName": "Jones" - } - ] - }, - { - "customerBillingPlan": "gold", - "customerId": 53125, - "customerName": "MSP Child Org - 52674", - "recipients": [ + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -140347,6 +144868,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -140359,6 +144890,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -140376,6 +144917,11 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "1az", + "invoiceNumberLastUsed": "000041", + "invoiceNumberNext": "000042", + "invoiceNumberPrefix": "xja", + "invoiceNumberingEnabled": true, "invoiceTemplateId": "tmpl_9001", "kind": "finops:invoice-schedule", "nextInvoiceDate": "2026-09-05", @@ -140398,23 +144944,25 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, - "freeText": "Quidem voluptatem aut omnis sint quia.", - "logo": "Unde et est sed.", + "freeText": "Porro quidem voluptatem aut.", + "logo": "Perspiciatis nemo molestiae quasi unde et est.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "2007-12-13T12:09:42Z", + "updatedAt": "1992-08-01T16:39:56Z", "updatedBy": 456 }, "schema": { @@ -140521,7 +145069,7 @@ "x-flexera-service": "finops_billing" }, "patch": { - "description": "Partially updates an invoice schedule using JSON Merge Patch (RFC 7396) semantics: only fields present in the request body are changed and omitted fields remain unchanged. Supports optimistic locking through If-Match.\n\nAn inactive schedule cannot be modified through this endpoint. Use the activate endpoint to reactivate it.", + "description": "Partially updates an invoice schedule using JSON Merge Patch (RFC 7396) semantics: only fields present in the request body are changed and omitted fields remain unchanged. Supports optimistic locking through If-Match.\n\nInvoice numbering: invoiceNumberPrefix and invoiceNumberBase follow the same merge-patch rule, so omitting a field leaves it unchanged. Sending \"\" for both clears numbering and disables it. Sending \"\" for invoiceNumberPrefix alone, with an existing base, removes the prefix only. Re-adding numbering later continues from the last used number + 1. An invoiceNumberPrefix without a base is rejected with 400 invoice_number_prefix_requires_base, and changing the base after the first number was allocated is rejected with 400 invoice_number_base_locked.\n\nAn inactive schedule accepts exactly three fields through this endpoint: status, invoiceNumberPrefix and invoiceNumberBase. Any other field is rejected. Use the activate endpoint to reactivate it.", "operationId": "FinopsBilling_Invoice_Schedules_update", "parameters": [ { @@ -140578,11 +145126,6 @@ "firstName": "David", "lastName": "Jones" }, - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, { "email": "david.jones@example.com", "firstName": "David", @@ -140595,33 +145138,6 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - } - ] - }, - { - "customerBillingPlan": "gold", - "customerId": 53125, - "customerName": "MSP Child Org - 52674", - "recipients": [ - { - "email": "david.jones@example.com", - "firstName": "David", - "lastName": "Jones" - }, { "email": "david.jones@example.com", "firstName": "David", @@ -140643,6 +145159,8 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "wol", + "invoiceNumberPrefix": "ym7", "invoiceTemplateId": "tmpl_9002", "isCreateTemplate": false, "schedule": { @@ -140653,7 +145171,8 @@ "timeOfDay": "06:00", "timezone": "UTC" }, - "scheduleName": "grz", + "scheduleName": "9ex", + "status": "inactive", "template": { "costMetric": "billedCost", "dimensions": [ @@ -140662,19 +145181,21 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Sit eos mollitia debitis cum.", + "dimension": "Aut facilis autem non non eum.", "expressions": [ + {}, {}, {} ], - "substring": "Earum iusto unde sit exercitationem aut.", + "substring": "Qui suscipit quas temporibus voluptates voluptatem quo.", "type": "equal", - "value": "Iusto repudiandae consequuntur adipisci." + "value": "Voluptatem eius." }, - "freeText": "Facere ut aut et ipsum ut.", - "logo": "Harum qui ipsam dignissimos.", + "freeText": "Adipisci enim earum iusto unde sit.", + "logo": "Mollitia debitis cum fuga iusto repudiandae.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" } @@ -140691,7 +145212,7 @@ "content": { "application/json": { "example": { - "createdAt": "2008-05-27T08:31:55Z", + "createdAt": "1976-07-18T15:18:30Z", "createdBy": 123, "customers": [ { @@ -140699,6 +145220,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -140711,6 +145242,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -140728,6 +145269,11 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "zbr", + "invoiceNumberLastUsed": "000041", + "invoiceNumberNext": "000042", + "invoiceNumberPrefix": "gyp", + "invoiceNumberingEnabled": true, "invoiceTemplateId": "tmpl_9001", "kind": "finops:invoice-schedule", "nextInvoiceDate": "2026-09-05", @@ -140750,23 +145296,25 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, - "freeText": "Quidem voluptatem aut omnis sint quia.", - "logo": "Unde et est sed.", + "freeText": "Porro quidem voluptatem aut.", + "logo": "Perspiciatis nemo molestiae quasi unde et est.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1979-09-22T19:15:52Z", + "updatedAt": "1986-04-01T13:11:07Z", "updatedBy": 456 }, "schema": { @@ -140915,7 +145463,7 @@ }, "/finops-billing/v1/orgs/{orgId}/invoice-schedules/{id}/activate": { "post": { - "description": "Activates an invoice schedule (reactivating a previously deactivated schedule) and restores its future runs. Supply endMonthYear to bound the reactivated schedule; omit it to make the schedule open-ended. While inactive, schedules cannot be modified via PATCH; activate first. Supports optimistic locking through If-Match.", + "description": "Activates an invoice schedule (reactivating a previously deactivated schedule) and restores its future runs. Supply endMonthYear to bound the reactivated schedule; omit it to make the schedule open-ended. While inactive, a schedule accepts exactly status, invoiceNumberPrefix and invoiceNumberBase through PATCH; any other change requires activating it first. Supports optimistic locking through If-Match.", "operationId": "FinopsBilling_Invoice_Schedules_activate", "parameters": [ { @@ -140975,7 +145523,7 @@ "content": { "application/json": { "example": { - "createdAt": "1975-12-05T11:18:55Z", + "createdAt": "2003-02-05T00:58:37Z", "createdBy": 123, "customers": [ { @@ -140983,6 +145531,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -140995,6 +145553,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -141012,6 +145580,11 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "hpa", + "invoiceNumberLastUsed": "000041", + "invoiceNumberNext": "000042", + "invoiceNumberPrefix": "nkl", + "invoiceNumberingEnabled": true, "invoiceTemplateId": "tmpl_9001", "kind": "finops:invoice-schedule", "nextInvoiceDate": "2026-09-05", @@ -141034,23 +145607,25 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, - "freeText": "Quidem voluptatem aut omnis sint quia.", - "logo": "Unde et est sed.", + "freeText": "Porro quidem voluptatem aut.", + "logo": "Perspiciatis nemo molestiae quasi unde et est.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1976-11-13T13:45:37Z", + "updatedAt": "1997-10-26T11:12:26Z", "updatedBy": 456 }, "schema": { @@ -141236,7 +145811,7 @@ "content": { "application/json": { "example": { - "createdAt": "2003-05-12T18:48:37Z", + "createdAt": "1980-12-05T23:48:52Z", "createdBy": 123, "customers": [ { @@ -141244,6 +145819,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -141256,6 +145841,16 @@ "customerId": 53125, "customerName": "MSP Child Org - 52674", "recipients": [ + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, + { + "email": "david.jones@example.com", + "firstName": "David", + "lastName": "Jones" + }, { "email": "david.jones@example.com", "firstName": "David", @@ -141273,6 +145868,11 @@ "days": 0, "type": "exact" }, + "invoiceNumberBase": "tf1", + "invoiceNumberLastUsed": "000041", + "invoiceNumberNext": "000042", + "invoiceNumberPrefix": "k2p", + "invoiceNumberingEnabled": true, "invoiceTemplateId": "tmpl_9001", "kind": "finops:invoice-schedule", "nextInvoiceDate": "2026-09-05", @@ -141295,23 +145895,25 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, - "freeText": "Quidem voluptatem aut omnis sint quia.", - "logo": "Unde et est sed.", + "freeText": "Porro quidem voluptatem aut.", + "logo": "Perspiciatis nemo molestiae quasi unde et est.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1984-05-26T21:41:49Z", + "updatedAt": "1988-04-28T20:47:49Z", "updatedBy": 456 }, "schema": { @@ -141440,7 +146042,7 @@ }, "/finops-billing/v1/orgs/{orgId}/invoice-schedules/{scheduleId}/invoices": { "get": { - "description": "Lists invoices generated by the specified invoice schedule.", + "description": "Lists invoices generated by the specified invoice schedule.\n\nThe invoiceNumber query parameter filters on an exact, case-sensitive invoice number. invoiceNumber is also accepted in orderBy, ascending and descending. Invoices sort numerically by their allocated sequence number; invoices without a number come last in both directions, and ties are broken by id.", "operationId": "FinopsBilling_Invoice_Schedule_Invoices_index", "parameters": [ { @@ -141458,13 +146060,13 @@ { "allowEmptyValue": true, "description": "Page size (default 10, max 200).", - "example": 165, + "example": 154, "in": "query", "name": "limit", "schema": { "default": 10, "description": "Page size (default 10, max 200).", - "example": 32, + "example": 77, "maximum": 200, "minimum": 1, "type": "integer" @@ -141473,36 +146075,55 @@ { "allowEmptyValue": true, "description": "Optional generation status filter.", - "example": "Veniam harum corrupti nemo.", + "example": "Id ea quisquam facilis sint vitae et.", "in": "query", "name": "status", "schema": { "description": "Optional generation status filter.", - "example": "Voluptate accusantium quaerat voluptas voluptatem neque necessitatibus.", + "example": "Id beatae nemo deserunt cum.", "type": "string" } }, { "allowEmptyValue": true, "description": "Optional orderBy query allows to specify an expression for determining what values are used to order the entities.\nMultiple expressions can be specified using comma separated values.", - "example": "updatedAt desc", + "examples": { + "default": { + "summary": "default", + "value": "invoiceNumber asc" + } + }, "in": "query", "name": "orderBy", "schema": { "description": "Optional orderBy query allows to specify an expression for determining what values are used to order the entities.\nMultiple expressions can be specified using comma separated values.", - "example": "updatedAt desc", + "example": "invoiceNumber asc", + "type": "string" + } + }, + { + "allowEmptyValue": true, + "description": "Optional exact, case-sensitive invoice number filter.", + "example": "INV-000042", + "in": "query", + "name": "invoiceNumber", + "schema": { + "description": "Optional exact, case-sensitive invoice number filter.", + "example": "INV-000042", + "maxLength": 29, + "pattern": "^[A-Za-z0-9_-]+$", "type": "string" } }, { "allowEmptyValue": true, "description": "Optional bill month filter.", - "example": "Mr. Corine Metz", + "example": "Mrs. Emory Hagenes", "in": "query", "name": "billMonth", "schema": { "description": "Optional bill month filter.", - "example": "Miss Victor Bayer", + "example": "Lizeth Heller", "pattern": "^\\d{4}-\\d{2}$", "type": "string" } @@ -141510,7 +146131,7 @@ { "allowEmptyValue": true, "description": "Optional export type filter.", - "example": "csv", + "example": "pdf", "in": "query", "name": "exportType", "schema": { @@ -141519,55 +146140,43 @@ "pdf", "csv" ], - "example": "csv", + "example": "pdf", "type": "string" } }, { "allowEmptyValue": true, "description": "Optional customer name filter.", - "example": "Et facere assumenda voluptatem voluptatem illum.", + "example": "Quo aut qui atque.", "in": "query", "name": "customerName", "schema": { "description": "Optional customer name filter.", - "example": "Debitis et vitae quo perferendis ullam et.", + "example": "Iure voluptatem odit eos eveniet quod.", "type": "string" } }, { "allowEmptyValue": true, "description": "Optional cost metric filter.", - "example": "Ut quae doloremque.", + "example": "Id repellendus cumque.", "in": "query", "name": "costMetric", "schema": { "description": "Optional cost metric filter.", - "example": "Maiores officiis aliquam qui voluptatem tempora distinctio.", + "example": "Neque placeat.", "type": "string" } }, { "allowEmptyValue": true, "description": "Optional billing plan filter.", - "example": "Iusto qui sequi esse voluptatem.", + "example": "Quia exercitationem.", "in": "query", "name": "customerBillingPlan", "schema": { "description": "Optional billing plan filter.", - "example": "Neque aliquam maxime.", - "type": "string" - } - }, - { - "allowEmptyValue": true, - "description": "OData-style expression evaluated against each returned resource. Attribute names are case-sensitive and operators are case-insensitive. String eq, ne, and in comparisons are case-sensitive; co performs case-insensitive substring matching. Date values use YYYY-MM-DD; date-time values use ISO-8601 and are normalized to UTC; billMonth uses YYYY-MM. Missing fields are treated as null; only eq null and ne null support null operands. Literal values must be on the right side of an operator.\n\nSupported comparison operators are eq, ne, co, in, gt, ge, lt, and le, subject to the field type. String fields support eq, ne, in, and co; numeric and date fields support eq, ne, in, gt, ge, lt, and le. Boolean operators are and, or, and not. Parentheses group expressions. Expressions are limited to depth 10 and 100 predicates. Malformed syntax, unsupported fields or operators, and limit violations return invalid_filter with HTTP 400.\n\nFilterable fields: scheduleId, customerName, customerBillingPlan, costMetric, status, deliveryStatus, currency, periodType, exportType, invoiceAmount (string); customerId, attempts, filterCount, groupByCount (integer); billMonth (YYYY-MM); issueDate and dueDate (date); createdAt and updatedAt (date-time). Combined with discrete filters using AND.", - "example": "deliveryStatus eq 'success' and billMonth eq '2026-09'", - "in": "query", - "name": "filter", - "schema": { - "description": "OData-style expression evaluated against each returned resource. Attribute names are case-sensitive and operators are case-insensitive. String eq, ne, and in comparisons are case-sensitive; co performs case-insensitive substring matching. Date values use YYYY-MM-DD; date-time values use ISO-8601 and are normalized to UTC; billMonth uses YYYY-MM. Missing fields are treated as null; only eq null and ne null support null operands. Literal values must be on the right side of an operator.\n\nSupported comparison operators are eq, ne, co, in, gt, ge, lt, and le, subject to the field type. String fields support eq, ne, in, and co; numeric and date fields support eq, ne, in, gt, ge, lt, and le. Boolean operators are and, or, and not. Parentheses group expressions. Expressions are limited to depth 10 and 100 predicates. Malformed syntax, unsupported fields or operators, and limit violations return invalid_filter with HTTP 400.\n\nFilterable fields: scheduleId, customerName, customerBillingPlan, costMetric, status, deliveryStatus, currency, periodType, exportType, invoiceAmount (string); customerId, attempts, filterCount, groupByCount (integer); billMonth (YYYY-MM); issueDate and dueDate (date); createdAt and updatedAt (date-time). Combined with discrete filters using AND.", - "example": "deliveryStatus eq 'success' and billMonth eq '2026-09'", + "example": "Non consequuntur magnam ut.", "type": "string" } }, @@ -141603,10 +146212,10 @@ "application/json": { "example": { "kind": "finops:invoice-schedule-invoice-list", - "limit": 16664353963393022000, + "limit": 16384165360325145000, "nextPage": "/finops-billing/v1/orgs/100/invoice-schedules/sch_1/invoices?skipToken=19u2349", "prevPage": "/finops-billing/v1/orgs/100/invoice-schedules/sch_1/invoices?skipToken=8b1750u", - "total": 17896571392271667000, + "total": 3581133863079126000, "values": [ { "artifact": { @@ -141614,7 +146223,7 @@ "url": "Sed aut ducimus quam nostrum autem." }, "attempts": 7061015994191929000, - "billMonth": "Brooklyn O'Reilly", + "billMonth": "Louvenia Hahn", "costMetric": "Laborum est eos inventore et nulla.", "createdAt": "1975-02-26T00:30:15Z", "currency": "USD", @@ -141632,6 +146241,7 @@ ], "displayLogoWithinPdf": true, "dueDate": "1977-12-07", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -141654,6 +146264,7 @@ "groupByCount": 3516928715182697000, "id": "Corrupti quo ipsam temporibus possimus dolorum.", "invoiceAmount": "Animi rem laboriosam.", + "invoiceNumber": "INV-000042", "issueDate": "1983-09-09", "kind": "finops:invoice-schedule-invoice", "logo": "Dolorem ab ut dolores ab id.", @@ -141670,7 +146281,7 @@ "url": "Sed aut ducimus quam nostrum autem." }, "attempts": 7061015994191929000, - "billMonth": "Brooklyn O'Reilly", + "billMonth": "Louvenia Hahn", "costMetric": "Laborum est eos inventore et nulla.", "createdAt": "1975-02-26T00:30:15Z", "currency": "USD", @@ -141688,6 +146299,7 @@ ], "displayLogoWithinPdf": true, "dueDate": "1977-12-07", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -141710,6 +146322,7 @@ "groupByCount": 3516928715182697000, "id": "Corrupti quo ipsam temporibus possimus dolorum.", "invoiceAmount": "Animi rem laboriosam.", + "invoiceNumber": "INV-000042", "issueDate": "1983-09-09", "kind": "finops:invoice-schedule-invoice", "logo": "Dolorem ab ut dolores ab id.", @@ -141864,57 +146477,60 @@ "application/json": { "example": { "artifact": { - "expiresAt": "2012-05-17T03:14:31Z", - "url": "Error vel." + "expiresAt": "1997-11-11T17:25:06Z", + "url": "Amet eos tenetur numquam." }, - "attempts": 1175719440125086000, - "billMonth": "Louisa Crooks", - "costMetric": "Ullam et aut sapiente odit odio.", - "createdAt": "2007-01-03T05:27:08Z", + "attempts": 8937218471082333000, + "billMonth": "Spencer Welch III", + "costMetric": "Libero expedita reiciendis voluptas amet ullam et.", + "createdAt": "1974-01-23T06:14:08Z", "currency": "USD", - "customerBillingPlan": "Porro pariatur voluptates accusamus architecto dolorem corporis.", - "customerId": 6889622823206743000, - "customerName": "Voluptas explicabo.", + "customerBillingPlan": "Eveniet amet.", + "customerId": 9192638717202956000, + "customerName": "Voluptates voluptatem.", "deliveryFailure": { - "code": "Ut sit.", - "message": "Enim labore consequatur molestiae ea consequuntur." + "code": "Voluptas delectus quod est ut sequi.", + "message": "Ut sit." }, - "deliveryStatus": "success", + "deliveryStatus": "failed", "dimensions": [ - "Sed ab dolore magnam voluptatem soluta.", - "Possimus corrupti eaque alias mollitia." + "Et quasi facere fuga ea nihil voluptatibus.", + "Ab dolore magnam voluptatem soluta et possimus." ], "displayLogoWithinPdf": false, - "dueDate": "2013-08-25", - "exportType": "pdf", + "dueDate": "1988-01-19", + "exportLayout": "flatten", + "exportType": "csv", "failure": { - "code": "Explicabo fugit.", - "message": "Eveniet omnis ad." + "code": "Sint commodi consequuntur exercitationem.", + "message": "Doloribus ut molestiae dolorem." }, "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." - }, - "filterCount": 5914485574603203000, - "freeText": "Consectetur saepe non ex accusantium optio illo.", - "groupByCount": 15989614933322201000, - "id": "Eveniet qui rerum a quae.", - "invoiceAmount": "Sequi tempora et quasi facere fuga ea.", - "issueDate": "2004-07-10", + "value": "Accusamus deleniti cumque et omnis tempora eum." + }, + "filterCount": 16344748593920141000, + "freeText": "Mollitia mollitia sed totam consectetur.", + "groupByCount": 17588166168478073000, + "id": "Dolor qui voluptatum totam qui officia ullam.", + "invoiceAmount": "Autem facilis autem aliquam perspiciatis dolor.", + "invoiceNumber": "qee", + "issueDate": "1998-07-14", "kind": "finops:invoice-schedule-invoice", - "logo": "Aut et.", - "messageId": "Eligendi autem facilis autem aliquam.", + "logo": "Non ex accusantium optio illo.", + "messageId": "Id error tempore.", "orgId": 100, - "periodType": "chargePeriod", - "scheduleId": "Sit voluptates voluptatem consequatur eveniet.", - "status": "Quaerat quos unde dolores modi id error.", - "updatedAt": "1981-04-16T03:28:55Z" + "periodType": "billPeriod", + "scheduleId": "Eveniet qui rerum a quae.", + "status": "Sapiente odit odio dignissimos quaerat quos unde.", + "updatedAt": "2006-07-31T21:20:02Z" }, "schema": { "$ref": "#/components/schemas/FinopsBilling_FlexeraFinopsBillingInvoiceScheduleInvoice" @@ -142028,13 +146644,13 @@ { "allowEmptyValue": true, "description": "Page size (default 50, max 200)", - "example": 189, + "example": 94, "in": "query", "name": "limit", "schema": { "default": 50, "description": "Page size (default 50, max 200)", - "example": 56, + "example": 143, "maximum": 200, "minimum": 1, "type": "integer" @@ -142089,10 +146705,10 @@ "application/json": { "example": { "kind": "finops:invoice-template-list", - "limit": 12516818287438911000, + "limit": 13470178225657977000, "nextPage": "/finops-billing/v1/orgs/100/invoice-templates?skipToken=19u2349", "prevPage": "/finops-billing/v1/orgs/100/invoice-templates?skipToken=8b1750u", - "total": 3373256523848636400, + "total": 3104521696013046300, "values": [ { "activeScheduleCount": 1944694627890364200, @@ -142109,6 +146725,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -142150,6 +146767,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -142191,6 +146809,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -142330,18 +146949,20 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Sit eos mollitia debitis cum.", + "dimension": "Aut facilis autem non non eum.", "expressions": [ + {}, {}, {} ], - "substring": "Earum iusto unde sit exercitationem aut.", + "substring": "Qui suscipit quas temporibus voluptates voluptatem quo.", "type": "equal", - "value": "Iusto repudiandae consequuntur adipisci." + "value": "Voluptatem eius." }, - "freeText": "Est enim voluptas quae.", + "freeText": "Atque architecto omnis occaecati.", "logo": "\u003cbase64-or-reference-payload\u003e", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" @@ -142358,15 +146979,13 @@ "content": { "application/json": { "example": { - "activeScheduleCount": 12610439727334280, + "activeScheduleCount": 6683328569719954000, "activeScheduleIds": [ - "Quaerat quaerat voluptatibus consectetur ratione magnam inventore.", - "Quia consequatur quia delectus repudiandae.", - "Unde aut nihil consequuntur.", - "Possimus rem error atque architecto." + "Voluptatem expedita reiciendis.", + "Aut quisquam odio itaque tempora ea quidem." ], "costMetric": "billedCost", - "createdAt": "1971-06-09T15:43:58Z", + "createdAt": "2000-03-16T23:28:00Z", "createdBy": 123, "dimensions": [ "service", @@ -142374,28 +146993,30 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, - "filterCount": 5170654458663784000, - "freeText": "Et natus nostrum voluptatem dolor.", - "groupByCount": 14438658010978058000, + "filterCount": 12673752633770471000, + "freeText": "Quod eos itaque et velit aliquid reiciendis.", + "groupByCount": 16865631665144668000, "id": "tmpl_9001", "kind": "finops:invoice-template", - "logo": "Atque quos omnis et accusamus eligendi.", - "nextInvoiceDate": "1980-06-26", + "logo": "Repellendus non libero quo.", + "nextInvoiceDate": "2011-09-07", "orgId": 100, "periodType": "chargePeriod", "templateName": "Standard MSP Invoice", - "updatedAt": "2002-11-17T19:03:15Z", + "updatedAt": "1992-03-16T15:17:12Z", "updatedBy": 456 }, "schema": { @@ -142548,13 +147169,15 @@ "content": { "application/json": { "example": { - "activeScheduleCount": 9927090210281273000, + "activeScheduleCount": 11546916488081836000, "activeScheduleIds": [ - "Perspiciatis soluta et quia non.", - "Provident similique deserunt." + "Rerum reprehenderit neque tempore ab nobis temporibus.", + "Et sit corrupti qui blanditiis.", + "Et error.", + "Molestias dolores qui dolorum ut nisi." ], "costMetric": "billedCost", - "createdAt": "1976-12-17T16:29:36Z", + "createdAt": "2011-04-19T05:26:29Z", "createdBy": 123, "dimensions": [ "service", @@ -142562,28 +147185,30 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, - "filterCount": 11283118291063407000, - "freeText": "Iste odit placeat.", - "groupByCount": 6109927205798445000, + "filterCount": 14280838648488024000, + "freeText": "Esse rerum.", + "groupByCount": 957571557565313200, "id": "tmpl_9001", "kind": "finops:invoice-template", - "logo": "Omnis praesentium.", - "nextInvoiceDate": "1997-12-19", + "logo": "Vel sed error esse et ex esse.", + "nextInvoiceDate": "1973-09-30", "orgId": 100, "periodType": "chargePeriod", "templateName": "Standard MSP Invoice", - "updatedAt": "1971-11-28T15:34:40Z", + "updatedAt": "1991-09-13T16:20:47Z", "updatedBy": 456 }, "schema": { @@ -142738,26 +147363,28 @@ "example": { "costMetric": "modifiedBilledCost", "dimensions": [ - "Hic accusantium iure ducimus.", - "Aliquid asperiores.", - "Dignissimos iusto est." + "Maxime a.", + "Illum labore.", + "Porro ut culpa." ], "displayLogoWithinPdf": false, - "exportType": "pdf", + "exportLayout": "nested", + "exportType": "csv", "filter": { - "dimension": "Sit eos mollitia debitis cum.", + "dimension": "Aut facilis autem non non eum.", "expressions": [ + {}, {}, {} ], - "substring": "Earum iusto unde sit exercitationem aut.", + "substring": "Qui suscipit quas temporibus voluptates voluptatem quo.", "type": "equal", - "value": "Iusto repudiandae consequuntur adipisci." + "value": "Voluptatem eius." }, - "freeText": "Consequatur dolores sit qui molestiae corporis expedita.", - "logo": "Cumque id commodi aut.", - "periodType": "billingPeriod", - "templateName": "xcy" + "freeText": "Sunt quibusdam omnis ea doloremque.", + "logo": "Consequatur occaecati cupiditate est sit.", + "periodType": "billPeriod", + "templateName": "z6j" }, "schema": { "$ref": "#/components/schemas/FinopsBilling_UpdateRequestBody2" @@ -142771,14 +147398,15 @@ "content": { "application/json": { "example": { - "activeScheduleCount": 3994522866630183400, + "activeScheduleCount": 11755338225784816000, "activeScheduleIds": [ - "Qui perferendis illo aut maxime a.", - "Illum labore.", - "Porro ut culpa." + "Eum officiis expedita incidunt placeat nam possimus.", + "Dolores velit aut sint ratione.", + "Incidunt blanditiis beatae corporis excepturi consectetur.", + "Voluptatibus sunt." ], "costMetric": "billedCost", - "createdAt": "1993-03-28T12:57:19Z", + "createdAt": "2003-09-28T13:56:18Z", "createdBy": 123, "dimensions": [ "service", @@ -142786,28 +147414,30 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, - "filterCount": 960414394255497500, - "freeText": "Ratione quia dolores error quia nostrum et.", - "groupByCount": 5658068758227279000, + "filterCount": 6005411423216261000, + "freeText": "Ea at culpa rerum porro corrupti.", + "groupByCount": 12685049310339363000, "id": "tmpl_9001", "kind": "finops:invoice-template", - "logo": "Expedita sapiente.", - "nextInvoiceDate": "2010-11-13", + "logo": "Ea dolor id deleniti.", + "nextInvoiceDate": "1992-07-04", "orgId": 100, "periodType": "chargePeriod", "templateName": "Standard MSP Invoice", - "updatedAt": "2013-06-14T11:56:57Z", + "updatedAt": "2013-04-18T15:17:51Z", "updatedBy": 456 }, "schema": { @@ -142946,7 +147576,7 @@ }, "/finops-billing/v1/orgs/{orgId}/invoices": { "get": { - "description": "Lists invoice export lifecycle records in the organization.", + "description": "Lists invoice export lifecycle records in the organization.\n\nThe invoiceNumber query parameter filters on an exact, case-sensitive invoice number. invoiceNumber is also accepted in orderBy, ascending and descending. Invoices sort by byte order of the invoice number; invoices without a number come last in both directions, and ties are broken by id.", "operationId": "FinopsBilling_Invoices_index", "parameters": [ { @@ -142964,13 +147594,13 @@ { "allowEmptyValue": true, "description": "Page size (default 10, max 200)", - "example": 7, + "example": 26, "in": "query", "name": "limit", "schema": { "default": 10, "description": "Page size (default 10, max 200)", - "example": 65, + "example": 111, "maximum": 200, "minimum": 1, "type": "integer" @@ -142979,36 +147609,55 @@ { "allowEmptyValue": true, "description": "Optional status filter.", - "example": "Est ullam.", + "example": "Veniam ad illo a ipsa eveniet.", "in": "query", "name": "status", "schema": { "description": "Optional status filter.", - "example": "Et voluptatem et qui ullam et.", + "example": "Nobis maxime repudiandae incidunt sunt dolores porro.", "type": "string" } }, { "allowEmptyValue": true, "description": "Optional orderBy query allows to specify an expression for determining what values are used to order the entities.\nMultiple expressions can be specified using comma separated values.", - "example": "updatedAt desc", + "examples": { + "default": { + "summary": "default", + "value": "invoiceNumber asc" + } + }, "in": "query", "name": "orderBy", "schema": { "description": "Optional orderBy query allows to specify an expression for determining what values are used to order the entities.\nMultiple expressions can be specified using comma separated values.", - "example": "updatedAt desc", + "example": "invoiceNumber asc", + "type": "string" + } + }, + { + "allowEmptyValue": true, + "description": "Optional exact, case-sensitive invoice number filter.", + "example": "INV-000042", + "in": "query", + "name": "invoiceNumber", + "schema": { + "description": "Optional exact, case-sensitive invoice number filter.", + "example": "INV-000042", + "maxLength": 29, + "pattern": "^[A-Za-z0-9_-]+$", "type": "string" } }, { "allowEmptyValue": true, "description": "Optional bill month filter.", - "example": "Cruz Fadel", + "example": "Georgiana Boyle", "in": "query", "name": "billMonth", "schema": { "description": "Optional bill month filter.", - "example": "Holly Okuneva", + "example": "Emmet Hahn", "pattern": "^\\d{4}-\\d{2}$", "type": "string" } @@ -143016,7 +147665,7 @@ { "allowEmptyValue": true, "description": "Optional export type filter.", - "example": "csv", + "example": "pdf", "in": "query", "name": "exportType", "schema": { @@ -143032,48 +147681,36 @@ { "allowEmptyValue": true, "description": "Optional customer name filter.", - "example": "Officia sed.", + "example": "Ratione atque.", "in": "query", "name": "customerName", "schema": { "description": "Optional customer name filter.", - "example": "Aut sit.", + "example": "Saepe a sequi eligendi omnis non.", "type": "string" } }, { "allowEmptyValue": true, - "description": "Legacy substring search of the stored invoice generation filter JSON. This parameter does not accept OData expressions.", - "example": "Facere dolorum est velit adipisci tenetur.", + "description": "Optional filter text.", + "example": "Tenetur maxime recusandae.", "in": "query", "name": "filter", "schema": { - "description": "Legacy substring search of the stored invoice generation filter JSON. This parameter does not accept OData expressions.", - "example": "Eos voluptatem qui cupiditate.", - "type": "string" - } - }, - { - "allowEmptyValue": true, - "description": "OData-style expression evaluated against each returned resource. Attribute names are case-sensitive and operators are case-insensitive. String eq, ne, and in comparisons are case-sensitive; co performs case-insensitive substring matching. Date values use YYYY-MM-DD; date-time values use ISO-8601 and are normalized to UTC; billMonth uses YYYY-MM. Missing fields are treated as null; only eq null and ne null support null operands. Literal values must be on the right side of an operator.\n\nSupported comparison operators are eq, ne, co, in, gt, ge, lt, and le, subject to the field type. String fields support eq, ne, in, and co; numeric and date fields support eq, ne, in, gt, ge, lt, and le. Boolean operators are and, or, and not. Parentheses group expressions. Expressions are limited to depth 10 and 100 predicates. Malformed syntax, unsupported fields or operators, and limit violations return invalid_filter with HTTP 400.\n\nFilterable fields: customerId, attempts, filterCount, and groupByCount (integer); customerName, customerBillingPlan, currency, invoiceAmount, status, costMetric, periodType, and exportType (string); billMonth (YYYY-MM); issueDate and dueDate (date); createdAt and updatedAt (date-time). Combined with the legacy filter and discrete filters using AND.", - "example": "customerName co 'Acme' and exportType eq 'pdf'", - "in": "query", - "name": "expressionFilter", - "schema": { - "description": "OData-style expression evaluated against each returned resource. Attribute names are case-sensitive and operators are case-insensitive. String eq, ne, and in comparisons are case-sensitive; co performs case-insensitive substring matching. Date values use YYYY-MM-DD; date-time values use ISO-8601 and are normalized to UTC; billMonth uses YYYY-MM. Missing fields are treated as null; only eq null and ne null support null operands. Literal values must be on the right side of an operator.\n\nSupported comparison operators are eq, ne, co, in, gt, ge, lt, and le, subject to the field type. String fields support eq, ne, in, and co; numeric and date fields support eq, ne, in, gt, ge, lt, and le. Boolean operators are and, or, and not. Parentheses group expressions. Expressions are limited to depth 10 and 100 predicates. Malformed syntax, unsupported fields or operators, and limit violations return invalid_filter with HTTP 400.\n\nFilterable fields: customerId, attempts, filterCount, and groupByCount (integer); customerName, customerBillingPlan, currency, invoiceAmount, status, costMetric, periodType, and exportType (string); billMonth (YYYY-MM); issueDate and dueDate (date); createdAt and updatedAt (date-time). Combined with the legacy filter and discrete filters using AND.", - "example": "customerName co 'Acme' and exportType eq 'pdf'", + "description": "Optional filter text.", + "example": "Est vitae maiores.", "type": "string" } }, { "allowEmptyValue": true, "description": "Optional group-by dimension count filter.", - "example": 17118634271918162000, + "example": 532853165886189060, "in": "query", "name": "groupByCount", "schema": { "description": "Optional group-by dimension count filter.", - "example": 17865801018154277000, + "example": 12305092808851163000, "type": "integer" } }, @@ -143097,107 +147734,31 @@ "application/json": { "example": { "kind": "finops:invoice-list", - "limit": 13337361420526580000, + "limit": 8732050574876033000, "nextPage": "/finops-billing/v1/orgs/100/invoices?skipToken=19u2349", "prevPage": "/finops-billing/v1/orgs/100/invoices?skipToken=8b1750u", - "total": 804120844098448500, + "total": 12171677450270239000, "values": [ { "artifact": { "expiresAt": "1998-01-25T06:34:45Z", "url": "Sed aut ducimus quam nostrum autem." }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", - "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", - "dimensions": [ - "Quam est.", - "Rem ut laboriosam." - ], - "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", - "exportType": "pdf", - "failure": { - "code": "Animi eos maiores commodi rem.", - "message": "Libero fuga a et debitis eum similique." - }, - "filter": { - "dimension": "Est enim.", - "expressions": [ - {}, - {}, - {}, - {} - ], - "substring": "Laboriosam molestiae unde totam.", - "type": "equal", - "value": "Eos facere et eum voluptas." - }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", - "isCreateTemplate": false, - "issueDate": "2000-03-18", - "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", - "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", - "template": { - "costMetric": "billedCost", - "dimensions": [ - "service", - "account", - "region" - ], - "displayLogoWithinPdf": true, - "exportType": "pdf", - "filter": { - "dimension": "Est enim.", - "expressions": [ - {}, - {}, - {}, - {} - ], - "substring": "Laboriosam molestiae unde totam.", - "type": "equal", - "value": "Eos facere et eum voluptas." - }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", - "periodType": "chargePeriod", - "templateName": "Standard MSP Invoice" - }, - "updatedAt": "1980-07-23T09:12:32Z" - }, - { - "artifact": { - "expiresAt": "1998-01-25T06:34:45Z", - "url": "Sed aut ducimus quam nostrum autem." - }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", + "attempts": 7804933891257193000, + "billMonth": "Hassie Conroy", + "costMetric": "Consequuntur qui ut autem id id.", + "createdAt": "2012-06-21T13:57:22Z", "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", + "customerBillingPlan": "Minus tenetur.", + "customerId": 2044415428982120400, + "customerName": "Praesentium odit aut dolor dolore.", "dimensions": [ - "Quam est.", - "Rem ut laboriosam." + "Sit cupiditate.", + "Officia id possimus tempore est fugiat autem." ], "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", + "dueDate": "1988-03-08", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -143215,19 +147776,20 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", + "filterCount": 7846683563542437000, + "freeText": "Est omnis rem ut.", + "groupByCount": 17277475273953827000, + "id": "Provident consectetur.", + "invoiceAmount": "Consequuntur ut non recusandae autem quo est.", + "invoiceNumber": "INV-000042", + "invoiceTemplateId": "Molestias adipisci fugiat non in est qui.", "isCreateTemplate": false, - "issueDate": "2000-03-18", + "issueDate": "1986-05-17", "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", + "logo": "Est ipsam.", "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", + "periodType": "billingPeriod", + "status": "Et et.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -143236,6 +147798,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -143249,32 +147812,33 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", + "freeText": "Magnam repellat autem accusamus repudiandae.", + "logo": "Aperiam commodi labore eum dolor laboriosam omnis.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1980-07-23T09:12:32Z" + "updatedAt": "1999-01-06T04:25:37Z" }, { "artifact": { "expiresAt": "1998-01-25T06:34:45Z", "url": "Sed aut ducimus quam nostrum autem." }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", + "attempts": 7804933891257193000, + "billMonth": "Hassie Conroy", + "costMetric": "Consequuntur qui ut autem id id.", + "createdAt": "2012-06-21T13:57:22Z", "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", + "customerBillingPlan": "Minus tenetur.", + "customerId": 2044415428982120400, + "customerName": "Praesentium odit aut dolor dolore.", "dimensions": [ - "Quam est.", - "Rem ut laboriosam." + "Sit cupiditate.", + "Officia id possimus tempore est fugiat autem." ], "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", + "dueDate": "1988-03-08", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -143292,19 +147856,20 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", + "filterCount": 7846683563542437000, + "freeText": "Est omnis rem ut.", + "groupByCount": 17277475273953827000, + "id": "Provident consectetur.", + "invoiceAmount": "Consequuntur ut non recusandae autem quo est.", + "invoiceNumber": "INV-000042", + "invoiceTemplateId": "Molestias adipisci fugiat non in est qui.", "isCreateTemplate": false, - "issueDate": "2000-03-18", + "issueDate": "1986-05-17", "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", + "logo": "Est ipsam.", "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", + "periodType": "billingPeriod", + "status": "Et et.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -143313,6 +147878,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -143326,32 +147892,33 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", + "freeText": "Magnam repellat autem accusamus repudiandae.", + "logo": "Aperiam commodi labore eum dolor laboriosam omnis.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1980-07-23T09:12:32Z" + "updatedAt": "1999-01-06T04:25:37Z" }, { "artifact": { "expiresAt": "1998-01-25T06:34:45Z", "url": "Sed aut ducimus quam nostrum autem." }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", + "attempts": 7804933891257193000, + "billMonth": "Hassie Conroy", + "costMetric": "Consequuntur qui ut autem id id.", + "createdAt": "2012-06-21T13:57:22Z", "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", + "customerBillingPlan": "Minus tenetur.", + "customerId": 2044415428982120400, + "customerName": "Praesentium odit aut dolor dolore.", "dimensions": [ - "Quam est.", - "Rem ut laboriosam." + "Sit cupiditate.", + "Officia id possimus tempore est fugiat autem." ], "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", + "dueDate": "1988-03-08", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -143369,19 +147936,20 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", + "filterCount": 7846683563542437000, + "freeText": "Est omnis rem ut.", + "groupByCount": 17277475273953827000, + "id": "Provident consectetur.", + "invoiceAmount": "Consequuntur ut non recusandae autem quo est.", + "invoiceNumber": "INV-000042", + "invoiceTemplateId": "Molestias adipisci fugiat non in est qui.", "isCreateTemplate": false, - "issueDate": "2000-03-18", + "issueDate": "1986-05-17", "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", + "logo": "Est ipsam.", "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", + "periodType": "billingPeriod", + "status": "Et et.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -143390,6 +147958,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -143403,12 +147972,12 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", + "freeText": "Magnam repellat autem accusamus repudiandae.", + "logo": "Aperiam commodi labore eum dolor laboriosam omnis.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1980-07-23T09:12:32Z" + "updatedAt": "1999-01-06T04:25:37Z" } ] }, @@ -143495,7 +148064,7 @@ "x-flexera-service": "finops_billing" }, "post": { - "description": "Creates invoice exports for one or more customers.\n\nThe invoice configuration can be supplied in one of four ways:\n\n- direct fields: provide exportType, periodType, costMetric, and displayLogoWithinPdf without a template source\n- existing template: provide invoiceTemplateId; omitted root configuration fields use the saved template's values\n- create saved template: provide isCreateTemplate=true and template with templateName; the new template is used and its ID is returned\n- one-time template: provide template without templateName and with isCreateTemplate=false (or omitted); it supplies omitted root configuration fields but is not saved\n\nRoot configuration fields always override their corresponding template value when present. template cannot be combined with invoiceTemplateId. The four root configuration fields (exportType, periodType, costMetric, displayLogoWithinPdf) are required only when neither invoiceTemplateId nor template is supplied.", + "description": "Creates invoice exports for one or more customers.\n\nThe invoice configuration can be supplied in one of four ways:\n\n- direct fields: provide exportType, periodType, costMetric, and displayLogoWithinPdf without a template source\n- existing template: provide invoiceTemplateId; omitted root configuration fields use the saved template's values\n- create saved template: provide isCreateTemplate=true and template with templateName; the new template is used and its ID is returned\n- one-time template: provide template without templateName and with isCreateTemplate=false (or omitted); it supplies omitted root configuration fields but is not saved\n\nEach customer may carry an optional invoiceNumber. It is immutable after creation, and duplicates are allowed. The number of a generated invoice is allocated only after bill-lock passes; a failed generation keeps its number and a retry reuses it. If the invoice number sequence is exhausted the whole call fails with 409 invoice_number_sequence_exhausted (not retryable) and work already completed for earlier customers in the call is retained.\n\nRoot configuration fields always override their corresponding template value when present. template cannot be combined with invoiceTemplateId. The four required root configuration fields (exportType, periodType, costMetric, displayLogoWithinPdf) are required only when neither invoiceTemplateId nor template is supplied. exportLayout is optional: PDF exports default to flatten, while nested selects the nested layout. Values are exact lowercase flatten or nested; omit exportLayout for CSV exports.", "operationId": "FinopsBilling_Invoices_create", "parameters": [ { @@ -143519,42 +148088,52 @@ "costMetric": "modifiedEffectiveCost", "customers": [ { - "customerBillingPlan": "Distinctio officiis ex ut qui.", - "customerId": 8270483714537410000, - "customerName": "Tempore recusandae." + "customerBillingPlan": "Pariatur necessitatibus corrupti.", + "customerId": 7491482402168278000, + "customerName": "Officiis eum.", + "invoiceNumber": "y0u" + }, + { + "customerBillingPlan": "Pariatur necessitatibus corrupti.", + "customerId": 7491482402168278000, + "customerName": "Officiis eum.", + "invoiceNumber": "y0u" }, { - "customerBillingPlan": "Distinctio officiis ex ut qui.", - "customerId": 8270483714537410000, - "customerName": "Tempore recusandae." + "customerBillingPlan": "Pariatur necessitatibus corrupti.", + "customerId": 7491482402168278000, + "customerName": "Officiis eum.", + "invoiceNumber": "y0u" } ], "dimensions": [ - "Incidunt ducimus rerum voluptatem vel quis nemo.", - "Aut provident ratione excepturi qui.", - "Consequatur iste ipsum laboriosam ipsam." + "Aperiam perspiciatis reiciendis quia omnis praesentium.", + "Pariatur et.", + "Ab quos fuga." ], - "displayLogoWithinPdf": true, - "dueDate": "2014-02-23", - "endDate": "1979-05-26", + "displayLogoWithinPdf": false, + "dueDate": "2014-10-11", + "endDate": "1977-10-29", + "exportLayout": "flatten", "exportType": "csv", "filter": { - "dimension": "Sit eos mollitia debitis cum.", + "dimension": "Aut facilis autem non non eum.", "expressions": [ + {}, {}, {} ], - "substring": "Earum iusto unde sit exercitationem aut.", + "substring": "Qui suscipit quas temporibus voluptates voluptatem quo.", "type": "equal", - "value": "Iusto repudiandae consequuntur adipisci." + "value": "Voluptatem eius." }, - "freeText": "Perspiciatis est.", - "invoiceTemplateId": "Iure et dolor placeat ullam doloribus quia.", + "freeText": "Adipisci hic velit delectus adipisci molestiae.", + "invoiceTemplateId": "Consequuntur voluptas aut.", "isCreateTemplate": false, - "issueDate": "1984-05-21", - "logo": "Enim similique voluptas accusantium.", - "periodType": "billingPeriod", - "startDate": "1997-05-22", + "issueDate": "1978-01-12", + "logo": "Enim accusamus.", + "periodType": "billPeriod", + "startDate": "1997-06-30", "template": { "costMetric": "billedCost", "dimensions": [ @@ -143563,19 +148142,21 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Sit eos mollitia debitis cum.", + "dimension": "Aut facilis autem non non eum.", "expressions": [ + {}, {}, {} ], - "substring": "Earum iusto unde sit exercitationem aut.", + "substring": "Qui suscipit quas temporibus voluptates voluptatem quo.", "type": "equal", - "value": "Iusto repudiandae consequuntur adipisci." + "value": "Voluptatem eius." }, - "freeText": "Et corporis temporibus et blanditiis assumenda dolorum.", - "logo": "Aliquam in nemo qui impedit soluta corporis.", + "freeText": "Labore ipsum fugiat est quod ullam.", + "logo": "Voluptatem minus aut illum eligendi.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" } @@ -143593,30 +148174,31 @@ "application/json": { "example": { "kind": "finops:invoice-list", - "limit": 1330110886123776000, + "limit": 10551071111941396000, "nextPage": "/finops-billing/v1/orgs/100/invoices?skipToken=19u2349", "prevPage": "/finops-billing/v1/orgs/100/invoices?skipToken=8b1750u", - "total": 3323339988533082000, + "total": 14960584176327455000, "values": [ { "artifact": { "expiresAt": "1998-01-25T06:34:45Z", "url": "Sed aut ducimus quam nostrum autem." }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", + "attempts": 7804933891257193000, + "billMonth": "Hassie Conroy", + "costMetric": "Consequuntur qui ut autem id id.", + "createdAt": "2012-06-21T13:57:22Z", "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", + "customerBillingPlan": "Minus tenetur.", + "customerId": 2044415428982120400, + "customerName": "Praesentium odit aut dolor dolore.", "dimensions": [ - "Quam est.", - "Rem ut laboriosam." + "Sit cupiditate.", + "Officia id possimus tempore est fugiat autem." ], "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", + "dueDate": "1988-03-08", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -143634,96 +148216,20 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", + "filterCount": 7846683563542437000, + "freeText": "Est omnis rem ut.", + "groupByCount": 17277475273953827000, + "id": "Provident consectetur.", + "invoiceAmount": "Consequuntur ut non recusandae autem quo est.", + "invoiceNumber": "INV-000042", + "invoiceTemplateId": "Molestias adipisci fugiat non in est qui.", "isCreateTemplate": false, - "issueDate": "2000-03-18", + "issueDate": "1986-05-17", "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", + "logo": "Est ipsam.", "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", - "template": { - "costMetric": "billedCost", - "dimensions": [ - "service", - "account", - "region" - ], - "displayLogoWithinPdf": true, - "exportType": "pdf", - "filter": { - "dimension": "Est enim.", - "expressions": [ - {}, - {}, - {}, - {} - ], - "substring": "Laboriosam molestiae unde totam.", - "type": "equal", - "value": "Eos facere et eum voluptas." - }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", - "periodType": "chargePeriod", - "templateName": "Standard MSP Invoice" - }, - "updatedAt": "1980-07-23T09:12:32Z" - }, - { - "artifact": { - "expiresAt": "1998-01-25T06:34:45Z", - "url": "Sed aut ducimus quam nostrum autem." - }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", - "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", - "dimensions": [ - "Quam est.", - "Rem ut laboriosam." - ], - "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", - "exportType": "pdf", - "failure": { - "code": "Animi eos maiores commodi rem.", - "message": "Libero fuga a et debitis eum similique." - }, - "filter": { - "dimension": "Est enim.", - "expressions": [ - {}, - {}, - {}, - {} - ], - "substring": "Laboriosam molestiae unde totam.", - "type": "equal", - "value": "Eos facere et eum voluptas." - }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", - "isCreateTemplate": false, - "issueDate": "2000-03-18", - "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", - "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", + "periodType": "billingPeriod", + "status": "Et et.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -143732,6 +148238,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -143745,32 +148252,33 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", + "freeText": "Magnam repellat autem accusamus repudiandae.", + "logo": "Aperiam commodi labore eum dolor laboriosam omnis.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1980-07-23T09:12:32Z" + "updatedAt": "1999-01-06T04:25:37Z" }, { "artifact": { "expiresAt": "1998-01-25T06:34:45Z", "url": "Sed aut ducimus quam nostrum autem." }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", + "attempts": 7804933891257193000, + "billMonth": "Hassie Conroy", + "costMetric": "Consequuntur qui ut autem id id.", + "createdAt": "2012-06-21T13:57:22Z", "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", + "customerBillingPlan": "Minus tenetur.", + "customerId": 2044415428982120400, + "customerName": "Praesentium odit aut dolor dolore.", "dimensions": [ - "Quam est.", - "Rem ut laboriosam." + "Sit cupiditate.", + "Officia id possimus tempore est fugiat autem." ], "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", + "dueDate": "1988-03-08", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -143788,19 +148296,20 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", + "filterCount": 7846683563542437000, + "freeText": "Est omnis rem ut.", + "groupByCount": 17277475273953827000, + "id": "Provident consectetur.", + "invoiceAmount": "Consequuntur ut non recusandae autem quo est.", + "invoiceNumber": "INV-000042", + "invoiceTemplateId": "Molestias adipisci fugiat non in est qui.", "isCreateTemplate": false, - "issueDate": "2000-03-18", + "issueDate": "1986-05-17", "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", + "logo": "Est ipsam.", "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", + "periodType": "billingPeriod", + "status": "Et et.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -143809,6 +148318,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -143822,32 +148332,33 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", + "freeText": "Magnam repellat autem accusamus repudiandae.", + "logo": "Aperiam commodi labore eum dolor laboriosam omnis.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1980-07-23T09:12:32Z" + "updatedAt": "1999-01-06T04:25:37Z" }, { "artifact": { "expiresAt": "1998-01-25T06:34:45Z", "url": "Sed aut ducimus quam nostrum autem." }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", + "attempts": 7804933891257193000, + "billMonth": "Hassie Conroy", + "costMetric": "Consequuntur qui ut autem id id.", + "createdAt": "2012-06-21T13:57:22Z", "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", + "customerBillingPlan": "Minus tenetur.", + "customerId": 2044415428982120400, + "customerName": "Praesentium odit aut dolor dolore.", "dimensions": [ - "Quam est.", - "Rem ut laboriosam." + "Sit cupiditate.", + "Officia id possimus tempore est fugiat autem." ], "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", + "dueDate": "1988-03-08", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -143865,19 +148376,20 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", + "filterCount": 7846683563542437000, + "freeText": "Est omnis rem ut.", + "groupByCount": 17277475273953827000, + "id": "Provident consectetur.", + "invoiceAmount": "Consequuntur ut non recusandae autem quo est.", + "invoiceNumber": "INV-000042", + "invoiceTemplateId": "Molestias adipisci fugiat non in est qui.", "isCreateTemplate": false, - "issueDate": "2000-03-18", + "issueDate": "1986-05-17", "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", + "logo": "Est ipsam.", "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", + "periodType": "billingPeriod", + "status": "Et et.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -143886,6 +148398,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -143899,12 +148412,12 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", + "freeText": "Magnam repellat autem accusamus repudiandae.", + "logo": "Aperiam commodi labore eum dolor laboriosam omnis.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1980-07-23T09:12:32Z" + "updatedAt": "1999-01-06T04:25:37Z" } ] }, @@ -143953,7 +148466,7 @@ } } }, - "description": "conflict: Conflict response." + "description": "invoice_number_sequence_exhausted: the invoice number sequence is exhausted. Not retryable: the whole call fails, and work already completed for earlier customers in the call is retained" }, "422": { "content": { @@ -144031,13 +148544,13 @@ }, { "description": "Invoice export identifier", - "example": "Voluptates et.", + "example": "Quia rem asperiores eos perferendis.", "in": "path", "name": "id", "required": true, "schema": { "description": "Invoice export identifier", - "example": "Tempore nemo quidem.", + "example": "Praesentium velit.", "type": "string" } } @@ -144048,53 +148561,55 @@ "application/json": { "example": { "artifact": { - "expiresAt": "2012-05-17T03:14:31Z", - "url": "Error vel." + "expiresAt": "1997-11-11T17:25:06Z", + "url": "Amet eos tenetur numquam." }, - "attempts": 7639740382229057000, - "billMonth": "Leola Howe", - "costMetric": "Harum recusandae enim incidunt.", - "createdAt": "1989-01-06T14:42:36Z", + "attempts": 6107892160212905000, + "billMonth": "Kailee Rolfson", + "costMetric": "Ea expedita.", + "createdAt": "1997-07-13T10:47:04Z", "currency": "USD", - "customerBillingPlan": "Nesciunt aut ipsa.", - "customerId": 8982992895091871000, - "customerName": "Aliquid quo soluta earum voluptatem.", + "customerBillingPlan": "Rem impedit eos.", + "customerId": 4617051238551503000, + "customerName": "Laboriosam laborum incidunt et pariatur autem.", "dimensions": [ - "Voluptatem sapiente sunt ipsum in officiis eligendi.", - "Voluptatem eveniet est hic.", - "Nihil sed.", - "Quos quo." + "Perspiciatis mollitia quae hic non adipisci illo.", + "Numquam et ea nesciunt.", + "Vel aperiam officia omnis et." ], - "displayLogoWithinPdf": true, - "dueDate": "1971-12-19", - "exportType": "pdf", + "displayLogoWithinPdf": false, + "dueDate": "1982-05-25", + "exportLayout": "nested", + "exportType": "csv", "failure": { - "code": "Explicabo fugit.", - "message": "Eveniet omnis ad." + "code": "Sint commodi consequuntur exercitationem.", + "message": "Doloribus ut molestiae dolorem." }, "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." - }, - "filterCount": 17744200898524752000, - "freeText": "Beatae recusandae accusantium voluptatem quod voluptas commodi.", - "groupByCount": 5967771067268314000, - "id": "Sit est quibusdam porro reprehenderit.", - "invoiceAmount": "Sed qui.", - "invoiceTemplateId": "Et tenetur temporibus qui dolorem itaque.", + "value": "Accusamus deleniti cumque et omnis tempora eum." + }, + "filterCount": 4058406502148691500, + "freeText": "Voluptates quia modi est natus.", + "groupByCount": 4082815998173668400, + "id": "Rerum quaerat mollitia ea quas.", + "invoiceAmount": "Et id optio et porro rem quo.", + "invoiceNumber": "782", + "invoiceTemplateId": "Dolores asperiores nostrum autem.", "isCreateTemplate": true, - "issueDate": "1976-04-23", + "issueDate": "1998-10-13", "kind": "finops:invoice", - "logo": "Temporibus facilis vero consequatur sed.", + "logo": "Enim accusantium ad aut rerum.", "orgId": 100, - "periodType": "billPeriod", - "status": "Doloribus natus nobis aperiam eos et qui.", + "periodType": "chargePeriod", + "status": "Dolorem numquam.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -144103,23 +148618,25 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { - "dimension": "Eum et optio dolores aspernatur officia veniam.", + "dimension": "Ut ullam aut.", "expressions": [ + {}, {}, {} ], - "substring": "Debitis sint.", + "substring": "Optio dolores aspernatur officia veniam.", "type": "equal", - "value": "Libero non harum repellat tenetur quos." + "value": "Accusamus deleniti cumque et omnis tempora eum." }, - "freeText": "Accusamus ducimus porro voluptas dignissimos.", - "logo": "Eveniet delectus quo occaecati deserunt sunt quia.", + "freeText": "Magni a ipsa.", + "logo": "Eum reiciendis ea vitae reprehenderit rerum.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1978-01-31T07:04:46Z" + "updatedAt": "1972-12-05T15:13:30Z" }, "schema": { "$ref": "#/components/schemas/FinopsBilling_FlexeraFinopsBillingInvoice" @@ -144233,13 +148750,13 @@ }, { "description": "Invoice export identifier", - "example": "Fuga iste et ratione aut.", + "example": "Veritatis atque pariatur accusantium corrupti aut.", "in": "path", "name": "id", "required": true, "schema": { "description": "Invoice export identifier", - "example": "Eum distinctio eos eveniet.", + "example": "Voluptas quia.", "type": "string" } } @@ -144250,30 +148767,31 @@ "application/json": { "example": { "kind": "finops:invoice-list", - "limit": 14346012619549954000, + "limit": 1481154134574098000, "nextPage": "/finops-billing/v1/orgs/100/invoices?skipToken=19u2349", "prevPage": "/finops-billing/v1/orgs/100/invoices?skipToken=8b1750u", - "total": 10688590590309294000, + "total": 8028934557877135000, "values": [ { "artifact": { "expiresAt": "1998-01-25T06:34:45Z", "url": "Sed aut ducimus quam nostrum autem." }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", + "attempts": 7804933891257193000, + "billMonth": "Hassie Conroy", + "costMetric": "Consequuntur qui ut autem id id.", + "createdAt": "2012-06-21T13:57:22Z", "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", + "customerBillingPlan": "Minus tenetur.", + "customerId": 2044415428982120400, + "customerName": "Praesentium odit aut dolor dolore.", "dimensions": [ - "Quam est.", - "Rem ut laboriosam." + "Sit cupiditate.", + "Officia id possimus tempore est fugiat autem." ], "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", + "dueDate": "1988-03-08", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -144291,96 +148809,20 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", + "filterCount": 7846683563542437000, + "freeText": "Est omnis rem ut.", + "groupByCount": 17277475273953827000, + "id": "Provident consectetur.", + "invoiceAmount": "Consequuntur ut non recusandae autem quo est.", + "invoiceNumber": "INV-000042", + "invoiceTemplateId": "Molestias adipisci fugiat non in est qui.", "isCreateTemplate": false, - "issueDate": "2000-03-18", + "issueDate": "1986-05-17", "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", + "logo": "Est ipsam.", "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", - "template": { - "costMetric": "billedCost", - "dimensions": [ - "service", - "account", - "region" - ], - "displayLogoWithinPdf": true, - "exportType": "pdf", - "filter": { - "dimension": "Est enim.", - "expressions": [ - {}, - {}, - {}, - {} - ], - "substring": "Laboriosam molestiae unde totam.", - "type": "equal", - "value": "Eos facere et eum voluptas." - }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", - "periodType": "chargePeriod", - "templateName": "Standard MSP Invoice" - }, - "updatedAt": "1980-07-23T09:12:32Z" - }, - { - "artifact": { - "expiresAt": "1998-01-25T06:34:45Z", - "url": "Sed aut ducimus quam nostrum autem." - }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", - "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", - "dimensions": [ - "Quam est.", - "Rem ut laboriosam." - ], - "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", - "exportType": "pdf", - "failure": { - "code": "Animi eos maiores commodi rem.", - "message": "Libero fuga a et debitis eum similique." - }, - "filter": { - "dimension": "Est enim.", - "expressions": [ - {}, - {}, - {}, - {} - ], - "substring": "Laboriosam molestiae unde totam.", - "type": "equal", - "value": "Eos facere et eum voluptas." - }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", - "isCreateTemplate": false, - "issueDate": "2000-03-18", - "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", - "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", + "periodType": "billingPeriod", + "status": "Et et.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -144389,6 +148831,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -144402,32 +148845,33 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", + "freeText": "Magnam repellat autem accusamus repudiandae.", + "logo": "Aperiam commodi labore eum dolor laboriosam omnis.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1980-07-23T09:12:32Z" + "updatedAt": "1999-01-06T04:25:37Z" }, { "artifact": { "expiresAt": "1998-01-25T06:34:45Z", "url": "Sed aut ducimus quam nostrum autem." }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", + "attempts": 7804933891257193000, + "billMonth": "Hassie Conroy", + "costMetric": "Consequuntur qui ut autem id id.", + "createdAt": "2012-06-21T13:57:22Z", "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", + "customerBillingPlan": "Minus tenetur.", + "customerId": 2044415428982120400, + "customerName": "Praesentium odit aut dolor dolore.", "dimensions": [ - "Quam est.", - "Rem ut laboriosam." + "Sit cupiditate.", + "Officia id possimus tempore est fugiat autem." ], "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", + "dueDate": "1988-03-08", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -144445,19 +148889,20 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", + "filterCount": 7846683563542437000, + "freeText": "Est omnis rem ut.", + "groupByCount": 17277475273953827000, + "id": "Provident consectetur.", + "invoiceAmount": "Consequuntur ut non recusandae autem quo est.", + "invoiceNumber": "INV-000042", + "invoiceTemplateId": "Molestias adipisci fugiat non in est qui.", "isCreateTemplate": false, - "issueDate": "2000-03-18", + "issueDate": "1986-05-17", "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", + "logo": "Est ipsam.", "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", + "periodType": "billingPeriod", + "status": "Et et.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -144466,6 +148911,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -144479,32 +148925,33 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", + "freeText": "Magnam repellat autem accusamus repudiandae.", + "logo": "Aperiam commodi labore eum dolor laboriosam omnis.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1980-07-23T09:12:32Z" + "updatedAt": "1999-01-06T04:25:37Z" }, { "artifact": { "expiresAt": "1998-01-25T06:34:45Z", "url": "Sed aut ducimus quam nostrum autem." }, - "attempts": 8174652414375535000, - "billMonth": "Leone Kozey", - "costMetric": "Consequuntur ut non recusandae autem quo est.", - "createdAt": "2012-01-09T18:34:35Z", + "attempts": 7804933891257193000, + "billMonth": "Hassie Conroy", + "costMetric": "Consequuntur qui ut autem id id.", + "createdAt": "2012-06-21T13:57:22Z", "currency": "USD", - "customerBillingPlan": "Ut cum nihil debitis consequuntur adipisci.", - "customerId": 12415832262177864000, - "customerName": "Dolore nostrum minus tenetur quo ut quidem.", + "customerBillingPlan": "Minus tenetur.", + "customerId": 2044415428982120400, + "customerName": "Praesentium odit aut dolor dolore.", "dimensions": [ - "Quam est.", - "Rem ut laboriosam." + "Sit cupiditate.", + "Officia id possimus tempore est fugiat autem." ], "displayLogoWithinPdf": false, - "dueDate": "1982-04-15", + "dueDate": "1988-03-08", + "exportLayout": "flatten", "exportType": "pdf", "failure": { "code": "Animi eos maiores commodi rem.", @@ -144522,19 +148969,20 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "filterCount": 2400194453998624000, - "freeText": "Sequi sed molestias adipisci fugiat non in.", - "groupByCount": 15528979695685536000, - "id": "Consectetur accusamus est praesentium odit.", - "invoiceAmount": "Possimus tempore est fugiat autem.", - "invoiceTemplateId": "Deserunt magnam.", + "filterCount": 7846683563542437000, + "freeText": "Est omnis rem ut.", + "groupByCount": 17277475273953827000, + "id": "Provident consectetur.", + "invoiceAmount": "Consequuntur ut non recusandae autem quo est.", + "invoiceNumber": "INV-000042", + "invoiceTemplateId": "Molestias adipisci fugiat non in est qui.", "isCreateTemplate": false, - "issueDate": "2000-03-18", + "issueDate": "1986-05-17", "kind": "finops:invoice", - "logo": "Qui cumque quia aperiam commodi labore eum.", + "logo": "Est ipsam.", "orgId": 100, - "periodType": "billPeriod", - "status": "Placeat sit cupiditate dignissimos.", + "periodType": "billingPeriod", + "status": "Et et.", "template": { "costMetric": "billedCost", "dimensions": [ @@ -144543,6 +148991,7 @@ "region" ], "displayLogoWithinPdf": true, + "exportLayout": "flatten", "exportType": "pdf", "filter": { "dimension": "Est enim.", @@ -144556,12 +149005,12 @@ "type": "equal", "value": "Eos facere et eum voluptas." }, - "freeText": "Et doloremque deserunt maxime voluptas ut nihil.", - "logo": "Accusamus repudiandae.", + "freeText": "Magnam repellat autem accusamus repudiandae.", + "logo": "Aperiam commodi labore eum dolor laboriosam omnis.", "periodType": "chargePeriod", "templateName": "Standard MSP Invoice" }, - "updatedAt": "1980-07-23T09:12:32Z" + "updatedAt": "1999-01-06T04:25:37Z" } ] }, @@ -144889,11 +149338,6 @@ "percentage": 50, "value": "Orion" }, - { - "dimensionId": "rbd_team", - "percentage": 50, - "value": "Orion" - }, { "dimensionId": "rbd_team", "percentage": 50, @@ -144906,15 +149350,6 @@ "effectiveTo": "2025-12", "name": "Equal split for AWS between Teams A, B and C", "source": [ - { - "dimensionId": "vendor", - "valueListCondition": { - "values": [ - "AWS", - "Azure" - ] - } - }, { "dimensionId": "vendor", "valueListCondition": { @@ -145142,10 +149577,6 @@ "application/json": { "example": { "rules": [ - { - "priority": 1, - "ruleId": "68f2a91c4b3d2e1f5a6b7c8d" - }, { "priority": 1, "ruleId": "68f2a91c4b3d2e1f5a6b7c8d" @@ -145647,11 +150078,6 @@ "percentage": 50, "value": "Orion" }, - { - "dimensionId": "rbd_team", - "percentage": 50, - "value": "Orion" - }, { "dimensionId": "rbd_team", "percentage": 50, @@ -145744,16 +150170,6 @@ ] } }, - { - "dimensionId": "vendor", - "dimensionName": "Cloud Vendor", - "valueListCondition": { - "values": [ - "AWS", - "Azure" - ] - } - }, { "dimensionId": "vendor", "dimensionName": "Cloud Vendor", @@ -177680,6 +182096,30 @@ "type": "string" } }, + { + "allowEmptyValue": true, + "description": "The maximum number of users to return per page. If a partial page is returned, the response includes a nextPage link carrying the skipToken.", + "example": 100, + "in": "query", + "name": "limit", + "schema": { + "description": "The maximum number of users to return per page. If a partial page is returned, the response includes a nextPage link carrying the skipToken.", + "example": 100, + "type": "integer" + } + }, + { + "allowEmptyValue": true, + "description": "An opaque token to be provided when requesting a subsequent page after receiving a partial response. \nPartial responses will include a \"nextPage\" attribute in their response body, which contains the URL of the next page including the appropriate skipToken.", + "example": "19u2349", + "in": "query", + "name": "skipToken", + "schema": { + "description": "An opaque token to be provided when requesting a subsequent page after receiving a partial response. \nPartial responses will include a \"nextPage\" attribute in their response body, which contains the URL of the next page including the appropriate skipToken.", + "example": "19u2349", + "type": "string" + } + }, { "description": "The unique identifier for the organization", "example": 100, @@ -177701,6 +182141,7 @@ "example": { "kind": "iam#org-user-list", "nextPage": "/iam/v1/orgs/123/users?skipToken=19u2349", + "prevPage": "/iam/v1/orgs/123/users?skipToken=8b1750u", "values": [ { "accessSource": "org_member", @@ -202203,7 +206644,7 @@ } }, { - "description": "Recommendation statuses to get", + "description": "Recommendation statuses to get. Some values, such as realized, are API-level projected states rather than persisted DB values.", "in": "query", "name": "statuses", "required": false, @@ -202326,6 +206767,558 @@ } ] }, + "/recommendations/orgs/{orgId}/recommendations/export": { + "get": { + "description": "Exports recommendations as a CSV file: every recommendation the paged list returns for the same `filter` and `orderBy`, with the same billing center rules, one row each, with the given columns.\n\n**Required security scopes for GlobalSession**:\n * `common:org:affiliated+common:org:own`", + "operationId": "OptimaRecommendations_Recommendations_export", + "parameters": [ + { + "description": "Optional filter for returning recommendations matching specific criteria.\n### Supported Filter Keys\n| Filter | Type | Example | Description |\n| --------------------- | ------ | ------------------------------------------------- | ------------------------------------------------------------------------------------ |\n| billingCenterID | string | billingCenterID in ['bc1', 'bc2'] | Returns recommendations under the billing centers bc1 or bc2, including descendants |\n| billingCenterName | string | billingCenterName co 'prod' | Returns recommendations listed under a billing center (the Cost Center column) whose name contains 'prod'; eq, ne, in and co only |\n| recommendation | string | recommendation co 'Delete' | Returns recommendations with 'recommendation' containing 'Delete' |\n| type | string | type eq 'Usage Reduction' | Returns recommendations of the given type |\n| vendor | string | vendor in ['AWS', 'Azure'] | Returns recommendations for either AWS or Azure |\n| policySet | string | policySet eq 'Unused Volumes' | Returns recommendations of the given policy set |\n| accountID | string | accountID eq '123456789012' | Returns recommendations for the given cloud account ID |\n| accountName | string | accountName co 'prod' | Returns recommendations for accounts with a name containing 'prod' |\n| resourceGroup | string | resourceGroup eq 'rg-main' | Returns recommendations for the given resource group |\n| region | string | region in ['us-east-1', 'eu-west-1'] | Returns recommendations in either region |\n| service | string | service eq 'EC2' | Returns recommendations for the given service |\n| databaseEngine | string | databaseEngine eq 'postgres' | Returns recommendations for the given database engine |\n| resourceType | string | resourceType eq 'm5.large' | Returns recommendations for the given resource type |\n| resourceID | string | resourceID eq 'i-0abc123' | Returns recommendations for the given resource ID |\n| savings | float | savings gt 100 | Returns recommendations with savings greater than 100 |\n| status | string | status in ['active', 'snoozed'] | Returns recommendations with the given statuses (active, snoozed, rejected, realized) |\n| incidentID | string | incidentID eq '5b06ead5e0dacc007058c784' | Returns recommendations of the given policy incident |\n| createdAt | time | createdAt gt '2022-05-20T00:00:00Z' | Returns recommendations created after 2022-05-20 |\n| updatedAt | time | updatedAt lt '2020-01-01T00:00:00Z' | Returns recommendations updated before 2020-01-01 |\n| detailsExtended.\u003ckey\u003e | string | detailsExtended.instanceFamily eq 'm5' | Returns recommendations whose 'detailsExtended' entry \u003ckey\u003e matches the value |\n| ruleBasedDimensions.\u003ckey\u003e | string | ruleBasedDimensions.rbd_bc eq 'bc1' | Returns recommendations whose rule-based dimension \u003ckey\u003e matches the value |\n| source | string | source eq 'AWS Trusted Advisor' | Returns recommendations from the given source |\n| id | string | id in ['5f1b...', '5f1c...'] | Returns the recommendations with the given IDs |\n| quantityToPurchase | float | quantityToPurchase ge 2 | Returns recommendations with a number to purchase of at least 2; none counts as 0, as the list shows it |\n| statusReason | string | statusReason co 'not needed' | Returns recommendations whose status reason (description) contains 'not needed' |\n| statusUpdatedAt | time | statusUpdatedAt gt '2026-01-01T00:00:00Z' | Returns recommendations whose status changed after 2026-01-01 |\n| snoozedTargetDate | time | snoozedTargetDate lt '2026-12-01T00:00:00Z' | Returns recommendations snoozed until before 2026-12-01 |\n| customTagDimensions.\u003ckey\u003e | string | customTagDimensions.owner eq 'team-a' | Returns recommendations whose tag dimension \u003ckey\u003e matches the value |\n| tags | string | tags eq 'env=prod, team=a' | eq/ne/in compare the whole set of tags, joined with ', ' as groupBy tags shows it ('' for none); co finds a tag among them |\n\n### Supported Operators\n- **in** - Checks if the field contains a specified value within a list.\n- **eq** - Checks if the field's value is equal to the specified value.\n- **ne** - Checks if the field's value is not equal to the specified value.\n- **co** - Checks if the field contains the specified substring.\n- **ex** - Checks whether the field has a value: resourceGroup ex true returns the recommendations that have one, resourceGroup ex false those that have none.\n- **and, or** - Logical operators used to combine multiple conditions. 'and' binds tighter than 'or' (a or b and c means a or (b and c)); use parentheses to group. Two conditions must always be joined by one of them.\n- **not** - Negates the operator that follows it, e.g. status not in ['rejected'].\n- **lt, gt, le, ge** - Relational operators used to compare the field's value against a specified value. They check for less than, greater than, less than or equal to, and greater than or equal to conditions, respectively.\n\n### Notes\n- The filter is a query parameter. While it needs to be URL-encoded, examples here are provided pre-URL-encoding for clarity.\n- A recommendation with no status (for example a Rate Reduction) counts as 'active'.\n- Without a condition on status, recommendations of every status except 'realized' are returned. 'realized' recommendations are returned only when the status condition names them, e.g. status in ['active', 'realized']; excluding a status, e.g. status ne 'rejected', does not.\n- The status key supports only the eq, ne, in, co and not operators; co matches the statuses that contain the text, e.g. status co 'act' is status in ['active']. Anything else is rejected with a 400 error.\n- co applies to text fields only: savings, quantityToPurchase, createdAt, updatedAt, statusUpdatedAt and snoozedTargetDate are compared with eq, ne, gt, ge, lt and le.\n- Combine the status condition with conditions on other fields using 'and', e.g. savings gt 5 and (status eq 'realized' or status eq 'active'). An 'or' between a status condition naming 'realized' and a condition on another field also lets that condition match realized recommendations.\n- Results are always confined to the billing centers the user is authorized for, whatever billingCenterID clauses the filter contains.\n- A detailsExtended.\u003ckey\u003e value is stored as a number or as a string: eq, ne and in with a value that reads as a number match both.\n\n### Examples\n| Example | Description |\n| ----------------------------------------------------------- | -------------------------------------------------------------------- |\n| billingCenterID in ['bc1'] and status in ['active'] | Find active recommendations under billing center 'bc1' |\n| vendor eq 'AWS' and savings gt 100 | Find AWS recommendations with savings greater than 100 |\n| region eq 'us-east-1' or region eq 'eu-west-1' | Find recommendations in either region |\n| accountName co 'prod' and status not eq 'rejected' | Find recommendations for prod accounts that are not rejected |\n| createdAt gt '2022-05-20T00:00:00Z' and policySet eq 'Idle' | Find recommendations of a policy set created after 2022-05-20 |\n", + "in": "query", + "name": "filter", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Optional order by for returning recommendations in a specific order.\n### Supported Order by Keys\n| Key | Description |\n| -------------------- | ------------------------------------------------------------------------------- |\n| recommendation | Returns recommendations ordered by 'recommendation' property |\n| type | Returns recommendations ordered by 'type' property |\n| vendor | Returns recommendations ordered by 'vendor' property |\n| policySet | Returns recommendations ordered by 'policySet' property |\n| accountID | Returns recommendations ordered by 'accountID' property |\n| accountName | Returns recommendations ordered by 'accountName' property |\n| resourceGroup | Returns recommendations ordered by 'resourceGroup' property |\n| region | Returns recommendations ordered by 'region' property |\n| service | Returns recommendations ordered by 'service' property |\n| databaseEngine | Returns recommendations ordered by 'databaseEngine' property |\n| resourceType | Returns recommendations ordered by 'resourceType' property |\n| resourceID | Returns recommendations ordered by 'resourceID' property |\n| savings | Returns recommendations ordered by 'savings' property |\n| status | Returns recommendations ordered by the status as filtered: one without a status as active, realized among the others |\n| incidentID | Returns recommendations ordered by 'incidentID' property |\n| createdAt | Returns recommendations ordered by 'createdAt' property |\n| updatedAt | Returns recommendations ordered by 'updatedAt' property |\n| source | Returns recommendations ordered by 'source' property |\n| id | Returns recommendations ordered by 'id' property |\n| quantityToPurchase | Returns recommendations ordered by 'quantityToPurchase' property |\n| statusReason | Returns recommendations ordered by 'statusReason' property |\n| statusUpdatedAt | Returns recommendations ordered by 'statusUpdatedAt' property |\n| snoozedTargetDate | Returns recommendations ordered by 'snoozedTargetDate' property |\n| ruleBasedDimensions.\u003ckey\u003e | Returns recommendations ordered by the value of the rule-based dimension \u003ckey\u003e |\n| customTagDimensions.\u003ckey\u003e | Returns recommendations ordered by the value of the tag dimension \u003ckey\u003e |\n| billingCenterName | Returns recommendations ordered by the name of the billing center they are listed under (the Cost Center column) |\n| tags | Returns recommendations ordered by their tags joined with ', ' as the Tags column shows them ('' for none) |\n| detailsExtended.\u003ckey\u003e | Returns recommendations ordered by the value of the 'detailsExtended' entry \u003ckey\u003e. Requires view=extended, otherwise the request fails with a 400 error |\n\n### Notes\n- The orderBy is a query parameter. While it needs to be URL-encoded, examples here are provided pre-URL-encoding for clarity.\n- Multiple expressions can be comma separated.\n- All orderBy fields support two types of order: \"asc\" (ascending) and \"desc\" (descending), \"asc\" will be used if no one is specified.\n\n### Examples\n| Example | Description |\n| -------------------------- | ------------------------------------------------------------------- |\n| savings | Order recommendations by savings ascending |\n| savings desc | Order recommendations by savings descending |\n| vendor, savings desc | Order recommendations by vendor ascending, then by savings descending |\n", + "in": "query", + "name": "orderBy", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "The columns of the file, in order, each as \u003cfield\u003e:\u003cheader\u003e: the field to write and the text of its header.\nEverything after the first ':' is the header.\n### Supported Fields\n| Field | Value |\n| ------------------------- | --------------------------------------------------------------------------------------------- |\n| id, recommendation, type, policySet, source, savings, status, snoozedTargetDate, statusReason, statusUpdatedAt, service, resourceType, resourceID, resourceGroup, region, quantityToPurchase, accountName, accountID, vendor, databaseEngine, incidentID, createdAt, updatedAt, billingCenterID | The field of the recommendation, as in the paged list |\n| billingCenterName | The name of the billing center of the recommendation |\n| tags | The tags joined with ', ' |\n| detailsExtended.\u003ckey\u003e | The value of the 'detailsExtended' entry \u003ckey\u003e |\n| ruleBasedDimensions.\u003ckey\u003e | The value of the rule-based dimension \u003ckey\u003e |\n| customTagDimensions.\u003ckey\u003e | The value of the tag dimension \u003ckey\u003e |\n| recommendationExportDetails | For the Snowflake and Databricks policy sets, the 'detailsExtended' entries as 'label = value' joined with ', '; '-' for the others |\n\n### Notes\n- Values are written as stored: numbers unformatted, dates in ISO 8601, an empty cell for no value.\n", + "in": "query", + "name": "columns", + "required": true, + "schema": { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + } + }, + { + "description": "The organization ID", + "in": "path", + "name": "orgId", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "OK response.", + "headers": { + "Content-Disposition": { + "description": "The name of the file to save.", + "schema": { + "type": "string" + } + }, + "Content-Type": { + "description": "The media type of the file.", + "schema": { + "type": "string" + } + } + } + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsExportBadRequestResponseBody" + } + } + }, + "description": "Bad Request response." + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsExportForbiddenResponseBody" + } + } + }, + "description": "Forbidden response." + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsExportNotFoundResponseBody" + } + } + }, + "description": "Not Found response." + }, + "409": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsExportConflictResponseBody" + } + } + }, + "description": "Conflict response." + }, + "502": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsExportBadGatewayResponseBody" + } + } + }, + "description": "Bad Gateway response." + } + }, + "security": [ + { + "FlexeraBearerAuth": [] + } + ], + "summary": "Export recommendations as CSV", + "tags": [ + "Recommendations" + ], + "x-flexera-action": "list", + "x-flexera-resource": "recommendation-export", + "x-flexera-service": "optima_recommendations" + }, + "servers": [ + { + "description": "Flexera Optima Recommendations API", + "url": "https://api.optima{zone}.flexeraeng.com", + "variables": { + "zone": { + "default": "", + "description": "'' = NAM, -eu = EMEA, -apac = APAC", + "enum": [ + "", + "-eu", + "-apac" + ] + } + } + } + ] + }, + "/recommendations/orgs/{orgId}/recommendations/groups": { + "get": { + "description": "Groups recommendations into a tree, one level per `groupBy` field, with the number of recommendations and the total savings of every group.\nThe recommendations are selected by `filter`, in the same way as for the paged list, and the same billing center rules apply: User must have the 'optima:recommendation:index' privilege on every billing center the filter's billingCenterID clause(s) select with eq/in. If it selects none, the request covers every billing center the user can access: the whole org for a user with org-level access, otherwise the billing centers they have been granted (403 if none). Results are always confined to the billing centers the call was authorized for, whatever else the filter says.\nWhen `groupBy` includes billingCenterID, each recommendation is grouped under the authorized billing center it belongs to.\n\n**Required security scopes for GlobalSession**:\n * `common:org:affiliated+common:org:own`", + "operationId": "OptimaRecommendations_Recommendations_groupTree", + "parameters": [ + { + "description": "Optional filter for returning recommendations matching specific criteria.\n### Supported Filter Keys\n| Filter | Type | Example | Description |\n| --------------------- | ------ | ------------------------------------------------- | ------------------------------------------------------------------------------------ |\n| billingCenterID | string | billingCenterID in ['bc1', 'bc2'] | Returns recommendations under the billing centers bc1 or bc2, including descendants |\n| billingCenterName | string | billingCenterName co 'prod' | Returns recommendations listed under a billing center (the Cost Center column) whose name contains 'prod'; eq, ne, in and co only |\n| recommendation | string | recommendation co 'Delete' | Returns recommendations with 'recommendation' containing 'Delete' |\n| type | string | type eq 'Usage Reduction' | Returns recommendations of the given type |\n| vendor | string | vendor in ['AWS', 'Azure'] | Returns recommendations for either AWS or Azure |\n| policySet | string | policySet eq 'Unused Volumes' | Returns recommendations of the given policy set |\n| accountID | string | accountID eq '123456789012' | Returns recommendations for the given cloud account ID |\n| accountName | string | accountName co 'prod' | Returns recommendations for accounts with a name containing 'prod' |\n| resourceGroup | string | resourceGroup eq 'rg-main' | Returns recommendations for the given resource group |\n| region | string | region in ['us-east-1', 'eu-west-1'] | Returns recommendations in either region |\n| service | string | service eq 'EC2' | Returns recommendations for the given service |\n| databaseEngine | string | databaseEngine eq 'postgres' | Returns recommendations for the given database engine |\n| resourceType | string | resourceType eq 'm5.large' | Returns recommendations for the given resource type |\n| resourceID | string | resourceID eq 'i-0abc123' | Returns recommendations for the given resource ID |\n| savings | float | savings gt 100 | Returns recommendations with savings greater than 100 |\n| status | string | status in ['active', 'snoozed'] | Returns recommendations with the given statuses (active, snoozed, rejected, realized) |\n| incidentID | string | incidentID eq '5b06ead5e0dacc007058c784' | Returns recommendations of the given policy incident |\n| createdAt | time | createdAt gt '2022-05-20T00:00:00Z' | Returns recommendations created after 2022-05-20 |\n| updatedAt | time | updatedAt lt '2020-01-01T00:00:00Z' | Returns recommendations updated before 2020-01-01 |\n| detailsExtended.\u003ckey\u003e | string | detailsExtended.instanceFamily eq 'm5' | Returns recommendations whose 'detailsExtended' entry \u003ckey\u003e matches the value |\n| ruleBasedDimensions.\u003ckey\u003e | string | ruleBasedDimensions.rbd_bc eq 'bc1' | Returns recommendations whose rule-based dimension \u003ckey\u003e matches the value |\n| source | string | source eq 'AWS Trusted Advisor' | Returns recommendations from the given source |\n| id | string | id in ['5f1b...', '5f1c...'] | Returns the recommendations with the given IDs |\n| quantityToPurchase | float | quantityToPurchase ge 2 | Returns recommendations with a number to purchase of at least 2; none counts as 0, as the list shows it |\n| statusReason | string | statusReason co 'not needed' | Returns recommendations whose status reason (description) contains 'not needed' |\n| statusUpdatedAt | time | statusUpdatedAt gt '2026-01-01T00:00:00Z' | Returns recommendations whose status changed after 2026-01-01 |\n| snoozedTargetDate | time | snoozedTargetDate lt '2026-12-01T00:00:00Z' | Returns recommendations snoozed until before 2026-12-01 |\n| customTagDimensions.\u003ckey\u003e | string | customTagDimensions.owner eq 'team-a' | Returns recommendations whose tag dimension \u003ckey\u003e matches the value |\n| tags | string | tags eq 'env=prod, team=a' | eq/ne/in compare the whole set of tags, joined with ', ' as groupBy tags shows it ('' for none); co finds a tag among them |\n\n### Supported Operators\n- **in** - Checks if the field contains a specified value within a list.\n- **eq** - Checks if the field's value is equal to the specified value.\n- **ne** - Checks if the field's value is not equal to the specified value.\n- **co** - Checks if the field contains the specified substring.\n- **ex** - Checks whether the field has a value: resourceGroup ex true returns the recommendations that have one, resourceGroup ex false those that have none.\n- **and, or** - Logical operators used to combine multiple conditions. 'and' binds tighter than 'or' (a or b and c means a or (b and c)); use parentheses to group. Two conditions must always be joined by one of them.\n- **not** - Negates the operator that follows it, e.g. status not in ['rejected'].\n- **lt, gt, le, ge** - Relational operators used to compare the field's value against a specified value. They check for less than, greater than, less than or equal to, and greater than or equal to conditions, respectively.\n\n### Notes\n- The filter is a query parameter. While it needs to be URL-encoded, examples here are provided pre-URL-encoding for clarity.\n- A recommendation with no status (for example a Rate Reduction) counts as 'active'.\n- Without a condition on status, recommendations of every status except 'realized' are returned. 'realized' recommendations are returned only when the status condition names them, e.g. status in ['active', 'realized']; excluding a status, e.g. status ne 'rejected', does not.\n- The status key supports only the eq, ne, in, co and not operators; co matches the statuses that contain the text, e.g. status co 'act' is status in ['active']. Anything else is rejected with a 400 error.\n- co applies to text fields only: savings, quantityToPurchase, createdAt, updatedAt, statusUpdatedAt and snoozedTargetDate are compared with eq, ne, gt, ge, lt and le.\n- Combine the status condition with conditions on other fields using 'and', e.g. savings gt 5 and (status eq 'realized' or status eq 'active'). An 'or' between a status condition naming 'realized' and a condition on another field also lets that condition match realized recommendations.\n- Results are always confined to the billing centers the user is authorized for, whatever billingCenterID clauses the filter contains.\n- A detailsExtended.\u003ckey\u003e value is stored as a number or as a string: eq, ne and in with a value that reads as a number match both.\n\n### Examples\n| Example | Description |\n| ----------------------------------------------------------- | -------------------------------------------------------------------- |\n| billingCenterID in ['bc1'] and status in ['active'] | Find active recommendations under billing center 'bc1' |\n| vendor eq 'AWS' and savings gt 100 | Find AWS recommendations with savings greater than 100 |\n| region eq 'us-east-1' or region eq 'eu-west-1' | Find recommendations in either region |\n| accountName co 'prod' and status not eq 'rejected' | Find recommendations for prod accounts that are not rejected |\n| createdAt gt '2022-05-20T00:00:00Z' and policySet eq 'Idle' | Find recommendations of a policy set created after 2022-05-20 |\n", + "in": "query", + "name": "filter", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Comma separated fields to group the recommendations by. Each field adds one level to the tree, in the given order.\n### Supported Group by Fields\n| Field | Description |\n| --------------- | --------------------------------------------------------------------------------------- |\n| billingCenterID | Groups by the authorized billing center the recommendation belongs to |\n| billingCenterName | Groups by the name of that billing center (the Cost Center column) |\n| policySet | Groups by the policy set |\n| vendor | Groups by the cloud vendor |\n| accountID | Groups by the cloud account ID |\n| accountName | Groups by the cloud account name |\n| resourceGroup | Groups by the resource group |\n| region | Groups by the region |\n| service | Groups by the service |\n| databaseEngine | Groups by the database engine |\n| resourceType | Groups by the resource type |\n| type | Groups by the recommendation type |\n| status | Groups by the status (active, snoozed, rejected, realized) |\n| recommendation | Groups by the recommendation text |\n| source | Groups by the source of the recommendation |\n| resourceID | Groups by the resource ID |\n| tags | Groups by the whole set of tags, joined with ', ' ('' for none) |\n| detailsExtended.\u003ckey\u003e | Groups by the value of the 'detailsExtended' entry \u003ckey\u003e, as text |\n| ruleBasedDimensions.\u003ckey\u003e | Groups by the value of the rule-based dimension \u003ckey\u003e |\n| customTagDimensions.\u003ckey\u003e | Groups by the value of the tag dimension \u003ckey\u003e |\n| statusReason | Groups by the status reason (description) |\n| quantityToPurchase | Groups by the number to purchase, none as 0 |\n\n### Notes\n- The groupBy is a query parameter. While it needs to be URL-encoded, examples here are provided pre-URL-encoding for clarity.\n- A field can be given only once.\n- A group's recommendations are those of the paginated list filtered by the group's values, e.g. tags eq 'env=prod, team=a'.\n- The '' group holds the recommendations with no value: filter it with (\u003cfield\u003e eq '' or \u003cfield\u003e ex false), tags eq '' for tags. A recommendation with no number to purchase is in the quantityToPurchase group 0, as the list shows it.\n- The result is limited to 1000 groups (distinct combinations of the grouped values, that is the last level of the tree). A request that would return more fails with a 400 error: narrow the filter or group by fewer or less specific fields.\n- Groups on every level are ordered by the number of recommendations, largest first.\n\n### Examples\n| Example | Description |\n| ------------------- | -------------------------------------------------------------- |\n| vendor | One level: a group per vendor |\n| policySet,vendor | Two levels: a group per policy set, with a group per vendor in it |\n", + "in": "query", + "name": "groupBy", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The organization ID", + "in": "path", + "name": "orgId", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsGroupTreeResponseBody" + } + } + }, + "description": "OK response." + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsGroupTreeBadRequestResponseBody" + } + } + }, + "description": "Bad Request response." + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsGroupTreeForbiddenResponseBody" + } + } + }, + "description": "Forbidden response." + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsGroupTreeNotFoundResponseBody" + } + } + }, + "description": "Not Found response." + }, + "409": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsGroupTreeConflictResponseBody" + } + } + }, + "description": "Conflict response." + }, + "502": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsGroupTreeBadGatewayResponseBody" + } + } + }, + "description": "Bad Gateway response." + } + }, + "security": [ + { + "FlexeraBearerAuth": [] + } + ], + "summary": "Group recommendations into a tree", + "tags": [ + "Recommendations" + ], + "x-flexera-action": "list", + "x-flexera-resource": "recommendation-groups", + "x-flexera-service": "optima_recommendations" + }, + "servers": [ + { + "description": "Flexera Optima Recommendations API", + "url": "https://api.optima{zone}.flexeraeng.com", + "variables": { + "zone": { + "default": "", + "description": "'' = NAM, -eu = EMEA, -apac = APAC", + "enum": [ + "", + "-eu", + "-apac" + ] + } + } + } + ] + }, + "/recommendations/orgs/{orgId}/recommendations/paged": { + "get": { + "description": "List recommendations, filtered and sorted via a generic filter/orderBy expression, cursor-paginated.\nbillingCenterID and status scoping are done via `filter` (e.g. `billingCenterID in ['bc1'] and status in ['active']`), not separate discrete parameters, matching explorer_service's own contract for this endpoint.\nUser must have the 'optima:recommendation:index' privilege on every billing center the filter's billingCenterID clause(s) select with eq/in. If it selects none (no billingCenterID clause, or only exclusions such as ne/not), the request covers every billing center the user can access: the whole org for a user with org-level access, otherwise the billing centers they have been granted (403 if none). Results are always confined to the billing centers the call was authorized for, whatever else the filter says.\n\n**Required security scopes for GlobalSession**:\n * `common:org:affiliated+common:org:own`", + "operationId": "OptimaRecommendations_Recommendations_recommendationsPaged", + "parameters": [ + { + "description": "An optional parameter that controls the level of detail returned about policy violation data. Depending on it the data is returned in the `details` or `detailsExtended` field", + "in": "query", + "name": "view", + "required": false, + "schema": { + "default": "default", + "enum": [ + "default", + "extended" + ], + "type": "string" + } + }, + { + "description": "Optional filter for returning recommendations matching specific criteria.\n### Supported Filter Keys\n| Filter | Type | Example | Description |\n| --------------------- | ------ | ------------------------------------------------- | ------------------------------------------------------------------------------------ |\n| billingCenterID | string | billingCenterID in ['bc1', 'bc2'] | Returns recommendations under the billing centers bc1 or bc2, including descendants |\n| billingCenterName | string | billingCenterName co 'prod' | Returns recommendations listed under a billing center (the Cost Center column) whose name contains 'prod'; eq, ne, in and co only |\n| recommendation | string | recommendation co 'Delete' | Returns recommendations with 'recommendation' containing 'Delete' |\n| type | string | type eq 'Usage Reduction' | Returns recommendations of the given type |\n| vendor | string | vendor in ['AWS', 'Azure'] | Returns recommendations for either AWS or Azure |\n| policySet | string | policySet eq 'Unused Volumes' | Returns recommendations of the given policy set |\n| accountID | string | accountID eq '123456789012' | Returns recommendations for the given cloud account ID |\n| accountName | string | accountName co 'prod' | Returns recommendations for accounts with a name containing 'prod' |\n| resourceGroup | string | resourceGroup eq 'rg-main' | Returns recommendations for the given resource group |\n| region | string | region in ['us-east-1', 'eu-west-1'] | Returns recommendations in either region |\n| service | string | service eq 'EC2' | Returns recommendations for the given service |\n| databaseEngine | string | databaseEngine eq 'postgres' | Returns recommendations for the given database engine |\n| resourceType | string | resourceType eq 'm5.large' | Returns recommendations for the given resource type |\n| resourceID | string | resourceID eq 'i-0abc123' | Returns recommendations for the given resource ID |\n| savings | float | savings gt 100 | Returns recommendations with savings greater than 100 |\n| status | string | status in ['active', 'snoozed'] | Returns recommendations with the given statuses (active, snoozed, rejected, realized) |\n| incidentID | string | incidentID eq '5b06ead5e0dacc007058c784' | Returns recommendations of the given policy incident |\n| createdAt | time | createdAt gt '2022-05-20T00:00:00Z' | Returns recommendations created after 2022-05-20 |\n| updatedAt | time | updatedAt lt '2020-01-01T00:00:00Z' | Returns recommendations updated before 2020-01-01 |\n| detailsExtended.\u003ckey\u003e | string | detailsExtended.instanceFamily eq 'm5' | Returns recommendations whose 'detailsExtended' entry \u003ckey\u003e matches the value |\n| ruleBasedDimensions.\u003ckey\u003e | string | ruleBasedDimensions.rbd_bc eq 'bc1' | Returns recommendations whose rule-based dimension \u003ckey\u003e matches the value |\n| source | string | source eq 'AWS Trusted Advisor' | Returns recommendations from the given source |\n| id | string | id in ['5f1b...', '5f1c...'] | Returns the recommendations with the given IDs |\n| quantityToPurchase | float | quantityToPurchase ge 2 | Returns recommendations with a number to purchase of at least 2; none counts as 0, as the list shows it |\n| statusReason | string | statusReason co 'not needed' | Returns recommendations whose status reason (description) contains 'not needed' |\n| statusUpdatedAt | time | statusUpdatedAt gt '2026-01-01T00:00:00Z' | Returns recommendations whose status changed after 2026-01-01 |\n| snoozedTargetDate | time | snoozedTargetDate lt '2026-12-01T00:00:00Z' | Returns recommendations snoozed until before 2026-12-01 |\n| customTagDimensions.\u003ckey\u003e | string | customTagDimensions.owner eq 'team-a' | Returns recommendations whose tag dimension \u003ckey\u003e matches the value |\n| tags | string | tags eq 'env=prod, team=a' | eq/ne/in compare the whole set of tags, joined with ', ' as groupBy tags shows it ('' for none); co finds a tag among them |\n\n### Supported Operators\n- **in** - Checks if the field contains a specified value within a list.\n- **eq** - Checks if the field's value is equal to the specified value.\n- **ne** - Checks if the field's value is not equal to the specified value.\n- **co** - Checks if the field contains the specified substring.\n- **ex** - Checks whether the field has a value: resourceGroup ex true returns the recommendations that have one, resourceGroup ex false those that have none.\n- **and, or** - Logical operators used to combine multiple conditions. 'and' binds tighter than 'or' (a or b and c means a or (b and c)); use parentheses to group. Two conditions must always be joined by one of them.\n- **not** - Negates the operator that follows it, e.g. status not in ['rejected'].\n- **lt, gt, le, ge** - Relational operators used to compare the field's value against a specified value. They check for less than, greater than, less than or equal to, and greater than or equal to conditions, respectively.\n\n### Notes\n- The filter is a query parameter. While it needs to be URL-encoded, examples here are provided pre-URL-encoding for clarity.\n- A recommendation with no status (for example a Rate Reduction) counts as 'active'.\n- Without a condition on status, recommendations of every status except 'realized' are returned. 'realized' recommendations are returned only when the status condition names them, e.g. status in ['active', 'realized']; excluding a status, e.g. status ne 'rejected', does not.\n- The status key supports only the eq, ne, in, co and not operators; co matches the statuses that contain the text, e.g. status co 'act' is status in ['active']. Anything else is rejected with a 400 error.\n- co applies to text fields only: savings, quantityToPurchase, createdAt, updatedAt, statusUpdatedAt and snoozedTargetDate are compared with eq, ne, gt, ge, lt and le.\n- Combine the status condition with conditions on other fields using 'and', e.g. savings gt 5 and (status eq 'realized' or status eq 'active'). An 'or' between a status condition naming 'realized' and a condition on another field also lets that condition match realized recommendations.\n- Results are always confined to the billing centers the user is authorized for, whatever billingCenterID clauses the filter contains.\n- A detailsExtended.\u003ckey\u003e value is stored as a number or as a string: eq, ne and in with a value that reads as a number match both.\n\n### Examples\n| Example | Description |\n| ----------------------------------------------------------- | -------------------------------------------------------------------- |\n| billingCenterID in ['bc1'] and status in ['active'] | Find active recommendations under billing center 'bc1' |\n| vendor eq 'AWS' and savings gt 100 | Find AWS recommendations with savings greater than 100 |\n| region eq 'us-east-1' or region eq 'eu-west-1' | Find recommendations in either region |\n| accountName co 'prod' and status not eq 'rejected' | Find recommendations for prod accounts that are not rejected |\n| createdAt gt '2022-05-20T00:00:00Z' and policySet eq 'Idle' | Find recommendations of a policy set created after 2022-05-20 |\n", + "in": "query", + "name": "filter", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Optional order by for returning recommendations in a specific order.\n### Supported Order by Keys\n| Key | Description |\n| -------------------- | ------------------------------------------------------------------------------- |\n| recommendation | Returns recommendations ordered by 'recommendation' property |\n| type | Returns recommendations ordered by 'type' property |\n| vendor | Returns recommendations ordered by 'vendor' property |\n| policySet | Returns recommendations ordered by 'policySet' property |\n| accountID | Returns recommendations ordered by 'accountID' property |\n| accountName | Returns recommendations ordered by 'accountName' property |\n| resourceGroup | Returns recommendations ordered by 'resourceGroup' property |\n| region | Returns recommendations ordered by 'region' property |\n| service | Returns recommendations ordered by 'service' property |\n| databaseEngine | Returns recommendations ordered by 'databaseEngine' property |\n| resourceType | Returns recommendations ordered by 'resourceType' property |\n| resourceID | Returns recommendations ordered by 'resourceID' property |\n| savings | Returns recommendations ordered by 'savings' property |\n| status | Returns recommendations ordered by the status as filtered: one without a status as active, realized among the others |\n| incidentID | Returns recommendations ordered by 'incidentID' property |\n| createdAt | Returns recommendations ordered by 'createdAt' property |\n| updatedAt | Returns recommendations ordered by 'updatedAt' property |\n| source | Returns recommendations ordered by 'source' property |\n| id | Returns recommendations ordered by 'id' property |\n| quantityToPurchase | Returns recommendations ordered by 'quantityToPurchase' property |\n| statusReason | Returns recommendations ordered by 'statusReason' property |\n| statusUpdatedAt | Returns recommendations ordered by 'statusUpdatedAt' property |\n| snoozedTargetDate | Returns recommendations ordered by 'snoozedTargetDate' property |\n| ruleBasedDimensions.\u003ckey\u003e | Returns recommendations ordered by the value of the rule-based dimension \u003ckey\u003e |\n| customTagDimensions.\u003ckey\u003e | Returns recommendations ordered by the value of the tag dimension \u003ckey\u003e |\n| billingCenterName | Returns recommendations ordered by the name of the billing center they are listed under (the Cost Center column) |\n| tags | Returns recommendations ordered by their tags joined with ', ' as the Tags column shows them ('' for none) |\n| detailsExtended.\u003ckey\u003e | Returns recommendations ordered by the value of the 'detailsExtended' entry \u003ckey\u003e. Requires view=extended, otherwise the request fails with a 400 error |\n\n### Notes\n- The orderBy is a query parameter. While it needs to be URL-encoded, examples here are provided pre-URL-encoding for clarity.\n- Multiple expressions can be comma separated.\n- All orderBy fields support two types of order: \"asc\" (ascending) and \"desc\" (descending), \"asc\" will be used if no one is specified.\n\n### Examples\n| Example | Description |\n| -------------------------- | ------------------------------------------------------------------- |\n| savings | Order recommendations by savings ascending |\n| savings desc | Order recommendations by savings descending |\n| vendor, savings desc | Order recommendations by vendor ascending, then by savings descending |\n", + "in": "query", + "name": "orderBy", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "An opaque token to be provided when requesting a subsequent page after receiving a partial response. \nPartial responses will include a \"nextPage\" attribute in their response body, which contains the URL of the next page including the appropriate skipToken.", + "in": "query", + "name": "skipToken", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "Custom pagination limit to be used.", + "in": "query", + "name": "limit", + "required": false, + "schema": { + "type": "integer" + } + }, + { + "description": "The organization ID", + "in": "path", + "name": "orgId", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsRecommendationsPagedResponseBody" + } + } + }, + "description": "OK response." + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsRecommendationsPagedBadRequestResponseBody" + } + } + }, + "description": "Bad Request response." + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsRecommendationsPagedForbiddenResponseBody" + } + } + }, + "description": "Forbidden response." + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsRecommendationsPagedNotFoundResponseBody" + } + } + }, + "description": "Not Found response." + }, + "409": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsRecommendationsPagedConflictResponseBody" + } + } + }, + "description": "Conflict response." + }, + "502": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsRecommendationsPagedBadGatewayResponseBody" + } + } + }, + "description": "Bad Gateway response." + } + }, + "security": [ + { + "FlexeraBearerAuth": [] + } + ], + "summary": "List recommendations (filtered, sorted, cursor-paginated)", + "tags": [ + "Recommendations" + ], + "x-flexera-action": "list", + "x-flexera-list-item-ref": "#/components/schemas/OptimaRecommendations_RecommendationResultResponseBody", + "x-flexera-paginated": true, + "x-flexera-resource": "recommendation-paged", + "x-flexera-service": "optima_recommendations" + }, + "servers": [ + { + "description": "Flexera Optima Recommendations API", + "url": "https://api.optima{zone}.flexeraeng.com", + "variables": { + "zone": { + "default": "", + "description": "'' = NAM, -eu = EMEA, -apac = APAC", + "enum": [ + "", + "-eu", + "-apac" + ] + } + } + } + ] + }, + "/recommendations/orgs/{orgId}/recommendations/savings-summary": { + "get": { + "description": "Summary data for the Optimization overview page widgets (Total Potential Savings, Rate Reduction Savings, Usage Reduction Savings).\nUser must have the 'optima:recommendation:index' privilege on the org or on the specified billing center(s) to make this call.\n\n**Required security scopes for GlobalSession**:\n * `common:org:affiliated+common:org:own`", + "operationId": "OptimaRecommendations_Recommendations_savingsSummary", + "parameters": [ + { + "description": "IDs of BillingCenters to get the savings summary for. It is not allowed for any of the BillingCenterIDs to be an ancestor of another specified BillingCenterID.", + "in": "query", + "name": "billingCenterIDs", + "required": false, + "schema": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + { + "description": "The organization ID", + "in": "path", + "name": "orgId", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsSavingsSummaryResponseBody" + } + } + }, + "description": "OK response." + }, + "400": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsSavingsSummaryBadRequestResponseBody" + } + } + }, + "description": "Bad Request response." + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsSavingsSummaryForbiddenResponseBody" + } + } + }, + "description": "Forbidden response." + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsSavingsSummaryNotFoundResponseBody" + } + } + }, + "description": "Not Found response." + }, + "409": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsSavingsSummaryConflictResponseBody" + } + } + }, + "description": "Conflict response." + }, + "502": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OptimaRecommendations_RecommendationsSavingsSummaryBadGatewayResponseBody" + } + } + }, + "description": "Bad Gateway response." + } + }, + "security": [ + { + "FlexeraBearerAuth": [] + } + ], + "summary": "Summary data for the Optimization overview page widgets", + "tags": [ + "Recommendations" + ], + "x-flexera-action": "list", + "x-flexera-resource": "recommendation-savings-summary", + "x-flexera-service": "optima_recommendations" + }, + "servers": [ + { + "description": "Flexera Optima Recommendations API", + "url": "https://api.optima{zone}.flexeraeng.com", + "variables": { + "zone": { + "default": "", + "description": "'' = NAM, -eu = EMEA, -apac = APAC", + "enum": [ + "", + "-eu", + "-apac" + ] + } + } + } + ] + }, "/recommendations/orgs/{orgId}/recommendations/updatestatus": { "put": { "description": "Update the status of a recommendation\n\n**Required security scopes for GlobalSession**:\n * `common:org:affiliated+common:org:own`", @@ -231137,7 +236130,7 @@ }, "/vis/v2/orgs/{orgId}/devices/delete/estimate": { "post": { - "description": "Returns an estimated number of device evidences associated with the datasource data that would be deleted using the query.", + "description": "Estimates the device evidence that would be deleted for the specified device IDs, grouped by datasource.\n\nA datasource is included if it matches any datasource selector. If no datasource selectors are provided, evidence from every datasource associated with the specified devices is included.\n\nThe estimate reflects the inventory available when the request is made. Because inventory may change, it does not guarantee that a later request will delete the same evidence.\n\n### Client guidance\n* Submit no more than 500 unique device IDs per request. This recommendation is not enforced, but larger requests provide no processing benefit and may increase latency or timeout risk.\n* Split larger workloads into batches and process them sequentially. Use the same datasource selectors for every batch in one logical operation.\n* There is currently no specific concurrency limit or hard cap in place. We recommend that customers test and tune their request volume based on their network conditions, performance requirements, and business needs.\n* The API does not automatically retry failed estimate requests. Clients may retry transient failures using exponential backoff with jitter.", "operationId": "Vis_Device_estimateDelete", "parameters": [ { @@ -231160,19 +236153,12 @@ "example": { "datasourceSelectors": [ { - "field": "type", - "value": "SCCM" - }, - { - "field": "type", - "value": "SCCM" + "field": "id", + "value": "a8d416e5-7212-4a9a-93f3-0b8602ad06f4" } ], "deviceIds": [ - "Quo nesciunt fuga laborum quam.", - "Corrupti atque quibusdam est sit maiores fugit.", - "Similique eum ratione accusantium ea id ut.", - "Culpa qui aspernatur neque." + "4e0e3471-ccbc-41c7-a21e-c384f2eb5669" ] }, "schema": { @@ -231191,25 +236177,15 @@ "count": 150, "datasourceId": "4e0e3471-ccbc-41c7-a21e-c384f2eb5669", "datasourceName": "SCCM_PROD_AP", - "datasourceType": "SCCM" + "datasourceType": "SCCM", + "kind": "vis:device-deletion-summary" }, { - "count": 150, - "datasourceId": "4e0e3471-ccbc-41c7-a21e-c384f2eb5669", - "datasourceName": "SCCM_PROD_AP", - "datasourceType": "SCCM" - }, - { - "count": 150, - "datasourceId": "4e0e3471-ccbc-41c7-a21e-c384f2eb5669", - "datasourceName": "SCCM_PROD_AP", - "datasourceType": "SCCM" - }, - { - "count": 150, - "datasourceId": "4e0e3471-ccbc-41c7-a21e-c384f2eb5669", - "datasourceName": "SCCM_PROD_AP", - "datasourceType": "SCCM" + "count": 42, + "datasourceId": "a8d416e5-7212-4a9a-93f3-0b8602ad06f4", + "datasourceName": "ServiceNow Import", + "datasourceType": "ServiceNow", + "kind": "vis:device-deletion-summary" } ], "schema": { @@ -231218,13 +236194,15 @@ "count": 150, "datasourceId": "4e0e3471-ccbc-41c7-a21e-c384f2eb5669", "datasourceName": "SCCM_PROD_AP", - "datasourceType": "SCCM" + "datasourceType": "SCCM", + "kind": "vis:device-deletion-summary" }, { - "count": 150, - "datasourceId": "4e0e3471-ccbc-41c7-a21e-c384f2eb5669", - "datasourceName": "SCCM_PROD_AP", - "datasourceType": "SCCM" + "count": 42, + "datasourceId": "a8d416e5-7212-4a9a-93f3-0b8602ad06f4", + "datasourceName": "ServiceNow Import", + "datasourceType": "ServiceNow", + "kind": "vis:device-deletion-summary" } ], "items": { @@ -231350,7 +236328,7 @@ "FlexeraBearerAuth": [] } ], - "summary": "Estimate device evidence that would be deleted using the query", + "summary": "Estimate device evidence deletion", "tags": [ "Device" ], @@ -231361,7 +236339,7 @@ }, "/vis/v2/orgs/{orgId}/devices/delete/submit": { "post": { - "description": "Deletes device evidence for the specified device IDs and datasource selectors.", + "description": "Submits a request to delete device evidence for the specified device IDs.\n\nA datasource is included if it matches any datasource selector. If no datasource selectors are provided, evidence from every datasource associated with the specified devices is included.\n\nSubmitting a deletion request does not guarantee that all selected evidence will be deleted because inventory may change while the request is processed. If a device remains active in the environment, its evidence may reappear after new inventory data is collected.\n\nRepeating a deletion request is allowed and does not return an error when the selected evidence has already been deleted.\n\n### Client guidance\n* Submit no more than 500 unique device IDs per request. This recommendation is not enforced, but larger requests provide no processing benefit and may increase latency or timeout risk.\n* Split larger workloads into batches and process one batch at a time per organization. Use the same datasource selectors for every batch in one logical operation.\n* There is currently no specific concurrency limit or hard cap in place. We recommend that customers test and tune their request volume based on their network conditions, performance requirements, and business needs.\n* The API does not automatically retry failed deletion requests. Clients must not automatically retry timed-out requests because inventory may change and the original deletion may already have been submitted.", "operationId": "Vis_Device_delete", "parameters": [ { @@ -231384,18 +236362,12 @@ "example": { "datasourceSelectors": [ { - "field": "type", - "value": "SCCM" - }, - { - "field": "type", - "value": "SCCM" + "field": "id", + "value": "a8d416e5-7212-4a9a-93f3-0b8602ad06f4" } ], "deviceIds": [ - "Id suscipit.", - "Explicabo dolore corrupti esse.", - "Quia iste velit doloremque quisquam." + "4e0e3471-ccbc-41c7-a21e-c384f2eb5669" ] }, "schema": { @@ -231411,43 +236383,21 @@ "application/json": { "example": [ { - "count": 150, - "datasourceId": "4e0e3471-ccbc-41c7-a21e-c384f2eb5669", - "datasourceName": "SCCM_PROD_AP", - "datasourceType": "SCCM" - }, - { - "count": 150, - "datasourceId": "4e0e3471-ccbc-41c7-a21e-c384f2eb5669", - "datasourceName": "SCCM_PROD_AP", - "datasourceType": "SCCM" + "count": 42, + "datasourceId": "a8d416e5-7212-4a9a-93f3-0b8602ad06f4", + "datasourceName": "ServiceNow Import", + "datasourceType": "ServiceNow", + "kind": "vis:device-deletion-summary" } ], "schema": { "example": [ { - "count": 150, - "datasourceId": "4e0e3471-ccbc-41c7-a21e-c384f2eb5669", - "datasourceName": "SCCM_PROD_AP", - "datasourceType": "SCCM" - }, - { - "count": 150, - "datasourceId": "4e0e3471-ccbc-41c7-a21e-c384f2eb5669", - "datasourceName": "SCCM_PROD_AP", - "datasourceType": "SCCM" - }, - { - "count": 150, - "datasourceId": "4e0e3471-ccbc-41c7-a21e-c384f2eb5669", - "datasourceName": "SCCM_PROD_AP", - "datasourceType": "SCCM" - }, - { - "count": 150, - "datasourceId": "4e0e3471-ccbc-41c7-a21e-c384f2eb5669", - "datasourceName": "SCCM_PROD_AP", - "datasourceType": "SCCM" + "count": 42, + "datasourceId": "a8d416e5-7212-4a9a-93f3-0b8602ad06f4", + "datasourceName": "ServiceNow Import", + "datasourceType": "ServiceNow", + "kind": "vis:device-deletion-summary" } ], "items": { @@ -231573,7 +236523,7 @@ "FlexeraBearerAuth": [] } ], - "summary": "delete the device evidence for the given device ids using the query", + "summary": "Delete device evidence", "tags": [ "Device" ], @@ -231648,13 +236598,6 @@ "size": 1080, "type": "snapshot" }, - { - "createdAt": "2018-05-16T16:31:52.1000Z", - "id": "7d795afa-c508-4d47-92ae-248113a792d1", - "name": "hardware_inventory", - "size": 1080, - "type": "snapshot" - }, { "createdAt": "2018-05-16T16:31:52.1000Z", "id": "7d795afa-c508-4d47-92ae-248113a792d1", @@ -231833,11 +236776,11 @@ "headers": { "Content-Length": { "description": "content length in bytes of file", - "example": 7729251450684401000, + "example": 9062665688256244000, "required": true, "schema": { "description": "content length in bytes of file", - "example": 4773412612854586000, + "example": 5681364957264677000, "format": "int64", "type": "integer" }