Generate imagesLarge Language ModelsVisual Effects

Seedream API Key: Free Access, Playground and Node.js Example

Seedream runs free in the PicassoIA playground, while the PicassoIA API takes a Bearer secret from your account and serves its own models to Node.js scripts. See which route fits, what the limits are, and run a working fetch example with polling and error handling.

Seedream API Key: Free Access, Playground and Node.js Example
Cristian Da Conceicao
Founder of Picasso IA

Typing Seedream API Key into a search bar lands you in two very different places: ByteDance's own platform, and a crowd of sites that host the model for you. Which one you need depends on what you plan to ship. If you only want to see what Seedream produces, you need no credential at all. If you want a script that sends prompts and saves files, you need an account with an API provider, and providers differ a lot in price, limits and model access. This article lays out each route with facts checked against the official pages, points out where free access stops, and includes a Node.js script you can run today. One result worth stating up front: the PicassoIA API serves its own four models, and Seedream is not one of them, so the playground is where Seedream lives on PicassoIA.

Two Routes to Seedream

Seedream is a family of image models from ByteDance, and the same model name shows up behind very different doors. Before you copy any code, pick the door that matches your goal.

RouteWhat you needBest forThe catch
Browser playgroundA PicassoIA accountTesting prompts, references, 2K and 4K outputManual, one generation at a time
Direct provider APIA credential from the provider's consoleApps that call Seedream itselfPay-as-you-go billing once any trial quota ends
PicassoIA APIA pia_sk_ secret from your accountScripts that use PicassoIA's own modelsSeedream is not on its model list

A quick rule of thumb: if the output is a handful of pictures for a post or a pitch, use the playground and stop there. If you are building a product whose users trigger Seedream directly, go to the provider and budget for pay-as-you-go billing from day one. If you are automating batches of thumbnails or edits with PicassoIA models, the PicassoIA API fits, as long as your plan allows it. Mixing routes is normal: draft in the playground, then move the winning prompt into a script.

The Playground Route

The fastest way in is the browser. Seedream 5 Pro turns a text prompt, or up to 10 reference photos, into a 1K or 2K image. Seedream 4.5 pushes resolution further, with 2K and 4K output up to 4096 pixels and a batch mode that returns up to 15 related images in one run. Both model pages describe the browser experience as free and online, with no coding needed.

A designer scrolling a gallery of generated landscape photographs on a laptop at a bright kitchen table

This route suits anyone who iterates by eye: change a lighting phrase, regenerate, compare the two results side by side. It does not suit a job that needs 500 images overnight, because every generation is a manual click.

The Direct Provider Route

The Seedream 5 Pro page itself cites BytePlus guidance, noting that prompts work best under 600 English words. BytePlus runs ModelArk, its model platform, and that console is where a direct Seedream credential comes from. According to the ModelArk documentation, new accounts receive a free inference trial quota that offsets pay-as-you-go inference fees. That quota is calculated separately for each model and shared under the primary account. Image generation goes through the image generation API, which exposes an /images/generations endpoint. Third-party integration docs list https://ark.ap-southeast.bytepluses.com/api/v3 as the default regional base URL.

💡 Copy the exact model or endpoint ID from your ModelArk console, not from a blog post, this one included. Identifiers change with each release, and a stale ID fails the request before it reaches the model.

Top-down view of an oak desk with a notebook, printed technical pages, reading glasses and a cup of coffee

I am not printing a direct-provider code sample here on purpose. The request shape and model IDs belong to BytePlus, they change, and a wrong guess wastes your afternoon. The Node.js example later in this article uses the PicassoIA API, where every endpoint and field below comes straight from its documentation.

Free Access Without Any Credential

Free access is real, but it has edges. Here is what each page claims and where those claims stop.

What the Model Pages Offer

ModelOutputReference imagesNotes from its page
Seedream 5 Pro1K or 2K, PNG or JPEGUp to 10Prompts up to 4000 characters
Seedream 4.52K or 4K, custom sizes from 1024 to 4096 px1 to 14Up to 15 images per run in auto mode
Seedream 5 Lite2KSee pageLighter sibling of Seedream 5
Seedream 44KSee pageEarlier generation, still listed
Seedream 32KSee pageOldest of the group

A man in a corduroy jacket working on a laptop at a café table, seen through a rain-speckled window

What Free Does Not Mean

Free in the browser says nothing about the API. The PicassoIA Image page advertises unlimited text-to-image generation with no per-image cap. The API documentation states that predictions are currently free and use no credits, yet the same documentation names the Infinite plan as the requirement, and a request without it returns 403 plan_required.

The pricing page lists API access on more than one tier, so two pages word this differently. Check your own plan before you build a product on top of it. The same caution applies to provider trial quotas: a trial is a starting balance, not a permanent allowance.

