Services
Duet exposes paid third-party APIs through a catalog. Discover services with
duet services list, inspect one with duet services get, read the linked
vendor documentation, then call an allowed route with duet services proxy.
Use duet services --help for complete inputs and transfer options.
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
- Query
Query parameters JSON schema
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "propertyNames": { "type": "string" }, "additionalProperties": { "anyOf": [ { "type": "string" }, { "type": "array", "items": { "type": "string" } } ] } }- Headers
x-duet-workspace— Workspace slug for multi-workspace credentials.content-type— Vendor request body content type; other vendor headers pass through the existing credential-stripping proxy.
- 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
- Query
Query parameters JSON schema
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "propertyNames": { "type": "string" }, "additionalProperties": { "anyOf": [ { "type": "string" }, { "type": "array", "items": { "type": "string" } } ] } }- Headers
x-duet-workspace— Workspace slug for multi-workspace credentials.content-type— Vendor request body content type; other vendor headers pass through the existing credential-stripping proxy.
- 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
- Query
Query parameters JSON schema
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "propertyNames": { "type": "string" }, "additionalProperties": { "anyOf": [ { "type": "string" }, { "type": "array", "items": { "type": "string" } } ] } }- Headers
x-duet-workspace— Workspace slug for multi-workspace credentials.content-type— Vendor request body content type; other vendor headers pass through the existing credential-stripping proxy.
- 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
- Query
Query parameters JSON schema
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "propertyNames": { "type": "string" }, "additionalProperties": { "anyOf": [ { "type": "string" }, { "type": "array", "items": { "type": "string" } } ] } }- Headers
x-duet-workspace— Workspace slug for multi-workspace credentials.content-type— Vendor request body content type; other vendor headers pass through the existing credential-stripping proxy.
- 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
- Query
Query parameters JSON schema
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "propertyNames": { "type": "string" }, "additionalProperties": { "anyOf": [ { "type": "string" }, { "type": "array", "items": { "type": "string" } } ] } }- Headers
x-duet-workspace— Workspace slug for multi-workspace credentials.content-type— Vendor request body content type; other vendor headers pass through the existing credential-stripping proxy.
- Response
- Raw byte stream
- Delivery
- Standard response
- Retry
- Not declared idempotent