For the complete documentation index, see llms.txt. This page is also available as Markdown.

Skills

Configure LLM-backed micro-agent capabilities with system prompts, schemas, and tool access.

Skills are companion agent capabilities. They are LLM-backed micro-agents that execute specific tasks within a conversation. Unlike Classic API tools (which run versioned code packages), skills are configured declaratively with a system prompt, input/output schema, and model selection.

Different from Classic API Tools. Classic API Tools are versioned code packages from Git repos. Platform API Skills are LLM-backed declarative micro-agents with prompt-based configuration. Choose Tools for custom code execution, Skills for LLM-native reasoning.

API Surface

Create a Skill

Create a skill

post

Create a new companion agent skill in a workspace. Requires Skill.create permission.

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
Body
slugstring · min: 2 · max: 63RequiredPattern: ^[a-z0-9][a-z0-9_-]*[a-z0-9]$
namestring · min: 1 · max: 256Required
descriptionstring · max: 2000Required
system_promptstring · max: 10000 · nullableOptional
modelstring · min: 1 · max: 128OptionalDefault: claude-sonnet-5-5
max_tokensinteger · min: 1 · max: 200000OptionalDefault: 4096
max_result_charsinteger · min: 1 · max: 200000OptionalDefault: 2000
max_input_tokensinteger · min: 1 · max: 2000000 · nullableOptional
timeout_snumber · min: 0.1 · max: 900OptionalDefault: 60
thinking_effortstring · enum · nullableOptionalPossible values:
temperaturenumber · max: 1 · nullableOptional

Anthropic sampling temperature (0-1). Ignored on models that reject sampling params (Opus 4.7+/Fable, which 400 otherwise). Set at most one of temperature/top_p -- Claude 4+ rejects both; the runtime keeps temperature and drops top_p.

top_pnumber · max: 1 · nullableOptional

Anthropic nucleus sampling (0-1). Ignored on sampling-param-rejecting models; see temperature.

enable_cachingbooleanOptionalDefault: true
enable_citationsbooleanOptionalDefault: false
use_structured_outputbooleanOptionalDefault: false
enabledbooleanOptionalDefault: true
max_agent_turnsinteger · min: 1 · max: 200OptionalDefault: 20
checkpoint_enabledbooleanOptionalDefault: true
approval_requiredbooleanOptionalDefault: false
write_kindstring · enum · nullableOptional

What this skill's writes do, for its sub-tool calls to an endpoint whose kind varies (one generic GraphQL endpoint that books, cancels and reads). Sub-tool endpoints with their own kind write that kind whatever the skill says. Leave unset when unknown.

Possible values:
Responses
201

Successful Response

application/json
idstring · uuidRequired
workspace_idstring · uuidRequired
slugstringRequired
namestringRequired
descriptionstringRequired
system_promptstringRequired
modelstringRequired
max_tokensintegerRequired
max_result_charsintegerRequired
max_input_tokensinteger · nullableRequired
timeout_snumberRequired
thinking_effortstring · enum · nullableRequiredPossible values:
temperaturenumber · nullableRequired
top_pnumber · nullableRequired
enable_cachingbooleanRequired
enable_citationsbooleanRequired
use_structured_outputbooleanRequired
enabledbooleanRequired
max_agent_turnsintegerRequired
checkpoint_enabledbooleanRequired
approval_requiredbooleanRequired
write_kindstring · enum · nullableRequired

What this skill's writes do through an endpoint whose kind varies. Null when undeclared.

Possible values:
created_atstring · date-timeRequired
updated_atstring · date-timeRequired
post/v1/{workspace_id}/skills
POST /v1/{workspace_id}/skills HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 755

