{"slug": "introducing-the-picverce-ai-public-api-for-image-tools-and-generation-models", "title": "Introducing the Picverce AI Public API for image tools and generation models", "summary": "Picverce AI has launched a public API (v1.0.0) that allows developers to integrate its image tools and generation models into their own backends. The API supports job-based processing for tools like background removal, enhancement, and upscaling, as well as model-based generation from prompts, with authentication via bearer keys and credit-based billing.", "body_md": "**Picverce AI** just shipped a Public API so you can run the same image tools and generation models from your own backend, not only from [picverce.com](https://picverce.com/).\n\nBase URL:\n\n```\nhttps://api.picverce.com\n```\n\nOpenAPI contract:\n\n```\nhttps://picverce.com/openapi-v1.yaml\n```\n\nHuman docs:\n\n```\nhttps://picverce.com/api-docs/\n```\n\nCreate keys in Account → API Keys:\n\n```\nhttps://picverce.com/account/?tab=api\n```\n\nThis post is a developer walkthrough of what is live today, how jobs work, which **Tools** and **Models** you can call, and how credits + access work.\n\nPicverce AI is a bilingual (EN/ES) studio of image tools: enhance, upscale, restore, colorize, background remove, photo-to-anime, hairstyle, outfit, and a full Generate workspace with many models.\n\nPartners kept asking for the same capabilities behind a clean HTTP API:\n\nPublic API **v1.0.0** is that surface.\n\nYou authenticate with a `pk_live_…`\n\nor `pk_test_…`\n\nbearer key. You create a **job** against either a **tool** (edit an image you supply) or a **model** (generate from a prompt). The create call returns immediately with a job `id`\n\n. You poll `GET /v1/jobs/{id}`\n\nuntil `succeeded`\n\nor `failed`\n\n. Credits are reserved when the job starts and settled when it finishes. There is no CORS on the API on purpose. Keys stay on your server.\n\n```\nAuthorization: Bearer pk_live_YOUR_KEY\n```\n\nRules that matter in production:\n\n`403 plan_upgrade_required`\n\n).Check your balance and rate limit standing:\n\n```\ncurl -s https://api.picverce.com/v1/me \\\n  -H \"Authorization: Bearer pk_live_YOUR_KEY\"\n```\n\nExample shape:\n\n```\n{\n  \"object\": \"account\",\n  \"credits\": {\n    \"available\": 42,\n    \"daily\": 0,\n    \"subscription\": 323,\n    \"purchased\": 55,\n    \"reserved_open\": 0,\n    \"plan\": \"Basic\"\n  },\n  \"rate_limit\": {\n    \"limit\": 60,\n    \"remaining\": 58,\n    \"reset_at\": \"2026-08-26T12:15:00.000Z\"\n  }\n}\n```\n\nLiveness (no key):\n\n```\ncurl -s https://api.picverce.com/health\n```\n\nTwo catalogs, two job shapes.\n\n| Kind | Endpoint to list | Job target | Input |\n|---|---|---|---|\nTool |\n`GET /v1/tools` |\n`tool` id |\nUsually `image_url` plus options |\nModel |\n`GET /v1/models` |\n`model` id |\n`prompt` plus resolution / ratio / etc. |\n\n```\ncurl -s https://api.picverce.com/v1/tools \\\n  -H \"Authorization: Bearer pk_live_YOUR_KEY\"\n\ncurl -s https://api.picverce.com/v1/models \\\n  -H \"Authorization: Bearer pk_live_YOUR_KEY\"\n```\n\nPublic ids are stable Picverce AI names. Upstream provider slugs are never returned, so we can move a model without breaking your integration.\n\nThese map to Picverce AI product tools. Credit numbers match the website (`TOOL_CREDIT_COSTS`\n\n).\n\n| API id | Product name | Typical credits |\n|---|---|---|\n`enhance` |\nImage Enhancer | 2 |\n`enhance_pro` |\nImage Enhancer PRO | 6 |\n`upscale` |\nImage Upscaler | 2 / 3 / 6 by scale |\n`sharpen` |\nImage Sharpener | (see catalog) |\n`text_clarity` |\nText Enhancer | (see catalog) |\n`restore` |\nPhoto Restore | (see catalog) |\n`face_restore` |\nFace Restore | (see catalog) |\n`anime_enhance` |\nAnime Enhancer | (see catalog) |\n`colorize` |\nImage Colorizer | (see catalog) |\n`photo_to_anime` |\nPhoto to Anime | (see catalog) |\n`photo_to_cartoon` |\nPhoto to Cartoon | (see catalog) |\n`photo_to_sketch` |\nPhoto to Sketch | (see catalog) |\n`background_remover` |\nBackground Remover | 2 |\n`object_remover` |\nObject Remover | (see catalog) |\n`watermark_remover` |\nWatermark Remover | (see catalog) |\n`hairstyle` |\nHairstyle Changer | (see catalog) |\n`outfit` |\nOutfit Generator | (see catalog) |\n\nAlways trust `GET /v1/tools`\n\n/ `GET /v1/tools/{id}`\n\nfor the live `input_schema`\n\nand credit object.\n\nv1 catalogs more tools than the worker will execute yet. **Runnable job tools right now:**\n\n`background_remover`\n\n(Background Remover)`enhance`\n\n(Image Enhancer)`upscale`\n\n(Image Upscaler)Other tool ids return a clear “in catalog but not yet runnable” style error until we expand the allow-list. Generation **models** are available through the Models API path as documented in OpenAPI.\n\n`GET /v1/models`\n\nlists **26** generation models with display names, credit bands by resolution, ratios, reference-image rules, and variation caps.\n\nExamples of public ids and Picverce AI display names:\n\n| API id | Display name |\n|---|---|\n`nano-banana-2` |\nNano Banana 2 |\n`nano-banana-pro` |\nNano Banana Pro |\n`gpt-image-2` |\nGPT Image 2 |\n`chatgpt-1-5` |\nChatgpt 1.5 |\n`seedream-3` |\nSeedream 3 |\n`seedream-4` |\nSeedream 4 |\n`seedream-4-5` |\nSeedream 4.5 |\n`seedream-5-lite` |\nSeedream 5 Lite |\n`qwen-image-2-pro` |\nQwen Image 2 Pro |\n`qwen-image-2` |\nQwen Image 2 |\n`flux-2-pro` |\nFlux 2 Pro |\n`flux-2-max` |\nFlux 2 Max |\n`flux-2-flex` |\nFlux 2 Flex |\n`flux-1-1-pro` |\nFlux 1.1 Pro |\n`flux-schnell` |\nFlux Schnell |\n`imagen-4` |\nImagen 4 |\n`imagen-4-ultra` |\nImagen 4 Ultra |\n`ideogram-3` |\nIdeogram 3 |\n`ideogram-3-turbo` |\nIdeogram 3 Turbo |\n`recraft-v3` |\nRecraft V3 |\n`sd-3-5-large` |\nSD 3.5 Large |\n`sd-3-5-turbo` |\nSD 3.5 Turbo |\n`grok-imagine` |\nxAI Grok Imagine |\n\n(Plus the remaining Qwen / Seedream entries in the live catalog.)\n\nCredits are variable by resolution. Read them from the catalog, do not hardcode forever.\n\nExample: **Background Remover** on a public image URL.\n\n```\ncurl -s -X POST https://api.picverce.com/v1/jobs \\\n  -H \"Authorization: Bearer pk_live_YOUR_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: demo-bg-001\" \\\n  -d '{\n    \"tool\": \"background_remover\",\n    \"input\": {\n      \"image_url\": \"https://example.com/product.jpg\"\n    }\n  }'\n```\n\nYou get a job object back right away (`queued`\n\nor similar). Poll:\n\n```\ncurl -s https://api.picverce.com/v1/jobs/JOB_ID \\\n  -H \"Authorization: Bearer pk_live_YOUR_KEY\"\n```\n\nWhen `status`\n\nis `succeeded`\n\n, the result includes an output image URL. Download it from your server.\n\n```\ncurl -s -X POST https://api.picverce.com/v1/jobs \\\n  -H \"Authorization: Bearer pk_live_YOUR_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: demo-upscale-4x-001\" \\\n  -d '{\n    \"tool\": \"upscale\",\n    \"input\": {\n      \"image_url\": \"https://example.com/hero.jpg\",\n      \"scale\": 4\n    }\n  }'\n```\n\nCredits for upscale depend on `2`\n\n, `4`\n\n, or `8`\n\n(see catalog: typically 2 / 3 / 6).\n\n```\ncurl -s -X POST https://api.picverce.com/v1/jobs \\\n  -H \"Authorization: Bearer pk_live_YOUR_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"tool\": \"enhance\",\n    \"input\": {\n      \"image_url\": \"https://example.com/soft-phone.jpg\",\n      \"face_enhance\": false\n    }\n  }'\n```\n\nShape is the same endpoint, different target field:\n\n```\ncurl -s -X POST https://api.picverce.com/v1/jobs \\\n  -H \"Authorization: Bearer pk_live_YOUR_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Idempotency-Key: demo-flux-schnell-001\" \\\n  -d '{\n    \"model\": \"flux-schnell\",\n    \"input\": {\n      \"prompt\": \"16:9 product photo of a ceramic mug on a wooden table, soft daylight, no text\",\n      \"resolution\": \"1K\",\n      \"aspect_ratio\": \"16:9\"\n    }\n  }'\n```\n\nExact `input`\n\nfields depend on the model. Always read `GET /v1/models/{id}`\n\nbefore you ship.\n\n``` js\nconst API = 'https://api.picverce.com';\nconst KEY = process.env.PICVERCE_API_KEY;\n\nasync function createBackgroundJob(imageUrl) {\n  const res = await fetch(`${API}/v1/jobs`, {\n    method: 'POST',\n    headers: {\n      Authorization: `Bearer ${KEY}`,\n      'Content-Type': 'application/json',\n      'Idempotency-Key': `bg-${Date.now()}`,\n    },\n    body: JSON.stringify({\n      tool: 'background_remover',\n      input: { image_url: imageUrl },\n    }),\n  });\n  if (!res.ok) throw new Error(await res.text());\n  return res.json();\n}\n\nasync function waitForJob(id, { intervalMs = 2000, timeoutMs = 120000 } = {}) {\n  const start = Date.now();\n  for (;;) {\n    const res = await fetch(`${API}/v1/jobs/${id}`, {\n      headers: { Authorization: `Bearer ${KEY}` },\n    });\n    if (!res.ok) throw new Error(await res.text());\n    const job = await res.json();\n    if (job.status === 'succeeded' || job.status === 'failed' || job.status === 'canceled') {\n      return job;\n    }\n    if (Date.now() - start > timeoutMs) throw new Error('job timeout');\n    await new Promise((r) => setTimeout(r, intervalMs));\n  }\n}\n\nconst created = await createBackgroundJob('https://example.com/shoe.png');\nconst done = await waitForJob(created.id);\nconsole.log(done.status, done.output);\n```\n\n| HTTP | Code | Meaning |\n|---|---|---|\n| 401 | `invalid_api_key` |\nMissing, malformed, unknown, or revoked |\n| 402 | `insufficient_credits` |\nValid key, not enough balance |\n| 403 | `plan_upgrade_required` |\nNo subscription and no credit pack |\n| 404 |\n`invalid_tool` / `invalid_model` / `job_not_found`\n|\nBad id or not yours |\n| 422 | `validation_error` |\nBody understood and refused |\n| 429 | `rate_limited` |\nToo many requests this minute |\n| 500 | `internal_error` |\nOur side |\n\nResponses include a request id. Rate limit headers (`X-RateLimit-*`\n\n) ride on authenticated calls.\n\nAPI jobs spend the **same** credits as Picverce AI in the browser.\n\n`reserved_open`\n\nuntil they settle.Manage keys and review usage charts under Account → API Keys on Picverce AI.\n\nSend `Idempotency-Key`\n\non `POST /v1/jobs`\n\nwhen your client may retry. Replays with the same key return the same job instead of double-charging. Use a new key for a new piece of work.\n\n`GET /v1/tools`\n\n/ `GET /v1/models`\n\nThe OpenAPI file at [picverce.com/openapi-v1.yaml](https://picverce.com/openapi-v1.yaml) is the contract. If this article and the YAML disagree, trust the YAML.\n\n`GET /v1/me`\n\n`GET /v1/tools`\n\nand `GET /v1/models`\n\n`POST /v1/jobs`\n\nwith `background_remover`\n\n, `enhance`\n\n, or `upscale`\n\n`GET /v1/jobs/{id}`\n\nuntil doneIf you build something on the Picverce AI Public API, tell us what you shipped. We are expanding the runnable Tools allow-list next.\n\n**— Picverce AI**", "url": "https://wpnews.pro/news/introducing-the-picverce-ai-public-api-for-image-tools-and-generation-models", "canonical_source": "https://dev.to/daniyal_khan_fd094511e963/introducing-the-picverce-ai-public-api-for-image-tools-and-generation-models-33eh", "published_at": "2026-08-27 07:01:34+00:00", "updated_at": "2026-08-27 07:18:14.605495+00:00", "lang": "en", "topics": ["developer-tools", "ai-products", "ai-tools"], "entities": ["Picverce AI"], "alternates": {"html": "https://wpnews.pro/news/introducing-the-picverce-ai-public-api-for-image-tools-and-generation-models", "markdown": "https://wpnews.pro/news/introducing-the-picverce-ai-public-api-for-image-tools-and-generation-models.md", "text": "https://wpnews.pro/news/introducing-the-picverce-ai-public-api-for-image-tools-and-generation-models.txt", "jsonld": "https://wpnews.pro/news/introducing-the-picverce-ai-public-api-for-image-tools-and-generation-models.jsonld"}}