curl --request POST \
--url 'https://api.apimart.ai/v1/uploads/images?retention_days=3' \
--header 'Authorization: Bearer <token>' \
--form 'file=@/path/to/reference.png'
import requests
with open("reference.png", "rb") as file:
response = requests.post(
"https://api.apimart.ai/v1/uploads/images?retention_days=3",
headers={"Authorization": "Bearer <token>"},
files={"file": file}
)
response.raise_for_status()
result = response.json()
print(result["url"])
const input = document.querySelector('input[type="file"]');
const file = input?.files?.[0];
if (!file) throw new Error("Select a file first");
const formData = new FormData();
formData.append("file", file, file.name);
const response = await fetch("https://api.apimart.ai/v1/uploads/images?retention_days=3", {
method: "POST",
headers: { Authorization: "Bearer <token>" },
body: formData
});
const result = await response.json();
if (!response.ok) {
throw new Error(result.error?.message ?? `HTTP ${response.status}`);
}
console.log(result.url);
{
"url": "https://cdn.example/uploads/reference.png",
"filename": "reference.png",
"content_type": "image/png",
"file_type": "image",
"bytes": 235680,
"created_at": 1793836800,
"retention_days": 3,
"expires_at": 1794182400
}
{
"error": {
"message": "insufficient balance: uploading files requires a positive account balance, please top up",
"type": "insufficient_user_quota"
}
}
{
"error": {
"message": "image file exceeds maximum 31457280 bytes (30MB)",
"type": "invalid_request_error"
}
}
アップロード管理
画像をアップロード
JPEG・PNG・GIF・WebP をアップロードし、生成 API 用の公開 URL を取得します。既定の上限は 1 ファイル 30MB。
POST
/
v1
/
uploads
/
images
curl --request POST \
--url 'https://api.apimart.ai/v1/uploads/images?retention_days=3' \
--header 'Authorization: Bearer <token>' \
--form 'file=@/path/to/reference.png'
import requests
with open("reference.png", "rb") as file:
response = requests.post(
"https://api.apimart.ai/v1/uploads/images?retention_days=3",
headers={"Authorization": "Bearer <token>"},
files={"file": file}
)
response.raise_for_status()
result = response.json()
print(result["url"])
const input = document.querySelector('input[type="file"]');
const file = input?.files?.[0];
if (!file) throw new Error("Select a file first");
const formData = new FormData();
formData.append("file", file, file.name);
const response = await fetch("https://api.apimart.ai/v1/uploads/images?retention_days=3", {
method: "POST",
headers: { Authorization: "Bearer <token>" },
body: formData
});
const result = await response.json();
if (!response.ok) {
throw new Error(result.error?.message ?? `HTTP ${response.status}`);
}
console.log(result.url);
{
"url": "https://cdn.example/uploads/reference.png",
"filename": "reference.png",
"content_type": "image/png",
"file_type": "image",
"bytes": 235680,
"created_at": 1793836800,
"retention_days": 3,
"expires_at": 1794182400
}
{
"error": {
"message": "insufficient balance: uploading files requires a positive account balance, please top up",
"type": "insufficient_user_quota"
}
}
{
"error": {
"message": "image file exceeds maximum 31457280 bytes (30MB)",
"type": "invalid_request_error"
}
}
参照素材をアップロードすると、公開 URL が直接返ります。ポーリングは不要です。保存期間は 3・7・15・30 日です。3 日プランはアカウントの無料枠内で無料、超過分と長期保存には有料アップロードの有効化が必要です。実際の無料枠と利用可能なプランはコンソールで確認してください。
ドキュメントの Playground はファイルアップロードに対応していません。以下の cURL・Python・JavaScript 例を使用してください。JavaScript 例には、ファイルを選択済みの
<input type="file"> が必要です。curl --request POST \
--url 'https://api.apimart.ai/v1/uploads/images?retention_days=3' \
--header 'Authorization: Bearer <token>' \
--form 'file=@/path/to/reference.png'
import requests
with open("reference.png", "rb") as file:
response = requests.post(
"https://api.apimart.ai/v1/uploads/images?retention_days=3",
headers={"Authorization": "Bearer <token>"},
files={"file": file}
)
response.raise_for_status()
result = response.json()
print(result["url"])
const input = document.querySelector('input[type="file"]');
const file = input?.files?.[0];
if (!file) throw new Error("Select a file first");
const formData = new FormData();
formData.append("file", file, file.name);
const response = await fetch("https://api.apimart.ai/v1/uploads/images?retention_days=3", {
method: "POST",
headers: { Authorization: "Bearer <token>" },
body: formData
});
const result = await response.json();
if (!response.ok) {
throw new Error(result.error?.message ?? `HTTP ${response.status}`);
}
console.log(result.url);
{
"url": "https://cdn.example/uploads/reference.png",
"filename": "reference.png",
"content_type": "image/png",
"file_type": "image",
"bytes": 235680,
"created_at": 1793836800,
"retention_days": 3,
"expires_at": 1794182400
}
{
"error": {
"message": "insufficient balance: uploading files requires a positive account balance, please top up",
"type": "insufficient_user_quota"
}
}
{
"error": {
"message": "image file exceeds maximum 31457280 bytes (30MB)",
"type": "invalid_request_error"
}
}
認証
string
必須
有効で、無効化・期限切れでない APIMart API Key を
Bearer <token> として指定します。アカウントが停止されておらず、残高が正である必要があります。有料アップロードには、今回の料金を支払えるアカウント残高と API Key の残り利用額も必要です。無料ファイル枠と Key の利用額上限は別の制限です。Key は API Key 管理 で取得できます。リクエストパラメータ
integer
任意。
3・7・15・30 日を指定できます。指定するとアカウントの既定値を上書きします。省略するとコンソールで現在有効な既定値が適用され、必ずしも 3 日ではありません。URL クエリパラメータのみ有効で、同名のフォーム項目は無視されます。利用可能なプランはコンソールで確認してください。file
必須
multipart/form-data の file フィールドに、ファイル名付きで 1 ファイルを送信します。JSON、base64 文字列、ファイル URL で置き換えないでください。他のフォームフィールドは無視され、複数の file を送信した場合は最初の 1 件のみ処理されます。対応形式: JPEG (.jpg, .jpeg), PNG (.png), GIF (.gif), WebP (.webp)既定のファイルサイズ上限: 30MB。サイズ上限は設定により変更されます。実際の設定と上限超過エラーの値を確認してください。--form、Python の files、JavaScript の FormData では、boundary を含む Content-Type をクライアントに生成させてください。手動で指定しないでください。
ファイル検証
形式は拡張子やクライアント指定の MIME 型ではなく、内容から判定します。内容は送信先 API の種類と一致する必要があります。拡張子の変更は形式変換にはならず、不一致は HTTP400 になります。
画像全体をデコードできる必要があります。総画素数は 40MP 以下、各辺は 32768 ピクセル以下、GIF は最大 500 フレームです。
| 形式 | 検出される MIME 型 |
|---|---|
| JPEG (.jpg, .jpeg) | image/jpeg |
| PNG (.png) | image/png |
| GIF (.gif) | image/gif |
| WebP (.webp) | image/webp |
保存期間と有料アップロードの設定
| 保存プラン | 課金ルール | 無料枠 |
|---|---|---|
| 3 日 | 無料枠内は無料。超過分は有料アップロードを有効化し、このプランの価格を確認すると、実際のファイルサイズで課金されます。 | アカウント共通の無料枠を使用。 |
| 7 / 15 / 30 日 | 無料枠の残量に関係なく、ファイルごとに選択したプランで課金。 | 無料枠を消費しません。 |
既定値を 7・15・30 日にすると、
retention_days を省略したアップロードも、無料枠が残っていても毎回課金されます。今回だけ 3 日プランを使うには retention_days=3 を指定してください。上記のリクエスト例はすべて 3 日を明示しています。curl --request POST \
--url 'https://api.apimart.ai/v1/uploads/images?retention_days=7' \
--header 'Authorization: Bearer <token>' \
--form 'file=@/path/to/reference.png'
成功レスポンス
HTTP200 でファイル情報を返します。url は JSON の最上位にあり、data によるラップや生成タスク ID はありません。
レスポンス例はファイル情報のみを示し、任意の quota と overage は省略しています。返却条件は以下を参照してください。
string
ファイルの公開 URL。生成 API の対応する参照素材パラメータに渡します。モデルごとに形式・サイズ・数量・時間の制限があるため、アップロード成功だけでは利用できる保証はありません。
string
元のファイル名。
string
ファイル内容からサーバーが検出した MIME 型。クライアントの申告値ではありません。
string
ファイル種別。この API は
image を返します。integer
実際のファイルサイズ(バイト)。
integer
アップロード時刻(Unix 秒)。
integer
今回適用された保存プランの日数。
3・7・15・30 のいずれかです。integer
ファイルの有効期限(Unix 秒)。URL の有効期限はこの値で判断してください。
object
課金された場合のみ返ります。3 日プランの超過分、または 7 / 15 / 30 日プランが対象です。
charged は課金の有無、bytes は課金対象のバイト数、cost_usd は今回の料金(USD)、price_per_gb_usd は GB 単価、retention_days は課金プランです。無料アップロードでは返りません。object
アカウント共通の無料枠情報(任意)。3 日プランで返ります。長期保存は無料枠を使わないため、このオブジェクトは返りません。無制限や統計取得不可の場合は下記を参照してください。
| フィールド | 説明 |
|---|---|
quota.limit | 期間内のアカウントの無料ファイル枠。実際の戻り値またはコンソールを参照してください。有料アップロード有効化後の総アップロード上限ではありません。 |
quota.used | 期間内に計上された 3 日プランのアップロード数。今回の成功分を含みます。 |
quota.remaining | 残りの無料ファイル枠。 |
quota.window_hours | 統計期間の時間数。既定は 72。 |
quota.reset_at | 最も古い一群が期間外になる時刻(Unix 秒)。一部の枠が空く時刻であり、全枠が一度に戻るわけではありません。 |
共有枠とリクエスト制限
画像・動画・音声は同一アカウントの無料枠を共有します。API Key を増やしても枠は増えません。毎正時に期間が移動し、通常は直近約 71–72 時間の 3 日プランの成功分を集計します。長期保存、形式不正、サイズ超過、保存失敗は無料枠を消費しません。上限はコンソールまたは実際のquota.limit を参照してください。
3 日プランの通常の制限付きレスポンスには X-Upload-Quota-Limit、X-Upload-Quota-Remaining、X-Upload-Quota-Reset が付き、それぞれ limit、remaining、reset_at に対応します。Reset は Unix 秒です。無制限アカウントは quota: {"unlimited": true} を返し、この 3 ヘッダーは付きません。
統計が一時取得できない場合、成功レスポンスでも quota を省略することがあります。長期保存でも省略されます。欠落を 0 や無制限と解釈したり、それだけを理由に再アップロードしたりしないでください。
3 日プランの無料枠を使い切った後も、有料アップロードが有効で価格確認済みなら有料で続行できます。それ以外は下記の 429 処理に従ってください。別途、Key ごとに 60 秒間 1000 リクエストの制限があり、rate_limit_error を返します。無料ファイル枠とは独立しています。
エラー処理
エラーは最上位のerror に入ります。HTTP ステータス、error.type / error.code、最上位の overage で判断し、言語で変化する error.message だけに依存しないでください。エラー時の overage は成功時の課金情報とは異なり、available、enabled、needs_reconfirm、retention_days、price_per_gb_usd、任意の settings_url と reason を含みます。有効化や価格再確認はコンソールで行います。
| HTTP | フィールド / 条件 | 原因と対応 |
|---|---|---|
| 400 | invalid_request_error | ファイル欠落、multipart 以外、空ファイル、種類不一致、非対応形式、内容破損。ファイルまたは送信先を修正してください。 |
| 400 | retention_days | 保存日数が不正、またはプランが利用不可。クエリとコンソールの利用可能なプランを確認してください。 |
| 401 / 403 | — | Key が無効・無効化済み、またはアカウント停止。認証とアカウント状態を確認してください。 |
| 402 | insufficient_user_quota | 残高が 0 以下、または Key の期限切れ。入金するか有効な Key を使用してください。無料アップロードでも利用条件を満たす必要があります。 |
| 402 | overage.reason = overage_not_enabled | 長期保存を選択していますが有料アップロードが無効です。コンソールで有効化し価格を確認してください。 |
| 402 | overage.reason = needs_reconfirm | 長期保存の価格が未確認、または値上げ後に未確認です。現行価格を確認してください。 |
| 402 | overage.reason = insufficient_balance | 今回の料金に対して残高不足です。入金後に再試行してください。 |
| 402 | overage.reason = insufficient_key_quota | API Key の利用額上限に対して残りが不足しています。Key の上限を調整してください。 |
| 413 | invalid_request_error | 種類別のサイズ上限超過。圧縮・縮小し、エラーにある現在の上限を確認してください。 |
| 429 | rate_limit_error | Key のリクエスト頻度が高すぎます。頻度を下げ、間隔を空けて再試行してください。 |
| 429 | overage.enabled = false | 3 日プランの無料枠がなく、有料アップロードが無効です。コンソールで有効化し価格を確認するか、Retry-After に従って無料枠を待ってください。 |
| 429 | overage.needs_reconfirm = true | 3 日プランの価格確認が必要です。コンソールで再確認してから再試行してください。 |
| 429 | error.type = rate_limit_exceeded | 無料枠を使い切りました。overage がない場合は error.message に従ってください。有料アップロードが利用不可の場合があります。無料枠を待つ場合は Retry-After の秒数後に再試行します。 |
| 500 | server_error | ストレージへの保存失敗。後で再試行してください。 |
| 503 | Retry-After | 課金またはアカウント枠情報の取得が一時的にできません。ヘッダー指定の秒数後に再試行してください。この失敗分は課金されません。 |
URL とファイルの保存
無料枠の 72 時間の集計期間とファイル保存期間は別です。選択したプランで期限が決まり、実際の日時はexpires_at に従います。期限後の URL は 404 を返します。元ファイルを保管し、URL が恒久的に有効だと想定しないでください。
大量のアップロードには、ご自身のオブジェクトストレージ(OSS)の利用を推奨します。モデルが公開ファイル URL を受け付ける場合は、保存先 URL を直接渡すことで重複アップロードや保存コストを減らせます。