Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: SyllableSDK Channels.targets API
description: "\n# Syllable Platform SDK\n\nSyllable SDK gives you the power of awesome AI agentry. \U0001F680\n\n## Overview\n\nThe Syllable SDK provides a comprehensive set of tools and APIs to integrate powerful AI\ncapabilities into your communication applications. Whether you're building phone agents, chatbots,\nvirtual assistants, or any other AI-driven solutions, Syllable SDK has got you covered.\n\n## Features\n\n- **Agent Configuration**: Create and manage agents that can interact with users across various \nchannels.\n- **Channel Management**: Configure channels like SMS, web chat, and more to connect agents with \nusers.\n- **Custom Messages**: Set up custom messages that agents can deliver as greetings or responses.\n- **Conversations**: Track and manage conversations between users and agents, including session \nmanagement.\n- **Tools and Workflows**: Leverage tools and workflows to enhance agent capabilities, such as data \nprocessing and API calls.\n- **Data Sources**: Integrate data sources to provide agents with additional context and \ninformation.\n- **Insights and Analytics**: Analyze conversations and sessions to gain insights into user \ninteractions.\n- **Permissions and Security**: Manage permissions to control access to various features and \nfunctionalities.\n- **Language Support**: Define language groups to enable multilingual support for agents.\n- **Outbound Campaigns**: Create and manage outbound communication campaigns to reach users \neffectively.\n- **Session Labels**: Label sessions with evaluations of quality and descriptions of issues \nencountered.\n- **Incident Management**: Track and manage incidents related to agent interactions.\n"
version: 0.0.3
servers:
- url: https://api.syllable.cloud
description: API server
tags:
- name: channels.targets
description: Operations related to channel target configuration. A channel target links a channel to an agent, allowing users to communicate with the agent through that channel. For more information, see [Console docs](https://docs.syllable.ai/Resources/Channels).
paths:
/api/v1/channels/available-targets:
get:
tags:
- channels.targets
summary: Available Targets List
description: List the available phone numbers
operationId: available_targets
security:
- APIKeyHeader: []
parameters:
- name: page
in: query
required: false
schema:
anyOf:
- type: integer
minimum: 0
- type: 'null'
description: The page number from which to start (0-based)
examples:
- 0
default: 0
title: Page
description: The page number from which to start (0-based)
- name: limit
in: query
required: false
schema:
type: integer
minimum: 0
description: The maximum number of items to return
examples:
- 25
default: 25
title: Limit
description: The maximum number of items to return
- name: search_fields
in: query
required: false
schema:
type: array
items:
$ref: '#/components/schemas/AvailableTargetProperties'
description: String names of fields to search. Correspond by index to search field values
examples:
- name
default: []
title: Search Fields
description: String names of fields to search. Correspond by index to search field values
- name: search_field_values
in: query
required: false
schema:
type: array
items:
type: string
description: Values of fields to search. Correspond by index to search fields. Unless field name contains "list", an individual search field value cannot be a list
examples:
- Some Object Name
default: []
title: Search Field Values
description: Values of fields to search. Correspond by index to search fields. Unless field name contains "list", an individual search field value cannot be a list
- name: order_by
in: query
required: false
schema:
anyOf:
- $ref: '#/components/schemas/AvailableTargetProperties'
- type: 'null'
description: The field whose value should be used to order the results
examples:
- name
title: Order By
description: The field whose value should be used to order the results
- name: order_by_direction
in: query
required: false
schema:
anyOf:
- $ref: '#/components/schemas/OrderByDirection'
- type: 'null'
description: The direction in which to order the results
title: Order By Direction
description: The direction in which to order the results
- name: fields
in: query
required: false
schema:
anyOf:
- type: array
items:
$ref: '#/components/schemas/AvailableTargetProperties'
- type: 'null'
description: The fields to include in the response
default: []
title: Fields
description: The fields to include in the response
- name: start_datetime
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: The start datetime for filtering results
examples:
- '2023-01-01T00:00:00Z'
title: Start Datetime
description: The start datetime for filtering results
- name: end_datetime
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: The end datetime for filtering results
examples:
- '2024-01-01T00:00:00Z'
title: End Datetime
description: The end datetime for filtering results
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ListResponse_AvailableTarget_'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
x-codeSamples:
- lang: python
label: Python (SDK)
source: "import os\nfrom syllable_sdk import SyllableSDK, models\n\n\nwith SyllableSDK(\n api_key_header=os.getenv(\"SYLLABLESDK_API_KEY_HEADER\", \"\"),\n) as ss_client:\n\n res = ss_client.channels.targets.available_targets(page=0, limit=25, search_fields=[\n models.AvailableTargetProperties.TARGET,\n ], search_field_values=[\n \"Some Object Name\",\n ], start_datetime=\"2023-01-01T00:00:00Z\", end_datetime=\"2024-01-01T00:00:00Z\")\n\n # Handle response\n print(res)"
- lang: typescript
label: Typescript (SDK)
source: "import { SyllableSDK } from \"syllable-sdk\";\n\nconst syllableSDK = new SyllableSDK({\n apiKeyHeader: process.env[\"SYLLABLESDK_API_KEY_HEADER\"] ?? \"\",\n});\n\nasync function run() {\n const result = await syllableSDK.channels.targets.availableTargets({\n page: 0,\n searchFields: [\n \"target\",\n ],\n searchFieldValues: [\n \"Some Object Name\",\n ],\n startDatetime: \"2023-01-01T00:00:00Z\",\n endDatetime: \"2024-01-01T00:00:00Z\",\n });\n\n console.log(result);\n}\n\nrun();"
/api/v1/channels/targets:
get:
tags:
- channels.targets
summary: Get Channel Targets
description: 'List channel targets for the current suborg.
Supports the standard `ListManager` filters via `search_fields`/`search_field_values`. In
addition to `target_mode` (single value), `target_mode_list` accepts a comma-separated list of
modes (e.g. `voice,sms`) and matches targets whose mode is any of the listed values. Whitespace
around tokens is tolerated and empty tokens are ignored. If both `target_mode` and
`target_mode_list` are supplied, the two filters are combined with AND. `target_mode_list` is
filter-only and cannot be used as `order_by`.'
operationId: channel_targets_list
security:
- APIKeyHeader: []
parameters:
- name: page
in: query
required: false
schema:
anyOf:
- type: integer
minimum: 0
- type: 'null'
description: The page number from which to start (0-based)
examples:
- 0
default: 0
title: Page
description: The page number from which to start (0-based)
- name: limit
in: query
required: false
schema:
type: integer
minimum: 0
description: The maximum number of items to return
examples:
- 25
default: 25
title: Limit
description: The maximum number of items to return
- name: search_fields
in: query
required: false
schema:
type: array
items:
$ref: '#/components/schemas/ChannelTargetProperties'
description: String names of fields to search. Correspond by index to search field values
examples:
- name
default: []
title: Search Fields
description: String names of fields to search. Correspond by index to search field values
- name: search_field_values
in: query
required: false
schema:
type: array
items:
type: string
description: Values of fields to search. Correspond by index to search fields. Unless field name contains "list", an individual search field value cannot be a list
examples:
- Some Object Name
default: []
title: Search Field Values
description: Values of fields to search. Correspond by index to search fields. Unless field name contains "list", an individual search field value cannot be a list
- name: order_by
in: query
required: false
schema:
anyOf:
- $ref: '#/components/schemas/ChannelTargetOrderProperties'
- type: 'null'
description: The field whose value should be used to order the results
examples:
- target
title: Order By
description: The field whose value should be used to order the results
- name: order_by_direction
in: query
required: false
schema:
anyOf:
- $ref: '#/components/schemas/OrderByDirection'
- type: 'null'
description: The direction in which to order the results
title: Order By Direction
description: The direction in which to order the results
- name: fields
in: query
required: false
schema:
anyOf:
- type: array
items:
$ref: '#/components/schemas/ChannelTargetProperties'
- type: 'null'
description: The fields to include in the response
default: []
title: Fields
description: The fields to include in the response
- name: start_datetime
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: The start datetime for filtering results
examples:
- '2023-01-01T00:00:00Z'
title: Start Datetime
description: The start datetime for filtering results
- name: end_datetime
in: query
required: false
schema:
anyOf:
- type: string
- type: 'null'
description: The end datetime for filtering results
examples:
- '2024-01-01T00:00:00Z'
title: End Datetime
description: The end datetime for filtering results
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ListResponse_ChannelTargetResponse_'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
x-codeSamples:
- lang: python
label: Python (SDK)
source: "import os\nfrom syllable_sdk import SyllableSDK, models\n\n\nwith SyllableSDK(\n api_key_header=os.getenv(\"SYLLABLESDK_API_KEY_HEADER\", \"\"),\n) as ss_client:\n\n res = ss_client.channels.targets.list(page=0, limit=25, search_fields=[\n models.ChannelTargetProperties.AGENT_ID,\n ], search_field_values=[\n \"Some Object Name\",\n ], order_by=models.ChannelTargetOrderProperties.TARGET, start_datetime=\"2023-01-01T00:00:00Z\", end_datetime=\"2024-01-01T00:00:00Z\")\n\n # Handle response\n print(res)"
- lang: typescript
label: Typescript (SDK)
source: "import { SyllableSDK } from \"syllable-sdk\";\n\nconst syllableSDK = new SyllableSDK({\n apiKeyHeader: process.env[\"SYLLABLESDK_API_KEY_HEADER\"] ?? \"\",\n});\n\nasync function run() {\n const result = await syllableSDK.channels.targets.list({\n page: 0,\n searchFields: [\n \"agent_id\",\n ],\n searchFieldValues: [\n \"Some Object Name\",\n ],\n orderBy: \"target\",\n startDatetime: \"2023-01-01T00:00:00Z\",\n endDatetime: \"2024-01-01T00:00:00Z\",\n });\n\n console.log(result);\n}\n\nrun();"
/api/v1/channels/{channel_id}/targets:
post:
tags:
- channels.targets
summary: Assign A Channel Target
operationId: channel_targets_create
security:
- APIKeyHeader: []
parameters:
- name: channel_id
in: path
required: true
schema:
type: integer
title: Channel Id
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ChannelTargetCreateRequest'
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ChannelTargetResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
x-codeSamples:
- lang: python
label: Python (SDK)
source: "import os\nfrom syllable_sdk import SyllableSDK, models\n\n\nwith SyllableSDK(\n api_key_header=os.getenv(\"SYLLABLESDK_API_KEY_HEADER\", \"\"),\n) as ss_client:\n\n res = ss_client.channels.targets.create(channel_id=824809, channel_target_create_request={\n \"agent_id\": 1,\n \"channel_id\": 1,\n \"target\": \"+19995551234\",\n \"target_mode\": models.TargetModes.EMAIL,\n \"fallback_target\": \"+19995551235\",\n \"is_test\": True,\n })\n\n # Handle response\n print(res)"
- lang: typescript
label: Typescript (SDK)
source: "import { SyllableSDK } from \"syllable-sdk\";\n\nconst syllableSDK = new SyllableSDK({\n apiKeyHeader: process.env[\"SYLLABLESDK_API_KEY_HEADER\"] ?? \"\",\n});\n\nasync function run() {\n const result = await syllableSDK.channels.targets.create({\n channelId: 824809,\n channelTargetCreateRequest: {\n agentId: 1,\n channelId: 1,\n target: \"+19995551234\",\n targetMode: \"email\",\n fallbackTarget: \"+19995551235\",\n isTest: true,\n },\n });\n\n console.log(result);\n}\n\nrun();"
/api/v1/channels/{channel_id}/targets/{target_id}:
get:
tags:
- channels.targets
summary: Get A Channel Target
operationId: channel_targets_get_by_id
security:
- APIKeyHeader: []
parameters:
- name: channel_id
in: path
required: true
schema:
type: integer
title: Channel Id
- name: target_id
in: path
required: true
schema:
type: integer
title: Target Id
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ChannelTargetResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
x-codeSamples:
- lang: python
label: Python (SDK)
source: "import os\nfrom syllable_sdk import SyllableSDK\n\n\nwith SyllableSDK(\n api_key_header=os.getenv(\"SYLLABLESDK_API_KEY_HEADER\", \"\"),\n) as ss_client:\n\n res = ss_client.channels.targets.get_by_id(channel_id=184507, target_id=235358)\n\n # Handle response\n print(res)"
- lang: typescript
label: Typescript (SDK)
source: "import { SyllableSDK } from \"syllable-sdk\";\n\nconst syllableSDK = new SyllableSDK({\n apiKeyHeader: process.env[\"SYLLABLESDK_API_KEY_HEADER\"] ?? \"\",\n});\n\nasync function run() {\n const result = await syllableSDK.channels.targets.getById({\n channelId: 184507,\n targetId: 235358,\n });\n\n console.log(result);\n}\n\nrun();"
put:
tags:
- channels.targets
summary: Edit Channel Target
description: Update channel target by ID
operationId: channel_targets_update
security:
- APIKeyHeader: []
parameters:
- name: channel_id
in: path
required: true
schema:
type: integer
title: Channel Id
- name: target_id
in: path
required: true
schema:
type: integer
title: Target Id
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ChannelTargetUpdateRequest'
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/ChannelTargetResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
x-codeSamples:
- lang: python
label: Python (SDK)
source: "import os\nfrom syllable_sdk import SyllableSDK, models\n\n\nwith SyllableSDK(\n api_key_header=os.getenv(\"SYLLABLESDK_API_KEY_HEADER\", \"\"),\n) as ss_client:\n\n res = ss_client.channels.targets.update(channel_id=508167, target_id=880236, channel_target_update_request={\n \"agent_id\": 1,\n \"channel_id\": 1,\n \"target\": \"+19995551234\",\n \"target_mode\": models.TargetModes.EMAIL,\n \"fallback_target\": \"+19995551235\",\n \"is_test\": True,\n \"id\": 1,\n })\n\n # Handle response\n print(res)"
- lang: typescript
label: Typescript (SDK)
source: "import { SyllableSDK } from \"syllable-sdk\";\n\nconst syllableSDK = new SyllableSDK({\n apiKeyHeader: process.env[\"SYLLABLESDK_API_KEY_HEADER\"] ?? \"\",\n});\n\nasync function run() {\n const result = await syllableSDK.channels.targets.update({\n channelId: 508167,\n targetId: 880236,\n channelTargetUpdateRequest: {\n agentId: 1,\n channelId: 1,\n target: \"+19995551234\",\n targetMode: \"email\",\n fallbackTarget: \"+19995551235\",\n isTest: true,\n id: 1,\n },\n });\n\n console.log(result);\n}\n\nrun();"
components:
schemas:
ToolHttpEndpoint:
properties:
url:
type: string
title: Url
description: The endpoint URL of the external service to call.
examples:
- https://api.example.com
method:
$ref: '#/components/schemas/ToolHttpMethod'
description: The HTTP method to use for the service call.
examples:
- get
argument_location:
$ref: '#/components/schemas/ToolArgumentLocation'
description: How to pass the arguments to the request.
examples:
- query
timeout:
anyOf:
- type: number
maximum: 120
minimum: 1
- type: 'null'
title: Timeout
description: Timeout in seconds for the HTTP request. Default 20 seconds when not set.
examples:
- 45.0
type: object
required:
- url
- method
- argument_location
title: ToolHttpEndpoint
description: The configuration for an HTTP API call by a tool.
LoadToolFromFileTask:
properties:
id:
anyOf:
- type: string
- type: 'null'
title: Id
description: A unique identifier for the task.
config:
anyOf:
- additionalProperties:
$ref: '#/components/schemas/JsonValue'
type: object
- type: 'null'
title: Config
variables:
anyOf:
- items:
$ref: '#/components/schemas/Variable'
type: array
- type: 'null'
title: Variables
metadata:
anyOf:
- $ref: '#/components/schemas/ContextTaskMetadata'
- type: 'null'
tool:
anyOf:
- $ref: '#/components/schemas/ContextToolInfo'
- type: 'null'
type:
type: string
const: import
title: Type
default: import
version:
type: string
const: v1alpha
title: Version
default: v1alpha
file:
anyOf:
- type: string
- items:
type: string
type: array
title: File
description: The local path of the tool definition JSON file.
type: object
required:
- file
title: LoadToolFromFileTask
description: Bootstraps a tool from a file (for internal developer use only if ENV.local=True).
JMESPathExpression:
properties:
expression:
type: string
title: Expression
description: JMESPath expression string.
examples:
- inputs.can_sign_consent == `true`
type:
type: string
enum:
- jp
- jmespath
title: Type
description: JMESPath expression language selector. Use with object form {"type":"jp"|"jmespath","expression":"..."}.
default: jp
type: object
required:
- expression
title: JMESPathExpression
description: 'JMESPath expression object.
Use this object form to explicitly mark JMESPath syntax:
{"type": "jp", "expression": "inputs.can_sign_consent == `true`"}
See https://jmespath.org/specification.html#grammar'
SayAction:
properties:
if:
anyOf:
- oneOf:
- $ref: '#/components/schemas/CelExpression'
- $ref: '#/components/schemas/JMESPathExpression'
discriminator:
propertyName: type
mapping:
cel: '#/components/schemas/CelExpression'
jmespath: '#/components/schemas/JMESPathExpression'
jp: '#/components/schemas/JMESPathExpression'
- $ref: '#/components/schemas/CaseExpression'
- type: string
- type: 'null'
title: If
description: 'Condition to decide whether this item executes. Supported expression forms: (1) JMESPath string (default for plain strings), (2) typed JMESPath object {"type":"jp"|"jmespath","expression":"..."}, or (3) typed CEL object {"type":"cel","expression":"..."}. Example JMESPath string: "inputs.can_sign_consent == `true`".'
examples:
- inputs.can_sign_consent == `true`
- expression: inputs.can_sign_consent == `true`
type: jp
- expression: inputs.can_sign_consent == true
type: cel
text:
type: string
title: Text
description: Text to apply if the condition is true.
action:
type: string
const: say
title: Action
default: say
role:
type: string
enum:
- user
- assistant
title: Role
description: The role of the message.
default: assistant
type: object
required:
- text
title: SayAction
ContextToolInfo:
properties:
name:
anyOf:
- type: string
- type: 'null'
title: Name
description: The name of the generated tool.
description:
anyOf:
- type: string
- type: 'null'
title: Description
description: The description of the tool.
type: object
title: ContextToolInfo
InputParameter:
properties:
name:
type: string
title: Name
description: The name of the property.
type:
anyOf:
- type: string
enum:
- string
- number
- integer
- boolean
- object
- array
- 'null'
- type: 'null'
title: Type
description:
anyOf:
- type: string
- type: 'null'
title: Description
title:
anyOf:
- type: string
- type: 'null'
title: Title
format:
anyOf:
- type: string
- type: 'null'
title: Format
pattern:
anyOf:
- type: string
- type: 'null'
title: Pattern
enum:
anyOf:
- items:
type: string
type: array
- type: 'null'
title: Enum
examples:
anyOf:
- items:
$ref: '#/components/schemas/JsonValue'
type: array
- type: 'null'
title: Examples
required:
type: boolean
title: Required
default: true
type: object
required:
- name
title: InputParameter
NextStep:
properties:
if:
anyOf:
- oneOf:
- $ref: '#/components/schemas/CelExpression'
- $ref: '#/components/schemas/JMESPathExpression'
discriminator:
propertyName: type
mapping:
cel: '#/components/schemas/CelExpression'
jmespath: '#/components/schemas/JMESPathExpression'
jp: '#/components/schemas/JMESPathExpression'
- $ref: '#/components/schemas/CaseExpression'
- type: string
- type: 'null'
title: If
description: 'Condition to decide whether this item executes. Supported expression forms: (1) JMESPath string (default for plain strings), (2) typed JMESPath object {"type":"jp"|"jmespath","expression":"..."}, or (3) typed CEL object {"type":"cel","expression":"..."}. Example JMESPath string: "inputs.can_sign_consent == `true`".'
examples:
- inputs.can_sign_consent == `true`
- expression: inputs.can_sign_consent == `true`
type: jp
- expression: inputs.can_sign_consent == true
type: cel
id:
type: string
title: Id
description: The identifier of the next step.
requires:
anyOf:
- items:
type: string
type: array
- type: 'null'
title: Requires
description: List of input field names required for this transition. Validates that specified inputs are collected before allowing transition.
type: object
required:
- id
title: NextStep
description: Represents a conditional transition to the next step.
AgentToolDefaults:
properties:
tool_name:
type: string
title: Tool Name
description: The name of the tool
examples:
- get_weather
default_values:
items:
$ref: '#/components/schemas/AgentToolFieldDefault'
type: array
title: Default Values
description: The default values for fields used in the tool
examples:
- - default_value: fahrenheit
field_name: temperature_unit
type: object
required:
- tool_name
- default_values
title: AgentToolDefaults
description: Agent-level static parameter values for a tool, overriding any tool-level defaults.
Variable:
properties:
value:
anyOf:
- $ref: '#/components/schemas/JsonValue'
- type: 'null'
description: Initial value of the variable.
valueFrom:
anyOf:
- oneOf:
- $ref: '#/components/schemas/CelExpression'
- $ref: '#/components/schemas/JMESPathExpression'
discriminator:
propertyName: type
mapping:
cel: '#/components/schemas/CelExpression'
jmespath: '#/components/schemas/JMESPathExpression'
jp: '#/components/schemas/JMESPathExpression'
- $ref: '#/components/schemas/CaseExpression'
- type: string
- type: 'null'
title: Valuefrom
description: 'Expression that computes the value. Supported expression forms: (1) JMESPath string (default for plain strings), (2) typed JMESPath object {"type":"jp"|"jmespath","expression":"..."}, or (3) typed CEL object {"type":"cel","expression":"..."}. Mutually exclusive with value.'
examples:
- inputs.provided_dob == patient_dob
- expression: inputs.provided_dob == patient_dob
type: jmespath
- expression: inputs.count + 1
type: cel
name:
type: string
title: Name
description: The name of the property.
type:
anyOf:
- type: string
enum:
- string
- number
- integer
- boolean
- object
- array
- 'null'
- type: 'null'
title: Type
description:
anyOf:
- type: string
- type: 'null'
title: Description
title:
anyOf:
- type: string
- type: 'null'
title: Title
format:
anyOf:
- type: string
- type: 'null'
title: Format
pattern:
anyOf:
- type: string
- type: 'null'
title: Pattern
enum:
anyOf:
- items:
type: string
type: array
- type: 'null'
title: Enum
examples:
anyOf:
- items:
$ref: '#/components/schemas/JsonValue'
type: array
- type: 'null'
title: Examples
type: object
required:
- name
title: Variable
StepsTask:
properties:
id:
anyOf:
- type: string
- type: 'null'
title: Id
description: A unique identifier for the task.
config:
anyOf:
- additionalProperties:
$ref: '#/components/schemas/JsonValue'
type: object
- type: 'null'
title: Config
variables:
anyOf:
- items:
$ref: '#/components/schemas/Variable'
type: array
- type: 'null'
title: Variables
metadata:
anyOf:
- $ref: '#/components/schemas/ContextTaskMetadata'
- type: 'null'
tool:
anyOf:
- $ref: '#/components/schemas/ContextToolInfo'
- type: 'null'
type:
type: string
const: steps
# --- truncated at 32 KB (129 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/syllable/refs/heads/main/openapi/syllable-channels-targets-api-openapi.yml