Skip to main content

User API Reference (Conversations, Library, Organizations)

Endpoint specification and error codes for the user-facing API of the SaaS edition. For APIs called from a system integration, see the System Integration API Reference. For the Marketplace edition, see the System Integration API Reference (Marketplace).

Base URL​

Send all API requests to the following base URL.

SaaS
https://api.fd.agenticstar.tm.softbank.jp/api

Endpoint paths in this document are relative to the base URL.

Authentication​

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.

For how to obtain a token and for scope details, see the Authentication Guide and the Authentication API Reference.

Pagination​

List endpoints support cursor-based pagination.

ParameterTypeDescription
limitintegerNumber of items per page (1-100). Defaults to 50.
cursorstringCursor value for the next page. Pass the cursor from the previous response as is.
orderstringSort order: "asc" or "desc" (default). Any other value returns 400 Bad Request. Supported on some endpoints only.

Responses include a hasMore field. While it is true, pass the cursor value in the next request to retrieve the following page.

Cursor-based pagination is available on the list endpoints of Conversations, Messages, Files, Library, Agents, Skills, Playbooks and Projects. Treat cursor as opaque: do not interpret it, just pass the previous value back.

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.

Request handling​

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.

Chat​

OpenAI-compatible Chat Completions API. Conversations with the agent are delivered via SSE (Server-Sent Events) streaming.

The Chat API consists of three endpoints. You can send messages, reconnect to existing conversations, and cancel conversations in progress.

SSE Streaming Guide

Detailed explanation of connection flow, response objects, Delta extensions, execution patterns, reconnection, and error handling

View guide

Endpoint List​

メソッドエンドポイント説明Scope (SaaS)
POST/v1/chat/completionsSend a chat message and receive a response via SSE streamingchat:exec
GET/v1/chat/completions/:conversationIdReconnect to the SSE stream of a conversation in progresschat:exec
POST/v1/chat/completions/:conversationId/cancelCancel a conversation in progresschat:exec

Note: The Marketplace edition does not require scopes (authentication only).

POST/v1/chat/completions

Send a message to the agent and receive a response via SSE streaming. Responses are delivered in OpenAI-compatible Chat Completion Chunk format.

Request Headers​

ヘッダー必須説明
Authorization必須Bearer <access_token>
Content-Type必須application/json

Request Body​

パラメータ型必須説明
modelstring必須The model ID to use. Specify "AGENTIC STAR".
messagesarray必須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.
streamboolean必須Specify true. Currently, only streaming mode is supported.
conversationIdstring—Specify a conversation ID to continue an existing conversation. If omitted, a new conversation is created.

Edition-Specific Parameters​

SaaS
agentLevelstring"default" or "high_performance". Defaults to "default" when omitted.
agentModebooleanEnable/disable agent mode. Defaults to true when omitted.
privateModebooleanEnable/disable private mode. Defaults to false when omitted.
reportModestring"with" (default) or "without". Controls whether a work report is generated on completion.
personaKeystringPersona (response personality) to apply. Specify a personaKey returned by `GET /v1/personas`. Omit to apply no persona.
playbookIdstringPlaybook (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.
skillIdsarrayArray 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.
outputFormatstringResponse text format. "plain" (default) returns plain text with Markdown removed (diagrams dropped, code block bodies kept). "markdown" preserves Markdown as-is.

Message Object​

パラメータ型必須説明
rolestring必須Use "user". "assistant" / "system" are accepted but only "user" is effectively used as the starting point of the agent turn in the current implementation
contentstring | 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.

Content Parts (Array Format)​

When specifying content as an array, the following part types are available. You can combine text and files in a single message.

typeParameterDescription
"text"text (string)Text message
"input_file"fileId or filepath (string)Either the fileId of an uploaded file or the filepath of a library file returned by GET /v1/library (exactly one). Up to 20 files total per request

Request Example​

Create chat completion
1curl -X POST https://api.fd.agenticstar.tm.softbank.jp/api/v1/chat/completions \
2-H "Authorization: Bearer <access_token>" \
3-H "Content-Type: application/json" \
4-d '{
5 "model": "AGENTIC STAR",
6 "stream": true,
7 "messages": [
8 {
9 "role": "user",
10 "content": "Please analyze the sales data"
11 }
12 ]
13}'

Response Headers​

HeaderDescription
Content-Typetext/event-stream
X-Conversation-IdConversation ID. For new conversations, a server-generated ID is returned.
X-Message-IdThe assistant response message ID.

SSE Response Format​

Responses are delivered as SSE events in the following order. Each event is a JSON line prefixed with data:.

SSE Event Flow
1. data: {"choices":[{"delta":{"role":"assistant"}}]}
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.

Response Example​

SSE
data: {"createdAt":"2026-03-14T10:30:00Z","model":"AGENTIC STAR","choices":[{"index":0,"delta":{"role":"assistant"},"finishReason":null}]}

data: {"createdAt":"2026-03-14T10:30:00Z","model":"AGENTIC STAR","choices":[{"index":0,"delta":{"content":"Analyzing"},"finishReason":null}]}

data: {"createdAt":"2026-03-14T10:30:00Z","model":"AGENTIC STAR","choices":[{"index":0,"delta":{"content":" the sales data."},"finishReason":null}]}

data: {"createdAt":"2026-03-14T10:30:01Z","model":"AGENTIC STAR","choices":[{"index":0,"delta":{},"finishReason":"stop"}]}

data: [DONE]

Error Response​

Errors before the SSE stream starts are returned in JSON format. Errors during the stream are delivered as SSE chunks.

StatusDescription
400Invalid 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")
415The body Content-Type is not application/json (code: "unsupported_media_type")
403Missing chat:exec scope
404The specified input_file fileId or filepath is not found
409The 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.

Path Parameters​

パラメータ型必須説明
conversationIdstring必須The ID of the conversation to reconnect to

Request Example​

Resume SSE stream
1curl https://api.fd.agenticstar.tm.softbank.jp/api/v1/chat/completions/550e8400-e29b-41d4-a716-446655440000 \
2-H "Authorization: Bearer <access_token>"

Response (200 OK)​

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.

Error Response​

StatusDescription
400Invalid conversationId
403Missing chat:exec scope
404Conversation not found or not in progress

POST/v1/chat/completions/:conversationId/cancel

Cancel a conversation in progress. Use this to abort the agent's execution.

Path Parameters​

パラメータ型必須説明
conversationIdstring必須The ID of the conversation to cancel

Request Body (optional)​

パラメータ型必須説明
messageIdstring—The ID of the message to cancel (UUID). If omitted, cancels the entire conversation.

Request Example​

Cancel chat
1curl -X POST https://api.fd.agenticstar.tm.softbank.jp/api/v1/chat/completions/550e8400-e29b-41d4-a716-446655440000/cancel \
2-H "Authorization: Bearer <access_token>" \
3-H "Content-Type: application/json"

Response Fields (200 OK)​

FieldTypeDescription
conversationIdstringThe ID of the cancelled conversation (UUID)
cancelledbooleanAlways true on successful cancellation

Response Example​

JSON
{ "conversationId": "550e8400-...", "cancelled": true }

Error Response​

StatusDescription
400Invalid 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")
415The body Content-Type is not application/json (code: "unsupported_media_type")
403Missing chat:exec scope
404Conversation not found

Conversation Management​

List, retrieve message history, delete, and update titles of conversations.

Endpoint List​

メソッドエンドポイント説明Scope (SaaS)
GET/v1/conversationsList conversationschat:history
GET/v1/conversations/:conversationId/messagesGet message historychat:history
GET/v1/conversations/:conversationId/ui-resources/:toolCallIdGet the HTML of a UI resourcechat:exec / a2a:all / mcp:all
PATCH/v1/conversations/:conversationIdUpdate conversation titlechat:history
DELETE/v1/conversations/:conversationIdDelete a conversationchat:history
POST/v1/conversations/:conversationId/restoreRestore archived conversationchat:history

Note: The Marketplace edition does not require scopes (authentication only).

Operations on archived conversations​

Conversations retrieved with mode=archive only support read operations (list / message history) and restoration. The following operations return a 400 error (code: "conversation_archived").

OperationBehavior 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.

Query Parameters​

ParameterTypeDefaultDescription
limitinteger50Number of items to retrieve (1-100)
cursorstring—Cursor for fetching the next page (cursor value from the previous response)
orderstring"desc""asc" or "desc"
titlestring—Filter by title
modestring"active""active" (regular conversations) or "archive" (archived conversations). Switching mode queries a different data store, so cursor cannot be carried over

Request Example​

List conversations
1curl "https://api.fd.agenticstar.tm.softbank.jp/api/v1/conversations?limit=10&order=desc" \
2-H "Authorization: Bearer <access_token>"

Response Fields (200 OK)​

FieldTypeDescription
conversationsarrayArray of conversation objects
conversations[].conversationIdstringUnique identifier of the conversation (UUID)
conversations[].titlestringConversation title
conversations[].createdAtstringCreation date and time (ISO 8601)
conversations[].updatedAtstringLast updated date and time (ISO 8601)
conversations[].archivedboolean?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
hasMorebooleanWhether the next page exists
cursorstringCursor for fetching the next page. Included only when hasMore is true

