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: 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)