Felo API PlatformFelo API Platform

Configure Harness

PPT Task API

Create PPT generation tasks, list themes, and poll shared task endpoints.

POST/v2/ppts

Authentication

Bearer API key

Content type

application/json

Rate notes

Endpoint-specific limits may apply.

The PPT Task API provides asynchronous PPT generation capabilities. You can create a task and then poll task status by task_id. You can also browse available PPT themes and apply them when creating tasks.

Authentication

All requests require an API Key in the Authorization header:

Authorization: Bearer YOUR_API_KEY

Use with AI Agents

To create slides from an Agent, install the complete felo-ai package rather than a fixed subset of Skills. Its installer dynamically discovers every package directory containing SKILL.md, including the PPT Skill and future additions. Install all discovered Skills in the native directory for your Agent: Codex ~/.codex/skills, Claude Code ~/.claude/skills, OpenClaw ~/.agents/skills, or Hermes Agent ~/.hermes/skills. Follow the manual AI Agent setup guide for platform-specific API key configuration and verification.

1. List PPT Themes

Query available PPT themes with pagination, keyword search, language and type filtering.

Endpoint

GET https://openapi.felo.ai/v2/ppt-themes

Query Parameters

ParameterTypeRequiredDescription
langstringNoLanguage code for localized content (e.g. en, zh-Hans). Default: en
typestringNoFilter by theme type (e.g. default, custom)
keywordstringNoSearch keyword, matches theme titles
pageintegerNoPage number, starting from 1. Default: 1
sizeintegerNoPage size, max 100. Default: 20

Example

curl -X GET 'https://openapi.felo.ai/v2/ppt-themes?lang=en&page=1&size=10' \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer YOUR_API_KEY'

Success Response (200)

{
  "status": "ok",
  "message": null,
  "data": {
    "total": 8,
    "page": 1,
    "size": 10,
    "items": [
      {
        "id": "43122897-0d3c-4c9e-ae19-20527ad36c04",
        "title": "Inspiration Themes",
        "subtitle": "AI-tailored visual solutions",
        "description": "Style and layout, both crafted by AI from your content in real time"
      }
    ]
  }
}

Theme Response Fields

FieldTypeDescription
totalintegerTotal number of themes matching the filter
pageintegerCurrent page number
sizeintegerPage size
itemsarrayList of theme objects
items[].idstringTheme ID, use this as ai_theme_id when creating PPT
items[].titlestringTheme title (localized)
items[].subtitlestringTheme subtitle (localized)
items[].descriptionstringTheme description (localized)

2. Create PPT Task

Endpoint

POST https://openapi.felo.ai/v2/ppts

Request Headers

HeaderRequiredDescription
AuthorizationYesYour API Key in the format Bearer YOUR_API_KEY
Content-TypeYesapplication/json or multipart/form-data

Request Body

ParameterTypeRequiredDescription
querystringYesPPT generation request prompt
livedoc_short_idstringNoExisting LiveDoc short ID to associate with the PPT session. If omitted, a new LiveDoc is created automatically.
resource_idsarray of stringsNoList of LiveDoc resource IDs to use as context for PPT generation
ppt_configobjectNoPPT configuration options
ppt_config.ai_theme_idstringNoTheme ID from the List PPT Themes endpoint

Example

curl -X POST 'https://openapi.felo.ai/v2/ppts' \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "query": "Felo, 2 pages",
    "ppt_config": {
      "ai_theme_id": "02968979-a69f-42c4-b136-de02c40ab2d7"
    }
  }'

Create from an Uploaded File

Use multipart/form-data to upload one file and create a PPT task in a single request. The platform uploads the file as a LiveDoc resource first, then passes its resource ID to the PPT task.

PartTypeRequiredDescription
querystringYesPPT generation request prompt
filefileYesSource file used as PPT context
stream_protocolstringNoStreaming protocol; defaults to message_center_v1
livedoc_short_idstringNoExisting LiveDoc to receive the file. A new LiveDoc is created when omitted.
ppt_configJSONNoPPT configuration with the same structure as the JSON request body. Send this part as application/json.
curl -X POST 'https://openapi.felo.ai/v2/ppts' \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -F 'query=Create a 10-page presentation based on this report' \
  -F 'ppt_config={"ai_theme_id":"02968979-a69f-42c4-b136-de02c40ab2d7"};type=application/json' \
  -F '[email protected]'

The response uses the same schema as the JSON request. The returned livedoc_short_id identifies the LiveDoc containing the uploaded resource.

Success Response (200)

