Skip to main content
POST
/
avatars
/
generate
Generate Avatar
curl --request POST \
  --url https://percify.io/api/avatars/generate \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "prompt": "Professional headshot of a young entrepreneur, confident smile, modern office background, warm lighting",
  "model": "flux",
  "aspectRatio": "1:1",
  "negativePrompt": "<string>",
  "seed": 123
}
'
{
  "id": "<string>",
  "imageUrl": "<string>",
  "prompt": "<string>",
  "model": "<string>",
  "status": "processing",
  "creditsUsed": 123,
  "createdAt": "2023-11-07T05:31:56Z"
}

Endpoint

POST https://api.percify.io/v1/avatars/generate

Request Body

prompt
string
required
Text description of the desired avatar. Be specific about appearance, style, setting, and mood.Example: "cyberpunk warrior, neon lights, futuristic city, dramatic lighting"
model
string
default:"flux"
AI model to use for generation.Options:
  • flux - Fast, 2 credits (standard quality)
  • imagen3 - High quality, 5 credits
  • reality4 - Ultra realistic, 5 credits
negativePrompt
string
Elements to avoid in the generation.Example: "blurry, low quality, distorted, extra limbs"
aspectRatio
string
default:"1:1"
Output image aspect ratio.Options: 1:1, 16:9, 9:16, 4:3, 3:4
guidanceScale
number
default:"10"
How closely to follow the prompt (7-15 recommended).Range: 1-20. Higher values = stricter adherence
seed
number
Random seed for reproducible results. Use same seed with same prompt for identical output.Range: 0 to 2147483647
batchSize
number
default:"1"
Number of variations to generate simultaneously.Range: 1-4. Each variation costs credits.
stylePreset
string
Apply a predefined style template.Options: professional, anime, fantasy, cyberpunk, renaissance, realistic

Response

id
string
Unique avatar identifier
status
string
Current generation status: queued, processing, completed, failed
prompt
string
The prompt used for generation
model
string
AI model used
imageUrl
string
Full resolution image URL (available when status = completed)
thumbnailUrl
string
Thumbnail image URL (available when status = completed)
width
number
Image width in pixels
height
number
Image height in pixels
creditCost
number
Credits deducted for this generation
createdAt
string
ISO 8601 timestamp of creation

Example Request

const response = await fetch('https://api.percify.io/v1/avatars/generate', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${process.env.PERCIFY_API_KEY}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    prompt: 'elegant elven sorceress, flowing robes, mystical forest, magical glow',
    model: 'imagen3',
    negativePrompt: 'blurry, low quality, distorted',
    aspectRatio: '1:1',
    guidanceScale: 12,
    seed: 42
  })
});

const avatar = await response.json();
console.log(avatar);

Example Response

Processing (Immediate Response)

{
  "id": "avatar_abc123",
  "status": "processing",
  "prompt": "elegant elven sorceress, flowing robes, mystical forest, magical glow",
  "negativePrompt": "blurry, low quality, distorted",
  "model": "imagen3",
  "aspectRatio": "1:1",
  "guidanceScale": 12,
  "seed": 42,
  "creditCost": 5,
  "createdAt": "2025-11-25T06:10:00Z"
}

Completed (After Polling)

{
  "id": "avatar_abc123",
  "status": "completed",
  "prompt": "elegant elven sorceress, flowing robes, mystical forest, magical glow",
  "negativePrompt": "blurry, low quality, distorted",
  "model": "imagen3",
  "imageUrl": "https://cdn.percify.io/avatars/avatar_abc123.png",
  "thumbnailUrl": "https://cdn.percify.io/avatars/avatar_abc123_thumb.png",
  "width": 1024,
  "height": 1024,
  "aspectRatio": "1:1",
  "guidanceScale": 12,
  "seed": 42,
  "creditCost": 5,
  "metadata": {
    "generationTime": 7.8,
    "modelVersion": "imagen3-v2.1"
  },
  "createdAt": "2025-11-25T06:10:00Z",
  "completedAt": "2025-11-25T06:10:08Z"
}

Error Responses

Insufficient Credits

{
  "error": {
    "code": "insufficient_credits",
    "message": "Not enough credits. Required: 5, Available: 2",
    "details": {
      "required": 5,
      "available": 2,
      "shortfall": 3
    }
  }
}

Invalid Prompt

{
  "error": {
    "code": "invalid_prompt",
    "message": "Prompt violates content policy",
    "details": {
      "reason": "prohibited_content",
      "categories": ["violence"]
    }
  }
}

Rate Limited

{
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Too many requests. Try again in 45 seconds",
    "details": {
      "retryAfter": 45,
      "limit": 60,
      "window": "1m"
    }
  }
}

Polling for Completion

After initiating generation, poll the avatar status endpoint:
async function waitForAvatar(avatarId) {
  const maxWait = 60000; // 60 seconds
  const pollInterval = 2000; // 2 seconds
  const startTime = Date.now();
  
  while (Date.now() - startTime < maxWait) {
    const response = await fetch(
      `https://api.percify.io/v1/avatars/${avatarId}`,
      {
        headers: {
          'Authorization': `Bearer ${process.env.PERCIFY_API_KEY}`
        }
      }
    );
    
    const avatar = await response.json();
    
    if (avatar.status === 'completed') {
      return avatar;
    } else if (avatar.status === 'failed') {
      throw new Error(`Generation failed: ${avatar.error}`);
    }
    
    await new Promise(resolve => setTimeout(resolve, pollInterval));
  }
  
  throw new Error('Avatar generation timed out');
}

// Usage
const avatar = await waitForAvatar('avatar_abc123');
console.log(`Avatar ready: ${avatar.imageUrl}`);

Batch Generation

Generate multiple variations in parallel:
const response = await fetch('https://api.percify.io/v1/avatars/generate', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${process.env.PERCIFY_API_KEY}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    prompt: 'space explorer, futuristic helmet, stars background',
    model: 'flux',
    batchSize: 4 // Generate 4 variations
  })
});

const result = await response.json();
// result.avatars = array of 4 avatar objects
Each variation in a batch costs credits. batchSize: 4 with model: 'flux' = 8 credits total (4 × 2)

Best Practices

Prompt Engineering: Be specific and descriptive. Good prompts include:
  • Subject/character description
  • Art style or aesthetic
  • Setting and environment
  • Lighting conditions
  • Mood or emotion
Cost Optimization:
  1. Start with flux model (2 credits) for iteration
  2. Switch to premium models once prompt is refined
  3. Use seeds to reproduce good results without regenerating
  4. Batch similar prompts together for efficiency

Authorizations

Authorization
string
header
required

Your Percify API token

Body

application/json
prompt
string
required

Text description of the avatar to generate

Example:

"Professional headshot of a young entrepreneur, confident smile, modern office background, warm lighting"

model
enum<string>
default:flux

AI model to use for generation

Available options:
flux,
imagen3,
reality4
aspectRatio
enum<string>
default:1:1

Output image aspect ratio

Available options:
1:1,
16:9,
9:16,
4:3,
3:4
negativePrompt
string

Elements to avoid in the generation

seed
integer

Seed for reproducible results

Response

Avatar generated successfully

id
string

Unique avatar identifier

imageUrl
string<uri>

URL to the generated avatar image

prompt
string

Prompt used for generation

model
string

AI model used

status
enum<string>

Generation status

Available options:
processing,
completed,
failed
creditsUsed
integer

Credits consumed for this generation

createdAt
string<date-time>