Generate avatars
Call our avatar generator API with a name or a seed value and get back a placeholder avatar — initials on a colored background or an abstract geometric pattern — generated on the spot rather than pulled from a static icon set. It exists for every product screen that needs a face before the user has uploaded one.
Run — free
Runs in your browser. Free, unlimited — your data never leaves this page.
The problem: a user without a photo
Most people join a product before they ever upload a profile photo, which leaves a gap in every avatar slot across the interface: comment threads, team rosters, chat lists, admin dashboards. Filling that gap with one generic gray silhouette for every unphotographed user makes a busy screen genuinely hard to scan. POST /image/avatar generates a distinct, recognizable placeholder per user instead, so a list of ten people looks like ten people, not one icon repeated ten times.
What you get back
You send a name or any consistent seed value, the task is queued and returns a task_id right away, and the rendered avatar arrives afterward through a signed webhook or a signed link valid for 24 hours. Using the same seed consistently produces the same avatar, so a given user keeps a stable placeholder across sessions until they upload a real photo.
Two established styles, not one
Initials-on-a-color avatars trace back to early collaboration tools that needed a fast, legible stand-in before profile photos were common, and they remain popular because two letters on a solid background read instantly even at a tiny size. Geometric placeholder avatars grew out of a related need — a unique, deterministic visual identity generated purely from data, useful anywhere a photo is inappropriate or unavailable but a flat gray circle feels too anonymous. Offering both means you can match the tone of a formal admin panel or a more playful consumer app.
Where it fits in a signup flow
Because generation is fast and deterministic per seed, it drops cleanly into account creation: the moment a user record is created, request an avatar keyed to their name or user ID, store the result, and swap it out later only if they upload their own photo. No placeholder graphic has to ship bundled with your app.
What it is not
This generates a placeholder identity, not a stylized portrait or an AI-drawn face — it deliberately stays abstract, which keeps it fast, predictable, and appropriate for any user regardless of how much personal data you actually hold about them.
What you can do with it
New account onboarding
Generate a stable placeholder avatar the instant an account is created, before the user ever uploads a real photo.
Team and roster displays
Give every team member a distinct, recognizable avatar in a directory or org chart even when several haven't set a profile photo.
Comment and chat interfaces
Keep a busy comment thread or chat list visually scannable by giving each unphotographed participant a unique placeholder.
Admin and internal tools
Populate internal dashboards with consistent, deterministic avatars keyed to user IDs without storing or managing image assets.
FAQ
How do I generate an avatar with the API?
Send a name or seed value to POST /image/avatar; it returns a task_id immediately and the rendered avatar arrives afterward via webhook or a signed link valid for 24 hours.
Is the avatar generator API free?
The tool above runs free in your browser. The API is paid — each call draws from your prepaid ForHosting KIT balance: top up from $10.00 (it never expires), pay each request's published price, and a call with no balance returns HTTP 402. No subscription, no tokens, and a failed task is never charged.
How much does generating an avatar cost?
Each request costs $0.002, with no per-image add-on, and you're only billed when generation succeeds.
What avatar styles are available?
You can generate initials-based avatars on a colored background or abstract geometric placeholder avatars, depending on which style fits your interface.
Will the same user always get the same avatar?
Yes, if you submit the same seed value consistently, such as a user ID or name, the generated avatar stays stable across requests.
Am I charged if avatar generation fails?
No. A failed task is retried automatically up to three times and is never billed if it doesn't ultimately succeed.
Can I generate avatars in bulk for an existing user base?
Yes, submit each user as an independent asynchronous request and track them by their individual task_id, which suits a one-time backfill for an existing database.
How is this different from a static avatar icon set?
A static set repeats a handful of generic icons across many users; this generates a distinct avatar per seed on demand, so no two unphotographed users need to look identical.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, and soon from our app, email and Telegram.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/image/avatar \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"image":"https://ejemplo.com/imagen.jpg"}'const res = await fetch("https://api.kit.forhosting.com/image/avatar", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"image": "https://ejemplo.com/imagen.jpg"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/image/avatar",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"image": "https://ejemplo.com/imagen.jpg"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/image/avatar", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"image":"https://ejemplo.com/imagen.jpg"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"image":"https://ejemplo.com/imagen.jpg"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/image/avatar", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"image": "https://ejemplo.com/imagen.jpg"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "image.avatar",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_mb | 15 |
max_megapixels | 12 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |