Перейти к основному содержанию
POST
/
v1
/
uploads
/
images
curl --request POST \
  --url https://api.apimart.ai/v1/uploads/images \
  --header 'Authorization: Bearer <token>' \
  --form 'file=@/path/to/your/image.jpg'
import requests

# Upload image
with open('image.jpg', 'rb') as f:
    response = requests.post(
        "https://api.apimart.ai/v1/uploads/images",
        headers={
            "Authorization": "Bearer <token>"
        },
        files={
            "file": f
        }
    )

result = response.json()
image_url = result['url']
print(f"Image URL: {image_url}")

# Use the uploaded image for generation
response = requests.post(
    "https://api.apimart.ai/v1/images/generations",
    headers={
        "Authorization": "Bearer <token>",
        "Content-Type": "application/json"
    },
    json={
        "model": "gemini-3-pro-image-preview",
        "prompt": "Create a variation based on this image",
        "image_urls": [{"url": image_url}]
    }
)
// Upload image
const formData = new FormData();
formData.append('file', fileInput.files[0]);

const uploadResponse = await fetch('https://api.apimart.ai/v1/uploads/images', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer <token>'
  },
  body: formData
});

const uploadResult = await uploadResponse.json();
const imageUrl = uploadResult.url;
console.log(`Image URL: ${imageUrl}`);

// Use the uploaded image for generation
const genResponse = await fetch('https://api.apimart.ai/v1/images/generations', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer <token>',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    model: 'gemini-3-pro-image-preview',
    prompt: 'Create a variation based on this image',
    image_urls: [{url: imageUrl}]
  })
});
{
  "url": "https://upload.apimart.ai/f/image/9990000123456-a1b2c3d4-photo.jpg",
  "filename": "photo.jpg",
  "content_type": "image/jpeg",
  "bytes": 235680,
  "created_at": 1743436800
}
{
  "error": {
    "message": "missing or invalid file field: http: no such file",
    "type": "invalid_request_error"
  }
}
{
  "error": {
    "message": "unsupported image type: application/pdf, allowed: jpeg, png, gif, webp",
    "type": "invalid_request_error"
  }
}
{
  "error": {
    "message": "file size 25165824 exceeds maximum 20971520 bytes",
    "type": "invalid_request_error"
  }
}
{
  "error": {
    "code": 429,
    "message": "Rate limit exceeded. Please try again later",
    "type": "rate_limit_error"
  }
}
{
  "error": {
    "message": "failed to upload image",
    "type": "server_error"
  }
}
Playground документации не поддерживает загрузку файлов: используйте для тестирования примеры кода на cURL, Python или JavaScript ниже.
Важное изменение: Для повышения производительности и контроля затрат мы больше не поддерживаем передачу данных изображений в формате base64 напрямую в API генерации. Используйте этот API, чтобы загрузить изображение, получить URL и затем вызвать API генерации.

Зачем сначала загружать изображения?

  1. Оптимизация производительности — кодирование base64 увеличивает объём данных на 33%; предварительная загрузка значительно уменьшает размер тела запроса
  2. Повторное использование изображений — загрузите один раз и используйте URL многократно без повторных передач

Рабочий процесс

curl --request POST \
  --url https://api.apimart.ai/v1/uploads/images \
  --header 'Authorization: Bearer <token>' \
  --form 'file=@/path/to/your/image.jpg'
import requests

# Upload image
with open('image.jpg', 'rb') as f:
    response = requests.post(
        "https://api.apimart.ai/v1/uploads/images",
        headers={
            "Authorization": "Bearer <token>"
        },
        files={
            "file": f
        }
    )

result = response.json()
image_url = result['url']
print(f"Image URL: {image_url}")

# Use the uploaded image for generation
response = requests.post(
    "https://api.apimart.ai/v1/images/generations",
    headers={
        "Authorization": "Bearer <token>",
        "Content-Type": "application/json"
    },
    json={
        "model": "gemini-3-pro-image-preview",
        "prompt": "Create a variation based on this image",
        "image_urls": [{"url": image_url}]
    }
)
// Upload image
const formData = new FormData();
formData.append('file', fileInput.files[0]);

