# Getting Started

Source: https://docs.prodia.com/

Generate images and video through a single API. Create a token in the [API Dashboard](https://app.prodia.com/api), then try this request.

## Your first request

With cURL installed, run these commands in a Bash-compatible terminal:

```bash
export PRODIA_TOKEN=your-token-here

curl --fail-with-body --silent --show-error \
  -H "Authorization: Bearer $PRODIA_TOKEN" \
  -H 'Accept: image/jpeg' \
  --json '{
    "type": "inference.flux-fast.schnell.txt2img.v2",
    "config": { "prompt": "puppies in a cloud, 4k" }
  }' \
  --output puppies.jpg \
  https://inference.prodia.com/v2/job
```

On success, open `puppies.jpg` to see the generated image. Keep your token on the server, in an environment variable; do not put it in browser code.

For JavaScript and Python setup, follow the steps below. To use these docs with a coding assistant, select **Copy for AI** above. The [documentation index](https://docs.prodia.com/llms.txt) and [full markdown export](https://docs.prodia.com/llms-full.txt) are also available.

## API Token

If you don't already have an account navigate to the [app.prodia.com](https://app.prodia.com/) and click *Sign Up*.

> note:
>
> You'll need a Pro subscription in order to generate a v2 token. Make sure to
> [upgrade](https://app.prodia.com/) your account to Pro if you haven't
> already!

Go to the [API Dashboard](https://app.prodia.com/api) to generate a token. You
should see a token management screen similar to this:

![Prodia API Dashboard v2 Token Management](https://docs.prodia.com/llms/assets/1b41ea0ddd58-prodia-app-v2-tokens.png)

If the token management interface isn't showing up please check that you have
an active Pro subscription.

Give the token a meaningful label like `getting started` and click *Create API
Key*:

![Prodia API Dashboard v2 Token Create API Key](https://docs.prodia.com/llms/assets/e0ac509e15b5-prodia-app-v2-tokens-create.png)

Next copy the key to a safe location. We will use this key for the remainder of
the tutorial.

![Prodia API Dashboard v2 Token Copy API Key](https://docs.prodia.com/llms/assets/e31dc66bfdcb-prodia-app-v2-tokens-copy.png)

> caution:
>
> Make sure to copy the API Key to a safe place (e.g. a password manager). The
> API Key will only be visible in the dashboard once.

Now that we have an API key we are ready to set up the project.

## Project Setup

```bash
# Create a project directory.
mkdir prodia-getting-started
cd prodia-getting-started
```

### prodia-js

Install Node (if not already installed):

### macOS

```bash
brew install node
# Close the current terminal and open a new one so that node is available.
```

### Linux

```bash
apt install node
# Close the current terminal and open a new one so that node is available.
```

### Windows

```bash
winget install -e --id OpenJS.NodeJS.LTS
# Close the current terminal and open a new one so that node is available.
```

Create project skeleton:

```bash
# Requires node --version >= 18
# Initialize the project with npm.
npm init -y

# Install the prodia-js library.
npm install prodia --save
```

### requests

Install Python (if not already installed):

### macOS

```bash
brew install python
# Close the current terminal and open a new one so that python is available.
```

### Linux

```bash
apt install python3 python3-venv python-is-python3
# Close the current terminal and open a new one so that python is available.
```

### Windows

```bash
winget install -e --id Python.Python.3.12
# Close the current terminal and open a new one so that python is available.
```

```bash
# Requires python --version >= 3.12
python -m venv venv
source venv/bin/activate
pip install requests
```

### curl

Install curl (if not already installed):

### macOS

```bash
brew install curl
# Close the current terminal and open a new one so that curl is available.
```

### Linux

```bash
apt install curl
# Close the current terminal and open a new one so that curl is available.
```

### Windows

```bash
# NOTE: Windows 10 and up have curl installed by default and this can be
# skipped.
winget install -e --id cURL.cURL
# Close the current terminal and open a new one so that curl is available.
```

```bash
# Export your token so it can be used by the main code.
export PRODIA_TOKEN=your-token-here
```

> note:
>
> Your token is exported to an environment variable. If you close or switch your
> shell you'll need to run `export PRODIA_TOKEN=your-token-here` again.

Create a main file for your project:

### prodia-js

```js title="main.js"
const { createProdia } = require("prodia/v2");

const prodia = createProdia({
    token: process.env.PRODIA_TOKEN // get it from environment
});
```

### requests

Create the following `main.py`

```python title="main.py"
from requests.adapters import HTTPAdapter, Retry
import os
import requests
import sys


prodia_token = os.getenv('PRODIA_TOKEN')
prodia_url = 'https://inference.prodia.com/v2/job'

session = requests.Session()
retries = Retry(allowed_methods=None, status_forcelist=Retry.RETRY_AFTER_STATUS_CODES)
session.mount('http://', HTTPAdapter(max_retries=retries))
session.mount('https://', HTTPAdapter(max_retries=retries))
session.headers.update({'Authorization': f"Bearer {prodia_token}"})
```

### curl

```bash title="main.sh"
set -euo pipefail
```

You're now ready to make some API calls!

## Text to Image

Add the following to the main file:

### prodia-js

```js
const fs = require("node:fs/promises");
const { createProdia } = require("prodia/v2");

const prodia = createProdia({
    token: process.env.PRODIA_TOKEN // get it from environment
});

(async () => {
    // run a flux schnell generation
    const job = await prodia.job({
        type: "inference.flux-fast.schnell.txt2img.v2",
        config: {
            prompt: "puppies in a cloud, 4k",
        }
    });

    const image = await job.arrayBuffer();

    await fs.writeFile("puppies.jpg", new Uint8Array(image));
})();
```

### requests

```python
from requests.adapters import HTTPAdapter, Retry
import os
import requests
import sys


prodia_token = os.getenv('PRODIA_TOKEN')
prodia_url = 'https://inference.prodia.com/v2/job'

session = requests.Session()
retries = Retry(allowed_methods=None, status_forcelist=Retry.RETRY_AFTER_STATUS_CODES)
session.mount('http://', HTTPAdapter(max_retries=retries))
session.mount('https://', HTTPAdapter(max_retries=retries))
session.headers.update({'Authorization': f"Bearer {prodia_token}"})

headers = {
    'Accept': 'image/jpeg',
}

job = {
    'type': 'inference.flux-fast.schnell.txt2img.v2',
    'config': {
        'prompt': 'puppies in a cloud, 4k',
    },
}

res = session.post(prodia_url, headers=headers, json=job)
print(f"Request ID: {res.headers['x-request-id']}")
print(f"Status: {res.status_code}")

if res.status_code != 200:
    print(res.text)
    sys.exit(1)

with open('puppies.jpg', 'wb') as f:
    f.write(res.content)
```

### curl

```bash
set -euo pipefail

job=$(cat <<EOF
{
  "type": "inference.flux-fast.schnell.txt2img.v2",
  "config": {
    "prompt": "puppies in a cloud, 4k"
  }
}
EOF
)

curl -sSf \
  -H "Authorization: Bearer $PRODIA_TOKEN" \
  -H 'Accept: image/jpeg' \
  --json "$job" \
  --output puppies.jpg \
  --retry 3 \
  https://inference.prodia.com/v2/job
```

Run the main code:

### prodia-js

```bash
node main.js
```

### requests

```bash
python main.py
```

### curl

```bash
bash main.sh
```

Open the output image `puppies.jpg`:

### macOS

```bash
open puppies.jpg
```

### Linux

```bash
xdg-open puppies.jpg
```

### Windows

```bash
start puppies.jpg
```

And you'll see some cute puppies like these:

![Generated puppies sitting in a cloud](https://docs.prodia.com/llms/assets/0561bd3d029f-puppies.jpg)

Congratulations on finishing your first project using Prodia!
