Browse documentation

API data schemas

Current release · Updated October 2, 2026

Shared request and response shapes. Field descriptions include bounds and state-dependent requirements. See each endpoint for permissions and additional validation.

Error

FieldTypeRequiredDetails
errorobjectYes
Error JSON Schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "message": {
          "type": "string",
          "description": "Recovery message"
        },
        "request_id": {
          "type": "string",
          "description": "Request correlation ID; may be absent on a rate limit response"
        }
      },
      "required": [
        "message"
      ]
    }
  },
  "required": [
    "error"
  ]
}

OK

FieldTypeRequiredDetails
oktrueYes
OK JSON Schema
{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "const": true
    }
  },
  "required": [
    "ok"
  ]
}

Record

FieldTypeRequiredDetails
iduuidYes
tenant_iduuidNo
object_keystringYes Pattern: ^[a-z][a-z0-9_]{1,39}$.
dataobjectYesObject field values. Only keys in the workspace object definition are allowed; required fields and field types are validated.
versionintegerYesPositive optimistic version returned by the latest read. Refresh on 409; do not overwrite stale changes. Min 1.
created_byuuidNo
created_atdate-timeNo
updated_atdate-timeNo
Record JSON Schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "tenant_id": {
      "type": "string",
      "format": "uuid"
    },
    "object_key": {
      "type": "string",
      "pattern": "^[a-z][a-z0-9_]{1,39}$"
    },
    "data": {
      "type": "object",
      "additionalProperties": true,
      "description": "Object field values. Only keys in the workspace object definition are allowed; required fields and field types are validated."
    },
    "version": {
      "type": "integer",
      "description": "Positive optimistic version returned by the latest read. Refresh on 409; do not overwrite stale changes.",
      "minimum": 1
    },
    "created_by": {
      "type": "string",
      "format": "uuid"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  },
  "required": [
    "id",
    "object_key",
    "data",
    "version"
  ]
}

RecordPage

FieldTypeRequiredDetails
itemsRecord[]Yes
totalintegerYesNumber matching the full query, before cursor
next_cursorstring or nullYesOpaque cursor for the next page; null ends pagination.
RecordPage JSON Schema
{
  "type": "object",
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Record"
      }
    },
    "total": {
      "type": "integer",
      "description": "Number matching the full query, before cursor"
    },
    "next_cursor": {
      "type": [
        "string",
        "null"
      ],
      "description": "Opaque cursor for the next page; null ends pagination."
    }
  },
  "required": [
    "items",
    "total",
    "next_cursor"
  ]
}

Field

FieldTypeRequiredDetails
keystringYes Pattern: ^[a-z][a-z0-9_]{1,39}$.
namestringYesField label Max 80 characters.
typetext | email | phone | number | currency | boolean | date | select | multi_select | relation | jsonYesField type
requiredbooleanNoDefaults false
optionsstring[]No Max 100 items.
objectstringNo Pattern: ^[a-z][a-z0-9_]{1,39}$.
Field JSON Schema
{
  "type": "object",
  "properties": {
    "key": {
      "type": "string",
      "pattern": "^[a-z][a-z0-9_]{1,39}$"
    },
    "name": {
      "type": "string",
      "description": "Field label",
      "maxLength": 80
    },
    "type": {
      "type": "string",
      "enum": [
        "text",
        "email",
        "phone",
        "number",
        "currency",
        "boolean",
        "date",
        "select",
        "multi_select",
        "relation",
        "json"
      ],
      "description": "Field type"
    },
    "required": {
      "type": "boolean",
      "description": "Defaults false"
    },
    "options": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "Option",
        "maxLength": 80
      },
      "minItems": 0,
      "maxItems": 100
    },
    "object": {
      "type": "string",
      "pattern": "^[a-z][a-z0-9_]{1,39}$"
    }
  },
  "required": [
    "key",
    "name",
    "type"
  ]
}

Object

FieldTypeRequiredDetails
keystringYes Pattern: ^[a-z][a-z0-9_]{1,39}$.
namestringYesPlural label Max 80 characters.
singular_namestringYesSingular label Max 80 characters.
fieldsField[]Yes Min 1 items. Max 100 items.
Object JSON Schema
{
  "type": "object",
  "properties": {
    "key": {
      "type": "string",
      "pattern": "^[a-z][a-z0-9_]{1,39}$"
    },
    "name": {
      "type": "string",
      "description": "Plural label",
      "maxLength": 80
    },
    "singular_name": {
      "type": "string",
      "description": "Singular label",
      "maxLength": 80
    },
    "fields": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Field"
      },
      "minItems": 1,
      "maxItems": 100
    }
  },
  "required": [
    "key",
    "name",
    "singular_name",
    "fields"
  ]
}

Filter