const uploadResponse = await fetch('https://api.apimart.ai/v1/uploads/images', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer <token>'
  },
  body: formData
});

const uploadResult = await uploadResponse.json();
const imageUrl = uploadResult.url;
console.log(`Image URL: ${imageUrl}`);

// Use the uploaded image for generation
const genResponse = await fetch('https://api.apimart.ai/v1/images/generations', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer <token>',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    model: 'gemini-3-pro-image-preview',
    prompt: 'Create a variation based on this image',
    image_urls: [{url: imageUrl}]
  })
});
{
  "url": "https://upload.apimart.ai/f/image/9990000123456-a1b2c3d4-photo.jpg",
  "filename": "photo.jpg",
  "content_type": "image/jpeg",
  "bytes": 235680,
  "created_at": 1743436800
}
{
  "error": {
    "message": "missing or invalid file field: http: no such file",
    "type": "invalid_request_error"
  }
}
{
  "error": {
    "message": "unsupported image type: application/pdf, allowed: jpeg, png, gif, webp",
    "type": "invalid_request_error"
  }
}
{
  "error": {
    "message": "file size 25165824 exceeds maximum 20971520 bytes",
    "type": "invalid_request_error"
  }
}
{
  "error": {
    "code": 429,
    "message": "Rate limit exceeded. Please try again later",
    "type": "rate_limit_error"
  }
}
{
  "error": {
    "message": "failed to upload image",
    "type": "server_error"
  }
}

Авторизация

Authorization
string
обязательно
Все API требуют аутентификации с помощью Bearer TokenПолучите API-ключ:Перейдите на страницу управления API-ключами, чтобы получить API-ключДобавьте его в заголовки запроса:
Authorization: Bearer YOUR_API_KEY

Тело запроса

file
file
обязательно
Файл изображенияПоддерживаемые форматы: JPEG (.jpg, .jpeg), PNG (.png), WebP (.webp), GIF (.gif)Максимальный размер файла: 20 МБ

Ответ

url
string
Публичный URL доступа к изображению, можно использовать напрямую в API генерации (действителен 72 часа)
filename
string
Исходное имя файла
content_type
string
Определённый MIME-тип, например image/jpeg
bytes
integer
Размер файла в байтах
created_at
integer
Время загрузки в формате Unix-метки (в секундах)

Полный пример: рабочий процесс «изображение в изображение»

Python
import requests
import time

API_KEY = "your-Apimart-key"
BASE_URL = "https://api.apimart.ai"

# Step 1: Upload reference image
def upload_image(file_path):
    with open(file_path, 'rb') as f:
        response = requests.post(
            f"{BASE_URL}/v1/uploads/images",
            headers={"Authorization": f"Bearer {API_KEY}"},
            files={"file": f}
        )
    return response.json()['url']

# Step 2: Create generation task
def create_generation(image_url, prompt):
    response = requests.post(
        f"{BASE_URL}/v1/images/generations",
        headers={
            "Authorization": f"Bearer {API_KEY}",
            "Content-Type": "application/json"
        },
        json={
            "model": "gemini-3-pro-image-preview",
            "prompt": prompt,
            "image_urls": [{"url": image_url}],
            "size": "16:9"
        }
    )
    return response.json()['id']

# Step 3: Poll task status
def wait_for_result(task_id):
    while True:
        response = requests.get(
            f"{BASE_URL}/v1/images/generations/{task_id}",
            headers={"Authorization": f"Bearer {API_KEY}"}
        )
        result = response.json()

        if result['status'] == 'completed':
            return result['url']
        elif result['status'] == 'failed':
            raise Exception(f"Generation failed: {result.get('fail_reason')}")

        time.sleep(2)

# Execute workflow
image_url = upload_image("reference.jpg")
print(f"Image uploaded: {image_url}")

task_id = create_generation(image_url, "Transform this photo into Ghibli anime style")
print(f"Task created: {task_id}")

result_url = wait_for_result(task_id)
print(f"Generation complete: {result_url}")