openapi: 3.1.0
info:
title: sfc-api Account Orders API
description: Public preview API - subject to change. See https://docs.sfcompute.com/preview/roadmap for details.
version: 0.1.0
x-apievangelist:
method: searched
generated: '2026-07-21'
source: Reconstructed from per-operation OpenAPI blocks published on https://docs.sfcompute.com/preview/api-reference/* (Mintlify). 65 pages merged; paths + components unioned verbatim.
note: Public preview API (subject to change). Base path /preview/v2 under server https://api.sfcompute.com.
servers:
- url: https://api.sfcompute.com
security:
- bearer_auth: []
tags:
- name: Orders
description: 'Estimate an order before placing it: filled price, fee, and operational notices.'
paths:
/preview/v2/order_preview:
post:
tags:
- Orders
summary: Estimate an order
description: '> ⚠️ This endpoint is in [public preview](/preview/roadmap).
Estimate a buy or sell order before placing it.'
operationId: get_order_preview
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/v2.OrderPreviewRequest'
required: true
responses:
'200':
description: Estimate result.
content:
application/json:
schema:
$ref: '#/components/schemas/v2.OrderPreviewResponse'
'401':
description: Unauthorized.
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedError'
'422':
description: Validation failed.
content:
application/json:
schema:
$ref: '#/components/schemas/UnprocessableEntityError'
'500':
description: Internal server error.
content:
application/json:
schema:
$ref: '#/components/schemas/InternalServerError'
/preview/v2/orders:
post:
tags:
- Orders
summary: Create order
description: '> ⚠️ This endpoint is in [public preview](/preview/roadmap).
Place a buy or sell order. Orders fill on a single instance SKU matching the order''s `requirements`. By default orders fill completely or not at all; set `allow_partial` to permit a partial fill. Order filling is asynchronous; poll `GET /v2/orders/{id}` to check status.'
operationId: create_order
parameters:
- name: Idempotency-Key
in: header
description: Unique key to ensure idempotent order creation. If provided, duplicate requests with the same key will not place a new order and return the original order.
required: false
schema:
type:
- string
- 'null'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/v2.CreateOrderRequest'
required: true
responses:
'201':
description: Order created.
content:
application/json:
schema:
$ref: '#/components/schemas/v2.OrderResponse'
'401':
description: Unauthorized.
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedError'
'402':
description: Insufficient balance.
content:
application/json:
schema:
$ref: '#/components/schemas/PaymentRequiredError'
'403':
description: Forbidden.
content:
application/json:
schema:
$ref: '#/components/schemas/ForbiddenError'
'404':
description: Not found.
content:
application/json:
schema:
$ref: '#/components/schemas/NotFoundError'
'422':
description: Validation failed.
content:
application/json:
schema:
$ref: '#/components/schemas/UnprocessableEntityError'
'500':
description: Internal server error.
content:
application/json:
schema:
$ref: '#/components/schemas/InternalServerError'
'503':
description: Service temporarily unavailable. Try again later.
content:
application/json:
schema:
$ref: '#/components/schemas/ServiceUnavailableError'
get:
tags:
- Orders
summary: List orders
description: '> ⚠️ This endpoint is in [public preview](/preview/roadmap).
List all orders.'
operationId: list_orders
parameters:
- name: id
in: query
description: Filter by order ID (repeatable).
required: false
schema:
type: array
items:
$ref: '#/components/schemas/OrderId'
style: form
explode: true
- name: pool
in: query
description: Filter by pool.
required: false
schema:
$ref: '#/components/schemas/ResourcePathOrId_PoolId'
- name: workspace
in: query
description: Scope the listing to a single workspace (ID, resource path, or name). Ignored when `pool` is given (the pool already names its workspace). Without either, the list spans the whole organization and requires an org-level `Order:List` grant.
required: false
schema:
$ref: '#/components/schemas/ResourcePathOrId_WorkspaceId'
- name: side
in: query
required: false
schema:
$ref: '#/components/schemas/Side'
- name: status
in: query
description: Filter by status (repeatable).
required: false
schema:
type: array
items:
$ref: '#/components/schemas/OrderStatus'
style: form
explode: true
- name: created_after
in: query
required: false
schema:
$ref: '#/components/schemas/UnixEpoch'
- name: created_before
in: query
required: false
schema:
$ref: '#/components/schemas/UnixEpoch'
- name: procurement
in: query
description: Filter to one procurement's orders (ID or resource path). Without it, the list omits procurement orders.
required: false
schema:
$ref: '#/components/schemas/ResourcePathOrId_ProcurementId'
- name: sort_by
in: query
description: Prefix with `-` for descending.
required: false
schema:
oneOf:
- $ref: '#/components/schemas/v2.OrderSortBy'
default: -created_at
- name: limit
in: query
required: false
schema:
type: integer
format: u-int32
default: 50
maximum: 200
minimum: 1
- name: starting_after
in: query
description: Set to the response's `cursor` to fetch the next page.
required: false
schema:
$ref: '#/components/schemas/OrdersCursor'
- name: ending_before
in: query
description: Set to the response's `cursor` to fetch the previous page.
required: false
schema:
$ref: '#/components/schemas/OrdersCursor'
responses:
'200':
description: Paginated list of orders.
content:
application/json:
schema:
$ref: '#/components/schemas/v2.ListOrdersResponse'
'401':
description: Unauthorized.
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedError'
'403':
description: Forbidden.
content:
application/json:
schema:
$ref: '#/components/schemas/ForbiddenError'
'422':
description: Validation failed.
content:
application/json:
schema:
$ref: '#/components/schemas/UnprocessableEntityError'
'500':
description: Internal server error.
content:
application/json:
schema:
$ref: '#/components/schemas/InternalServerError'
/preview/v2/orders/{id}:
delete:
tags:
- Orders
summary: Cancel order
description: '> ⚠️ This endpoint is in [public preview](/preview/roadmap).
Request cancellation of an order. This is asynchronous — poll `GET /v2/orders/{id}` to confirm the status has changed to cancelled.'
operationId: cancel_order
parameters:
- name: id
in: path
description: Order ID
required: true
schema:
$ref: '#/components/schemas/OrderId'
example: ordr_xyz789
responses:
'204':
description: Order cancellation initiated.
'401':
description: Unauthorized.
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedError'
'403':
description: Forbidden.
content:
application/json:
schema:
$ref: '#/components/schemas/ForbiddenError'
'404':
description: Order not found.
content:
application/json:
schema:
$ref: '#/components/schemas/NotFoundError'
'422':
description: Order cannot be cancelled.
content:
application/json:
schema:
$ref: '#/components/schemas/UnprocessableEntityError'
'500':
description: Internal server error.
content:
application/json:
schema:
$ref: '#/components/schemas/InternalServerError'
get:
tags:
- Orders
summary: Get order
description: '> ⚠️ This endpoint is in [public preview](/preview/roadmap).
Retrieve an order by ID.'
operationId: fetch_order
parameters:
- name: id
in: path
description: Order ID
required: true
schema:
$ref: '#/components/schemas/OrderId'
example: ordr_xyz789
responses:
'200':
description: Order details.
content:
application/json:
schema:
$ref: '#/components/schemas/v2.OrderResponse'
'401':
description: Unauthorized.
content:
application/json:
schema:
$ref: '#/components/schemas/UnauthorizedError'
'403':
description: Forbidden.
content:
application/json:
schema:
$ref: '#/components/schemas/ForbiddenError'
'404':
description: Order not found.
content:
application/json:
schema:
$ref: '#/components/schemas/NotFoundError'
'500':
description: Internal server error.
content:
application/json:
schema:
$ref: '#/components/schemas/InternalServerError'
components:
schemas:
v2.OrderPreviewNotice:
oneOf:
- type: object
required:
- start_at
- end_at
- maintenance_type
- title
- description
- type
properties:
start_at:
$ref: '#/components/schemas/UnixEpoch'
end_at:
$ref: '#/components/schemas/UnixEpoch'
maintenance_type:
$ref: '#/components/schemas/v2.MaintenanceNoticeType'
title:
type: string
description:
type: string
action_message:
type:
- string
- 'null'
type:
type: string
const: maintenance_window
default: maintenance_window
readOnly: true
ContractId:
type: string
examples:
- cont_k3R-nX9vLm7Qp2Yw5Jd8F
pattern: cont_[0-9a-zA-Z_-]{1,21}
v2.SellOrderPreviewRequest:
type: object
required:
- start_at
- duration_seconds
- node_count
- requirements
properties:
pool:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/ResourcePathOrId_PoolId'
description: Pool the order draws from. Omit to get an estimate without pinning to a pool. The response body then returns a placeholder you must replace before submitting to `/v2/orders`.
start_at:
$ref: '#/components/schemas/UnixEpoch'
description: Order start. Must align to a 60-second boundary.
duration_seconds:
type: integer
format: u-int64
description: Order duration in seconds. Must be a positive multiple of 60.
minimum: 0
node_count:
type: integer
format: int32
description: Number of nodes. Must be positive.
requirements:
$ref: '#/components/schemas/Requirements'
InstanceSkuId:
oneOf:
- type: string
examples:
- isku_k3R-nX9vLm7Qp2Yw5Jd8F
pattern: isku_[0-9a-zA-Z_-]{1,21}
- type: string
description: Legacy alias prefix; accepted on read, never emitted on write.
pattern: clus_[0-9a-zA-Z_-]{1,21}
description: Accepts the canonical prefix below; additional legacy prefixes are aliased for read compatibility. Writes always emit the canonical form.
InternalServerError:
type: object
required:
- error
properties:
error:
type: object
required:
- type
- message
properties:
type:
type: string
const: api_error
default: api_error
readOnly: true
message:
type: string
x-speakeasy-error-message: true
Schedule:
type: array
items:
$ref: '#/components/schemas/ScheduleEntry'
description: 'Node count over time, as a list of `[start_at, end_at)` time ranges.
Example: 5 nodes from t=0 to t=3600 is `[{"start_at": 0, "end_at": 3600, "node_count": 5}]`.
`start_at` and `end_at` must be 60-second aligned, `node_count` must be non-negative. On non-final entries, `end_at` may be omitted (inferred from the next entry''s `start_at`); gaps fill with `node_count: 0`.'
OrderId:
type: string
examples:
- ordr_k3R-nX9vLm7Qp2Yw5Jd8F
pattern: ordr_[0-9a-zA-Z_-]{1,21}
UnprocessableEntityError:
type: object
required:
- error
properties:
error:
type: object
required:
- type
- message
properties:
type:
type: string
const: unprocessable_entity
default: unprocessable_entity
readOnly: true
message:
type: string
x-speakeasy-error-message: true
details:
type: array
items:
$ref: '#/components/schemas/ErrorDetail'
v2.OrderPreviewUnavailableReason:
type: string
enum:
- no_matching_instance_skus
- no_availability
v2.OrderPreviewFee:
type: object
description: 'Fee charged on fills for the targeted instance SKU.
Total fee = `flat_dollars_per_node_hour × node_count × duration_hours` + `percentage_bps / 10000 × execution_total_dollars`.
Recomputed against the realized price at fill time.'
required:
- flat_dollars_per_node_hour
- percentage_bps
properties:
flat_dollars_per_node_hour:
$ref: '#/components/schemas/DollarsPerNodeHour'
description: Flat fee per node-hour.
percentage_bps:
type: integer
format: int32
description: Percentage of execution total, in basis points (10000 = 100%).
v2.MaintenanceNoticeType:
type: string
enum:
- info
- degraded_performance
- marketplace_unavailable
OrderStatus:
type: string
description: 'The status of an order in the system.
`pending` = not resolved/processed yet.
`filled` = order executed.
`partially_filled` = the order matched part of its requested capacity and remains active for the remainder.
`standing` = the order is waiting for a match.
`cancelled` = the order was cancelled either automatically (not a standing order and didn''t immediately fill, or current time past `end_at`) or by explicit cancellation.
`rejected` = validation/system error occurred.'
enum:
- pending
- filled
- partially_filled
- rejected
- cancelled
- standing
v2.OrderPrincipalKind:
type: string
description: Whether an order's `created_by` principal is a human user or an API token.
enum:
- user
- token
ErrorDetail:
type: object
required:
- code
- message
properties:
field:
type:
- string
- 'null'
description: The field that caused the error (for validation errors)
code:
type: string
description: Specific error code for this detail
message:
type: string
description: Human-readable error message
ResourcePathOrId_PoolId:
type: string
description: A resource path like 'sfc:pool:acme:prod:my-pool' _or_ an ID. Resource paths are human-readable but not stable - they change when resources are renamed or moved. IDs are stable and permanent.
examples:
- pool_k3R-nX9vLm7Qp2Yw5Jd8F
pattern: (pool_[0-9a-zA-Z_-]{1,21})|(sfc:pool:[a-zA-Z0-9._-]+(:[a-zA-Z0-9._-]+){2,2})
ScheduleEntry:
type: object
description: A `[start_at, end_at)` time range with a fixed `node_count`. `end_at` is `null` only on the final entry, marking an unbounded tail.
required:
- start_at
- node_count
properties:
start_at:
$ref: '#/components/schemas/UnixEpoch'
end_at:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/UnixEpoch'
node_count:
type: integer
format: int32
Requirements:
type: object
description: 'Key/value filters on instance SKU properties.
Valid keys and values are published at `GET /v2/instance_sku_property_catalog`.
Empty map = no constraints.'
additionalProperties:
type: array
items:
$ref: '#/components/schemas/Name'
propertyNames:
type: string
examples:
- my-resource-name
maxLength: 255
minLength: 1
pattern: '[a-zA-Z0-9][a-zA-Z0-9._-]{0,254}'
example:
accelerator:
- H100
v2.OrderResponse:
type: object
required:
- object
- id
- capacity
- pool
- side
- allow_standing
- instance_sku
- allocation_schedule_delta
- filled_allocation_schedule_delta
- limit_price_dollars_per_node_hour
- status
- created_at
properties:
object:
type: string
const: order
default: order
readOnly: true
id:
$ref: '#/components/schemas/OrderId'
capacity:
$ref: '#/components/schemas/CapacitySummary'
description: Deprecated — use `pool`. Target pool that receives or loses compute if this order fills (depending on order type).
pool:
$ref: '#/components/schemas/PoolSummary'
side:
$ref: '#/components/schemas/Side'
allow_standing:
type: boolean
description: If true, the order stays in the order book until either fills, is explicitly cancelled, or the order end time is reached resulting in automatic cancellation. If false, the order is cancelled immediately if it doesn't fill.
allow_partial:
type: boolean
description: If true, the order may fill partially — fewer nodes and/or a subset of the requested time window.
instance_sku:
$ref: '#/components/schemas/InstanceSkuSummary'
description: Instance SKU this order is pinned to. Carries the SKU's human-readable name when one is registered.
allocation_schedule_delta:
$ref: '#/components/schemas/Schedule'
description: Change in capacity if the order fills. Must be a single time range with both `start_at` and `end_at`.
filled_allocation_schedule_delta:
$ref: '#/components/schemas/Schedule'
description: The portion of the requested schedule that has filled so far. Empty for orders with no fills yet; the unfilled remainder is `allocation_schedule_delta` minus this.
limit_price_dollars_per_node_hour:
$ref: '#/components/schemas/DollarsPerNodeHour'
status:
$ref: '#/components/schemas/OrderStatus'
created_at:
$ref: '#/components/schemas/UnixEpoch'
created_by:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/v2.OrderPrincipal'
description: Principal that placed the order — the human user when known, otherwise the API token that placed it. `null` for orders that predate attribution. Always present (value-or-null) like other order attributes, since every order conceptually has a creator.
filled_at:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/UnixEpoch'
filled_average_price_dollars_per_node_hour:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/DollarsPerNodeHour'
description: Weighted-average execution price across all fills.
fills:
type: array
items:
$ref: '#/components/schemas/v2.OrderFill'
description: Each contract produced by this order. Empty for unfilled orders.
cancelled_at:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/UnixEpoch'
v2.BuyOrderPreviewRequest:
type: object
required:
- requirements
- start_at
- duration_seconds
- node_count
properties:
requirements:
$ref: '#/components/schemas/Requirements'
start_at:
$ref: '#/components/schemas/UnixEpoch'
description: Order start. Must align to a 60-second boundary.
duration_seconds:
type: integer
format: u-int64
description: Order duration in seconds. Must be a positive multiple of 60.
minimum: 0
node_count:
type: integer
format: int32
description: Number of nodes. Must be positive.
pool:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/ResourcePathOrId_PoolId'
description: Pool that receives compute when the order fills. Omit to get an estimate without pinning to a pool. The response body then returns a placeholder you must replace before submitting to `/v2/orders`.
UnauthorizedError:
type: object
required:
- error
properties:
error:
type: object
required:
- type
- message
properties:
type:
type: string
const: authentication_error
default: authentication_error
readOnly: true
message:
type: string
x-speakeasy-error-message: true
v2.OrderPreviewRequest:
oneOf:
- allOf:
- $ref: '#/components/schemas/v2.BuyOrderPreviewRequest'
- type: object
required:
- side
properties:
side:
type: string
const: buy
default: buy
readOnly: true
- allOf:
- $ref: '#/components/schemas/v2.SellOrderPreviewRequest'
- type: object
required:
- side
properties:
side:
type: string
const: sell
default: sell
readOnly: true
Side:
type: string
enum:
- sell
- buy
ServiceUnavailableError:
type: object
required:
- error
properties:
error:
type: object
required:
- type
- message
properties:
type:
type: string
const: service_unavailable
default: service_unavailable
readOnly: true
message:
type: string
x-speakeasy-error-message: true
v2.ListOrdersResponse:
type: object
required:
- object
- has_more
- data
properties:
object:
type: string
const: list
default: list
readOnly: true
cursor:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/OrdersCursor'
description: Pass as `starting_after` or `ending_before` to paginate.
has_more:
type: boolean
data:
type: array
items:
$ref: '#/components/schemas/v2.OrderResponse'
PoolId:
type: string
examples:
- pool_k3R-nX9vLm7Qp2Yw5Jd8F
pattern: pool_[0-9a-zA-Z_-]{1,21}
NotFoundError:
type: object
required:
- error
properties:
error:
type: object
required:
- type
- message
properties:
type:
type: string
const: not_found
default: not_found
readOnly: true
message:
type: string
x-speakeasy-error-message: true
PoolSummary:
type: object
description: A pool referenced by id and name.
required:
- id
- name
properties:
id:
$ref: '#/components/schemas/PoolId'
name:
$ref: '#/components/schemas/Name'
v2.OrderFill:
type: object
description: 'A single fill event: one contract that was produced when the order matched.'
required:
- filled_at
- allocation_schedule_delta
- price_dollars_per_node_hour
properties:
contract:
oneOf:
- type: 'null'
- $ref: '#/components/schemas/ContractId'
filled_at:
$ref: '#/components/schemas/UnixEpoch'
allocation_schedule_delta:
$ref: '#/components/schemas/Schedule'
description: Capacity change this fill delivered. Quantities are always positive; `side` on the parent order determines whether this added or removed capacity.
price_dollars_per_node_hour:
$ref: '#/components/schemas/DollarsPerNodeHour'
ResourcePathOrId_ProcurementId:
type: string
description: A resource path like 'sfc:procurement:acme:prod:my-procurement' _or_ an ID. Resource paths are human-readable but not stable - they change when resources are renamed or moved. IDs are stable and permanent.
examples:
- proc_k3R-nX9vLm7Qp2Yw5Jd8F
pattern: (proc_[0-9a-zA-Z_-]{1,21})|(sfc:procurement:[a-zA-Z0-9._-]+(:[a-zA-Z0-9._-]+){2,2})
v2.OrderPrincipal:
type: object
description: 'The principal that placed an order. `type` distinguishes the two cases: a user carries `email` (when an email identity exists); a token carries `name`. The inapplicable field is omitted.'
required:
- id
- type
properties:
id:
type: string
description: '`users.id` for a user principal, `api_tokens.id` for a token principal.'
type:
$ref: '#/components/schemas/v2.OrderPrincipalKind'
email:
type:
- string
- 'null'
description: Email of the user, when the principal is a user with a recorded email.
name:
type:
- string
- 'null'
description: Name of the API token, when the principal is a token.
CapacityId:
oneOf:
- type: string
examples:
- cap_k3R-nX9vLm7Qp2Yw5Jd8F
pattern: cap_[0-9a-zA-Z_-]{1,21}
- type: string
description: Legacy alias prefix; accepted on read, never emitted on write.
pattern: pool_[0-9a-zA-Z_-]{1,21}
description: Accepts the canonical prefix below; additional legacy prefixes are aliased for read compatibility. Writes always emit the canonical form.
Name:
type: string
examples:
- my-resource-name
maxLength: 255
minLength: 1
pattern: '[a-zA-Z0-9][a-zA-Z0-9._-]{0,254}'
CapacitySummary:
type: object
required:
- id
- name
properties:
id:
$ref: '#/components/schemas/CapacityId'
name:
$ref: '#/components/schemas/Name'
InstanceSkuSummary:
type: object
description: A summary of an instance SKU - its `id` and human-recognizable `alias` - embedded on resources that reference a SKU.
required:
- object
- id
- alias
properties:
object:
type: string
const: instance_sku
default: instance_sku
readOnly: true
id:
$ref: '#/components/schemas/InstanceSkuId'
alias:
$ref: '#/components/schemas/Name'
DollarsPerNodeHour:
type: string
description: Price rate in dollars per node-hour.
examples:
- '2.500000'
pattern: ^\d+\.\d+$
v2.OrderSortBy:
type: string
enum:
- created_at
- -created_at
- start_at
- -start_at
PaymentRequiredError:
type: object
required:
- error
properties:
error:
type: object
required:
- type
- message
properties:
type:
type: string
const: payment_required
default: payment_required
readOnly: true
message:
type: string
x-speakeasy-error-message: true
ResourcePathOrId_WorkspaceId:
type: string
description: A resource path like 'sfc:workspace:acme:my-workspace' _or_ an ID. Resource paths are human-readable but not stable - they change when resources are renamed or moved. IDs are stable and permanent.
examples:
- wksp_k3R-nX9vLm7Qp2Yw5Jd8F
pattern: (wksp_[0-9a-zA-Z_-]{1,21})|(sfc:workspace:[a-zA-Z0-9._-]+(:[a-zA-Z0-9._-]+){1,1})
v2.CreateOrderRequest:
type: object
required:
- pool
- side
- instance_sku
- allocation_schedule_delta
- limit_price_dollars_per_node_hour
properties:
pool:
$ref: '#/components/schemas/ResourcePathOrId_PoolId'
description: Target pool that receives compute when filled.
side:
$ref: '#/components/schemas/Side'
allow_standing:
type: boolean
description: If true, the order rests on the order book until it fills, is cancelled, or its end time passes. If false, the order is cancelled immediately if it does not fill.
allow_partial:
type: boolean
description: If true, the order may fill partially — fewer nodes and/or a subset of the requested time window. The filled time may be disjoint.
instance_sku:
$ref: '#/components/schemas/InstanceSkuId'
description: Instance SKU this order will fill on. Rejected at submission if the SKU id is not registered.
allocation_schedule_delta:
$ref: '#/components/schemas/Schedule'
description: Change in capacity if the order fills (added on `buy`, subtracted on `sell`). Must be a single time range with both `start_at` and `end_at`.
limit_price_dollars_per_node_hour:
$ref: '#/components/schemas/DollarsPerNodeHour'
description: Limit price per node-hour. Decimal string (e.g. `"1.500000"`); rounded to per-minute precision on submission.
OrdersCursor:
type: string
examples:
- ordrc_gqXR7s0Kj5mHvE2wNpLc4Q
pattern: ^ordrc_[A-Za-z0-9_-]+$
v2.OrderPreviewResponse:
oneOf:
- type: object
# --- truncated at 32 KB (34 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/the-san-francisco-compute-company/refs/heads/main/openapi/the-san-francisco-compute-company-orders-api-openapi.yml