Limits can also attach to resolution, batch size or concurrency rather than to a flat count of pictures. Read the limits table in the API section before you design a batch job around a number you have only seen on a landing page.

How to Use Seedream 5 Pro

Seedream 5 Pro on PicassoIA is quick to set up. Follow these steps in order:

  1. Open the model page. Go to Seedream 5 Pro and sign in.
  2. Write the prompt. The limit is 4000 characters, but BytePlus recommends staying under 600 English words.
  3. Pick a size. 1K is about 2 megapixels and 2K is about 4 megapixels. The default is 2K.
  4. Choose an aspect ratio. Options are 1:1, 4:3, 3:4, 16:9, 9:16, 3:2, 2:3 and 21:9. The default, match_input_image, copies the ratio of your first reference photo.
  5. Attach references if you have them. Add 1 to 10 images to blend faces, objects or styles into one result.
  6. Set the output format and generate. Choose PNG or JPEG, run it, and download the file.

A young man stepping back from a studio wall filled with ten pinned reference photographs

Prompt Settings That Matter

Three settings change results more than any adjective in the prompt:

  • Size. Use 1K for drafts and 2K for anything you will publish. Switch to Seedream 4.5 when you need 4K, because Seedream 5 Pro tops out at 2K.
  • Reference count. More references add consistency but also add constraints. Start with two or three and add more only when the face or product drifts.
  • Aspect ratio. Set it explicitly when the image has a destination. Letting it match a reference is convenient, but it silently inherits that photo's crop.

A graphic designer inspecting a large glossy print of a seaside village against a white studio wall

💡 Describe the light, not the mood. "Low sun from the left, long shadows on the pavement" gives the model something to draw. "Dramatic atmosphere" gives it nothing.

Here is a prompt that uses these settings well, written for 2K at 16:9: A ceramic bowl of oranges on a linen cloth beside a window, low morning sun from the left, soft shadows stretching across the wooden table, 85mm lens look, shallow depth of field, visible weave in the linen. It names a subject, a light direction and a surface texture in under 50 words. Seedream 5 Pro accepts far more, but a short, concrete prompt is the best baseline: add one detail per run and keep the change only if the image improves.

The PicassoIA API Route

Where the Credential Comes From

The PicassoIA developer API authenticates with a Bearer secret that starts with pia_sk_. You create it from your account through the PicassoIA API page, and each account can hold two. Treat it like a password: keep it in an environment variable, never in a repository, and rotate it if it ever leaks into a screenshot or a log.

On Node 20.6 or newer you can keep the secret in a .env file and load it with node --env-file=.env generate.mjs, so it never lands in your shell history. Add .env to .gitignore before the first commit. If you deploy the script, set the variable in your host's secret manager instead of copying the file.

Models the API Serves

The API documentation lists four models:

Seedream is not on that list. If a tutorial tells you to call a Seedream model with a pia_sk_ secret, check the model list in your own account first.

A symmetrical aisle of server racks with a technician walking away along a concrete floor

Plan and Limits

ItemValue
Base URLhttps://api.picassoia.com/v1
AuthenticationAuthorization: Bearer pia_sk_…
Create a predictionPOST /v1/models/{owner}/{name}/predictions
Poll a predictionGET /v1/predictions/{id}
Concurrent predictions5 per account, shared across all credentials and MCP generations
Request body10 MB maximum
Image as data URL5 MB each
Prompt4000 characters
Credentials per account2

Node.js Example That Runs

You need Node 18 or newer, which ships a global fetch. Save the code as generate.mjs, export your secret as PICASSOIA_SECRET, and run node generate.mjs.

The Helper Function

This helper follows the official documentation, with one change: the environment variable is named PICASSOIA_SECRET. It creates a prediction, sleeps for the interval the API suggests, polls until the job reaches a final status, and returns the output.

const API = 'https://api.picassoia.com/v1'
const headers = {
  Authorization: `Bearer ${process.env.PICASSOIA_SECRET}`,
  'Content-Type': 'application/json',
}
const sleep = (s) => new Promise((resolve) => setTimeout(resolve, s * 1000))

async function run(model, input) {
  const created = await fetch(`${API}/models/${model}/predictions`, {
    method: 'POST',
    headers,
    body: JSON.stringify({ input }),
  })
  let prediction = await created.json()
  if (!created.ok) throw new Error(`${prediction.code}: ${prediction.detail}`)

  while (!['succeeded', 'failed', 'canceled'].includes(prediction.status)) {
    await sleep(prediction.eta?.next_poll_in_seconds ?? 2)
    prediction = await (await fetch(prediction.urls.get, { headers })).json()
  }
  if (prediction.status !== 'succeeded') throw new Error(prediction.error ?? prediction.status)
  return prediction.output
}

Close-up of a developer's hands typing at a wooden desk in warm lamp light

Generate Your First Image

