Ranch.Bot
Skip to reference

Workflow templates API

HTTP reference for workflow templates. Read authentication and access before using these operations. All examples use made-up data and placeholder credentials.

GET /v1/farm/{farm_id}/workflow-templates

List workflow templates

External credential scopes: read:farms. Minimum farm role: READER. Template labels, visibility, requiredness, defaults and units are configuration; core field meanings never change.

ParameterInRequiredSchema
farm_idpathYes{"type":"string","format":"uuid"}
skipqueryNo{"type":"integer","minimum":0,"default":0}
takequeryNo{"type":"integer","minimum":1,"maximum":200,"default":50}
workflowqueryNo{"type":"string","maxLength":80}

Request example

bash example
curl --fail-with-body -X GET \
  'https://api.ranch.bot/v1/farm/<farm_id>/workflow-templates' \
  -H "Authorization: Bearer $RANCHBOT_TOKEN"

Responses

StatusMeaningContent type
200Successapplication/json
400Request validation failed.application/json
401Missing/invalid authentication or insufficient farm role.application/json
403Missing required scope or credential type is disallowed.application/json
404Resource or active farm membership not found.application/json
409Concurrent change, archived template, expired preview, or conflicting approval.application/json

200 response schema (application/json)

FieldTypePresenceConstraints
totalintegerRequiredminimum: 0
recordsarrayRequired
records[]objectRequired
records[].idstringRequiredformat: "uuid"
records[].workflowstringRequired
records[].namestringRequired
records[].is_activebooleanRequired
records[].is_defaultbooleanRequired
records[].metadata_revisionintegerRequired
records[].current_version (variant 1)nullOptional
records[].current_version (variant 2)objectOptional
records[].current_version (variant 2).idstringRequiredformat: "uuid"
records[].current_version (variant 2).versionintegerRequired
records[].current_version (variant 2).definitionobjectRequired
records[].current_version (variant 2).definition.schema_versionintegerRequiredconst: 1
records[].current_version (variant 2).definition.workflowstringRequiredconst: "record_birth"
records[].current_version (variant 2).definition.namestringRequiredminLength: 1; maxLength: 80
records[].current_version (variant 2).definition.fieldsarrayRequiredminItems: 1
records[].current_version (variant 2).definition.fields[]objectRequired
records[].current_version (variant 2).definition.fields[].keystringRequiredminLength: 1; maxLength: 80
records[].current_version (variant 2).definition.fields[].scopestringRequiredenum: ["event","offspring"]
records[].current_version (variant 2).definition.fields[].labelstringRequiredminLength: 1; maxLength: 80
records[].current_version (variant 2).definition.fields[].requiredbooleanOptional
records[].current_version (variant 2).definition.fields[].hiddenbooleanOptional
records[].current_version (variant 2).definition.fields[].defaultobjectOptional
records[].current_version (variant 2).definition.fields[].unitstringOptionalenum: ["kg","lb"]
records[].current_version (variant 2).definition.fields[].typestringOptionalenum: ["text","number","boolean","date","choice"]
records[].current_version (variant 2).definition.fields[].choicesarrayOptionalminItems: 1
records[].current_version (variant 2).definition.fields[].choices[]objectRequired
records[].current_version (variant 2).definition.fields[].choices[].keystringRequired
records[].current_version (variant 2).definition.fields[].choices[].labelstringRequired
records[].current_version (variant 2).created_atstringOptionalformat: "date-time"
records[].versionsarrayOptional
records[].versions[]objectRequired
records[].created_atstringOptionalformat: "date-time"
records[].updated_atstringOptionalformat: "date-time"

POST /v1/farm/{farm_id}/workflow-templates

Create a workflow template

Owner-only farm configuration. External credential scope: write:farms. Publishing is optimistic on expected_current_version; state/default changes are optimistic on expected_metadata_revision. Conflicts return 409.

ParameterInRequiredSchema
farm_idpathYes{"type":"string","format":"uuid"}

Request body (application/json)

