POST a small JSON description and get back a deck-ready PNG (or SVG). The endpoint is open and CORS-enabled, so it works from browsers, scripts, CI and anywhere else you can make an HTTP call. The same JSON opens in the builder.
| Field | Type | Description |
|---|---|---|
| title | string | Heading shown top-left of the chart at 22px bold. Every chart has one title row; an empty string hides it. max 140 chars · default "Five forces analysis" |
| width | integer | Chart width in pixels (640–2400). Omit it (recommended) and the chart sizes itself to its content with comfortable margins, between 880 and 1280px wide. PNG output renders at 2x. 640–2400 |
| palette | string[] | Hex colours. Every header band takes the FIRST palette colour unless a force sets its own colour; rating pills always use green, amber and red. Default: indigo, sky, emerald, amber, red, gray. max 12 items · default ["#4f46e5","#0ea5e9","#10b981","#f59e0b","#ef4444","#6b7280"] |
| rivalryrequired | object | Centre box: how intensely existing competitors fight on price, product, marketing and service. Default name "Competitive rivalry". E.g. { "rating": "high", "bullets": ["Price war among the top two players","Low switching costs for riders"] }. |
| newEntrantsrequired | object | Top box: how easily new competitors can enter the industry (capital needs, scale, brand, regulation). Default name "Threat of new entrants". E.g. { "rating": "high", "bullets": ["Network effects favour incumbents"] }. |
| substitutesrequired | object | Bottom box: how easily customers can meet the same need another way. Default name "Threat of substitutes". E.g. { "rating": "high", "bullets": ["Public transit and micromobility"] }. |
| suppliersrequired | object | Left box: how much leverage suppliers (inputs, labour, platforms) have over prices and terms. Default name "Bargaining power of suppliers". E.g. { "rating": "high", "bullets": ["Drivers multi-home across apps"] }. |
| buyersrequired | object | Right box: how much leverage customers have to push prices down or demand more. Default name "Bargaining power of buyers". E.g. { "rating": "high", "bullets": ["Riders compare fares in seconds"] }. |
| conclusion | string | Optional one-line takeaway shown in a muted band under the cross, e.g. "Overall: moderately attractive; buyer power is the main threat". Wraps to 2 lines. Omit for none. max 200 chars |
| showRatings | boolean | Show each force's rating pill. Default true; false hides every rating without deleting it. default true |
| Field | Type | Description |
|---|---|---|
| label | string | Name shown in the box's header band. Default "Competitive rivalry"; override only to rename it. max 50 chars · default "Competitive rivalry" |
| rating | string | Optional strength of this force, shown as a pill in the header: "very low", "low" (green), "medium" (amber), "high" or "very high" (red). Omit for no rating. "very low", "low", "medium", "high", "very high" |
| bullets | string[] | The evidence for this force (0–5 short phrases, about 4–10 words each), listed in the box. Long ones wrap to 3 lines. max 5 items · default [] |
| color | string | Optional hex colour for this box's header band, e.g. "#0ea5e9". Default: the first palette colour for every box, so ratings stay the only colour that carries meaning. max 40 chars |
| Field | Type | Description |
|---|---|---|
| label | string | Name shown in the box's header band. Default "Threat of new entrants"; override only to rename it. max 50 chars · default "Threat of new entrants" |
| rating | string | Optional strength of this force, shown as a pill in the header: "very low", "low" (green), "medium" (amber), "high" or "very high" (red). Omit for no rating. "very low", "low", "medium", "high", "very high" |
| bullets | string[] | The evidence for this force (0–5 short phrases, about 4–10 words each), listed in the box. Long ones wrap to 3 lines. max 5 items · default [] |
| color | string | Optional hex colour for this box's header band, e.g. "#0ea5e9". Default: the first palette colour for every box, so ratings stay the only colour that carries meaning. max 40 chars |
| Field | Type | Description |
|---|---|---|
| label | string | Name shown in the box's header band. Default "Threat of substitutes"; override only to rename it. max 50 chars · default "Threat of substitutes" |
| rating | string | Optional strength of this force, shown as a pill in the header: "very low", "low" (green), "medium" (amber), "high" or "very high" (red). Omit for no rating. "very low", "low", "medium", "high", "very high" |
| bullets | string[] | The evidence for this force (0–5 short phrases, about 4–10 words each), listed in the box. Long ones wrap to 3 lines. max 5 items · default [] |
| color | string | Optional hex colour for this box's header band, e.g. "#0ea5e9". Default: the first palette colour for every box, so ratings stay the only colour that carries meaning. max 40 chars |
| Field | Type | Description |
|---|---|---|
| label | string | Name shown in the box's header band. Default "Bargaining power of suppliers"; override only to rename it. max 50 chars · default "Bargaining power of suppliers" |
| rating | string | Optional strength of this force, shown as a pill in the header: "very low", "low" (green), "medium" (amber), "high" or "very high" (red). Omit for no rating. "very low", "low", "medium", "high", "very high" |
| bullets | string[] | The evidence for this force (0–5 short phrases, about 4–10 words each), listed in the box. Long ones wrap to 3 lines. max 5 items · default [] |
| color | string | Optional hex colour for this box's header band, e.g. "#0ea5e9". Default: the first palette colour for every box, so ratings stay the only colour that carries meaning. max 40 chars |
| Field | Type | Description |
|---|---|---|
| label | string | Name shown in the box's header band. Default "Bargaining power of buyers"; override only to rename it. max 50 chars · default "Bargaining power of buyers" |
| rating | string | Optional strength of this force, shown as a pill in the header: "very low", "low" (green), "medium" (amber), "high" or "very high" (red). Omit for no rating. "very low", "low", "medium", "high", "very high" |
| bullets | string[] | The evidence for this force (0–5 short phrases, about 4–10 words each), listed in the box. Long ones wrap to 3 lines. max 5 items · default [] |
| color | string | Optional hex colour for this box's header band, e.g. "#0ea5e9". Default: the first palette colour for every box, so ratings stay the only colour that carries meaning. max 40 chars |
POST /api/render/fiveforces returns image/png; add ?format=svg for SVG.GET /fiveforces.png?d=<payload> and /fiveforces.svg?d=<payload> render a chart from a link. The payload is the JSON body, raw-deflated and base64url-encoded. Nothing is stored: links are permanent and cached for a year./fiveforces#d=<payload> opens the same chart in the builder for editing.GET /api/render/fiveforces?demo=1 returns the demo chart.GET /api/schema/fiveforces returns the JSON Schema, for code generators and AIs.Input is lenient where the intent is clear: numeric strings become numbers, out-of-range values are clamped, and unknown fields are ignored. Adjustments are listed in the X-Render-Warnings header. Anything unclear returns a 400 that says how to fix it:
{
"error": "Invalid payload",
"issues": [{ "path": "tasks", "message": "must be an array" }],
"example": { … }
}
Use the hosted MCP server instead. It gives Claude, Cursor and other MCP clients a create_five_forces tool that returns the image plus image, SVG and edit links. See the MCP page →