FieldTypeRequiredDetails
matchall | anyYesCombine conditions
conditionsobject[]Yes Min 1 items. Max 12 items.
Filter JSON Schema
{
  "type": "object",
  "properties": {
    "match": {
      "type": "string",
      "enum": [
        "all",
        "any"
      ],
      "description": "Combine conditions"
    },
    "conditions": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "field": {
            "type": "string",
            "pattern": "^[a-z][a-z0-9_]{1,39}$"
          },
          "operator": {
            "type": "string",
            "enum": [
              "eq",
              "ne",
              "contains",
              "not_contains",
              "gt",
              "gte",
              "lt",
              "lte",
              "empty",
              "not_empty"
            ],
            "description": "Supported operators depend on field type. Relations and JSON are excluded."
          },
          "value": {
            "type": [
              "string",
              "number",
              "boolean"
            ],
            "description": "Typed comparison value; omit for empty/not_empty."
          }
        },
        "required": [
          "field",
          "operator"
        ]
      },
      "minItems": 1,
      "maxItems": 12
    }
  },
  "required": [
    "match",
    "conditions"
  ]
}

SmartList

FieldTypeRequiredDetails
iduuidYes
object_keystringNo Pattern: ^[a-z][a-z0-9_]{1,39}$.
namestringYesUnique name per object Max 80 characters.
filterFilterYes
versionintegerYesPositive optimistic version returned by the latest read. Refresh on 409; do not overwrite stale changes. Min 1.
SmartList JSON Schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "object_key": {
      "type": "string",
      "pattern": "^[a-z][a-z0-9_]{1,39}$"
    },
    "name": {
      "type": "string",
      "description": "Unique name per object",
      "maxLength": 80
    },
    "filter": {
      "$ref": "#/components/schemas/Filter"
    },
    "version": {
      "type": "integer",
      "description": "Positive optimistic version returned by the latest read. Refresh on 409; do not overwrite stale changes.",
      "minimum": 1
    }
  },
  "required": [
    "id",
    "name",
    "filter",
    "version"
  ]
}

ListInput

FieldTypeRequiredDetails
namestringYesNonblank list name Max 80 characters.
filterFilterYes
ListInput JSON Schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nonblank list name",
      "maxLength": 80
    },
    "filter": {
      "$ref": "#/components/schemas/Filter"
    }
  },
  "required": [
    "name",
    "filter"
  ]
}

Import

FieldTypeRequiredDetails
csvstringYesUTF-8 CSV content, not a file path. Header required; <=500 data rows. Max 300000 characters.
mappingstring or null[]No Max 100 items.
duplicatesskip | update | errorNoPeople email duplicate policy, default skip. Blank update cells preserve existing values.
Import JSON Schema
{
  "type": "object",
  "properties": {
    "csv": {
      "type": "string",
      "description": "UTF-8 CSV content, not a file path. Header required; <=500 data rows.",
      "maxLength": 300000
    },
    "mapping": {
      "type": "array",
      "items": {
        "type": [
          "string",
          "null"
        ],
        "description": "Field key per CSV column, null skips a column. Omit to match field keys/labels."
      },
      "minItems": 0,
      "maxItems": 100
    },
    "duplicates": {
      "type": "string",
      "enum": [
        "skip",
        "update",
        "error"
      ],
      "description": "People email duplicate policy, default skip. Blank update cells preserve existing values."
    }
  },
  "required": [
    "csv"
  ]
}

ImportReport

FieldTypeRequiredDetails
headersstring[]No
mappingstring or null[]No
rowsintegerNoData rows
createdintegerNoPlanned creates
updatedintegerNoPlanned updates
skippedintegerNoPlanned skips
error_countintegerNoAll errors
errorsobject[]No
previewobject[]No
can_importbooleanNoTrue only if the whole import is valid
ImportReport JSON Schema
{
  "type": "object",
  "properties": {
    "headers": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "CSV heading"
      }
    },
    "mapping": {
      "type": "array",
      "items": {
        "type": [
          "string",
          "null"
        ]
      }
    },
    "rows": {
      "type": "integer",
      "description": "Data rows"
    },
    "created": {
      "type": "integer",
      "description": "Planned creates"
    },
    "updated": {
      "type": "integer",
      "description": "Planned updates"
    },
    "skipped": {
      "type": "integer",
      "description": "Planned skips"
    },
    "error_count": {
      "type": "integer",
      "description": "All errors"
    },
    "errors": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "line": {
            "type": "integer",
            "description": "CSV line"
          },
          "message": {
            "type": "string",
            "description": "Validation error"
          }
        },
        "required": []
      }
    },
    "preview": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "line": {
            "type": "integer",
            "description": "CSV line"
          },
          "action": {
            "type": "string",
            "description": "create, update or skip"
          },
          "data": {
            "type": "object",
            "additionalProperties": true,
            "description": "Object field values. Only keys in the workspace object definition are allowed; required fields and field types are validated."
          }
        },
        "required": []
      }
    },
    "can_import": {
      "type": "boolean",
      "description": "True only if the whole import is valid"
    }
  },
  "required": []
}

Pipeline

