Direct API
Generate, edit and manage images, video and audio in Morphic from your own backend over HTTPS.
The Morphic Direct API gives your backend the same generation, editing and library tools the Morphic MCP server gives an AI assistant, over plain HTTPS and JSON. You call a tool with an organization API key, every paid call reports what it charged, and you follow each generation by polling or by a signed webhook.
At a glance
| Base URL | https://mcp.morphic.com/v1/direct |
|---|---|
| Auth | Authorization: Bearer mor_live_… |
| Format | JSON request and response bodies, UTF-8, up to 1 MB per request |
| Ids | UUID v7 strings for your data, mdl_… for models, voice UUIDs from list_voices |
| Times | ISO 8601 in UTC, such as 2026-10-25T09:14:03.120Z |
| Money | Morphic credits, as integers: the same credits your plan and Studio spend |
Getting access
The Direct API is switched on per organization, by invitation. Until it is, every call answers 403 direct_api_disabled.
- Ask your Morphic account contact to enable the Direct API for your organization. Morphic also switches paid tools on once your order form is in place; until then the Direct API scopes do not appear in Studio, and paid tools answer
403 tool_not_available. - An admin of your organization creates a key in Studio, under Settings > API keys, and accepts the Morphic Terms of Use, including their Developer API section, for the organization. See Create a key.
- Call the API with
Authorization: Bearer <secret>.
Quick start
Find the project the output should land in, start an image, then wait for it.
export MORPHIC_API_KEY=mor_live_9f2c… # created once in Studio > Settings > API keys
# 1. Which project should the output land in?
curl -s https://mcp.morphic.com/v1/direct/tools/list_projects \
-H "Authorization: Bearer $MORPHIC_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input": {}}'
# 2. Start an image
curl -s https://mcp.morphic.com/v1/direct/tools/generate_image \
-H "Authorization: Bearer $MORPHIC_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-4411-hero-image" \
-d '{
"input": {
"prompt": "A red vintage bicycle against a pastel wall, soft morning light",
"aspect_ratio": "16:9",
"project_id": "01928f4e-5b7c-7d2a-9e11-3c4b5a6d7e8f"
},
"webhook_id": "01929a10-0c3d-7f44-8a21-0b1c2d3e4f50",
"metadata": { "order_id": "4411" }
}'
# 3. Wait for it (holds up to 45 s, returns the moment it finishes)
curl -s "https://mcp.morphic.com/v1/direct/generations/0192a7b3-…?wait=45" \
-H "Authorization: Bearer $MORPHIC_API_KEY"Every generation lands in your organization's Morphic library, in the project you named, as if it had been made in Studio. In Studio it shows as created by API, and the library's Created by > API filter lists everything your API keys made or imported.
Endpoints
| Method | Path | Scope | Does |
|---|---|---|---|
GET | /v1/direct/me | none | the key, its limits and spend, the organization's balance |
GET | /v1/direct/tools | none | the tool catalog with JSON Schemas |
GET | /v1/direct/tools/{tool_name} | none | one tool |
GET | /v1/direct/openapi.json | none | OpenAPI 3.1 document |
POST | /v1/direct/tools/{tool_name} | per tool | call a tool |
GET | /v1/direct/generations/{id} | assets:read | one generation, optional long-poll |
POST | /v1/direct/generations/batch-get | assets:read | up to 10 generations, optional long-poll |
GET | /v1/direct/usage | assets:read | ledger entries and totals |
POST | /v1/direct/webhooks | generations:write | register an endpoint |
GET | /v1/direct/webhooks | assets:read | list endpoints |
DELETE | /v1/direct/webhooks/{webhook_id} | generations:write | remove an endpoint |
GET | /v1/direct/webhooks/{webhook_id}/events | assets:read | delivery log |
Read next
Authentication
Keys, scopes and credit limits
Calling a tool
Request, response, billing and idempotency
Generations
Statuses, polling and the batch read
Webhooks
Signed notices when a generation finishes
Credits and usage
What every call charged, /me and /usage
Passing your own media
Give your files by URL in any media field
Errors
Every error code and when to retry
Limits
Rate limits and size limits
Tool catalog
Every tool and the scope it needs
Models
Model ids, capabilities and options
Versioning
What can change within v1
If you have any trouble or have any questions, feel free to reach out. We're happy to help. Write to us at support@morphic.com.