{
  "slug": "text",
  "name": "text",
  "description": "text",
  "system_prompt": "text",
  "input_schema": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "result_schema": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "model": "claude-sonnet-5-5",
  "max_tokens": 4096,
  "max_result_chars": 2000,
  "max_input_tokens": 1,
  "timeout_s": 60,
  "thinking_effort": "low",
  "temperature": 1,
  "top_p": 1,
  "enable_caching": true,
  "enable_citations": false,
  "use_structured_output": false,
  "integration_tools": [
    {
      "integration": "text",
      "endpoint": "text",
      "skill_input_bindings": {
        "ANY_ADDITIONAL_PROPERTY": "text"
      }
    }
  ],
  "static_tools": [
    {
      "name": "text",
      "description": "text",
      "input_schema": {
        "ANY_ADDITIONAL_PROPERTY": "anything"
      }
    }
  ],
  "enabled": true,
  "max_agent_turns": 20,
  "checkpoint_enabled": true,
  "approval_required": false,
  "write_kind": "booking"
}
{
  "id": "123e4567-e89b-12d3-a456-426614174000",
  "workspace_id": "123e4567-e89b-12d3-a456-426614174000",
  "slug": "text",
  "name": "text",
  "description": "text",
  "system_prompt": "text",
  "input_schema": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "result_schema": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "model": "text",
  "max_tokens": 1,
  "max_result_chars": 1,
  "max_input_tokens": 1,
  "timeout_s": 1,
  "thinking_effort": "low",
  "temperature": 1,
  "top_p": 1,
  "enable_caching": true,
  "enable_citations": true,
  "use_structured_output": true,
  "integration_tools": [
    {
      "integration": "text",
      "endpoint": "text",
      "skill_input_bindings": {
        "ANY_ADDITIONAL_PROPERTY": "text"
      }
    }
  ],
  "static_tools": [
    {
      "name": "text",
      "description": "text",
      "input_schema": {
        "ANY_ADDITIONAL_PROPERTY": "anything"
      }
    }
  ],
  "enabled": true,
  "max_agent_turns": 1,
  "checkpoint_enabled": true,
  "approval_required": true,
  "write_kind": "booking",
  "created_at": "2026-01-01T00:00:00.000Z",
  "updated_at": "2026-01-01T00:00:00.000Z"
}

List Skills

List skills

get

List skills for a workspace with pagination. Optionally filter by enabled status. Requires Skill.view permission.

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
Query parameters
sort_bystring[]OptionalDefault: []
enabledboolean · nullableOptional
searchstring · min: 1 · max: 200 · nullableOptional
limitinteger · max: 200OptionalDefault: 50
continuation_tokenanyOptional
Responses
200

Successful Response

application/json
has_morebooleanRequired
continuation_tokenanyOptional
get/v1/{workspace_id}/skills
GET /v1/{workspace_id}/skills HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "items": [
    {
      "id": "123e4567-e89b-12d3-a456-426614174000",
      "workspace_id": "123e4567-e89b-12d3-a456-426614174000",
      "slug": "text",
      "name": "text",
      "description": "text",
      "system_prompt": "text",
      "input_schema": {
        "ANY_ADDITIONAL_PROPERTY": "anything"
      },
      "result_schema": {
        "ANY_ADDITIONAL_PROPERTY": "anything"
      },
      "model": "text",
      "max_tokens": 1,
      "max_result_chars": 1,
      "max_input_tokens": 1,
      "timeout_s": 1,
      "thinking_effort": "low",
      "temperature": 1,
      "top_p": 1,
      "enable_caching": true,
      "enable_citations": true,
      "use_structured_output": true,
      "integration_tools": [
        {
          "integration": "text",
          "endpoint": "text",
          "skill_input_bindings": {
            "ANY_ADDITIONAL_PROPERTY": "text"
          }
        }
      ],
      "static_tools": [
        {
          "name": "text",
          "description": "text",
          "input_schema": {
            "ANY_ADDITIONAL_PROPERTY": "anything"
          }
        }
      ],
      "enabled": true,
      "max_agent_turns": 1,
      "checkpoint_enabled": true,
      "approval_required": true,
      "write_kind": "booking",
      "created_at": "2026-01-01T00:00:00.000Z",
      "updated_at": "2026-01-01T00:00:00.000Z"
    }
  ],
  "has_more": true,
  "continuation_token": null
}

Get a Skill

Get a skill

get

Retrieve a skill by ID. Requires Skill.view permission.

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
skill_idstring · uuidRequired
Responses
200

Successful Response

application/json
idstring · uuidRequired
workspace_idstring · uuidRequired
slugstringRequired
namestringRequired
descriptionstringRequired
system_promptstringRequired
modelstringRequired
max_tokensintegerRequired
max_result_charsintegerRequired
max_input_tokensinteger · nullableRequired
timeout_snumberRequired
thinking_effortstring · enum · nullableRequiredPossible values:
temperaturenumber · nullableRequired
top_pnumber · nullableRequired
enable_cachingbooleanRequired
enable_citationsbooleanRequired
use_structured_outputbooleanRequired
enabledbooleanRequired
max_agent_turnsintegerRequired
checkpoint_enabledbooleanRequired
approval_requiredbooleanRequired
write_kindstring · enum · nullableRequired