FieldTypeRequiredDetails
namestringYesPipeline name Max 100 characters.
stagesobject[]Yes Min 1 items. Max 30 items.
Pipeline JSON Schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Pipeline name",
      "maxLength": 100
    },
    "stages": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "pattern": "^[a-z0-9_-]{1,40}$"
          },
          "name": {
            "type": "string",
            "description": "Stage label",
            "maxLength": 80
          },
          "probability": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "color": {
            "type": "string",
            "pattern": "^#[0-9a-fA-F]{6}$"
          }
        },
        "required": [
          "id",
          "name",
          "probability",
          "color"
        ]
      },
      "minItems": 1,
      "maxItems": 30
    }
  },
  "required": [
    "name",
    "stages"
  ]
}

Widget

FieldTypeRequiredDetails
idstringYesUnique widget ID Max 80 characters.
titlestringYesKPI title Max 120 characters.
objectstringYes Pattern: ^[a-z][a-z0-9_]{1,39}$.
operationcount | sum | avgYesAggregation
fieldstringNo Pattern: ^[a-z][a-z0-9_]{1,39}$.
group_bystringNo Pattern: ^[a-z][a-z0-9_]{1,39}$.
displaymetric | bar | donutYesPresentation
currencystringNoCurrency for monetary results
filterobjectNo
Widget JSON Schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Unique widget ID",
      "maxLength": 80
    },
    "title": {
      "type": "string",
      "description": "KPI title",
      "maxLength": 120
    },
    "object": {
      "type": "string",
      "pattern": "^[a-z][a-z0-9_]{1,39}$"
    },
    "operation": {
      "type": "string",
      "enum": [
        "count",
        "sum",
        "avg"
      ],
      "description": "Aggregation"
    },
    "field": {
      "type": "string",
      "pattern": "^[a-z][a-z0-9_]{1,39}$"
    },
    "group_by": {
      "type": "string",
      "pattern": "^[a-z][a-z0-9_]{1,39}$"
    },
    "display": {
      "type": "string",
      "enum": [
        "metric",
        "bar",
        "donut"
      ],
      "description": "Presentation"
    },
    "currency": {
      "type": "string",
      "description": "Currency for monetary results"
    },
    "filter": {
      "type": "object",
      "properties": {
        "field": {
          "type": "string",
          "pattern": "^[a-z][a-z0-9_]{1,39}$"
        },
        "value": {
          "type": "string",
          "description": "Exact text comparison",
          "maxLength": 200
        }
      },
      "required": [
        "field",
        "value"
      ]
    }
  },
  "required": [
    "id",
    "title",
    "object",
    "operation",
    "display"
  ]
}

FinanceProfile

FieldTypeRequiredDetails
business_namestringYesNonblank issuer name Max 160 characters.
emailemail or No
addressstringNoIssuer address Max 2000 characters.
tax_idstringNoTax reference Max 100 characters.
payment_instructionsstringNoPayment instructions Max 2000 characters.
invoice_prefixstringNo Pattern: ^[A-Z0-9-]{1,12}$.
FinanceProfile JSON Schema
{
  "type": "object",
  "properties": {
    "business_name": {
      "type": "string",
      "description": "Nonblank issuer name",
      "maxLength": 160
    },
    "email": {
      "oneOf": [
        {
          "type": "string",
          "format": "email",
          "maxLength": 200
        },
        {
          "const": ""
        }
      ]
    },
    "address": {
      "type": "string",
      "description": "Issuer address",
      "maxLength": 2000
    },
    "tax_id": {
      "type": "string",
      "description": "Tax reference",
      "maxLength": 100
    },
    "payment_instructions": {
      "type": "string",
      "description": "Payment instructions",
      "maxLength": 2000
    },
    "invoice_prefix": {
      "type": "string",
      "pattern": "^[A-Z0-9-]{1,12}$",
      "default": "INV"
    }
  },
  "required": [
    "business_name"
  ]
}

InvoiceData

Draft inputs; custom optional fields are allowed if defined. Quantity >0 to 1,000,000 with <=3 decimals. Discount is a line amount, tax_rate is 0-100 percent with <=2 decimals. Due date cannot precede issue date. Totals/status/issuer/number are server managed.

