Search skmtc…
⌘K
Docs
Sign in
APIs
Generators
Stacks
Projects
Docs
History
Schema
Generate
Filter operations
get
/api/me
Who am I: account, plan, credit balance.
get
/api/me/email
Whether lifecycle email (posts ready, weekly summary) is on, and the last emails we sent this account.
put
/api/me/email
Body { lifecycle: true | false }: turn lifecycle email on or off. A notice that a post failed to publish always arrives.
get
/api/wiki/identity
The public owner this key writes as on the wiki at /vizipedia: a stable id and a handle, never an email. The wiki calls it with the caller's own key. A key with `write` passes too; a key still waiting for its person gets 401 with `activate`, the link where that person claims it.
get
/api/platforms
Every platform the rail posts to: limits, media rules, settings schema, first-comment support.
get
/api/openapi.json
This document.
get
/api/ai-tools
Every live listing as JSON: slug, page, homepage, tagline, description, categories, surfaces, hosts, pricing, verified (badge on the maker's homepage), agentReady (the MCP/OpenAPI/llms.txt documents the maker's domain proved). Counts as an agent read on every row.
get
/api/ai-tools/requirements
What a listing must be: fields, limits, the category/surface/host vocabularies, the steps in order, and what only the human may supply.
get
/api/ai-tools/stats
The directory's own numbers, dated: live and waiting listings, verified and agent-ready counts, views, outbound clicks and agent reads in the last 7 days, last badge sweep.
post
/api/ai-tools/preview
{homepage}: read the site and draft the listing (name, tagline, description, proven surfaces, icon); says if the site is already listed. No row is written.
post
/api/ai-tools/submit
Submit one listing per site for a person to review. Submitting accepts the directory terms at /ai-tools/terms, never the service terms: an agent tells the maker first. Answers the page, a claimToken (keep it), the badge HTML, the terms URL and the next steps. The maker's email is required: an agent asks the human for it.
get
/api/ai-tools/{slug}
One listing as JSON. With the claim token as bearer, the maker's own row (any status) with badge and link state; otherwise a live row only.
patch
/api/ai-tools/{slug}
Correct a listing still waiting for review (claim token as bearer): name, tagline, description, categories, surfaces, hosts, pricing, priceNote.
post
/api/ai-tools/{slug}/verify
Read the maker's homepage now: badge found, followed, rel, a hint when missing, which agent surfaces the domain proves, our link's rel, and what to do next. Claim token as bearer for a listing in review; anyone for a live one, once a minute.
get
/api/ai-tools/{slug}/stats
?days=30 (max 90): page views, clicks through to the maker and agent reads per day, with the badge state. Claim token as bearer.
post
/api/ai-tools/{slug}/click
The beacon the listing page sends on a click through to the maker; always 204.
get
/api/capabilities
Everything Shapeless can do, live or planned, with the route, CLI verb and MCP tool for each. A planned one carries its want door and how many wait on it.
get
/api/tools
Every agent tool this deployment serves on its own: name, description, JSON Schema input, default price. The same tools the studio agent holds.
post
/api/tools/{name}
Run one tool: the body is its input (schema on GET /api/tools) plus optional budgetUsd (default 2, max 10). Answers {tool, output, media[{key, url}], chargedUsd}.
post
/api/images
Generate an image (tool generate_image): {name, prompt, aspectRatio, size?, quality?, reference_keys?, budgetUsd?}.
post
/api/videos/generate
Generate AI footage (tool generate_footage): {name, prompt, duration_seconds?, aspect?, resolution?, with_audio?, budgetUsd?}.
post
/api/videos/edit
Edit a video you uploaded (tool edit_footage): cut, reframe, cutout, captions, music, overlays. Schema on GET /api/tools.
post
/api/videos/demo
Record a product demo of a page (tool demo_page). Schema on GET /api/tools.
post
/api/carousels
Render a carousel to PDF plus slide PNGs (tool render_carousel). Schema on GET /api/tools.
post
/api/speech
Text to speech (tool speak): {text (<= 2000 chars), voice? (Sulafat, Charon, Kore, Achird, Erinome, Schedar), character? (id or slug, reads in its voice), energy? (calm|confident|energetic|hype), style?, name?, budgetUsd?}. Output mediaKey is a WAV.
post
/api/captions
Subtitle file (tool caption_file): {media_key, format? (srt|vtt, default srt), names? ("ShapelessAI, shapelessai.com")}. Output: captionsKey plus the file text inline. Free.
post
/api/thumbnails
A frame of a video plus words (tool render_thumbnail). Schema on GET /api/tools.
post
/api/capabilities/{id}/want
Tell me when this ships. A bearer key of any scope binds it to the account (told at its sign-in email); otherwise send {email} or {webhookUrl}. A live capability answers 200 with its routes.
get
/api/connections
Connected social accounts (identity only, never tokens).
delete
/api/connections
Disconnect an account (?id=). Ends our ability to publish there, so it costs publish.
post
/api/connections/link
The one URL the human opens to connect a social account: {platform}. Lasts 15 minutes, works only signed in as this account; the platform's own OAuth follows.
patch
/api/connections/{id}
Move an account into a group: {groupId} or null for ungrouped.
get
/api/connections/{id}/tiktok-creator-info
TikTok's creator info for that connection: privacy levels, limits. Read it before every TikTok post; TikTok forbids caching it.
post
/api/connections/tracked
Track an account by handle, no OAuth, never a publish target: {platform, handle, followers?}.
get
/api/groups
Account groups.
post
/api/groups
Create a group: {name, color?}.
patch
/api/groups
Reorder groups: {orderedIds}.
delete
/api/groups/{id}
Delete a group; its accounts become ungrouped.
patch
/api/groups/{id}
Rename or recolor a group.
get
/api/connections/{id}/queue
The account's queue: posting slots, timezone, and the next free slot.
patch
/api/connections/{id}/queue
Set the posting slots and timezone.
get
/api/posts
The queue: proposed, scheduled, published. ?status= and ?limit= narrow it.
post
/api/posts
Queue a post: at a time, in the next free queue slot, or now.
get
/api/posts/cap
The Free plan's day: how many posts already go out on the UTC day ?at= falls on, and the cap. Paid plans answer { cap: null }.
get
/api/posts/{id}
One post's live state.
delete
/api/posts/{id}
Cancel a scheduled or proposed post.
patch
/api/posts/{id}
Edit a still-scheduled post: time, text, media, settings, first comment, or the target account (same platform).
post
/api/posts/{id}/approve
Approve one proposal: proposed -> scheduled.
post
/api/posts/{id}/publish
Publish a queued post now.
post
/api/posts/{id}/mark-posted
Record that you posted it yourself.
post
/api/posts/{id}/revise
Rework a draft from feedback.
post
/api/posts/{id}/boost
Propose a paid boost of a published Meta post.
get
/api/posts/{id}/comments
The thread under a published post, with each drafted reply.
post
/api/posts/{id}/comments
Stage your own reply to one comment.
post
/api/posts/{id}/comments/refresh
Read the thread from the platform now.
post
/api/posts/resolve
Resolve posts: {ids, verb: approve|dismiss}. Approve takes proposed posts; dismiss cancels proposed, scheduled, failed or handed-off ones. Dismiss costs write.
get
/api/inbox
Everything waiting on a human decision.
get
/api/v1/jobs
Jobs with liveness, one page.
post
/api/v1/jobs
Start a durable job from a goal: {goal, label?, budgetUsd?, timezone?, attachments?, characters?}.
get
/api/v1/jobs/{id}
One job: transcript, status, outputs.
post
/api/v1/jobs/{id}/messages
Another turn on the job.
post
/api/v1/jobs/{id}/run
Run the job's newest proposed plan, as the Run button does: {budgetUsd?}. 202 while it runs.
post
/api/studio
One agent turn, NDJSON stream of studio events.
get
/api/studio/tail
Re-attach to a detached run's event log.
post
/api/studio/stop
Stop a detached run.
put
/api/studio/attachments/{filename}
Upload a chat attachment; returns its mediaKey.
post
/api/studio/uploads
Open a resumable upload session.
put
/api/studio/uploads/{sessionId}
Send one chunk of a resumable upload.
post
/api/studio/uploads/complete
Close a resumable upload; returns its mediaKey.
get
/api/conversations
Thread list, one page.
get
/api/conversations/{id}
One transcript with each post artifact's queue state.
delete
/api/conversations/{id}
Delete a thread.
patch
/api/conversations/{id}
Rename a thread.
post
/api/conversations/{id}/opened
Mark a thread opened.
get
/api/strategies
The agent roster.
post
/api/strategies
Create an agent (publish scope when autoPublishPosts).
patch
/api/strategies/{id}
Edit an agent (publish scope when autoPublishPosts).
post
/api/strategies/{id}/run
Wake an agent now.
post
/api/strategies/suggest
One engine-studied agent seed for the editor.
post
/api/manager/run
Plan now through the first active agent.
get
/api/manager/runs
Wake runs and their proposals.
get
/api/manager/runs/{id}
One wake run.
post
/api/manager/runs/{id}/approve
Approve a run's proposals.
post
/api/manager/runs/{id}/dismiss
Dismiss a run with feedback.
get
/api/manager/settings
Cadence and targeting.
put
/api/manager/settings
Set cadence and targeting.
get
/api/manager/budget
Spend, allowance, paused state.
get
/api/characters
The actor roster: identity, voice, locks.
post
/api/characters
Create an actor: {name, bio?, isUser?}.
get
/api/characters/{id}
One actor.
delete
/api/characters/{id}
Archive an actor.
patch
/api/characters/{id}
Edit an actor, including its locks.
post
/api/characters/{id}/voice
Design, clone, or speak a voice: {action: design, voicePrompt} | {action: clone, sampleMediaKey, consent: true} | {action: speak, text} (billed like POST /api/speech).
post
/api/actions/{id}/send
Send a drafted comment or reply, or run an approved boost or campaign change.
post
/api/actions/{id}/done
Mark a task card done.
post
/api/actions/{id}/skip
Skip a proposed action.
get
/api/ad-accounts
Connected ad accounts (identity only).
delete
/api/ad-accounts
Unlink an ad account.
get
/api/ads/performance
Paid campaign performance.
post
/api/ads/refresh
Refresh paid campaign data.
get
/api/ads/campaigns/{id}
One Meta campaign as Meta has it now (status, budget, end date).
Copy
Copy Markdown
Copy Markdown
Copying…
Copied
Copy failed
Generate code
This document.
get
/api/openapi.json
Request
Base URL:
https://shapelessai.com
URL:
https://shapelessai.com/api/openapi.json
Auth:
none required
Response
OK
Changes
No recorded changes to this operation across all 2 revisions of this API.