Browse documentationServices

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
GET/v1/services

Search 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
GET/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
GET/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
POST/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
PUT/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
PATCH/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
DELETE/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