---
title: "Render every diagram of a multi-diagram project"
method: POST
path: "/api/project/generate"
tags: ["generators"]
---

# Render every diagram of a multi-diagram project

`POST /api/project/generate`

## Request

- Base URL: `https://voltplan.app`
- URL: `https://voltplan.app/api/project/generate`
- Auth: none declared

Public, CORS-open endpoint; 30 requests per minute per client IP (counted separately from `/api/diagram/generate`). The client IP is the first `X-Forwarded-For` entry, else `X-Real-IP`, else one shared `unknown` bucket; counters are kept in memory per server instance and per route. Each entry of `diagrams` is rendered as its own SVG. Each bridge adds a virtual load to the diagram whose `id` equals `fromDiagramId` and a virtual charger plus power source to the diagram whose `id` equals `toDiagramId`. The response is always JSON; with `Accept: image/png` each diagram additionally carries a base64 PNG (`null` when not requested or when conversion failed). Component icons are embedded as in `/api/diagram/generate`. No external API is called.

## Request body

- ProjectGenerateRequest: Project with several diagrams and the bridges between them.
  - `projectName` string: Echoed back in the response.
  - `diagrams` ProjectDiagram[], required
    - `id` string, required: Client-chosen id; referenced by bridges.
    - `name` string, required
    - `source` 'cable' | 'voltplan': Branding variant of the footer bar.
    - `loads` DiagramLoad[]
      - `name` string, required
      - `power` number, required: Rated power in W.
      - `voltage` number, required: Supply voltage in V (DC).
      - `current` number, required: Current in A; accepted, the diagram derives currents from power and voltage.
      - `iconUrl` string: URL of an icon image drawn on the component; fetched server-side and embedded as a data URI.
    - `batteries` DiagramBattery[]
      - `name` string, required
      - `voltage` number, required: Nominal voltage in V.
      - `capacityAh` number, required: Capacity in Ah; accepted, sizing uses energyWh.
      - `energyWh` number, required: Stored energy in Wh.
      - `iconUrl` string: URL of an icon image drawn on the component; fetched server-side and embedded as a data URI.
    - `chargers` DiagramCharger[]
      - `name` string, required
      - `inputVoltage` number, required: Input voltage in V.
      - `outputVoltage` number, required: Battery-side output voltage in V (DC).
      - `power` number, required: Output power in W.
      - `sourceType` 'shore' | 'solar' | 'wind' | 'generator' | 'alternator': Power source added upstream of the charger; `shore` and `generator` make the charger input AC, the others DC.
      - `iconUrl` string: URL of an icon image drawn on the component; fetched server-side and embedded as a data URI.
  - `bridges` ProjectBridge[]
    - `id` string, required
    - `name` string: Label of the bridge device.
    - `kind` 'dcdc' | 'vsr' | 'isolator', required: DC-DC charger, voltage-sensitive relay, or battery isolator.
    - `fromDiagramId` string, required: Diagram that supplies power.
    - `toDiagramId` string, required: Diagram being charged.
    - `spec` BridgeSpec, required: Electrical rating of a link or bridge device.
      - `inputVoltage` number, required: Input voltage in V.
      - `outputVoltage` number, required: Output voltage in V.
      - `power` number, required: Power in W.

## Response `200`

Rendered diagrams in request order.

- ProjectGenerateResponse
  - `projectName` string: Omitted when the request had none.
  - `diagrams` ProjectRenderedDiagram[], required
    - `id` string, required
    - `name` string, required
    - `svg` string, required: SVG document.
    - `png` string, nullable, required: Base64-encoded PNG; null unless Accept contains image/png and conversion succeeded.

## Other responses

- `400`: Body is not an object, diagrams is not an array of objects with string id and name, or bridges is not an array.
- `429`: More than 30 requests within 60 seconds from this client IP.
- `500`: Rendering failed, or the request body was not valid JSON: a generic fallback SVG ("Diagram generation failed").

---

[API](https://skmtc.dev/voltplan/apis/voltplan-api.md) · [All operations](https://skmtc.dev/voltplan/apis/voltplan-api/llms.txt) · [OpenAPI document](https://skmtc.dev/voltplan/apis/voltplan-api/revisions/575b86a7af92?raw)
