Every API request must include a Bearer token in the Authorization header.
Authorization: Bearer <access_token>
If the token is missing or invalid, 401 Unauthorized is returned. Some endpoints require additional scopes; if a required scope is missing, 403 Forbidden is returned.
The skill version list (GET /v1/skills/:skillId/versions) does not support pagination. It returns up to 100 versions, newest first, and hasMore is always false.
The APIs on this page handle requests as follows. See each endpoint's description and error responses for endpoint-specific handling.
Query parameters and body fields that are not in the specification are ignored. However, a field that the service accepts but this page does not document may still return 400 Bad Request if its type or value is invalid.
An invalid value for a documented query parameter returns 400 Bad Request.
A malformed JSON body returns 400 Bad Request (invalid_body).
Sending a body with a Content-Type other than application/json to an endpoint that accepts a JSON body returns 415 Unsupported Media Type (unsupported_media_type). File uploads return 415 for a body other than multipart/form-data. However, if reading the body fails first with 400 (malformed JSON) or 413 (over the size limit), that error is returned instead.
A body field of the wrong type returns 400 Bad Request.
Responses include an x-request-id header. The service assigns this value, and a value sent in the request is not used. When you contact support, please tell us this value.
Array of message objects. At least one user-role message is required. Even if multiple user messages are included, only the last one is processed. Conversation history is managed on the server side, so you do not need to send past exchanges in the messages array. To continue an existing conversation, specify the previous conversation ID in the conversationId parameter.
stream
boolean
必須
Specify true. Currently, only streaming mode is supported.
conversationId
string
—
Specify a conversation ID to continue an existing conversation. If omitted, a new conversation is created.
"default" or "high_performance". Defaults to "default" when omitted.
agentMode
boolean
Enable/disable agent mode. Defaults to true when omitted.
privateMode
boolean
Enable/disable private mode. Defaults to false when omitted.
reportMode
string
"with" (default) or "without". Controls whether a work report is generated on completion.
personaKey
string
Persona (response personality) to apply. Specify a personaKey returned by `GET /v1/personas`. Omit to apply no persona.
playbookId
string
Playbook (predefined procedure) to apply. Specify a playbookId returned by `GET /v1/playbooks`. Omit to apply no playbook. Returns 400 if the ID does not exist or has been deactivated.
skillIds
array
Array of skill IDs to load into the agent (up to 10). Specify skillId values returned by `GET /v1/skills`. Returns 400 if 11 or more are specified. IDs that do not exist or are unavailable are ignored, and execution continues with the remaining skills.
outputFormat
string
Response text format. "plain" (default) returns plain text with Markdown removed (diagrams dropped, code block bodies kept). "markdown" preserves Markdown as-is.
Use "user". "assistant" / "system" are accepted but only "user" is effectively used as the starting point of the agent turn in the current implementation
content
string | array
必須
The message content. A string, or an array of content parts (text / input_file). The text to be processed must be 1 MB or less in UTF-8.
2. data: {"choices":[{"delta":{"content":"..."}}]} × N
3. data: {"choices":[{"finishReason":"stop"}]}
4. data: [DONE]
Responses are delivered via SSE (Server-Sent Events) streaming. Each chunk is in OpenAI-compatible ChatCompletionChunk format. For details on the connection lifecycle, response objects, agent extension fields, and error handling, see the Streaming Guide.
Errors before the SSE stream starts are returned in JSON format. Errors during the stream are delivered as SSE chunks.
Status
Description
400
Invalid request parameters (missing or malformed model / messages / stream / conversationId / role / content, or more than 20 input_file parts in a single request, or reportMode other than "with" / "without"). A malformed JSON body (code: "invalid_body"). Or the specified conversationId is archived (code: "conversation_archived")
415
The body Content-Type is not application/json (code: "unsupported_media_type")
403
Missing chat:exec scope
404
The specified input_file fileId or filepath is not found
409
The specified conversation is currently being processed
GET/v1/chat/completions/:conversationId
Reconnect to the SSE stream of a conversation in progress. Use this when the agent is processing a long-running task or to recover after a network disconnection.
Reconnects to the SSE stream. The response format is the same as POST /v1/chat/completions. The response headers include X-Conversation-Id and X-Message-Id. For detailed reconnection procedures, see the Streaming Guide.
Invalid conversationId, messageId is not a string, the body is malformed JSON or not a JSON object (code: "invalid_body"), or the conversation is archived (code: "conversation_archived")
415
The body Content-Type is not application/json (code: "unsupported_media_type")
Conversations retrieved with mode=archive only support read operations (list / message history) and restoration. The following operations return a 400 error (code: "conversation_archived").
Operation
Behavior on archived conversations
GET /v1/conversations?mode=archive
✅ Allowed
GET /v1/conversations/:id/messages
✅ Allowed (messages[].archived: true is added)
PATCH /v1/conversations/:id
❌ 400 Archived conversations cannot be modified
DELETE /v1/conversations/:id
❌ 400 Archived conversations cannot be deleted via this endpoint
POST /v1/chat/completions (continuing an existing conversation)
❌ 400 Cannot send messages to an archived conversation
POST /v1/chat/completions/:id/cancel
❌ 400 Cannot cancel an archived conversation
POST /v1/conversations/:id/restore
✅ Restore to active
GET/v1/conversations
List conversations. Supports cursor-based pagination.
Cursor for fetching the next page (cursor value from the previous response)
order
string
"desc"
"asc" or "desc"
title
string
—
Filter by title
mode
string
"active"
"active" (regular conversations) or "archive" (archived conversations). Switching mode queries a different data store, so cursor cannot be carried over
Whether archived. Always true when retrieved via mode=archive. When mode=active returns this field as true, it is only because the conversation remained in archive state but was returned by the active list — usually omitted
hasMore
boolean
Whether the next page exists
cursor
string
Cursor for fetching the next page. Included only when hasMore is true
Invalid limit parameter (outside the range of 1-100), mode is not "active" / "archive", order is not "asc" / "desc", or title is not a string (for example, specified more than once)
403
Missing chat:history scope
GET/v1/conversations/:conversationId/messages
Retrieve the message history of a specified conversation. Cursor-based pagination is supported.
Array of artifacts generated by the agent. Included only when present
messages[].deliverables[].filename
string
Artifact file name
messages[].deliverables[].filepath
string
Artifact file path
messages[].deliverables[].source
string
"agent" (agent-generated) or "user" (user-uploaded)
messages[].deliverables[].isPrimary
boolean
Whether it is a primary artifact
messages[].deliverables[].createdAt
string
Creation date and time (ISO 8601 format)
messages[].deliverables[].mimeType
string?
MIME type (e.g., "application/pdf", "text/markdown"). Omitted when it cannot be determined
messages[].deliverables[].size
number?
File size (bytes). Omitted when 0 or below
messages[].files
array?
Array of user-uploaded files. Included only when present for messages with sender: "User"
messages[].files[].fileId
string
Unique identifier of the file (UUID)
messages[].files[].mimeType
string
MIME type (e.g., "image/png", "application/pdf")
messages[].files[].width
number?
Image width in pixels. Only for image files
messages[].files[].height
number?
Image height in pixels. Only for image files
messages[].archived
boolean?
true only for messages retrieved via archive. Added when viewing the message history of a conversation retrieved with GET /v1/conversations?mode=archive
hasMore
boolean
Whether a next page exists
cursor
string
Cursor for the next page. Included only when hasMore is true
Task execution result text. Omitted when not present
metadata
object?
Auxiliary information that varies by actionType (sub_event_type, url, filepath, etc.). See the Streaming Guide for details
files
array?
Files related to the task (filename / size / filepath / mimeType?. mimeType is omitted when it cannot be determined). The array itself is omitted when there are no related files
When the agent produced a UI (a chart, a map, a card list, etc.) during execution, its metadata is included in metadata.uiResource of the corresponding task. The HTML itself is not included. Retrieve it with the UI resource endpoint.
The object has the same structure as in SSE. For field details, see Streaming Guide — delta.uiResource. The alternative text is in content of the same task (in SSE it is delta.content of the same chunk).
Contents of metadata
Meaning
uiResource only
Display-only UI. No user reply is expected.
uiResource + interaction_type
UI that asks for a reply. interaction_type is "choice" or "question". This combination occurs only with origin: "first-party".
interaction_type only
A reply is requested but no UI is included. interaction_type is "choice" | "confirmation" | "question". The reply instructions are in content of the same task.
options
Array of choices (up to 10, each up to 200 characters). May be present independently of whether interaction_type is set.
Discrimination differs from SSE
In SSE, delta.uiResource (display-only) and delta.interaction.uiResource (input) are separated structurally. In history and search, both are placed in tasks[].metadata.uiResource. Use the presence of metadata.interaction_type to tell them apart.
JSON
{ "status":"completed", "content":"Sales have grown for three consecutive quarters.", "metadata":{ "uiResource":{ "type":"html", "origin":"first-party", "altText":"Sales have grown for three consecutive quarters.", "uri":"ui://widget/chart", "server_name":"agentic-star-widgets", "tool_name":"widget_chart", "tool_call_id":"chart-7f3a2b1c9e4d5a6b7c8d9e0f1a2b3c4d", "mime_type":"text/html;profile=mcp-app" } }, "timestamp":1788007347240 }
size is not included in history and search responses.
Safely ignore unknown fields
Future implementations may add new fields to actionType / metadata. Client implementations should safely ignore any fields not listed in this table. For detailed metadata structure, refer to the Streaming Guide — Task data model.
If limit is omitted, 50 items are returned. To fetch everything, keep following the cursor until hasMore becomes false.
Using the cursor
The cursor represents a position in the result set. Do not change order while you are following the same cursor — changing the conditions changes the target set and causes duplicated or skipped items.
Items may also be duplicated or skipped across pages if messages are added or removed while you are paging.
Retrieves the HTML of a UI resource. Pass the tool_call_id found in SSE delta.uiResource, in tasks[].metadata.uiResource of history and search, or in the A2A and MCP responses.
Only type: "html" resources are retrievable. type: "data" carries its payload inline in the original response, so there is no need to call this endpoint for it.
The response is JSON
This endpoint does not return the HTML with Content-Type: text/html. It is not meant to be opened directly in a browser for rendering — it is a retrieval point for your application to fetch the HTML.
One of chat:exec / a2a:all / mcp:all is required. The scope of the channel through which you received the UI resource is enough. chat:history is not accepted, so a client using only the history API needs one of the scopes above.
No such conversation, or it belongs to another user
No
404
file_too_large
The HTML exceeds 512KB and cannot be returned
No (permanent failure)
502
upstream_api_error
Temporary retrieval failure
Yes
500
internal_error
Other errors
Yes
Notes on rendering
This endpoint returns the HTML as a string, and rendering happens in your own application. For whether you need a sandbox and how it differs by origin, see Streaming Guide — Notes on rendering.
title is missing, empty, or exceeds 200 characters, the body is malformed JSON (code: "invalid_body"), or the conversation is archived (code: "conversation_archived")
415
The body Content-Type is not application/json (code: "unsupported_media_type")
Invalid conversationId, or the conversation is archived (code: "conversation_archived"; use POST /v1/conversations/:id/restore to restore it)
403
Missing chat:history scope
404
Conversation not found
409
Conversation cannot be deleted because it is currently being processed
POST/v1/conversations/:conversationId/restore
Restore an archived conversation back to active. After restoration, the conversation can be edited, continued, and deleted just like a regular conversation.
If limit is omitted, 50 items are returned. To fetch everything, keep following the cursor until hasMore becomes false.
Using the cursor
The cursor represents a position in the result set. Do not change order while you are following the same cursor — changing the conditions changes the target set and causes duplicated or skipped items.
Items may also be duplicated or skipped across pages if files are added or removed while you are paging.
Note: The Marketplace edition does not require scopes (authentication only).
GET/v1/files/proxy
Download an artifact file by specifying the path obtained from deliverables[].filepath in the message history.
Any one of chat:exec / a2a:all / mcp:all is sufficient. Artifacts obtained through an A2A artifact or an MCP tool response can be downloaded here with the scope of that same channel.
Lists the user's library files (uploaded files and artifacts generated by the agent) across conversations. A returned filepath can be used to attach a file via Chat input_file or to download it through the artifact endpoint (GET /v1/files/proxy).
These rules apply to the APIs that read, create, edit, delete, and copy Agents, Playbooks, and Skills.
Scopes: Reading requires assets:read; creating, editing, and copying require assets:write; deleting requires assets:delete. The skill and playbook lists can also be called with chat:exec.
System integration tokens cannot be used. Calling with one returns 403 Forbidden (forbidden).
What you can read: Your own resources and shared ones. Another user's private resource, or one that does not exist, returns 404 Not Found (agent_not_found, playbook_not_found, or skill_not_found).
Editing and deleting: Only your own resources (a system administrator can also delete playbooks and skills shared by other users). Another user's resource returns 404 Not Found. To change another user's resource, copy it to your own and change the copy. When deleting, 409 Conflict may be returned first even for playbooks and skills shared by other users if Agents use them. The same applies to playbooks used by schedules (see each API).
Editing: Send the digest from the get API as baseDigest. If another change was made after you got it, 409 Conflict (stale_base) is returned. Get it again and resend.
Creating and copying: Resending creates another one (except when copying a registered Agent of the Marketplace edition; see Copy Agent). If you did not receive a response, check whether it was created using the IDs and createdAt in the list before resending.
Body size limit: A JSON body can be up to 3 MiB. A larger body returns 413 Payload Too Large (body_too_large). For the skill APIs that send files, see the limit in each API.
The Agent APIs return 403 Forbidden (sso_required) for a token of a user who does not sign in with SSO.
Agents that are placed on project steps and run are handled as library resources. An Agent ID (agentId) is a different value from the placement ID assigned when the Agent is placed in a project.
Lists your Agents in descending order of last update (newest first). Supports cursor-based pagination. The list of shared Agents (GET /v1/agents/shared) uses the same query parameters and response.
Invalid limit (out of 1–100 range), cursor, or q (not a string, or longer than 100 characters) (code is invalid_parameter)
403
The assets:read scope is missing (code is insufficient_scope), called with a system integration token (code is forbidden), or the user does not sign in with SSO (code is sso_required)
GET/v1/agents/shared
Lists shared Agents (including those you shared yourself). The query parameters, response, and errors are the same as for listing your own Agents.
GET/v1/agents/:agentId
Gets an Agent. You can get your own Agents and shared Agents.
Kind of runtime. "autonomous", or "marketplace" for a registered Agent of the Marketplace edition
marketplaceAgentId
string | null
ID of the registered Agent in the Marketplace edition. null otherwise
spec
object
Definition of the Agent
spec.goal
string | null
Goal (instructions)
spec.guardrail
string | null
Guardrail
spec.skills
array
Skills to use
spec.skills[].skillId
string | null
Skill ID
spec.skills[].name
string | null
Skill name
spec.skills[].versionId
string | null
ID of the pinned skill version. null if not pinned, in which case the version at that time is always used
spec.playbookId
string | null
ID of the playbook to use
spec.inputFiles
array
Input files
spec.inputFiles[].type
string | null
Kind of input file. "blob" for library files. An Agent created from a scheduled job may have "git" or "upload"
spec.inputFiles[].filepath
string | null
File path. For "blob", the same form as the filepath from GET /v1/library. For "git" and "upload", the stored reference with a leading /, which is not a library path
spec.inputFiles[].filename
string | null
File name
spec.agentLevel
string | null
"default" or "high_performance"
spec.orgId
string | null
Code of the organization used at run time
spec.jobRole
string | null
Code of the job type used at run time
spec.agentConfig
object | null
Not used at present (even if it has a value, the value is not used)
spec.exposureConsent
object | null
Not used at present (even if it has a value, the value is not used)
projectCount
number | null
Number of projects where this Agent is placed (placements in deleted projects are also counted)
copyCount
number | null
Number of times it has been copied
createdAt
string | null
Creation time (ISO 8601)
updatedAt
string | null
Last update time (ISO 8601)
digest
string
Value to send as baseDigest when editing the Agent. It is made from the name, description, sharing, and definition, and does not change with the number of projects, the copy count, or timestamps
{ "agentId":"17be0242-a5d0-4db7-92e5-f97a05abae2b", "name":"Order intake", "description":"Creates order data from order emails", "ownerUserId":"bbbe4306-6975-420b-af47-fb4c8f48b4aa", "isShared":false, "runtimeKind":"autonomous", "marketplaceAgentId":null, "spec":{ "goal":"Create an order table from the order emails received.", "guardrail":"Do not send anything to external services.", "skills":[ {"skillId":"cb62d540-5439-4748-99f0-961b8de91a78","name":"order-parser","versionId":null} ], "playbookId":"8af8d6be-2885-446d-9e36-ee9dcf1fe1ba", "inputFiles":[ {"type":"blob","filepath":"/path/to/orders-template.xlsx","filename":"orders-template.xlsx"} ], "agentLevel":"default", "orgId":null, "jobRole":null, "agentConfig":null, "exposureConsent":null }, "projectCount":1, "copyCount":0, "createdAt":"2026-09-20T02:10:00.000Z", "updatedAt":"2026-09-28T15:18:02.255Z", "digest":"6f1c2a9e0b7d…" }
The assets:read scope is missing (code is insufficient_scope), called with a system integration token (code is forbidden), or the user does not sign in with SSO (code is sso_required)
404
The Agent does not exist, or it is another user's private Agent (code is agent_not_found)
Goal (instructions). Up to 5000 characters. Cannot be only whitespace
spec.guardrail
string
—
Guardrail. Up to 5000 characters
spec.skills
array
—
Skills to use, in the form [{ skillId, versionId? }]: up to 10 of your own skills or shared skills (active ones). With versionId, that version is pinned; if omitted or null, the version at that time is always used. You can send the spec.skills from the get API as is (name is ignored). The same skill cannot be specified twice
spec.playbookId
string
—
ID of the playbook to use. Your own playbooks only
spec.inputFiles
array
—
Input files, in the form [{ type, filepath, filename? }]: up to 10. type is "blob" (a file in your library; filepath is the filepath from GET /v1/library). An Agent created from a scheduled job may have "git" or "upload", and the values from the get API can be sent as is. filepath cannot be empty after removing leading /. filename is a string of up to 255 characters, or null. At run time, only the files of the user who created the project are passed
spec.agentLevel
string
—
"default" or "high_performance"
spec.orgId
string
—
Code of the organization used at run time (up to 255 characters)
spec.jobRole
string
—
Code of the job type used at run time (up to 255 characters)
Sending null for description or for a field of spec other than goal is the same as omitting it (spec.skills and spec.inputFiles become empty).
spec.skillIds and spec.skillVersions are not accepted (sending them returns 400, invalid_parameter). Specify skills with spec.skills.
name or spec is missing, name, description, or isShared has the wrong type or length, name is only whitespace, spec is not an object, spec.playbookId is not a UUID, spec.skills has the wrong form (skillId or versionId is not a UUID, the same skill twice, and so on), or spec.skillIds or spec.skillVersions was sent
400
invalid_spec
spec.goal is missing or only whitespace, a string field in spec has the wrong type or length, spec.agentLevel is not an allowed value, spec.inputFiles has the wrong form (type other than "blob", "git", or "upload", an empty filepath, a filename over 255 characters, and so on), or more than 10 skills or input files
400
playbook_not_found
spec.playbookId is not one of your playbooks
400
skill_not_found
A skill in spec.skills is neither your own skill nor an active shared skill
400
version_not_found
A versionId in spec.skills is not a version of that skill (for a skill with 100 or more versions, invalid_spec is returned)
400
file_not_found
A file in spec.inputFiles whose type is "blob" is not in your library
400
invalid_body
The body is malformed JSON or not a JSON object
403
insufficient_scope
The assets:write scope is missing
403
forbidden
Called with a system integration token
403
sso_required
The user does not sign in with SSO
413
body_too_large
The body exceeds 3 MiB
415
unsupported_media_type
The body Content-Type is not application/json
PATCH/v1/agents/:agentId
Edits one of your Agents. Only the fields you send are changed.
Description (up to 5000 characters; cannot be an empty string, only whitespace, or null)
isShared
boolean
—
Whether to share it
spec
object
—
Definition of the Agent. Only the fields you send are overlaid on the current definition (skills and inputFiles are replaced as whole arrays). The fields are the same as when creating an Agent. Sending null for a field removes it (skills and inputFiles become empty). goal cannot be removed
Send at least one of name, description, isShared, and spec.
When you change spec, the playbook, skills, and input files the definition points to are checked, including fields you did not send. An Agent copied from a shared Agent still points to the original user's playbook, skills, and input files, so unless you change them to your own (skills may also be shared ones), 400 is returned.
agentId is not a UUID, baseDigest is missing, empty, or not a string, no fields to change, name, description, or isShared has the wrong type or length, name is only whitespace, description was set to an empty string, only whitespace, or null, spec is not an object, spec.playbookId is not a UUID, spec.skills has the wrong form (the same skill twice, and so on), or spec.skillIds or spec.skillVersions was sent
400
invalid_spec
spec.goal was set to null or only whitespace, a string field in spec has the wrong type or length, spec.agentLevel is not an allowed value, spec.inputFiles has the wrong form (type other than "blob", "git", or "upload", an empty filepath, a filename over 255 characters, and so on), or more than 10 skills or input files
400
playbook_not_found
The playbook in the definition is not one of your playbooks
400
skill_not_found
A skill in the definition is neither your own skill nor an active shared skill
400
version_not_found
A skill versionId in the definition is not a version of that skill (for a skill with 100 or more versions, invalid_spec is returned)
400
file_not_found
An input file in the definition whose type is "blob" is not in your library
400
runtime_not_allowed
A registered Agent of the Marketplace edition cannot be edited
400
invalid_body
The body is malformed JSON or not a JSON object
403
insufficient_scope
The assets:write scope is missing
403
forbidden
Called with a system integration token
403
sso_required
The user does not sign in with SSO
404
agent_not_found
The Agent does not exist, or it is another user's Agent
409
stale_base
The Agent has changed since you got it
413
body_too_large
The body exceeds 3 MiB
415
unsupported_media_type
The body Content-Type is not application/json
DELETE/v1/agents/:agentId
Deletes one of your Agents. The deleted Agent is removed from the projects where it was placed, and the sweeps of those placements stop.
agentId is not a UUID, or force is not "true" / "false"
403
insufficient_scope
The assets:delete scope is missing
403
forbidden
Called with a system integration token
403
sso_required
The user does not sign in with SSO
404
agent_not_found
The Agent does not exist, or it is another user's Agent
409
agent_in_use
The Agent is placed in projects, including placements in deleted projects (it can be deleted with force=true; read the number of projects from projectCount in the Get Agent response)
409
agent_running
A sweep of this Agent is running
POST/v1/agents/:agentId/copy
Copies a shared Agent as your own Agent. A newly created copy is private. No body is required (a body is not read even if sent).
The definition is copied as is. The playbook, skills, and input files it points to remain the original user's. To change them to your own, edit the copied Agent. For a registered Agent of the Marketplace edition, if you already have your own Agent for the same registered Agent, that Agent is returned instead of creating a new one.
Returns the Agent created by the copy in the same form as the Get Agent response. For a registered Agent of the Marketplace edition, your existing Agent may be returned (in that case, projectCount in the response is 0; check the number of projects with the Get Agent API).
Reads, creates, edits, deletes, and copies skills. Use a skillId in the Chat skillIds parameter to load the skill into the agent, or in an Agent definition (spec.skills). For the common rules, see Common Rules for Agents, Playbooks, and Skills.
A skill consists of SKILL.md and accompanying files (documents, scripts, setting files, and so on). Each time the files change, a new version is created, and earlier versions are kept.
Use GET /v1/skills for skills you registered yourself, and GET /v1/skills/shared for publicly shared skills (including those you shared yourself). Shared skills can be specified in skillIds directly without copying them.
While hasMore is true, pass the cursor from the response to the next request as-is.
curl
# First page curl"https://api.fd.agenticstar.tm.softbank.jp/api/v1/skills?limit=50"\ -H"Authorization: Bearer <access_token>" # Second page (use the cursor returned by the first page) curl"https://api.fd.agenticstar.tm.softbank.jp/api/v1/skills?limit=50&cursor=<cursor>"\ -H"Authorization: Bearer <access_token>"
To fetch everything, keep following the cursor until hasMore becomes false.
Using the cursor
The cursor represents a position in the result set. Do not change active_only while you are following the same cursor — changing the conditions changes the target set and causes duplicated or skipped items.
Items may also be duplicated or skipped across pages if skills are added or removed while you are paging.
The same fields as an item in the list of your skills, plus the following two. For a skill shared by another user, isShared and isActive are not included, as in the shared list.
Field
Type
Description
currentVersionId
string | null
ID of the current version. null for a skill that was created before versions were recorded and whose files have not been changed since
digest
string
The value to send as baseDigest when changing the skill settings. It is made from the shared setting, active setting, category, and tags, and does not change when the files change
The skill does not exist, or it is another user's private skill
GET/v1/skills/:skillId/versions
Lists the versions of a skill. Each time the files of a skill change, a new version is created, and earlier versions are kept. Up to 100 versions are returned, newest first. Pagination is not supported (hasMore is always false, and versions older than the latest 100 are not returned). If you know the ID of a version older than the latest 100, you can still get its file list and read its non-binary documents with the single-file API (to read all its files, copy the skill with that version).
How the version was created: "upload" (created or replaced by sending files), "edit" (documents were edited), "copy" (created by a copy), or "baseline" (content from before versions were recorded)
versions[].contentDigest
string | null
A value made from the contents of the files of the version. Versions with the same contents have the same value
versions[].createdAt
string
When the version was created (ISO 8601)
versions[].isCurrent
boolean
Whether this is the current version
hasMore
boolean
Always false
For a skill that was created before versions were recorded and whose files have not been changed since, one item is returned with versionId and contentDigest set to null and source set to "baseline".
The skill does not exist, or it is another user's private skill
GET/v1/skills/:skillId/files/content
Gets the contents of one file of a skill. The contents are always returned in full.
In an earlier version, only documents (kind is "document" and the file is not binary) can be read. Other files of an earlier version return 400 (version_not_readable). To read all the files of an earlier version, copy the skill with versionId (POST /v1/skills/:skillId/copy), and then download the copied skill (GET /v1/skills/:skillId/download).
skillId or versionId is not a UUID, or path is missing
400
file_not_found
The file at path is not in the version
400
version_not_found
versionId is not a version of the skill
400
version_not_readable
A file that is not a document, or a binary document, was specified in an earlier version
403
insufficient_scope
The assets:read scope is missing
403
forbidden
Called with a system integration token
404
skill_not_found
The skill does not exist, or it is another user's private skill
GET/v1/skills/:skillId/download
Gets all the files of the current version of a skill (including setting files and images) as a zip. You cannot specify a version.
The Content-Type of the response is application/zip. The file name (Content-Disposition) is based on the name of the skill (with the .zip extension).
The zip has no top-level folder. You can send it as is to create a skill (POST /v1/skills) or to replace the files of a skill (PUT /v1/skills/:skillId/files).
The skill does not exist, or it is another user's private skill
POST/v1/skills
Creates a skill. Send the request as multipart/form-data. The name and description are read from name and description in the YAML at the top of SKILL.md (the part enclosed in ---).
Files of the skill. Send one zip, or a set of files that includes SKILL.md. For a set of files, send one file per field, and set the file name to the path within the skill (for example, scripts/run.py). If you send only one file with the .md extension, it is saved as SKILL.md
category
string
—
Category (up to 40 characters, not counting leading and trailing whitespace)
tags
string
—
Tags. Send one tag per field and repeat the field (up to 10 tags of 1 to 24 characters, not counting leading and trailing whitespace or a leading #). Tags are saved in lowercase without a leading #. Tags that become the same this way cannot be sent
isShared
string
—
Whether to share it ("true" or "false"). Private if omitted
isActive
string
—
Whether it is active ("true" or "false"). Active if omitted. A shared skill must be active
Rules for the files of a skill:
SKILL.md is required at the root. The YAML at the top of SKILL.md must have name (up to 100 characters). description is optional (in the description shown in lists and elsewhere, the part over 1024 characters is cut off; SKILL.md itself is kept as is).
If the contents of a zip are all in one folder, the folder is removed when saving. Files created by operating systems (__MACOSX/, files starting with ._, .DS_Store, Thumbs.db, desktop.ini) are not saved.
1 to 50 files, up to 2 MiB per file, and up to 5 MiB in total after extraction.
Keep the total size of the files you send (including the size after a set of files is packed) under 6 MiB.
files is missing, two files with the same path were sent, a file was sent in a field other than files, there are too many or too long form fields, or category, tags, isShared, or isActive is invalid
400
file_count
No files (for example, an empty zip) or more than 50 files
400
file_too_large
A file exceeds 2 MiB
400
total_too_large
The total after extraction exceeds 5 MiB
400
zip_invalid
The zip cannot be extracted
400
bad_path
A file path is invalid (for example, it contains ..)
400
skill_md_missing
SKILL.md is not at the root
400
frontmatter_missing
SKILL.md does not start with YAML (the part enclosed in ---)
400
name_missing
The YAML in SKILL.md has no name
400
name_too_long
The name in SKILL.md exceeds 100 characters
400
shared_requires_active
Tried to share the skill while it is inactive
400
guardrail_blocked
The contents were blocked by the safety check
403
insufficient_scope
The assets:write scope is missing
403
forbidden
Called with a system integration token
413
body_too_large
The total size of the files sent exceeds the limit
415
unsupported_media_type
The Content-Type is not multipart/form-data
502
blob_write_failed
The files could not be saved (resend the request)
503
guardrail_unavailable
The safety check is not available (resend the request later)
Replaces all the files of one of your skills with the files you send. A new version is created, and earlier versions are kept. Files you do not send are not included in the new version. Send the request as multipart/form-data.
The name and description are read again from the new SKILL.md.
Agents and schedules that use this skill without fixing a version start using the new version (those that fix a version do not change).
If you resend the request, 409 Conflict (stale_base) is returned because the first request changed the version. Get the file list again and check whether the files were changed.
The digest from the file list (of the current version)
files
file
Yes
Files of the skill. How to send them and the rules are the same as when creating a skill
The category, tags, shared setting, and active setting are not accepted (they are not read even if sent). Change them by changing the settings of the skill (PATCH /v1/skills/:skillId).
baseDigest is checked before checking whether you may change the skill. For this reason, for a skill shared by another user, 409 Conflict is returned if baseDigest does not match, and 404 Not Found is returned if it matches.
Returns the skill after the replacement (with a new currentVersionId) in the same form as the response for getting your own skill. Get the digest of the new version from the file list.
skillId is not a UUID, baseDigest is missing, empty, or not a string, files is missing, two files with the same path were sent, or a file was sent in a field other than files
400
file_count
No files (for example, an empty zip) or more than 50 files
400
file_too_large
A file exceeds 2 MiB
400
total_too_large
The total after extraction exceeds 5 MiB
400
zip_invalid
The zip cannot be extracted
400
bad_path
A file path is invalid (for example, it contains ..)
400
skill_md_missing
SKILL.md is not at the root
400
frontmatter_missing
SKILL.md does not start with YAML (the part enclosed in ---)
400
name_missing
The YAML in SKILL.md has no name
400
name_too_long
The name in SKILL.md exceeds 100 characters
400
guardrail_blocked
The contents were blocked by the safety check
403
insufficient_scope
The assets:write scope is missing
403
forbidden
Called with a system integration token
404
skill_not_found
The skill does not exist, or it is another user's skill
409
stale_base
The files of the skill have changed since you got the file list
413
body_too_large
The total size of the files sent exceeds the limit
415
unsupported_media_type
The Content-Type is not multipart/form-data
502
blob_write_failed
The files could not be saved
503
guardrail_unavailable
The safety check is not available (resend the request later)
PATCH/v1/skills/:skillId/files
Edits the documents (.md, .json, .yaml, .yml) of one of your skills. A new version is created in which only the documents you send are changed; files you do not send are carried over from the current version. Earlier versions are kept.
You can add, rewrite, and delete documents. Files that are not documents cannot be changed. A skill that contains scripts or executables cannot be edited (fix it by replacing the files with PUT /v1/skills/:skillId/files).
SKILL.md cannot be deleted. When SKILL.md is rewritten, the name and description are read again.
The syntax of JSON and YAML documents is checked. After the edit, the skill must still have up to 50 files, up to 2 MiB per file, and up to 5 MiB in total. Edited documents go through a safety check.
Agents and schedules that use this skill without fixing a version start using the new version (those that fix a version do not change).
A key to identify resends (8 to 128 characters of letters, digits, and _ . : -). If you resend with the same key, the version created by the first request is returned without creating a new version
The skill after the edit (same form as the response for getting your own skill)
version
object
The created version (same form as an item of versions[] in the version list)
If you resend with the same Idempotency-Key, 200 OK is returned with the version created by the first request (version) and the current skill (skill). Sending a different edit with the same key returns 409 Conflict (command_conflict). Resending before the first request finishes may return 409 Conflict (stale_base); resend with the same key after it finishes.
skillId is not a UUID, baseDigest is missing, empty, or not a string, or changes[].deleted is not true or false
400
idempotency_key_invalid
The format of Idempotency-Key is invalid
400
invalid_body
The body is malformed JSON or not a JSON object
400
no_changes
changes is missing or empty, or has more than 50 items
400
bad_change
An item of changes has the wrong form (path is missing, content is not a string, and so on), or the same path was specified twice
400
bad_path
path is invalid (for example, it contains ..)
400
not_editable
A file that is not a document was specified
400
code_skill_not_editable
The skill contains scripts or executables
400
skill_md_required
Tried to delete SKILL.md
400
file_too_large
A file exceeds 2 MiB
400
invalid_syntax
A JSON or YAML document has a syntax error
400
skill_too_large
After the edit, the skill exceeds 50 files or 5 MiB in total
400
frontmatter_missing
SKILL.md does not start with YAML (the part enclosed in ---)
400
name_missing
The YAML in SKILL.md has no name
400
name_too_long
The name in SKILL.md exceeds 100 characters
400
guardrail_blocked
The contents were blocked by the safety check
403
insufficient_scope
The assets:write scope is missing
403
forbidden
Called with a system integration token
404
skill_not_found
The skill does not exist, or it is another user's skill
409
stale_base
The files of the skill have changed since you got the file list (including an unreadable baseDigest)
409
command_conflict
A different edit was sent with the same Idempotency-Key
413
body_too_large
The body exceeds 3 MiB
415
unsupported_media_type
The Content-Type of the body is not application/json
502
blob_write_failed
The files could not be saved
503
guardrail_unavailable
The safety check is not available (resend the request later)
PATCH/v1/skills/:skillId
Changes the settings of one of your skills (shared setting, active setting, category, and tags). Only the fields you send are changed. The name and description are read from SKILL.md, so they cannot be changed here.
Category (up to 40 characters, not counting leading and trailing whitespace). Send null or an empty string to clear it
tags
array
—
Tags (up to 10 strings of 1 to 24 characters, not counting leading and trailing whitespace or a leading #). Send [] to clear them. Tags are saved in lowercase without a leading #. Tags that become the same this way cannot be sent
Send at least one field besides baseDigest. A change that would leave the skill shared but inactive returns 400 (shared_requires_active).
baseDigest is checked before checking whether you may change the skill. For this reason, for a skill shared by another user, 409 Conflict is returned if baseDigest does not match, and 404 Not Found is returned if it matches.
Set to "true" to remove the skill from the schedules that use it and then delete the skill. A value other than "true" / "false" returns 400
force
string
"false"
Set to "true" to delete the skill even if Agents use it. A value other than "true" / "false" returns 400
When Agents use the skill: If Agents have this skill in their definitions, 409 Conflict (skill_in_use; the number of Agents is in error.message) is returned. Agents are counted regardless of their owners. You can delete the skill with force=true. After the deletion, the Agents keep pointing to the deleted skill. This check is done before checking whether you may delete the skill, so 409 Conflict may be returned even for a skill shared by another user.
When schedules use the skill: If schedules use this skill, 409 Conflict (skill_referenced; the number of schedules is in error.message) is returned. The schedules of all users are counted, whether active or inactive. Sweeps of Agents placed in projects and similar jobs are also counted as schedules. With cascade=true, the skill is removed from those schedules and then deleted. The schedules themselves are kept.
If both Agents and schedules use the skill, both cascade=true and force=true are required.
skillId is not a UUID, or cascade or force is not "true" / "false"
403
insufficient_scope
The assets:delete scope is missing
403
forbidden
Called with a system integration token
404
skill_not_found
The skill does not exist, or it is another user's skill that you cannot delete
409
skill_in_use
Agents use the skill (it can be deleted with force=true)
409
skill_referenced
Schedules use the skill (it can be deleted with cascade=true)
POST/v1/skills/:skillId/copy
Copies one of your skills or a shared skill as a new skill of your own. All the files of the specified version (the current version if omitted) are copied, and the copy is created as private and active. The name, description, category, and tags are copied from the current values of the source. The versions of the copied skill start from 1.
The body is optional. To specify a version, send it as JSON.
Reads, creates, edits, deletes, and copies playbooks. Use a playbookId in the Chat playbookId parameter to run the agent with a predefined procedure, or in an Agent definition (spec.playbookId). For the common rules, see Common Rules for Agents, Playbooks, and Skills.
{ "playbooks":[ { "playbookId":"7c9e6679-7425-40de-944b-e07fc1f90ae7", "ownerUserId":"bbbe4306-6975-420b-af47-fb4c8f48b4aa", "name":"Weekly report", "description":"Generate a weekly report from sales data", "category":"Reporting", "tags":["sales","weekly"], "steps":[ { "title":"Fetch data", "description":"Fetch sales data for the target period", "guidance":["From Monday to Sunday of the previous week"], "success":"At least one record was fetched" } ], "sourceConversationId":"550e8400-e29b-41d4-a716-446655440000", "isShared":false, "isActive":true, "usageCount":12, "copyCount":0, "createdAt":"2026-08-01T03:12:45.123Z", "updatedAt":"2026-08-05T09:00:00.000Z" } ], "hasMore":false }
While hasMore is true, pass the cursor from the response to the next request as-is.
curl
# First page curl"https://api.fd.agenticstar.tm.softbank.jp/api/v1/playbooks?limit=50"\ -H"Authorization: Bearer <access_token>" # Second page (use the cursor returned by the first page) curl"https://api.fd.agenticstar.tm.softbank.jp/api/v1/playbooks?limit=50&cursor=<cursor>"\ -H"Authorization: Bearer <access_token>"
To fetch everything, keep following the cursor until hasMore becomes false.
Using the cursor
The cursor represents a position in the result set. Do not change active_only while you are following the same cursor — changing the conditions changes the target set and causes duplicated or skipped items.
Items may also be duplicated or skipped across pages if playbooks are added or removed while you are paging.
cursor is invalid (not a value from a previous response)
400
active_only is not "true" / "false"
403
Has neither chat:exec nor assets:read
403
Called with a system integration token (code: "forbidden")
GET/v1/playbooks/shared
Lists shared playbooks. The list also includes playbooks you shared and playbooks deactivated by the users who shared them. Ordered by the number of copies (then by creation time, newest first). Cursor-based pagination is supported.
The same fields as an item in the playbook list, plus digest. For a playbook shared by another user, isShared and isActive are not included, as in the shared list.
Field
Type
Description
digest
string
The value to send as baseDigest when editing the playbook. It is made from the name, description, category, tags, steps, shared setting, and active setting, and does not change with the usage count, the copy count, or timestamps
updatedAt is updated not only when the content is changed but also each time the playbook is used.
Name (up to 100 characters; cannot be only whitespace)
description
string | null
—
Description (up to 500 characters)
category
string | null
—
Category (up to 50 characters)
tags
array
—
Tags (up to 10 strings of up to 30 characters each. Empty or whitespace-only tags, and tags that are the same after removing leading and trailing whitespace, cannot be sent. Case is distinguished)
steps
array
Yes
Steps (1 to 20)
steps[].title
string
Yes
Step title (up to 100 characters; cannot be only whitespace)
steps[].description
string
—
Step description (up to 1000 characters)
steps[].guidance
array
—
Supplementary instructions (up to 10 strings of up to 500 characters each; empty or whitespace-only strings cannot be sent)
steps[].success
string
—
Completion criteria (up to 500 characters)
isShared
boolean
—
Whether to share it. Private if omitted
isActive
boolean
—
Whether it is active. Active if omitted
A step has four fields: title, description, guidance, and success (other fields are not saved). null cannot be sent for the string fields of a step.
The name, description, and category are saved with leading and trailing whitespace removed. A description or category that is null, an empty string, or only whitespace is saved as null.
name or steps is missing, or a field has the wrong type, length, or number of items (error.param names the field; a field in a step is shown like steps[2].title)
400
invalid_body
The body is malformed JSON or not a JSON object
403
insufficient_scope
The assets:write scope is missing
403
forbidden
Called with a system integration token
413
body_too_large
The body exceeds 3 MiB
415
unsupported_media_type
The Content-Type of the body is not application/json
PATCH/v1/playbooks/:playbookId
Edits one of your playbooks. Only the fields you send are changed. When you send the steps (steps), all steps are replaced (express rewriting, removing, and reordering with this array).
Name (up to 100 characters; cannot be only whitespace or null)
description
string | null
—
Description (up to 500 characters). Send null or an empty string to clear it
category
string | null
—
Category (up to 50 characters). Send null or an empty string to clear it
tags
array
—
Tags (up to 10 strings of up to 30 characters each; the tags that cannot be sent are the same as when creating). Send [] to clear them
steps
array
—
All the steps (1 to 20). The fields are the same as when creating a playbook
isShared
boolean
—
Whether to share it
isActive
boolean
—
Whether it is active
Send at least one field besides baseDigest. null cannot be sent for name, tags, steps, isShared, or isActive. Values are saved in the same way as when creating a playbook (leading and trailing whitespace), and the tags and supplementary instructions that cannot be sent are also the same.
If the first request changed the content, resending it returns 409 Conflict (stale_base) because the digest has changed. Get the playbook again and check whether it was changed.
playbookId is not a UUID, baseDigest is missing, empty, or not a string, no fields to change, a field has the wrong type, length, or number of items, or null was sent for a field that does not accept it
400
invalid_body
The body is malformed JSON or not a JSON object
403
insufficient_scope
The assets:write scope is missing
403
forbidden
Called with a system integration token
404
playbook_not_found
The playbook does not exist, or it is another user's playbook
409
stale_base
The playbook has changed since you got it
413
body_too_large
The body exceeds 3 MiB
415
unsupported_media_type
The Content-Type of the body is not application/json
DELETE/v1/playbooks/:playbookId
Deletes one of your playbooks. A system administrator can also delete playbooks shared by other users.
Set to "true" to delete the schedules that use this playbook and then delete the playbook. A value other than "true" / "false" returns 400
force
string
"false"
Set to "true" to delete the playbook even if Agents use it. A value other than "true" / "false" returns 400
When schedules use the playbook: If active schedules use this playbook, 409 Conflict (has_active_references; the number of schedules is in error.message) is returned. Sweeps of Agents placed in projects, and project executions that have not started yet, are also counted as schedules (executions that have started are not counted). With cascade=true, the schedules that use this playbook, including inactive ones, are deleted and then the playbook is deleted.
For a regular user, only the user's own schedules are counted and deleted. Other users' schedules are neither counted nor deleted (they keep pointing to the deleted playbook). For a system administrator, the schedules of all users are counted and deleted.
If only inactive schedules use the playbook, 409 Conflict is not returned, and those schedules are not deleted even with cascade=true. Schedules that are not deleted keep pointing to the deleted playbook.
Schedules deleted with cascade=true do not run after that (executions that have already started are not stopped). A sweep stays stopped even if its setting remains enabled.
When Agents use the playbook: If Agents have this playbook in their definitions, 409 Conflict (playbook_in_use; the number of Agents is in error.message) is returned. Agents are counted regardless of their owners. You can delete the playbook with force=true. After the deletion, the Agents keep pointing to the deleted playbook.
If both schedules and Agents use the playbook, both cascade=true and force=true are required.
Schedules and Agents are checked before checking whether you may delete the playbook. For this reason, 409 Conflict may be returned even for a playbook shared by another user. For a playbook you cannot delete, adding cascade=true and force=true returns 404 Not Found, and nothing is deleted.
playbookId is not a UUID, or cascade or force is not "true" / "false"
403
insufficient_scope
The assets:delete scope is missing
403
forbidden
Called with a system integration token
404
playbook_not_found
The playbook does not exist, or it is another user's playbook that you cannot delete
409
has_active_references
Active schedules use the playbook (it can be deleted with cascade=true)
409
playbook_in_use
Agents use the playbook (it can be deleted with force=true)
POST/v1/playbooks/:playbookId/copy
Copies a shared playbook as your own playbook. The name, description, category, tags, and steps are copied, and the copy is created as private and active. The number of copies of the source (copyCount) increases by 1. No body is required (a body is not read even if sent).
Array of artifacts generated by the agent (included only when present)
messages[].deliverables[].filename
string
Artifact file name
messages[].deliverables[].filepath
string
Artifact file path
messages[].deliverables[].source
string
"agent" (agent-generated) or "user" (user-uploaded)
messages[].deliverables[].isPrimary
boolean
Whether it is a primary artifact
messages[].deliverables[].createdAt
string
Creation date and time (ISO 8601 format)
messages[].deliverables[].mimeType
string?
MIME type (e.g., "application/pdf", "text/markdown"). Omitted when it cannot be determined
messages[].deliverables[].size
number?
File size (bytes). Omitted when 0 or below
messages[].files
array?
Array of user-uploaded files. Included only when present for messages with sender: "User". The field structure matches the history API (fileId / mimeType / width? / height?). See GET /v1/conversations/:id/messages for details
hasMore
boolean
Always false (pagination not supported). It is false even when more than 50 messages match, so there is no guarantee that every match is included
Missing required parameters, currentPassword / newPassword / confirmPassword is not a string, the body is malformed JSON (code: "invalid_body"), or password validation failed
415
The body Content-Type is not application/json (code: "unsupported_media_type")
401
Authentication token is invalid or current password is incorrect
Display language for name / description (e.g., "ja", "en"). An unknown or non-string value does not return 400; the platform default language is used instead
HTTP status codes that may be returned by all endpoints.
Status
Description
400 Bad Request
Invalid request parameters
401 Unauthorized
Token is invalid or missing
403 Forbidden
No access permission to the resource
404 Not Found
Resource does not exist
409 Conflict
Operation conflict, such as the resource currently being processed
413 Payload Too Large
Request body exceeds the size limit
415 Unsupported Media Type
The request body format (Content-Type) is not supported
429 Too Many Requests
Rate limit or concurrent-run limit exceeded. error.type is rate_limit_error, and error.code depends on the endpoint (for example monthly_quota_exceeded for the monthly limit and too_many_active_runs for concurrent project runs). Please wait and retry.
500 Internal Server Error
Internal server error
502 Bad Gateway
Communication error with upstream services (authentication / chat backends, etc.)
The parameter that caused the error. Included only for validation errors
error.suggested_action
string
Recommended action to take. Included only for some errors
JSON
{ "error":{ "type":"invalid_request_error", "message":"Invalid parameter: limit", "code":"invalid_parameter", "param":"limit", "suggested_action":"limit must be between 1 and 100" } }