DoiT Budgets API

Track actual cloud spend against planned spend.

Business capability
IT Financial Management BC-600.80

Operations 5

Each operation below carries the questions people ask an LLM about it and the instructions they give an agent to run it. Generated by API Evangelist overlay

GET /analytics/v1/budgets List budgets · List budgets #
Ask an LLM
“What budgets do we have for cloud spend?”
“Can I list only budgets created in a given period?”
Tell an agent
List all budgets.
List budgets created after {since}.
POST /analytics/v1/budgets Create a budget · Create a budget #
Ask an LLM
“How do I set a monthly cloud spend budget?”
“Can a new budget send alerts to a Slack channel?”
Tell an agent
Create budget {name} for {amount} {currency}.
Create a {timeInterval} budget {name} with alerts {alerts}.
GET /analytics/v1/budgets/{id} Check a budget's utilization · Retrieve a budget #
Ask an LLM
“How much of a budget have we used so far?”
“What is the current configuration of a specific budget?”
Tell an agent
Get budget {id}.
Show current utilization for budget {id}.
DELETE /analytics/v1/budgets/{id} Delete a budget · Delete a budget #
Ask an LLM
“How do I delete a budget we no longer track?”
“Can I remove a budget permanently?”
Tell an agent destructive · confirm first
Delete budget {id}.
Remove budget {id}.
PATCH /analytics/v1/budgets/{id} Update an existing budget · Update a budget #
Ask an LLM
“How do I raise the amount on a budget I already have?”
“Can I change who gets notified by an existing budget?”
Tell an agent
Change budget {id} amount to {amount}.
Set recipients of budget {id} to {recipients}.

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/doit:doit-budgets-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

doit-budgets-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: DoiT Budgets API
  description: Programmatic access to DoiT Platform
  version: v1
servers:
- url: https://api.doit.com
security:
- api_key: []
- tenantId: []
  api_key: []
tags:
- name: Budgets
  description: Track actual cloud spend against planned spend.
