Create a skill
Adds a new skill to an agent so it can perform an action, such as sending an email or booking an appointment, during conversations. Publish the agent for the new skill to take effect on live calls and chats.
Authorizations
Flowyte secret API key (Authorization: Bearer flowyte_sk_live_…). Scope-gated; is scoped to your organization — a key can never reach another tenant. The listed scopes in each operation's apiKey requirement are the scopes that key must hold. The tokenUrl is nominal: keys are minted in the dashboard.
Headers
Client-supplied idempotency key on mutating POSTs (API-First).
Path Parameters
Body
db_query, http_webhook, transfer, sms, email, calendar, google_sheets, crm, mcp, playbook, knowledge_query, builtin, geo, native_graphql, native_rest, native_sql JSON Schema for the values the agent COLLECTS from the caller during the conversation. MUST be a JSON Schema object of the form { "type": "object", "properties": { "<param_name>": { "type": "string|number|boolean", "description": "..." }, ... }, "required": ["<param_name>", ...] } — an object with a top-level "properties" map, NOT a bare/flat map of param->spec. Put ONLY caller-collected inputs here; operator settings (e.g. an email skill's to/subject/from_name) belong in executionConfig, never here.
two_way, one_way Skill-type-specific operator settings (NOT the caller-collected values — those go in parametersSchema). Keys depend on skillType: email — { to: recipient email(s), comma-separated, REQUIRED, supports {param} templating e.g. "team@co.com" or "{customer_email}"; subject: REQUIRED, supports {param}; from_name: optional inbox display name (the address is always the verified no-reply@ sender, never set it here); intro: optional lead line; reply_to: optional, supports {param} e.g. "{customer_email}" }. http_webhook — { url (REQUIRED), method, headers, timeout_ms }. db_query — { sql_template }. transfer — { destination }. builtin — { action: end_call|take_message|repeat }. geo — { action: check_service_area|find_nearest_location; for check_service_area: origin_address + radius_miles (is the caller within radius_miles of origin_address?); for find_nearest_location: roster = an array of { label, address, phone, lat?, lng? } locations to find the closest of (pre-geocode a large roster via POST /agents/{id}/geocode-roster so lat/lng are stored and routing is instant), plus optional route_by_caller_number:true to route from the caller's inbound-number area code (approximate — confirmed with the caller) when no address is given, plus optional radius_miles to gate coverage (each location covers that many miles, so the result carries in_service_area=false and the agent says it doesn't serve the area when the nearest location is farther) }. The LLM passes the caller's { address }. Geo is FREE to customers. Native-integration skills (calendar/google_sheets/shopify) are configured via the connect/provision flow, not here.
none, basic, step_up Open enum (future sms|whatsapp|email slot in with no schema change).
voice, chat Per-skill confirmation-gate hint the voice runtime reads defensively. Default low.
low, medium, high Per-skill availability — both (default), open (business hours only), or closed (after hours only).
both, open, closed