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 keyEndpoints
Base URL: https://api.neurobanner.com/v1
/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./assets/{id}/completeFinish a signed upload/estimateEstimate the cost before starting/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)./jobs/{id}Job status and results/jobs/{id}/answerAnswer Neuro's question/jobs/{id}/cancelCancel a job and refund/jobs/{id}/zipZIP of accepted formats/formatsFormat catalog/outputsResult files/brand-kitsBrand kits of the workspace/balanceCredit balanceJob 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.