paths:
  /analytics/v1/budgets:
    get:
      tags:
      - Budgets
      summary: List budgets
      description: 'Returns a list of budgets that your account has access to. Budgets are listed in reverse chronological order by default.

        Each budget includes a server-computed `riskStatus` (`atRisk`, `onTrack`, or `unknown`), and the response includes a `riskAggregations` summary of risk counts across the full filtered result set (all pages, not just the current page).'
      operationId: listBudgets
      parameters:
      - name: maxResults
        in: query
        description: The maximum number of results to return in a single page. Leverage the page tokens to iterate through the entire collection.
        schema:
          type: integer
          format: int64
          default: 50
      - $ref: '#/components/parameters/pageToken'
      - name: filter
        in: query
        description: 'An expression for filtering the results of the request. The syntax is "key:[<value>]".

          Available keys: owner, budgetName, lastModified in ms (>lasModified), riskStatus (one of "atRisk", "onTrack", "unknown"). Multiple filters can be connected using a pipe |. Note that using different keys in the same filter results in "AND," while using the same key multiple times in the same filter results in "OR" (except riskStatus, where only the first occurrence is honored).

          A budget is "atRisk" when it has already exceeded its configured amount, or its forecast projects it will exceed the configured amount before the current period ends. Budgets with no forecast data yet, a fixed budget whose period has already expired, or that are invalid/draft are classified "unknown". Filtering to riskStatus:atRisk sorts results by earliest projected breach date (day granularity) ascending instead of the default order; budgets that tie on breach day, including every already-breached budget, resolve to a fixed, repeatable order across requests rather than an arbitrary one.

          Because riskStatus is computed from live, periodically-refreshed budget data, paginated results filtered by riskStatus may shift between page requests if budget data refreshes mid-pagination.'
        example: riskStatus:atRisk
        schema:
          type: string
      - $ref: '#/components/parameters/nameContains'
      - name: minCreationTime
        in: query
        description: Min value for reports creation time, in milliseconds since the POSIX epoch. If set, only reports created after or at this timestamp are returned.
        schema:
          type: string
      - name: maxCreationTime
        in: query
        description: Max value for reports creation time, in milliseconds since the POSIX epoch. If set, only reports created before or at this timestamp are returned.
        schema:
          type: string
      responses:
        '200':
          description: OK - The request succeeded.
          content:
            application/json:
              schema:
                type: object
                properties:
                  budgets:
                    type: array
                    description: Array of Budgets
                    items:
                      $ref: '#/components/schemas/BudgetListItem'
                  pageToken:
                    type: string
                    description: Page token, returned by a previous call, to request the next page of results
                  rowCount:
                    type: integer
                    description: Budgets rows count
                    format: int64
                  riskAggregations:
                    $ref: '#/components/schemas/RiskAggregations'
        '400':
          $ref: '#/components/responses/400'
        '401':
          $ref: '#/components/responses/401'
        '403':
          $ref: '#/components/responses/403'
        '404':
          $ref: '#/components/responses/404'
    post:
      tags:
      - Budgets
      summary: Create a budget
      description: Create a new budget
      operationId: createBudget
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BudgetCreateUpdateRequest'
            example:
              name: monthly-cloud-budget
              amount: 100
              currency: USD
              usePrevSpend: false
              type: recurring
              timeInterval: month
              startPeriod: 1704067200000
              scopes:
              - id: cloud_provider
                type: fixed
                mode: is
                values:
                - amazon-web-services
              collaborators:
              - role: owner
                email: placeholder@example.com
      responses:
        '201':
          description: Created - New budget created.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BudgetAPI'
          links:
            getBudget:
              operationId: getBudget
              parameters:
                id: $response.body#/id
            updateBudget:
              operationId: updateBudget
              parameters:
                id: $response.body#/id
            deleteBudget:
              operationId: deleteBudget
              parameters:
                id: $response.body#/id
        '400':
          $ref: '#/components/responses/400'
        '401':
          $ref: '#/components/responses/401'
        '403':
          $ref: '#/components/responses/403'
        '404':
          $ref: '#/components/responses/404'
      x-codegen-request-body-name: Body
  /analytics/v1/budgets/{id}:
    get:
      tags:
      - Budgets
      summary: Retrieve a budget
      description: Returns the current utilization and configuration of the specified budget.
      operationId: getBudget
      parameters:
      - name: id
        in: path
        description: Budget ID
        required: true
        schema:
          type: string
      responses:
        '200':
          description: OK - Budget details returned.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BudgetAPI'
        '400':
          $ref: '#/components/responses/400'
        '401':
          $ref: '#/components/responses/401'
        '403':
          $ref: '#/components/responses/403'
        '404':
          $ref: '#/components/responses/404'
    delete:
      tags:
      - Budgets
      summary: Delete a budget
      description: Deletes the specified budget.
      operationId: deleteBudget
      parameters:
      - name: id
        in: path
        description: Budget ID
        required: true
        schema:
          type: string
      responses:
        '200':
          description: OK - Budget deleted.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: false
              example: {}
        '400':
          $ref: '#/components/responses/400'
        '401':
          $ref: '#/components/responses/401'
        '403':
          $ref: '#/components/responses/403'
        '404':
          $ref: '#/components/responses/404'
    patch:
      tags:
      - Budgets
      summary: Update a budget
      description: Updates the specified budget.
      operationId: updateBudget
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BudgetCreateUpdateRequest'
        required: false
      responses:
        '200':
          description: OK - Budget updated.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BudgetAPI'
          links:
            deleteBudget:
              operationId: deleteBudget
              parameters:
                id: $response.body#/id
        '400':
          $ref: '#/components/responses/400'
        '401':
          $ref: '#/components/responses/401'
        '403':
          $ref: '#/components/responses/403'
        '404':
          $ref: '#/components/responses/404'
      x-codegen-request-body-name: Body