FieldTypeRequiredDetails
namestringYesRequired title
customer_namestringYesRequired customer name
customer_emailemailNo Max 200 characters.
billing_addressstringNoAddress
contact_iduuidNo
deal_iduuidNo
currencystringYesEnabled currency code
issue_datedateYesValid calendar date, YYYY-MM-DD.
due_datedateYesValid calendar date, YYYY-MM-DD.
itemsobject[]Yes Min 1 items. Max 100 items.
notesstringNoNotes
InvoiceData JSON Schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Required title"
    },
    "customer_name": {
      "type": "string",
      "description": "Required customer name"
    },
    "customer_email": {
      "type": "string",
      "format": "email",
      "maxLength": 200
    },
    "billing_address": {
      "type": "string",
      "description": "Address"
    },
    "contact_id": {
      "type": "string",
      "format": "uuid"
    },
    "deal_id": {
      "type": "string",
      "format": "uuid"
    },
    "currency": {
      "type": "string",
      "description": "Enabled currency code"
    },
    "issue_date": {
      "type": "string",
      "format": "date",
      "description": "Valid calendar date, YYYY-MM-DD."
    },
    "due_date": {
      "type": "string",
      "format": "date",
      "description": "Valid calendar date, YYYY-MM-DD."
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "description": {
            "type": "string",
            "description": "Nonblank description",
            "maxLength": 500
          },
          "quantity": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "number"
              }
            ],
            "description": "Major currency units, nonnegative. Use decimal strings to retain precision. Currency-specific decimal places apply."
          },
          "unit_price": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "number"
              }
            ],
            "description": "Major currency units, nonnegative. Use decimal strings to retain precision. Currency-specific decimal places apply."
          },
          "discount": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "number"
              }
            ],
            "description": "Major currency units, nonnegative. Use decimal strings to retain precision. Currency-specific decimal places apply."
          },
          "tax_rate": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "number"
              }
            ],
            "description": "Major currency units, nonnegative. Use decimal strings to retain precision. Currency-specific decimal places apply."
          }
        },
        "required": [
          "description",
          "quantity",
          "unit_price"
        ]
      },
      "minItems": 1,
      "maxItems": 100
    },
    "notes": {
      "type": "string",
      "description": "Notes"
    }
  },
  "required": [
    "name",
    "customer_name",
    "currency",
    "issue_date",
    "due_date",
    "items"
  ],
  "description": "Draft inputs; custom optional fields are allowed if defined. Quantity >0 to 1,000,000 with <=3 decimals. Discount is a line amount, tax_rate is 0-100 percent with <=2 decimals. Due date cannot precede issue date. Totals/status/issuer/number are server managed."
}

ExpenseData

Amount must be positive; tax is included in amount and cannot exceed it. Custom optional fields are allowed if defined. Status/approval/totals are server managed.

FieldTypeRequiredDetails
namestringYesRequired title
vendorstringYesRequired vendor
categorystringNoCategory
spent_ondateYesValid calendar date, YYYY-MM-DD.
currencystringYesEnabled currency code
amountstring or numberYesMajor currency units, nonnegative. Use decimal strings to retain precision. Currency-specific decimal places apply.
taxstring or numberNoMajor currency units, nonnegative. Use decimal strings to retain precision. Currency-specific decimal places apply.
receipt_urluriNoHTTP(S) reference; no receipt upload endpoint.
notesstringNoNotes
deal_iduuidNo
ExpenseData JSON Schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Required title"
    },
    "vendor": {
      "type": "string",
      "description": "Required vendor"
    },
    "category": {
      "type": "string",
      "description": "Category"
    },
    "spent_on": {
      "type": "string",
      "format": "date",
      "description": "Valid calendar date, YYYY-MM-DD."
    },
    "currency": {
      "type": "string",
      "description": "Enabled currency code"
    },
    "amount": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "number"
        }
      ],
      "description": "Major currency units, nonnegative. Use decimal strings to retain precision. Currency-specific decimal places apply."
    },
    "tax": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "number"
        }
      ],
      "description": "Major currency units, nonnegative. Use decimal strings to retain precision. Currency-specific decimal places apply."
    },
    "receipt_url": {
      "type": "string",
      "format": "uri",
      "description": "HTTP(S) reference; no receipt upload endpoint."
    },
    "notes": {
      "type": "string",
      "description": "Notes"
    },
    "deal_id": {
      "type": "string",
      "format": "uuid"
    }
  },
  "required": [
    "name",
    "vendor",
    "spent_on",
    "currency",
    "amount"
  ],
  "description": "Amount must be positive; tax is included in amount and cannot exceed it. Custom optional fields are allowed if defined. Status/approval/totals are server managed."
}

Payment

FieldTypeRequiredDetails
iduuidYes
versionintegerYesPositive optimistic version returned by the latest read. Refresh on 409; do not overwrite stale changes. Min 1.
amountstring or numberYesMajor currency units, nonnegative. Use decimal strings to retain precision. Currency-specific decimal places apply.
paid_ondateYesValid calendar date, YYYY-MM-DD.
methodBank transfer | Cash | Card | OtherYesPayment handled outside DryKraft
referencestringYesNonblank payment reference Max 200 characters.
Payment JSON Schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "version": {
      "type": "integer",
      "description": "Positive optimistic version returned by the latest read. Refresh on 409; do not overwrite stale changes.",
      "minimum": 1
    },
    "amount": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "number"
        }
      ],
      "description": "Major currency units, nonnegative. Use decimal strings to retain precision. Currency-specific decimal places apply."
    },
    "paid_on": {
      "type": "string",
      "format": "date",
      "description": "Valid calendar date, YYYY-MM-DD."
    },
    "method": {
      "type": "string",
      "enum": [
        "Bank transfer",
        "Cash",
        "Card",
        "Other"
      ],
      "description": "Payment handled outside DryKraft"
    },
    "reference": {
      "type": "string",
      "description": "Nonblank payment reference",
      "maxLength": 200
    }
  },
  "required": [
    "id",
    "version",
    "amount",
    "paid_on",
    "method",
    "reference"
  ]
}