Response Example​

JSON
{
"conversations": [
{
"conversationId": "550e8400-e29b-41d4-a716-446655440000",
"title": "Sales data analysis",
"createdAt": "2026-03-14T10:30:00Z",
"updatedAt": "2026-03-14T10:35:00Z"
}
],
"hasMore": true,
"cursor": "eyJrIjoiMjAyNi0wMy0xNFQxMDozMDowMC4wMDBaIn0"
}

Error Response​

StatusDescription
400Invalid 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)
403Missing chat:history scope

GET/v1/conversations/:conversationId/messages

Retrieve the message history of a specified conversation. Cursor-based pagination is supported.

Path Parameters​

パラメータ型必須説明
conversationIdstring必須Conversation ID (UUID)

Query Parameters​

ParameterTypeDefaultDescription
limitinteger50Number of items per page (1-100)
cursorstring—Cursor for the next page (the cursor value from the previous response)
orderstring"desc""asc" or "desc"

Request Example​

Get messages
1curl https://api.fd.agenticstar.tm.softbank.jp/api/v1/conversations/550e8400-e29b-41d4-a716-446655440000/messages?order=asc \
2-H "Authorization: Bearer <access_token>"

Response Fields (200 OK)​

FieldTypeDescription
messagesarrayArray of message objects
messages[].conversationIdstringConversation ID (UUID)
messages[].messageIdstringUnique identifier of the message
messages[].senderstringSender. "User" or "AI"
messages[].textstringMessage body text
messages[].createdAtstringCreation date and time (ISO 8601)
messages[].updatedAtstringLast updated date and time (ISO 8601)
messages[].statusobjectMessage processing status
messages[].status.processingbooleanWhether the agent is currently processing
messages[].status.unfinishedbooleanWhether the agent response was interrupted
messages[].tasksarrayArray of tasks executed by the agent (see below)
messages[].deliverablesarrayArray of artifacts generated by the agent. Included only when present
messages[].deliverables[].filenamestringArtifact file name
messages[].deliverables[].filepathstringArtifact file path
messages[].deliverables[].sourcestring"agent" (agent-generated) or "user" (user-uploaded)
messages[].deliverables[].isPrimarybooleanWhether it is a primary artifact
messages[].deliverables[].createdAtstringCreation date and time (ISO 8601 format)
messages[].deliverables[].mimeTypestring?MIME type (e.g., "application/pdf", "text/markdown"). Omitted when it cannot be determined
messages[].deliverables[].sizenumber?File size (bytes). Omitted when 0 or below
messages[].filesarray?Array of user-uploaded files. Included only when present for messages with sender: "User"
messages[].files[].fileIdstringUnique identifier of the file (UUID)
messages[].files[].mimeTypestringMIME type (e.g., "image/png", "application/pdf")
messages[].files[].widthnumber?Image width in pixels. Only for image files
messages[].files[].heightnumber?Image height in pixels. Only for image files
messages[].archivedboolean?true only for messages retrieved via archive. Added when viewing the message history of a conversation retrieved with GET /v1/conversations?mode=archive
hasMorebooleanWhether a next page exists
cursorstringCursor for the next page. Included only when hasMore is true

Task Object​

FieldTypeDescription
messageIdstringID of the message the task belongs to
conversationIdstringID of the conversation the task belongs to
callIdstring?Tool call ID. In Complex Path, multiple tasks share the same callId and identify a sequence of steps for the same tool call
actionTypestringType of task (e.g., tool execution, code generation)
titlestring?Task title. Omitted when not present
descriptionstring?Task description. Omitted when not present
statusstringTask status. One of: "in_progress" / "completed" / "failed" / "error" / "pending"
contentstring?Task execution result text. Omitted when not present
metadataobject?Auxiliary information that varies by actionType (sub_event_type, url, filepath, etc.). See the Streaming Guide for details
filesarray?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
timestampnumberTimestamp of task execution (Unix milliseconds)
createdAtstringCreation date and time (ISO 8601)
updatedAtstringLast updated date and time (ISO 8601)

UI resources (tasks[].metadata.uiResource)​

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 metadataMeaning
uiResource onlyDisplay-only UI. No user reply is expected.
uiResource + interaction_typeUI that asks for a reply. interaction_type is "choice" or "question". This combination occurs only with origin: "first-party".
interaction_type onlyA reply is requested but no UI is included. interaction_type is "choice" | "confirmation" | "question". The reply instructions are in content of the same task.
optionsArray 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.

Response Example​

JSON
{
"messages": [
{
"conversationId": "550e8400-...",
"messageId": "msg-abc123",
"sender": "User",
"text": "Please analyze the sales data",
"createdAt": "2026-03-14T10:30:00Z",
"updatedAt": "2026-03-14T10:30:00Z",
"status": { "processing": false, "unfinished": false },
"tasks": []
}
],
"hasMore": false
}

Pagination​

Specify limit to fetch items in pages. While hasMore is true, pass the cursor from the response to the next request as-is.

Request example
1# First page
2curl "https://api.fd.agenticstar.tm.softbank.jp/api/v1/conversations/<conversation_id>/messages?limit=50" \
3-H "Authorization: Bearer <access_token>"
4
5# Second page (use the cursor returned by the first page)
6curl "https://api.fd.agenticstar.tm.softbank.jp/api/v1/conversations/<conversation_id>/messages?limit=50&cursor=<cursor>" \
7-H "Authorization: Bearer <access_token>"

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.

Error Response​

StatusDescription
400Invalid conversationId format
400limit is not an integer between 1 and 100
400cursor is invalid (not a value from a previous response)
400order is not "asc" / "desc"
403Missing chat:history scope
404Conversation not found

GET/v1/conversations/:conversationId/ui-resources/:toolCallId

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.

Required Scope​

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.

Path Parameters​

パラメータ型必須説明
conversationIdstring必須Conversation ID (UUID)
toolCallIdstring必須Identifier of the UI resource — the value of uiResource.tool_call_id. Format: 1-128 characters of alphanumerics, hyphens, and underscores

Request Example​

Get UI resource
1curl https://api.fd.agenticstar.tm.softbank.jp/api/v1/conversations/550e8400-e29b-41d4-a716-446655440000/ui-resources/chart-7f3a2b1c9e4d5a6b7c8d9e0f1a2b3c4d \
2-H "Authorization: Bearer <access_token>"

Response Fields (200 OK)​

FieldTypeDescription
toolCallIdstringThe UI resource identifier given in the request
typestringAlways "html"
originstring"first-party" (produced by AGENTIC STAR) or "external" (produced by an external MCP server approved by your administrator)
mimeTypestringMIME type of the HTML. Normally "text/html;profile=mcp-app"
htmlstringThe HTML source
JSON
{
"toolCallId": "chart-7f3a2b1c9e4d5a6b7c8d9e0f1a2b3c4d",
"type": "html",
"origin": "first-party",
"mimeType": "text/html;profile=mcp-app",
"html": "<!doctype html><html>...</html>"
}

Error Response​

Use code to decide whether a retry makes sense.

StatuscodeDescriptionRetry
400invalid_conversation_idconversationId is not a valid UUIDNo
400invalid_parameterInvalid toolCallId formatNo
403insufficient_scopeNone of chat:exec / a2a:all / mcp:all is presentNo
404not_foundNo such UI resourceNo
404conversation_not_foundNo such conversation, or it belongs to another userNo
404file_too_largeThe HTML exceeds 512KB and cannot be returnedNo (permanent failure)
502upstream_api_errorTemporary retrieval failureYes
500internal_errorOther errorsYes
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.

PATCH/v1/conversations/:conversationId

Update the title of a conversation.

Path Parameters​

パラメータ型必須説明
conversationIdstring必須Conversation ID (UUID)

Request Body​

パラメータ型必須説明
titlestring必須New conversation title (200 characters or less)

Request Example​

Update conversation
1curl -X PATCH https://api.fd.agenticstar.tm.softbank.jp/api/v1/conversations/550e8400-e29b-41d4-a716-446655440000 \
2-H "Authorization: Bearer <access_token>" \
3-H "Content-Type: application/json" \
4-d '{ "title": "New title" }'

Response Fields (200 OK)​

FieldTypeDescription
conversationIdstringConversation ID (UUID)
titlestringUpdated title
createdAtstringCreation timestamp (ISO 8601)
updatedAtstringLast update timestamp (ISO 8601)

Response Example​

JSON
{
"conversationId": "550e8400-...",
"title": "New title",
"createdAt": "2026-03-14T10:30:00.000Z",
"updatedAt": "2026-03-14T12:00:00.000Z"
}

Error Response​

StatusDescription
400title is missing, empty, or exceeds 200 characters, the body is malformed JSON (code: "invalid_body"), or the conversation is archived (code: "conversation_archived")
415The body Content-Type is not application/json (code: "unsupported_media_type")
403Missing chat:history scope
404Conversation not found

DELETE/v1/conversations/:conversationId

Delete a conversation.

Path Parameters​

パラメータ型必須説明
conversationIdstring必須Conversation ID (UUID)

Request Example​

