Services
Duet exposes paid third-party APIs through a catalog. Search with
duet services search, inspect a service with duet services show, read the
linked vendor documentation, then call an allowed route with duet services call.
Duet injects vendor authentication; callers provide their Duet key and select a
workspace with x-duet-workspace when needed.
Successful calls are billed at vendor cost plus Duet's standard margin and
return the customer charge in x-duet-charge-usd. Errors are not charged.
Routes outside the catalog return 404. Shared resources are readable and usable
by design, while mutation belongs to the creating workspace and temporary items
follow the pool TTL.
Services
7 operations /v1 /servicesSearch the catalog of paid third-party services.
- Scope
api_key- Request
- No JSON request body
- Query
Query parameters JSON schema
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "cursor": { "type": "string", "minLength": 1 }, "limit": { "default": 50, "type": "integer", "minimum": 1, "maximum": 100 }, "q": { "type": "string" }, "category": { "type": "string" } }, "additionalProperties": false }- Response
Response JSON schema
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "items": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "summary": { "type": "string" }, "category": { "type": "string" }, "docsUrl": { "type": "string", "format": "uri" }, "llmsTxtUrl": { "type": "string", "format": "uri" }, "proxyBaseUrl": { "type": "string", "format": "uri" } }, "required": [ "id", "name", "summary", "category", "docsUrl", "proxyBaseUrl" ], "additionalProperties": false } }, "nextCursor": { "anyOf": [ { "type": "string" }, { "type": "null" } ] } }, "required": [ "items", "nextCursor" ], "additionalProperties": false }- Errors
Opaque collection cursor is malformed or bound to another walk (400)
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "error": { "type": "string", "const": "invalid_cursor" } }, "required": [ "error" ], "additionalProperties": false, "description": "Opaque collection cursor is malformed or bound to another walk (400)" }- Delivery
- Standard response
- Retry
- Not declared idempotent
/v1 /services /{service}Read service documentation links and allowed routes.
- Scope
api_key- Request
- No JSON request body
- Response
Response JSON schema
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "summary": { "type": "string" }, "category": { "type": "string" }, "docsUrl": { "type": "string", "format": "uri" }, "llmsTxtUrl": { "type": "string", "format": "uri" }, "proxyBaseUrl": { "type": "string", "format": "uri" }, "notes": { "type": "string" }, "routes": { "type": "array", "items": { "type": "object", "properties": { "method": { "type": "string" }, "path": { "type": "string" }, "billing": { "type": "string", "enum": [ "free", "metered" ] }, "pool": { "type": "object", "properties": { "pool": { "type": "string" }, "role": { "type": "string" }, "ttlHours": { "type": "number" } }, "required": [ "pool", "role" ], "additionalProperties": false } }, "required": [ "method", "path", "billing" ], "additionalProperties": false } } }, "required": [ "id", "name", "summary", "category", "docsUrl", "proxyBaseUrl", "notes", "routes" ], "additionalProperties": false }- Delivery
- Standard response
- Retry
- Not declared idempotent
/v1 /services /{service} /{path}Call an allowlisted third-party service route through Duet.
- Scope
api_key- Request
- Raw byte stream
- Headers
x-duet-workspace— Workspace slug for multi-workspace credentials.
- Response
- Raw byte stream
- Delivery
- Standard response
- Retry
- Not declared idempotent
/v1 /services /{service} /{path}Call an allowlisted third-party service route through Duet.
- Scope
api_key- Request
- Raw byte stream
- Headers
x-duet-workspace— Workspace slug for multi-workspace credentials.
- Response
- Raw byte stream
- Delivery
- Standard response
- Retry
- Not declared idempotent
/v1 /services /{service} /{path}Call an allowlisted third-party service route through Duet.
- Scope
api_key- Request
- Raw byte stream
- Headers
x-duet-workspace— Workspace slug for multi-workspace credentials.
- Response
- Raw byte stream
- Delivery
- Standard response
- Retry
- Not declared idempotent
/v1 /services /{service} /{path}Call an allowlisted third-party service route through Duet.
- Scope
api_key- Request
- Raw byte stream
- Headers
x-duet-workspace— Workspace slug for multi-workspace credentials.
- Response
- Raw byte stream
- Delivery
- Standard response
- Retry
- Not declared idempotent
/v1 /services /{service} /{path}Call an allowlisted third-party service route through Duet.
- Scope
api_key- Request
- Raw byte stream
- Headers
x-duet-workspace— Workspace slug for multi-workspace credentials.
- Response
- Raw byte stream
- Delivery
- Standard response
- Retry
- Not declared idempotent