What this skill's writes do through an endpoint whose kind varies. Null when undeclared.

Possible values:
created_atstring · date-timeRequired
updated_atstring · date-timeRequired
get/v1/{workspace_id}/skills/{skill_id}
GET /v1/{workspace_id}/skills/{skill_id} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "id": "123e4567-e89b-12d3-a456-426614174000",
  "workspace_id": "123e4567-e89b-12d3-a456-426614174000",
  "slug": "text",
  "name": "text",
  "description": "text",
  "system_prompt": "text",
  "input_schema": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "result_schema": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "model": "text",
  "max_tokens": 1,
  "max_result_chars": 1,
  "max_input_tokens": 1,
  "timeout_s": 1,
  "thinking_effort": "low",
  "temperature": 1,
  "top_p": 1,
  "enable_caching": true,
  "enable_citations": true,
  "use_structured_output": true,
  "integration_tools": [
    {
      "integration": "text",
      "endpoint": "text",
      "skill_input_bindings": {
        "ANY_ADDITIONAL_PROPERTY": "text"
      }
    }
  ],
  "static_tools": [
    {
      "name": "text",
      "description": "text",
      "input_schema": {
        "ANY_ADDITIONAL_PROPERTY": "anything"
      }
    }
  ],
  "enabled": true,
  "max_agent_turns": 1,
  "checkpoint_enabled": true,
  "approval_required": true,
  "write_kind": "booking",
  "created_at": "2026-01-01T00:00:00.000Z",
  "updated_at": "2026-01-01T00:00:00.000Z"
}

Update a Skill

Update a skill

put

Update a skill's configuration in place.

Field semantics. Omitted fields and explicit null are treated identically — both leave the existing value unchanged. Empty-string is rejected with 422 for fields that carry a minLength bound (model). Clearing a previously-set optional value back to null is not currently supported via PUT.

Requires Skill.update permission.

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
skill_idstring · uuidRequired
Body
namestring · min: 1 · max: 256 · nullableOptional
descriptionstring · max: 2000 · nullableOptional
system_promptstring · max: 10000 · nullableOptional
modelstring · min: 1 · max: 128 · nullableOptional
max_tokensinteger · min: 1 · max: 200000 · nullableOptional
max_result_charsinteger · min: 1 · max: 200000 · nullableOptional
max_input_tokensinteger · min: 1 · max: 2000000 · nullableOptional
timeout_snumber · min: 0.1 · max: 900 · nullableOptional
thinking_effortstring · enum · nullableOptionalPossible values:
temperaturenumber · max: 1 · nullableOptional

Anthropic sampling temperature (0-1); see CreateSkillRequest. null/absent leaves it unchanged.

top_pnumber · max: 1 · nullableOptional

Anthropic nucleus sampling (0-1); see CreateSkillRequest. null/absent leaves it unchanged.

enable_cachingboolean · nullableOptional
enable_citationsboolean · nullableOptional
use_structured_outputboolean · nullableOptional
enabledboolean · nullableOptional
max_agent_turnsinteger · min: 1 · max: 200 · nullableOptional
checkpoint_enabledboolean · nullableOptional
approval_requiredboolean · nullableOptional
write_kindstring · enum · nullableOptional

What this skill's writes do; see CreateSkillRequest. null/absent leaves it unchanged.

Possible values:
Responses
200

Successful Response

application/json
idstring · uuidRequired
workspace_idstring · uuidRequired
slugstringRequired
namestringRequired
descriptionstringRequired
system_promptstringRequired
modelstringRequired
max_tokensintegerRequired
max_result_charsintegerRequired
max_input_tokensinteger · nullableRequired
timeout_snumberRequired
thinking_effortstring · enum · nullableRequiredPossible values:
temperaturenumber · nullableRequired
top_pnumber · nullableRequired
enable_cachingbooleanRequired
enable_citationsbooleanRequired
use_structured_outputbooleanRequired
enabledbooleanRequired
max_agent_turnsintegerRequired
checkpoint_enabledbooleanRequired
approval_requiredbooleanRequired
write_kindstring · enum · nullableRequired