Delete conversation
1curl -X DELETE https://api.fd.agenticstar.tm.softbank.jp/api/v1/conversations/550e8400-e29b-41d4-a716-446655440000 \
2-H "Authorization: Bearer <access_token>"

Response Fields (200 OK)​

FieldTypeDescription
conversationIdstringID of the deleted conversation (UUID)
deletedbooleanAlways true on successful deletion

Response Example​

JSON
{ "conversationId": "550e8400-...", "deleted": true }

Error Response​

StatusDescription
400Invalid conversationId, or the conversation is archived (code: "conversation_archived"; use POST /v1/conversations/:id/restore to restore it)
403Missing chat:history scope
404Conversation not found
409Conversation 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.

Path Parameters​

パラメータ型必須説明
conversationIdstring必須ID of the archived conversation (UUID)

Request Example​

Restore archived conversation
1curl -X POST https://api.fd.agenticstar.tm.softbank.jp/api/v1/conversations/550e8400-e29b-41d4-a716-446655440000/restore \
2-H "Authorization: Bearer <access_token>"

Response Fields (200 OK)​

FieldTypeDescription
conversationIdstringID of the restored conversation (UUID)
restoredbooleanAlways true on successful restoration

Response Example​

JSON
{ "conversationId": "550e8400-...", "restored": true }

Error Response​

StatusDescription
400Invalid conversationId
403Missing chat:history scope
404No matching conversation in archive, or it is already active (archive state is not distinguished)

File Management​

Upload, retrieve, and delete files.

Endpoint List​

メソッドエンドポイント説明Scope (SaaS)
GET/v1/filesList fileschat:file
POST/v1/filesUpload a filechat:file
GET/v1/files/:file_id/contentDownload a filechat:file
DELETE/v1/files/:file_idDelete a filechat:file

Note: The Marketplace edition does not require scopes (authentication only).

POST/v1/files

Upload a file.

Request Body (multipart/form-data)​

パラメータ型必須説明
filefile必須The file to upload. Maximum size 512 MB.
filenamestring必須File name

Request Example​

Upload file
1curl -X POST https://api.fd.agenticstar.tm.softbank.jp/api/v1/files \
2-H "Authorization: Bearer <access_token>" \
3-F "file=@report.pdf" \
4-F "filename=report.pdf"

Response Fields (201 Created)​

FieldTypeDescription
fileIdstringUnique identifier of the file (UUID)
filenamestringFile name
bytesintegerFile size (bytes)
createdAtstringCreation date and time (ISO 8601)
widthintegerImage width (pixels). Only for image files
heightintegerImage height (pixels). Only for image files

Response Example​

JSON
{
"fileId": "550e8400-e29b-41d4-a716-446655440001",
"filename": "report.pdf",
"bytes": 1048576,
"createdAt": "2026-03-14T10:30:00.000Z"
}

Error Response​

StatusDescription
400file or filename parameter is missing, file size exceeds 512 MB, or the uploaded image file is corrupted or invalid
415The body is not multipart/form-data (code: "unsupported_media_type")
403Missing chat:file scope

GET/v1/files

List files. Cursor-based pagination is supported.

Query Parameters​

ParameterTypeDefaultDescription
limitinteger50Number of items per page (1-100)
cursorstring—Cursor for the next page (the cursor value from the previous response)
orderstring"desc""asc" or "desc"

Request Example​

List files
1curl https://api.fd.agenticstar.tm.softbank.jp/api/v1/files?order=desc \
2-H "Authorization: Bearer <access_token>"

Response Fields (200 OK)​

FieldTypeDescription
filesarrayArray of file objects
files[].fileIdstringUnique identifier of the file (UUID)
files[].filenamestringFile name
files[].bytesintegerFile size (bytes)
files[].createdAtstringCreation date and time (ISO 8601)
files[].widthintegerImage width (pixels). Only for image files
files[].heightintegerImage height (pixels). Only for image files
hasMorebooleanWhether a next page exists
cursorstringCursor for the next page. Included only when hasMore is true

Response Example​

JSON
{
"files": [
{
"fileId": "550e8400-e29b-41d4-a716-446655440001",
"filename": "report.pdf",
"bytes": 1048576,
"createdAt": "2026-03-14T10:30:00.000Z"
}
],
"hasMore": false
}

Pagination​

Specify limit to fetch items in pages. While hasMore is true, pass the cursor from the response to the next request as-is.

Request example
1# First page
2curl "https://api.fd.agenticstar.tm.softbank.jp/api/v1/files?limit=50&order=desc" \
3-H "Authorization: Bearer <access_token>"
4
5# Second page (use the cursor returned by the first page)
6curl "https://api.fd.agenticstar.tm.softbank.jp/api/v1/files?limit=50&order=desc&cursor=<cursor>" \
7-H "Authorization: Bearer <access_token>"

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.

Error Response​

StatusDescription
400limit is not an integer between 1 and 100
400cursor is invalid (not a value from a previous response)
400order is not "asc" / "desc"
403Missing chat:file scope

GET/v1/files/:file_id/content

Download a file.

Path Parameters​

パラメータ型必須説明
file_idstring必須File ID (UUID)

Request Example​

Download file
1curl https://api.fd.agenticstar.tm.softbank.jp/api/v1/files/550e8400-e29b-41d4-a716-446655440001/content \
2-H "Authorization: Bearer <access_token>" \
3-o downloaded_file.pdf

Response (200 OK)​

The file binary data is returned as a stream.

Response HeaderDescription
Content-TypeMIME type of the file
Content-LengthFile size (bytes)
Content-Dispositionattachment; filename="filename"

Error Response​

StatusDescription
400Invalid fileId format
403Missing chat:file scope
404File not found

DELETE/v1/files/:file_id

Delete a file.

Path Parameters​

パラメータ型必須説明
file_idstring必須File ID (UUID)

Request Example​

Delete file
1curl -X DELETE https://api.fd.agenticstar.tm.softbank.jp/api/v1/files/550e8400-e29b-41d4-a716-446655440001 \
2-H "Authorization: Bearer <access_token>"

Response Fields (200 OK)​

FieldTypeDescription
fileIdstringID of the deleted file (UUID)
deletedbooleanAlways true on successful deletion

Response Example​

JSON
{ "fileId": "550e8400-e29b-41d4-a716-446655440001", "deleted": true }

Error Response​

StatusDescription
400Invalid fileId format
403Missing chat:file scope
404File not found

Artifact Retrieval​

Retrieve artifact files generated by the agent.

Endpoint List​

メソッドエンドポイント説明Scope (SaaS)
GET/v1/files/proxyGet an artifact filechat:exec / a2a:all / mcp:all

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.

Query Parameters​

パラメータ型必須説明
pathstring必須Artifact file path (obtained from deliverables[].filepath in the message history)

Request Example​

Get artifact file
1curl "https://api.fd.agenticstar.tm.softbank.jp/api/v1/files/proxy?path=/path/to/artifact.xlsx" \
2-H "Authorization: Bearer <access_token>" \
3-o artifact.xlsx

Response (200 OK)​

The artifact file binary data is returned as a stream.

Response HeaderDescription
Content-TypeMIME type of the file
Content-LengthFile size (bytes)

Error Response​

StatusDescription
400path parameter is missing or has an invalid format
403None of chat:exec / a2a:all / mcp:all is present
404File not found

Library​

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).

Endpoints​

メソッドエンドポイント説明Scope (SaaS)
GET/v1/libraryList library fileschat:exec

GET/v1/library

Retrieves the list of library files. Supports cursor-based pagination.

Query Parameters​

ParameterTypeDefaultDescription
limitinteger50Number of items to retrieve (1–100)
cursorstring—Cursor for the next page (the cursor value from the previous response)
searchstring—Filter by file name (partial match)
sourcestring—Filter by "agent" (agent-generated) or "user" (user-uploaded)
orderstring"desc""asc" or "desc"

Response Fields (200 OK)​

FieldTypeDescription
filesarrayArray of library file objects
files[].filenamestringFile name
files[].filepathstringFile path (used for Chat input_file attachment or download via GET /v1/files/proxy)
files[].sourcestring"agent" (agent-generated) or "user" (user-uploaded)
files[].createdAtstringCreation timestamp (ISO 8601)
files[].updatedAtstringLast update timestamp (ISO 8601)
files[].mimeTypestring?MIME type. Omitted when it cannot be determined
files[].sizenumber?File size in bytes. Omitted when unavailable
files[].conversationIdstring?Associated conversation ID. Included only when the artifact is tied to a conversation
hasMorebooleanWhether a next page exists
cursorstringCursor for the next page. Included only when hasMore is true

Response Example​

JSON
{
"files": [
{
"filename": "report.xlsx",
"filepath": "/path/to/report.xlsx",
"source": "agent",
"createdAt": "2026-03-14T10:30:00.000Z",
"updatedAt": "2026-03-14T10:30:00.000Z",
"mimeType": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"size": 20480,
"conversationId": "550e8400-e29b-41d4-a716-446655440000"
}
],
"hasMore": false
}

Error Responses​

StatusDescription
400Invalid limit (out of 1–100 range), cursor, source (other than "agent" / "user"), order (other than "asc" / "desc"), or search (not a string)
403Missing chat:exec scope

Common Rules for Agents, Playbooks, and Skills​

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​

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.

