List all models
curl --request GET \
--url https://api.magica.com/api/v1/models \
--header 'Authorization: <authorization>'import requests
url = "https://api.magica.com/api/v1/models"
headers = {"Authorization": "<authorization>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<authorization>'}};
fetch('https://api.magica.com/api/v1/models', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.magica.com/api/v1/models",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.magica.com/api/v1/models"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<authorization>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.magica.com/api/v1/models")
.header("Authorization", "<authorization>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.magica.com/api/v1/models")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'
response = http.request(request)
puts response.read_body{
"(array)": [
{
"nodeType": "<string>",
"name": "<string>",
"description": "<string>",
"category": "<string>",
"icon": "<string>",
"accent": "<string>",
"subModels": [
{
"subModelId": "<string>",
"label": "<string>",
"category": "<string>"
}
]
}
]
}Models
List all models
Flat list of every available Magica model with its nodeType, name, category, and sub-model IDs.
GET
/
v1
/
models
List all models
curl --request GET \
--url https://api.magica.com/api/v1/models \
--header 'Authorization: <authorization>'import requests
url = "https://api.magica.com/api/v1/models"
headers = {"Authorization": "<authorization>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<authorization>'}};
fetch('https://api.magica.com/api/v1/models', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.magica.com/api/v1/models",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.magica.com/api/v1/models"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<authorization>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.magica.com/api/v1/models")
.header("Authorization", "<authorization>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.magica.com/api/v1/models")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<authorization>'
response = http.request(request)
puts response.read_body{
"(array)": [
{
"nodeType": "<string>",
"name": "<string>",
"description": "<string>",
"category": "<string>",
"icon": "<string>",
"accent": "<string>",
"subModels": [
{
"subModelId": "<string>",
"label": "<string>",
"category": "<string>"
}
]
}
]
}Returns a single array containing every model the platform exposes — image, video, audio, LLM, and utility. Each entry surfaces the
For single-mode models (no
nodeType and any subModels for multi-mode models.
Need the response grouped by category with role labels (GENERATE / EDIT /
TRANSFORM)? Use
GET /v1/models/search
instead. This endpoint is intentionally flat — best when you just want to
enumerate every model ID.Authorizations
string
required
Bearer API key. Format:
Bearer gx_your_api_key.Response
array
Array of model entries — one per registered node type.
Show Each entry
Show Each entry
string
Stable identifier used as
{nodeType} in POST /v1/nodes/{nodeType}/run, node-shaped estimate payloads, and single-mode model schema lookups (e.g. nano_banana_pro, flux_2_max, kling_v3_pro).string
Human-readable display name.
string
Short description shown in pickers.
string
Toolbar category (
image, video, audio, llm, utility).string
Icon identifier used by the UI.
string
Accent color identifier.
array
Present only for multi-mode models. Each sub-model has its own
modelId you can pass to GET /v1/models/{modelId}/schema, GET /v1/models/{modelId}/pricing, and subModelId in POST /v1/nodes/{nodeType}/run.Request
- cURL
- Node.js
- Python
curl https://api.magica.com/api/v1/models \
-H "Authorization: Bearer $MAGICA_API_KEY"
const res = await fetch("https://api.magica.com/api/v1/models", {
headers: { Authorization: `Bearer ${process.env.MAGICA_API_KEY}` },
});
const models = await res.json();
// Every nodeType you can use in /v1/nodes/{nodeType}/run
const nodeTypes = models.map((m) => m.nodeType);
// Every modelId you can pass to /v1/models/{modelId}/schema
const modelIds = models.flatMap((m) =>
m.subModels ? m.subModels.map((sm) => sm.subModelId) : [m.nodeType],
);
import os, requests
res = requests.get(
"https://api.magica.com/api/v1/models",
headers={"Authorization": f"Bearer {os.environ['MAGICA_API_KEY']}"},
)
models = res.json()
for m in models:
if m.get("subModels"):
for sm in m["subModels"]:
print(f"{m['nodeType']:30} {sm['subModelId']:30} {sm['label']}")
else:
print(f"{m['nodeType']:30} -")
Response example
Truncated to two entries (the live response includes ~80 models):[
{
"nodeType": "flux_2_max",
"name": "FLUX 2 Max",
"description": "State-of-the-art image generation with exceptional realism, precision, and consistency",
"category": "image",
"icon": "image",
"accent": "blue",
"subModels": [
{
"subModelId": "flux-2-max-text",
"label": "Text to Image",
"category": "text-to-image"
},
{
"subModelId": "flux-2-max-edit",
"label": "Image to Image",
"category": "image-to-image"
}
]
},
{
"nodeType": "kling_v3_pro",
"name": "Kling v3 Pro",
"description": "Text-to-video and image-to-video.",
"category": "video",
"icon": "video",
"accent": "pink"
}
]
What the IDs are for
| Field | Use it where |
|---|---|
nodeType | Path param in POST /v1/nodes/{nodeType}/run; also use as nodeType in POST /v1/nodes/estimate-credits |
subModels[].subModelId | Path param in GET /v1/models/{modelId}/schema and GET /v1/models/{modelId}/pricing; also pass as subModelId when running a multi-mode model |
subModels), the schema endpoint accepts the nodeType directly.
Errors
| Status | Reason |
|---|---|
401 | Missing or invalid API key |
500 | Server error |
Was this page helpful?
⌘I