NodeData

Fields are conditional on kind; publish enforces the required node settings. Extra runtime context fields may exist.

FieldTypeRequiredDetails
kindtrigger.manual | trigger.event | trigger.schedule | trigger.webhook | condition | wait | set | crm.create | crm.update | finance.create | http | logYesOutreach kinds are managed and rejected by the general editor.
labelstringYesNonempty node label Max 100 characters.
eventstringNoRequired for trigger.event Max 100 characters.
intervalMinutesintegerNoRequired for trigger.schedule Min 1. Max 525600.
secondsintegerNoRequired for wait Min 1. Max 2592000.
objectstringNoRequired for crm.create/update; finance.create only invoices or expenses Pattern: ^[a-z][a-z0-9_]{1,39}$.
valuesobjectNoRequired for set or record create/update; interpolated context values
recordIdstringNoRequired for crm.update; UUID or context expression
fieldstringNoRequired context path for condition Max 100 characters.
operatoreq | neq | gte | gt | lte | lt | contains | existsNoRequired for condition
valuestring or number or boolean or object or array or nullNoCondition comparison value, interpolated
urluriNoRequired for http; public destination only
methodGET | POST | PUT | PATCH | DELETENohttp method, default GET
credentialIduuidNoOptional saved outbound credential. Headers are server-managed, not arbitrary draft headers.
bodystring or object or array or nullNohttp body; interpolated
messagestringNolog message; context expressions supported
NodeData JSON Schema
{
  "type": "object",
  "properties": {
    "kind": {
      "type": "string",
      "enum": [
        "trigger.manual",
        "trigger.event",
        "trigger.schedule",
        "trigger.webhook",
        "condition",
        "wait",
        "set",
        "crm.create",
        "crm.update",
        "finance.create",
        "http",
        "log"
      ],
      "description": "Outreach kinds are managed and rejected by the general editor."
    },
    "label": {
      "type": "string",
      "description": "Nonempty node label",
      "maxLength": 100
    },
    "event": {
      "type": "string",
      "description": "Required for trigger.event",
      "maxLength": 100
    },
    "intervalMinutes": {
      "type": "integer",
      "description": "Required for trigger.schedule",
      "minimum": 1,
      "maximum": 525600
    },
    "seconds": {
      "type": "integer",
      "description": "Required for wait",
      "minimum": 1,
      "maximum": 2592000
    },
    "object": {
      "type": "string",
      "pattern": "^[a-z][a-z0-9_]{1,39}$",
      "description": "Required for crm.create/update; finance.create only invoices or expenses"
    },
    "values": {
      "type": "object",
      "additionalProperties": true,
      "description": "Required for set or record create/update; interpolated context values"
    },
    "recordId": {
      "type": "string",
      "description": "Required for crm.update; UUID or context expression"
    },
    "field": {
      "type": "string",
      "description": "Required context path for condition",
      "maxLength": 100
    },
    "operator": {
      "type": "string",
      "enum": [
        "eq",
        "neq",
        "gte",
        "gt",
        "lte",
        "lt",
        "contains",
        "exists"
      ],
      "description": "Required for condition"
    },
    "value": {
      "description": "Condition comparison value, interpolated",
      "type": [
        "string",
        "number",
        "boolean",
        "object",
        "array",
        "null"
      ]
    },
    "url": {
      "type": "string",
      "format": "uri",
      "description": "Required for http; public destination only"
    },
    "method": {
      "type": "string",
      "enum": [
        "GET",
        "POST",
        "PUT",
        "PATCH",
        "DELETE"
      ],
      "description": "http method, default GET"
    },
    "credentialId": {
      "type": "string",
      "format": "uuid",
      "description": "Optional saved outbound credential. Headers are server-managed, not arbitrary draft headers."
    },
    "body": {
      "description": "http body; interpolated",
      "type": [
        "string",
        "object",
        "array",
        "null"
      ]
    },
    "message": {
      "type": "string",
      "description": "log message; context expressions supported"
    }
  },
  "required": [
    "kind",
    "label"
  ],
  "description": "Fields are conditional on kind; publish enforces the required node settings. Extra runtime context fields may exist."
}

Graph

FieldTypeRequiredDetails
nodesobject[]Yes Min 1 items. Max 100 items.
edgesobject[]Yes Max 150 items.
Graph JSON Schema
{
  "type": "object",
  "properties": {
    "nodes": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique nonempty node ID",
            "maxLength": 80
          },
          "type": {
            "const": "workflow"
          },
          "position": {
            "type": "object",
            "properties": {
              "x": {
                "type": "number"
              },
              "y": {
                "type": "number"
              }
            },
            "required": [
              "x",
              "y"
            ]
          },
          "data": {
            "$ref": "#/components/schemas/NodeData"
          }
        },
        "required": [
          "id",
          "type",
          "position",
          "data"
        ]
      },
      "minItems": 1,
      "maxItems": 100
    },
    "edges": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Edge ID"
          },
          "source": {
            "type": "string",
            "description": "Source node"
          },
          "target": {
            "type": "string",
            "description": "Target node"
          },
          "sourceHandle": {
            "type": [
              "string",
              "null"
            ]
          },
          "targetHandle": {
            "type": [
              "string",
              "null"
            ]
          },
          "label": {
            "type": "string",
            "description": "Optional label"
          }
        },
        "required": [
          "id",
          "source",
          "target"
        ]
      },
      "minItems": 0,
      "maxItems": 150
    }
  },
  "required": [
    "nodes",
    "edges"
  ]
}