Endpoints​

メソッドエンドポイント説明Scope (SaaS)
GET/v1/agentsList your Agentsassets:read
GET/v1/agents/sharedList shared Agentsassets:read
GET/v1/agents/:agentIdGet an Agentassets:read
POST/v1/agentsCreate an Agentassets:write
PATCH/v1/agents/:agentIdEdit an Agentassets:write
DELETE/v1/agents/:agentIdDelete an Agentassets:delete
POST/v1/agents/:agentId/copyCopy a shared Agent as your own Agentassets:write

GET/v1/agents

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.

Query Parameters​

ParameterTypeDefaultDescription
qstring—Filter by part of the name, description, or goal (up to 100 characters)
limitinteger50Number of items per page (1-100)
cursorstring—Cursor for the next page (the cursor value from the previous response)

Response Fields (200 OK)​

FieldTypeDescription
agentsarrayArray of Agent objects. Each item is the same as the Get Agent response except for digest
hasMorebooleanWhether there is a next page
cursorstringCursor for the next page. Included only when hasMore is true

Error Responses​

StatusDescription
400Invalid limit (out of 1–100 range), cursor, or q (not a string, or longer than 100 characters) (code is invalid_parameter)
403The 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.

Path Parameters​

パラメータ型必須説明
agentIdstring必須Agent ID (UUID)

Response Fields (200 OK)​

FieldTypeDescription
agentIdstringAgent ID (UUID)
namestring | nullName
descriptionstring | nullDescription
ownerUserIdstring | nullUser ID of the owner
isSharedboolean | nullWhether the Agent is shared
runtimeKindstring | nullKind of runtime. "autonomous", or "marketplace" for a registered Agent of the Marketplace edition
marketplaceAgentIdstring | nullID of the registered Agent in the Marketplace edition. null otherwise
specobjectDefinition of the Agent
spec.goalstring | nullGoal (instructions)
spec.guardrailstring | nullGuardrail
spec.skillsarraySkills to use
spec.skills[].skillIdstring | nullSkill ID
spec.skills[].namestring | nullSkill name
spec.skills[].versionIdstring | nullID of the pinned skill version. null if not pinned, in which case the version at that time is always used
spec.playbookIdstring | nullID of the playbook to use
spec.inputFilesarrayInput files
spec.inputFiles[].typestring | nullKind of input file. "blob" for library files. An Agent created from a scheduled job may have "git" or "upload"
spec.inputFiles[].filepathstring | nullFile 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[].filenamestring | nullFile name
spec.agentLevelstring | null"default" or "high_performance"
spec.orgIdstring | nullCode of the organization used at run time
spec.jobRolestring | nullCode of the job type used at run time
spec.agentConfigobject | nullNot used at present (even if it has a value, the value is not used)
spec.exposureConsentobject | nullNot used at present (even if it has a value, the value is not used)
projectCountnumber | nullNumber of projects where this Agent is placed (placements in deleted projects are also counted)
copyCountnumber | nullNumber of times it has been copied
createdAtstring | nullCreation time (ISO 8601)
updatedAtstring | nullLast update time (ISO 8601)
digeststringValue 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

Response Example​

JSON
{
"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…"
}

Error Responses​

StatusDescription
400agentId is not a UUID (code is invalid_parameter)
403The 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)
404The Agent does not exist, or it is another user's private Agent (code is agent_not_found)

POST/v1/agents

Creates an Agent.

Request Body​

FieldTypeRequiredDescription
namestringYesName (up to 255 characters; cannot be empty)
descriptionstring—Description (up to 5000 characters)
isSharedboolean—Whether to share it. Private if omitted
specobjectYesDefinition of the Agent
spec.goalstringYesGoal (instructions). Up to 5000 characters. Cannot be only whitespace
spec.guardrailstring—Guardrail. Up to 5000 characters
spec.skillsarray—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.playbookIdstring—ID of the playbook to use. Your own playbooks only
spec.inputFilesarray—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.agentLevelstring—"default" or "high_performance"
spec.orgIdstring—Code of the organization used at run time (up to 255 characters)
spec.jobRolestring—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.

Response (201 Created)​

Returns the created Agent in the same form as the Get Agent response.

Error Responses​

StatuscodeDescription
400invalid_parametername 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
400invalid_specspec.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
400playbook_not_foundspec.playbookId is not one of your playbooks
400skill_not_foundA skill in spec.skills is neither your own skill nor an active shared skill
400version_not_foundA versionId in spec.skills is not a version of that skill (for a skill with 100 or more versions, invalid_spec is returned)
400file_not_foundA file in spec.inputFiles whose type is "blob" is not in your library
400invalid_bodyThe body is malformed JSON or not a JSON object
403insufficient_scopeThe assets:write scope is missing
403forbiddenCalled with a system integration token
403sso_requiredThe user does not sign in with SSO
413body_too_largeThe body exceeds 3 MiB
415unsupported_media_typeThe body Content-Type is not application/json

PATCH/v1/agents/:agentId

Edits one of your Agents. Only the fields you send are changed.

Path Parameters​

パラメータ型必須説明
agentIdstring必須Agent ID (UUID)

Request Body​

FieldTypeRequiredDescription
baseDigeststringYesThe digest from the Get Agent response
namestring—Name (up to 255 characters; cannot be empty)
descriptionstring—Description (up to 5000 characters; cannot be an empty string, only whitespace, or null)
isSharedboolean—Whether to share it
specobject—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.

Response (200 OK)​

Returns the edited Agent (with a new digest) in the same form as the Get Agent response.

Error Responses​

StatuscodeDescription
400invalid_parameteragentId 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
400invalid_specspec.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
400playbook_not_foundThe playbook in the definition is not one of your playbooks
400skill_not_foundA skill in the definition is neither your own skill nor an active shared skill
400version_not_foundA skill versionId in the definition is not a version of that skill (for a skill with 100 or more versions, invalid_spec is returned)
400file_not_foundAn input file in the definition whose type is "blob" is not in your library
400runtime_not_allowedA registered Agent of the Marketplace edition cannot be edited
400invalid_bodyThe body is malformed JSON or not a JSON object
403insufficient_scopeThe assets:write scope is missing
403forbiddenCalled with a system integration token
403sso_requiredThe user does not sign in with SSO
404agent_not_foundThe Agent does not exist, or it is another user's Agent
409stale_baseThe Agent has changed since you got it
413body_too_largeThe body exceeds 3 MiB
415unsupported_media_typeThe 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.

Path Parameters​

パラメータ型必須説明
agentIdstring必須Agent ID (UUID)

Query Parameters​

ParameterTypeDefaultDescription
forcestring"false"Specify "true" to delete even if the Agent is placed in projects. A value other than "true" / "false" returns 400

Response (200 OK)​

JSON
{
"agentId": "17be0242-a5d0-4db7-92e5-f97a05abae2b",
"deleted": true
}

Error Responses​

StatuscodeDescription
400invalid_parameteragentId is not a UUID, or force is not "true" / "false"
403insufficient_scopeThe assets:delete scope is missing
403forbiddenCalled with a system integration token
403sso_requiredThe user does not sign in with SSO
404agent_not_foundThe Agent does not exist, or it is another user's Agent
409agent_in_useThe 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)
409agent_runningA 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.

Path Parameters​

パラメータ型必須説明
agentIdstring必須ID of the Agent to copy (UUID)

Response (201 Created)​

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).

Error Responses​

StatuscodeDescription
400invalid_parameteragentId is not a UUID
403insufficient_scopeThe assets:write scope is missing
403forbiddenCalled with a system integration token
403sso_requiredThe user does not sign in with SSO
404agent_not_foundThe Agent does not exist, or it is another user's private Agent
409already_ownedYou tried to copy your own Agent

Skills​

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.

Endpoint List​

メソッドエンドポイント説明Scope (SaaS)
GET/v1/skillsList your skillschat:exec / assets:read
GET/v1/skills/sharedList shared skillschat:exec / assets:read
GET/v1/skills/:skillIdGet a skillassets:read
GET/v1/skills/:skillId/versionsList the versions of a skillassets:read
GET/v1/skills/:skillId/filesList the files of a skillassets:read
GET/v1/skills/:skillId/files/contentGet one file of a skillassets:read
GET/v1/skills/:skillId/downloadGet the files of a skill as a zipassets:read
POST/v1/skillsCreate a skillassets:write
PUT/v1/skills/:skillId/filesReplace the files of a skillassets:write
PATCH/v1/skills/:skillId/filesEdit the documents of a skillassets:write
PATCH/v1/skills/:skillIdChange the settings of a skillassets:write
DELETE/v1/skills/:skillIdDelete a skillassets:delete
POST/v1/skills/:skillId/copyCopy a skill as your own skillassets:write

GET/v1/skills

Lists the skills you registered, ordered by last update time (newest first). Cursor-based pagination is supported.

Query Parameters​

ParameterTypeDefaultDescription
active_onlybooleantrueSet to false to also include deactivated skills. A value other than "true" / "false" returns 400
limitinteger50Number of items per page (1-100)
cursorstring—Cursor for the next page (the cursor value from the previous response)

Response Fields (200 OK)​

