OpenAPI Specification
openapi: 3.1.0
info:
title: LaserData Cloud Audit Account Billing API
description: 'Tenant audit log and per-user activity feed.
Public REST API for the LaserData Cloud audit service.
## Authentication
Every endpoint accepts either of two auth methods:
- **API key** (machine / CI / SDK): send in the `ld-api-key` header. Cannot be used on `GET /audit/users/activity` which is session-only.
- **Session cookie** (browser / console): obtained from `POST /account/sign_in` on the control plane.
Audit endpoints are read-only and replay-safe by definition.
## Pagination
List endpoints return a `Paged<T>` body (`page`, `total_pages`, `total_results`, `items`) and a `link` header (RFC 8288) with `rel="first"`, `"prev"`, `"next"`, `"last"` when applicable.
## Errors
Error responses follow RFC 7807 `application/problem+json` with `type`, `title`, `code`, `reason`, `instance`, `status`, `retryable`, and optional `field` / `field_issues`. `retryable` is `true` for 408, 425, 429, 500, 502, 503, 504.
## Response headers
- `ld-request`: request ID. Include it when reporting issues.
- `link`: pagination relations.
- `retry-after`: wait hint on 429 / 503.'
termsOfService: https://laserdata.com/terms
contact:
name: LaserData Support
url: https://docs.laserdata.com
email: support@laserdata.com
license:
name: Proprietary
version: 0.0.66
x-logo:
url: https://assets.laserdata.com/laserdata_dark.png
altText: LaserData
href: https://laserdata.com
servers:
- url: https://api.laserdata.cloud
description: Production
security:
- ld_api_key: []
- session_cookie: []
tags:
- name: Billing
description: Pricing, billing reports, invoices
paths:
/pricing:
get:
tags:
- Billing
summary: Get public pricing
description: Returns public plan and pricing information without requiring authentication.
operationId: get_pricing
responses:
'200':
description: Public pricing
content:
application/json:
schema:
$ref: '#/components/schemas/PricingResponse'
security: []
/tenants/{tenant_id}/billing/info:
get:
tags:
- Billing
summary: Get billing info
description: Returns the tenant billing recipient profile used for invoicing.
operationId: get_billing_info
parameters:
- name: tenant_id
in: path
description: Tenant identifier
required: true
schema:
$ref: '#/components/schemas/TenantId'
responses:
'200':
description: Tenant billing info
content:
application/json:
schema:
$ref: '#/components/schemas/BillingInfo'
'403':
description: Insufficient permissions
put:
tags:
- Billing
summary: Update billing info
description: Updates the tenant billing recipient profile used for invoicing.
operationId: update_billing_info
parameters:
- name: tenant_id
in: path
description: Tenant identifier
required: true
schema:
$ref: '#/components/schemas/TenantId'
requestBody:
description: Billing recipient fields such as company, address, tax ID, email, and phone
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateBillingInfo'
required: true
responses:
'204':
description: Billing info updated
/tenants/{tenant_id}/billing/invoices:
get:
tags:
- Billing
summary: List invoices
description: Returns paged customer invoices for the tenant.
operationId: get_invoices
parameters:
- name: tenant_id
in: path
description: Tenant identifier
required: true
schema:
$ref: '#/components/schemas/TenantId'
responses:
'200':
description: Paged invoices
content:
application/json:
schema:
$ref: '#/components/schemas/Paged_CustomerInvoiceInfo'
/tenants/{tenant_id}/billing/invoices/{invoice_id}:
get:
tags:
- Billing
summary: Get invoice
description: Returns full invoice details for one tenant invoice.
operationId: get_invoice
parameters:
- name: tenant_id
in: path
description: Tenant identifier
required: true
schema:
$ref: '#/components/schemas/TenantId'
- name: invoice_id
in: path
description: Invoice identifier
required: true
schema:
$ref: '#/components/schemas/InvoiceId'
responses:
'200':
description: Invoice details
content:
application/json:
schema:
$ref: '#/components/schemas/CustomerInvoiceDetails'
/tenants/{tenant_id}/billing/invoices/{invoice_id}/pdf:
get:
tags:
- Billing
summary: Download invoice PDF
description: Downloads the rendered PDF file for one invoice.
operationId: download_invoice_pdf
parameters:
- name: tenant_id
in: path
description: Tenant identifier
required: true
schema:
$ref: '#/components/schemas/TenantId'
- name: invoice_id
in: path
description: Invoice identifier
required: true
schema:
$ref: '#/components/schemas/InvoiceId'
responses:
'200':
description: Invoice PDF (application/pdf)
content:
application/pdf: {}
/tenants/{tenant_id}/billing/reports:
get:
tags:
- Billing
summary: List billing reports
description: Returns paged deployment billing reports for a tenant.
operationId: get_billing_reports
parameters:
- name: tenant_id
in: path
description: Tenant identifier
required: true
schema:
$ref: '#/components/schemas/TenantId'
responses:
'200':
description: Paged billing reports
content:
application/json:
schema:
$ref: '#/components/schemas/Paged_BillingReportInfo'
/tenants/{tenant_id}/billing/reports/{report_id}:
get:
tags:
- Billing
summary: Get billing report
description: Returns one deployment billing report with detailed usage and pricing breakdown.
operationId: get_billing_report
parameters:
- name: tenant_id
in: path
description: Tenant identifier
required: true
schema:
$ref: '#/components/schemas/TenantId'
- name: report_id
in: path
description: Deployment report identifier
required: true
schema:
$ref: '#/components/schemas/DeploymentReportId'
responses:
'200':
description: Billing report details
content:
application/json:
schema:
$ref: '#/components/schemas/BillingReportDetails'
components:
schemas:
NvmeStorageProfile:
type: object
required:
- rate_per_gb_month
- tiers
properties:
rate_per_gb_month:
type: string
tiers:
type: array
items:
$ref: '#/components/schemas/NvmeTier'
CloudPricing:
type: object
required:
- network
- storage
- compute
- disk
- transfer
- overhead
- telemetry
properties:
compute:
$ref: '#/components/schemas/ComputePricing'
disk:
$ref: '#/components/schemas/DiskPricing'
network:
$ref: '#/components/schemas/NetworkPricing'
overhead:
$ref: '#/components/schemas/OverheadPricing'
storage:
$ref: '#/components/schemas/StoragePricing'
telemetry:
$ref: '#/components/schemas/TelemetryPricing'
transfer:
$ref: '#/components/schemas/TransferPricing'
TopologySurcharge:
type: object
required:
- single_az
- multi_az
properties:
multi_az:
type: string
single_az:
type: string
TelemetryPricing:
type: object
required:
- included_days
- per_day
properties:
included_days:
type: integer
format: int32
minimum: 0
per_day:
type: string
Paged_BillingReportInfo:
type: object
required:
- total_pages
- total_results
- page
- items
properties:
items:
type: array
items:
type: object
required:
- id
- deployment_id
- name
- cloud
- variant
- from
- to
- total_cost
- currency
properties:
cloud:
$ref: '#/components/schemas/Cloud'
currency:
$ref: '#/components/schemas/Currency'
deployment_id:
$ref: '#/components/schemas/DeploymentId'
from:
type: string
format: date-time
id:
$ref: '#/components/schemas/DeploymentReportId'
name:
type: string
region:
type:
- string
- 'null'
tier:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/DeploymentTier'
to:
type: string
format: date-time
total_cost:
type: string
variant:
$ref: '#/components/schemas/DeploymentVariant'
example:
id: 7261845701661510000
deployment_id: 7261845127892140000
name: iggy-prod-01
cloud: aws
variant: managed
tier: small
region: us-east-1
from: '2026-04-01T00:00:00Z'
to: '2026-05-01T00:00:00Z'
total_cost: '182.45'
currency: USD
page:
type: integer
format: int64
example: 1
minimum: 1
total_pages:
type: integer
format: int64
example: 4
minimum: 0
total_results:
type: integer
format: int64
example: 137
minimum: 0
DataRetentionPricing:
type: object
required:
- rate_per_gb_month
- available
properties:
available:
type: boolean
rate_per_gb_month:
type: string
InvoiceId:
type: integer
format: int64
example: 611298765432109068
minimum: 0
StoragePricing:
type: object
required:
- network_disk
- nvme_ssd
properties:
data_retention:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/DataRetentionPricing'
network_disk:
$ref: '#/components/schemas/StorageProfile'
nvme_ssd:
$ref: '#/components/schemas/NvmeStorageProfile'
NvmeTier:
type: object
required:
- storage_gb
- label
- min_throughput_mbps
properties:
label:
type: string
min_throughput_mbps:
type: string
storage_gb:
type: integer
format: int32
minimum: 0
CustomerInvoiceInfo:
type: object
required:
- id
- tenant_id
- number
- period_start
- period_end
- status
- currency
- total
- created_at
properties:
created_at:
type: string
format: date-time
currency:
$ref: '#/components/schemas/Currency'
division_id:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/DivisionId'
id:
$ref: '#/components/schemas/InvoiceId'
number:
type: string
period_end:
type: string
format: date-time
period_start:
type: string
format: date-time
status:
$ref: '#/components/schemas/InvoiceStatus'
tenant_id:
$ref: '#/components/schemas/TenantId'
total:
type: string
example:
id: 7261845776048540000
tenant_id: 7261845022003200001
division_id: 7261844974723780000
number: INV-2026-000182
period_start: '2026-04-01T00:00:00Z'
period_end: '2026-05-01T00:00:00Z'
status: approved
currency: USD
total: '182.45'
created_at: '2026-05-02T10:00:00Z'
CustomerInvoiceDetails:
allOf:
- $ref: '#/components/schemas/CustomerInvoiceInfo'
- type: object
required:
- subtotal
- line_items
properties:
billing_info: {}
line_items:
type: array
items: {}
notes:
type:
- string
- 'null'
paid_at:
type:
- string
- 'null'
format: date-time
subtotal:
type: string
tax:
type:
- string
- 'null'
PricingResponse:
type: object
description: 'Top-level response: product config + per-cloud pricing.'
required:
- cluster
properties:
aws:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/CloudPricing'
cluster:
$ref: '#/components/schemas/ClusterConfig'
gcp:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/CloudPricing'
NetworkTier:
type: object
required:
- rate_per_gb
properties:
max_gb_per_node:
type:
- integer
- 'null'
format: int64
minimum: 0
rate_per_gb:
type: string
up_to_mbps:
type:
- integer
- 'null'
format: int32
minimum: 0
DeploymentVariant:
type: string
enum:
- managed
- byoc
- on_premise
Paged_CustomerInvoiceInfo:
type: object
required:
- total_pages
- total_results
- page
- items
properties:
items:
type: array
items:
type: object
required:
- id
- tenant_id
- number
- period_start
- period_end
- status
- currency
- total
- created_at
properties:
created_at:
type: string
format: date-time
currency:
$ref: '#/components/schemas/Currency'
division_id:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/DivisionId'
id:
$ref: '#/components/schemas/InvoiceId'
number:
type: string
period_end:
type: string
format: date-time
period_start:
type: string
format: date-time
status:
$ref: '#/components/schemas/InvoiceStatus'
tenant_id:
$ref: '#/components/schemas/TenantId'
total:
type: string
example:
id: 7261845776048540000
tenant_id: 7261845022003200001
division_id: 7261844974723780000
number: INV-2026-000182
period_start: '2026-04-01T00:00:00Z'
period_end: '2026-05-01T00:00:00Z'
status: approved
currency: USD
total: '182.45'
created_at: '2026-05-02T10:00:00Z'
page:
type: integer
format: int64
example: 1
minimum: 1
total_pages:
type: integer
format: int64
example: 4
minimum: 0
total_results:
type: integer
format: int64
example: 137
minimum: 0
Currency:
type: string
enum:
- USD
StorageProfile:
type: object
required:
- rate_per_gb_month
- min_storage_gb
- max_storage_gb
- min_throughput_mbps
properties:
max_storage_gb:
type: integer
format: int32
minimum: 0
min_storage_gb:
type: integer
format: int32
minimum: 0
min_throughput_mbps:
type: string
rate_per_gb_month:
type: string
BillingInfo:
type: object
properties:
address:
type:
- string
- 'null'
city:
type:
- string
- 'null'
company:
type:
- string
- 'null'
country:
type:
- string
- 'null'
email:
type:
- string
- 'null'
name:
type:
- string
- 'null'
phone:
type:
- string
- 'null'
postal_code:
type:
- string
- 'null'
state:
type:
- string
- 'null'
tax_id:
type:
- string
- 'null'
UpdateBillingInfo:
allOf:
- $ref: '#/components/schemas/BillingInfo'
Cloud:
type: string
description: Supported managed cloud provider. Only `aws` and `gcp` are accepted on the public API.
enum:
- aws
- gcp
examples:
- aws
BillingReportDetails:
allOf:
- $ref: '#/components/schemas/BillingReportInfo'
- type: object
required:
- compute_cost
- storage_cost
- network_cost
- other_cost
- telemetry_cost
- data_retention_cost
- platform_cost
- total_network_in
- total_network_out
properties:
compute_cost:
type: string
data_retention_cost:
type: string
network_cost:
type: string
other_cost:
type: string
platform_cost:
type: string
storage_cost:
type: string
telemetry_cost:
type: string
total_network_in:
type: number
format: double
total_network_out:
type: number
format: double
BillingReportInfo:
type: object
required:
- id
- deployment_id
- name
- cloud
- variant
- from
- to
- total_cost
- currency
properties:
cloud:
$ref: '#/components/schemas/Cloud'
currency:
$ref: '#/components/schemas/Currency'
deployment_id:
$ref: '#/components/schemas/DeploymentId'
from:
type: string
format: date-time
id:
$ref: '#/components/schemas/DeploymentReportId'
name:
type: string
region:
type:
- string
- 'null'
tier:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/DeploymentTier'
to:
type: string
format: date-time
total_cost:
type: string
variant:
$ref: '#/components/schemas/DeploymentVariant'
example:
id: 7261845701661510000
deployment_id: 7261845127892140000
name: iggy-prod-01
cloud: aws
variant: managed
tier: small
region: us-east-1
from: '2026-04-01T00:00:00Z'
to: '2026-05-01T00:00:00Z'
total_cost: '182.45'
currency: USD
TransferPricing:
type: object
required:
- same_region_per_gb
- cross_region_same_cloud_per_gb
- cross_region_per_gb
- cross_az_per_gb
properties:
cross_az_per_gb:
type: string
cross_region_per_gb:
type: string
cross_region_same_cloud_per_gb:
type: string
same_region_per_gb:
type: string
DiskPricing:
type: object
required:
- raw_cost_per_gb
- free_throughput_mbps
- extra_throughput_cost_per_mbps
- free_iops
- extra_iops_cost
- io_size_kb
properties:
extra_iops_cost:
type: string
extra_throughput_cost_per_mbps:
type: string
free_iops:
type: integer
format: int32
minimum: 0
free_throughput_mbps:
type: integer
format: int32
minimum: 0
io_size_kb:
type: integer
format: int32
minimum: 0
raw_cost_per_gb:
type: string
DeploymentTier:
type: string
enum:
- free
- small
- medium
- large
- xlarge
- 2xlarge
- 4xlarge
- 8xlarge
- 16xlarge
OverheadPricing:
type: object
required:
- base_monthly
- per_mbps
properties:
base_monthly:
type: string
per_mbps:
type: string
ComputePricing:
type: object
required:
- network_disk_tiers
- nvme_tiers
properties:
network_disk_tiers:
type: array
items:
$ref: '#/components/schemas/ComputeTier'
nvme_tiers:
type: array
items:
$ref: '#/components/schemas/ComputeTier'
DivisionId:
type: integer
format: int64
example: 7261844974723780000
minimum: 0
InvoiceStatus:
type: string
enum:
- draft
- pending
- approved
- paid
- failed
- cancelled
- refunded
- partially_refunded
DeploymentReportId:
type: integer
format: int64
example: 611298765432109067
minimum: 0
TenantId:
type: integer
format: int64
example: 7261845022003200001
minimum: 0
NetworkPricing:
type: object
required:
- same_region
- cross_region_same_cloud
- cross_region
- topology_surcharge_per_gb
- throughput_to_gb_factor
properties:
cross_region:
type: array
items:
$ref: '#/components/schemas/NetworkTier'
cross_region_same_cloud:
type: array
items:
$ref: '#/components/schemas/NetworkTier'
same_region:
type: array
items:
$ref: '#/components/schemas/NetworkTier'
throughput_to_gb_factor:
type: string
topology_surcharge_per_gb:
$ref: '#/components/schemas/TopologySurcharge'
ClusterConfig:
type: object
required:
- nodes
- max_throughput_mbps_per_node
properties:
max_throughput_mbps_per_node:
type: integer
format: int32
minimum: 0
nodes:
type: integer
format: int32
minimum: 0
ComputeTier:
type: object
required:
- tier
- max_mbps
- instance
- monthly_cost
properties:
instance:
type: string
max_mbps:
type: integer
format: int32
minimum: 0
monthly_cost:
type: string
tier:
type: string
DeploymentId:
type: integer
format: int64
example: 7261845127892140000
minimum: 0
securitySchemes:
ld_api_key:
type: apiKey
in: header
name: ld-api-key
description: Tenant API key sent in the ld-api-key request header. Scoped to tenant-level audit reads. Cannot be used on user-scope endpoints (`/audit/users/activity`).
session_cookie:
type: apiKey
in: cookie
name: session
description: Browser session cookie issued by POST /account/sign_in on core. Required for user-scope endpoints.
externalDocs:
url: https://docs.laserdata.com
description: LaserData Cloud documentation