{
  "status": "ok",
  "message": null,
  "data": {
    "livedoc_short_id": "PvyKouzJirXjFdst4uKRK3",
    "ppt_business_id": "BfLPuQKmChk9SPmyQawxgr",
    "task_id": "019cad6d-e874-55ef-d577-686344b5a7e9"
  }
}

3. Query Task Status

Endpoint

GET https://openapi.felo.ai/v2/tasks/{task_id}/status

Example

curl -X GET 'https://openapi.felo.ai/v2/tasks/019cad6d-e874-55ef-d577-686344b5a7e9/status' \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer YOUR_API_KEY'

Success Response (200)

{
  "status": "ok",
  "message": null,
  "data": {
    "status": "RUNNING"
  }
}

4. Query Task Historical Info

Endpoint

GET https://openapi.felo.ai/v2/tasks/{task_id}/historical

Example

curl -X GET 'https://openapi.felo.ai/v2/tasks/019cb17e-9e23-3d40-4447-48a651249460/historical' \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer YOUR_API_KEY'

RUNNING Response

{
  "status": "ok",
  "message": null,
  "data": {
    "task_id": "019cb17e-9e23-3d40-4447-48a651249460",
    "task_status": "RUNNING",
    "ppt_biz_id": "oM8A9iJHg8dT4ZKgHThQTx",
    "ppt_url": "https://felo.ai/slides/oM8A9iJHg8dT4ZKgHThQTx"
  }
}

COMPLETED Response

{
  "status": "ok",
  "message": null,
  "data": {
    "task_id": "019cb17e-9e23-3d40-4447-48a651249460",
    "task_status": "COMPLETED",
    "ppt_biz_id": "oM8A9iJHg8dT4ZKgHThQTx",
    "ppt_url": "https://felo.ai/slides/oM8A9iJHg8dT4ZKgHThQTx",
    "live_doc_short_id": "oM8A9iJHg8dT4ZKgHThQTx",
    "live_doc_url": "https://felo.ai/livedoc/oM8A9iJHg8dT4ZKgHThQTx"
  }
}

COMPLETED Response (AI_PAGE)

{
  "status": "ok",
  "message": null,
  "data": {
    "task_id": "019d7a4d-6ab5-a96d-0f98-43ca434ab621",
    "task_status": "COMPLETED",
    "ppt_biz_id": "9qiLTmT77fA3aVurrMHvRJ",
    "ppt_url": "https://felo.ai/slides/9qiLTmT77fA3aVurrMHvRJ",
    "ai_page_html": "https://felo.ai/ai-page/9qiLTmT77fA3aVurrMHvRJ"
  }
}

FAILED / PENDING / EXPIRED / CANCELED Response

{
  "status": "ok",
  "message": null,
  "data": {
    "task_id": "019cb17e-9e23-3d40-4447-48a651249460",
    "task_status": "FAILED",
    "ppt_biz_id": "oM8A9iJHg8dT4ZKgHThQTx",
    "ppt_url": "https://felo.ai/slides/oM8A9iJHg8dT4ZKgHThQTx",
    "error_message": "PPT generation failed",
    "live_doc_short_id": "oM8A9iJHg8dT4ZKgHThQTx",
    "live_doc_url": "https://felo.ai/livedoc/oM8A9iJHg8dT4ZKgHThQTx"
  }
}

Historical Response Fields

FieldTypeDescription
task_idstringTask ID
task_statusstringCurrent task status
ppt_biz_idstringPPT business ID (mapped from backend thread_short_id)
ppt_urlstringPPT URL, format: https://felo.ai/slides/{ppt_biz_id}
error_messagestringPresent for FAILED / PENDING / EXPIRED / CANCELED; empty string "" when downstream does not provide error details
ai_page_htmlstringPresent when the task runs in AI_PAGE mode and downstream historical returns an HTML result URL
live_doc_short_idstringLiveDoc short ID. For COMPLETED it comes from downstream live_doc_short_id; for terminal failure statuses it is returned when available
live_doc_urlstringLiveDoc URL corresponding to live_doc_short_id

Polling Recommendation

Use task_id from create response and poll status every 2-5 seconds until the status becomes a terminal state.

Common status examples:

  • RUNNING: task is still processing
  • COMPLETED: task completed successfully
  • FAILED / PENDING / EXPIRED / CANCELED: task reached terminal status with error_message; live_doc_url is also returned when available

Unknown status values may appear as backend evolves; treat them as non-terminal unless documented otherwise.

Error Codes

CodeHTTP StatusDescription
INVALID_API_KEY401API Key is invalid or revoked
PPT_TASK_CREATE_FAILED502Create task downstream call failed
PPT_TASK_QUERY_FAILED502Query task status downstream call failed