What this skill's writes do through an endpoint whose kind varies. Null when undeclared.

Possible values:
created_atstring · date-timeRequired
updated_atstring · date-timeRequired
put/v1/{workspace_id}/skills/{skill_id}
PUT /v1/{workspace_id}/skills/{skill_id} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 717

{
  "name": "text",
  "description": "text",
  "system_prompt": "text",
  "input_schema": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "result_schema": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "model": "text",
  "max_tokens": 1,
  "max_result_chars": 1,
  "max_input_tokens": 1,
  "timeout_s": 1,
  "thinking_effort": "low",
  "temperature": 1,
  "top_p": 1,
  "enable_caching": true,
  "enable_citations": true,
  "use_structured_output": true,
  "integration_tools": [
    {
      "integration": "text",
      "endpoint": "text",
      "skill_input_bindings": {
        "ANY_ADDITIONAL_PROPERTY": "text"
      }
    }
  ],
  "static_tools": [
    {
      "name": "text",
      "description": "text",
      "input_schema": {
        "ANY_ADDITIONAL_PROPERTY": "anything"
      }
    }
  ],
  "enabled": true,
  "max_agent_turns": 1,
  "checkpoint_enabled": true,
  "approval_required": true,
  "write_kind": "booking"
}
{
  "id": "123e4567-e89b-12d3-a456-426614174000",
  "workspace_id": "123e4567-e89b-12d3-a456-426614174000",
  "slug": "text",
  "name": "text",
  "description": "text",
  "system_prompt": "text",
  "input_schema": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "result_schema": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "model": "text",
  "max_tokens": 1,
  "max_result_chars": 1,
  "max_input_tokens": 1,
  "timeout_s": 1,
  "thinking_effort": "low",
  "temperature": 1,
  "top_p": 1,
  "enable_caching": true,
  "enable_citations": true,
  "use_structured_output": true,
  "integration_tools": [
    {
      "integration": "text",
      "endpoint": "text",
      "skill_input_bindings": {
        "ANY_ADDITIONAL_PROPERTY": "text"
      }
    }
  ],
  "static_tools": [
    {
      "name": "text",
      "description": "text",
      "input_schema": {
        "ANY_ADDITIONAL_PROPERTY": "anything"
      }
    }
  ],
  "enabled": true,
  "max_agent_turns": 1,
  "checkpoint_enabled": true,
  "approval_required": true,
  "write_kind": "booking",
  "created_at": "2026-01-01T00:00:00.000Z",
  "updated_at": "2026-01-01T00:00:00.000Z"
}

Delete a Skill

Delete a skill

delete

Delete a skill.

Not idempotent. A second concurrent caller racing the same delete will receive 404 Not Found once the row is gone — clients should treat 404 as success-equivalent for cleanup workflows. Requires Skill.delete permission.

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
skill_idstring · uuidRequired
Responses
204

Successful Response

No content

delete/v1/{workspace_id}/skills/{skill_id}
DELETE /v1/{workspace_id}/skills/{skill_id} HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*

No content

Get Skill References

Get skill references

get

Find all HSMs and services that reference this skill's slug in their latest version's tool_call_specs. Requires Skill.view permission.

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
skill_idstring · uuidRequired
Responses
200

Successful Response

application/json
skill_idstring · uuidRequired
skill_slugstringRequired
service_referencesstring · uuid[]Required
get/v1/{workspace_id}/skills/{skill_id}/references
GET /v1/{workspace_id}/skills/{skill_id}/references HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "skill_id": "123e4567-e89b-12d3-a456-426614174000",
  "skill_slug": "text",
  "context_graph_references": [
    {
      "context_graph_id": "123e4567-e89b-12d3-a456-426614174000",
      "context_graph_name": "text",
      "version": 1,
      "states": [
        {
          "state_name": "text",
          "tool_spec_category": "text"
        }
      ]
    }
  ],
  "service_references": [
    "123e4567-e89b-12d3-a456-426614174000"
  ]
}

Test a Skill

Test a skill

post

Execute a skill in isolation with the given input.

Authorizations
AuthorizationstringRequired

API key issued via POST /v1/{workspace_id}/api-keys. Pass the returned api_key value as a Bearer token.

Path parameters
workspace_idstring · uuidRequired
skill_idstring · uuidRequired
Body
Responses
200

Successful Response

application/json
resultstringRequired

Final result text produced by the skill

