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
- Routes — details for each endpoint.
- Parameter reference — one file per parameter.
- API key safety — backend proxy patterns.