Two Minute Toolkit TwoMinuteFive Forces
Slide Deck Quality Five Forces Diagrams in 2 minutes or less

Porter's Five Forces HTTP API

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.

POST https://www.twominutetoolkit.com/api/render/fiveforces
Fair use: rate-limited to 20 requests a minute per IP (bursts capped at 5 a second), shared across every Two Minute tool, with a 64 KB body cap. No key or sign-up needed.

Try it

Open in builder

Code samples

Live preview

Click Render to call the API.

Request body

FieldTypeDescription
titlestringHeading 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"
widthintegerChart 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
palettestring[]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"]
rivalryrequiredobjectCentre 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"] }.
newEntrantsrequiredobjectTop 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"] }.
substitutesrequiredobjectBottom 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"] }.
suppliersrequiredobjectLeft 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"] }.
buyersrequiredobjectRight 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"] }.
conclusionstringOptional 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
showRatingsbooleanShow each force's rating pill. Default true; false hides every rating without deleting it.
default true

rivalry

FieldTypeDescription
labelstringName shown in the box's header band. Default "Competitive rivalry"; override only to rename it.
max 50 chars · default "Competitive rivalry"
ratingstringOptional 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"
bulletsstring[]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 []
colorstringOptional 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

newEntrants

FieldTypeDescription
labelstringName 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"
ratingstringOptional 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"
bulletsstring[]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 []
colorstringOptional 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

substitutes

FieldTypeDescription
labelstringName shown in the box's header band. Default "Threat of substitutes"; override only to rename it.
max 50 chars · default "Threat of substitutes"
ratingstringOptional 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"
bulletsstring[]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 []
colorstringOptional 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

suppliers

FieldTypeDescription
labelstringName 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"
ratingstringOptional 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"
bulletsstring[]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 []
colorstringOptional 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

buyers

FieldTypeDescription
labelstringName 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"
ratingstringOptional 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"
bulletsstring[]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 []
colorstringOptional 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

Endpoints

  • 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.

Errors and adjustments

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": { … }
}

Calling from an AI assistant?

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 →