FieldTypeDescription
skillsarrayArray of skill objects
skills[].skillIdstringSkill ID (specify this in the Chat skillIds parameter)
skills[].ownerUserIdstring | nullUser ID of the owner
skills[].namestringSkill name
skills[].descriptionstring?Skill description
skills[].categorystring?Category
skills[].tagsarrayArray of tags (duplicates are returned once). An empty array when unset
skills[].isSharedbooleanWhether you share the skill publicly
skills[].isActivebooleanWhether the skill is active
skills[].createdAtstringCreation time (ISO 8601)
skills[].updatedAtstringLast update time (ISO 8601)
hasMorebooleanWhether a next page exists
cursorstringCursor for the next page. Included only when hasMore is true

Response Example​

JSON
{
"skills": [
{
"skillId": "3f2a4b6c-1d2e-4f5a-8b9c-0d1e2f3a4b5c",
"ownerUserId": "bbbe4306-6975-420b-af47-fb4c8f48b4aa",
"name": "release-notes",
"description": "Generate release notes",
"category": "devops",
"tags": ["ci"],
"isShared": false,
"isActive": true,
"createdAt": "2026-08-01T03:12:45.123Z",
"updatedAt": "2026-08-05T09:00:00.000Z"
}
],
"hasMore": false
}

Pagination​

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.

Error Responses​

StatusDescription
400limit is not an integer between 1 and 100
400cursor is invalid (not a value from a previous response)
400active_only is not "true" / "false"
403Has neither chat:exec nor assets:read
403Called with a system integration token (code: "forbidden")

GET/v1/skills/shared

Lists publicly shared skills (including skills you shared yourself), ordered by creation time (newest first). Cursor-based pagination is supported.

Query Parameters​

ParameterTypeDefaultDescription
limitinteger50Number of items per page (1-100)
cursorstring—Cursor for the next page (the cursor value from the previous response)

Response Fields (200 OK)​

Shared skills are always active, so the isShared / isActive fields are not included.

FieldTypeDescription
skillsarrayArray of skill objects
skills[].skillIdstringSkill ID (specify this in the Chat skillIds parameter)
skills[].ownerUserIdstring | nullUser ID of the owner
skills[].namestringSkill name
skills[].descriptionstring?Skill description
skills[].categorystring?Category
skills[].tagsarrayArray of tags (duplicates are returned once). An empty array when unset
skills[].createdAtstringCreation time (ISO 8601)
skills[].updatedAtstringLast update time (ISO 8601)
hasMorebooleanWhether a next page exists
cursorstringCursor for the next page. Included only when hasMore is true

Response Example​

JSON
{
"skills": [
{
"skillId": "9c8b7a6d-5e4f-4a3b-8c1d-2e3f4a5b6c7d",
"ownerUserId": "bbbe4306-6975-420b-af47-fb4c8f48b4aa",
"name": "sql-review",
"description": "Review SQL statements",
"category": null,
"tags": [],
"createdAt": "2026-07-20T00:00:00.000Z",
"updatedAt": "2026-08-09T00:00:00.000Z"
}
],
"hasMore": false
}

Error Responses​

StatusDescription
400limit is not an integer between 1 and 100
400cursor is invalid (not a value from a previous response)
403Has neither chat:exec nor assets:read
403Called with a system integration token (code: "forbidden")

GET/v1/skills/:skillId

Gets a skill. You can get your own skills and shared skills.

Path Parameters​

パラメータ型必須説明
skillIdstring必須Skill ID (UUID)

Response Fields (200 OK)​

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.

FieldTypeDescription
currentVersionIdstring | nullID of the current version. null for a skill that was created before versions were recorded and whose files have not been changed since
digeststringThe 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

Response Example​

JSON
{
"skillId": "3f2a4b6c-1d2e-4f5a-8b9c-0d1e2f3a4b5c",
"ownerUserId": "bbbe4306-6975-420b-af47-fb4c8f48b4aa",
"name": "release-notes",
"description": "Generates release notes",
"category": "devops",
"tags": ["ci"],
"isShared": false,
"isActive": true,
"createdAt": "2026-08-01T03:12:45.123Z",
"updatedAt": "2026-08-05T09:00:00.000Z",
"currentVersionId": "5b1d7e2a-8c4f-4e9b-a3d6-2f7c9e1b4a80",
"digest": "9d2e41c7a0b3…"
}

Error Responses​

StatuscodeDescription
400invalid_parameterskillId is not a UUID
403insufficient_scopeThe assets:read scope is missing
403forbiddenCalled with a system integration token
404skill_not_foundThe 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).

Path Parameters​

パラメータ型必須説明
skillIdstring必須Skill ID (UUID)

Response Fields (200 OK)​

FieldTypeDescription
skillIdstringSkill ID
currentVersionIdstring | nullID of the current version
versionsarrayArray of versions (newest first)
versions[].versionIdstring | nullVersion ID
versions[].versionNonumberVersion number (starting from 1)
versions[].parentVersionIdstring | nullID of the version this version was based on
versions[].sourcestringHow 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[].contentDigeststring | nullA value made from the contents of the files of the version. Versions with the same contents have the same value
versions[].createdAtstringWhen the version was created (ISO 8601)
versions[].isCurrentbooleanWhether this is the current version
hasMorebooleanAlways 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".

Response Example​

JSON
{
"skillId": "3f2a4b6c-1d2e-4f5a-8b9c-0d1e2f3a4b5c",
"currentVersionId": "5b1d7e2a-8c4f-4e9b-a3d6-2f7c9e1b4a80",
"versions": [
{
"versionId": "5b1d7e2a-8c4f-4e9b-a3d6-2f7c9e1b4a80",
"versionNo": 2,
"parentVersionId": "e2c4a6b8-1d3f-4a5c-9e7b-0f2d4c6a8e1b",
"source": "edit",
"contentDigest": "78a4ea5aade3…",
"createdAt": "2026-08-05T09:00:00.000Z",
"isCurrent": true
},
{
"versionId": "e2c4a6b8-1d3f-4a5c-9e7b-0f2d4c6a8e1b",
"versionNo": 1,
"parentVersionId": null,
"source": "upload",
"contentDigest": "3cd01ce0220c…",
"createdAt": "2026-08-01T03:12:45.123Z",
"isCurrent": false
}
],
"hasMore": false
}

Error Responses​

StatuscodeDescription
400invalid_parameterskillId is not a UUID
403insufficient_scopeThe assets:read scope is missing
403forbiddenCalled with a system integration token
404skill_not_foundThe skill does not exist, or it is another user's private skill

GET/v1/skills/:skillId/files

Lists the files of a version of a skill. File contents are not returned (read them with the single-file API).

Path Parameters​

パラメータ型必須説明
skillIdstring必須Skill ID (UUID)

Query Parameters​

ParameterTypeDefaultDescription
versionIdstringCurrent versionID of the version to read (UUID)

Response Fields (200 OK)​

FieldTypeDescription
skillIdstringSkill ID
versionIdstring | nullVersion ID
isCurrentbooleanWhether this is the current version
digeststringThe value to send as baseDigest when replacing the files of the skill or editing its documents (send the value of the current version)
editablebooleanWhether the documents can be edited. true when it is your own skill and it contains no scripts or executables (.exe, .bin, .so, .dylib, .dll)
filesarrayArray of files (in path order)
files[].pathstringPath within the skill (for example, scripts/run.py)
files[].kindstringKind of the file (decided by the extension): "document" (.md, .json, .yaml, .yml), "script" (.py, .js, .mjs, .cjs, .ts, .sh, .bash, .zsh, .rb, .pl, .php, .go, .rs, .java, .ps1, .bat, .cmd), or "other" (anything else, such as setting files and images)
files[].sizenumberSize (bytes)
files[].editablebooleanWhether the file is in a form whose contents can be changed by editing documents (true for a document that is not binary)

Response Example​

JSON
{
"skillId": "3f2a4b6c-1d2e-4f5a-8b9c-0d1e2f3a4b5c",
"versionId": "5b1d7e2a-8c4f-4e9b-a3d6-2f7c9e1b4a80",
"isCurrent": true,
"digest": "WyI1YjFkN2UyYS04YzRm…",
"editable": true,
"files": [
{ "path": "SKILL.md", "kind": "document", "size": 1834, "editable": true },
{ "path": "templates/notes.md", "kind": "document", "size": 412, "editable": true }
]
}

Error Responses​

StatuscodeDescription
400invalid_parameterskillId or versionId is not a UUID
400version_not_foundversionId is not a version of the skill
403insufficient_scopeThe assets:read scope is missing
403forbiddenCalled with a system integration token
404skill_not_foundThe 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).

Path Parameters​

パラメータ型必須説明
skillIdstring必須Skill ID (UUID)

Query Parameters​

ParameterTypeDefaultDescription
pathstring—Required. Path of the file (files[].path in the file list; for example, scripts/run.py)
versionIdstringCurrent versionID of the version to read (UUID)

Response Fields (200 OK)​

FieldTypeDescription
skillIdstringSkill ID
versionIdstring | nullVersion ID
pathstringPath of the file
kindstringKind of the file (same as files[].kind in the file list)
sizenumberSize (bytes)
encodingstringHow the contents are represented: "utf-8" for a text file, or "base64" for a binary file (one whose contents include NUL)
contentstringContents of the file (in full)