FieldTypePresenceConstraints
definitionobjectRequired
definition.schema_versionintegerRequiredconst: 1
definition.workflowstringRequiredconst: "record_birth"
definition.namestringRequiredminLength: 1; maxLength: 80
definition.fieldsarrayRequiredminItems: 1
definition.fields[]objectRequired
definition.fields[].keystringRequiredminLength: 1; maxLength: 80
definition.fields[].scopestringRequiredenum: ["event","offspring"]
definition.fields[].labelstringRequiredminLength: 1; maxLength: 80
definition.fields[].requiredbooleanOptional
definition.fields[].hiddenbooleanOptional
definition.fields[].defaultobjectOptional
definition.fields[].unitstringOptionalenum: ["kg","lb"]
definition.fields[].typestringOptionalenum: ["text","number","boolean","date","choice"]
definition.fields[].choicesarrayOptionalminItems: 1
definition.fields[].choices[]objectRequired
definition.fields[].choices[].keystringRequired
definition.fields[].choices[].labelstringRequired
is_defaultbooleanOptional

Create request.json with a JSON body matching the request schema above before running this example.

Request example

bash example
curl --fail-with-body -X POST \
  'https://api.ranch.bot/v1/farm/<farm_id>/workflow-templates' \
  -H "Authorization: Bearer $RANCHBOT_TOKEN" \
  -H "Content-Type: application/json" \
  --data-binary @request.json

Responses

StatusMeaningContent type
200Successapplication/json
400Request validation failed.application/json
401Missing/invalid authentication or insufficient farm role.application/json
403Missing required scope or credential type is disallowed.application/json
404Resource or active farm membership not found.application/json
409Concurrent change, archived template, expired preview, or conflicting approval.application/json

200 response schema (application/json)

FieldTypePresenceConstraints
idstringRequiredformat: "uuid"
workflowstringRequired
namestringRequired
is_activebooleanRequired
is_defaultbooleanRequired
metadata_revisionintegerRequired
current_version (variant 1)nullOptional
current_version (variant 2)objectOptional
current_version (variant 2).idstringRequiredformat: "uuid"
current_version (variant 2).versionintegerRequired
current_version (variant 2).definitionobjectRequired
current_version (variant 2).definition.schema_versionintegerRequiredconst: 1
current_version (variant 2).definition.workflowstringRequiredconst: "record_birth"
current_version (variant 2).definition.namestringRequiredminLength: 1; maxLength: 80
current_version (variant 2).definition.fieldsarrayRequiredminItems: 1
current_version (variant 2).definition.fields[]objectRequired
current_version (variant 2).definition.fields[].keystringRequiredminLength: 1; maxLength: 80
current_version (variant 2).definition.fields[].scopestringRequiredenum: ["event","offspring"]
current_version (variant 2).definition.fields[].labelstringRequiredminLength: 1; maxLength: 80
current_version (variant 2).definition.fields[].requiredbooleanOptional
current_version (variant 2).definition.fields[].hiddenbooleanOptional
current_version (variant 2).definition.fields[].defaultobjectOptional
current_version (variant 2).definition.fields[].unitstringOptionalenum: ["kg","lb"]
current_version (variant 2).definition.fields[].typestringOptionalenum: ["text","number","boolean","date","choice"]
current_version (variant 2).definition.fields[].choicesarrayOptionalminItems: 1
current_version (variant 2).definition.fields[].choices[]objectRequired
current_version (variant 2).definition.fields[].choices[].keystringRequired
current_version (variant 2).definition.fields[].choices[].labelstringRequired
current_version (variant 2).created_atstringOptionalformat: "date-time"
versionsarrayOptional
versions[]objectRequired
created_atstringOptionalformat: "date-time"
updated_atstringOptionalformat: "date-time"

GET /v1/farm/{farm_id}/workflow-templates/{template_id}

Read a workflow template

External credential scopes: read:farms. Minimum farm role: READER. Template labels, visibility, requiredness, defaults and units are configuration; core field meanings never change.

ParameterInRequiredSchema
farm_idpathYes{"type":"string","format":"uuid"}
template_idpathYes{"type":"string","format":"uuid"}

Request example

bash example
curl --fail-with-body -X GET \
  'https://api.ranch.bot/v1/farm/<farm_id>/workflow-templates/<template_id>' \
  -H "Authorization: Bearer $RANCHBOT_TOKEN"

Responses

StatusMeaningContent type
200Successapplication/json
400Request validation failed.application/json
401Missing/invalid authentication or insufficient farm role.application/json
403Missing required scope or credential type is disallowed.application/json
404Resource or active farm membership not found.application/json
409Concurrent change, archived template, expired preview, or conflicting approval.application/json

200 response schema (application/json)

