openapi: 3.2.0 info: title: DUST Templates API description: DUST Platform API version: 2026.7.4 servers: - url: https://apid.dustid.io description: DUST API for trusted provenance. security: - Bearer: [] tags: - name: Templates description: Manage thread templates paths: /api/v1/templates: post: operationId: templates.create summary: Create a thread template tags: - Templates responses: '200': description: The created thread template. content: application/json: schema: $ref: '#/components/schemas/ThreadTemplate' '400': description: Invalid Request content: application/json: schema: type: object properties: code: const: INVALID_REQUEST message: type: string status: const: 400 detail: type: object description: Extra context information specific to this error required: - code - message - status '401': description: Unauthorized content: application/json: schema: type: object properties: code: const: UNAUTHORIZED message: type: string status: const: 401 detail: type: object description: Extra context information specific to this error required: - code - message - status '500': description: Unknown error occurred content: application/json: schema: type: object properties: code: const: UNKNOWN_ERROR message: type: string status: const: 500 detail: type: object description: Extra context information specific to this error required: - code - message - status requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ThreadTemplateInsert' get: operationId: templates.list summary: List thread templates tags: - Templates responses: '200': description: The thread template content: application/json: schema: type: object properties: templates: type: array items: $ref: '#/components/schemas/ThreadTemplate' total: type: number required: - templates - total '400': description: Invalid Request content: application/json: schema: type: object properties: code: const: INVALID_REQUEST message: type: string status: const: 400 detail: type: object description: Extra context information specific to this error required: - code - message - status '401': description: Unauthorized content: application/json: schema: type: object properties: code: const: UNAUTHORIZED message: type: string status: const: 401 detail: type: object description: Extra context information specific to this error required: - code - message - status '500': description: Unknown error occurred content: application/json: schema: type: object properties: code: const: UNKNOWN_ERROR message: type: string status: const: 500 detail: type: object description: Extra context information specific to this error required: - code - message - status parameters: - in: query name: cursor schema: type: string - in: query name: order schema: enum: - asc - desc - in: query name: pageSize schema: anyOf: - type: number - type: string pattern: ^(?:(?!^-0\.?0*$)(?:-?(?:(?:0|[1-9]\d*)(?:\.\d+)?)|\.\d+?))$ - in: query name: q schema: type: string /api/v1/templates/{templateId}: patch: operationId: templates.update parameters: - in: path name: templateId schema: anyOf: - type: string description: a UUID format: uuid pattern: '[\da-f]{8}-[\da-f]{4}-[1-8][\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}' - const: 00000000-0000-0000-0000-000000000000 description: a UUID format: uuid - const: ffffffff-ffff-ffff-ffff-ffffffffffff description: a UUID format: uuid format: uuid required: true description: a UUID requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ThreadTemplateUpdate' summary: Update a thread template tags: - Templates responses: '200': description: Updated thread template content: application/json: schema: $ref: '#/components/schemas/ThreadTemplate' '400': description: Invalid Request content: application/json: schema: type: object properties: code: const: INVALID_REQUEST message: type: string status: const: 400 detail: type: object description: Extra context information specific to this error required: - code - message - status '401': description: Unauthorized content: application/json: schema: type: object properties: code: const: UNAUTHORIZED message: type: string status: const: 401 detail: type: object description: Extra context information specific to this error required: - code - message - status '500': description: Unknown error occurred content: application/json: schema: type: object properties: code: const: UNKNOWN_ERROR message: type: string status: const: 500 detail: type: object description: Extra context information specific to this error required: - code - message - status get: operationId: templates.get summary: Get a thread template tags: - Templates responses: '200': description: The thread template content: application/json: schema: $ref: '#/components/schemas/ThreadTemplate' '400': description: Invalid Request content: application/json: schema: type: object properties: code: const: INVALID_REQUEST message: type: string status: const: 400 detail: type: object description: Extra context information specific to this error required: - code - message - status '401': description: Unauthorized content: application/json: schema: type: object properties: code: const: UNAUTHORIZED message: type: string status: const: 401 detail: type: object description: Extra context information specific to this error required: - code - message - status '500': description: Unknown error occurred content: application/json: schema: type: object properties: code: const: UNKNOWN_ERROR message: type: string status: const: 500 detail: type: object description: Extra context information specific to this error required: - code - message - status parameters: - in: path name: templateId schema: anyOf: - type: string description: a UUID format: uuid pattern: '[\da-f]{8}-[\da-f]{4}-[1-8][\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}' - const: 00000000-0000-0000-0000-000000000000 description: a UUID format: uuid - const: ffffffff-ffff-ffff-ffff-ffffffffffff description: a UUID format: uuid format: uuid required: true description: a UUID components: schemas: ThreadFieldDefinitionDate: type: object properties: name: type: string type: const: date id: anyOf: - type: string description: a UUID format: uuid pattern: '[\da-f]{8}-[\da-f]{4}-[1-8][\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}' - const: 00000000-0000-0000-0000-000000000000 description: a UUID format: uuid - const: ffffffff-ffff-ffff-ffff-ffffffffffff description: a UUID format: uuid description: a UUID format: uuid default: 386ff857-2e20-41e6-b97f-6a626481fa89 isPrivate: type: boolean default: false isRequired: type: boolean default: false default: anyOf: - type: string - type: 'null' description: type: string required: - name - type ThreadFieldDefinitionPhone: type: object properties: name: type: string type: const: phone id: anyOf: - type: string description: a UUID format: uuid pattern: '[\da-f]{8}-[\da-f]{4}-[1-8][\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}' - const: 00000000-0000-0000-0000-000000000000 description: a UUID format: uuid - const: ffffffff-ffff-ffff-ffff-ffffffffffff description: a UUID format: uuid description: a UUID format: uuid default: 4f65f255-250b-4ffb-b8f5-64144d2c3ecf isPrivate: type: boolean default: false isRequired: type: boolean default: false default: anyOf: - type: string pattern: ^(?:\+?\d{1,4})?[-.\s]*?\(?\d{1,3}?\)?[-.\s]*?\d{1,4}[-.\s]*?\d{1,4}[-.\s]?\d{1,9}$ - type: 'null' description: type: string required: - name - type ThreadTemplateSpec: type: array items: anyOf: - $ref: '#/components/schemas/ThreadFieldDefinitionResource' - $ref: '#/components/schemas/ThreadFieldDefinitionBoolean' - $ref: '#/components/schemas/ThreadFieldDefinitionDate' - $ref: '#/components/schemas/ThreadFieldDefinitionDateRange' - $ref: '#/components/schemas/ThreadFieldDefinitionDatetime' - $ref: '#/components/schemas/ThreadFieldDefinitionDuration' - $ref: '#/components/schemas/ThreadFieldDefinitionEmail' - $ref: '#/components/schemas/ThreadFieldDefinitionLongText' - $ref: '#/components/schemas/ThreadFieldDefinitionNumber' - $ref: '#/components/schemas/ThreadFieldDefinitionJson' - $ref: '#/components/schemas/ThreadFieldDefinitionPhone' - $ref: '#/components/schemas/ThreadFieldDefinitionSelect' - $ref: '#/components/schemas/ThreadFieldDefinitionSelectMany' - $ref: '#/components/schemas/ThreadFieldDefinitionTags' - $ref: '#/components/schemas/ThreadFieldDefinitionText' - $ref: '#/components/schemas/ThreadFieldDefinitionTime' - $ref: '#/components/schemas/ThreadFieldDefinitionUrl' ThreadFieldDefinitionNumber: type: object properties: name: type: string type: const: number id: anyOf: - type: string description: a UUID format: uuid pattern: '[\da-f]{8}-[\da-f]{4}-[1-8][\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}' - const: 00000000-0000-0000-0000-000000000000 description: a UUID format: uuid - const: ffffffff-ffff-ffff-ffff-ffffffffffff description: a UUID format: uuid description: a UUID format: uuid default: 88007de5-4857-4391-890f-0e22663116b9 isPrivate: type: boolean default: false isRequired: type: boolean default: false default: anyOf: - type: number - type: 'null' description: type: string required: - name - type ThreadTemplate: type: object properties: createdAt: type: string description: anyOf: - type: string - type: 'null' image: {} name: type: string ownerId: anyOf: - type: string description: a RFC-4122-compliant UUID pattern: ^[\da-f]{8}(?:-[\da-f]{4}){3}-[\da-f]{12}$ - type: 'null' slug: type: string spec: $ref: '#/components/schemas/ThreadTemplateSpec' templateId: type: string description: a RFC-4122-compliant UUID pattern: ^[\da-f]{8}(?:-[\da-f]{4}){3}-[\da-f]{12}$ updatedAt: type: string owner: type: object properties: createdAt: type: string description: anyOf: - type: string - type: 'null' detail: anyOf: - type: string - type: 'null' logo: anyOf: - type: string - type: 'null' name: anyOf: - type: string - type: 'null' orgId: type: string description: a RFC-4122-compliant UUID pattern: ^[\da-f]{8}(?:-[\da-f]{4}){3}-[\da-f]{12}$ teamId: type: string description: a RFC-4122-compliant UUID pattern: ^[\da-f]{8}(?:-[\da-f]{4}){3}-[\da-f]{12}$ updatedAt: type: string depth: type: number num_members: type: number org: type: object properties: name: type: string orgId: type: string required: - name - orgId path: type: string required: - createdAt - description - detail - logo - name - orgId - teamId - updatedAt totalCount: type: number required: - createdAt - description - image - name - ownerId - slug - spec - templateId - updatedAt ThreadTemplateUpdate: type: object properties: description: anyOf: - type: string - type: 'null' image: anyOf: - type: string - type: 'null' name: type: string spec: $ref: '#/components/schemas/ThreadTemplateSpec' ThreadTemplateInsert: type: object properties: name: type: string spec: $ref: '#/components/schemas/ThreadTemplateSpec' description: anyOf: - type: string - type: 'null' image: anyOf: - type: string - type: 'null' required: - name - spec ThreadFieldDefinitionTime: type: object properties: name: type: string type: const: time id: anyOf: - type: string description: a UUID format: uuid pattern: '[\da-f]{8}-[\da-f]{4}-[1-8][\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}' - const: 00000000-0000-0000-0000-000000000000 description: a UUID format: uuid - const: ffffffff-ffff-ffff-ffff-ffffffffffff description: a UUID format: uuid description: a UUID format: uuid default: 88398b08-4bbe-4d51-98da-82bc2a63e7a1 isPrivate: type: boolean default: false isRequired: type: boolean default: false default: anyOf: - type: string - type: 'null' description: type: string required: - name - type ThreadFieldDefinitionDatetime: type: object properties: name: type: string type: const: date-time id: anyOf: - type: string description: a UUID format: uuid pattern: '[\da-f]{8}-[\da-f]{4}-[1-8][\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}' - const: 00000000-0000-0000-0000-000000000000 description: a UUID format: uuid - const: ffffffff-ffff-ffff-ffff-ffffffffffff description: a UUID format: uuid description: a UUID format: uuid default: e8358975-3c3d-4b07-84ab-5a9e4810f34c isPrivate: type: boolean default: false isRequired: type: boolean default: false default: anyOf: - type: string - type: 'null' description: type: string required: - name - type ThreadFieldDefinitionSelectMany: type: object properties: name: type: string type: const: select-many id: anyOf: - type: string description: a UUID format: uuid pattern: '[\da-f]{8}-[\da-f]{4}-[1-8][\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}' - const: 00000000-0000-0000-0000-000000000000 description: a UUID format: uuid - const: ffffffff-ffff-ffff-ffff-ffffffffffff description: a UUID format: uuid description: a UUID format: uuid default: 48c7ffbe-23b4-4f01-a457-140a4531b7e3 isPrivate: type: boolean default: false isRequired: type: boolean default: false default: anyOf: - type: object properties: options: type: array items: type: string selections: anyOf: - type: array items: type: string - type: 'null' required: - options - selections - type: 'null' description: type: string required: - name - type ThreadFieldDefinitionSelect: type: object properties: name: type: string type: const: select id: anyOf: - type: string description: a UUID format: uuid pattern: '[\da-f]{8}-[\da-f]{4}-[1-8][\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}' - const: 00000000-0000-0000-0000-000000000000 description: a UUID format: uuid - const: ffffffff-ffff-ffff-ffff-ffffffffffff description: a UUID format: uuid description: a UUID format: uuid default: 5744fc81-01ea-47ed-b407-a7416b54703e isPrivate: type: boolean default: false isRequired: type: boolean default: false default: anyOf: - type: object properties: options: type: array items: type: string selected: type: string required: - options - selected - type: 'null' description: type: string required: - name - type ThreadFieldDefinitionLongText: type: object properties: name: type: string type: const: long-text id: anyOf: - type: string description: a UUID format: uuid pattern: '[\da-f]{8}-[\da-f]{4}-[1-8][\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}' - const: 00000000-0000-0000-0000-000000000000 description: a UUID format: uuid - const: ffffffff-ffff-ffff-ffff-ffffffffffff description: a UUID format: uuid description: a UUID format: uuid default: 7ce96e4f-38d0-4c7d-8bd3-3f735aa0a2d9 isPrivate: type: boolean default: false isRequired: type: boolean default: false default: anyOf: - type: string - type: 'null' description: type: string required: - name - type ThreadFieldDefinitionResource: type: object properties: default: type: 'null' name: type: string type: enum: - audio - doc - file - image - pdf - video id: anyOf: - type: string description: a UUID format: uuid pattern: '[\da-f]{8}-[\da-f]{4}-[1-8][\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}' - const: 00000000-0000-0000-0000-000000000000 description: a UUID format: uuid - const: ffffffff-ffff-ffff-ffff-ffffffffffff description: a UUID format: uuid description: a UUID format: uuid default: 709f77e0-7134-4158-87b4-71f276af235a isPrivate: type: boolean default: false isRequired: type: boolean default: false description: type: string required: - default - name - type ThreadFieldDefinitionTags: type: object properties: name: type: string type: const: tags id: anyOf: - type: string description: a UUID format: uuid pattern: '[\da-f]{8}-[\da-f]{4}-[1-8][\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}' - const: 00000000-0000-0000-0000-000000000000 description: a UUID format: uuid - const: ffffffff-ffff-ffff-ffff-ffffffffffff description: a UUID format: uuid description: a UUID format: uuid default: fa827b77-6f8f-4dcf-b7f9-77e702d9e133 isPrivate: type: boolean default: false isRequired: type: boolean default: false default: anyOf: - type: array items: type: string - type: 'null' description: type: string required: - name - type ThreadFieldDefinitionJson: type: object properties: name: type: string type: const: object id: anyOf: - type: string description: a UUID format: uuid pattern: '[\da-f]{8}-[\da-f]{4}-[1-8][\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}' - const: 00000000-0000-0000-0000-000000000000 description: a UUID format: uuid - const: ffffffff-ffff-ffff-ffff-ffffffffffff description: a UUID format: uuid description: a UUID format: uuid default: f46e1465-eb29-4520-98af-b220e982e6e2 isPrivate: type: boolean default: false isRequired: type: boolean default: false default: anyOf: - type: string description: a JSON string - type: 'null' description: type: string required: - name - type ThreadFieldDefinitionText: type: object properties: name: type: string type: const: text id: anyOf: - type: string description: a UUID format: uuid pattern: '[\da-f]{8}-[\da-f]{4}-[1-8][\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}' - const: 00000000-0000-0000-0000-000000000000 description: a UUID format: uuid - const: ffffffff-ffff-ffff-ffff-ffffffffffff description: a UUID format: uuid description: a UUID format: uuid default: f61578f3-7867-4b10-b964-71be2cca90ec isPrivate: type: boolean default: false isRequired: type: boolean default: false default: anyOf: - type: string - type: 'null' description: type: string required: - name - type ThreadFieldDefinitionBoolean: type: object properties: name: type: string type: const: boolean id: anyOf: - type: string description: a UUID format: uuid pattern: '[\da-f]{8}-[\da-f]{4}-[1-8][\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}' - const: 00000000-0000-0000-0000-000000000000 description: a UUID format: uuid - const: ffffffff-ffff-ffff-ffff-ffffffffffff description: a UUID format: uuid description: a UUID format: uuid default: b12119c2-cc44-4694-bce7-b533d24fa2a3 isPrivate: type: boolean default: false isRequired: type: boolean default: false default: anyOf: - type: boolean - type: 'null' description: type: string required: - name - type ThreadFieldDefinitionDateRange: type: object properties: name: type: string type: const: date-range id: anyOf: - type: string description: a UUID format: uuid pattern: '[\da-f]{8}-[\da-f]{4}-[1-8][\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}' - const: 00000000-0000-0000-0000-000000000000 description: a UUID format: uuid - const: ffffffff-ffff-ffff-ffff-ffffffffffff description: a UUID format: uuid description: a UUID format: uuid default: 778b2689-0293-403b-8036-366f1f6ef9b3 isPrivate: type: boolean default: false isRequired: type: boolean default: false default: anyOf: - type: object properties: from: type: string to: type: string required: - from - to - type: 'null' description: type: string required: - name - type ThreadFieldDefinitionEmail: type: object properties: name: type: string type: const: email id: anyOf: - type: string description: a UUID format: uuid pattern: '[\da-f]{8}-[\da-f]{4}-[1-8][\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}' - const: 00000000-0000-0000-0000-000000000000 description: a UUID format: uuid - const: ffffffff-ffff-ffff-ffff-ffffffffffff description: a UUID format: uuid description: a UUID format: uuid default: d3974814-0222-45da-bc9e-dc241e802784 isPrivate: type: boolean default: false isRequired: type: boolean default: false default: anyOf: - type: string pattern: ^[\w%+.-]+@[\d.A-Za-z-]+\.[A-Za-z]{2,}$ format: email - type: 'null' description: type: string required: - name - type ThreadFieldDefinitionDuration: type: object properties: name: type: string type: const: duration id: anyOf: - type: string description: a UUID format: uuid pattern: '[\da-f]{8}-[\da-f]{4}-[1-8][\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}' - const: 00000000-0000-0000-0000-000000000000 description: a UUID format: uuid - const: ffffffff-ffff-ffff-ffff-ffffffffffff description: a UUID format: uuid description: a UUID format: uuid default: 43b8da40-adf9-499f-989d-79c6bfed671e isPrivate: type: boolean default: false isRequired: type: boolean default: false default: anyOf: - type: string pattern: ^P(\d+Y)?(\d+M)?(\d+D)?T(\d+H)?(\d+M)?(\d+S)?$ - type: 'null' description: type: string required: - name - type ThreadFieldDefinitionUrl: type: object properties: name: type: string type: const: url id: anyOf: - type: string description: a UUID format: uuid pattern: '[\da-f]{8}-[\da-f]{4}-[1-8][\da-f]{3}-[89ab][\da-f]{3}-[\da-f]{12}' - const: 00000000-0000-0000-0000-000000000000 description: a UUID format: uuid - const: ffffffff-ffff-ffff-ffff-ffffffffffff description: a UUID format: uuid description: a UUID format: uuid default: 03cae506-0c80-40be-8225-6e4dd35139a7 isPrivate: type: boolean default: false isRequired: type: boolean default: false default: anyOf: - type: string format: uri - type: 'null' description: type: string required: - name - type securitySchemes: Bearer: type: http scheme: bearer bearerFormat: JWT description: JWT issued by the DUST auth service. Obtain one by exchanging a Service Account API key (`GET /api/auth/token` with the key header) or via the OAuth2 `client_credentials` grant. Tokens are short-lived; re-exchange on expiry. x-tagTeams: - name:  Core tags: - System - Users - Teams - Connections - Org Admin - Organizations - Auth - name:  Content tags: - Threads - Tags - Templates - Files - Certificates - Certificate Forms - Sharing - Thread Links - Thread Relations - Notifications - Bundles - Events - Metrics - Transfers