Workflow

FieldTypeRequiredDetails
iduuidNo
namestringNoName
descriptionstringNoDescription
draftGraphNo
statusstringNodraft, active or paused
published_version_idstring or nullNo
created_atstringNoTimestamp
updated_atstringNoTimestamp
Workflow JSON Schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "name": {
      "type": "string",
      "description": "Name"
    },
    "description": {
      "type": "string",
      "description": "Description"
    },
    "draft": {
      "$ref": "#/components/schemas/Graph"
    },
    "status": {
      "type": "string",
      "description": "draft, active or paused"
    },
    "published_version_id": {
      "type": [
        "string",
        "null"
      ],
      "format": "uuid"
    },
    "created_at": {
      "type": "string",
      "description": "Timestamp"
    },
    "updated_at": {
      "type": "string",
      "description": "Timestamp"
    }
  },
  "required": []
}

Execution

FieldTypeRequiredDetails
iduuidNo
workflow_iduuidNo
version_iduuidNo
statestringNoqueued, running, waiting, retrying, succeeded, failed or cancelled
inputobjectNoObject field values. Only keys in the workspace object definition are allowed; required fields and field types are validated.
contextobjectNoObject field values. Only keys in the workspace object definition are allowed; required fields and field types are validated.
current_nodestring or nullNo
errorstring or nullNo
created_atstringNoTimestamp
completed_atstring or nullNo
Execution JSON Schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "workflow_id": {
      "type": "string",
      "format": "uuid"
    },
    "version_id": {
      "type": "string",
      "format": "uuid"
    },
    "state": {
      "type": "string",
      "description": "queued, running, waiting, retrying, succeeded, failed or cancelled"
    },
    "input": {
      "type": "object",
      "additionalProperties": true,
      "description": "Object field values. Only keys in the workspace object definition are allowed; required fields and field types are validated."
    },
    "context": {
      "type": "object",
      "additionalProperties": true,
      "description": "Object field values. Only keys in the workspace object definition are allowed; required fields and field types are validated."
    },
    "current_node": {
      "type": [
        "string",
        "null"
      ]
    },
    "error": {
      "type": [
        "string",
        "null"
      ]
    },
    "created_at": {
      "type": "string",
      "description": "Timestamp"
    },
    "completed_at": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": []
}

Connection

FieldTypeRequiredDetails
iduuidNo
namestringNoName
channelemail | sms | voice | whatsappNoChannel
providersmtp | google | microsoft | curl | qcall | whatsappNoProvider
configobjectNoPublic provider metadata; no private credentials
enabledbooleanNoConnection enabled
verified_atstring or nullNo
last_errorstring or nullNo
daily_limitintegerNoRolling daily allowance Min 1. Max 10000.
hourly_limitintegerNoRolling hourly allowance Min 1. Max 2000.
created_atstringNoTimestamp
Connection JSON Schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "name": {
      "type": "string",
      "description": "Name"
    },
    "channel": {
      "type": "string",
      "enum": [
        "email",
        "sms",
        "voice",
        "whatsapp"
      ],
      "description": "Channel"
    },
    "provider": {
      "type": "string",
      "enum": [
        "smtp",
        "google",
        "microsoft",
        "curl",
        "qcall",
        "whatsapp"
      ],
      "description": "Provider"
    },
    "config": {
      "type": "object",
      "description": "Public provider metadata; no private credentials"
    },
    "enabled": {
      "type": "boolean",
      "description": "Connection enabled"
    },
    "verified_at": {
      "type": [
        "string",
        "null"
      ]
    },
    "last_error": {
      "type": [
        "string",
        "null"
      ]
    },
    "daily_limit": {
      "type": "integer",
      "description": "Rolling daily allowance",
      "minimum": 1,
      "maximum": 10000
    },
    "hourly_limit": {
      "type": "integer",
      "description": "Rolling hourly allowance",
      "minimum": 1,
      "maximum": 2000
    },
    "created_at": {
      "type": "string",
      "description": "Timestamp"
    }
  },
  "required": []
}

SMTPSecret

