Presentations API
The Plus AI Presentations API allows you to create new presentations programatically via HTTP request. Creating presentations via the Presentations API is a two step process. First, you being presentation creation with a create request, and then you poll for the final presentation file using the presentations endpoint.
Authentication
To authenticate with the Presentations API, you must first generate an API key. You can generate an API key here. Note: Only one active API key per user is currently allowed. Once you have an API key, you can authenticate your requests to the presentations api using HTTP Bearer authentication:
Authorization: Bearer {PLUSAI_API_KEY}
Creating presentations via HTTP request
Creating presentations is done by sending a POST request to the presentations endpoint:
POST https://api.plusdocs.com/r/v0/presentation
The following content can be sent inside the body payload of the request:
Name
Required
Type
Description
prompt
Yes
string
The input text prompt and content for the presentation
language
No
string, ISO 639-1
Defaults to "en"
numberOfSlides
No
integer, <= 30
If not provided, will be determined by AI
includeUserTips
No
boolean
If set to false, Plus user tips will not be added to slides in presentation
templateId
No
string
Id of the custom template to create the presentation from. Contact us for information on using custom templates.
Example Request
curl \
-X POST \
-H "Content-Type: application/json" \
-H "authorization: Bearer $PLUSAI_API_TOKEN" \
-v \
-d '{"prompt": "a presentation about cows"}' \
https://api.plusdocs.com/r/v0/presentation
Response
The response from the create presentations endpoint will contain a polling endpoint that you can use to access your generated presentation when it finishes generating.
{
"pollingUrl": "https://api.plusdocs.com/r/v0/presentation/cmffgfzpa00027vidien49upq",
"status": "PROCESSING"
}
Polling for Generated Presentation
GET /v0/presentation/:presentationId
Poll this endpoint to check the progress of a presentation generation request. When the status field in the response returns as "GENERATED", your presentation file will be included in the request and ready to be downloaded.
Path Parameters
Name
Required
Type
Description
presentationId
Yes
string
The ID of the presentation generation request
Example Request
curl \
-X GET \
-H "Content-Type: application/json" \
-H "authorization: Bearer $PLUSAI_API_TOKEN" \
https://api.plusdocs.com/r/v0/presentation/cmffj17kx0002snyqykn2my2x
Response
{
"createdAt": "2025-09-11T14:51:46.977Z",
"id": "cmffj17kx0002snyqykn2my2x",
"language": "en",
"slides": null,
"status": "PROCESSING",
"updatedAt": "2025-09-11T14:52:43.195Z",
"url": null
}
{
"createdAt": "2025-09-11T14:51:46.977Z",
"id": "cmffj17kx0002snyqykn2my2x",
"language": "en",
"slides": [
"The History of Cows",
"Contents",
"Origins of Cows",
"Ancient Uses of Cows",
"Cows in Different Cultures",
"Modern Cattle Breeding",
"Economic Impact of Cows",
"Environmental Considerations",
"Future of Cattle Farming",
"Summary and Conclusion",
"Thank You"
],
"status": "GENERATED",
"updatedAt": "2025-09-11T14:52:43.195Z",
"url": "https://d2q8qai8hhcosn.cloudfront.net/3245870997/organization/cmffd8fk8000112le1tnx5osw/presentation/cmffj17kx0002snyqykn2my2x/pptx/presentation-84815c3a-2307-40fc-93c9-2f5776778d00.pptx"
}
Polling for all Generated Presentations
GET /v0/presentations
Poll this endpoint to retrieve all generated presentations you have created via the Presentations API.
Note: This endpoint currently only shows the last 100 generated presentations.
Example Request
curl \
-X GET \
-H "Content-Type: application/json" \
-H "authorization: Bearer $PLUSAI_API_TOKEN" \
https://api.plusdocs.com/r/v0/presentations
Response
{
"presentations": [
{
"id": "cmffj17kx0002snyqykn2my2x",
"name": "A brief history of cows",
"status": "GENERATED",
"url": "https://d2q8qai8hhcosn.cloudfront.net/3245870997/organization/cmffd8fk8000112le1tnx5osw/presentation/cmffj17kx0002snyqykn2my2x/pptx/presentation-84815c3a-2307-40fc-93c9-2f5776778d00.pptx"
},
{
"id": "cmffgfzpa00027vidien49upq",
"name": "Dinsoaurs: A look into the past",
"status": "GENERATED",
"url": "https://d2q8qai8hhcosn.cloudfront.net/3245870997/organization/cmffd8fk8000112le1tnx5osw/presentation/cmffgfzpa00027vidien49upq/pptx/presentation-84815c3a-2307-40fc-93c9-293jh45kj00.pptx"
},
]
}
Code Samples
cURL Example (Presentation Creation + Polling)
PLUSAI_API_TOKEN="YOUR_TOKEN_HERE" \
PROMPT="the history of cows" \
payload=$(jq -n --arg prompt "$PROMPT" '{prompt:$prompt}'); \
polling_url=$(curl -s -X POST \
-H "authorization: Bearer $PLUSAI_API_TOKEN" \
-H "Content-Type: application/json" \
https://api.plusdocs.com/r/v0/presentation \
-d "$payload" | jq -r '.pollingUrl'); \
while :; do \
resp=$(curl -s -H "authorization: Bearer $PLUSAI_API_TOKEN" "$polling_url"); \
status=$(echo "$resp" | jq -r '.status'); \
if [ "$status" = "GENERATED" ]; then \
echo "$resp" | jq; \
break; \
elif [ "$status" = "FAILED" ]; then \
echo "$resp" | jq; \
exit 1; \
else \
sleep 5; \
fi; \
done
Python Example (Presentation Creation + Polling)
import time
import requests
API_BASE_URL = "https://api.plusdocs.com/r/v0"
PLUSAI_API_TOKEN = "YOUR_TOKEN_HERE"
def create_request(
prompt: str,
retry: int = 0,
backoff_delay: float = 1.5,
) -> tuple[str, str]:
request = requests.post(
f"{API_BASE_URL}/presentation",
headers={
"accept": "application/json",
"authorization": f"Bearer {PLUSAI_API_TOKEN}",
"Content-Type": "application/json",
},
json={
"prompt": prompt,
},
)
if request.status_code == 429:
if retry >= 3:
raise Exception(
f"Plus AI API request retries exhausted {request.status_code}: {request.text}"
)
delay = backoff_delay * (2**retry) # Exponential backoff
print(f"Rate limit exceeded, retrying in {delay} seconds...")
time.sleep(delay)
return create_request(prompt, retry + 1, backoff_delay * 2)
if request.status_code not in [200, 201, 429]:
raise Exception(
f"Plus AI API request failed with status code {request.status_code}: {request.text}"
)
data = request.json()
request_id = data["id"]
polling_url = data["pollingUrl"]
return request_id, polling_url
def poll_for_result(
request_id: str, polling_url: str, timeout: int = 300, wait_time: int = 5
) -> str | None:
start_time = time.time()
while True:
time.sleep(wait_time)
elapsed_time = time.time() - start_time
if elapsed_time > timeout:
print(
f"Polling timed out after {timeout} seconds for request {request_id}."
)
return None
print(f"Polling for result of generation request {request_id} ...")
result = requests.get(
polling_url,
headers={
"accept": "application/json",
"authorization": f"Bearer {PLUSAI_API_TOKEN}",
},
params={"id": request_id},
).json()
if result["status"] == "GENERATED":
print(
f"Generation request {request_id} completed in {time.time() - start_time:.2f} seconds."
)
return result["url"]
elif result["status"] in ["FAILED"]:
print(f"Generation failed: {result}")
return None
def generate_presentation(prompt: str) -> str | None:
request_id, polling_url = create_request(prompt=prompt)
time.sleep(30)
pptx_url = poll_for_result(request_id, polling_url)
if not pptx_url:
print("No result returned from the generation request.")
return None
return pptx_url
generate_presentation(
"Create a presentation about the history of the internet."
)
Rate Limits and Restrictions
The Presentations API is currently in beta, and has a rate limit of 3 presentation creation requests a minute.
Last updated
Was this helpful?