Error Responses​

StatuscodeDescription
400invalid_parameterskillId or versionId is not a UUID, or path is missing
400file_not_foundThe file at path is not in the version
400version_not_foundversionId is not a version of the skill
400version_not_readableA file that is not a document, or a binary document, was specified in an earlier version
403insufficient_scopeThe assets:read scope is missing
403forbiddenCalled with a system integration token
404skill_not_foundThe 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).

Path Parameters​

パラメータ型必須説明
skillIdstring必須Skill ID (UUID)

Error Responses​

StatuscodeDescription
400invalid_parameterskillId is not a UUID
403insufficient_scopeThe assets:read scope is missing
403forbiddenCalled with a system integration token
404skill_not_foundThe 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 ---).

Request Body (multipart/form-data)​

FieldTypeRequiredDescription
filesfileYesFiles 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
categorystring—Category (up to 40 characters, not counting leading and trailing whitespace)
tagsstring—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
isSharedstring—Whether to share it ("true" or "false"). Private if omitted
isActivestring—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.
  • The contents go through a safety check.

Response (201 Created)​

Returns the created skill in the same form as the response for getting your own skill.

Error Responses​

StatuscodeDescription
400invalid_parameterfiles 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
400file_countNo files (for example, an empty zip) or more than 50 files
400file_too_largeA file exceeds 2 MiB
400total_too_largeThe total after extraction exceeds 5 MiB
400zip_invalidThe zip cannot be extracted
400bad_pathA file path is invalid (for example, it contains ..)
400skill_md_missingSKILL.md is not at the root
400frontmatter_missingSKILL.md does not start with YAML (the part enclosed in ---)
400name_missingThe YAML in SKILL.md has no name
400name_too_longThe name in SKILL.md exceeds 100 characters
400shared_requires_activeTried to share the skill while it is inactive
400guardrail_blockedThe contents were blocked by the safety check
403insufficient_scopeThe assets:write scope is missing
403forbiddenCalled with a system integration token
413body_too_largeThe total size of the files sent exceeds the limit
415unsupported_media_typeThe Content-Type is not multipart/form-data
502blob_write_failedThe files could not be saved (resend the request)
503guardrail_unavailableThe safety check is not available (resend the request later)
curl
curl -X POST "https://api.fd.agenticstar.tm.softbank.jp/api/v1/skills" \
-H "Authorization: Bearer <access_token>" \
-F "files=@SKILL.md;filename=SKILL.md" \
-F "files=@scripts/run.py;filename=scripts/run.py" \
-F "category=devops" \
-F "tags=ci" \
-F "tags=release"

PUT/v1/skills/:skillId/files

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.

Path Parameters​

パラメータ型必須説明
skillIdstring必須Skill ID (UUID)

Request Body (multipart/form-data)​

FieldTypeRequiredDescription
baseDigeststringYesThe digest from the file list (of the current version)
filesfileYesFiles 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.

Response (200 OK)​

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.

Error Responses​

StatuscodeDescription
400invalid_parameterskillId 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
400file_countNo files (for example, an empty zip) or more than 50 files
400file_too_largeA file exceeds 2 MiB
400total_too_largeThe total after extraction exceeds 5 MiB
400zip_invalidThe zip cannot be extracted
400bad_pathA file path is invalid (for example, it contains ..)
400skill_md_missingSKILL.md is not at the root
400frontmatter_missingSKILL.md does not start with YAML (the part enclosed in ---)
400name_missingThe YAML in SKILL.md has no name
400name_too_longThe name in SKILL.md exceeds 100 characters
400guardrail_blockedThe contents were blocked by the safety check
403insufficient_scopeThe assets:write scope is missing
403forbiddenCalled with a system integration token
404skill_not_foundThe skill does not exist, or it is another user's skill
409stale_baseThe files of the skill have changed since you got the file list
413body_too_largeThe total size of the files sent exceeds the limit
415unsupported_media_typeThe Content-Type is not multipart/form-data
502blob_write_failedThe files could not be saved
503guardrail_unavailableThe 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).

Path Parameters​

パラメータ型必須説明
skillIdstring必須Skill ID (UUID)

Request Headers​

HeaderRequiredDescription
Idempotency-Key—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

Request Body​

FieldTypeRequiredDescription
baseDigeststringYesThe digest from the file list (of the current version)
changesarrayYesDocuments to change (1 to 50; each path only once)
changes[].pathstringYesPath of the document (for example, SKILL.md or templates/notes.md). A path that does not exist adds a document
changes[].contentstring—New contents of the document (in full). Omit it when deleting
changes[].deletedboolean—true deletes the document (true or false; other values cannot be sent)
JSON
{
"baseDigest": "WyI1YjFkN2UyYS04YzRm…",
"changes": [
{ "path": "SKILL.md", "content": "---\nname: release-notes\ndescription: Generates release notes\n---\n\n# Steps\n..." },
{ "path": "templates/old.md", "deleted": true }
]
}

Response (201 Created)​

FieldTypeDescription
skillobjectThe skill after the edit (same form as the response for getting your own skill)
versionobjectThe 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.

Error Responses​

StatuscodeDescription
400invalid_parameterskillId is not a UUID, baseDigest is missing, empty, or not a string, or changes[].deleted is not true or false
400idempotency_key_invalidThe format of Idempotency-Key is invalid
400invalid_bodyThe body is malformed JSON or not a JSON object
400no_changeschanges is missing or empty, or has more than 50 items
400bad_changeAn 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
400bad_pathpath is invalid (for example, it contains ..)
400not_editableA file that is not a document was specified
400code_skill_not_editableThe skill contains scripts or executables
400skill_md_requiredTried to delete SKILL.md
400file_too_largeA file exceeds 2 MiB
400invalid_syntaxA JSON or YAML document has a syntax error
400skill_too_largeAfter the edit, the skill exceeds 50 files or 5 MiB in total
400frontmatter_missingSKILL.md does not start with YAML (the part enclosed in ---)
400name_missingThe YAML in SKILL.md has no name
400name_too_longThe name in SKILL.md exceeds 100 characters
400guardrail_blockedThe contents were blocked by the safety check
403insufficient_scopeThe assets:write scope is missing
403forbiddenCalled with a system integration token
404skill_not_foundThe skill does not exist, or it is another user's skill
409stale_baseThe files of the skill have changed since you got the file list (including an unreadable baseDigest)
409command_conflictA different edit was sent with the same Idempotency-Key
413body_too_largeThe body exceeds 3 MiB
415unsupported_media_typeThe Content-Type of the body is not application/json
502blob_write_failedThe files could not be saved
503guardrail_unavailableThe 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.

Path Parameters​

パラメータ型必須説明
skillIdstring必須Skill ID (UUID)

Request Body​

FieldTypeRequiredDescription
baseDigeststringYesThe digest from the Get Skill response
isSharedboolean—Whether to share it
isActiveboolean—Whether it is active
categorystring | null—Category (up to 40 characters, not counting leading and trailing whitespace). Send null or an empty string to clear it
tagsarray—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.

Response (200 OK)​

Returns the changed skill (with its current digest) in the same form as the response for getting your own skill.

Error Responses​

StatuscodeDescription
400invalid_parameterskillId is not a UUID, baseDigest is missing, empty, or not a string, no fields to change, or a field has the wrong type, length, or number of items
400shared_requires_activeAfter the change, the skill would be shared but inactive
400invalid_bodyThe body is malformed JSON or not a JSON object
403insufficient_scopeThe assets:write scope is missing
403forbiddenCalled with a system integration token
404skill_not_foundThe skill does not exist, or it is another user's skill
409stale_baseThe settings of the skill have changed since you got it
413body_too_largeThe body exceeds 3 MiB
415unsupported_media_typeThe Content-Type of the body is not application/json

DELETE/v1/skills/:skillId

Deletes one of your skills together with the files of all its versions. A system administrator can also delete skills shared by other users.

Path Parameters​

パラメータ型必須説明
skillIdstring必須Skill ID (UUID)

Query Parameters​

ParameterTypeDefaultDescription
cascadestring"false"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
forcestring"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.

Response (200 OK)​

JSON
{
"skillId": "3f2a4b6c-1d2e-4f5a-8b9c-0d1e2f3a4b5c",
"deleted": true
}

Error Responses​

StatuscodeDescription
400invalid_parameterskillId is not a UUID, or cascade or force is not "true" / "false"
403insufficient_scopeThe assets:delete scope is missing
403forbiddenCalled with a system integration token
404skill_not_foundThe skill does not exist, or it is another user's skill that you cannot delete
409skill_in_useAgents use the skill (it can be deleted with force=true)
409skill_referencedSchedules 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.

Path Parameters​

パラメータ型必須説明
skillIdstring必須ID of the skill to copy (UUID)

Request Body​

FieldTypeRequiredDescription
versionIdstring—ID of the version to copy (UUID). The current version if omitted

Response (201 Created)​

Returns the skill created by the copy in the same form as the response for getting your own skill.

Error Responses​

