Simplo Generate API
The Generate API from Simplo — 3 operation(s) for generate.
The Generate API from Simplo — 3 operation(s) for generate.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/getsimplo-ai:getsimplo-ai-generate-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Simplo Generate API
version: 1.0.0
servers:
- url: https://api.getsimplo.ai/v1
security:
- apiKey: []
tags:
- name: Generate
paths:
/generate/captions:
post:
operationId: generateCaptions
summary: Generate caption ideas
description: On-brand post ideas (hook, caption, hashtags, image prompt) for a topic, saved as a research session. Costs credits. Needs a completed brand profile.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
projectId:
type: string
description: The project whose brand the ideas follow.
topic:
type: string
minLength: 1
description: What the posts are about.
platforms:
description: Shape the ideas for these platforms.
type: array
items:
type: string
enum:
- instagram
- tiktok
- facebook
limit:
description: How many ideas, 1 to 10.
type: integer
minimum: 1
maximum: 10
required:
- projectId
- topic
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
properties:
reply:
type: string
ideas:
type: array
items:
type: object
properties: {}
additionalProperties: {}
required:
- ideas
additionalProperties: false
'400':
description: 'The request is not valid. Error code: validation_error.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'401':
description: 'Missing or invalid API key. Error code: invalid_api_key.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'402':
description: 'Not enough credits. Error code: insufficient_credits.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: 'Not allowed. Error code: subscription_inactive.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: 'Not found. Error code: not_found.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: 'Too many requests. Error code: rate_limited.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
headers:
Retry-After:
description: Seconds to wait before retrying.
schema:
type: integer
'500':
description: 'Something went wrong on our side. Error code: internal_error.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'502':
description: 'A platform or AI provider failed. Error code: upstream_error.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
x-costs-credits: true
tags:
- Generate
/generate/image:
post:
operationId: generateImage
summary: Generate images
description: On-brand images for a post, saved to the project's image history. Costs credits (more for more images). Style "ad-layout" sets real type over a photo; other styles draw text badly. Every model tier currently runs as "standard".
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
projectId:
type: string
description: The project whose brand the images follow.
prompt:
type: string
minLength: 1
description: What the image shows.
format:
default: instagram-portrait
description: 'The picture''s size. instagram-portrait (4:5) is the default: Instagram''s profile grid shows posts as 3:4, which cuts the sides of a square.'
type: string
enum:
- instagram-post
- instagram-story
- instagram-portrait
- tiktok
- x-post
- facebook-post
- facebook-cover
style:
default: studio
type: string
enum:
- ad-layout
- studio
- candid
- cinematic
- retro-film
- flat-illustration
- hand-drawn
- render-3d
- bold-type
- minimal
adBackground:
default: image
type: string
enum:
- image
- brand
modelTier:
default: standard
type: string
enum:
- fast
- standard
- premium
imageCount:
default: 1
description: How many images, 1 to 4. Each one costs credits.
type: integer
minimum: 1
maximum: 4
includeLogo:
default: false
type: boolean
required:
- projectId
- prompt
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
properties:
generationId:
type: string
style:
type: string
format:
type: string
imageUrls:
type: array
items:
type: string
required:
- generationId
- style
- format
- imageUrls
additionalProperties: false
'400':
description: 'The request is not valid. Error code: validation_error.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'401':
description: 'Missing or invalid API key. Error code: invalid_api_key.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'402':
description: 'Not enough credits. Error code: insufficient_credits.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: 'Not allowed. Error code: subscription_inactive.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: 'Not found. Error code: not_found.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: 'Too many requests. Error code: rate_limited.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
headers:
Retry-After:
description: Seconds to wait before retrying.
schema:
type: integer
'500':
description: 'Something went wrong on our side. Error code: internal_error.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'502':
description: 'A platform or AI provider failed. Error code: upstream_error.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
x-costs-credits: true
tags:
- Generate
/generate/carousel:
post:
operationId: generateCarousel
summary: Generate a carousel
description: 'Writes and draws an Instagram carousel about a topic and saves it as a draft post. Costs credits: the slide copy, plus each picture when pictures are on. It is never published or scheduled here. A slide in overflowSlides has more text than fits. If saving the draft fails after the slides were drawn, the answer is 502 with the slide URLs in details.slides: those slides are paid for, so use the URLs rather than retrying (a retry with the same Idempotency-Key gets the same answer).'
parameters:
- name: Idempotency-Key
in: header
required: false
description: Up to 255 characters. Repeating a request with the same key within 24 hours returns the first answer instead of doing the work again.
schema:
type: string
maxLength: 255
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
projectId:
type: string
description: The project that owns the carousel.
topic:
type: string
minLength: 1
description: What the carousel is about.
slideCount:
default: 5
description: How many slides, 2 to 10.
type: integer
minimum: 2
maximum: 10
style:
type: string
enum:
- editorial
- clean
- boldPhoto
- dark
pictures:
default: false
description: Draw a picture on each slide. Costs extra credits.
type: boolean
caption:
description: The post text; written for you when left out.
type: string
scheduledAt:
type: string
format: date-time
description: 'ISO 8601 with UTC offset. Scheduling needs a future whole hour; a draft''s date isn''t checked until it is scheduled. localTime with timeZone is safer: the server works out the offset.'
localTime:
description: The time on the user's clock, YYYY-MM-DDTHH:MM with no offset (e.g. 2026-11-09T12:00), with timeZone. The server resolves the UTC offset in force on that date; a time the clocks skip or pass twice is refused with invalid_schedule_time. Not together with scheduledAt.
type: string
pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(:\d{2})?$
timeZone:
description: An IANA time zone, e.g. America/Edmonton. Needed with localTime; with scheduledAt it only sets the zone scheduledLocal is given in.
type: string
replacesPostId:
description: 'A draft this carousel replaces: the new carousel takes its day in the plan (unless a time is given) and the old draft is deleted. Only a draft that never went out can be replaced.'
type: string
goal:
description: 'With a style: "tips" teaches and closes on a save; "promo" sells and closes on the brand''s offer. Read from the topic when left out.'
type: string
enum:
- tips
- promo
required:
- projectId
- topic
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
properties:
postId:
type: string
status:
type: string
enum:
- draft
- draft_scheduled
- scheduled
- published
- partially_published
- failed
- missed
caption:
type: string
slides:
type: array
items:
type: object
properties:
number:
type: number
imageUrl:
type: string
text:
type: string
required:
- number
- imageUrl
additionalProperties: false
overflowSlides:
type: array
items:
type: number
creditsRefunded:
type: number
scheduledAt:
description: The day the draft sits on in the plan, when it has one.
type: string
scheduledLocal:
type: object
properties:
localTime:
type: string
description: YYYY-MM-DDTHH:MM on that zone's clock.
weekday:
type: string
timeZone:
type: string
utcOffset:
type: string
description: The offset in force then, e.g. -06:00.
required:
- localTime
- weekday
- timeZone
- utcOffset
additionalProperties: false
description: 'Present when the request named a timeZone and the post has a time: check it against what was meant.'
possibleDuplicateOf:
description: Another planned post within 14 days that opens the same way.
type: string
replaced:
description: 'With replacesPostId: whether the old draft was deleted.'
type: boolean
required:
- postId
- status
- caption
- slides
additionalProperties: false
'400':
description: 'The request is not valid. Error code: validation_error.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'401':
description: 'Missing or invalid API key. Error code: invalid_api_key.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'402':
description: 'Not enough credits. Error code: insufficient_credits.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'403':
description: 'Not allowed. Error code: subscription_inactive.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'404':
description: 'Not found. Error code: not_found.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'409':
description: 'Conflict with the current state. Error code: idempotency_in_progress.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'422':
description: 'Idempotency-Key reused with a different request. Error code: idempotency_key_reused.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
description: 'Too many requests. Error code: rate_limited.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
headers:
Retry-After:
description: Seconds to wait before retrying.
schema:
type: integer
'500':
description: 'Something went wrong on our side. Error code: internal_error.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'502':
description: 'A platform or AI provider failed. Error code: upstream_error.'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
x-costs-credits: true
tags:
- Generate
components:
schemas:
Error:
type: object
required:
- error
properties:
error:
type: object
required:
- code
- message
properties:
code:
type: string
enum:
- invalid_api_key
- forbidden
- not_found
- validation_error
- invalid_schedule_time
- platform_not_available
- already_published
- publishing_in_progress
- conflict
- idempotency_key_reused
- idempotency_in_progress
- insufficient_credits
- subscription_inactive
- video_too_large
- file_too_large
- upload_link_invalid
- rate_limited
- upstream_error
- internal_error
description: A stable machine-readable code, e.g. validation_error.
message:
type: string
description: A human-readable explanation.
details:
description: Extra context, such as the failing fields of a validation_error.
securitySchemes:
apiKey:
type: http
scheme: bearer
description: smp_live_… key from Settings → API keys
x-provenance:
method: harvested
publisher: Simplo
source: https://getsimplo.ai/openapi.json
note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
stamped by stamp-openapi-provenance.py (roadmap#793)