FieldTypePresenceConstraints
idstringRequiredformat: "uuid"
workflowstringRequired
namestringRequired
is_activebooleanRequired
is_defaultbooleanRequired
metadata_revisionintegerRequired
current_version (variant 1)nullOptional
current_version (variant 2)objectOptional
current_version (variant 2).idstringRequiredformat: "uuid"
current_version (variant 2).versionintegerRequired
current_version (variant 2).definitionobjectRequired
current_version (variant 2).definition.schema_versionintegerRequiredconst: 1
current_version (variant 2).definition.workflowstringRequiredconst: "record_birth"
current_version (variant 2).definition.namestringRequiredminLength: 1; maxLength: 80
current_version (variant 2).definition.fieldsarrayRequiredminItems: 1
current_version (variant 2).definition.fields[]objectRequired
current_version (variant 2).definition.fields[].keystringRequiredminLength: 1; maxLength: 80
current_version (variant 2).definition.fields[].scopestringRequiredenum: ["event","offspring"]
current_version (variant 2).definition.fields[].labelstringRequiredminLength: 1; maxLength: 80
current_version (variant 2).definition.fields[].requiredbooleanOptional
current_version (variant 2).definition.fields[].hiddenbooleanOptional
current_version (variant 2).definition.fields[].defaultobjectOptional
current_version (variant 2).definition.fields[].unitstringOptionalenum: ["kg","lb"]
current_version (variant 2).definition.fields[].typestringOptionalenum: ["text","number","boolean","date","choice"]
current_version (variant 2).definition.fields[].choicesarrayOptionalminItems: 1
current_version (variant 2).definition.fields[].choices[]objectRequired
current_version (variant 2).definition.fields[].choices[].keystringRequired
current_version (variant 2).definition.fields[].choices[].labelstringRequired
current_version (variant 2).created_atstringOptionalformat: "date-time"
versionsarrayOptional
versions[]objectRequired
created_atstringOptionalformat: "date-time"
updated_atstringOptionalformat: "date-time"

POST /v1/farm/{farm_id}/workflow-templates/{template_id}/versions

Publish a workflow template version

Owner-only farm configuration. External credential scope: write:farms. Publishing is optimistic on expected_current_version; state/default changes are optimistic on expected_metadata_revision. Conflicts return 409. Versions are immutable; expect 409 when expected_current_version is stale.

ParameterInRequiredSchema
farm_idpathYes{"type":"string","format":"uuid"}
template_idpathYes{"type":"string","format":"uuid"}

Request body (application/json)

FieldTypePresenceConstraints
expected_current_versionintegerRequiredminimum: 0
definitionobjectRequired
definition.schema_versionintegerRequiredconst: 1
definition.workflowstringRequiredconst: "record_birth"
definition.namestringRequiredminLength: 1; maxLength: 80
definition.fieldsarrayRequiredminItems: 1
definition.fields[]objectRequired
definition.fields[].keystringRequiredminLength: 1; maxLength: 80
definition.fields[].scopestringRequiredenum: ["event","offspring"]
definition.fields[].labelstringRequiredminLength: 1; maxLength: 80
definition.fields[].requiredbooleanOptional
definition.fields[].hiddenbooleanOptional
definition.fields[].defaultobjectOptional
definition.fields[].unitstringOptionalenum: ["kg","lb"]
definition.fields[].typestringOptionalenum: ["text","number","boolean","date","choice"]
definition.fields[].choicesarrayOptionalminItems: 1
definition.fields[].choices[]objectRequired
definition.fields[].choices[].keystringRequired
definition.fields[].choices[].labelstringRequired

Create request.json with a JSON body matching the request schema above before running this example.

Request example

bash example
curl --fail-with-body -X POST \
  'https://api.ranch.bot/v1/farm/<farm_id>/workflow-templates/<template_id>/versions' \
  -H "Authorization: Bearer $RANCHBOT_TOKEN" \
  -H "Content-Type: application/json" \
  --data-binary @request.json

Responses

StatusMeaningContent type
200Successapplication/json
400Request validation failed.application/json
401Missing/invalid authentication or insufficient farm role.application/json
403Missing required scope or credential type is disallowed.application/json
404Resource or active farm membership not found.application/json
409Concurrent change, archived template, expired preview, or conflicting approval.application/json

200 response schema (application/json)

