Skip to content

Authentication

All Reimage API requests require authentication using an API key. This guide covers how to authenticate your requests across different programming languages.

API Key Format

Your API key is available in your Reimage dashboard and should be included in the Authorization header as a Bearer token:

http
Authorization: Bearer YOUR_API_KEY

Security Best Practice

Never commit your API key to version control or expose it in client-side code. Always store it in environment variables or secure configuration files.

Authentication Examples

JavaScript / Node.js

javascript
// Using fetch (browser or Node.js 18+)
const API_KEY = process.env.REIMAGE_API_KEY;

const response = await fetch('https://api.reimage.dev/user/', {
  method: 'GET',
  headers: {
    'Authorization': `Bearer ${API_KEY}`
  }
});

const data = await response.json();
javascript
// Using axios
import axios from 'axios';

const API_KEY = process.env.REIMAGE_API_KEY;

const client = axios.create({
  baseURL: 'https://api.reimage.dev',
  headers: {
    'Authorization': `Bearer ${API_KEY}`
  }
});

const response = await client.get('/user/');
console.log(response.data);

React

jsx
import { useState, useEffect } from 'react';

function UserProfile() {
  const [user, setUser] = useState(null);

  useEffect(() => {
    // IMPORTANT: API key should come from your backend, not client-side!
    fetch('https://api.reimage.dev/user/', {
      headers: {
        'Authorization': `Bearer ${process.env.REACT_APP_REIMAGE_API_KEY}`
      }
    })
      .then(res => res.json())
      .then(data => setUser(data));
  }, []);

  if (!user) return <div>Loading...</div>;

  return (
    <div>
      <h1>{user.name}</h1>
      <p>Storage: {user.storage_used} / {user.storage_limit} KB</p>
    </div>
  );
}

Security Warning

In production React apps, never expose your API key in the frontend. Instead, proxy requests through your backend server which securely stores the API key.

Python

python
import os
import requests

API_KEY = os.environ.get('REIMAGE_API_KEY')
BASE_URL = 'https://api.reimage.dev'

# Create a session with default headers
session = requests.Session()
session.headers.update({
    'Authorization': f'Bearer {API_KEY}'
})

# Make requests
response = session.get(f'{BASE_URL}/user/')
user = response.json()
print(user)
python
# Using requests library directly
import requests

headers = {
    'Authorization': 'Bearer YOUR_API_KEY'
}

response = requests.get(
    'https://api.reimage.dev/user/',
    headers=headers
)

if response.status_code == 200:
    user = response.json()
    print(f"User: {user['name']}")
else:
    print(f"Error: {response.status_code}")

PHP

php
<?php
// Using cURL
$apiKey = getenv('REIMAGE_API_KEY');
$baseUrl = 'https://api.reimage.dev';

function makeRequest($endpoint, $method = 'GET', $data = null) {
    global $apiKey, $baseUrl;

    $ch = curl_init($baseUrl . $endpoint);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Authorization: Bearer ' . $apiKey
    ]);

    if ($method === 'POST') {
        curl_setopt($ch, CURLOPT_POST, true);
        if ($data) {
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        }
    } elseif ($method === 'DELETE') {
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
    }

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    return [
        'status' => $httpCode,
        'data' => json_decode($response, true)
    ];
}

// Example usage
$result = makeRequest('/user/');
print_r($result['data']);
?>
php
<?php
// Using Guzzle
require 'vendor/autoload.php';

use GuzzleHttp\Client;

$client = new Client([
    'base_uri' => 'https://api.reimage.dev',
    'headers' => [
        'Authorization' => 'Bearer ' . getenv('REIMAGE_API_KEY')
    ]
]);

$response = $client->request('GET', '/user/');
$user = json_decode($response->getBody(), true);
print_r($user);
?>

Go

go
package main

import (
    "encoding/json"
    "fmt"
    "io"
    "net/http"
    "os"
)

type Client struct {
    BaseURL    string
    HTTPClient *http.Client
    APIKey     string
}

func NewClient(apiKey string) *Client {
    return &Client{
        BaseURL:    "https://api.reimage.dev",
        HTTPClient: &http.Client{},
        APIKey:     apiKey,
    }
}

func (c *Client) NewRequest(method, endpoint string, body io.Reader) (*http.Request, error) {
    req, err := http.NewRequest(method, c.BaseURL+endpoint, body)
    if err != nil {
        return nil, err
    }

    req.Header.Set("Authorization", "Bearer "+c.APIKey)
    return req, nil
}

func (c *Client) GetUser() (map[string]interface{}, error) {
    req, err := c.NewRequest("GET", "/user/", nil)
    if err != nil {
        return nil, err
    }

    resp, err := c.HTTPClient.Do(req)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()

    var user map[string]interface{}
    if err := json.NewDecoder(resp.Body).Decode(&user); err != nil {
        return nil, err
    }

    return user, nil
}

func main() {
    apiKey := os.Getenv("REIMAGE_API_KEY")
    client := NewClient(apiKey)

    user, err := client.GetUser()
    if err != nil {
        fmt.Printf("Error: %v\n", err)
        return
    }

    fmt.Printf("User: %+v\n", user)
}

Rust

rust
use reqwest::header::{HeaderMap, HeaderValue, AUTHORIZATION};
use serde_json::Value;
use std::env;

struct ReimageCl ient {
    client: reqwest::Client,
    base_url: String,
}

impl ReimageClient {
    fn new(api_key: &str) -> Result<Self, Box<dyn std::error::Error>> {
        let mut headers = HeaderMap::new();
        headers.insert(
            AUTHORIZATION,
            HeaderValue::from_str(&format!("Bearer {}", api_key))?
        );

        let client = reqwest::Client::builder()
            .default_headers(headers)
            .build()?;

        Ok(Self {
            client,
            base_url: "https://api.reimage.dev".to_string(),
        })
    }

    async fn get_user(&self) -> Result<Value, Box<dyn std::error::Error>> {
        let url = format!("{}/user/", self.base_url);
        let response = self.client.get(&url).send().await?;
        let user = response.json::<Value>().await?;
        Ok(user)
    }
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let api_key = env::var("REIMAGE_API_KEY")?;
    let client = ReimageClient::new(&api_key)?;

    let user = client.get_user().await?;
    println!("User: {:?}", user);

    Ok(())
}

Environment Variables

It's best practice to store your API key in environment variables:

bash
REIMAGE_API_KEY=sk_live_abc123def456ghi789
javascript
// Load from .env file
require('dotenv').config();
const apiKey = process.env.REIMAGE_API_KEY;
python
# Load from .env file
from dotenv import load_dotenv
import os

load_dotenv()
api_key = os.getenv('REIMAGE_API_KEY')
php
// Load from .env file
require 'vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
$apiKey = $_ENV['REIMAGE_API_KEY'];

Authentication Errors

401 Unauthorized

If you receive a 401 error, check that:

  1. Your API key is correct
  2. The Authorization header is properly formatted
  3. You're using Bearer prefix before the API key
  4. Your API key hasn't been revoked
json
{
  "error": "Unauthorized"
}

Missing Authorization Header

If you forget to include the header:

json
{
  "error": "Unauthorized"
}

Testing Your Authentication

Use this simple test to verify your authentication is working:

bash
curl -H "Authorization: Bearer YOUR_API_KEY" \
  https://api.reimage.dev/user/

Expected response:

json
{
  "name": "John Doe",
  "bucket_id": "abc123",
  "storage_used": 1024,
  "storage_limit": 10485760,
  "image_count": 5,
  "transform_count": 150,
  "subscription_tier": 1
}

Next Steps

Released under the MIT License.