{
  "version": 1,
  "title": "API rate limiting: phone boundary comparison",
  "format": "custom",
  "canvasSize": [
    720,
    1300
  ],
  "watermark": true,
  "objects": [
    {
      "type": "text",
      "text": "API rate limiting",
      "x": 30,
      "y": 23,
      "fontSize": 47,
      "color": "#292d32",
      "fontFamily": "sans"
    },
    {
      "type": "text",
      "text": "Why can six requests pass?",
      "x": 30,
      "y": 84,
      "fontSize": 30,
      "color": "#59675e",
      "fontFamily": "sans"
    },
    {
      "type": "pen",
      "points": [
        [
          30,
          141
        ],
        [
          227,
          142
        ],
        [
          467,
          140
        ],
        [
          691,
          142
        ]
      ],
      "color": "#bac9c1",
      "width": 3,
      "smooth": false
    },
    {
      "type": "text",
      "text": "Limit: 3 per 10 seconds",
      "x": 32,
      "y": 166,
      "fontSize": 29,
      "color": "#285caa",
      "fontFamily": "sans"
    },
    {
      "type": "text",
      "text": "SAME SIX ARRIVALS",
      "x": 32,
      "y": 233,
      "fontSize": 27,
      "color": "#285caa",
      "fontFamily": "sans"
    },
    {
      "type": "pen",
      "points": [
        [
          35,
          280
        ],
        [
          685,
          281
        ],
        [
          685,
          406
        ],
        [
          35,
          405
        ],
        [
          35,
          280
        ]
      ],
      "color": "#bac9c1",
      "width": 3,
      "smooth": false
    },
    {
      "type": "text",
      "text": "9.8  9.9  9.9",
      "x": 55,
      "y": 303,
      "fontSize": 31,
      "color": "#292d32",
      "fontFamily": "sans"
    },
    {
      "type": "text",
      "text": "10-second boundary",
      "x": 55,
      "y": 348,
      "fontSize": 25,
      "color": "#285caa",
      "fontFamily": "sans"
    },
    {
      "type": "text",
      "text": "10.0  10.1  10.2",
      "x": 390,
      "y": 303,
      "fontSize": 29,
      "color": "#292d32",
      "fontFamily": "sans"
    },
    {
      "type": "text",
      "text": "FIXED WINDOW",
      "x": 32,
      "y": 458,
      "fontSize": 28,
      "color": "#285caa",
      "fontFamily": "sans"
    },
    {
      "type": "pen",
      "points": [
        [
          35,
          514
        ],
        [
          685,
          515
        ],
        [
          685,
          641
        ],
        [
          35,
          640
        ],
        [
          35,
          514
        ]
      ],
      "color": "#bac9c1",
      "width": 3,
      "smooth": false
    },
    {
      "type": "text",
      "text": "Before boundary: 3 accepted",
      "x": 55,
      "y": 535,
      "fontSize": 28,
      "color": "#287355",
      "fontFamily": "sans"
    },
    {
      "type": "text",
      "text": "After reset:       3 accepted",
      "x": 55,
      "y": 587,
      "fontSize": 28,
      "color": "#287355",
      "fontFamily": "sans"
    },
    {
      "type": "text",
      "text": "Result: 6 accepted in 0.4 seconds",
      "x": 32,
      "y": 669,
      "fontSize": 26,
      "color": "#59675e",
      "fontFamily": "sans"
    },
    {
      "type": "text",
      "text": "TOKEN BUCKET",
      "x": 32,
      "y": 736,
      "fontSize": 28,
      "color": "#285caa",
      "fontFamily": "sans"
    },
    {
      "type": "pen",
      "points": [
        [
          35,
          792
        ],
        [
          685,
          793
        ],
        [
          685,
          919
        ],
        [
          35,
          918
        ],
        [
          35,
          792
        ]
      ],
      "color": "#bac9c1",
      "width": 3,
      "smooth": false
    },
    {
      "type": "text",
      "text": "First 3:   spend 3 tokens",
      "x": 55,
      "y": 813,
      "fontSize": 28,
      "color": "#287355",
      "fontFamily": "sans"
    },
    {
      "type": "text",
      "text": "Next 3:   rejected, < 1 refilled",
      "x": 55,
      "y": 865,
      "fontSize": 27,
      "color": "#a34438",
      "fontFamily": "sans"
    },
    {
      "type": "text",
      "text": "Capacity: 3 tokens",
      "x": 32,
      "y": 956,
      "fontSize": 27,
      "color": "#59675e",
      "fontFamily": "sans"
    },
    {
      "type": "text",
      "text": "Refill: +0.3 token each second",
      "x": 32,
      "y": 1000,
      "fontSize": 27,
      "color": "#59675e",
      "fontFamily": "sans"
    },
    {
      "type": "pen",
      "points": [
        [
          30,
          1060
        ],
        [
          230,
          1061
        ],
        [
          473,
          1059
        ],
        [
          690,
          1061
        ]
      ],
      "color": "#bac9c1",
      "width": 3,
      "smooth": false
    },
    {
      "type": "text",
      "text": "A fixed counter resets on the clock.",
      "x": 32,
      "y": 1089,
      "fontSize": 26,
      "color": "#292d32",
      "fontFamily": "sans"
    },
    {
      "type": "text",
      "text": "A bucket refills as time passes.",
      "x": 32,
      "y": 1137,
      "fontSize": 26,
      "color": "#292d32",
      "fontFamily": "sans"
    },
    {
      "type": "text",
      "text": "Fictional single-client example",
      "x": 32,
      "y": 1191,
      "fontSize": 23,
      "color": "#59675e",
      "fontFamily": "sans"
    }
  ]
}
