AeroModel

Documentation

Multi-language code samples

How to call the API from curl, JavaScript, TypeScript, Python, C#, and PowerShell. All examples target the main /v1/images/plane endpoint, but the patterns adapt to other routes.

Base URL: https://api.aeromodel.dash-systems.fr


curl (bash / WSL / macOS)

Download an image

curl "https://api.aeromodel.dash-systems.fr/v1/images/plane?plane=A320&airline=AF&resolution=hd&align=bottom" \
  -H "x-api-key: $AEROMODEL_KEY" \
  -o a320-airfrance.png

Read diagnostic headers

curl -I "https://api.aeromodel.dash-systems.fr/v1/images/plane?plane=A320&airline=AF" \
  -H "x-api-key: $AEROMODEL_KEY"

Catalog as JSON

curl "https://api.aeromodel.dash-systems.fr/v1/catalog/planes?query=787" \
  -H "x-api-key: $AEROMODEL_KEY" | jq

JSON format on images-plane (without downloading the image)

curl "https://api.aeromodel.dash-systems.fr/v1/images/plane?plane=A320&airline=AF&format=json" \
  -H "x-api-key: $AEROMODEL_KEY" | jq

PowerShell (Windows)

$base = "https://api.aeromodel.dash-systems.fr"
$h = @{ "x-api-key" = $env:AEROMODEL_KEY }

# Download
Invoke-WebRequest -Uri "$base/v1/images/plane?plane=A320&airline=AF&resolution=hd&align=bottom" `
  -Headers $h `
  -OutFile "a320-airfrance.png"

# Diagnostic headers
(Invoke-WebRequest -Uri "$base/v1/images/plane?plane=A320&airline=AF" -Headers $h).Headers

# Catalog JSON
Invoke-RestMethod -Uri "$base/v1/catalog/planes?query=787" -Headers $h

JavaScript (browser or Node.js)

Fetch + Blob (browser)

const KEY = "<key>"; // ⚠️ do NOT expose client-side in production
const url = "https://api.aeromodel.dash-systems.fr/v1/images/plane?plane=A320&airline=AF&align=bottom";

const response = await fetch(url, { headers: { "x-api-key": KEY } });
const blob = await response.blob();
const objectUrl = URL.createObjectURL(blob);

document.querySelector("img").src = objectUrl;

Without a key — direct display (watermark)

<img src="https://api.aeromodel.dash-systems.fr/v1/images/plane?plane=A320&airline=AF&align=bottom" />

Node.js — save to file

import { writeFile } from "node:fs/promises";

const r = await fetch(
  "https://api.aeromodel.dash-systems.fr/v1/images/plane?plane=A320&airline=AF&align=bottom",
  { headers: { "x-api-key": process.env.AEROMODEL_KEY } }
);
await writeFile("a320.png", Buffer.from(await r.arrayBuffer()));

Catalog with autocomplete

async function searchPlanes(q) {
  const r = await fetch(
    `https://api.aeromodel.dash-systems.fr/v1/catalog/planes?query=${encodeURIComponent(q)}&limit=10`,
    { headers: { "x-api-key": process.env.AEROMODEL_KEY } }
  );
  return r.json();
}

console.log(await searchPlanes("dreamliner"));

TypeScript (typed)

type ImagesPlaneOptions = {
  plane: string;
  airline?: string;
  liveryType?: "base" | "blank" | string;
  angle?: 0 | 45 | 90 | 135 | 180 | 225 | 270 | 315 | 345 | "top";
  gear?: "down" | "up";
  filetype?: "png" | "jpg" | "jpeg" | "webp";
  resolution?: "thumb" | "card" | "hd" | "ultra";
  width?: number;
  align?: "top" | "center" | "bottom";
  /** Number in degrees between -45 and 45 */
  pitch?: number;
  background?: string;
};

const BASE = "https://api.aeromodel.dash-systems.fr";

export async function fetchPlaneImage(opts: ImagesPlaneOptions, apiKey: string): Promise<Blob> {
  const url = new URL(`${BASE}/v1/images/plane`);
  for (const [k, v] of Object.entries(opts)) {
    if (v !== undefined && v !== null) url.searchParams.set(k, String(v));
  }
  const r = await fetch(url, { headers: { "x-api-key": apiKey } });
  if (!r.ok) throw new Error(`HTTP ${r.status}: ${await r.text()}`);
  return r.blob();
}

// Usage
const blob = await fetchPlaneImage(
  { plane: "airbus-a320-200", airline: "air-france", align: "bottom", resolution: "hd", pitch: 15 },
  process.env.AEROMODEL_KEY!
);

Python

requests (sync)

import os
import requests

