REST API v1 · MCP

Neuro in your code

Everything the dashboard does: upload a photo, estimate, start a job, get the files. Credits are charged only for formats accepted by AI control, from the workspace balance.

# 1. Photo
curl https://api.neurobanner.com/v1/assets -H "Authorization: Bearer $NB_KEY" -F file=@mug.jpg

# 2. Estimate
curl https://api.neurobanner.com/v1/estimate -H "Authorization: Bearer $NB_KEY" \
  -H "Content-Type: application/json" \
  -d '{"mode":"pack","packs":["rsya","vk"],"asset_ids":["<asset id>"]}'

# 3. Job
curl https://api.neurobanner.com/v1/jobs -H "Authorization: Bearer $NB_KEY" \
  -H "Idempotency-Key: $(uuidgen)" -H "Content-Type: application/json" \
  -d '{"mode":"pack","packs":["rsya","vk"],"asset_ids":["<asset id>"],"webhook_url":"https://you.app/hooks/nb"}'

# 4. Status and files
curl https://api.neurobanner.com/v1/jobs/<job id> -H "Authorization: Bearer $NB_KEY"
curl -o result.zip https://api.neurobanner.com/v1/jobs/<job id>/zip -H "Authorization: Bearer $NB_KEY"

Keys

Header Authorization: Bearer nb_live_…. Keys are created on the “API and MCP” page and shown once. A test key nb_test_… builds and charges nothing: it answers with the estimate in the same format as a live key.

Limits: 120 requests a minute per key, 300 per workspace, 30 new jobs a minute.

Get a key

Endpoints

Base URL: https://api.neurobanner.com/v1

POST/assetsUpload a photo or bannermultipart `file`, or JSON `{ url }`, or JSON `{ name, mime, bytes }` to get a signed upload URL. JPG, PNG, WEBP up to 20 MB, at least 600 px on the short side.
POST/assets/{id}/completeFinish a signed upload
POST/estimateEstimate the cost before starting
POST/jobsStart a jobAnswers at once with the job id. Credits are reserved now and charged only for accepted formats. With too few credits and `autostart: true` the job is saved as a draft (202).
GET/jobs/{id}Job status and results
POST/jobs/{id}/answerAnswer Neuro's question
POST/jobs/{id}/cancelCancel a job and refund
GET/jobs/{id}/zipZIP of accepted formats
GET/formatsFormat catalog
GET/outputsResult files
GET/brand-kitsBrand kits of the workspace
GET/balanceCredit balance

Job fields

{
  "mode": {
    "type": "string",
    "enum": [
      "create",
      "adapt",
      "pack",
      "enhance",
      "ctr",
      "unify",
      "card",
      "video",
      "html5",
      "edit"
    ]
  },
  "tier": {
    "default": "standard",
    "type": "string",
    "enum": [
      "standard",
      "pro"
    ]
  },
  "title": {
    "type": "string",
    "maxLength": 120
  },
  "asset_ids": {
    "default": [],
    "maxItems": 100,
    "type": "array",
    "items": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "brand_kit_id": {
    "anyOf": [
      {
        "type": "string",
        "format": "uuid",
        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      },
      {
        "type": "null"
      }
    ]
  },
  "brief": {
    "type": "string",
    "maxLength": 2000
  },
  "lang": {
    "type": "string",
    "enum": [
      "ru",
      "en"
    ]
  },
  "packs": {
    "maxItems": 7,
    "type": "array",
    "items": {
      "type": "string",
      "enum": [
        "rsya",
        "vk",
        "google",
        "wb",
        "ozon",
        "ym",
        "kaspi"
      ]
    }
  },
  "format_keys": {
    "maxItems": 60,
    "type": "array",
    "items": {
      "type": "string",
      "maxLength": 64
    }
  },
  "from_photo": {
    "type": "boolean"
  },
  "sizes": {
    "maxItems": 30,
    "type": "array",
    "items": {
      "type": "object",
      "properties": {
        "width": {
          "type": "integer",
          "minimum": 16,
          "maximum": 4096
        },
        "height": {
          "type": "integer",
          "minimum": 16,
          "maximum": 4096
        },
        "max_kb": {
          "type": "integer",
          "minimum": 10,
          "maximum": 30000
        }
      },
      "required": [
        "width",
        "height"
      ]
    }
  },
  "goal": {
    "type": "string",
    "maxLength": 200
  },
  "marketplace": {
    "type": "string",
    "enum": [
      "wb",
      "ozon",
      "ym",
      "kaspi"
    ]
  },
  "characteristics": {
    "type": "string",
    "maxLength": 3000
  },
  "output_ids": {
    "maxItems": 30,
    "type": "array",
    "items": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    }
  },
  "instruction": {
    "type": "string",
    "minLength": 2,
    "maxLength": 1000
  },
  "network": {
    "type": "string",
    "enum": [
      "rsya",
      "google"
    ]
  },
  "click_url": {
    "type": "string",
    "format": "uri"
  },
  "video_aspect": {
    "type": "string",
    "enum": [
      "9:16",
      "1:1",
      "16:9"
    ]
  },
  "motion": {
    "type": "string",
    "maxLength": 300
  },
  "reference_asset_id": {
    "type": "string",
    "format": "uuid",
    "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
  },
  "webhook_url": {
    "type": "string",
    "format": "uri"
  },
  "autostart": {
    "type": "boolean"
  },
  "auto_pick": {
    "type": "boolean"
  }
}

Modes: create, adapt, pack, enhance, ctr, unify, card, video, html5, edit. For create with auto_pick: true Neuro picks the sketch himself; otherwise the job waits for an answer in question — reply via /jobs/{id}/answer.

Webhooks

Events job.step, job.completed, job.failed. Signature in the header NB-Signature: t=…,v1=… — HMAC-SHA256 of `${t}.${body}` with the endpoint secret. Retries: 1, 5, 30 minutes, 2 and 12 hours.

import { createHmac, timingSafeEqual } from 'node:crypto';

export function verify(secret, rawBody, header) {
  const { t, v1 } = Object.fromEntries(header.split(',').map((p) => p.split('=')));
  if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false;
  const mac = createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
  return timingSafeEqual(Buffer.from(mac), Buffer.from(v1));
}

Errors

The answer { "error": { "code", "message" } } — message is in Neuro’s voice, in the Accept-Language language.

401 invalid_api_keyThe API key is not recognised.
402 insufficient_creditsNot enough credits; missing says how many.
422 invalid_requestThe request has errors; details lists the fields.
429 rate_limitedToo many requests; see Retry-After.
503 not_configuredThe service is still being configured.

MCP

Streamable HTTP: https://mcp.neurobanner.com/mcp. Auth is the same API key in the Authorization header. Long jobs return a job_id at once.

list_formatsFormat catalog with sizes, weight limits and rules.
estimate_costEstimates a task in credits before it starts.
create_bannerBanner from a product photo: 3 sketches, a 2K final.
adapt_bannerAn existing banner into any sizes.
make_format_packPlatform size packs.
enhance_bannerSharpness, light and a clean background.
improve_ctrCTR review and 3 variants.
unify_style2–100 images in one style.
make_marketplace_cardMain image and 5 slides by marketplace rules.
animate_to_videoAnimated video from a banner.
make_html5Animated HTML5 banner.
get_jobJob status, question and result links.
answer_questionAnswers the job question.
list_outputsAccepted files with 1-hour links.
get_balanceCredit balance and plan.
list_brand_kitsBrand kits of the workspace.