{
  "openapi": "3.1.1",
  "info": {
    "title": "Storyboard Timing & Shot List API",
    "version": "1.0.0",
    "summary": "Audit storyboard timing and export frame-accurate shot lists and dialogue subtitles.",
    "description": "Every endpoint performs the same calculation as the human page and returns inputs, result, units, assumptions, sources, warnings and computedAt. MCP endpoint: /mcp."
  },
  "servers": [
    {
      "url": "https://fliplinestoryboardtiming.usefulweb.site"
    }
  ],
  "paths": {
    "/api/v1/calculate": {
      "post": {
        "operationId": "calculate",
        "summary": "Audit storyboard timing and export frame-accurate shot lists and dialogue subtitles.",
        "description": "Inspect a Flipline Story Desk project for cumulative frame ranges, non-drop-frame timecodes, scene totals and GIF timing differences. Download a CSV shot list and dialogue-only SRT cues using the same timing engine as the editor.\n\nMethodology:\n- Each nonblank line uses Title | Seconds | Action | Dialogue, optionally followed by Scene | Shot size | Camera. Pipes cannot appear inside fields. Shot sizes: wide, medium, close, detail, over-shoulder. Camera labels: static, pan-left, pan-right, tilt-up, tilt-down, push-in, pull-out, handheld.\n- Seconds are rounded to the nearest whole frame, with a minimum of one frame. Board intervals are half-open; timecodes are non-drop-frame at integer 1–30 FPS. Maximum 48 boards, 120 seconds per board and ten minutes total.\n- Staging sketches are original, deterministic stick figures and a ground line. They are editable drawing marks, not AI-generated images or 3D camera simulations. No Storyboarder project, Fountain screenplay or NLE timeline import is provided.\n- The input is a Story Desk project or the smaller Shot data JSON export. Project text is limited to 2 MB in this utility. The editor stays local; using this separate utility sends the submitted JSON to the server.\n- CSV cells are quoted and spreadsheet formula prefixes are escaped. SRT includes only nonempty dialogue, uses cumulative frame boundaries rounded to milliseconds, collapses blank lines and replaces timing-arrow sequences inside dialogue.\n- GIF delays round each board to the nearest 10 ms with a minimum of 20 ms for browser playback. GIF total can differ from ideal frame timing. Contact-sheet art and camera labels do not change durations.",
        "tags": [
          "apps"
        ],
        "x-mcp-tool": "flipline_storyboard_timing",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FliplineStoryboardTimingInput"
              },
              "examples": {
                "example1": {
                  "summary": "Timing a six-board delivery",
                  "value": {
                    "project": "{\"format\":\"flipline-story\",\"version\":1,\"name\":\"A small delivery\",\"width\":960,\"height\":540,\"fps\":24,\"paper\":\"#fffaf0\",\"boards\":[{\"id\":\"board-1\",\"title\":\"The street wakes\",\"scene\":\"Outside\",\"shot\":\"wide\",\"camera\":\"pan-right\",\"frames\":72,\"action\":\"A courier arrives at the quiet workshop.\",\"dialogue\":\"\",\"notes\":\"\",\"locked\":false,\"marks\":[{\"id\":\"stage-1\",\"kind\":\"line\",\"color\":\"#b5b6aa\",\"size\":2,\"fill\":false,\"points\":[[0.06,0.78],[0.94,0.78]]},{\"id\":\"stage-2\",\"kind\":\"ellipse\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.48171875,0.45499999999999996],[0.51828125,0.52]]},{\"id\":\"stage-3\",\"kind\":\"line\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.5,0.52],[0.5,0.645]]},{\"id\":\"stage-4\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.4634375,0.5900000000000001],[0.5,0.55],[0.5365625,0.5900000000000001]]},{\"id\":\"stage-5\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.4746875,0.73],[0.5,0.645],[0.5253125,0.73]]},{\"id\":\"prop-0\",\"kind\":\"rect\",\"points\":[[0.16,0.71],[0.32,0.84]],\"color\":\"#b78356\",\"size\":3,\"fill\":false}],\"reference\":null},{\"id\":\"board-2\",\"title\":\"A familiar parcel\",\"scene\":\"Workshop\",\"shot\":\"detail\",\"camera\":\"static\",\"frames\":48,\"action\":\"The parcel rests on the workbench.\",\"dialogue\":\"\",\"notes\":\"\",\"locked\":false,\"marks\":[{\"id\":\"stage-1\",\"kind\":\"line\",\"color\":\"#b5b6aa\",\"size\":2,\"fill\":false,\"points\":[[0.06,0.78],[0.94,0.78]]},{\"id\":\"stage-2\",\"kind\":\"ellipse\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.415625,0.05],[0.584375,0.35]]},{\"id\":\"stage-3\",\"kind\":\"line\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.5,0.35],[0.5,0.95]]},{\"id\":\"stage-4\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.3245,0.6859999999999999],[0.5,0.494],[0.6755,0.6859999999999999]]},{\"id\":\"stage-5\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.3785,0.98],[0.5,0.95],[0.6215,0.98]]},{\"id\":\"prop-1\",\"kind\":\"rect\",\"points\":[[0.43000000000000005,0.71],[0.5900000000000001,0.84]],\"color\":\"#b78356\",\"size\":3,\"fill\":false}],\"reference\":null},{\"id\":\"board-3\",\"title\":\"A knock at the door\",\"scene\":\"Workshop\",\"shot\":\"medium\",\"camera\":\"static\",\"frames\":72,\"action\":\"The maker turns toward the sound.\",\"dialogue\":\"Come in.\",\"notes\":\"\",\"locked\":false,\"marks\":[{\"id\":\"stage-1\",\"kind\":\"line\",\"color\":\"#b5b6aa\",\"size\":2,\"fill\":false,\"points\":[[0.06,0.78],[0.94,0.78]]},{\"id\":\"stage-2\",\"kind\":\"ellipse\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.4634375,0.32999999999999996],[0.5365625,0.45999999999999996]]},{\"id\":\"stage-3\",\"kind\":\"line\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.5,0.45999999999999996],[0.5,0.71]]},{\"id\":\"stage-4\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.426875,0.6],[0.5,0.52],[0.573125,0.6]]},{\"id\":\"stage-5\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.44937499999999997,0.88],[0.5,0.71],[0.550625,0.88]]},{\"id\":\"prop-2\",\"kind\":\"rect\",\"points\":[[0.7000000000000001,0.71],[0.8600000000000001,0.84]],\"color\":\"#b78356\",\"size\":3,\"fill\":false}],\"reference\":null},{\"id\":\"board-4\",\"title\":\"Across the table\",\"scene\":\"Workshop\",\"shot\":\"over-shoulder\",\"camera\":\"static\",\"frames\":96,\"action\":\"The courier offers the small parcel.\",\"dialogue\":\"This one is for you.\",\"notes\":\"\",\"locked\":false,\"marks\":[{\"id\":\"stage-1\",\"kind\":\"line\",\"color\":\"#b5b6aa\",\"size\":2,\"fill\":false,\"points\":[[0.06,0.78],[0.94,0.78]]},{\"id\":\"stage-2\",\"kind\":\"ellipse\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.29978124999999994,0.30499999999999994],[0.38021875,0.44799999999999995]]},{\"id\":\"stage-3\",\"kind\":\"line\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.33999999999999997,0.44799999999999995],[0.33999999999999997,0.723]]},{\"id\":\"stage-4\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.2595625,0.602],[0.33999999999999997,0.514],[0.42043749999999996,0.602]]},{\"id\":\"stage-5\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.28431249999999997,0.91],[0.33999999999999997,0.723],[0.39568749999999997,0.91]]},{\"id\":\"stage-6\",\"kind\":\"ellipse\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.6197812500000001,0.30499999999999994],[0.70021875,0.44799999999999995]]},{\"id\":\"stage-7\",\"kind\":\"line\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.66,0.44799999999999995],[0.66,0.723]]},{\"id\":\"stage-8\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.5795625,0.602],[0.66,0.514],[0.7404375000000001,0.602]]},{\"id\":\"stage-9\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.6043125,0.91],[0.66,0.723],[0.7156875,0.91]]},{\"id\":\"stage-10\",\"kind\":\"pen\",\"color\":\"#bcc8c5\",\"size\":18,\"fill\":false,\"points\":[[0.02,0.98],[0.08,0.61],[0.17,0.49],[0.28,0.58],[0.38,0.98]]},{\"id\":\"prop-3\",\"kind\":\"rect\",\"points\":[[0.16,0.71],[0.32,0.84]],\"color\":\"#b78356\",\"size\":3,\"fill\":false}],\"reference\":null},{\"id\":\"board-5\",\"title\":\"The first look\",\"scene\":\"Workshop\",\"shot\":\"close\",\"camera\":\"push-in\",\"frames\":48,\"action\":\"A smile, then a careful opening.\",\"dialogue\":\"\",\"notes\":\"\",\"locked\":false,\"marks\":[{\"id\":\"stage-1\",\"kind\":\"line\",\"color\":\"#b5b6aa\",\"size\":2,\"fill\":false,\"points\":[[0.06,0.78],[0.94,0.78]]},{\"id\":\"stage-2\",\"kind\":\"ellipse\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.4341875,0.12999999999999995],[0.5658125,0.364]]},{\"id\":\"stage-3\",\"kind\":\"line\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.5,0.364],[0.5,0.8140000000000001]]},{\"id\":\"stage-4\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.368375,0.6160000000000001],[0.5,0.472],[0.631625,0.6160000000000001]]},{\"id\":\"stage-5\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.408875,0.98],[0.5,0.8140000000000001],[0.591125,0.98]]},{\"id\":\"prop-4\",\"kind\":\"rect\",\"points\":[[0.43000000000000005,0.71],[0.5900000000000001,0.84]],\"color\":\"#b78356\",\"size\":3,\"fill\":false}],\"reference\":null},{\"id\":\"board-6\",\"title\":\"Room for a new idea\",\"scene\":\"Workshop\",\"shot\":\"wide\",\"camera\":\"pull-out\",\"frames\":96,\"action\":\"Both lean over the open box.\",\"dialogue\":\"Let us try it.\",\"notes\":\"\",\"locked\":false,\"marks\":[{\"id\":\"stage-1\",\"kind\":\"line\",\"color\":\"#b5b6aa\",\"size\":2,\"fill\":false,\"points\":[[0.06,0.78],[0.94,0.78]]},{\"id\":\"stage-2\",\"kind\":\"ellipse\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.48171875,0.45499999999999996],[0.51828125,0.52]]},{\"id\":\"stage-3\",\"kind\":\"line\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.5,0.52],[0.5,0.645]]},{\"id\":\"stage-4\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.4634375,0.5900000000000001],[0.5,0.55],[0.5365625,0.5900000000000001]]},{\"id\":\"stage-5\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.4746875,0.73],[0.5,0.645],[0.5253125,0.73]]},{\"id\":\"prop-5\",\"kind\":\"rect\",\"points\":[[0.7000000000000001,0.71],[0.8600000000000001,0.84]],\"color\":\"#b78356\",\"size\":3,\"fill\":false}],\"reference\":null}]}"
                  }
                },
                "example2": {
                  "summary": "A thirty-second story spot",
                  "value": {
                    "project": "{\"format\":\"flipline-story\",\"version\":1,\"name\":\"A thirty-second ritual\",\"width\":960,\"height\":540,\"fps\":24,\"paper\":\"#fffaf0\",\"boards\":[{\"id\":\"board-1\",\"title\":\"Before the day\",\"scene\":\"Kitchen\",\"shot\":\"wide\",\"camera\":\"static\",\"frames\":120,\"action\":\"A quiet kitchen in morning light.\",\"dialogue\":\"\",\"notes\":\"\",\"locked\":false,\"marks\":[{\"id\":\"stage-1\",\"kind\":\"line\",\"color\":\"#b5b6aa\",\"size\":2,\"fill\":false,\"points\":[[0.06,0.78],[0.94,0.78]]},{\"id\":\"stage-2\",\"kind\":\"ellipse\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.48171875,0.45499999999999996],[0.51828125,0.52]]},{\"id\":\"stage-3\",\"kind\":\"line\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.5,0.52],[0.5,0.645]]},{\"id\":\"stage-4\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.4634375,0.5900000000000001],[0.5,0.55],[0.5365625,0.5900000000000001]]},{\"id\":\"stage-5\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.4746875,0.73],[0.5,0.645],[0.5253125,0.73]]},{\"id\":\"prop-0\",\"kind\":\"rect\",\"points\":[[0.16,0.71],[0.32,0.84]],\"color\":\"#b78356\",\"size\":3,\"fill\":false}],\"reference\":null},{\"id\":\"board-2\",\"title\":\"The kettle\",\"scene\":\"Kitchen\",\"shot\":\"detail\",\"camera\":\"static\",\"frames\":96,\"action\":\"Steam catches the window light.\",\"dialogue\":\"\",\"notes\":\"\",\"locked\":false,\"marks\":[{\"id\":\"stage-1\",\"kind\":\"line\",\"color\":\"#b5b6aa\",\"size\":2,\"fill\":false,\"points\":[[0.06,0.78],[0.94,0.78]]},{\"id\":\"stage-2\",\"kind\":\"ellipse\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.415625,0.05],[0.584375,0.35]]},{\"id\":\"stage-3\",\"kind\":\"line\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.5,0.35],[0.5,0.95]]},{\"id\":\"stage-4\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.3245,0.6859999999999999],[0.5,0.494],[0.6755,0.6859999999999999]]},{\"id\":\"stage-5\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.3785,0.98],[0.5,0.95],[0.6215,0.98]]},{\"id\":\"prop-1\",\"kind\":\"rect\",\"points\":[[0.43000000000000005,0.71],[0.5900000000000001,0.84]],\"color\":\"#b78356\",\"size\":3,\"fill\":false}],\"reference\":null},{\"id\":\"board-3\",\"title\":\"Make a moment\",\"scene\":\"Kitchen\",\"shot\":\"medium\",\"camera\":\"tilt-down\",\"frames\":144,\"action\":\"Tea is poured into a favourite cup.\",\"dialogue\":\"A little time for yourself.\",\"notes\":\"\",\"locked\":false,\"marks\":[{\"id\":\"stage-1\",\"kind\":\"line\",\"color\":\"#b5b6aa\",\"size\":2,\"fill\":false,\"points\":[[0.06,0.78],[0.94,0.78]]},{\"id\":\"stage-2\",\"kind\":\"ellipse\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.4634375,0.32999999999999996],[0.5365625,0.45999999999999996]]},{\"id\":\"stage-3\",\"kind\":\"line\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.5,0.45999999999999996],[0.5,0.71]]},{\"id\":\"stage-4\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.426875,0.6],[0.5,0.52],[0.573125,0.6]]},{\"id\":\"stage-5\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.44937499999999997,0.88],[0.5,0.71],[0.550625,0.88]]},{\"id\":\"prop-2\",\"kind\":\"rect\",\"points\":[[0.7000000000000001,0.71],[0.8600000000000001,0.84]],\"color\":\"#b78356\",\"size\":3,\"fill\":false}],\"reference\":null},{\"id\":\"board-4\",\"title\":\"First sip\",\"scene\":\"Kitchen\",\"shot\":\"close\",\"camera\":\"static\",\"frames\":120,\"action\":\"The room settles around a slow breath.\",\"dialogue\":\"\",\"notes\":\"\",\"locked\":false,\"marks\":[{\"id\":\"stage-1\",\"kind\":\"line\",\"color\":\"#b5b6aa\",\"size\":2,\"fill\":false,\"points\":[[0.06,0.78],[0.94,0.78]]},{\"id\":\"stage-2\",\"kind\":\"ellipse\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.4341875,0.12999999999999995],[0.5658125,0.364]]},{\"id\":\"stage-3\",\"kind\":\"line\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.5,0.364],[0.5,0.8140000000000001]]},{\"id\":\"stage-4\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.368375,0.6160000000000001],[0.5,0.472],[0.631625,0.6160000000000001]]},{\"id\":\"stage-5\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.408875,0.98],[0.5,0.8140000000000001],[0.591125,0.98]]},{\"id\":\"prop-3\",\"kind\":\"rect\",\"points\":[[0.16,0.71],[0.32,0.84]],\"color\":\"#b78356\",\"size\":3,\"fill\":false}],\"reference\":null},{\"id\":\"board-5\",\"title\":\"At the window\",\"scene\":\"Window\",\"shot\":\"over-shoulder\",\"camera\":\"pull-out\",\"frames\":144,\"action\":\"The day waits outside.\",\"dialogue\":\"Start gently.\",\"notes\":\"\",\"locked\":false,\"marks\":[{\"id\":\"stage-1\",\"kind\":\"line\",\"color\":\"#b5b6aa\",\"size\":2,\"fill\":false,\"points\":[[0.06,0.78],[0.94,0.78]]},{\"id\":\"stage-2\",\"kind\":\"ellipse\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.29978124999999994,0.30499999999999994],[0.38021875,0.44799999999999995]]},{\"id\":\"stage-3\",\"kind\":\"line\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.33999999999999997,0.44799999999999995],[0.33999999999999997,0.723]]},{\"id\":\"stage-4\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.2595625,0.602],[0.33999999999999997,0.514],[0.42043749999999996,0.602]]},{\"id\":\"stage-5\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.28431249999999997,0.91],[0.33999999999999997,0.723],[0.39568749999999997,0.91]]},{\"id\":\"stage-6\",\"kind\":\"ellipse\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.6197812500000001,0.30499999999999994],[0.70021875,0.44799999999999995]]},{\"id\":\"stage-7\",\"kind\":\"line\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.66,0.44799999999999995],[0.66,0.723]]},{\"id\":\"stage-8\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.5795625,0.602],[0.66,0.514],[0.7404375000000001,0.602]]},{\"id\":\"stage-9\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.6043125,0.91],[0.66,0.723],[0.7156875,0.91]]},{\"id\":\"stage-10\",\"kind\":\"pen\",\"color\":\"#bcc8c5\",\"size\":18,\"fill\":false,\"points\":[[0.02,0.98],[0.08,0.61],[0.17,0.49],[0.28,0.58],[0.38,0.98]]},{\"id\":\"prop-4\",\"kind\":\"rect\",\"points\":[[0.43000000000000005,0.71],[0.5900000000000001,0.84]],\"color\":\"#b78356\",\"size\":3,\"fill\":false}],\"reference\":null},{\"id\":\"board-6\",\"title\":\"A simple ending\",\"scene\":\"Table\",\"shot\":\"detail\",\"camera\":\"static\",\"frames\":96,\"action\":\"A cup rests beside a handwritten note.\",\"dialogue\":\"\",\"notes\":\"\",\"locked\":false,\"marks\":[{\"id\":\"stage-1\",\"kind\":\"line\",\"color\":\"#b5b6aa\",\"size\":2,\"fill\":false,\"points\":[[0.06,0.78],[0.94,0.78]]},{\"id\":\"stage-2\",\"kind\":\"ellipse\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.415625,0.05],[0.584375,0.35]]},{\"id\":\"stage-3\",\"kind\":\"line\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.5,0.35],[0.5,0.95]]},{\"id\":\"stage-4\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":3,\"fill\":false,\"points\":[[0.3245,0.6859999999999999],[0.5,0.494],[0.6755,0.6859999999999999]]},{\"id\":\"stage-5\",\"kind\":\"pen\",\"color\":\"#304f57\",\"size\":4,\"fill\":false,\"points\":[[0.3785,0.98],[0.5,0.95],[0.6215,0.98]]},{\"id\":\"prop-5\",\"kind\":\"rect\",\"points\":[[0.7000000000000001,0.71],[0.8600000000000001,0.84]],\"color\":\"#b78356\",\"size\":3,\"fill\":false}],\"reference\":null}]}"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculation result envelope.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FliplineStoryboardTimingResult"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON body.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Invalid input (see errors[]).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded (see Retry-After).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/tool": {
      "get": {
        "operationId": "getToolDefinition",
        "summary": "Inputs, output schema and examples for this tool",
        "responses": {
          "200": {
            "description": "Tool definition.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Problem": {
        "type": "object",
        "description": "RFC 9457 problem details. 422 responses include per-field `errors`.",
        "required": [
          "type",
          "title",
          "status",
          "detail"
        ],
        "properties": {
          "type": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "integer"
          },
          "detail": {
            "type": "string"
          },
          "code": {
            "type": "string"
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "field",
                "message"
              ],
              "properties": {
                "field": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "FliplineStoryboardTimingInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "project": {
            "title": "Story Desk project or shot data JSON",
            "type": "string",
            "maxLength": 2000000,
            "default": "{\n  \"format\": \"flipline-story\",\n  \"version\": 1,\n  \"name\": \"A small delivery\",\n  \"width\": 960,\n  \"height\": 540,\n  \"fps\": 24,\n  \"paper\": \"#fffaf0\",\n  \"boards\": [\n    {\n      \"id\": \"board-1\",\n      \"title\": \"The street wakes\",\n      \"scene\": \"Outside\",\n      \"shot\": \"wide\",\n      \"camera\": \"pan-right\",\n      \"frames\": 72,\n      \"action\": \"A courier arrives at the quiet workshop.\",\n      \"dialogue\": \"\",\n      \"notes\": \"\",\n      \"locked\": false,\n      \"marks\": [\n        {\n          \"id\": \"stage-1\",\n          \"kind\": \"line\",\n          \"color\": \"#b5b6aa\",\n          \"size\": 2,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.06,\n              0.78\n            ],\n            [\n              0.94,\n              0.78\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-2\",\n          \"kind\": \"ellipse\",\n          \"color\": \"#304f57\",\n          \"size\": 3,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.48171875,\n              0.45499999999999996\n            ],\n            [\n              0.51828125,\n              0.52\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-3\",\n          \"kind\": \"line\",\n          \"color\": \"#304f57\",\n          \"size\": 4,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.5,\n              0.52\n            ],\n            [\n              0.5,\n              0.645\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-4\",\n          \"kind\": \"pen\",\n          \"color\": \"#304f57\",\n          \"size\": 3,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.4634375,\n              0.5900000000000001\n            ],\n            [\n              0.5,\n              0.55\n            ],\n            [\n              0.5365625,\n              0.5900000000000001\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-5\",\n          \"kind\": \"pen\",\n          \"color\": \"#304f57\",\n          \"size\": 4,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.4746875,\n              0.73\n            ],\n            [\n              0.5,\n              0.645\n            ],\n            [\n              0.5253125,\n              0.73\n            ]\n          ]\n        },\n        {\n          \"id\": \"prop-0\",\n          \"kind\": \"rect\",\n          \"points\": [\n            [\n              0.16,\n              0.71\n            ],\n            [\n              0.32,\n              0.84\n            ]\n          ],\n          \"color\": \"#b78356\",\n          \"size\": 3,\n          \"fill\": false\n        }\n      ],\n      \"reference\": null\n    },\n    {\n      \"id\": \"board-2\",\n      \"title\": \"A familiar parcel\",\n      \"scene\": \"Workshop\",\n      \"shot\": \"detail\",\n      \"camera\": \"static\",\n      \"frames\": 48,\n      \"action\": \"The parcel rests on the workbench.\",\n      \"dialogue\": \"\",\n      \"notes\": \"\",\n      \"locked\": false,\n      \"marks\": [\n        {\n          \"id\": \"stage-1\",\n          \"kind\": \"line\",\n          \"color\": \"#b5b6aa\",\n          \"size\": 2,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.06,\n              0.78\n            ],\n            [\n              0.94,\n              0.78\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-2\",\n          \"kind\": \"ellipse\",\n          \"color\": \"#304f57\",\n          \"size\": 3,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.415625,\n              0.05\n            ],\n            [\n              0.584375,\n              0.35\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-3\",\n          \"kind\": \"line\",\n          \"color\": \"#304f57\",\n          \"size\": 4,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.5,\n              0.35\n            ],\n            [\n              0.5,\n              0.95\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-4\",\n          \"kind\": \"pen\",\n          \"color\": \"#304f57\",\n          \"size\": 3,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.3245,\n              0.6859999999999999\n            ],\n            [\n              0.5,\n              0.494\n            ],\n            [\n              0.6755,\n              0.6859999999999999\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-5\",\n          \"kind\": \"pen\",\n          \"color\": \"#304f57\",\n          \"size\": 4,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.3785,\n              0.98\n            ],\n            [\n              0.5,\n              0.95\n            ],\n            [\n              0.6215,\n              0.98\n            ]\n          ]\n        },\n        {\n          \"id\": \"prop-1\",\n          \"kind\": \"rect\",\n          \"points\": [\n            [\n              0.43000000000000005,\n              0.71\n            ],\n            [\n              0.5900000000000001,\n              0.84\n            ]\n          ],\n          \"color\": \"#b78356\",\n          \"size\": 3,\n          \"fill\": false\n        }\n      ],\n      \"reference\": null\n    },\n    {\n      \"id\": \"board-3\",\n      \"title\": \"A knock at the door\",\n      \"scene\": \"Workshop\",\n      \"shot\": \"medium\",\n      \"camera\": \"static\",\n      \"frames\": 72,\n      \"action\": \"The maker turns toward the sound.\",\n      \"dialogue\": \"Come in.\",\n      \"notes\": \"\",\n      \"locked\": false,\n      \"marks\": [\n        {\n          \"id\": \"stage-1\",\n          \"kind\": \"line\",\n          \"color\": \"#b5b6aa\",\n          \"size\": 2,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.06,\n              0.78\n            ],\n            [\n              0.94,\n              0.78\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-2\",\n          \"kind\": \"ellipse\",\n          \"color\": \"#304f57\",\n          \"size\": 3,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.4634375,\n              0.32999999999999996\n            ],\n            [\n              0.5365625,\n              0.45999999999999996\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-3\",\n          \"kind\": \"line\",\n          \"color\": \"#304f57\",\n          \"size\": 4,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.5,\n              0.45999999999999996\n            ],\n            [\n              0.5,\n              0.71\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-4\",\n          \"kind\": \"pen\",\n          \"color\": \"#304f57\",\n          \"size\": 3,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.426875,\n              0.6\n            ],\n            [\n              0.5,\n              0.52\n            ],\n            [\n              0.573125,\n              0.6\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-5\",\n          \"kind\": \"pen\",\n          \"color\": \"#304f57\",\n          \"size\": 4,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.44937499999999997,\n              0.88\n            ],\n            [\n              0.5,\n              0.71\n            ],\n            [\n              0.550625,\n              0.88\n            ]\n          ]\n        },\n        {\n          \"id\": \"prop-2\",\n          \"kind\": \"rect\",\n          \"points\": [\n            [\n              0.7000000000000001,\n              0.71\n            ],\n            [\n              0.8600000000000001,\n              0.84\n            ]\n          ],\n          \"color\": \"#b78356\",\n          \"size\": 3,\n          \"fill\": false\n        }\n      ],\n      \"reference\": null\n    },\n    {\n      \"id\": \"board-4\",\n      \"title\": \"Across the table\",\n      \"scene\": \"Workshop\",\n      \"shot\": \"over-shoulder\",\n      \"camera\": \"static\",\n      \"frames\": 96,\n      \"action\": \"The courier offers the small parcel.\",\n      \"dialogue\": \"This one is for you.\",\n      \"notes\": \"\",\n      \"locked\": false,\n      \"marks\": [\n        {\n          \"id\": \"stage-1\",\n          \"kind\": \"line\",\n          \"color\": \"#b5b6aa\",\n          \"size\": 2,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.06,\n              0.78\n            ],\n            [\n              0.94,\n              0.78\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-2\",\n          \"kind\": \"ellipse\",\n          \"color\": \"#304f57\",\n          \"size\": 3,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.29978124999999994,\n              0.30499999999999994\n            ],\n            [\n              0.38021875,\n              0.44799999999999995\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-3\",\n          \"kind\": \"line\",\n          \"color\": \"#304f57\",\n          \"size\": 4,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.33999999999999997,\n              0.44799999999999995\n            ],\n            [\n              0.33999999999999997,\n              0.723\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-4\",\n          \"kind\": \"pen\",\n          \"color\": \"#304f57\",\n          \"size\": 3,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.2595625,\n              0.602\n            ],\n            [\n              0.33999999999999997,\n              0.514\n            ],\n            [\n              0.42043749999999996,\n              0.602\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-5\",\n          \"kind\": \"pen\",\n          \"color\": \"#304f57\",\n          \"size\": 4,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.28431249999999997,\n              0.91\n            ],\n            [\n              0.33999999999999997,\n              0.723\n            ],\n            [\n              0.39568749999999997,\n              0.91\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-6\",\n          \"kind\": \"ellipse\",\n          \"color\": \"#304f57\",\n          \"size\": 3,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.6197812500000001,\n              0.30499999999999994\n            ],\n            [\n              0.70021875,\n              0.44799999999999995\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-7\",\n          \"kind\": \"line\",\n          \"color\": \"#304f57\",\n          \"size\": 4,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.66,\n              0.44799999999999995\n            ],\n            [\n              0.66,\n              0.723\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-8\",\n          \"kind\": \"pen\",\n          \"color\": \"#304f57\",\n          \"size\": 3,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.5795625,\n              0.602\n            ],\n            [\n              0.66,\n              0.514\n            ],\n            [\n              0.7404375000000001,\n              0.602\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-9\",\n          \"kind\": \"pen\",\n          \"color\": \"#304f57\",\n          \"size\": 4,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.6043125,\n              0.91\n            ],\n            [\n              0.66,\n              0.723\n            ],\n            [\n              0.7156875,\n              0.91\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-10\",\n          \"kind\": \"pen\",\n          \"color\": \"#bcc8c5\",\n          \"size\": 18,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.02,\n              0.98\n            ],\n            [\n              0.08,\n              0.61\n            ],\n            [\n              0.17,\n              0.49\n            ],\n            [\n              0.28,\n              0.58\n            ],\n            [\n              0.38,\n              0.98\n            ]\n          ]\n        },\n        {\n          \"id\": \"prop-3\",\n          \"kind\": \"rect\",\n          \"points\": [\n            [\n              0.16,\n              0.71\n            ],\n            [\n              0.32,\n              0.84\n            ]\n          ],\n          \"color\": \"#b78356\",\n          \"size\": 3,\n          \"fill\": false\n        }\n      ],\n      \"reference\": null\n    },\n    {\n      \"id\": \"board-5\",\n      \"title\": \"The first look\",\n      \"scene\": \"Workshop\",\n      \"shot\": \"close\",\n      \"camera\": \"push-in\",\n      \"frames\": 48,\n      \"action\": \"A smile, then a careful opening.\",\n      \"dialogue\": \"\",\n      \"notes\": \"\",\n      \"locked\": false,\n      \"marks\": [\n        {\n          \"id\": \"stage-1\",\n          \"kind\": \"line\",\n          \"color\": \"#b5b6aa\",\n          \"size\": 2,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.06,\n              0.78\n            ],\n            [\n              0.94,\n              0.78\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-2\",\n          \"kind\": \"ellipse\",\n          \"color\": \"#304f57\",\n          \"size\": 3,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.4341875,\n              0.12999999999999995\n            ],\n            [\n              0.5658125,\n              0.364\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-3\",\n          \"kind\": \"line\",\n          \"color\": \"#304f57\",\n          \"size\": 4,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.5,\n              0.364\n            ],\n            [\n              0.5,\n              0.8140000000000001\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-4\",\n          \"kind\": \"pen\",\n          \"color\": \"#304f57\",\n          \"size\": 3,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.368375,\n              0.6160000000000001\n            ],\n            [\n              0.5,\n              0.472\n            ],\n            [\n              0.631625,\n              0.6160000000000001\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-5\",\n          \"kind\": \"pen\",\n          \"color\": \"#304f57\",\n          \"size\": 4,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.408875,\n              0.98\n            ],\n            [\n              0.5,\n              0.8140000000000001\n            ],\n            [\n              0.591125,\n              0.98\n            ]\n          ]\n        },\n        {\n          \"id\": \"prop-4\",\n          \"kind\": \"rect\",\n          \"points\": [\n            [\n              0.43000000000000005,\n              0.71\n            ],\n            [\n              0.5900000000000001,\n              0.84\n            ]\n          ],\n          \"color\": \"#b78356\",\n          \"size\": 3,\n          \"fill\": false\n        }\n      ],\n      \"reference\": null\n    },\n    {\n      \"id\": \"board-6\",\n      \"title\": \"Room for a new idea\",\n      \"scene\": \"Workshop\",\n      \"shot\": \"wide\",\n      \"camera\": \"pull-out\",\n      \"frames\": 96,\n      \"action\": \"Both lean over the open box.\",\n      \"dialogue\": \"Let us try it.\",\n      \"notes\": \"\",\n      \"locked\": false,\n      \"marks\": [\n        {\n          \"id\": \"stage-1\",\n          \"kind\": \"line\",\n          \"color\": \"#b5b6aa\",\n          \"size\": 2,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.06,\n              0.78\n            ],\n            [\n              0.94,\n              0.78\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-2\",\n          \"kind\": \"ellipse\",\n          \"color\": \"#304f57\",\n          \"size\": 3,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.48171875,\n              0.45499999999999996\n            ],\n            [\n              0.51828125,\n              0.52\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-3\",\n          \"kind\": \"line\",\n          \"color\": \"#304f57\",\n          \"size\": 4,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.5,\n              0.52\n            ],\n            [\n              0.5,\n              0.645\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-4\",\n          \"kind\": \"pen\",\n          \"color\": \"#304f57\",\n          \"size\": 3,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.4634375,\n              0.5900000000000001\n            ],\n            [\n              0.5,\n              0.55\n            ],\n            [\n              0.5365625,\n              0.5900000000000001\n            ]\n          ]\n        },\n        {\n          \"id\": \"stage-5\",\n          \"kind\": \"pen\",\n          \"color\": \"#304f57\",\n          \"size\": 4,\n          \"fill\": false,\n          \"points\": [\n            [\n              0.4746875,\n              0.73\n            ],\n            [\n              0.5,\n              0.645\n            ],\n            [\n              0.5253125,\n              0.73\n            ]\n          ]\n        },\n        {\n          \"id\": \"prop-5\",\n          \"kind\": \"rect\",\n          \"points\": [\n            [\n              0.7000000000000001,\n              0.71\n            ],\n            [\n              0.8600000000000001,\n              0.84\n            ]\n          ],\n          \"color\": \"#b78356\",\n          \"size\": 3,\n          \"fill\": false\n        }\n      ],\n      \"reference\": null\n    }\n  ]\n}"
          }
        },
        "required": []
      },
      "FliplineStoryboardTimingResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "schemaVersion",
          "tool",
          "computedAt",
          "inputs",
          "summary",
          "result",
          "units",
          "assumptions",
          "sources",
          "warnings",
          "presentation",
          "links"
        ],
        "properties": {
          "schemaVersion": {
            "type": "string",
            "const": "1.0"
          },
          "tool": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "name",
              "version"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "version": {
                "type": "string"
              }
            }
          },
          "computedAt": {
            "type": "string",
            "format": "date-time"
          },
          "inputs": {
            "type": "object",
            "description": "Normalised inputs actually used, including applied defaults."
          },
          "summary": {
            "type": "string"
          },
          "result": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "timing",
              "csv",
              "srt"
            ],
            "properties": {
              "timing": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "fps",
                  "boards",
                  "frames",
                  "durationMs",
                  "gifDurationMs",
                  "scenes",
                  "shots"
                ],
                "properties": {
                  "fps": {
                    "type": "integer"
                  },
                  "boards": {
                    "type": "integer"
                  },
                  "frames": {
                    "type": "integer"
                  },
                  "durationMs": {
                    "type": "number"
                  },
                  "gifDurationMs": {
                    "type": "number"
                  },
                  "scenes": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "scene",
                        "boards",
                        "frames"
                      ],
                      "properties": {
                        "scene": {
                          "type": "string"
                        },
                        "boards": {
                          "type": "integer"
                        },
                        "frames": {
                          "type": "integer"
                        }
                      }
                    }
                  },
                  "shots": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "additionalProperties": false,
                      "required": [
                        "board",
                        "id",
                        "title",
                        "scene",
                        "shot",
                        "camera",
                        "frames",
                        "startFrame",
                        "endFrame",
                        "startMs",
                        "endMs",
                        "durationMs",
                        "gifDurationMs",
                        "in",
                        "out",
                        "action",
                        "dialogue",
                        "notes"
                      ],
                      "properties": {
                        "board": {
                          "type": "integer"
                        },
                        "id": {
                          "type": "string"
                        },
                        "title": {
                          "type": "string"
                        },
                        "scene": {
                          "type": "string"
                        },
                        "shot": {
                          "type": "string"
                        },
                        "camera": {
                          "type": "string"
                        },
                        "frames": {
                          "type": "integer"
                        },
                        "startFrame": {
                          "type": "integer"
                        },
                        "endFrame": {
                          "type": "integer"
                        },
                        "startMs": {
                          "type": "number"
                        },
                        "endMs": {
                          "type": "number"
                        },
                        "durationMs": {
                          "type": "number"
                        },
                        "gifDurationMs": {
                          "type": "number"
                        },
                        "in": {
                          "type": "string"
                        },
                        "out": {
                          "type": "string"
                        },
                        "action": {
                          "type": "string"
                        },
                        "dialogue": {
                          "type": "string"
                        },
                        "notes": {
                          "type": "string"
                        }
                      }
                    }
                  }
                }
              },
              "csv": {
                "type": "string"
              },
              "srt": {
                "type": "string"
              }
            }
          },
          "units": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "required": [
                "title"
              ],
              "properties": {
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "retrievedAt": {
                  "type": "string"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "presentation": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Display blocks used by the human page (same data)."
          },
          "links": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "human",
              "api",
              "openapi",
              "methodology"
            ],
            "properties": {
              "human": {
                "type": "string",
                "format": "uri"
              },
              "api": {
                "type": "string",
                "format": "uri"
              },
              "openapi": {
                "type": "string",
                "format": "uri"
              },
              "methodology": {
                "type": "string",
                "format": "uri"
              }
            }
          }
        }
      }
    }
  }
}