export NOQTE_MEDIA_KEY='sk-media-…'
BASE='https://api.noqte.ai/v1/media'
PAYLOAD='{"model_slug":"gpt-image-2","prompt":"A calm cinematic scene at sunrise, soft light","params":{"size":"1:1","quality":"low"}}'
curl -sS "$BASE/estimate" \
-H "Authorization: Bearer $NOQTE_MEDIA_KEY" \
-H "Content-Type: application/json" \
-d "$PAYLOAD"
OP_ID="$(uuidgen)"
GEN_ID=$(curl -sS "$BASE/generations" \
-H "Authorization: Bearer $NOQTE_MEDIA_KEY" \
-H "Idempotency-Key: $OP_ID" \
-H "Content-Type: application/json" \
-d "$(printf '%s' "$PAYLOAD" | jq '. + {max_credits: 20}')" | jq -r '.generation.id')
while :; do
STATUS=$(curl -sS "$BASE/generations/$GEN_ID" -H "Authorization: Bearer $NOQTE_MEDIA_KEY")
STATE=$(printf '%s' "$STATUS" | jq -r '.generation.status')
[ "$STATE" = completed ] || [ "$STATE" = failed ] && break
sleep 5
done
printf '%s\n' "$STATUS" | jq '.generation | {status, net_credits, billing_status, outputs}'
import os
import time
import uuid
import requests
BASE = "https://api.noqte.ai/v1/media"
HEADERS = {"Authorization": f"Bearer {os.environ['NOQTE_MEDIA_KEY']}"}
def call(method, path, **kwargs):
response = requests.request(method, f"{BASE}{path}", headers={**HEADERS, **kwargs.pop("headers", {})}, timeout=60, **kwargs)
data = response.json()
if not response.ok:
raise RuntimeError(f"{response.status_code} {data['error']['code']}: {data['error']['message']}")
return data
payload = {
"model_slug": "gpt-image-2",
"prompt": "A calm cinematic scene at sunrise, soft light",
"params": {
"size": "1:1",
"quality": "low",
},
}
estimate = call("POST", "/estimate", json=payload)
print("credits:", estimate["credits"], "wallet:", estimate["wallet_balance"])
operation_id = str(uuid.uuid4())
accepted = call(
"POST",
"/generations",
json={**payload, "max_credits": estimate["credits"]},
headers={"Idempotency-Key": operation_id},
)
generation = accepted["generation"]
while generation["status"] in ("pending", "running"):
time.sleep(accepted.get("poll_after_seconds") or 5)
generation = call("GET", f"/generations/{generation['id']}")["generation"]
if generation["status"] == "failed":
raise RuntimeError(f"{generation['error']['code']} — billing: {generation['billing_status']}")
for output in generation["outputs"]:
print(output["url"])
import { randomUUID } from "node:crypto";
const BASE = "https://api.noqte.ai/v1/media";
const headers = { Authorization: `Bearer ${process.env.NOQTE_MEDIA_KEY}` };
async function call(path, init = {}) {
const response = await fetch(`${BASE}${path}`, {
...init,
headers: { ...headers, "Content-Type": "application/json", ...init.headers },
signal: AbortSignal.timeout(60_000),
});
const data = await response.json();
if (!response.ok) throw new Error(`${response.status} ${data.error.code}: ${data.error.message}`);
return data;
}
const payload = {
model_slug: "gpt-image-2",
prompt: "A calm cinematic scene at sunrise, soft light",
params: {
size: "1:1",
quality: "low"
}
};
const estimate = await call("/estimate", { method: "POST", body: JSON.stringify(payload) });
console.log("credits:", estimate.credits, "wallet:", estimate.wallet_balance);
const operationId = randomUUID();
const accepted = await call("/generations", {
method: "POST",
headers: { "Idempotency-Key": operationId },
body: JSON.stringify({ ...payload, max_credits: estimate.credits }),
});
let { generation } = accepted;
while (generation.status === "pending" || generation.status === "running") {
await new Promise((resolve) => setTimeout(resolve, (accepted.poll_after_seconds ?? 5) * 1000));
({ generation } = await call(`/generations/${generation.id}`));
}
if (generation.status === "failed") {
throw new Error(`${generation.error.code} — billing: ${generation.billing_status}`);
}
for (const output of generation.outputs) console.log(output.url);
<?php
$base = "https://api.noqte.ai/v1/media";
$key = getenv("NOQTE_MEDIA_KEY");
function call(string $method, string $path, ?array $json = null, array $extraHeaders = []): array
{
global $base, $key;
$ch = curl_init($base . $path);
$headers = array_merge(["Authorization: Bearer $key", "Content-Type: application/json"], $extraHeaders);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_HTTPHEADER => $headers,
CURLOPT_POSTFIELDS => $json === null ? null : json_encode($json, JSON_UNESCAPED_UNICODE),
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$data = json_decode($body, true);
if ($status >= 400) {
throw new RuntimeException("$status {$data['error']['code']}: {$data['error']['message']}");
}
return $data;
}
$payload = [
"model_slug" => "gpt-image-2",
"prompt" => "A calm cinematic scene at sunrise, soft light",
"params" => [
"size" => "1:1",
"quality" => "low",
],
];
$estimate = call("POST", "/estimate", $payload);
echo "credits: {$estimate['credits']}\n";
$operationId = bin2hex(random_bytes(16));
$accepted = call("POST", "/generations", $payload + ["max_credits" => $estimate["credits"]], ["Idempotency-Key: $operationId"]);
$generation = $accepted["generation"];
while (in_array($generation["status"], ["pending", "running"], true)) {
sleep($accepted["poll_after_seconds"] ?? 5);
$generation = call("GET", "/generations/{$generation['id']}")["generation"];
}
if ($generation["status"] === "failed") {
throw new RuntimeException($generation["error"]["code"] . " — billing: " . $generation["billing_status"]);
}
foreach ($generation["outputs"] as $output) {
echo $output["url"], "\n";
}
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
"time"
"github.com/google/uuid"
)
const base = "https://api.noqte.ai/v1/media"
func call(method, path string, body any, headers map[string]string) map[string]any {
var reader *bytes.Reader
if body != nil {
raw, _ := json.Marshal(body)
reader = bytes.NewReader(raw)
} else {
reader = bytes.NewReader(nil)
}
req, err := http.NewRequest(method, base+path, reader)
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("NOQTE_MEDIA_KEY"))
req.Header.Set("Content-Type", "application/json")
for k, v := range headers {
req.Header.Set(k, v)
}
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
var data map[string]any
json.NewDecoder(res.Body).Decode(&data)
if res.StatusCode >= 400 {
e := data["error"].(map[string]any)
panic(fmt.Sprintf("%d %v: %v", res.StatusCode, e["code"], e["message"]))
}
return data
}
func main() {
payload := map[string]any{
"model_slug": "gpt-image-2",
"prompt": "A calm cinematic scene at sunrise, soft light",
"params": map[string]string{"size": "1:1", "quality": "low"},
}
estimate := call("POST", "/estimate", payload, nil)
fmt.Println("credits:", estimate["credits"])
payload["max_credits"] = estimate["credits"]
accepted := call("POST", "/generations", payload, map[string]string{"Idempotency-Key": uuid.NewString()})
generation := accepted["generation"].(map[string]any)
for generation["status"] == "pending" || generation["status"] == "running" {
time.Sleep(5 * time.Second)
generation = call("GET", "/generations/"+generation["id"].(string), nil, nil)["generation"].(map[string]any)
}
if generation["status"] == "failed" {
panic(fmt.Sprintf("%v — billing: %v", generation["error"], generation["billing_status"]))
}
for _, output := range generation["outputs"].([]any) {
fmt.Println(output.(map[string]any)["url"])
}
}