---
title: Python Avatar Library
description: >
Use the DiceBear Python library to generate SVG profile pictures on the
server. Python 3.10+ with an API identical to the JavaScript, PHP, Rust, and
Go libraries.
---
# Python avatar library
The Python library provides an API identical to the
[JavaScript library](/how-to-use/js-library/). It requires Python 3.10 or
higher. The same seed and style definition produce SVGs byte-identical to the
JavaScript reference.
## Installation
You need two packages: the core library `dicebear-core` and the avatar style
definitions `dicebear-styles`.
```bash
pip install dicebear-core dicebear-styles
```
## Usage
We use the avatar style [lorelei](/styles/lorelei/) in our example. You can find
more avatar styles [here](/styles/).
```python
from importlib.resources import files
from dicebear import Avatar, Style
style = Style.from_json(
files("dicebear_styles").joinpath("lorelei.json").read_text("utf-8")
)
avatar = Avatar(style, {
"seed": "John",
# ... other options
})
svg = avatar.to_string()
```
Each avatar style comes with several options. You can find them on the details
page of each [avatar style](/styles/).
:::info
We provide a large number of avatar styles from different artists. The avatar
styles are licensed under different licenses that the artists can choose
themselves. For a quick overview we have created an
[license overview](/licenses/) for you.
:::
## Deterministic avatars
The `seed` option is the key to generating deterministic avatars. The same seed
will always produce the same avatar:
```python
avatar1 = Avatar(style, {"seed": "user-123"})
avatar2 = Avatar(style, {"seed": "user-123"})
avatar1.to_string() == avatar2.to_string() # True
```
## Classes
### `Avatar`
The main class for generating avatars. Pass a `Style` instance and optional
options.
```python
from dicebear import Avatar
avatar = Avatar(style, {
# ... options
})
```
### `Style`
An immutable wrapper around a style definition. Reuse it when generating
multiple avatars from the same style.
```python
from dicebear import Avatar, Style
style = Style(definition)
avatar1 = Avatar(style, {"seed": "Alice"})
avatar2 = Avatar(style, {"seed": "Bob"})
```
### `OptionsDescriptor`
Describes all valid options for a given style. Useful for building UIs or
validating user input.
```python
from dicebear import OptionsDescriptor, Style
descriptor = OptionsDescriptor(Style(definition))
fields = descriptor.to_json()
```
## Methods
### `to_string()` / `str(avatar)`
**Return type:** `str`
Returns the avatar as SVG in XML format. The `__str__` method allows using the
avatar directly in string contexts.
```python
avatar = Avatar(style, {"seed": "Alice"})
svg = avatar.to_string()
# or
svg = str(avatar)
```
### `to_json()`
**Return type:** `dict` with keys `svg` and `options`
Returns a dict with the SVG and the resolved options.
```python
avatar = Avatar(style, {"seed": "Alice"})
result = avatar.to_json()
# result["svg"] → ''
# result["options"] → {"seed": "Alice", ...}
```
### `to_data_uri()`
**Return type:** `str`
Returns the avatar as [data URI](https://en.wikipedia.org/wiki/Data_URI_scheme).
```python
avatar = Avatar(style, {"seed": "Alice"})
data_uri = avatar.to_data_uri()
#
```
## Core options
The core options are identical to the JavaScript library. See the
[JS Library core options](/how-to-use/js-library/#core-options) for the full
reference. Here are the options in Python syntax:
```python
avatar = Avatar(style, {
"seed": "Alice",
"flip": "horizontal", # "none", "horizontal", "vertical", "both"
"rotate": 10, # -360 to 360, or [min, max] range
"scale": 0.9, # 0 to 10 (1 = original), or [min, max] range
"borderRadius": 50, # 0-50 (50 = circle)
"size": 128,
"translateX": 0, # -1000 to 1000 (percent of canvas width)
"translateY": 0, # -1000 to 1000 (percent of canvas height)
"idRandomization": True,
"title": "User Avatar",
"fontFamily": "Arial", # or ["Arial", "Helvetica"]
"fontWeight": 700, # 1-1000
"backgroundColor": ["#b6e3f4", "#c0aede"],
"backgroundColorFill": "solid", # "solid", "linear", "radial"
})
```
Dynamic component and color options also work the same way. See the
[JS Library documentation](/how-to-use/js-library/#dynamic-component-options)
for all available patterns.
## Examples
### Avatar with custom background
```python
avatar = Avatar(style, {
"seed": "Alice",
"backgroundColor": ["#b6e3f4", "#c0aede", "#d1d4f9"],
})
```
### Fixed size avatar
```python
from importlib.resources import files
from dicebear import Avatar, Style
style = Style.from_json(
files("dicebear_styles").joinpath("bottts.json").read_text("utf-8")
)
avatar = Avatar(style, {
"seed": "robot-42",
"size": 128,
"borderRadius": 50, # circular avatar
})
```
### Avatar with transformations
```python
from importlib.resources import files
from dicebear import Avatar, Style
style = Style.from_json(
files("dicebear_styles").joinpath("avataaars.json").read_text("utf-8")
)
avatar = Avatar(style, {
"seed": "Jane",
"flip": "horizontal",
"rotate": 10,
"scale": 0.9,
"translateY": 5,
})
```
### Multiple avatars on the same page
When rendering multiple avatars on the same page, use `idRandomization` to
prevent SVG ID conflicts:
```python
from dicebear import Avatar, Style
style = Style(definition)
users = ["alice", "bob", "charlie"]
avatars = [
Avatar(style, {"seed": user, "idRandomization": True}).to_string()
for user in users
]
```
### Weighted variant selection
```python
avatar = Avatar(style, {
"seed": "Alice",
"topVariant": {"short01": 2, "short02": 2, "long01": 1},
})
```