FieldTypeRequiredDetails
emailemailYes Max 200 characters.
hoststringYesPublic SMTP hostname
port465 | 587Yes
userstringYesUsername
passwordstringYesPassword/app password
imapobjectNo
SMTPSecret JSON Schema
{
  "type": "object",
  "properties": {
    "email": {
      "type": "string",
      "format": "email",
      "maxLength": 200
    },
    "host": {
      "type": "string",
      "description": "Public SMTP hostname"
    },
    "port": {
      "enum": [
        465,
        587
      ]
    },
    "user": {
      "type": "string",
      "description": "Username"
    },
    "password": {
      "type": "string",
      "description": "Password/app password"
    },
    "imap": {
      "type": "object",
      "properties": {
        "host": {
          "type": "string",
          "description": "Public IMAP hostname; TLS port 993"
        },
        "user": {
          "type": "string",
          "description": "Username"
        },
        "password": {
          "type": "string",
          "description": "Password/app password"
        }
      },
      "required": [
        "host",
        "user",
        "password"
      ]
    }
  },
  "required": [
    "email",
    "host",
    "port",
    "user",
    "password"
  ]
}

SMSSecret

FieldTypeRequiredDetails
curlstringYesOne literal HTTPS:443 POST JSON cURL. No execution or file input. Max 50000 characters.
recipientPathstringYesExisting body path, e.g. recipients.0.mobiles Max 150 characters.
messagePathstringNoOptional message body path Max 150 characters.
SMSSecret JSON Schema
{
  "type": "object",
  "properties": {
    "curl": {
      "type": "string",
      "description": "One literal HTTPS:443 POST JSON cURL. No execution or file input.",
      "maxLength": 50000
    },
    "recipientPath": {
      "type": "string",
      "description": "Existing body path, e.g. recipients.0.mobiles",
      "maxLength": 150
    },
    "messagePath": {
      "type": "string",
      "description": "Optional message body path",
      "maxLength": 150
    }
  },
  "required": [
    "curl",
    "recipientPath"
  ]
}

VoiceSecret

FieldTypeRequiredDetails
apiKeystringYesWorkspace QCall API key
VoiceSecret JSON Schema
{
  "type": "object",
  "properties": {
    "apiKey": {
      "type": "string",
      "description": "Workspace QCall API key"
    }
  },
  "required": [
    "apiKey"
  ]
}

WhatsAppSecret

FieldTypeRequiredDetails
accessTokenstringYesMeta access token
appSecretstringYesMeta app secret
wabaIdstringYes Pattern: ^\d{5,40}$.
phoneIdstringYes Pattern: ^\d{5,40}$.
versionstringNo Pattern: ^v\d{2}\.0$.
WhatsAppSecret JSON Schema
{
  "type": "object",
  "properties": {
    "accessToken": {
      "type": "string",
      "description": "Meta access token"
    },
    "appSecret": {
      "type": "string",
      "description": "Meta app secret"
    },
    "wabaId": {
      "type": "string",
      "pattern": "^\\d{5,40}$"
    },
    "phoneId": {
      "type": "string",
      "pattern": "^\\d{5,40}$"
    },
    "version": {
      "type": "string",
      "pattern": "^v\\d{2}\\.0$",
      "default": "v23.0"
    }
  },
  "required": [
    "accessToken",
    "appSecret",
    "wabaId",
    "phoneId"
  ]
}

ConnectionInput

FieldTypeRequiredDetails
namestringYesNonblank name Max 100 characters.
providersmtp | curl | qcall | whatsappYesUse native OAuth endpoints for Google/Outlook.
daily_limitintegerNoDefaults 100 Min 1. Max 10000.
hourly_limitintegerNoDefaults 20 Min 1. Max 2000.
secretSMTPSecret or SMSSecret or VoiceSecret or WhatsAppSecretYesChoose the schema matching provider. Secret is encrypted and never returned.
ConnectionInput JSON Schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nonblank name",
      "maxLength": 100
    },
    "provider": {
      "type": "string",
      "enum": [
        "smtp",
        "curl",
        "qcall",
        "whatsapp"
      ],
      "description": "Use native OAuth endpoints for Google/Outlook."
    },
    "daily_limit": {
      "type": "integer",
      "description": "Defaults 100",
      "minimum": 1,
      "maximum": 10000
    },
    "hourly_limit": {
      "type": "integer",
      "description": "Defaults 20",
      "minimum": 1,
      "maximum": 2000
    },
    "secret": {
      "oneOf": [
        {
          "$ref": "#/components/schemas/SMTPSecret"
        },
        {
          "$ref": "#/components/schemas/SMSSecret"
        },
        {
          "$ref": "#/components/schemas/VoiceSecret"
        },
        {
          "$ref": "#/components/schemas/WhatsAppSecret"
        }
      ],
      "description": "Choose the schema matching provider. Secret is encrypted and never returned."
    }
  },
  "required": [
    "name",
    "provider",
    "secret"
  ]
}

Step

All optional fields default to empty except language. Email requires subject/body; SMS needs body or variables; voice requires assistant/dialer; WhatsApp requires template/language. Interpolate {{record.data.name}} and other context paths.