duration_msnumberRequired

Total execution time in milliseconds

input_tokensintegerRequired

Number of input tokens consumed

output_tokensintegerRequired

Number of output tokens generated

cached_tokensintegerRequired

Number of tokens served from cache

roundsintegerRequired

Number of agent reasoning rounds executed

errorstring · nullableOptional

Error message if the skill execution failed

post/v1/{workspace_id}/skills/{skill_id}/test
POST /v1/{workspace_id}/skills/{skill_id}/test HTTP/1.1
Host: platform.api-us.concurrence.com
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 103

{
  "input": {
    "ANY_ADDITIONAL_PROPERTY": "anything"
  },
  "static_tool_mocks": {
    "ANY_ADDITIONAL_PROPERTY": "text"
  }
}
{
  "result": "text",
  "duration_ms": 1,
  "input_tokens": 1,
  "output_tokens": 1,
  "cached_tokens": 1,
  "rounds": 1,
  "sub_tool_logs": [
    {
      "tool_name": "text",
      "input": {
        "ANY_ADDITIONAL_PROPERTY": "anything"
      },
      "output": "text",
      "duration_ms": 1,
      "succeeded": true,
      "round": 1
    }
  ],
  "error": "text"
}

Input Schema Compatibility

A skill input_schema is used as an LLM tool schema during execution. Keep it in the supported tool-schema subset:

  • The root schema must describe a single JSON object.

  • Do not use a top-level $ref, anyOf, oneOf, or allOf.

  • Array-typed properties must declare items.

Unsupported shapes are rejected on create/update with 422 because they can cause the LLM tool call to fail silently at runtime.

Execution Configuration

Skills execute as multi-turn LLM agents. Configure their model, token and result limits, timeout, sampling controls, structured output, caching, approval requirement, and maximum tool-use turns through the request schema embedded above. Sampling controls are model-gated; models that do not support them ignore those fields.

A skill model must be a Claude model id. A retired Claude id runs on the current model of its tier, in conversations and in the standalone skill tester: claude-sonnet-5 and claude-sonnet-4-6 run on claude-sonnet-5-5, claude-opus-4-8 on claude-opus-5-5, and claude-haiku-4-5 on claude-haiku-5-5. The stored id is not rewritten and is what skill reads return. A skill created without a model stores claude-sonnet-5-5. Pin a current id to make the configuration match what runs.

A skill whose last round stops at the token limit or on a model refusal without producing text returns a failed result rather than an empty successful one.

The schema still accepts and returns enable_citations and checkpoint_enabled, but the runtime does not read either field. Setting them has no effect on execution.

Integration with External APIs

Skills can call external APIs through Integrations and inline static tool definitions. Integration tool references identify the integration and endpoint by name.

Bind Skill Inputs to Integration Tools

A Context Graph state can fill a skill’s input using context_bindings or context_binding_aliases; see Pass Context to Tool Parameters. On voice calls, a skill input bound to a declared context key that the call did not start with is refused; see Set Context on a Live Voice Call. The skill’s integration tool reference can then map its inputs into endpoint parameters:

This is an integration_tools entry, not a complete skill request. Both the target endpoint parameter and source skill input must be declared in their respective input schemas. Create/update rejects references to undeclared fields. The runtime hides the target from the companion model and injects the parent skill input when the sub-tool executes. Missing source input prevents that sub-tool call; a model argument cannot substitute for it. The standalone skill tester also applies this mapping, but its parent input must be supplied by the test request.

An integration endpoint can route that parameter into an HTTP header with an exact binding such as "X-Region": "$param.region_header" in its headers configuration. The value must be a non-null scalar without line breaks. Missing or invalid values fail before an outbound request. A consumed header parameter is excluded from the ordinary query/body parameters. Static header values remain supported; this is an exact binding, not arbitrary string interpolation.

Use verified identity bindings for identity-derived authentication. Caller-supplied skill or conversation input is not an access-control credential, and header routing does not make that input trusted.

References

Before modifying or deleting a skill, check what depends on it:

The references operation returns context graphs (with specific states) and services that reference the skill's slug. This prevents breaking live conversation flows by accidentally removing a skill that is in use.

Testing

Use the tool testing endpoints to execute a skill in isolation without starting a conversation. Useful for validating prompt engineering and schema design before wiring into a context graph.

Last updated

Was this helpful?