StatuscodeDescription
400invalid_parameterskillId or versionId is not a UUID
400version_not_foundversionId is not a version of the skill
400invalid_bodyThe body is malformed JSON or not a JSON object
403insufficient_scopeThe assets:write scope is missing
403forbiddenCalled with a system integration token
404skill_not_foundThe skill does not exist, or it is another user's private skill
413body_too_largeThe body exceeds 3 MiB
415unsupported_media_typeThe Content-Type of the body is not application/json
502blob_write_failedThe files could not be saved

Playbooks​

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.

Endpoint List​

メソッドエンドポイント説明Scope (SaaS)
GET/v1/playbooksList your playbookschat:exec / assets:read
GET/v1/playbooks/sharedList shared playbookschat:exec / assets:read
GET/v1/playbooks/:playbookIdGet a playbookassets:read
POST/v1/playbooksCreate a playbookassets:write
PATCH/v1/playbooks/:playbookIdEdit a playbookassets:write
DELETE/v1/playbooks/:playbookIdDelete a playbookassets:delete
POST/v1/playbooks/:playbookId/copyCopy a shared playbook as your own playbookassets:write

GET/v1/playbooks

Lists playbooks, ordered by usage count (then by creation time, newest first). Cursor-based pagination is supported.

Query Parameters​

ParameterTypeDefaultDescription
active_onlybooleantrueSet to false to also include deactivated playbooks. A value other than "true" / "false" returns 400
limitinteger50Number of items per page (1-100)
cursorstring—Cursor for the next page (the cursor value from the previous response)

Response Fields (200 OK)​

FieldTypeDescription
playbooksarrayArray of playbook objects
playbooks[].playbookIdstringPlaybook ID (specify this in the Chat playbookId parameter)
playbooks[].ownerUserIdstringUser ID of the owner
playbooks[].namestringPlaybook name
playbooks[].descriptionstring?Description
playbooks[].categorystring?Category
playbooks[].tagsarrayArray of tags (returned with leading and trailing whitespace removed, empty tags removed, and duplicates returned once)
playbooks[].stepsarrayArray of steps
playbooks[].steps[].titlestringStep title
playbooks[].steps[].descriptionstring?Step description
playbooks[].steps[].guidancearray?Array of supplementary instructions
playbooks[].steps[].successstring?Completion criteria
playbooks[].sourceConversationIdstring?ID of the conversation the playbook was created from
playbooks[].isSharedbooleanWhether the playbook is shared
playbooks[].isActivebooleanWhether the playbook is active
playbooks[].usageCountnumberNumber of times used
playbooks[].copyCountnumberNumber of times copied
playbooks[].createdAtstringCreation time (ISO 8601)
playbooks[].updatedAtstringLast update time (ISO 8601)
hasMorebooleanWhether a next page exists
cursorstringCursor for the next page. Included only when hasMore is true

Response Example​

JSON
{
"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
}

Pagination​

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.

Error Responses​

StatusDescription
400limit is not an integer between 1 and 100
400cursor is invalid (not a value from a previous response)
400active_only is not "true" / "false"
403Has neither chat:exec nor assets:read
403Called 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.

Query Parameters​

ParameterTypeDefaultDescription
limitinteger50Number of items per page (1-100)
cursorstring—Cursor for the next page (the cursor value from the previous response)

Response Fields (200 OK)​

Same form as the list of your playbooks, except that each item does not include isShared or isActive.

Error Responses​

StatusDescription
400limit is not an integer between 1 and 100
400cursor is invalid (not a value from a previous response)
403Has neither chat:exec nor assets:read
403Called with a system integration token (code: "forbidden")

GET/v1/playbooks/:playbookId

Gets a playbook. You can get your own playbooks and shared playbooks.

Path Parameters​

パラメータ型必須説明
playbookIdstring必須Playbook ID (UUID)

Response Fields (200 OK)​

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.

FieldTypeDescription
digeststringThe 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.

Error Responses​

StatuscodeDescription
400invalid_parameterplaybookId is not a UUID
403insufficient_scopeThe assets:read scope is missing
403forbiddenCalled with a system integration token
404playbook_not_foundThe playbook does not exist, or it is another user's private playbook

POST/v1/playbooks

Creates a playbook.

Request Body​

FieldTypeRequiredDescription
namestringYesName (up to 100 characters; cannot be only whitespace)
descriptionstring | null—Description (up to 500 characters)
categorystring | null—Category (up to 50 characters)
tagsarray—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)
stepsarrayYesSteps (1 to 20)
steps[].titlestringYesStep title (up to 100 characters; cannot be only whitespace)
steps[].descriptionstring—Step description (up to 1000 characters)
steps[].guidancearray—Supplementary instructions (up to 10 strings of up to 500 characters each; empty or whitespace-only strings cannot be sent)
steps[].successstring—Completion criteria (up to 500 characters)
isSharedboolean—Whether to share it. Private if omitted
isActiveboolean—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.

Response (201 Created)​

Returns the created playbook in the same form as the response for getting your own playbook.

Error Responses​

StatuscodeDescription
400invalid_parametername 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)
400invalid_bodyThe body is malformed JSON or not a JSON object
403insufficient_scopeThe assets:write scope is missing
403forbiddenCalled with a system integration token
413body_too_largeThe body exceeds 3 MiB
415unsupported_media_typeThe 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).

Path Parameters​

パラメータ型必須説明
playbookIdstring必須Playbook ID (UUID)

Request Body​

FieldTypeRequiredDescription
baseDigeststringYesThe digest from the Get Playbook response
namestring—Name (up to 100 characters; cannot be only whitespace or null)
descriptionstring | null—Description (up to 500 characters). Send null or an empty string to clear it
categorystring | null—Category (up to 50 characters). Send null or an empty string to clear it
tagsarray—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
stepsarray—All the steps (1 to 20). The fields are the same as when creating a playbook
isSharedboolean—Whether to share it
isActiveboolean—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.

Response (200 OK)​

Returns the edited playbook (with its current digest) in the same form as the response for getting your own playbook.

Error Responses​

StatuscodeDescription
400invalid_parameterplaybookId 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
400invalid_bodyThe body is malformed JSON or not a JSON object
403insufficient_scopeThe assets:write scope is missing
403forbiddenCalled with a system integration token
404playbook_not_foundThe playbook does not exist, or it is another user's playbook
409stale_baseThe playbook has changed since you got it
413body_too_largeThe body exceeds 3 MiB
415unsupported_media_typeThe 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.

Path Parameters​

パラメータ型必須説明
playbookIdstring必須Playbook ID (UUID)

Query Parameters​

ParameterTypeDefaultDescription
cascadestring"false"Set to "true" to delete the schedules that use this playbook and then delete the playbook. A value other than "true" / "false" returns 400
forcestring"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.

Response (200 OK)​

JSON
{
"playbookId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"deleted": true
}

Error Responses​

StatuscodeDescription
400invalid_parameterplaybookId is not a UUID, or cascade or force is not "true" / "false"
403insufficient_scopeThe assets:delete scope is missing
403forbiddenCalled with a system integration token
404playbook_not_foundThe playbook does not exist, or it is another user's playbook that you cannot delete
409has_active_referencesActive schedules use the playbook (it can be deleted with cascade=true)
409playbook_in_useAgents 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).

Path Parameters​

パラメータ型必須説明
playbookIdstring必須ID of the playbook to copy (UUID)

Response (201 Created)​

Returns the playbook created by the copy in the same form as the response for getting your own playbook.

Error Responses​

StatuscodeDescription
400invalid_parameterplaybookId is not a UUID
403insufficient_scopeThe assets:write scope is missing
403forbiddenCalled with a system integration token
404playbook_not_foundThe playbook does not exist or is not shared (even your own playbook returns 404 if it is not shared)

Full-text search messages.

Endpoint List​

メソッドエンドポイント説明Scope (SaaS)
GET/v1/search/messagesFull-text search messageschat:history

Note: The Marketplace edition does not require scopes (authentication only).

GET/v1/search/messages

Full-text search messages.

Query Parameters​

パラメータ型必須説明
qstring必須Search query
orderstring—Sort order. "asc" (ascending) or "desc" (descending, default)

Request Example​

Search messages
1curl "https://api.fd.agenticstar.tm.softbank.jp/api/v1/search/messages?q=sales" \
2-H "Authorization: Bearer <access_token>"

Response Fields (200 OK)​

FieldTypeDescription
messagesarrayArray of search result messages (up to 50)
messages[].conversationIdstringConversation ID (UUID)
messages[].messageIdstringUnique identifier of the message
messages[].textstringMessage body text
messages[].titlestringConversation title
messages[].senderstringSender. "User" or "AI"
messages[].createdAtstringCreation date and time (ISO 8601)
messages[].updatedAtstringLast updated date and time (ISO 8601)
messages[].matchedQueriesarrayArray of matched search queries
messages[].statusobjectMessage processing status
messages[].status.processingbooleanWhether the agent is currently processing
messages[].status.unfinishedbooleanWhether the agent response was interrupted
messages[].tasksarrayArray of tasks executed by the agent. See the Task object under GET /v1/conversations/:conversationId/messages for field definitions
messages[].deliverablesarrayArray of artifacts generated by the agent (included only when present)
messages[].deliverables[].filenamestringArtifact file name
messages[].deliverables[].filepathstringArtifact file path
messages[].deliverables[].sourcestring"agent" (agent-generated) or "user" (user-uploaded)
messages[].deliverables[].isPrimarybooleanWhether it is a primary artifact
messages[].deliverables[].createdAtstringCreation date and time (ISO 8601 format)
messages[].deliverables[].mimeTypestring?MIME type (e.g., "application/pdf", "text/markdown"). Omitted when it cannot be determined
messages[].deliverables[].sizenumber?File size (bytes). Omitted when 0 or below
messages[].filesarray?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
hasMorebooleanAlways false (pagination not supported). It is false even when more than 50 messages match, so there is no guarantee that every match is included