components:
  schemas:
    ExternalConfigFilter:
      description: 'To include or exclude certain values.

        When using allocation rules as a filter, both the type and the ID must be "allocation_rule", and the values array contains the allocation rule IDs.

        When using allocations as a filter, the type must be "allocation" and the ID is the actual allocation group ID.'
      type: object
      required:
      - id
      - type
      properties:
        id:
          type: string
          description: 'Dimension key to filter on. Must pair with `type` and match a dimension returned by `GET /analytics/v1/dimensions` (for example, `service_description` with `type: fixed`). For `allocation_rule`, use `allocation_rule`. For `allocation`, use the allocation group ID. See `DimensionsTypes` for how each `type` uses `id`.'
        type:
          $ref: '#/components/schemas/DimensionsTypes'
        values:
          type: array
          description: List of values to include or exclude. Must match exact strings from your billing or DataHub data for the dimension (for example, `Amazon Simple Storage Service` for AWS S3 on `service_description`). For `allocation_rule`, use allocation rule IDs.
          items:
            type: string
        mode:
          type: string
          description: Controls how the dimension’s `values` are matched when the alert query runs. If mode is omitted, behavior defaults to is.
          enum:
          - is
          - starts_with
          - ends_with
          - contains
          - regexp
          x-enumDescriptions:
            is: Exact match on one or more values.
            starts_with: Value starts with the given string(s).
            ends_with: Value ends with the given string(s).
            contains: Value contains the given string(s).
            regexp: Value matches the regular expression in `values` (exactly one pattern).
        inverse:
          type: boolean
          description: Set to `true` to exclude the set values. If inverse is omitted, behavior defaults to `false`.
        caseInsensitive:
          type: boolean
          description: If true, string matching is case-insensitive. Effective only for starts_with, ends_with, and contains modes; ignored otherwise.
          default: false
        includeNull:
          type: boolean
          description: Include rows where the dimension is null. If includeNull is omitted, behavior defaults to `false`.
          default: false
      example:
        id: cloud_provider
        type: fixed
        inverse: false
        values:
        - google-cloud
    BudgetAPI:
      required:
      - currency
      - name
      - scopes
      - startPeriod
      - timeInterval
      - type
      type: object
      description: Budget details and runtime metrics.
      properties:
        alerts:
          type: array
          description: List of up to three thresholds defined as a percentage of amount.
          items:
            $ref: '#/components/schemas/ExternalBudgetAlert'
        amount:
          type: number
          description: 'Budget period amount

            required: true(if usePrevSpend is false)'
          format: double
        seasonalAmounts:
          type: array
          description: List of seasonal amounts for recurring budgets with different amounts per period.
          items:
            type: number
            format: double
        collaborators:
          type: array
          description: List of permitted users to view/edit the report.
          items:
            $ref: '#/components/schemas/Collaborator'
        createTime:
          type: integer
          description: Creation time (in UNIX timestamp).
          format: int64
        currency:
          $ref: '#/components/schemas/Currency'
        currentUtilization:
          type: number
          format: double
        description:
          type: string
          description: Budget description.
        endPeriod:
          type: integer
          description: 'Fixed budget end date (in UNIX timestamp)

            required: true(if budget type is fixed)'
          format: int64
        forecastedUtilization:
          type: number
          format: double
        growthPerPeriod:
          type: number
          description: Periodical growth percentage in recurring budgets.
          format: double
          default: 0
        id:
          type: string
          description: 'budget ID, identifying the report

            in:path'
        metric:
          type: string
          description: Budget metric - currently fixed to "cost"
          default: cost
        name:
          type: string
          description: Budget Name
        public:
          description: Public sharing access level for the budget.
          type: string
          enum:
          - owner
          - editor
          - viewer
        recipients:
          type: array
          description: List of emails to notify when reaching alert threshold.
          items:
            type: string
        recipientsSlackChannels:
          type: array
          description: List of Slack channels to notify when reaching alert threshold.
          items:
            $ref: '#/components/schemas/SlackChannel'
        scopes:
          type: array
          description: The filters selected define the scope of the budget.
          items:
            $ref: '#/components/schemas/ExternalConfigFilter'
        startPeriod:
          type: integer
          description: Budget start date (in UNIX timestamp).
          format: int64
        timeInterval:
          type: string
          description: 'Recurring budget interval can be one of: ["day", "week", "month", "quarter" ,"year"]'
        type:
          type: string
          description: 'budget type can be one of: ["fixed", "recurring"]'
        updateTime:
          type: integer
          description: Update time (in UNIX timestamp).
          format: int64
        usePrevSpend:
          type: boolean
          description: Use the last period's spend as the target amount for recurring budgets.
          default: false
    Error:
      type: object
      description: Standard error response structure.
      properties:
        error:
          type: string
          description: Detailed error message.
    Currency:
      description: Currency code for monetary values.
      type: string
      enum:
      - USD
      - ILS
      - EUR
      - AUD
      - CAD
      - GBP
      - DKK
      - NOK
      - SEK
      - BRL
      - SGD
      - MXN
      - CHF
      - MYR
      - TWD
      - EGP
      - ZAR
      - JPY
      - IDR
      - AED
      - THB
      - COP
    AlertThreshold:
      type: object
      description: A numeric or percentage threshold.
      properties:
        amount:
          type: number
          format: double
        percentage:
          type: number
          format: double
    BudgetListItem:
      type: object
      description: Summary information for a budget.
      properties:
        alertThresholds:
          type: array
          items:
            $ref: '#/components/schemas/AlertThreshold'
        amount:
          type: number
          format: double
        budgetName:
          type: string
        createTime:
          type: integer
          format: int64
        currency:
          type: string
        currentUtilization:
          type: number
          format: double
        endPeriod:
          type: integer
          format: int64
        forecastedUtilizationDate:
          type: integer
          format: int64
        id:
          type: string
        owner:
          type: string
        riskStatus:
          type: string
          description: 'Server-computed risk classification, based on current utilization and forecasted breach date relative to the configured amount and current period end.

            "atRisk" - the budget has already exceeded its configured amount, or its forecast projects it will before the current period ends.

            "onTrack" - the budget has forecast data and is neither over budget nor projected to breach.

            "unknown" - no forecast data is available yet, the budget is a fixed budget whose period has already expired, or the budget is invalid/draft.'
          enum:
          - atRisk
          - onTrack
          - unknown
        scopes:
          type: array
          description: The filters selected define the scope of the budget.
          items:
            $ref: '#/components/schemas/ExternalConfigFilter'
        startPeriod:
          type: integer
          format: int64
        timeInterval:
          type: string
        updateTime:
          type: integer
          format: int64
        url:
          type: string
    BudgetCreateUpdateRequest:
      type: object
      description: Request body for creating or updating a budget.
      properties:
        alerts:
          type: array
          description: List of up to three thresholds defined as a percentage of the amount.
          items:
            $ref: '#/components/schemas/BudgetCreateUpdateAlert'
        amount:
          type: number
          description: 'Budget period amount

            required: true(if usePrevSpend is false)'
          format: double
        seasonalAmounts:
          type: array
          description: List of seasonal amounts for recurring budgets with different amounts per period.
          items:
            type: number
            format: double
        collaborators:
          type: array
          description: List of permitted users to view/edit the report.
          items:
            $ref: '#/components/schemas/Collaborator'
        currency:
          $ref: '#/components/schemas/Currency'
        description:
          type: string
          description: Budget description
          default: ''
        endPeriod:
          type: integer
          description: 'Fixed budget end date

            required: true(if budget type is fixed)'
          format: int64
        growthPerPeriod:
          type: number
          description: Periodical growth percentage in recurring budget
          format: double
          default: 0
        metric:
          type: string
          description: Budget metric
          enum:
          - cost
          - amortized_cost
          default: cost
        name:
          type: string
          description: Budget Name.
        public:
          type: string
          enum:
          - owner
          - editor
          - viewer
        recipients:
          type: array
          description: List of emails to notify when reaching alert threshold.
          items:
            type: string
        recipientsSlackChannels:
          type: array
          description: List of Slack channels to notify when reaching alert threshold.
          items:
            $ref: '#/components/schemas/SlackChannel'
        scopes:
          type: array
          description: The filters selected define the scope of the budget.
          items:
            $ref: '#/components/schemas/ExternalConfigFilter'
        startPeriod:
          type: integer
          description: Budget start Date
          format: int64
        timeInterval:
          type: string
          description: 'Recurring budget interval can be one of: ["day", "week", "month", "quarter", "year"]'
        type:
          type: string
          description: 'budget type can be one of: ["fixed", "recurring"]'
        usePrevSpend:
          type: boolean
          description: Use the last period's spend as the target amount for recurring budgets
          default: false
    BudgetCreateUpdateAlert:
      type: object
      description: Threshold settings for budget alerts.
      properties:
        percentage:
          type: number
          format: double
    RiskAggregations:
      type: object
      description: Aggregate counts of risk statuses across the full filtered result set (all pages), not just the current page.
      required:
      - total
      - atRisk
      - onTrack
      - unknown
      properties:
        total:
          type: integer
          format: int64
        atRisk:
          type: integer
          format: int64
        onTrack:
          type: integer
          format: int64
        unknown:
          type: integer
          format: int64
    ExternalBudgetAlert:
      type: object
      description: Budget alert status details.
      properties:
        forecastedDate:
          type: integer
          format: int64
        percentage:
          type: number
          format: double
        triggered:
          type: boolean
    SlackChannel:
      type: object
      description: Information of a Slack channel for notifications. `customerId` and `workspace` are required unless `shared` is true.
      required:
      - id
      properties:
        customerId:
          type: string
        id:
          type: string
        name:
          type: string
        shared:
          type: boolean
        type:
          type: string
        workspace:
          type: string
    Collaborator:
      type: object
      description: A user or identity that has access to a resource.
      properties:
        email:
          type: string
        role:
          type: string
          enum:
          - owner
          - editor
          - viewer
    DimensionsTypes:
      description: Dimension filter type. Always pair `type` with `id` on scope filters. Discover valid `id` + `type` pairs for your account with `GET /analytics/v1/dimensions`. `allocation_rule` replaces `attribution`; `allocation` replaces `attribution_group`.
      type: string
      enum:
      - datetime
      - fixed
      - optional
      - label
      - tag
      - project_label
      - system_label
      - attribution
      - attribution_group
      - allocation
      - allocation_rule
      - gke
      - gke_label
      x-enumDescriptions:
        fixed: Standard built-in billing dimensions (Service, Provider, Project/Account ID, SKU, Region, etc.).
        label: Customer-defined resource labels; id is the label key, values are label values.
        tag: AWS cost allocation tags; id is the tag key.
        project_label: Google Cloud project-level labels; id is the label key.
        system_label: DoiT- or provider-generated system labels; id is the system label key.
        optional: Console grouping for label/tag keys; use label, tag, project_label, or system_label in API scopes.
        datetime: Time dimensions (Year, Month, Day) for date-based filtering or grouping.
        allocation_rule: Allocation rule filter; id must be allocation_rule, values are rule IDs.
        allocation: Allocation group filter; id is the allocation group ID.
        gke: Google Kubernetes Engine cost-allocation dimensions.
        gke_label: GKE workload labels; id is the label key.
        attribution: Deprecated. Use allocation_rule.
        attribution_group: Deprecated. Use allocation.
  responses:
    '400':
      description: Bad Request - The server cannot process the request, often due to a malformed request.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    '401':
      description: Unauthorized - Invalid API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    '403':
      description: Forbidden - The client is not authorized to perform the request.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    '404':
      description: Not Found - The requested resource does not exist.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  parameters:
    nameContains:
      name: nameContains
      in: query
      description: Case-insensitive substring match against the resource name. Combined with the "filter" parameter using AND semantics.
      example: monthly spend
      schema:
        type: string
    pageToken:
      name: pageToken
      in: query
      description: Page token, returned by a previous call, to request the next page of results
      schema:
        type: string
  securitySchemes:
    api_key:
      type: apiKey
      name: Authorization
      description: Use the "Bearer <API_KEY>" format or sign in for autofill
      in: header
    tenantId:
      type: apiKey
      name: X-Tenant-Id
      description: 'Customer (tenant) ID for the request. Separate from your API token: always authenticate with `Authorization: Bearer <token>` (personal or service account). See [Get Started](https://developer.doit.com/docs/start). Omit when your token is scoped to a single customer (resolved automatically). A service account can select an active direct or nested descendant of its home customer; the endpoint''s normal permissions, entitlements, and resource-ownership checks still apply. A service-account target outside that customer subtree returns `403 Forbidden`. Prefer this header over the legacy `customerContext` query parameter, which only applies to legacy API keys and is ignored by personal and service account tokens.'
      in: header
    oauth2:
      type: oauth2
      flows:
        authorizationCode:
          authorizationUrl: https://console.doit.com/sign-in/oauth
          tokenUrl: https://console.doit.com/api/auth/token
          scopes:
            dci: Access All Data
x-samples-languages:
- curl
- go
- node
- python
x-cli-config:
  security: oauth2
  params:
    client_id: cli
x-provenance:
  method: harvested
  publisher: DoiT
  source: https://api.doit.com/openapi.yaml
  note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
    stamped by stamp-openapi-provenance.py (roadmap#793)