BASE = "https://api.aeromodel.dash-systems.fr"
KEY = os.environ["AEROMODEL_KEY"]

# Download an image
params = {
    "plane": "airbus-a320-200",
    "airline": "air-france",
    "resolution": "hd",
    "align": "bottom",
}
r = requests.get(f"{BASE}/v1/images/plane", params=params, headers={"x-api-key": KEY})
r.raise_for_status()

with open("a320-airfrance.png", "wb") as f:
    f.write(r.content)

# Diagnostic headers
print(r.headers["x-livery-state"], r.headers.get("x-fallback-reason"))

# Catalog
search = requests.get(f"{BASE}/v1/catalog/planes", params={"query": "787"}, headers={"x-api-key": KEY})
print(search.json())

httpx (async)

import asyncio
import os
import httpx

async def fetch_plane(client: httpx.AsyncClient, plane: str, airline: str | None = None) -> bytes:
    r = await client.get(
        "/v1/images/plane",
        params={"plane": plane, "airline": airline, "align": "bottom", "resolution": "card"},
    )
    r.raise_for_status()
    return r.content

async def main():
    async with httpx.AsyncClient(
        base_url="https://api.aeromodel.dash-systems.fr",
        headers={"x-api-key": os.environ["AEROMODEL_KEY"]},
        timeout=30,
    ) as client:
        png = await fetch_plane(client, "airbus-a320-200", "air-france")
        open("a320.png", "wb").write(png)

asyncio.run(main())

C# (.NET 8+)

using System.Net.Http;
using System.Net.Http.Headers;
using System.Web; // or Microsoft.AspNetCore.WebUtilities

var http = new HttpClient { BaseAddress = new Uri("https://api.aeromodel.dash-systems.fr") };
http.DefaultRequestHeaders.Add("x-api-key", Environment.GetEnvironmentVariable("AEROMODEL_KEY"));

// Download
var query = HttpUtility.ParseQueryString(string.Empty);
query["plane"] = "airbus-a320-200";
query["airline"] = "air-france";
query["resolution"] = "hd";
query["align"] = "bottom";

var bytes = await http.GetByteArrayAsync($"/v1/images/plane?{query}");
await File.WriteAllBytesAsync("a320.png", bytes);

// Catalog
var json = await http.GetStringAsync("/v1/catalog/planes?query=787");
Console.WriteLine(json);

With HttpClientFactory (ASP.NET Core)

// Program.cs
builder.Services.AddHttpClient("aeromodel", c =>
{
    c.BaseAddress = new Uri("https://api.aeromodel.dash-systems.fr");
    c.DefaultRequestHeaders.Add("x-api-key", builder.Configuration["AeromodelKey"]);
});

// Controller
[ApiController]
[Route("api/[controller]")]
public class PlanesController(IHttpClientFactory httpFactory) : ControllerBase
{
    [HttpGet("{slug}")]
    public async Task<IActionResult> Get(string slug, string? airline)
    {
        var client = httpFactory.CreateClient("aeromodel");
        var url = $"/v1/images/plane?plane={Uri.EscapeDataString(slug)}&airline={Uri.EscapeDataString(airline ?? "")}&align=bottom";
        var stream = await client.GetStreamAsync(url);
        return File(stream, "image/png");
    }
}

Go

package main

import (
    "fmt"
    "io"
    "net/http"
    "net/url"
    "os"
)

func main() {
    u, _ := url.Parse("https://api.aeromodel.dash-systems.fr/v1/images/plane")
    q := u.Query()
    q.Set("plane", "airbus-a320-200")
    q.Set("airline", "air-france")
    q.Set("align", "bottom")
    u.RawQuery = q.Encode()

    req, _ := http.NewRequest("GET", u.String(), nil)
    req.Header.Set("x-api-key", os.Getenv("AEROMODEL_KEY"))

    res, err := http.DefaultClient.Do(req)
    if err != nil { panic(err) }
    defer res.Body.Close()

    f, _ := os.Create("a320.png")
    defer f.Close()
    io.Copy(f, res.Body)
    fmt.Println("livery:", res.Header.Get("x-livery-state"))
}

PHP

<?php
$base = "https://api.aeromodel.dash-systems.fr";
$key = getenv("AEROMODEL_KEY");

$query = http_build_query([
    "plane" => "airbus-a320-200",
    "airline" => "air-france",
    "align" => "bottom",
    "resolution" => "hd",
]);

$ctx = stream_context_create([
    "http" => [
        "header" => "x-api-key: $key\r\n",
        "timeout" => 30,
    ],
]);

$png = file_get_contents("$base/v1/images/plane?$query", false, $ctx);
file_put_contents("a320.png", $png);

See also