FieldTypeRequiredDetails
waitHoursintegerNoWait before this step, default 0 Min 0. Max 720.
subjectstringNoEmail subject; nonblank for email Max 300 characters.
bodystringNoEmail/SMS body; email requires nonblank Max 10000 characters.
variablesobjectNoKeys: 1-40 letters, digits or underscores
templatestringNoApproved WhatsApp template name Max 100 characters.
languagestringNoWhatsApp language, default en Max 20 characters.
parametersstring[]No Max 20 items.
assistantIdstringNoQCall assistant ID Max 100 characters.
dialerIdstringNoQCall dialer ID Max 100 characters.
Step JSON Schema
{
  "type": "object",
  "properties": {
    "waitHours": {
      "type": "integer",
      "description": "Wait before this step, default 0",
      "minimum": 0,
      "maximum": 720
    },
    "subject": {
      "type": "string",
      "description": "Email subject; nonblank for email",
      "maxLength": 300
    },
    "body": {
      "type": "string",
      "description": "Email/SMS body; email requires nonblank",
      "maxLength": 10000
    },
    "variables": {
      "type": "object",
      "additionalProperties": {
        "type": "string",
        "description": "SMS template variable, max 1,000 characters",
        "maxLength": 1000
      },
      "description": "Keys: 1-40 letters, digits or underscores"
    },
    "template": {
      "type": "string",
      "description": "Approved WhatsApp template name",
      "maxLength": 100
    },
    "language": {
      "type": "string",
      "description": "WhatsApp language, default en",
      "maxLength": 20
    },
    "parameters": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "WhatsApp body parameter",
        "maxLength": 1000
      },
      "minItems": 0,
      "maxItems": 20
    },
    "assistantId": {
      "type": "string",
      "description": "QCall assistant ID",
      "maxLength": 100
    },
    "dialerId": {
      "type": "string",
      "description": "QCall dialer ID",
      "maxLength": 100
    }
  },
  "required": [],
  "description": "All optional fields default to empty except language. Email requires subject/body; SMS needs body or variables; voice requires assistant/dialer; WhatsApp requires template/language. Interpolate {{record.data.name}} and other context paths."
}

CampaignInput

FieldTypeRequiredDetails
namestringYesNonblank name Max 100 characters.
kindcampaign | sequenceYesA campaign has exactly one step; a sequence has 1-20.
channelemail | sms | voice | whatsappYesOne channel per campaign/sequence
object_keystringNo Pattern: ^[a-z][a-z0-9_]{1,39}$.
list_idstring or nullNo
connection_iduuidYes
stepsStep[]Yes Min 1 items. Max 20 items.
CampaignInput JSON Schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nonblank name",
      "maxLength": 100
    },
    "kind": {
      "type": "string",
      "enum": [
        "campaign",
        "sequence"
      ],
      "description": "A campaign has exactly one step; a sequence has 1-20."
    },
    "channel": {
      "type": "string",
      "enum": [
        "email",
        "sms",
        "voice",
        "whatsapp"
      ],
      "description": "One channel per campaign/sequence"
    },
    "object_key": {
      "type": "string",
      "pattern": "^[a-z][a-z0-9_]{1,39}$",
      "default": "people"
    },
    "list_id": {
      "type": [
        "string",
        "null"
      ],
      "format": "uuid",
      "default": null
    },
    "connection_id": {
      "type": "string",
      "format": "uuid"
    },
    "steps": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Step"
      },
      "minItems": 1,
      "maxItems": 20
    }
  },
  "required": [
    "name",
    "kind",
    "channel",
    "connection_id",
    "steps"
  ]
}

Campaign

FieldTypeRequiredDetails
iduuidNo
namestringNoName
kindstringNocampaign or sequence
channelstringNoChannel
object_keystringNo Pattern: ^[a-z][a-z0-9_]{1,39}$.
list_idstring or nullNo
connection_iduuidNo
workflow_iduuidNo
stepsStep[]No
statusstringNodraft, active, paused or cancelled
versionintegerNoPositive optimistic version returned by the latest read. Refresh on 409; do not overwrite stale changes. Min 1.
created_atstringNoTimestamp
updated_atstringNoTimestamp
Campaign JSON Schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "name": {
      "type": "string",
      "description": "Name"
    },
    "kind": {
      "type": "string",
      "description": "campaign or sequence"
    },
    "channel": {
      "type": "string",
      "description": "Channel"
    },
    "object_key": {
      "type": "string",
      "pattern": "^[a-z][a-z0-9_]{1,39}$"
    },
    "list_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "connection_id": {
      "type": "string",
      "format": "uuid"
    },
    "workflow_id": {
      "type": "string",
      "format": "uuid"
    },
    "steps": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Step"
      }
    },
    "status": {
      "type": "string",
      "description": "draft, active, paused or cancelled"
    },
    "version": {
      "type": "integer",
      "description": "Positive optimistic version returned by the latest read. Refresh on 409; do not overwrite stale changes.",
      "minimum": 1
    },
    "created_at": {
      "type": "string",
      "description": "Timestamp"
    },
    "updated_at": {
      "type": "string",
      "description": "Timestamp"
    }
  },
  "required": []
}