FieldTypePresenceConstraints
idstringRequiredformat: "uuid"
workflowstringRequired
namestringRequired
is_activebooleanRequired
is_defaultbooleanRequired
metadata_revisionintegerRequired
current_version (variant 1)nullOptional
current_version (variant 2)objectOptional
current_version (variant 2).idstringRequiredformat: "uuid"
current_version (variant 2).versionintegerRequired
current_version (variant 2).definitionobjectRequired
current_version (variant 2).definition.schema_versionintegerRequiredconst: 1
current_version (variant 2).definition.workflowstringRequiredconst: "record_birth"
current_version (variant 2).definition.namestringRequiredminLength: 1; maxLength: 80
current_version (variant 2).definition.fieldsarrayRequiredminItems: 1
current_version (variant 2).definition.fields[]objectRequired
current_version (variant 2).definition.fields[].keystringRequiredminLength: 1; maxLength: 80
current_version (variant 2).definition.fields[].scopestringRequiredenum: ["event","offspring"]
current_version (variant 2).definition.fields[].labelstringRequiredminLength: 1; maxLength: 80
current_version (variant 2).definition.fields[].requiredbooleanOptional
current_version (variant 2).definition.fields[].hiddenbooleanOptional
current_version (variant 2).definition.fields[].defaultobjectOptional
current_version (variant 2).definition.fields[].unitstringOptionalenum: ["kg","lb"]
current_version (variant 2).definition.fields[].typestringOptionalenum: ["text","number","boolean","date","choice"]
current_version (variant 2).definition.fields[].choicesarrayOptionalminItems: 1
current_version (variant 2).definition.fields[].choices[]objectRequired
current_version (variant 2).definition.fields[].choices[].keystringRequired
current_version (variant 2).definition.fields[].choices[].labelstringRequired
current_version (variant 2).created_atstringOptionalformat: "date-time"
versionsarrayOptional
versions[]objectRequired
created_atstringOptionalformat: "date-time"
updated_atstringOptionalformat: "date-time"

PUT /v1/farm/{farm_id}/workflow-templates/{template_id}/state

Archive or reactivate a workflow template

Owner-only farm configuration. External credential scope: write:farms. Publishing is optimistic on expected_current_version; state/default changes are optimistic on expected_metadata_revision. Conflicts return 409. Archiving the default template requires an active replacement_template_id in the same transaction.

ParameterInRequiredSchema
farm_idpathYes{"type":"string","format":"uuid"}
template_idpathYes{"type":"string","format":"uuid"}

Request body (application/json)

FieldTypePresenceConstraints
expected_metadata_revisionintegerRequiredminimum: 0
is_activebooleanRequired
replacement_template_idstringOptionalformat: "uuid"

Create request.json with a JSON body matching the request schema above before running this example.

Request example

bash example
curl --fail-with-body -X PUT \
  'https://api.ranch.bot/v1/farm/<farm_id>/workflow-templates/<template_id>/state' \
  -H "Authorization: Bearer $RANCHBOT_TOKEN" \
  -H "Content-Type: application/json" \
  --data-binary @request.json

Responses

StatusMeaningContent type
200Successapplication/json
400Request validation failed.application/json
401Missing/invalid authentication or insufficient farm role.application/json
403Missing required scope or credential type is disallowed.application/json
404Resource or active farm membership not found.application/json
409Concurrent change, archived template, expired preview, or conflicting approval.application/json

200 response schema (application/json)

FieldTypePresenceConstraints
idstringRequiredformat: "uuid"
workflowstringRequired
namestringRequired
is_activebooleanRequired
is_defaultbooleanRequired
metadata_revisionintegerRequired
current_version (variant 1)nullOptional
current_version (variant 2)objectOptional
current_version (variant 2).idstringRequiredformat: "uuid"
current_version (variant 2).versionintegerRequired
current_version (variant 2).definitionobjectRequired
current_version (variant 2).definition.schema_versionintegerRequiredconst: 1
current_version (variant 2).definition.workflowstringRequiredconst: "record_birth"
current_version (variant 2).definition.namestringRequiredminLength: 1; maxLength: 80
current_version (variant 2).definition.fieldsarrayRequiredminItems: 1
current_version (variant 2).definition.fields[]objectRequired
current_version (variant 2).definition.fields[].keystringRequiredminLength: 1; maxLength: 80
current_version (variant 2).definition.fields[].scopestringRequiredenum: ["event","offspring"]
current_version (variant 2).definition.fields[].labelstringRequiredminLength: 1; maxLength: 80
current_version (variant 2).definition.fields[].requiredbooleanOptional
current_version (variant 2).definition.fields[].hiddenbooleanOptional
current_version (variant 2).definition.fields[].defaultobjectOptional
current_version (variant 2).definition.fields[].unitstringOptionalenum: ["kg","lb"]
current_version (variant 2).definition.fields[].typestringOptionalenum: ["text","number","boolean","date","choice"]
current_version (variant 2).definition.fields[].choicesarrayOptionalminItems: 1
current_version (variant 2).definition.fields[].choices[]objectRequired
current_version (variant 2).definition.fields[].choices[].keystringRequired
current_version (variant 2).definition.fields[].choices[].labelstringRequired
current_version (variant 2).created_atstringOptionalformat: "date-time"
versionsarrayOptional
versions[]objectRequired
created_atstringOptionalformat: "date-time"
updated_atstringOptionalformat: "date-time"