Add this to the same file. It asks PicassoIA Image for one 16:9 JPEG and writes it to disk.

import { writeFile } from 'node:fs/promises'

const output = await run('picassoia/picassoia-image', {
  prompt: 'A weathered fisherman mending a net on a grey pier at dawn, 35mm film look, soft side light',
  aspect_ratio: '16:9',
  num_outputs: 1,
  output_format: 'jpg',
  output_quality: 80,
})

const [url] = [].concat(output)
const image = await fetch(url)
await writeFile('result.jpg', Buffer.from(await image.arrayBuffer()))
console.log('Saved result.jpg from', url)

The [].concat(output) line accepts either a single URL or a list, so the script keeps working whichever shape the output takes.

Edit an Existing Photo

PicassoIA Image Editor Pro needs a prompt and 1 to 4 images. The documentation lists data URLs of up to 5 MB each, so read the file and encode it:

import { readFile } from 'node:fs/promises'

const photo = await readFile('portrait.jpg')
const edited = await run('picassoia/picassoia-image-editor-pro', {
  prompt: 'Replace the grey wall with warm red brick, keep the lighting and the face unchanged',
  images: [`data:image/jpeg;base64,${photo.toString('base64')}`],
  aspect_ratio: 'match_input_image',
})
console.log(edited)

Errors and Limits in Practice

Read the Error Body

When creation fails, the helper throws the API's own code and detail, which is why a missing plan shows up as plan_required instead of a vague network error. After creation, a prediction moves through five statuses:

StatusWhat it means
startingThe job exists and has produced nothing yet
processingThe model is working on it
succeededoutput holds the image URLs
failederror holds the reason
canceledThe job was stopped, for example through POST /v1/predictions/{id}/cancel

A failed prediction does not restart itself, so a retry means creating a new one. A thin wrapper handles transient failures and gives up at once on a plan error, which no amount of waiting will fix:

async function runWithRetry(model, input, attempts = 3) {
  for (let i = 1; i <= attempts; i++) {
    try {
      return await run(model, input)
    } catch (error) {
      if (i === attempts || String(error.message).startsWith('plan_required')) throw error
      await sleep(i * 5)
    }
  }
}

Stay Under Five Predictions

The limit is five concurrent predictions per account, and the count is shared across every credential and every MCP generation. A batch script and an open chat session draw from the same pool of five. A small worker pool keeps you under the cap and leaves one slot free:

async function pool(tasks, limit = 4) {
  const results = []
  let next = 0
  const worker = async () => {
    while (next < tasks.length) {
      const i = next++
      results[i] = await tasks[i]()
    }
  }
  await Promise.all(Array.from({ length: limit }, worker))
  return results
}

const prompts = ['a red bicycle against a pale wall', 'a lighthouse on a grey coast']
const images = await pool(
  prompts.map((prompt) => () => run('picassoia/picassoia-image', { prompt, aspect_ratio: '16:9' })),
)

A barista pulling a shot into the fifth of five white cups lined up on a wooden counter

Add an LLM and Motion

An image is rarely the last step. Two other PicassoIA collections slot straight into the pipeline: large language models before the image, and video after it.

Draft Prompts With an LLM

A one-line idea gives the model little to work with. Paste it into Claude Sonnet 5 or Gemini 3.5 Flash and ask for structure:

Rewrite this idea as one image prompt of about 120 words with the subject, setting, light direction, lens and surface texture: "fisherman mending nets at dawn".

Send the result to Seedream 5 Pro in the playground or to PicassoIA Image through the script above. The four API models listed earlier do not include a chat model, so this step happens on the site.

Animate Results

Once a still looks right, Seedance 2.5 Lite can use it as the opening frame. Its page lists clips of 5 or 10 seconds at 480p or 720p, with synchronized audio, and describes unlimited generation for Wonder members. PicassoIA Video takes the same image-to-video input with a fixed 5 seconds at 24 frames per second. For stylized looks, PicassoIA also offers an effects category with hundreds of video effects, reachable from the all models page.

Describe motion in order, the way a director would call it: The fisherman pulls the net toward him, the camera drifts slowly to the right, gulls cross the pale sky, the soft light holds steady. One subject action, one camera move and one lighting note are enough for a short clip.

A video editor in a dim suite with two monitors showing a mountain lake at sunrise

Run Your First Seedream Prompt

Pick one idea, one sentence long, and turn it into a picture today. Open Seedream 5 Pro on Picasso IA, paste a prompt, choose 2K and 16:9, and generate. Run the same prompt on Seedream 4.5 at 4K and compare the two files at full size.

When clicking stops being practical, create a PicassoIA API credential, paste the helper above into a file, and send your prompts through PicassoIA Image. Change one variable per run, keep the seeds you like, and let the five-slot limit set your pace. Every model mentioned here is one click away on the all models page.

Share this article