All docs

Skills (LLM + API)

Create, manage, validate, and execute reusable LLM and API skills in your graph8 workspace

Skills are reusable building blocks — either an LLM prompt template or an HTTP API wrapper — that workflows compose into multi-step automation runs. Single-brace {variable} placeholders are interpolated at execution time; double-brace {{...}} patterns are ignored.


List Skills

GET /skills

Returns skills in your workspace, filtered by the query parameters below.

Query Parameters

ParameterTypeDefaultDescription
runtime_typestringFilter by runtime: llm or api
enabledbooleanFilter by enabled state
categorystringFilter by category
object_typestringFilter by associated object: Company, Contact, Deal, or Campaign
include_systembooleanfalseWhen true, includes system-managed skills

Example

cURL

curl "https://be.graph8.com/api/v1/skills?runtime_type=llm&enabled=true" \
  -H "Authorization: Bearer $API_KEY"

Get Skill

GET /skills/{action_id}

Returns the full skill record, including llm_config (for LLM skills) or api_config (for API skills).

Path Parameters

ParameterTypeDescription
action_idstringSkill (action) UUID

Example

cURL

curl "https://be.graph8.com/api/v1/skills/sk_uuid" \
  -H "Authorization: Bearer $API_KEY"

Get Skill Variables

GET /skills/{action_id}/variables

Extracts the input variable names from a skill’s prompt or API template. Only single-brace {var} references are returned; {{...}} patterns are ignored.

Path Parameters

ParameterTypeDescription
action_idstringSkill (action) UUID

Response

{
  "action_id": "sk_uuid",
  "runtime_type": "llm",
  "variables": ["name", "company"],
  "total": 2
}

List Models

GET /skills/models

Returns the LLM models available for use in LLM skills.

Example

cURL

curl "https://be.graph8.com/api/v1/skills/models" \
  -H "Authorization: Bearer $API_KEY"

Response

{
  "models": [
    { "id": "gpt-4o", "provider": "openai", "label": "GPT-4o" },
    { "id": "claude-sonnet-4-5", "provider": "anthropic", "label": "..." }
  ],
  "total": 9
}

List Templates

GET /skills/templates

Returns built-in skill templates filtered to llm and api runtimes only.

Query Parameters

ParameterTypeDefaultDescription
categorystringOptional. Filter templates by category

Example

cURL

curl "https://be.graph8.com/api/v1/skills/templates" \
  -H "Authorization: Bearer $API_KEY"

Response

{
  "actions": [
    { "id": "tpl_uuid", "name": "Summarize meeting", "runtime_type": "llm", "category": "summarization" }
  ],
  "total_count": 1
}

Create Skill

POST /skills201 Created

Creates a new skill. The required fields differ by runtime_type.

Request Body

FieldTypeRequiredDescription
namestringYesDisplay name for the skill
descriptionstringNoOptional description
runtime_typestringYesllm or api
object_typestringNoAssociated object: Company, Contact, Deal, Campaign, etc.
categorystringNoCategory label
requires_approvalbooleanNoWhether execution requires approval (default false)
approval_typestringNoApproval flow type (nullable)
knowledge_scopestringNoKnowledge scope (nullable)
llm_configobjectYes when runtime_type=llmLLM configuration (see below)
api_configobjectYes when runtime_type=apiAPI configuration (see below)

llm_config fields

FieldTypeDescription
modelstringLLM model ID (e.g. claude-sonnet-4-5)
prompt_templatestringPrompt with {variable} placeholders
temperaturenumberSampling temperature

api_config fields

FieldTypeDescription
endpointstringURL with optional {variable} placeholders
methodstringHTTP method (e.g. GET, POST)
headersobjectRequest headers; values may contain {variable} placeholders
query_paramsobjectQuery parameters
body_templatestringRequest body template with {variable} placeholders

Example — LLM skill

cURL

curl -X POST "https://be.graph8.com/api/v1/skills" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Summarize meeting",
    "description": "Summarize a meeting transcript into key points",
    "runtime_type": "llm",
    "object_type": "Meeting",
    "requires_approval": false,
    "llm_config": {
      "model": "claude-sonnet-4-5",
      "prompt_template": "Summarize: {transcript}",
      "temperature": 0.2
    }
  }'

Example — API skill

cURL

curl -X POST "https://be.graph8.com/api/v1/skills" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Lookup zip",
    "runtime_type": "api",
    "api_config": {
      "endpoint": "https://api.example.com/zip/{zip}",
      "method": "GET",
      "headers": { "Authorization": "Bearer {api_key}" },
      "query_params": {},
      "body_template": ""
    }
  }'

Update Skill

PUT /skills/{action_id}

Partial update. Supply only the fields you want to change. The runtime_type field is silently dropped server-side — you cannot change a skill’s runtime after creation.

Path Parameters

ParameterTypeDescription
action_idstringSkill (action) UUID

Example

cURL

curl -X PUT "https://be.graph8.com/api/v1/skills/sk_uuid" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Summarize meeting v2",
    "llm_config": { "temperature": 0.1 }
  }'

Validate Skill

POST /skills/validate

Validates a prompt template string or a full skill definition without saving. Returns extracted variables and any warnings.

Request Body

Two accepted shapes:

Template string validation:

{ "template": "Hello {name}" }

Full definition validation:

{ "runtime_type": "llm", "llm_config": { "model": "claude-sonnet-4-5", "prompt_template": "Hello {name}", "temperature": 0.2 } }

Example

cURL

curl -X POST "https://be.graph8.com/api/v1/skills/validate" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "template": "Hello {name}" }'

Response

{
  "valid": true,
  "variables": ["name"],
  "variable_count": 1,
  "warnings": []
}

Create Skill from Template

POST /skills/from-template201 Created

Creates a new skill from a built-in template, with optional overrides.

Request Body

FieldTypeRequiredDescription
template_idstringYesUUID of the built-in template
namestringYesDisplay name for the new skill
overridesobjectNoFields to override from the template defaults

Example

cURL

curl -X POST "https://be.graph8.com/api/v1/skills/from-template" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "template_id": "tpl_uuid",
    "name": "My Skill",
    "overrides": { "llm_config": { "temperature": 0.5 } }
  }'

Create Skill from Workflow Node

POST /skills/from-node201 Created

Lifts an existing workflow action node into a standalone reusable skill. The source node must be of type action.

Request Body

FieldTypeRequiredDescription
workflow_idstringYesUUID of the source workflow
node_idstringYesNode ID within the workflow — must be an action node
namestringNoDisplay name for the new skill. Defaults to "<source node name> (Copy)"

Example

cURL

curl -X POST "https://be.graph8.com/api/v1/skills/from-node" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "workflow_id": "wf_uuid",
    "node_id": "n1",
    "name": "Draft reply skill"
  }'

Execute Skill

POST /skills/{action_id}/execute

Runs the skill with the provided input data. Use for testing and preview; production execution happens inside workflow runs.

Path Parameters

ParameterTypeDescription
action_idstringSkill (action) UUID

Request Body

FieldTypeRequiredDescription
input_dataobjectNoKey-value pairs for {variable} placeholders in the skill
triggered_bystringNoUser identifier. Defaults to the API key owner
trigger_typestringNoTrigger context. Defaults to "manual"

Example

cURL

curl -X POST "https://be.graph8.com/api/v1/skills/sk_uuid/execute" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "input_data": { "name": "Jane" },
    "triggered_by": "user_x",
    "trigger_type": "manual"
  }'
Build with graph8