PUT /v1/farm/{farm_id}/workflow-templates/{template_id}/default

Select the farm default workflow template

Owner-only farm configuration. External credential scope: write:farms. Publishing is optimistic on expected_current_version; state/default changes are optimistic on expected_metadata_revision. Conflicts return 409.

ParameterInRequiredSchema
farm_idpathYes{"type":"string","format":"uuid"}
template_idpathYes{"type":"string","format":"uuid"}

Request body (application/json)

FieldTypePresenceConstraints
expected_metadata_revisionintegerRequiredminimum: 0

Create request.json with a JSON body matching the request schema above before running this example.

Request example

bash example
curl --fail-with-body -X PUT \
  'https://api.ranch.bot/v1/farm/<farm_id>/workflow-templates/<template_id>/default' \
  -H "Authorization: Bearer $RANCHBOT_TOKEN" \
  -H "Content-Type: application/json" \
  --data-binary @request.json

Responses

StatusMeaningContent type
200Successapplication/json
400Request validation failed.application/json
401Missing/invalid authentication or insufficient farm role.application/json
403Missing required scope or credential type is disallowed.application/json
404Resource or active farm membership not found.application/json
409Concurrent change, archived template, expired preview, or conflicting approval.application/json

200 response schema (application/json)

FieldTypePresenceConstraints
idstringRequiredformat: "uuid"
workflowstringRequired
namestringRequired
is_activebooleanRequired
is_defaultbooleanRequired
metadata_revisionintegerRequired
current_version (variant 1)nullOptional
current_version (variant 2)objectOptional
current_version (variant 2).idstringRequiredformat: "uuid"
current_version (variant 2).versionintegerRequired
current_version (variant 2).definitionobjectRequired
current_version (variant 2).definition.schema_versionintegerRequiredconst: 1
current_version (variant 2).definition.workflowstringRequiredconst: "record_birth"
current_version (variant 2).definition.namestringRequiredminLength: 1; maxLength: 80
current_version (variant 2).definition.fieldsarrayRequiredminItems: 1
current_version (variant 2).definition.fields[]objectRequired
current_version (variant 2).definition.fields[].keystringRequiredminLength: 1; maxLength: 80
current_version (variant 2).definition.fields[].scopestringRequiredenum: ["event","offspring"]
current_version (variant 2).definition.fields[].labelstringRequiredminLength: 1; maxLength: 80
current_version (variant 2).definition.fields[].requiredbooleanOptional
current_version (variant 2).definition.fields[].hiddenbooleanOptional
current_version (variant 2).definition.fields[].defaultobjectOptional
current_version (variant 2).definition.fields[].unitstringOptionalenum: ["kg","lb"]
current_version (variant 2).definition.fields[].typestringOptionalenum: ["text","number","boolean","date","choice"]
current_version (variant 2).definition.fields[].choicesarrayOptionalminItems: 1
current_version (variant 2).definition.fields[].choices[]objectRequired
current_version (variant 2).definition.fields[].choices[].keystringRequired
current_version (variant 2).definition.fields[].choices[].labelstringRequired
current_version (variant 2).created_atstringOptionalformat: "date-time"
versionsarrayOptional
versions[]objectRequired
created_atstringOptionalformat: "date-time"
updated_atstringOptionalformat: "date-time"

Error body

Validation and authentication errors generally use this envelope. Rate-limit errors omit data; OAuth polling also has protocol-specific errors shown in its reference.

json example
{
  "success": false,
  "errors": [
    {
      "code": 400,
      "name": "ValidationError",
      "message": "Example validation failure"
    }
  ]
}