Response Example​

JSON
{
"messages": [
{
"conversationId": "550e8400-...",
"messageId": "msg-abc123",
"text": "Result of sales data analysis...",
"title": "Sales data analysis",
"sender": "AI",
"createdAt": "2026-03-14T10:30:00Z",
"updatedAt": "2026-03-14T10:35:00Z",
"matchedQueries": ["sales"],
"tasks": []
}
],
"hasMore": false
}

Error Response​

StatusDescription
400q parameter is missing or not a single string (for example, q specified more than once), or order is not "asc" / "desc"
403Missing chat:history scope

User​

Retrieve, update user information, and change password.

Endpoint List​

メソッドエンドポイント説明
GET/v1/userGet user information
PATCH/v1/userUpdate user information
POST/v1/user/passwordChange password

GET/v1/user

Get user information.

Request Example​

Get user
1curl https://api.fd.agenticstar.tm.softbank.jp/api/v1/user \
2-H "Authorization: Bearer <access_token>"

Response Fields (200 OK)​

FieldTypeDescription
userIdstringUnique identifier of the user
emailstringEmail address
usernamestringUsername
emailVerifiedbooleanEmail verification status
createdAtstringAccount creation date and time (ISO 8601)
isApprovedbooleanAccount approval status
rolestringUser role
organizationobjectOrganization (included only when set)
organization.valuestringOrganization code
organization.labelstringOrganization name
jobTypeobjectJob type (included only when set)
jobType.valuestringJob type code
jobType.labelstringJob type name
biostringBio (included only when set)
lastLoginAtstringLast login date and time (ISO 8601, included only when present)

Response Example​

JSON
{
"userId": "user-abc123",
"email": "tanaka@example.com",
"username": "John Doe",
"emailVerified": true,
"createdAt": "2026-03-10T09:00:00.000Z",
"isApproved": true,
"role": "user",
"organization": { "value": "eng", "label": "Engineering Department" },
"jobType": { "value": "dev", "label": "Developer" },
"bio": "AI Engineer",
"lastLoginAt": "2026-03-14T10:00:00.000Z"
}

PATCH/v1/user

Update user information.

Request Body​

パラメータ型必須説明
usernamestring—Username
organizationstring—Organization code
jobTypestring—Job type code
biostring—Bio

Request Example​

Update user
1curl -X PATCH https://api.fd.agenticstar.tm.softbank.jp/api/v1/user \
2-H "Authorization: Bearer <access_token>" \
3-H "Content-Type: application/json" \
4-d '{ "username": "John Doe", "bio": "Engineering Department" }'

Response Fields (200 OK)​

Returns the same user object as GET /v1/user (with updated values).

Response Example​

JSON
{
"userId": "user-abc123",
"email": "tanaka@example.com",
"username": "John Doe",
"emailVerified": true,
"createdAt": "2026-03-10T09:00:00.000Z",
"isApproved": true,
"role": "user",
"organization": { "value": "eng", "label": "Engineering Department" },
"jobType": { "value": "dev", "label": "Developer" },
"bio": "Engineering Department",
"lastLoginAt": "2026-03-14T10:00:00.000Z"
}

Error Response​

StatusDescription
400No fields specified for update
400username / organization / jobType / bio is not a string, or the body is malformed JSON (code: "invalid_body")
415The body Content-Type is not application/json (code: "unsupported_media_type")

POST/v1/user/password

Change password.

Request Body​

パラメータ型必須説明
currentPasswordstring必須Current password
newPasswordstring必須New password
confirmPasswordstring必須New password (confirmation)

Request Example​

Change password
1curl -X POST https://api.fd.agenticstar.tm.softbank.jp/api/v1/user/password \
2-H "Authorization: Bearer <access_token>" \
3-H "Content-Type: application/json" \
4-d '{
5 "currentPassword": "OldPass123!",
6 "newPassword": "NewPass456!",
7 "confirmPassword": "NewPass456!"
8}'

Response Fields (200 OK)​

FieldTypeDescription
userIdstringUnique identifier of the user
changedbooleanAlways true on successful password change

Response Example​

JSON
{ "userId": "user-abc123", "changed": true }

Error Response​

StatusDescription
400Missing required parameters, currentPassword / newPassword / confirmPassword is not a string, the body is malformed JSON (code: "invalid_body"), or password validation failed
415The body Content-Type is not application/json (code: "unsupported_media_type")
401Authentication token is invalid or current password is incorrect

Master Data​

Retrieve master data such as organizations and job types.

Endpoint List​

メソッドエンドポイント説明
GET/v1/organizationsList organizations
GET/v1/job-typesList job types
GET/v1/personasList personas

GET/v1/organizations

List organizations. Inactive organizations are not included.

Request Example​

List organizations
1curl https://api.fd.agenticstar.tm.softbank.jp/api/v1/organizations \
2-H "Authorization: Bearer <access_token>"

Response Fields (200 OK)​

FieldTypeDescription
organizationsarrayArray of organization objects
organizations[].valuestringOrganization code
organizations[].labelstringOrganization name
hasMorebooleanAlways false (pagination not supported)

Response Example​

JSON
{
"organizations": [
{ "value": "eng", "label": "Engineering Department" },
{ "value": "sales", "label": "Sales Department" }
],
"hasMore": false
}

GET/v1/job-types

List job types. Inactive job types are not included.

Request Example​

List job types
1curl https://api.fd.agenticstar.tm.softbank.jp/api/v1/job-types \
2-H "Authorization: Bearer <access_token>"

Response Fields (200 OK)​

FieldTypeDescription
jobTypesarrayArray of job type objects
jobTypes[].valuestringJob type code
jobTypes[].labelstringJob type name
hasMorebooleanAlways false (pagination not supported)

Response Example​

JSON
{
"jobTypes": [
{ "value": "dev", "label": "Developer" },
{ "value": "pm", "label": "Project Manager" }
],
"hasMore": false
}

GET/v1/personas

Retrieves the list of personas (agent response personalities). Use a returned personaKey to specify a persona in Chat / MCP / A2A.

Query Parameters​

ParameterTypeDefaultDescription
localestringPlatform default languageDisplay 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

Response Fields (200 OK)​

FieldTypeDescription
localestringThe resolved locale
personasarrayArray of persona objects
personas[].personaKeystringPersona identifier (specify as personaKey in Chat / MCP / A2A)
personas[].namestringPersona display name
personas[].descriptionstringPersona description
hasMorebooleanAlways false (pagination not supported)

Response Example​

JSON
{
"locale": "en",
"personas": [
{ "personaKey": "concise", "name": "Concise", "description": "Answers concisely, focusing on key points" }
],
"hasMore": false
}

Projects​

The project APIs are in the User API Reference (Projects). For calls made with a system integration token (Client Credentials flow), see System Integration API Reference — Projects.

List Projects​

GET /v1/projects is in Projects in the User API Reference (Projects).

Start a Workflow Run​

POST /v1/projects/{projectId}/runs is in Workflow Runs in the User API Reference (Projects).

Fire a Trigger​

POST /v1/projects/{projectId}/triggers/{triggerId}/fire is in Triggers in the User API Reference (Projects).

Get a Workflow Run​

GET /v1/projects/{projectId}/runs/{runId} is in Workflow Runs in the User API Reference (Projects).

Error Responses​

HTTP Status Codes​

HTTP status codes that may be returned by all endpoints.

StatusDescription
400 Bad RequestInvalid request parameters
401 UnauthorizedToken is invalid or missing
403 ForbiddenNo access permission to the resource
404 Not FoundResource does not exist
409 ConflictOperation conflict, such as the resource currently being processed
413 Payload Too LargeRequest body exceeds the size limit
415 Unsupported Media TypeThe request body format (Content-Type) is not supported
429 Too Many RequestsRate 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 ErrorInternal server error
502 Bad GatewayCommunication error with upstream services (authentication / chat backends, etc.)
503 Service UnavailableService temporarily unavailable
504 Gateway TimeoutUpstream service response timeout

Error Response Format​

All error responses are returned in the following common structure.

FieldTypeDescription
error.typestringError classification. One of: "invalid_request_error", "authentication_error", "insufficient_scope_error", "forbidden_error", "not_found_error", "conflict_error", "payload_too_large_error", "rate_limit_error", "server_error", "upstream_error"
error.messagestringHuman-readable error message
error.codestringMachine-processable error code (e.g., "missing_parameter", "invalid_parameter", "invalid_token")
error.paramstringThe parameter that caused the error. Included only for validation errors
error.suggested_actionstringRecommended 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"
}
}