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

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-TypeYesMust be application/json

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"
    }
  }'

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